Compare commits

..

No commits in common. "master" and "v4.1.6" have entirely different histories.

47 changed files with 340 additions and 570 deletions

View File

@ -23,7 +23,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
os: [macos-latest, windows-2022, ubuntu-latest] os: [macos-11, windows-2019, ubuntu-latest]
# create steps # create steps
steps: steps:
@ -46,7 +46,6 @@ jobs:
run: | run: |
sudo apt-get install libxtst-dev libpng++-dev sudo apt-get install libxtst-dev libpng++-dev
sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick xz-utils
sudo snap install snapcraft --classic
# step3: yarn # step3: yarn
- name: Yarn install - name: Yarn install
run: | run: |

3
.gitignore vendored
View File

@ -1,7 +1,6 @@
.DS_Store .DS_Store
node_modules node_modules
build/* /build
!build/icons
# local env files # local env files

2
.npmrc
View File

@ -1 +1 @@
electron_mirror=https://npmmirror.com/mirrors/electron/ electron_mirror=https://npm.taobao.org/mirrors/electron/

108
README.md
View File

@ -1,41 +1,46 @@
English | [简体中文](./README.zh-CN.md) English | [简体中文](./README.zh-CN.md)
<div align= "center">
<img align="center" width=200 src="./public/logo.png" />
</div>
<div align="center">
<h1>Rubick</h1>
<img alt="downloads" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<a href="https://github.com/rubickCenter/rubick/releases"><img alt="latest release" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" /></a>
<a href="https://github.com/rubickCenter/rubick/actions"><img alt="github action building" src="https://img.shields.io/github/actions/workflow/status/rubickCenter/rubick/main.yml" /></a>
<a href="https://github.com/rubickCenter/rubick/blob/master/LICENSE"><img alt="license" src="https://img.shields.io/github/license/rubickCenter/rubick" /></a>
<a href="https://github.com/rubickCenter/rubick/stargazers"><img alt="github stars" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social" /></a>
<a href="https://gitee.com/monkeyWang/rubick"><img alt="gitee mirror" src="https://img.shields.io/badge/Gitee--yellow.svg?style=social&logo=data:image/svg+xml;base64,PHN2ZyB0PSIxNTc0ODM3MTM4ODM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE3NzAiICAgICB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiAgICA8cGF0aCBkPSJNODkxIDQyOC44SDQ2NS44Yy0yMC40IDAtMzcgMTYuNS0zNyAzN3Y5Mi40YzAgMjAuNCAxNi41IDM3IDM3IDM3aDI1OC45YzIwLjQgMCAzNyAxNi42IDM3IDM3djE4LjRjMCA2MS4zLTQ5LjcgMTEwLjktMTEwLjkgMTEwLjlIMjk5LjRjLTIwLjQgMC0zNy0xNi42LTM3LTM3VjM3My4yYzAtNjEuMyA0OS43LTExMC45IDExMC45LTExMC45aDUxNy42YzIwLjQgMCAzNy0xNi41IDM3LTM3bDAuMS05Mi4zYzAtMjAuNC0xNi41LTM3LTM3LTM3SDM3My4zQzIyMC4yIDk2IDk2IDIyMC4yIDk2IDM3My4zVjg5MWMwIDIwLjQgMTYuNiAzNyAzNyAzN2g1NDUuNEM4MTYuMiA5MjggOTI4IDgxNi4zIDkyOCA2NzguNFY0NjUuOGMwLTIwLjQtMTYuNi0zNy0zNy0zN3oiICAgICAgICAgIGZpbGw9IiNkODFlMDYiIHAtaWQ9IjE3NzEiPjwvcGF0aD48L3N2Zz4=" /></a>
</div>
<div align= "center"> <div align= "center">
<img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.png" /> <img align="center" width=200 src="https://user-images.githubusercontent.com/21073039/128333805-73e086f0-5523-46a3-a096-cba80b904c46.png" />
</div> </div>
Open-source plugin-based desktop efficiency toolbox. The plugins are installed and uninstalled based on npm, which is very lightweight. The plugin data supports webdav multi-terminal synchronization, which is very secure. It supports internal network deployment and can be customized for further development, which is very flexible.
## Get Rubick
Download the latest release: <div align= "center">
<h1>Rubick</h1>
<img alt="release" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<a href="https://github.com/rubickCenter/rubick/releases">
<img alt="release" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" />
</a>
<a href="https://github.com/rubickCenter/rubick/actions">
<img alt=building src=https://img.shields.io/github/actions/workflow/status/rubickCenter/rubick/main.yml>
</a>
<a href="https://github.com/rubickCenter/rubick/blob/master/LICENSE">
<img alt="npm" src="https://img.shields.io/github/license/rubickCenter/rubick" />
</a>
<a href="https://github.com/rubickCenter/rubick/stargazers">
<img alt="star" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social">
</a>
<a href="https://gitee.com/monkeyWang/rubick">
<img alt="码云" src="https://img.shields.io/badge/Gitee--yellow.svg?style=social&logo=data:image/svg+xml;base64,PHN2ZyB0PSIxNTc0ODM3MTM4ODM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE3NzAiICAgICB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiAgICA8cGF0aCBkPSJNODkxIDQyOC44SDQ2NS44Yy0yMC40IDAtMzcgMTYuNS0zNyAzN3Y5Mi40YzAgMjAuNCAxNi41IDM3IDM3IDM3aDI1OC45YzIwLjQgMCAzNyAxNi42IDM3IDM3djE4LjRjMCA2MS4zLTQ5LjcgMTEwLjktMTEwLjkgMTEwLjlIMjk5LjRjLTIwLjQgMC0zNy0xNi42LTM3LTM3VjM3My4yYzAtNjEuMyA0OS43LTExMC45IDExMC45LTExMC45aDUxNy42YzIwLjQgMCAzNy0xNi41IDM3LTM3bDAuMS05Mi4zYzAtMjAuNC0xNi41LTM3LTM3LTM3SDM3My4zQzIyMC4yIDk2IDk2IDIyMC4yIDk2IDM3My4zVjg5MWMwIDIwLjQgMTYuNiAzNyAzNyAzN2g1NDUuNEM4MTYuMiA5MjggOTI4IDgxNi4zIDkyOCA2NzguNFY0NjUuOGMwLTIwLjQtMTYuNi0zNy0zNy0zN3oiICAgICAgICAgIGZpbGw9IiNkODFlMDYiIHAtaWQ9IjE3NzEiPjwvcGF0aD48L3N2Zz4="/>
</a>
</div>
An open-source toolbox based on Electron, freely integrating rich plugins to create the ultimate desktop productivity tool. Rubick is one of the heroes in Dota, whose core skill is the ability to use the skills of other heroes through plugins, and then move on. This aligns perfectly with the design philosophy of this tool, which is why it is named Rubick.
## Sponsor
我们通过有偿的方式积累高质量的常见问题、最佳实践文档,加入星球后可以和作者进行互动和答疑。我们提供技术支持、答疑解惑、定制化插件开发、二次定制化开发 rubick 等等官方服务。
权益明细可以参考文档:[权益明细](https://rubickcenter.github.io/rubick/super/)
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
## Installation package
* [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases) * [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases)
* [Rubick Windows](https://github.com/rubickCenter/rubick/releases) * [Rubick Windows](https://github.com/rubickCenter/rubick/releases)
* [Rubick Linux](https://github.com/rubickCenter/rubick/releases) * [Rubick Linux](https://github.com/rubickCenter/rubick/releases)
## Docs
[Rubick website](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/docs/)
## How To Use Rubick
After installing rubick, you can quickly launch the main program by pressing the shortcut keys Alt/Option+R. Entering keywords in the main program input box can search for corresponding apps, plugins, files...
Select the ones you want and use them.
If you don't want the function, you can click the logo on the left to enter the plugin market and find the ones you want to install.
## Feature list ## Feature list
- [x] Plugin management based on the npm package pattern, installing plugins is as simple as installing npm packages. - [x] Plugin management based on the npm package pattern, installing plugins is as simple as installing npm packages.
@ -45,6 +50,13 @@ If you don't want the function, you can click the logo on the left to enter the
- [x] Supports enterprise-level intranet deployment. - [x] Supports enterprise-level intranet deployment.
- [x] Supports multiple languages. - [x] Supports multiple languages.
## Docs
[Rubick website](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## Core functionality showcase. ## Core functionality showcase.
### 1. Search system application ### 1. Search system application
Support pinyin and abbreviations to search system applications Support pinyin and abbreviations to search system applications
@ -69,43 +81,17 @@ In "Rubick," search for "Preferences," go to "Account and Settings," and then se
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png) ![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
## Related Repositories ### More features
If you need more features, please come here to give us suggestions[issues](https://github.com/rubickCenter/rubick/issues) 。
We will add valuable ideas to the later development. At the same time, welcome to join and build together。
[Rubick Plugins Repositories](https://gitee.com/rubick-center) ## 贡献
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
[Rubick Plugins Database](https://gitcode.net/rubickcenter/rubick-database) ## 反馈
对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长
[Rubick Plugin CLI](https://github.com/rubickCenter/rubick-plugin-cli)
## Sponsor
### 1. Join the Knowledge Planet
We have accumulated a lot of knowledge and common issues about rubick on the Knowledge Planet. You can pay to join our knowledge community to discuss with us. We will answer at any time!
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
### 2. Buy me a cup of coffee
If the project is helpful to you, you can buy me a cup of coffee as a reward!
<div align= "left">
<img width="180" src="https://picx.zhimg.com/80/v2-911d249dc454f3460451a4e1ecceeb14_720w.png">
<img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png">
</div>
## 友情链接
<a href="https://pro.kuaitu.cc/" target="_blank">
<img width="100" src="https://github.com/user-attachments/assets/6127488e-466b-4e71-98ab-00fb3c76553e" />
</a>
## Feedback
Those who are interested in this project or want to exchange and learn can scan the QR code and add the following WeChat, with the comment rubick, to help us grow better.
![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png) ![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png)
<a href="https://hellogithub.com/repository/0a3e2484b44e481e9dcf1850e45193cd" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=0a3e2484b44e481e9dcf1850e45193cd&claim_uid=vXGwjpmYNsBex0C" alt="FeaturedHelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
## Contribute
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
## License ## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details. This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details.

View File

@ -2,42 +2,46 @@
<div align= "center"> <div align= "center">
<img align="center" width=200 src="./public/logo.png" /> <img align="center" width=200 src="https://user-images.githubusercontent.com/21073039/128333805-73e086f0-5523-46a3-a096-cba80b904c46.png" />
</div> </div>
<div align="center">
<h1>Rubick</h1>
<img alt="累计下载数" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<a href="https://github.com/rubickCenter/rubick/releases"><img alt="最新发布版本" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" /></a>
<a href="https://github.com/rubickCenter/rubick/actions"><img alt="github action 构建" src="https://img.shields.io/github/actions/workflow/status/rubickCenter/rubick/main.yml" /></a>
<a href="https://github.com/rubickCenter/rubick/blob/master/LICENSE"><img alt="许可证" src="https://img.shields.io/github/license/rubickCenter/rubick" /></a>
<a href="https://github.com/rubickCenter/rubick/stargazers"><img alt="github 收藏数" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social" /></a>
<a href="https://gitee.com/monkeyWang/rubick"><img alt="gitee 镜像源" src="https://img.shields.io/badge/Gitee--yellow.svg?style=social&logo=data:image/svg+xml;base64,PHN2ZyB0PSIxNTc0ODM3MTM4ODM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE3NzAiICAgICB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiAgICA8cGF0aCBkPSJNODkxIDQyOC44SDQ2NS44Yy0yMC40IDAtMzcgMTYuNS0zNyAzN3Y5Mi40YzAgMjAuNCAxNi41IDM3IDM3IDM3aDI1OC45YzIwLjQgMCAzNyAxNi42IDM3IDM3djE4LjRjMCA2MS4zLTQ5LjcgMTEwLjktMTEwLjkgMTEwLjlIMjk5LjRjLTIwLjQgMC0zNy0xNi42LTM3LTM3VjM3My4yYzAtNjEuMyA0OS43LTExMC45IDExMC45LTExMC45aDUxNy42YzIwLjQgMCAzNy0xNi41IDM3LTM3bDAuMS05Mi4zYzAtMjAuNC0xNi41LTM3LTM3LTM3SDM3My4zQzIyMC4yIDk2IDk2IDIyMC4yIDk2IDM3My4zVjg5MWMwIDIwLjQgMTYuNiAzNyAzNyAzN2g1NDUuNEM4MTYuMiA5MjggOTI4IDgxNi4zIDkyOCA2NzguNFY0NjUuOGMwLTIwLjQtMTYuNi0zNy0zNy0zN3oiICAgICAgICAgIGZpbGw9IiNkODFlMDYiIHAtaWQ9IjE3NzEiPjwvcGF0aD48L3N2Zz4=" /></a>
</div>
<div align= "center"> <div align= "center">
<img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.png" /> <h1>Rubick</h1>
<img alt="release" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<a href="https://github.com/rubickCenter/rubick/releases">
<img alt="release" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" />
</a>
<a href="https://github.com/rubickCenter/rubick/actions">
<img alt=building src=https://img.shields.io/github/workflow/status/rubickCenter/rubick/Build>
</a>
<a href="https://github.com/rubickCenter/rubick/blob/master/LICENSE">
<img alt="npm" src="https://img.shields.io/github/license/rubickCenter/rubick" />
</a>
<a href="https://github.com/rubickCenter/rubick/stargazers">
<img alt="star" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social">
</a>
<a href="https://gitee.com/monkeyWang/rubick">
<img alt="码云" src="https://img.shields.io/badge/Gitee--yellow.svg?style=social&logo=data:image/svg+xml;base64,PHN2ZyB0PSIxNTc0ODM3MTM4ODM3IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE3NzAiICAgICB3aWR0aD0iMTYiIGhlaWdodD0iMTYiPiAgICA8cGF0aCBkPSJNODkxIDQyOC44SDQ2NS44Yy0yMC40IDAtMzcgMTYuNS0zNyAzN3Y5Mi40YzAgMjAuNCAxNi41IDM3IDM3IDM3aDI1OC45YzIwLjQgMCAzNyAxNi42IDM3IDM3djE4LjRjMCA2MS4zLTQ5LjcgMTEwLjktMTEwLjkgMTEwLjlIMjk5LjRjLTIwLjQgMC0zNy0xNi42LTM3LTM3VjM3My4yYzAtNjEuMyA0OS43LTExMC45IDExMC45LTExMC45aDUxNy42YzIwLjQgMCAzNy0xNi41IDM3LTM3bDAuMS05Mi4zYzAtMjAuNC0xNi41LTM3LTM3LTM3SDM3My4zQzIyMC4yIDk2IDk2IDIyMC4yIDk2IDM3My4zVjg5MWMwIDIwLjQgMTYuNiAzNyAzNyAzN2g1NDUuNEM4MTYuMiA5MjggOTI4IDgxNi4zIDkyOCA2NzguNFY0NjUuOGMwLTIwLjQtMTYuNi0zNy0zNy0zN3oiICAgICAgICAgIGZpbGw9IiNkODFlMDYiIHAtaWQ9IjE3NzEiPjwvcGF0aD48L3N2Zz4="/>
</a>
</div> </div>
开源的插件化桌面端效率工具箱。插件是基于 npm 进行安装和卸载,非常轻便。插件数据支持 webdav 多端同步,非常安全。支持内网部署,可二次定制化开发,非常灵活。
## 获取 rubick 基于 electron 的开源工具箱自由集成丰富插件打造极致的桌面端效能工具。Rubick(拉比克) 是 dota 里面的英雄之一,其核心技能是插件化使用其他英雄的技能,用完即走。非常符合本工具的设计理念,所以取名 Rubick。
下载最新的安装包:
## 赞助和服务
我们通过有偿的方式积累高质量的常见问题、最佳实践文档,加入星球后可以和作者进行互动和答疑。我们提供技术支持、答疑解惑、定制化插件开发、二次定制化开发 rubick 等等官方服务。
权益明细可以参考文档:[权益明细](https://rubickcenter.github.io/rubick/super/)
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
## 安装包
* [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases) * [Rubick Mac OS](https://github.com/rubickCenter/rubick/releases)
* [Rubick Windows](https://github.com/rubickCenter/rubick/releases) * [Rubick Windows](https://github.com/rubickCenter/rubick/releases)
* [Rubick Linux](https://github.com/rubickCenter/rubick/releases) * [Rubick Linux](https://github.com/rubickCenter/rubick/releases)
## 使用文档
[Rubick 官网](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## 如何使用 rubick
安装完成 rubick 后,可以通过快捷键 Alt/Option+R 可以快速呼起主程序。主程序输入框内输入关键词可以搜索出对应的 App、插件、文件... 选择即可使用。如果没有想要的功能,可以点击左侧的 logo 进入插件市场寻找自己想要的插件进行安装。
## 支持能力 ## 支持能力
- [x] 基于 npm 包模式的插件管理,安装插件和安装 npm 包一样简单 - [x] 基于 npm 包模式的插件管理,安装插件和安装 npm 包一样简单
- [x] 支持 webdav 多端数据同步,真正的数据安全同步 - [x] 支持 webdav 多端数据同步,真正的数据安全同步
@ -46,6 +50,12 @@
- [x] 支持企业化内网部署 - [x] 支持企业化内网部署
- [x] 支持多语言 - [x] 支持多语言
## 使用文档
[Rubick 官网](https://rubick.vip)
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## 核心功能展示 ## 核心功能展示
### 1. 搜索系统应用 ### 1. 搜索系统应用
@ -71,36 +81,18 @@
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png) ![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
## 关联仓库 ### 更多功能
如果您还需要更多功能,欢迎来这里给我们提建议:[issues](https://github.com/rubickCenter/rubick/issues) 。
有价值的想法我们会加入到后期的开发当中。同时也欢迎一起加入共建。
[Rubick 插件仓库](https://gitee.com/rubick-center) ## 贡献
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
[Rubick 插件数据库](https://gitcode.net/rubickcenter/rubick-database)
[Rubick Plugin CLI](https://github.com/rubickCenter/rubick-plugin-cli)
## 赞助
### 1. 加入知识星球
我们在知识星球积累了大量的关于 rubick 的知识和常见问题,您可以付费加入我们的知识星球来一起讨论。我们将随时解答!
<img width=400 src=https://picx.zhimg.com/80/v2-6deabf65175d18080439ef813102d18c_720w.png />
### 2. 打赏喝杯咖啡
如果项目对你有帮助,可以请我喝杯咖啡赞赏!
<div align= "left">
<img width="180" src="https://picx.zhimg.com/80/v2-911d249dc454f3460451a4e1ecceeb14_720w.png">
<img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png">
</div>
## 反馈 ## 反馈
对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长 对本项目有兴趣或者想要交流学习的同学可以扫码加下面的微信,备注 rubick帮助我们更好的成长
![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png) ![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png)
## 贡献
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>
## License ## License
This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details. This project is licensed under the MIT License - see the [LICENSE](https://github.com/rubickCenter/rubick/blob/master/LICENSE) file for details.

View File

@ -5864,7 +5864,7 @@ lodash.memoize@^4.1.2:
lodash.throttle@^4.1.1: lodash.throttle@^4.1.1:
version "4.1.1" version "4.1.1"
resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
lodash.transform@^4.6.0: lodash.transform@^4.6.0:

View File

@ -3,7 +3,7 @@
"pluginName": "系统菜单", "pluginName": "系统菜单",
"description": "系统菜单", "description": "系统菜单",
"main": "index.html", "main": "index.html",
"logo": "https://pic1.zhimg.com/80/v2-29152fe716010751db835adf591421f8_720w.png", "logo": "https://pic1.zhimg.com/80/v2-c09780808301668a82e6646cb42f0806_720w.png",
"version": "0.0.0", "version": "0.0.0",
"preload":"preload.js", "preload":"preload.js",
"pluginType": "ui", "pluginType": "ui",

View File

@ -8,37 +8,37 @@
> >
<a-menu-item key="finder"> <a-menu-item key="finder">
<template #icon> <template #icon>
<StarOutlined style="font-size: 16px" /> <StarOutlined style="font-size: 18px;" />
</template> </template>
{{ $t('feature.market.explore') }} {{ $t('feature.market.explore') }}
</a-menu-item> </a-menu-item>
<a-menu-item key="worker"> <a-menu-item key="worker">
<template #icon> <template #icon>
<SendOutlined style="transform: rotate(-45deg); font-size: 16px" /> <SendOutlined style="transform: rotate(-45deg); font-size: 18px;" />
</template> </template>
{{ $t('feature.market.efficiency') }} {{ $t('feature.market.efficiency') }}
</a-menu-item> </a-menu-item>
<a-menu-item key="tools"> <a-menu-item key="tools">
<template #icon> <template #icon>
<SearchOutlined style="font-size: 16px" /> <SearchOutlined style="font-size: 18px;" />
</template> </template>
{{ $t('feature.market.searchTool') }} {{ $t('feature.market.searchTool') }}
</a-menu-item> </a-menu-item>
<a-menu-item key="image"> <a-menu-item key="image">
<template #icon> <template #icon>
<FileImageOutlined style="font-size: 16px" /> <FileImageOutlined style="font-size: 18px;" />
</template> </template>
{{ $t('feature.market.imageTool') }} {{ $t('feature.market.imageTool') }}
</a-menu-item> </a-menu-item>
<a-menu-item key="devPlugin"> <a-menu-item key="devPlugin">
<template #icon> <template #icon>
<CodeOutlined style="font-size: 16px" /> <CodeOutlined style="font-size: 18px;" />
</template> </template>
{{ $t('feature.market.developTool') }} {{ $t('feature.market.developTool') }}
</a-menu-item> </a-menu-item>
<a-menu-item key="system"> <a-menu-item key="system">
<template #icon> <template #icon>
<DatabaseOutlined style="font-size: 16px" /> <DatabaseOutlined style="font-size: 18px;" />
</template> </template>
{{ $t('feature.market.systemTool') }} {{ $t('feature.market.systemTool') }}
</a-menu-item> </a-menu-item>
@ -72,21 +72,7 @@
</a-sub-menu> </a-sub-menu>
</a-menu> </a-menu>
</div> </div>
<div <div :class="['finder', 'result', 'devPlugin', 'image', 'tools', 'worker', 'system'].includes(active[0]) ? 'container' : 'more'">
:class="
[
'finder',
'result',
'devPlugin',
'image',
'tools',
'worker',
'system',
].includes(active[0])
? 'container'
: 'more'
"
>
<keep-alive> <keep-alive>
<router-view /> <router-view />
</keep-alive> </keep-alive>
@ -117,14 +103,14 @@ const active = computed(() => store.state.active);
const { perf } = localConfig.getConfig(); const { perf } = localConfig.getConfig();
const changeMenu = (key: any) => { const changeMenu = (key: any) => {
store.commit('commonUpdate', { active: [key] }); store.commit('commonUpdate', {active: [key]})
router.push(key); router.push(key);
}; };
window.rubick.onPluginEnter(({ code }: { code: string }) => { window.rubick.onPluginEnter(({ code }: { code: string }) => {
code = code === '已安装插件' ? 'installed' : code; code = code === '已安装插件' ? 'installed' : code;
changeMenu(code); changeMenu(code);
store.commit('commonUpdate', { active: [code] }); store.commit('commonUpdate', {active: [code]})
}); });
window.rubick.setSubInput((e: any) => { window.rubick.setSubInput((e: any) => {
@ -143,7 +129,7 @@ window.rubick.setSubInput((e: any) => {
store.commit('setSearchValue', e.text); store.commit('setSearchValue', e.text);
router.push('result'); router.push('result');
} else { } else {
store.commit('commonUpdate', { active: ['finder'] }); store.commit('commonUpdate', {active: ['finder']})
router.push('finder'); router.push('finder');
} }
} }
@ -158,16 +144,13 @@ init();
background: var(--color-body-bg2) !important; background: var(--color-body-bg2) !important;
height: 100%; height: 100%;
border-right: none; border-right: none;
.ant-menu-item, .ant-menu-item, .ant-menu-submenu, .ant-menu-submenu-arrow {
.ant-menu-submenu,
.ant-menu-submenu-arrow {
color: var(--color-text-content); color: var(--color-text-content);
&:active { &:active {
background: none; background: none;
} }
} }
.ant-menu-item-selected, .ant-menu-item-selected, .ant-menu-submenu-selected {
.ant-menu-submenu-selected {
background-color: var(--color-list-hover); background-color: var(--color-list-hover);
color: var(--ant-primary-color); color: var(--ant-primary-color);
.ant-menu-submenu-arrow { .ant-menu-submenu-arrow {
@ -220,12 +203,9 @@ init();
background: var(--color-body-bg2); background: var(--color-body-bg2);
} }
.left-menu { .left-menu {
padding: 16px; padding: 24px 16px;
position: relative; position: relative;
height: 100vh; height: 100vh;
:deep(.ant-menu) {
width: 100%;
}
:deep(.ant-menu-item) { :deep(.ant-menu-item) {
padding-left: 12px !important; padding-left: 12px !important;
display: flex; display: flex;
@ -239,14 +219,7 @@ init();
} }
:deep(.user-info) { :deep(.user-info) {
position: absolute; position: absolute;
bottom: 16px; bottom: 32px;
width: calc(100% - 32px);
.ant-menu-submenu-title {
padding: 0 32px 0 8px;
.ant-menu-title-content {
margin-left: 8px;
}
}
} }
:deep(.ant-avatar) { :deep(.ant-avatar) {
background: transparent; background: transparent;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,6 +1,6 @@
import axios from 'axios'; import axios from 'axios';
let baseURL = 'https://gitee.com/monkeyWang/rubickdatabase/raw/master'; let baseURL = 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master';
let access_token = ''; let access_token = '';
try { try {
@ -14,7 +14,7 @@ try {
const instance = axios.create({ const instance = axios.create({
timeout: 4000, timeout: 4000,
baseURL: baseURL:
baseURL || 'https://gitee.com/monkeyWang/rubickdatabase/raw/master', baseURL || 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master',
}); });
export default { export default {
@ -23,10 +23,9 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
console.log('total plugsin', res);
return res.data; return res.data;
}, },
@ -35,7 +34,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;
@ -46,7 +45,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;
@ -56,7 +55,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;
@ -72,7 +71,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;
@ -82,7 +81,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;
@ -92,7 +91,7 @@ export default {
if (access_token) { if (access_token) {
targetPath = `${encodeURIComponent( targetPath = `${encodeURIComponent(
targetPath targetPath
)}?access_token=${access_token}&ref=master`; )}/raw?access_token=${access_token}&ref=master`;
} }
const res = await instance.get(targetPath); const res = await instance.get(targetPath);
return res.data; return res.data;

View File

@ -67,7 +67,6 @@ export default {
changeLang: 'Change Language', changeLang: 'Change Language',
cn: '简体中文', cn: '简体中文',
en: 'English', en: 'English',
history: 'keywords search history',
}, },
global: { global: {
title: 'Global Shortcut Key', title: 'Global Shortcut Key',

View File

@ -65,7 +65,6 @@ export default {
changeLang: '切换语言', changeLang: '切换语言',
cn: '简体中文', cn: '简体中文',
en: 'English', en: 'English',
history: '关键词搜索记录',
}, },
global: { global: {
title: '全局快捷键', title: '全局快捷键',

View File

@ -7,7 +7,7 @@
:data-source="list.filter((item) => !!item)" :data-source="list.filter((item) => !!item)"
> >
<template #renderItem="{ item, index }"> <template #renderItem="{ item, index }">
<a-list-item v-if="item" @click="showDetail(index)"> <a-list-item v-if="item" @click="showDetail(item)">
<template #actions> <template #actions>
<a-button <a-button
class="download-plugin-btn" class="download-plugin-btn"
@ -105,7 +105,7 @@ import {
SelectOutlined SelectOutlined
} from '@ant-design/icons-vue'; } from '@ant-design/icons-vue';
import { defineProps, ref, computed } from 'vue'; import { defineProps, ref } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import MarkdownIt from 'markdown-it'; import MarkdownIt from 'markdown-it';
@ -121,7 +121,7 @@ const router = useRouter();
const startDownload = (name) => store.dispatch('startDownload', name); const startDownload = (name) => store.dispatch('startDownload', name);
const successDownload = (name) => store.dispatch('successDownload', name); const successDownload = (name) => store.dispatch('successDownload', name);
const props = defineProps({ defineProps({
list: { list: {
type: [Array], type: [Array],
default: () => [], default: () => [],
@ -137,14 +137,13 @@ const downloadPlugin = async (plugin) => {
}; };
const visible = ref(false); const visible = ref(false);
const showIndex = ref(0); const detail = ref({});
const markdown = new MarkdownIt(); const markdown = new MarkdownIt();
const content = ref(''); const content = ref('');
const showDetail = async (index) => { const showDetail = async (item) => {
const item = props.list[index];
visible.value = true; visible.value = true;
showIndex.value = index; detail.value = item;
content.value = ''; content.value = '';
let mdContent = '暂无内容'; let mdContent = '暂无内容';
try { try {
@ -157,8 +156,6 @@ const showDetail = async (index) => {
} }
}; };
const detail = computed(() => props.list[showIndex.value]);
const openPlugin = (item) => { const openPlugin = (item) => {
store.commit('commonUpdate', {active: ['installed']}) store.commit('commonUpdate', {active: ['installed']})
router.push({ router.push({

View File

@ -31,9 +31,9 @@ const searchValue = computed(() => store.state.searchValue);
const result = computed(() => { const result = computed(() => {
if (searchValue.value.trim().length > 0) { if (searchValue.value.trim().length > 0) {
const pattern = new RegExp(searchValue.value.toLowerCase()); const pattern = new RegExp(searchValue.value);
return totalPlugins.value.filter((plugin) => { return totalPlugins.value.filter((plugin) => {
if (plugin.pluginName.toLowerCase().match(pattern)) { if (plugin.pluginName.match(pattern)) {
return true; return true;
} else { } else {
return false; return false;

View File

@ -119,16 +119,6 @@
:un-checked-children="$t('feature.settings.basic.off')" :un-checked-children="$t('feature.settings.basic.off')"
></a-switch> ></a-switch>
</div> </div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.history') }}
</div>
<a-switch
v-model:checked="common.history"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div> </div>
<div class="setting-item"> <div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.theme') }}</div> <div class="title">{{ $t('feature.settings.basic.theme') }}</div>
@ -274,16 +264,12 @@ const state = reactive({
custom: {}, custom: {},
}); });
// lastKeyPressTime
const lastKeyPressTime = ref(0);
const DOUBLE_CLICK_THRESHOLD = 300; //
const isWindows = window?.rubick?.isWindows(); const isWindows = window?.rubick?.isWindows();
const tipText = computed(() => { const tipText = computed(() => {
const optionKeyName = isWindows ? 'Alt' : 'Option、Command'; const optionKeyName = isWindows ? 'Alt' : 'Option、Command';
return t('feature.settings.global.addShortcutKeyTips', { return t('feature.settings.global.addShortcutKeyTips', {
optionKeyName: optionKeyName, optionKeyName: optionKeyName,
}) + `此外你也可以双击修饰键如Ctrl+Ctrl`; });
}); });
const currentSelect = ref(['userInfo']); const currentSelect = ref(['userInfo']);
@ -297,15 +283,14 @@ state.local = perf.local;
state.global = defaultGlobal; state.global = defaultGlobal;
const setConfig = debounce(() => { const setConfig = debounce(() => {
const { perf } = localConfig.getConfig();
localConfig.setConfig( localConfig.setConfig(
JSON.parse( JSON.parse(
JSON.stringify({ JSON.stringify({
perf: { perf: {
...perf,
shortCut: state.shortCut, shortCut: state.shortCut,
common: state.common, common: state.common,
local: state.local, local: state.local,
custom: state.custom,
}, },
global: state.global, global: state.global,
}) })
@ -318,60 +303,33 @@ watch(state, setConfig);
const changeShortCut = (e, key) => { const changeShortCut = (e, key) => {
let compose = ''; let compose = '';
const currentTime = Date.now(); //
const isDoubleClick = currentTime - lastKeyPressTime.value < DOUBLE_CLICK_THRESHOLD; let incluFuncKeys = false;
lastKeyPressTime.value = currentTime;
// F1-F12
if (e.keyCode >= 112 && e.keyCode <= 123) {
state.shortCut[key] = keycodes[e.keyCode].toUpperCase();
return;
}
//
if (isDoubleClick) {
if (e.keyCode === 17) { // Ctrl
state.shortCut[key] = 'Ctrl+Ctrl';
return;
}
if (e.keyCode === 18) { // Alt
state.shortCut[key] = 'Option+Option';
return;
}
if (e.keyCode === 16) { // Shift
state.shortCut[key] = 'Shift+Shift';
return;
}
if (e.keyCode === 93) { // Command
state.shortCut[key] = 'Command+Command';
return;
}
}
// +
let hasModifierKey = false;
if (e.ctrlKey && e.keyCode !== 17) { if (e.ctrlKey && e.keyCode !== 17) {
compose += '+Ctrl'; compose += '+Ctrl';
hasModifierKey = true; incluFuncKeys = true;
} }
if (e.shiftKey && e.keyCode !== 16) { if (e.shiftKey && e.keyCode !== 16) {
compose += '+Shift'; compose += '+Shift';
hasModifierKey = true; incluFuncKeys = true;
} }
if (e.altKey && e.keyCode !== 18) { if (e.altKey && e.keyCode !== 18) {
compose += '+Option'; compose += '+Option';
hasModifierKey = true; incluFuncKeys = true;
} }
if (e.metaKey && e.keyCode !== 93) { if (e.metaKey && e.keyCode !== 93) {
compose += '+Command'; compose += '+Command';
hasModifierKey = true; incluFuncKeys = true;
} }
compose += '+' + keycodes[e.keyCode].toUpperCase();
// compose = compose.substring(1);
if (hasModifierKey) { if (
compose += '+' + keycodes[e.keyCode].toUpperCase(); incluFuncKeys &&
compose = compose.substring(1); e.keyCode !== 16 &&
e.keyCode !== 17 &&
e.keyCode !== 18 &&
e.keyCode !== 93
) {
state.shortCut[key] = compose; state.shortCut[key] = compose;
} else { } else {
// //

View File

@ -17,7 +17,7 @@
name="register" name="register"
> >
<a-input <a-input
placeholder="https://registry.npmmirror.com" placeholder="https://registry.npm.taobao.org"
v-model:value="formState.register" v-model:value="formState.register"
/> />
</a-form-item> </a-form-item>
@ -27,7 +27,7 @@
name="database" name="database"
> >
<a-input <a-input
placeholder="https://gitee.com/monkeyWang/rubickdatabase/raw/master" placeholder="https://gitcode.net/rubickcenter/rubick-database/-/raw/master"
v-model:value="formState.database" v-model:value="formState.database"
/> />
</a-form-item> </a-form-item>
@ -54,8 +54,8 @@ import { message } from 'ant-design-vue';
let _rev: any; let _rev: any;
let defaultConfig = { let defaultConfig = {
register: 'https://registry.npmmirror.com', register: 'https://registry.npm.taobao.org',
database: 'https://gitee.com/monkeyWang/rubickdatabase/raw/master', database: 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master',
access_token: '', access_token: '',
}; };
@ -81,7 +81,7 @@ const layout = {
const resetForm = () => { const resetForm = () => {
formState.value = { formState.value = {
register: 'https://registry.npmmirror.com', register: 'https://registry.npmmirror.com',
database: 'https://gitee.com/monkeyWang/rubickdatabase/raw/master', database: 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master',
access_token: '', access_token: '',
}; };
}; };

View File

@ -64,8 +64,6 @@ const theme = ref(perf.custom.theme);
state.custom = perf.custom || {}; state.custom = perf.custom || {};
const setConfig = debounce(() => { const setConfig = debounce(() => {
const { perf } = localConfig.getConfig();
localConfig.setConfig( localConfig.setConfig(
JSON.parse( JSON.parse(
JSON.stringify({ JSON.stringify({

View File

@ -1,6 +1,6 @@
{ {
"name": "rubick", "name": "rubick",
"version": "4.3.5", "version": "4.1.6",
"author": "muwoo <2424880409@qq.com>", "author": "muwoo <2424880409@qq.com>",
"private": true, "private": true,
"scripts": { "scripts": {
@ -39,7 +39,6 @@
"pouchdb-load": "^1.4.6", "pouchdb-load": "^1.4.6",
"pouchdb-replication-stream": "^1.2.9", "pouchdb-replication-stream": "^1.2.9",
"simple-plist": "0.2.1", "simple-plist": "0.2.1",
"uiohook-napi": "^1.5.4",
"vue": "^3.0.0", "vue": "^3.0.0",
"vue-router": "^4.0.0-0", "vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0", "vuex": "^4.0.0-0",
@ -47,7 +46,6 @@
"worker-loader": "^3.0.8" "worker-loader": "^3.0.8"
}, },
"devDependencies": { "devDependencies": {
"@electron/asar": "^3.2.8",
"@ts-type/package-dts": "^1.0.53", "@ts-type/package-dts": "^1.0.53",
"@types/electron-devtools-installer": "^2.2.0", "@types/electron-devtools-installer": "^2.2.0",
"@typescript-eslint/eslint-plugin": "^4.18.0", "@typescript-eslint/eslint-plugin": "^4.18.0",
@ -62,7 +60,6 @@
"@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0", "@vue/eslint-config-typescript": "^7.0.0",
"babel-plugin-import": "^1.13.3", "babel-plugin-import": "^1.13.3",
"compressing": "^1.10.0",
"electron": "26.0.0", "electron": "26.0.0",
"electron-builder": "22.13.1", "electron-builder": "22.13.1",
"electron-devtools-installer": "^3.1.0", "electron-devtools-installer": "^3.1.0",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@
"pluginName": "系统菜单", "pluginName": "系统菜单",
"description": "系统菜单", "description": "系统菜单",
"main": "index.html", "main": "index.html",
"logo": "https://pic1.zhimg.com/80/v2-29152fe716010751db835adf591421f8_720w.png", "logo": "https://pic1.zhimg.com/80/v2-c09780808301668a82e6646cb42f0806_720w.png",
"version": "0.0.0", "version": "0.0.0",
"preload":"preload.js", "preload":"preload.js",
"pluginType": "ui", "pluginType": "ui",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
public/icons/icon@3x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,9 +0,0 @@
exports.default = async function () {
const fs = require('fs');
const compressing = require('compressing');
const src = './build/mac/rubick.app/Contents/Resources/app.asar';
if (fs.existsSync(src)) {
await compressing.gzip.compressFile(src, 'build/app.asar.gz');
}
};

View File

@ -1,5 +1,5 @@
export default { export default {
version: 7, version: 4,
perf: { perf: {
custom: { custom: {
theme: 'SPRING', theme: 'SPRING',
@ -25,7 +25,6 @@ export default {
autoPast: false, autoPast: false,
darkMode: false, darkMode: false,
guide: false, guide: false,
history: true,
lang: 'zh-CN', lang: 'zh-CN',
}, },
local: { local: {

View File

@ -4,6 +4,6 @@ import path from 'path';
const appPath = app.getPath('userData'); const appPath = app.getPath('userData');
const PLUGIN_INSTALL_DIR = path.join(appPath, './rubick-plugins-new'); const PLUGIN_INSTALL_DIR = path.join(appPath, './rubick-plugins-new');
const PLUGIN_HISTORY = 'rubick-plugin-history'; const PLUGIN_HISTORY = 'rubick-local-start-app';
export { PLUGIN_INSTALL_DIR, PLUGIN_HISTORY }; export { PLUGIN_INSTALL_DIR, PLUGIN_HISTORY };

View File

@ -32,6 +32,63 @@ const getIconFile = (appFileInput) => {
}); });
}; };
// const sortIcons = (icons) => {
// const aWins = -1;
// const bWins = 1;
// const catWins = 0;
// return icons.sort((a, b) => {
// const aSize = parseInt(a.match(/(\d+)x\1/)[1], 10);
// const bSize = parseInt(b.match(/(\d+)x\1/)[1], 10);
// if (aSize === bSize) {
// if (a.indexOf('@2x') > -1) return aWins;
// if (b.indexOf('@2x') > -1) return bWins;
// return catWins;
// }
// if (aSize > bSize) return aWins;
// if (aSize < bSize) return bWins;
// return catWins;
// });
// };
// const icnsToPng = (iconFile, pngFileOutput) => {
// const outputDir = pngFileOutput.split('.')[0] + '.iconset'
// return new Promise((resolve, reject) => {
// exec(`iconutil --convert iconset '${iconFile}' --output '${outputDir}'`, (error) => {
// if (error) return reject(error)
// fs.readdir(outputDir, (error, files) => {
// if (error) {
// return resolve(tiffToPng(iconFile, pngFileOutput))
// }
// const realIcons = files.map((file) => {
// return path.join(outputDir, file)
// })
// const biggestIcon = sortIcons(realIcons).find(Boolean)
// fs.rename(biggestIcon, pngFileOutput, (error) => {
// error ? reject(error) : resolve(realIcons.filter((file) => {
// return file !== biggestIcon
// }))
// })
// })
// })
// }).then((files) => {
// // Cleanup temp icons
// return Promise.all(files.map((file) => {
// return new Promise((resolve, reject) => {
// fs.unlink(file, (error) => {
// error ? reject(error) : resolve()
// })
// })
// }))
// }).then(() => {
// // Cleanup temp directory
// return new Promise((resolve, reject) => {
// fs.rmdir(outputDir, (error) => {
// error ? reject(error) : resolve()
// })
// })
// })
// }
const tiffToPng = (iconFile, pngFileOutput) => { const tiffToPng = (iconFile, pngFileOutput) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
exec( exec(

View File

@ -1,23 +1,23 @@
import { spawn } from 'child_process'; import { spawn } from "child_process";
import plist from 'plist'; import plist from "plist";
export default function getApps(resolve, reject, filterByAppName = false) { export default function getApps(resolve, reject, filterByAppName = false) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore // @ts-ignore
let resultBuffer = new Buffer.from([]); let resultBuffer = new Buffer.from([]);
const profileInstalledApps = spawn('/usr/sbin/system_profiler', [ const profileInstalledApps = spawn("/usr/sbin/system_profiler", [
'-xml', "-xml",
'-detailLevel', "-detailLevel",
'mini', "mini",
'SPApplicationsDataType', "SPApplicationsDataType",
]); ]);
profileInstalledApps.stdout.on('data', (chunckBuffer) => { profileInstalledApps.stdout.on("data", (chunckBuffer) => {
resultBuffer = Buffer.concat([resultBuffer, chunckBuffer]); resultBuffer = Buffer.concat([resultBuffer, chunckBuffer]);
}); });
profileInstalledApps.on('exit', (exitCode) => { profileInstalledApps.on("exit", (exitCode) => {
if (exitCode !== 0) { if (exitCode !== 0) {
reject([]); reject([]);
return; return;
@ -37,7 +37,7 @@ export default function getApps(resolve, reject, filterByAppName = false) {
} }
}); });
profileInstalledApps.on('error', (err) => { profileInstalledApps.on("error", (err) => {
reject(err); reject(err);
}); });
} }

View File

@ -7,10 +7,11 @@ import path from 'path';
import got from 'got'; import got from 'got';
import fixPath from 'fix-path'; import fixPath from 'fix-path';
import spawn from 'cross-spawn';
import { ipcRenderer } from 'electron'; import { ipcRenderer } from 'electron';
import axios from 'axios'; import axios from 'axios';
import npm from 'npm';
fixPath(); fixPath();
/** /**
@ -41,7 +42,7 @@ class AdapterHandler {
} }
this.baseDir = options.baseDir; this.baseDir = options.baseDir;
let register = options.registry || 'https://registry.npmmirror.com'; let register = options.registry || 'https://registry.npmmirror.com/';
try { try {
const dbdata = ipcRenderer.sendSync('msg-trigger', { const dbdata = ipcRenderer.sendSync('msg-trigger', {
@ -60,7 +61,7 @@ class AdapterHandler {
const packageJSON = JSON.parse( const packageJSON = JSON.parse(
fs.readFileSync(`${this.baseDir}/package.json`, 'utf-8') fs.readFileSync(`${this.baseDir}/package.json`, 'utf-8')
); );
const registryUrl = `https://registry.npmmirror.com/${name}`; const registryUrl = `https://registry.npm.taobao.org/${name}`;
// 从npm源中获取依赖包的最新版本 // 从npm源中获取依赖包的最新版本
try { try {
@ -157,44 +158,67 @@ class AdapterHandler {
*/ */
private async execCommand(cmd: string, modules: string[]): Promise<string> { private async execCommand(cmd: string, modules: string[]): Promise<string> {
return new Promise((resolve: any, reject: any) => { return new Promise((resolve: any, reject: any) => {
let args: string[] = [cmd].concat( const module =
cmd !== 'uninstall' && cmd !== 'link' cmd !== 'uninstall' && cmd !== 'link'
? modules.map((m) => `${m}@latest`) ? modules.map((m) => `${m}@latest`)
: modules : modules;
); const config: any = {
prefix: this.baseDir,
save: true,
cache: path.join(this.baseDir, 'cache'),
};
if (cmd !== 'link') { if (cmd !== 'link') {
args = args config.registry = this.registry;
.concat('--color=always')
.concat('--save')
.concat(`--registry=${this.registry}`);
} }
npm.load(config, function (err) {
npm.commands[cmd](module, function (er, data) {
if (!err) {
console.log(data);
resolve({ code: -1, data });
} else {
reject({ code: -1, data: err });
}
});
const npm = spawn('npm', args, { npm.on('log', function (message) {
cwd: this.baseDir, // log installation progress
console.log(message);
});
}); });
console.log(args); // if (cmd !== 'link') {
// args = args
// .concat('--color=always')
// .concat('--save')
// .concat(`--registry=${this.registry}`);
// }
let output = ''; // const npm = spawn('npm', args, {
npm.stdout // cwd: this.baseDir,
.on('data', (data: string) => { // });
output += data; // 获取输出日志 //
}) // console.log(args);
.pipe(process.stdout); //
// let output = '';
npm.stderr // npm.stdout
.on('data', (data: string) => { // .on('data', (data: string) => {
output += data; // 获取报错日志 // output += data; // 获取输出日志
}) // })
.pipe(process.stderr); // .pipe(process.stdout);
//
npm.on('close', (code: number) => { // npm.stderr
if (!code) { // .on('data', (data: string) => {
resolve({ code: 0, data: output }); // 如果没有报错就输出正常日志 // output += data; // 获取报错日志
} else { // })
reject({ code: code, data: output }); // 如果报错就输出报错日志 // .pipe(process.stderr);
} //
}); // npm.on('close', (code: number) => {
// if (!code) {
// resolve({ code: 0, data: output }); // 如果没有报错就输出正常日志
// } else {
// reject({ code: code, data: output }); // 如果报错就输出报错日志
// }
// });
}); });
} }
} }

