Compare commits

..

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

15 changed files with 117 additions and 214 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-latest, windows-2019, ubuntu-latest]
# create steps # create steps
steps: steps:

View File

@ -1,22 +1,36 @@
English | [简体中文](./README.zh-CN.md) English | [简体中文](./README.zh-CN.md)
<div align= "center"> <div align= "center">
<img align="center" width=200 src="./public/logo.png" /> <img align="center" width=200 src="./public/logo.png" />
</div> </div>
<div align="center">
<h1>Rubick</h1> <div align= "center">
<img alt="downloads" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" /> <h1>Rubick</h1>
<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> <img alt="release" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<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/releases">
<a href="https://github.com/rubickCenter/rubick/stargazers"><img alt="github stars" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social" /></a> <img alt="release" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" />
<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> </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> </div>
<div align= "center"> <div align= "center">
<img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.png" /> <img align="center" src="https://picx.zhimg.com/80/v2-f8fe09ef125dac5fdcbef3fe00f92b21_720w.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. 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 ## Get Rubick
@ -90,13 +104,6 @@ If the project is helpful to you, you can buy me a cup of coffee as a reward!
<img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png"> <img width="180" src="https://picx.zhimg.com/80/v2-3160247d6099053405e6cd2cb6afb5e5_720w.png">
</div> </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 ## 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. 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.

View File

@ -5,14 +5,25 @@
<img align="center" width=200 src="./public/logo.png" /> <img align="center" width=200 src="./public/logo.png" />
</div> </div>
<div align="center"> <div align= "center">
<h1>Rubick</h1> <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> <img alt="release" src="https://img.shields.io/github/downloads/rubickCenter/rubick/total" />
<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/releases">
<a href="https://github.com/rubickCenter/rubick/blob/master/LICENSE"><img alt="许可证" src="https://img.shields.io/github/license/rubickCenter/rubick" /></a> <img alt="release" src="https://img.shields.io/github/package-json/v/rubickCenter/rubick" />
<a href="https://github.com/rubickCenter/rubick/stargazers"><img alt="github 收藏数" src="https://img.shields.io/github/stars/rubickCenter/rubick?style=social" /></a> </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> <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> </div>
<div align= "center"> <div align= "center">

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

@ -274,16 +274,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']);
@ -318,60 +314,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

@ -1,6 +1,6 @@
{ {
"name": "rubick", "name": "rubick",
"version": "4.3.5", "version": "4.2.5",
"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",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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

@ -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 = `${this.registry}${name}`;
// 从npm源中获取依赖包的最新版本 // 从npm源中获取依赖包的最新版本
try { try {
@ -157,43 +158,32 @@ 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);
let output = '';
npm.stdout
.on('data', (data: string) => {
output += data; // 获取输出日志
})
.pipe(process.stdout);
npm.stderr
.on('data', (data: string) => {
output += data; // 获取报错日志
})
.pipe(process.stderr);
npm.on('close', (code: number) => {
if (!code) {
resolve({ code: 0, data: output }); // 如果没有报错就输出正常日志
} else {
reject({ code: code, data: output }); // 如果报错就输出报错日志
}
}); });
}); });
} }

View File

@ -25,7 +25,7 @@ export default () => {
height: WINDOW_HEIGHT, height: WINDOW_HEIGHT,
minHeight: WINDOW_MIN_HEIGHT, minHeight: WINDOW_MIN_HEIGHT,
useContentSize: true, useContentSize: true,
resizable: true, resizable: false,
width: WINDOW_WIDTH, width: WINDOW_WIDTH,
frame: false, frame: false,
title: '拉比克', title: '拉比克',

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

@ -1,13 +1,8 @@
<template> <template>
<div v-show="!currentPlugin.name" class="options"> <div v-show="!currentPlugin.name && config.perf.common.history" 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

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);