View File

@ -175,29 +175,31 @@ export default () => {
const removeView = (window: BrowserWindow) => { const removeView = (window: BrowserWindow) => {
if (!view) return; if (!view) return;
window.removeBrowserView(view);
if (!view.inDetach) {
window.setBrowserView(null);
view.webContents?.destroy();
}
// window.setSize(800, 60);
executeHooks('PluginOut', null); executeHooks('PluginOut', null);
setTimeout(() => { window.webContents?.executeJavaScript(`window.initRubick()`);
window.removeBrowserView(view); view = undefined;
if (!view.inDetach) {
window.setBrowserView(null);
view.webContents?.destroy();
}
window.webContents?.executeJavaScript(`window.initRubick()`);
view = undefined;
}, 0);
}; };
const getView = () => view; const getView = () => view;
const executeHooks = (hook, data) => { const executeHooks = (hook, data) => {
if (!view) return; setTimeout(() => {
const evalJs = `if(window.rubick && window.rubick.hooks && typeof window.rubick.hooks.on${hook} === 'function' ) { if (!view) return;
const evalJs = `if(window.rubick && window.rubick.hooks && typeof window.rubick.hooks.on${hook} === 'function' ) {
try { try {
window.rubick.hooks.on${hook}(${data ? JSON.stringify(data) : ''}); window.rubick.hooks.on${hook}(${data ? JSON.stringify(data) : ''});
} catch(e) {} } catch(e) {}
} }
`; `;
view.webContents?.executeJavaScript(evalJs); view.webContents?.executeJavaScript(evalJs);
}, 300);
}; };
return { return {

View File

@ -128,8 +128,8 @@ class API extends DBInstance {
} }
public removePlugin(e, window) { public removePlugin(e, window) {
runnerInstance.removeView(window);
this.currentPlugin = null; this.currentPlugin = null;
runnerInstance.removeView(window);
} }
public openPluginDevTools() { public openPluginDevTools() {
@ -139,7 +139,6 @@ class API extends DBInstance {
public hideMainWindow(arg, window) { public hideMainWindow(arg, window) {
window.hide(); window.hide();
} }
public showMainWindow(arg, window) { public showMainWindow(arg, window) {
window.show(); window.show();
} }
@ -157,15 +156,6 @@ class API extends DBInstance {
if (!originWindow) return; if (!originWindow) return;
const targetHeight = height; const targetHeight = height;
originWindow.setSize(originWindow.getSize()[0], targetHeight); originWindow.setSize(originWindow.getSize()[0], targetHeight);
const screenPoint = screen.getCursorScreenPoint();
const display = screen.getDisplayNearestPoint(screenPoint);
const position =
originWindow.getPosition()[1] + targetHeight > display.bounds.height
? height - 60
: 0;
originWindow.webContents.executeJavaScript(
`window.setPosition && typeof window.setPosition === "function" && window.setPosition(${position})`
);
} }
public setSubInput({ data }, window, e) { public setSubInput({ data }, window, e) {
@ -211,10 +201,11 @@ class API extends DBInstance {
if (!Notification.isSupported()) return; if (!Notification.isSupported()) return;
'string' != typeof body && (body = String(body)); 'string' != typeof body && (body = String(body));
const plugin = this.currentPlugin; const plugin = this.currentPlugin;
if (!plugin) return;
const notify = new Notification({ const notify = new Notification({
title: plugin ? plugin.pluginName : null, title: plugin.pluginName,
body, body,
icon: plugin ? plugin.logo : null, icon: plugin.logo,
}); });
notify.show(); notify.show();
} }
@ -335,7 +326,6 @@ class API extends DBInstance {
shell.showItemInFolder(data.path); shell.showItemInFolder(data.path);
return true; return true;
} }
public async getFileIcon({ data }) { public async getFileIcon({ data }) {
const nativeImage = await app.getFileIcon(data.path, { size: 'normal' }); const nativeImage = await app.getFileIcon(data.path, { size: 'normal' });
return nativeImage.toDataURL(); return nativeImage.toDataURL();

View File

@ -10,7 +10,6 @@ import {
import screenCapture from '@/core/screen-capture'; import screenCapture from '@/core/screen-capture';
import localConfig from '@/main/common/initLocalConfig'; import localConfig from '@/main/common/initLocalConfig';
import winPosition from './getWinPosition'; import winPosition from './getWinPosition';
import { uIOhook, UiohookKey } from 'uiohook-napi';
const registerHotKey = (mainWindow: BrowserWindow): void => { const registerHotKey = (mainWindow: BrowserWindow): void => {
// 设置开机启动 // 设置开机启动
@ -58,43 +57,27 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
} }
}; };
// 显示主窗口
function mainWindowPopUp() {
const currentShow = mainWindow.isVisible() && mainWindow.isFocused();
if (currentShow) return mainWindow.hide();
const { x: wx, y: wy } = winPosition.getPosition();
mainWindow.setAlwaysOnTop(false);
mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
mainWindow.focus();
mainWindow.setVisibleOnAllWorkspaces(false, {
visibleOnFullScreen: true,
});
mainWindow.setPosition(wx, wy);
mainWindow.show();
}
const init = async () => { const init = async () => {
await setAutoLogin(); await setAutoLogin();
await setDarkMode(); await setDarkMode();
await setTheme(); await setTheme();
const config = await localConfig.getConfig(); const config = await localConfig.getConfig();
globalShortcut.unregisterAll(); globalShortcut.unregisterAll();
// 注册偏好快捷键 // 注册偏好快捷键
// 处理显示/隐藏快捷键的注册 globalShortcut.register(config.perf.shortCut.showAndHidden, () => {
const doublePressShortcuts = ['Ctrl+Ctrl', 'Option+Option', 'Shift+Shift', 'Command+Command']; const currentShow = mainWindow.isVisible() && mainWindow.isFocused();
const isDoublePressShortcut = doublePressShortcuts.includes(config.perf.shortCut.showAndHidden); if (currentShow) return mainWindow.hide();
const { x: wx, y: wy } = winPosition.getPosition();
if (isDoublePressShortcut) { mainWindow.setAlwaysOnTop(false);
// 双击快捷键(如 Ctrl+Ctrl详见 uIOhookRegister 函数实现 mainWindow.setVisibleOnAllWorkspaces(true, { visibleOnFullScreen: true });
} else { mainWindow.focus();
// 注册普通快捷键(如 Ctrl+Space、F8 等) mainWindow.setVisibleOnAllWorkspaces(false, {
globalShortcut.register(config.perf.shortCut.showAndHidden, () => { visibleOnFullScreen: true,
mainWindowPopUp();
}); });
} mainWindow.setPosition(wx, wy);
mainWindow.show();
});
// 截图快捷键
globalShortcut.register(config.perf.shortCut.capture, () => { globalShortcut.register(config.perf.shortCut.capture, () => {
screenCapture(mainWindow, (data) => { screenCapture(mainWindow, (data) => {
data && data &&
@ -110,17 +93,6 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
// mainWindow.show(); // mainWindow.show();
}); });
// 添加局部快捷键监听
mainWindow.webContents.on('before-input-event', (event, input) => {
if (input.key.toLowerCase() === 'w'
&& (input.control || input.meta) && !input.alt && !input.shift) {
event.preventDefault();
if (mainWindow && !mainWindow.isDestroyed()) {
mainWindow.hide();
}
}
});
// 注册自定义全局快捷键 // 注册自定义全局快捷键
config.global.forEach((sc) => { config.global.forEach((sc) => {
if (!sc.key || !sc.value) return; if (!sc.key || !sc.value) return;
@ -129,48 +101,9 @@ const registerHotKey = (mainWindow: BrowserWindow): void => {
}); });
}); });
}; };
uIOhookRegister(mainWindowPopUp);
init(); init();
ipcMain.on('re-register', () => { ipcMain.on('re-register', () => {
init(); init();
}); });
}; };
export default registerHotKey; export default registerHotKey;
function uIOhookRegister(callback: () => void) {
let lastModifierPress = Date.now();
uIOhook.on('keydown', async (uio_event) => {
const config = await localConfig.getConfig(); // 此处还有优化空间
if (
![
'Ctrl+Ctrl',
'Option+Option',
'Shift+Shift',
'Command+Command',
].includes(config.perf.shortCut.showAndHidden)
) {
return;
}
// 双击快捷键,如 Ctrl+Ctrl
const modifers = config.perf.shortCut.showAndHidden.split('+');
const showAndHiddenKeyStr = modifers.pop(); // Ctrl
const keyStr2uioKeyCode = {
Ctrl: UiohookKey.Ctrl,
Shift: UiohookKey.Shift,
Option: UiohookKey.Alt,
Command: UiohookKey.Comma,
};
if (uio_event.keycode === keyStr2uioKeyCode[showAndHiddenKeyStr]) {
const currentTime = Date.now();
if (currentTime - lastModifierPress < 300) {
callback(); // 调用 mainWindowPopUp
}
lastModifierPress = currentTime;
}
});
uIOhook.start();
}

View File

@ -9,7 +9,7 @@ function createTray(window: BrowserWindow): Promise<Tray> {
return new Promise((resolve) => { return new Promise((resolve) => {
let icon; let icon;
if (commonConst.macOS()) { if (commonConst.macOS()) {
icon = './icons/iconTemplate@2x.png'; icon = './icons/icon@3x.png';
} else if (commonConst.windows()) { } else if (commonConst.windows()) {
icon = icon =
parseInt(os.release()) < 10 parseInt(os.release()) < 10

View File

@ -1,5 +1,8 @@
<template> <template>
<div id="components-layout" @mousedown="onMouseDown"> <div
id="components-layout"
@mousedown="onMouseDown"
>
<Search <Search
:currentPlugin="currentPlugin" :currentPlugin="currentPlugin"
@changeCurrent="changeIndex" @changeCurrent="changeIndex"
@ -32,7 +35,6 @@
<script setup lang="ts"> <script setup lang="ts">
import { watch, ref, toRaw } from 'vue'; import { watch, ref, toRaw } from 'vue';
import { exec } from 'child_process';
import Result from './components/result.vue'; import Result from './components/result.vue';
import Search from './components/search.vue'; import Search from './components/search.vue';
import getWindowHeight from '../common/utils/getWindowHeight'; import getWindowHeight from '../common/utils/getWindowHeight';
@ -41,7 +43,6 @@ import useDrag from '../common/utils/dragWindow';
import { getGlobal } from '@electron/remote'; import { getGlobal } from '@electron/remote';
import { PLUGIN_HISTORY } from '@/common/constans/renderer'; import { PLUGIN_HISTORY } from '@/common/constans/renderer';
import { message } from 'ant-design-vue'; import { message } from 'ant-design-vue';
import localConfig from './confOp';
const { onMouseDown } = useDrag(); const { onMouseDown } = useDrag();
const remote = window.require('@electron/remote'); const remote = window.require('@electron/remote');
@ -72,8 +73,6 @@ initPlugins();
const currentSelect = ref(0); const currentSelect = ref(0);
const menuPluginInfo: any = ref({}); const menuPluginInfo: any = ref({});
const config: any = ref(localConfig.getConfig());
getPluginInfo({ getPluginInfo({
pluginName: 'feature', pluginName: 'feature',
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
@ -91,9 +90,7 @@ watch(
window.rubick.setExpendHeight( window.rubick.setExpendHeight(
getWindowHeight( getWindowHeight(
options.value, options.value,
pluginLoading.value || !config.value.perf.common.history pluginLoading.value ? [] : pluginHistory.value
? []
: pluginHistory.value
) )
); );
}, },
@ -103,15 +100,26 @@ watch(
); );
const changeIndex = (index) => { const changeIndex = (index) => {
const len = options.value.length || pluginHistory.value.length; if (!options.value.length) {
if (!len) return; if (!pluginHistory.value.length) return;
if (currentSelect.value + index > len - 1) { if (
currentSelect.value = 0; currentSelect.value + index > pluginHistory.value.length - 1 ||
} else if (currentSelect.value + index < 0) { currentSelect.value + index < 0
currentSelect.value = len - 1; ) {
} else { currentSelect.value = 0;
return;
}
currentSelect.value = currentSelect.value + index; currentSelect.value = currentSelect.value + index;
return;
} }
if (
currentSelect.value + index > options.value.length - 1 ||
currentSelect.value + index < 0
) {
currentSelect.value = 0;
return;
}
currentSelect.value = currentSelect.value + index;
}; };
const openMenu = (ext) => { const openMenu = (ext) => {
@ -134,12 +142,6 @@ const choosePlugin = (plugin) => {
const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins(); const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins();
const currentChoose = plugin || pluginHistory.value[currentSelect.value]; const currentChoose = plugin || pluginHistory.value[currentSelect.value];
let hasRemove = true; let hasRemove = true;
if (currentChoose.pluginType === 'app') {
hasRemove = false;
changePluginHistory(currentChoose);
exec(currentChoose.action);
return;
}
localPlugins.find((plugin) => { localPlugins.find((plugin) => {
if (plugin.name === currentChoose.originName) { if (plugin.name === currentChoose.originName) {
hasRemove = false; hasRemove = false;
@ -149,9 +151,7 @@ const choosePlugin = (plugin) => {
}); });
if (hasRemove) { if (hasRemove) {
const result = window.rubick.db.get(PLUGIN_HISTORY) || {}; const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
const history = result.data.filter( const history = result.data.filter(item => item.originName !== currentChoose.originName);
(item) => item.originName !== currentChoose.originName
);
setPluginHistory(history); setPluginHistory(history);
return message.warning('插件已被卸载!'); return message.warning('插件已被卸载!');
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -2,12 +2,7 @@
<div v-show="!currentPlugin.name" class="options"> <div v-show="!currentPlugin.name" class="options">
<div <div
class="history-plugins" class="history-plugins"
v-if=" v-if="!options.length || !(searchValue || !!clipboardFile.length)"
!options.length &&
!searchValue &&
!clipboardFile.length &&
config.perf.common.history
"
> >
<a-row> <a-row>
<a-col <a-col
@ -49,16 +44,12 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { defineEmits, defineProps, reactive, ref, toRaw, watch } from 'vue'; import {defineEmits, defineProps, reactive, toRaw, watch} from 'vue';
import localConfig from '../confOp';
const path = window.require('path'); const path = window.require('path');
const remote = window.require('@electron/remote'); const remote = window.require('@electron/remote');
declare const __static: string; declare const __static: string;
const config: any = ref(localConfig.getConfig());
const props: any = defineProps({ const props: any = defineProps({
searchValue: { searchValue: {
type: [String, Number], type: [String, Number],

View File

@ -25,8 +25,6 @@
ref="mainInput" ref="mainInput"
class="main-input" class="main-input"
@input="(e) => changeValue(e)" @input="(e) => changeValue(e)"
@keydown.left="(e) => keydownEvent(e, 'left')"
@keydown.right="(e) => keydownEvent(e, 'right')"
@keydown.down="(e) => keydownEvent(e, 'down')" @keydown.down="(e) => keydownEvent(e, 'down')"
@keydown.tab="(e) => keydownEvent(e, 'down')" @keydown.tab="(e) => keydownEvent(e, 'down')"
@keydown.up="(e) => keydownEvent(e, 'up')" @keydown.up="(e) => keydownEvent(e, 'up')"
@ -43,7 +41,10 @@
> >
<template #suffix> <template #suffix>
<div class="suffix-tool"> <div class="suffix-tool">
<MoreOutlined @click="showSeparate()" class="icon-more" /> <MoreOutlined
@click="showSeparate()"
class="icon-more"
/>
</div> </div>
</template> </template>
</a-input> </a-input>
@ -95,7 +96,6 @@ const emit = defineEmits([
]); ]);
const keydownEvent = (e, key: string) => { const keydownEvent = (e, key: string) => {
key !== 'space' && e.preventDefault();
const { ctrlKey, shiftKey, altKey, metaKey } = e; const { ctrlKey, shiftKey, altKey, metaKey } = e;
const modifiers: Array<string> = []; const modifiers: Array<string> = [];
ctrlKey && modifiers.push('control'); ctrlKey && modifiers.push('control');
@ -119,19 +119,12 @@ const keydownEvent = (e, key: string) => {
case 'down': case 'down':
emit('changeCurrent', 1); emit('changeCurrent', 1);
break; break;
case 'left':
emit('changeCurrent', -1);
break;
case 'right':
emit('changeCurrent', 1);
break;
case 'enter': case 'enter':
if (runPluginDisable) return; if (runPluginDisable) return;
emit('choosePlugin'); emit('choosePlugin');
break; break;
case 'space': case 'space':
if (runPluginDisable || !config.value.perf.common.space) return; if (runPluginDisable || !config.value.perf.common.space) return;
e.preventDefault();
emit('choosePlugin'); emit('choosePlugin');
break; break;
default: default:

View File

@ -46,7 +46,7 @@ const createPluginManager = (): any => {
const initLocalStartPlugin = () => { const initLocalStartPlugin = () => {
const result = ipcRenderer.sendSync('msg-trigger', { const result = ipcRenderer.sendSync('msg-trigger', {
type: 'dbGet', type: 'dbGet',
data: { id: 'rubick-local-start-app' }, data: { id: PLUGIN_HISTORY },
}); });
if (result && result.value) { if (result && result.value) {
appList.value.push(...result.value); appList.value.push(...result.value);
@ -77,10 +77,6 @@ const createPluginManager = (): any => {
}; };
const openPlugin = async (plugin, option) => { const openPlugin = async (plugin, option) => {
ipcRenderer.send('msg-trigger', {
type: 'removePlugin',
});
window.initRubick();
if (plugin.pluginType === 'ui' || plugin.pluginType === 'system') { if (plugin.pluginType === 'ui' || plugin.pluginType === 'system') {
if (state.currentPlugin && state.currentPlugin.name === plugin.name) { if (state.currentPlugin && state.currentPlugin.name === plugin.name) {
window.rubick.showMainWindow(); window.rubick.showMainWindow();
@ -107,6 +103,7 @@ const createPluginManager = (): any => {
message.error('启动应用出错,请确保启动应用存在!'); message.error('启动应用出错,请确保启动应用存在!');
} }
} }
window.initRubick();
changePluginHistory({ changePluginHistory({
...plugin, ...plugin,
...option, ...option,

View File

@ -8,7 +8,7 @@ import useFocus from './clipboardWatch';
function formatReg(regStr) { function formatReg(regStr) {
const flags = regStr.replace(/.*\/([gimy]*)$/, '$1'); const flags = regStr.replace(/.*\/([gimy]*)$/, '$1');
const pattern = regStr.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1'); const pattern = flags.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');
return new RegExp(pattern, flags); return new RegExp(pattern, flags);
} }

View File

@ -33,10 +33,6 @@ module.exports = {
productName: 'rubick', productName: 'rubick',
appId: 'com.muwoo.rubick', appId: 'com.muwoo.rubick',
compression: 'maximum', compression: 'maximum',
// afterPack: './release.js',
// afterAllArtifactBuild: () => {
// return ['./build/app.asar.gz'];
// },
directories: { directories: {
output: 'build', output: 'build',
}, },

103
yarn.lock
View File

@ -1007,23 +1007,6 @@
ajv "^6.12.0" ajv "^6.12.0"
ajv-keywords "^3.4.1" ajv-keywords "^3.4.1"
"@eggjs/yauzl@^2.11.0":
version "2.11.0"
resolved "https://registry.yarnpkg.com/@eggjs/yauzl/-/yauzl-2.11.0.tgz#b8e4413f50fc7c51451f770f152de4c1137aa99b"
integrity sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==
dependencies:
buffer-crc32 "~0.2.3"
fd-slicer2 "^1.2.0"
"@electron/asar@^3.2.8":
version "3.2.8"
resolved "https://registry.yarnpkg.com/@electron/asar/-/asar-3.2.8.tgz#2ea722f3452583dbd4ffdcc4b4f5dc903f1d8178"
integrity sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==
dependencies:
commander "^5.0.0"
glob "^7.1.6"
minimatch "^3.0.4"
"@electron/get@^2.0.0": "@electron/get@^2.0.0":
version "2.0.2" version "2.0.2"
resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e" resolved "https://registry.yarnpkg.com/@electron/get/-/get-2.0.2.tgz#ae2a967b22075e9c25aaf00d5941cd79c21efd7e"
@ -3205,14 +3188,6 @@ bindings@^1.5.0:
dependencies: dependencies:
file-uri-to-path "1.0.0" file-uri-to-path "1.0.0"
bl@^1.0.0:
version "1.2.3"
resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
bl@^4.1.0: bl@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
@ -4305,21 +4280,6 @@ compressible@~2.0.16:
dependencies: dependencies:
mime-db ">= 1.43.0 < 2" mime-db ">= 1.43.0 < 2"
compressing@^1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/compressing/-/compressing-1.10.0.tgz#bca0f734736b5bb05c3a176fef8d60d7f5f322da"
integrity sha512-k2vpbZLaJoHe9euyUZjYYE8vOrbR19aU3HcWIYw5EBXiUs34ygfDVnXU+ubI41JXMriHutnoiu0ZFdwCkH6jPA==
dependencies:
"@eggjs/yauzl" "^2.11.0"
flushwritable "^1.0.0"
get-ready "^1.0.0"
iconv-lite "^0.5.0"
mkdirp "^0.5.1"
pump "^3.0.0"
streamifier "^0.1.1"
tar-stream "^1.5.2"
yazl "^2.4.2"
compression@^1.7.4: compression@^1.7.4:
version "1.7.4" version "1.7.4"
resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
@ -6245,13 +6205,6 @@ faye-websocket@^0.11.3, faye-websocket@^0.11.4:
dependencies: dependencies:
websocket-driver ">=0.5.1" websocket-driver ">=0.5.1"
fd-slicer2@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fd-slicer2/-/fd-slicer2-1.2.0.tgz#a2c54a540639bbcd4702480821771341277ca20e"
integrity sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==
dependencies:
pend "^1.2.0"
fd-slicer@~1.1.0: fd-slicer@~1.1.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
@ -6434,11 +6387,6 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3" inherits "^2.0.3"
readable-stream "^2.3.6" readable-stream "^2.3.6"
flushwritable@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/flushwritable/-/flushwritable-1.0.0.tgz#3e328d8fde412ad47e738e3be750b4d290043498"
integrity sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==
follow-redirects@^1.0.0: follow-redirects@^1.0.0:
version "1.15.1" version "1.15.1"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
@ -6555,11 +6503,6 @@ from2@^2.1.0:
inherits "^2.0.1" inherits "^2.0.1"
readable-stream "^2.0.0" readable-stream "^2.0.0"
fs-constants@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
fs-extra@^10.0.0, fs-extra@^10.1.0: fs-extra@^10.0.0, fs-extra@^10.1.0:
version "10.1.0" version "10.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
@ -6754,11 +6697,6 @@ get-mac-apps@^1.0.2:
dependencies: dependencies:
plist "^3.0.1" plist "^3.0.1"
get-ready@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/get-ready/-/get-ready-1.0.0.tgz#f91817f1e9adecfea13a562adfc8de883ab34782"
integrity sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==
get-stdin@^6.0.0: get-stdin@^6.0.0:
version "6.0.0" version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
@ -7492,13 +7430,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.5:
dependencies: dependencies:
safer-buffer ">= 2.1.2 < 3" safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.5.0:
version "0.5.2"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.2.tgz#af6d628dccfb463b7364d97f715e4b74b8c8c2b8"
integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==
dependencies:
safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.6.2: iconv-lite@^0.6.2:
version "0.6.3" version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
@ -10545,7 +10476,7 @@ pbkdf2@^3.0.3:
safe-buffer "^5.0.1" safe-buffer "^5.0.1"
sha.js "^2.4.8" sha.js "^2.4.8"
pend@^1.2.0, pend@~1.2.0: pend@~1.2.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
@ -11574,7 +11505,7 @@ readable-stream@1.1.14, readable-stream@^1.0.27-1, readable-stream@~1.1.10:
isarray "0.0.1" isarray "0.0.1"
string_decoder "~0.10.x" string_decoder "~0.10.x"
readable-stream@^2.0.6, readable-stream@^2.3.0, readable-stream@^2.3.5: readable-stream@^2.0.6:
version "2.3.8" version "2.3.8"
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
@ -12771,11 +12702,6 @@ stream-shift@^1.0.0:
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
streamifier@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f"
integrity sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==
strict-uri-encode@^1.0.0: strict-uri-encode@^1.0.0:
version "1.1.0" version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@ -13024,19 +12950,6 @@ tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" resolved "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
dependencies:
bl "^1.0.0"
buffer-alloc "^1.2.0"
end-of-stream "^1.0.0"
fs-constants "^1.0.0"
readable-stream "^2.3.0"
to-buffer "^1.1.1"
xtend "^4.0.0"
tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: tar@^4.4.10, tar@^4.4.12, tar@^4.4.13:
version "4.4.19" version "4.4.19"
resolved "https://registry.npmmirror.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" resolved "https://registry.npmmirror.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3"
@ -13232,11 +13145,6 @@ to-arraybuffer@^1.0.0:
resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA== integrity sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==
to-buffer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
to-fast-properties@^2.0.0: to-fast-properties@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@ -14586,13 +14494,6 @@ yauzl@^2.10.0:
buffer-crc32 "~0.2.3" buffer-crc32 "~0.2.3"
fd-slicer "~1.1.0" fd-slicer "~1.1.0"
yazl@^2.4.2:
version "2.5.1"
resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
dependencies:
buffer-crc32 "~0.2.3"
yorkie@^2.0.0: yorkie@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9" resolved "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz#92411912d435214e12c51c2ae1093e54b6bb83d9"