This commit is contained in:
sunyuqiang 2023-10-12 16:37:14 +08:00
commit e8d947f18a
124 changed files with 3264 additions and 34594 deletions

View File

@ -23,7 +23,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [macos-latest, windows-2019, ubuntu-latest]
os: [macos-11, windows-2019, ubuntu-latest]
# create steps
steps:

View File

@ -27,7 +27,7 @@ English | [简体中文](./README.zh-CN.md)
</a>
</div>
Based on electron open source toolbox, free integration of rich plug-ins, to create the ultimate desktop efficiency tool。Rubick is one of the heroes of Dota The core skill is the ability to use other heroes as plug-insFinished the walk 。Very consistent with the design concept of this toolSo named Rubick。
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 等等官方服务。
@ -43,14 +43,12 @@ Based on electron open source toolbox, free integration of rich plug-ins, to cre
## Feature list
- [x] Plug-in management based on npm package mode, installing plugins is as easy as installing npm packages.
- [x] Support system plug-ins, as long as rubick is running, plug-ins can be used at any time.
- [x] Support global shortcut key settings
- [x] Support clipboard file search
- [x] Support searching for locally installed apps or preferences
- [x] Support MacOS
- [x] Support Windows
- [x] Support Linux
- [x] Plugin management based on the npm package pattern, installing plugins is as simple as installing npm packages.
- [x] Supports WebDAV for multi-device data synchronization, ensuring true data security synchronization.
- [x] A unique system plugin mode that allows plugins to become an integral part of Rubick.
- [x] Supports the quick launch of local apps, files, and folders.
- [x] Supports enterprise-level intranet deployment.
- [x] Supports multiple languages.
## Docs
@ -59,18 +57,18 @@ Based on electron open source toolbox, free integration of rich plug-ins, to cre
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## Core function
## Core functionality showcase.
### 1. Search system application
Support pinyin and abbreviations to search system applications
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba363e8f60f540e6a5c365c4317c4413~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-70c105ff7fb1e955fc67ffa5a5564092_720w.gif)
### 2. UI plug-in installation
Click the `rubick` icon on the right side of the search box to enter the plug-in market, select the desired plug-in, and click the download button to download. After the download is complete, you can find the installed plug-in under the Installed tab
After the installation is complete, enter the plug-in call up command to use the corresponding plug-in
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7ae45c7ede1f4e3bb7d35ae845e60b64~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-5906bba20fe0a67f9e7a5a8c11341305_720w.gif)
### 3. System plug-in installation
The system plug-in installation method is the same as that of the UI category. In the plug-in market, select the `system category` and find the system plug-in that suits you to install it.
@ -78,10 +76,10 @@ The system plug-in installation method is the same as that of the UI category. I
After the system plug-in is installed successfully, rubick needs to be restarted to take effect
```
### 4. The input box focus automatically matches the plug-in according to the clipboard content
Search for `Preferences` in `rubick`, and then turn on the `Auto Paste` function to match the clipboard content and automatically match the plug-in for use.
### 4. Multi-device data synchronization based on WebDAV.
In "Rubick," search for "Preferences," go to "Account and Settings," and then select "Multi-Device Data Synchronization." You can export and import data for the use of Rubick plugins.
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01ef50fbfa064ba9a88bebe1531eacd4~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
### More features
If you need more features, please come here to give us suggestions[issues](https://github.com/rubickCenter/rubick/issues) 。

View File

@ -44,13 +44,11 @@
## 支持能力
- [x] 基于 npm 包模式的插件管理,安装插件和安装 npm 包一样简单
- [x] 支持系统插件,只要在 rubick 运行时,插件可以随时使用
- [x] 支持全局快捷键设置
- [x] 支持剪贴板文件搜索
- [x] 支持搜索本地已安装 app 或 偏好设置
- [x] 支持 MacOS
- [x] 支持 Windows
- [x] 支持 Linux
- [x] 支持 webdav 多端数据同步,真正的数据安全同步
- [x] 独一无二的系统插件模式,让插件成为 rubick 的一部分
- [x] 支持快速启动本地 app、文件、文件夹
- [x] 支持企业化内网部署
- [x] 支持多语言
## 使用文档
@ -59,17 +57,17 @@
[Rubick Docs](https://rubickCenter.github.io/rubick/)
## 目前支持能力
## 核心功能展示
### 1. 搜索系统应用
支持拼音和缩写来搜索系统安装应用:
![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba363e8f60f540e6a5c365c4317c4413~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-70c105ff7fb1e955fc67ffa5a5564092_720w.gif)
### 2. UI类插件安装
点击搜索框右侧 `rubick` 图标,进入插件市场,选择所需插件,点击下载按钮即可下载,下载完成后在已安装 tab 下可以找到安装插件。
安装完成后,输入插件呼起命令即可使用对应插件:
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/7ae45c7ede1f4e3bb7d35ae845e60b64~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-5906bba20fe0a67f9e7a5a8c11341305_720w.gif)
### 3. 系统类插件安装
系统插件安装方式和UI类一样在插件市场选择`系统分类`,寻找适合自己的系统插件安装即可。
@ -78,10 +76,10 @@
系统插件安装成功后,需要重启 rubick 才能生效
```
### 4. 输入框聚焦自动根据剪切板内容匹配插件
`rubick` 内搜索`偏好设置`,然后开启`自动粘贴` 功能,即可匹配剪切板内容自动匹配适合插件进行使用
### 4. 基于 webdav 的多端数据同步
`rubick` 内搜索`偏好设置` 进入 `账户和设置` -> `多端数据同步`;即可对 `rubick` 插件使用数据进行 `导出``导入`
![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01ef50fbfa064ba9a88bebe1531eacd4~tplv-k3u1fbpfcp-watermark.image)
![](https://pic1.zhimg.com/80/v2-ff85793741e4dff82a729d3eb3d41551_720w.png)
### 更多功能
如果您还需要更多功能,欢迎来这里给我们提建议:[issues](https://github.com/rubickCenter/rubick/issues) 。

View File

@ -1,5 +1,5 @@
<template>
<div :class="[platform, 'detach']">
<div :class="[process.platform, 'detach']">
<div class="info">
<img :src="plugInfo.logo"/>
<input
@ -15,7 +15,7 @@
<div class="handle">
<div class="devtool" @click="openDevTool" title="开发者工具"></div>
</div>
<div class="window-handle" v-if="platform !== 'darwin'">
<div class="window-handle" v-if="process.platform !== 'darwin'">
<div class="minimize" @click="minimize"></div>
<div class="maximize" @click="maximize"></div>
<div class="close" @click="close"></div>
@ -30,7 +30,7 @@ import { ref } from 'vue';
const { ipcRenderer } = window.require('electron');
const platform = ref(window.process.platform);
const process = window.require('process');
const showInput = ref(false);
const storeInfo = localStorage.getItem('rubick-system-detach') || '{}';

View File

@ -1,3 +1,22 @@
module.exports = {
presets: ["@vue/cli-plugin-babel/preset"],
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
[
'import',
{
libraryName: 'ant-design-vue',
style: 'css', // or 'css'
},
'ant-design-vue',
],
[
'import',
{
libraryName: '@ant-design/icons-vue',
libraryDirectory: 'lib/icons',
camel2DashComponentName: false,
},
'@ant-design/icons-vue',
],
],
};

13020
feature/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -12,15 +12,19 @@
"@vue/cli-service": "~4.5.0",
"ant-design-vue": "3.2.14",
"axios": "^0.24.0",
"babel-plugin-import": "^1.13.8",
"core-js": "^3.6.5",
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
"markdown-it": "^12.2.0",
"nanoid": "^4.0.2",
"vue": "3.2.45",
"vue-i18n": "^9.2.2",
"vue-i18n": "9.2.2",
"vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0"
"vue3-carousel": "^0.3.1",
"vue3-lottie": "^3.1.0",
"vuex": "^4.0.0-0",
"webpack-bundle-analyzer": "^4.9.1"
},
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^4.18.0",

View File

@ -9,7 +9,7 @@
"pluginType": "ui",
"features": [
{
"code": "market",
"code": "finder",
"explain": "插件市场",
"cmds":[
"插件市场"

View File

@ -36,4 +36,11 @@ window.market = {
removeLocalStartPlugin(plugin) {
ipcSend('removeLocalStartPlugin', { plugin });
},
dbDump(target) {
ipcSend('dbDump', { target });
},
dbImport(target) {
ipcSend('dbImport', { target });
},
};

View File

@ -1,91 +1,228 @@
<template>
<div class="main-container">
<div class="slider-bar">
<div class="left-menu">
<a-menu
v-model:selectedKeys="active"
mode="horizontal"
@select="({ key }) => changeMenu(key)"
:selectedKeys="active"
mode="vertical"
>
<a-menu-item key="market">
<a-menu-item key="finder">
<template #icon>
<AppstoreOutlined />
<StarOutlined style="font-size: 18px;" />
</template>
{{ $t('feature.market.title') }}
{{ $t('feature.market.explore') }}
</a-menu-item>
<a-menu-item key="installed">
<a-menu-item key="worker">
<template #icon>
<HeartOutlined />
<SendOutlined style="transform: rotate(-45deg); font-size: 18px;" />
</template>
{{ $t('feature.installed.title') }}
{{ $t('feature.market.efficiency') }}
</a-menu-item>
<a-menu-item key="settings">
<a-menu-item key="tools">
<template #icon>
<SettingOutlined />
<SearchOutlined style="font-size: 18px;" />
</template>
{{ $t('feature.settings.title') }}
{{ $t('feature.market.searchTool') }}
</a-menu-item>
<a-menu-item key="dev">
<a-menu-item key="image">
<template #icon>
<BugOutlined />
<FileImageOutlined style="font-size: 18px;" />
</template>
{{ $t('feature.dev.title') }}
{{ $t('feature.market.imageTool') }}
</a-menu-item>
<a-menu-item key="devPlugin">
<template #icon>
<CodeOutlined style="font-size: 18px;" />
</template>
{{ $t('feature.market.developTool') }}
</a-menu-item>
<a-menu-item key="system">
<template #icon>
<DatabaseOutlined style="font-size: 18px;" />
</template>
{{ $t('feature.market.systemTool') }}
</a-menu-item>
<a-sub-menu class="user-info">
<template #icon>
<a-avatar :size="32">
<template #icon>
<img :src="perf.custom.logo" />
</template>
</a-avatar>
</template>
<template #title>{{ perf.custom.username }}</template>
<a-menu-item key="settings">
<template #icon>
<SettingOutlined />
</template>
{{ $t('feature.settings.title') }}
</a-menu-item>
<a-menu-item key="installed">
<template #icon>
<HeartOutlined />
</template>
{{ $t('feature.installed.title') }}
</a-menu-item>
<a-menu-item key="dev">
<template #icon>
<BugOutlined />
</template>
{{ $t('feature.dev.title') }}
</a-menu-item>
</a-sub-menu>
</a-menu>
</div>
<router-view />
<div :class="['finder', 'result', 'devPlugin', 'image', 'tools', 'worker', 'system'].includes(active[0]) ? 'container' : 'more'">
<keep-alive>
<router-view />
</keep-alive>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import { computed } from 'vue';
import { useRouter } from 'vue-router';
import {
HeartOutlined,
AppstoreOutlined,
StarOutlined,
SendOutlined,
SearchOutlined,
FileImageOutlined,
DatabaseOutlined,
CodeOutlined,
SettingOutlined,
HeartOutlined,
BugOutlined,
} from '@ant-design/icons-vue';
import { useStore } from 'vuex';
import localConfig from '@/confOp';
const store = useStore();
const router = useRouter();
const active = ref(['market']);
const active = computed(() => store.state.active);
const { perf } = localConfig.getConfig();
const changeMenu = (key: any) => {
store.commit('commonUpdate', {active: [key]})
router.push(key);
};
window.rubick.onPluginEnter(({ code }: { code: string }) => {
changeMenu(code);
active.value = [code];
store.commit('commonUpdate', {active: [code]})
});
const store = useStore();
window.rubick.setSubInput((e: any) => {
if (
[
'finder',
'result',
'devPlugin',
'image',
'tools',
'worker',
'system',
].includes(active.value[0])
) {
if (e.text) {
store.commit('setSearchValue', e.text);
router.push('result');
} else {
store.commit('commonUpdate', {active: ['finder']})
router.push('finder');
}
}
}, '搜索插件');
const init = () => store.dispatch('init');
init();
</script>
<style lang="less" scoped>
* {
margin: 0;
padding: 0;
}
.main-container {
-webkit-app-region: no-drag;
display: flex;
align-items: flex-start;
background: var(--color-body-bg);
flex-direction: column;
.slider-bar {
width: 100%;
.ant-menu {
background: var(--color-body-bg);
border-color: var(--color-border-light);
:deep(.ant-menu-item) {
&:not(.ant-menu-item-selected) {
color: var(--color-text-primary);
}
<style lang="less">
.ant-menu-submenu-popup {
.ant-menu {
background: var(--color-body-bg2) !important;
height: 100%;
border-right: none;
.ant-menu-item, .ant-menu-submenu, .ant-menu-submenu-arrow {
color: var(--color-text-content);
&:active {
background: none;
}
}
.ant-menu-item-selected, .ant-menu-submenu-selected {
background-color: var(--color-list-hover);
color: var(--ant-primary-color);
.ant-menu-submenu-arrow {
color: var(--ant-primary-color);
}
&:after {
display: none;
}
}
}
}
</style>
<style lang="less" scoped>
@import '~@/assets/common.less';
* {
margin: 0;
padding: 0;
}
.main-container {
-webkit-app-region: no-drag;
display: flex;
background: var(--color-body-bg);
border-top: 1px solid var(--color-border-light);
height: 100vh;
box-sizing: border-box;
align-items: flex-start;
width: 100%;
overflow: hidden;
background: var(--color-menu-bg);
.search {
:deep(.ant-btn),
:deep(.ant-input),
:deep(.ant-input-group-addon) {
color: var(--ant-primary-color) !important;
background: var(--color-input-hover);
border-color: var(--color-border-light);
}
}
.container,
.more {
background: var(--color-body-bg);
width: calc(~'100% - 183px');
height: 100%;
box-sizing: border-box;
padding: 16px;
position: relative;
overflow: auto;
}
.more {
background: var(--color-body-bg2);
}
.left-menu {
padding: 24px 16px;
position: relative;
height: 100vh;
:deep(.ant-menu-item) {
padding-left: 12px !important;
display: flex;
align-items: center;
}
:deep(.ant-menu-item-selected),
:deep(.ant-menu-submenu-selected) {
background-color: var(--color-list-hover);
border-radius: 6px;
color: var(--ant-primary-color);
}
:deep(.user-info) {
position: absolute;
bottom: 32px;
}
:deep(.ant-avatar) {
background: transparent;
}
}
}
</style>

View File

@ -8,9 +8,10 @@
--color-text-content: #141414;
--color-text-desc: rgba(0, 0, 0, 0.45);
// 背景色
--color-body-bg2: #eee;
--color-body-bg: #fff;
--color-menu-bg: #f3efef;
--color-list-hover: #e2e2e2;
--color-menu-bg: rgba(248, 248, 248, 1);
--color-list-hover: rgba(233, 233, 233, 1);
--color-input-hover: #fff;
// 边框
--color-border-light: #f0f0f0;
@ -22,9 +23,10 @@
--color-text-desc: #8f8fa6;
// 背景色
--color-body-bg: #1c1c28;
--color-body-bg2: #2c2f3b;
--color-menu-bg: #1c1c28;
--color-list-hover: #33333d;
--color-input-hover: #33333d;
--color-list-hover: #2c2f3b;
--color-input-hover: #444d;
// 边框
--color-border-light: #33333d;
--color-border-light: #444d;
}

View File

@ -1,5 +1,5 @@
.left-menu {
width: 200px;
width: 183px;
// height: 100vh;
border-right: 1px solid var(--color-border-light);
.search-container {
@ -20,15 +20,18 @@
background: var(--color-menu-bg);
height: 100%;
border-right: none;
.ant-menu-item {
.ant-menu-item, .ant-menu-submenu, .ant-menu-submenu-arrow {
color: var(--color-text-content);
&:active {
background: none;
}
}
.ant-menu-item-selected {
.ant-menu-item-selected, .ant-menu-submenu-selected {
background-color: var(--color-list-hover);
color: var(--color-text-primary);
color: var(--ant-primary-color);
.ant-menu-submenu-arrow {
color: var(--ant-primary-color);
}
&:after {
display: none;
}

View File

@ -0,0 +1,35 @@
export const SPRING = {
theme: 'SPRING',
primaryColor: '#ff4ea4',
errorColor: '#ed6d46',
warningColor: '#e5a84b',
successColor: '#c0d695',
infoColor: '#aa8eeB',
};
export const SUMMER = {
theme: 'SUMMER',
primaryColor: '#6078ea',
errorColor: '#ed6d46',
warningColor: '#e5a84b',
successColor: '#c0d695',
infoColor: '#aa8eeB',
};
export const AUTUMN = {
theme: 'AUTUMN',
primaryColor: '#f55555',
errorColor: '#ed6d46',
warningColor: '#e5a84b',
successColor: '#c0d695',
infoColor: '#aa8eeB',
};
export const WINTER = {
theme: 'WINTER',
primaryColor: '#00b294',
errorColor: '#e94829',
warningColor: '#ed6d3d',
successColor: '#c3d94e',
infoColor: '#bfa782',
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -12,6 +12,7 @@ try {
}
const instance = axios.create({
timeout: 4000,
baseURL:
baseURL || 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master',
});
@ -61,7 +62,7 @@ export default {
},
async getPluginDetail(url: string) {
const res = await axios.get(url);
const res = await instance.get(url);
return res.data;
},

View File

@ -12,8 +12,9 @@ export default {
developTool: 'Develop Tools',
systemTool: 'System Tools',
finder: {
must: 'Necessary',
recommended: 'Recommended',
lastUpdated: 'Last Updated',
lastUpdated: 'Total',
},
install: 'Install',
},
@ -37,17 +38,17 @@ export default {
tips1: 'rubick',
tips2:
'After the software preferences are set, please restart the software. Please go to the mini program set avatar and nickname.',
themeColor: 'Theme Color',
primaryColor: 'Primary Color',
errorColor: 'Error Color',
warningColor: 'Warning Color',
successColor: 'Success Color',
infoColor: 'Info Color',
themeColor: 'Theme Setting',
spring: 'Spring',
summer: 'Summer',
autumn: 'Autumn',
winter: 'Winter',
personalized: 'Personalized',
greeting: 'Search Box Greeting',
logo: 'Logo',
logo: 'Avatar',
replace: 'Repalce Logo',
reset: 'Reset Default',
name: 'User Name',
},
basic: {
title: 'Basic',
@ -99,6 +100,9 @@ export default {
localstart: {
title: 'Local Start',
},
database: {
title: 'Data Synchronization',
},
},
dev: {
title: 'Developer',

View File

@ -12,8 +12,9 @@ export default {
developTool: '开发者',
systemTool: '系统',
finder: {
must: '必备',
recommended: '推荐',
lastUpdated: '最近更新',
lastUpdated: '全部',
},
install: '安装',
},
@ -35,17 +36,17 @@ export default {
accountInfo: '账户信息',
tips1: 'rubick 用户',
tips2: '软件偏好设置完成后需重启软件,头像和昵称请前往小程序设置',
themeColor: '主题色设置',
primaryColor: '主色调',
errorColor: '错误色',
warningColor: '警告色',
successColor: '成功色',
infoColor: '提醒色',
personalized: '用户个性化设置',
greeting: '主搜索框欢迎语',
logo: '界面 logo',
replace: '点我替换',
themeColor: '主题设置',
spring: '立春',
summer: '立夏',
autumn: '立秋',
winter: '立冬',
personalized: '用户设置',
greeting: '搜索框欢迎语',
logo: '头像',
replace: '替换',
reset: '恢复默认设置',
name: '用户名',
},
basic: {
title: '基本设置',
@ -97,6 +98,9 @@ export default {
localstart: {
title: '本地启动',
},
database: {
title: '多端数据同步',
},
},
dev: {
title: '开发者',

View File

@ -1,5 +1,28 @@
import { createApp } from 'vue';
import Antd, { ConfigProvider } from 'ant-design-vue';
import Vue3Lottie from 'vue3-lottie';
import {
ConfigProvider,
Button,
Divider,
Row,
Col,
Dropdown,
Menu,
Form,
Input,
Radio,
Select,
Switch,
Avatar,
Collapse,
List,
Tooltip,
Alert,
Drawer,
Modal,
Result,
Spin,
} from 'ant-design-vue';
import App from './App.vue';
import router from './router';
import store from './store';
@ -14,4 +37,36 @@ ConfigProvider.config({
theme: config.perf.custom || {},
});
createApp(App).use(registerI18n).use(store).use(Antd).use(router).mount('#app');
window.rubick.changeTheme = () => {
const config: any = localConfig.getConfig();
ConfigProvider.config({
theme: config.perf.custom || {},
});
};
createApp(App)
.use(registerI18n)
.use(store)
.use(Button)
.use(Divider)
.use(Row)
.use(Col)
.use(Dropdown)
.use(Menu)
.use(Form)
.use(Input)
.use(Radio)
.use(Select)
.use(Switch)
.use(Avatar)
.use(Collapse)
.use(List)
.use(Tooltip)
.use(Alert)
.use(Drawer)
.use(Modal)
.use(Result)
.use(Spin)
.use(router)
.use(Vue3Lottie)
.mount('#app');

View File

@ -1,40 +1,65 @@
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';
import Market from '../views/market/index.vue';
import Installed from '../views/installed/index.vue';
import Account from '../views/account/index.vue';
import Settings from '../views/settings/user.vue';
import Dev from '../views/dev/index.vue';
const routes: Array<RouteRecordRaw> = [
{
path: '/market',
name: 'market',
component: Market,
path: '/result',
name: 'result',
component: () => import('../views/market/components/result.vue'),
},
{
path: '/devPlugin',
name: 'devPlugin',
component: () => import('../views/market/components/devlopment.vue'),
},
{
path: '/image',
name: 'image',
component: () => import('../views/market/components/image.vue'),
},
{
path: '/tools',
name: 'tools',
component: () => import('../views/market/components/tools.vue'),
},
{
path: '/worker',
name: 'worker',
component: () => import('../views/market/components/worker.vue'),
},
{
path: '/system',
name: 'system',
component: () => import('../views/market/components/system.vue'),
},
{
path: '/finder',
name: 'finder',
component: () => import('../views/market/components/finder.vue'),
},
{
path: '/installed',
name: 'installed',
component: Installed,
component: () => import('../views/installed/index.vue'),
},
{
path: '/account',
name: 'account',
component: Account,
component: () => import('../views/account/index.vue'),
},
{
path: '/settings',
name: 'settings',
component: Settings,
component: () => import('../views/settings/user.vue'),
},
{
path: '/dev',
name: 'dev',
component: Dev,
component: () => import('../views/dev/index.vue'),
},
{
path: '/:catchAll(.*)',
name: 'market',
component: Market,
name: 'finder',
component: () => import('../views/market/components/finder.vue'),
},
];

View File

@ -17,6 +17,7 @@ export default createStore({
totalPlugins: [],
localPlugins: [],
searchValue: '',
active: ['finder'],
},
mutations: {
commonUpdate(state: any, payload) {

View File

@ -1,30 +1,33 @@
<template>
<div class="dev">
<a-alert
style="margin-bottom: 40px"
:message="$t('feature.dev.tips')"
type="warning"
/>
<a-form
ref="formRef"
:model="formState"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<a-form-item :label="$t('feature.dev.pluginName')" name="name">
<a-input v-model:value="formState.name" />
</a-form-item>
<a-form-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button :loading="loading" type="primary" @click="onSubmit">
{{ $t('feature.dev.install') }}
</a-button>
<a-button @click="refresh" style="margin-left: 10px">
{{ $t('feature.dev.refreshPlugins') }}
</a-button>
</a-form-item>
</a-form>
<div class="view-title">{{ $t('feature.dev.title') }}</div>
<div class="view-container">
<a-alert
style="margin-bottom: 40px"
:message="$t('feature.dev.tips')"
type="warning"
/>
<a-form
ref="formRef"
:model="formState"
:rules="rules"
:label-col="labelCol"
:wrapper-col="wrapperCol"
>
<a-form-item :label="$t('feature.dev.pluginName')" name="name">
<a-input v-model:value="formState.name" />
</a-form-item>
<a-form-item :wrapper-col="{ span: 14, offset: 4 }">
<a-button :loading="loading" type="primary" @click="onSubmit">
{{ $t('feature.dev.install') }}
</a-button>
<a-button @click="refresh" style="margin-left: 10px">
{{ $t('feature.dev.refreshPlugins') }}
</a-button>
</a-form-item>
</a-form>
</div>
</div>
</template>
@ -81,9 +84,21 @@ const wrapperCol = { span: 14 };
box-sizing: border-box;
width: 100%;
overflow-x: hidden;
background: var(--color-body-bg);
height: calc(~'100vh - 46px');
padding: 20px;
height: calc(~'100vh - 34px');
.view-title {
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
color: var(--color-text-primary);
}
.view-container {
padding: 10px;
box-sizing: border-box;
border-radius: 8px;
background: var(--color-body-bg);
overflow: auto;
height: calc(~'100vh - 84px');
}
:deep(label) {
color: var(--color-text-content);
}

View File

@ -1,111 +1,106 @@
<template>
<div class="installed">
<div v-if="!localPlugins.length">
<a-result
status="404"
:title="$t('feature.installed.tips1')"
:sub-title="$t('feature.installed.tips2')"
/>
</div>
<div class="container" v-else>
<div class="installed-list">
<div
:class="currentSelect[0] === index ? 'item active' : 'item'"
:key="index"
@click="currentSelect = [index]"
v-for="(plugin, index) in localPlugins"
<div class="view-title">{{ $t('feature.installed.title') }}</div>
<div class="view-container">
<div v-if="!localPlugins.length">
<a-result
class="error-content"
sub-title="哎呀,暂时还没有安装任何插件!"
>
<img :src="plugin.logo" />
<div class="info">
<div class="title">
{{ plugin.pluginName }}
<span class="desc">v{{ plugin.version }}</span>
</div>
<div class="desc">{{ plugin.description }}</div>
</div>
</div>
<template #icon>
<Vue3Lottie :animationData="emptyJson" :height="240" :width="240" />
</template>
<template #extra>
<a-button @click="gotoFinder" key="console" type="primary">去插件市场看看吧</a-button>
</template>
</a-result>
</div>
<div class="plugin-detail">
<div class="plugin-top">
<div class="left">
<div class="title">
{{ pluginDetail.pluginName }}
<a-tag>{{ pluginDetail.version }}</a-tag>
<div class="container" v-else>
<div class="installed-list">
<div
:class="currentSelect[0] === plugin.name ? 'item active' : 'item'"
:key="index"
@click="currentSelect = [plugin.name]"
v-for="(plugin, index) in localPlugins"
>
<img :src="plugin.logo" />
<div class="info">
<div class="title">
{{ plugin.pluginName }}
</div>
<div class="desc">{{ plugin.description }}</div>
</div>
<div class="desc">
{{ $t('feature.installed.developer') }}{{
`${pluginDetail.author || $t('feature.installed.unknown')}`
}}
</div>
<div class="desc">
{{ pluginDetail.description }}
</div>
</div>
<div class="right">
<a-button
type="danger"
size="small"
shape="round"
:loading="pluginDetail.isloading"
@click="deletePlugin(pluginDetail)"
>
{{ $t('feature.installed.remove') }}
</a-button>
</div>
</div>
<a-tabs default-active-key="1">
<a-tab-pane key="1" :tab="$t('feature.installed.functionKey')">
<div class="feature-container">
<div
class="desc-item"
:key="index"
v-for="(item, index) in pluginDetail.features"
>
<div>{{ item.explain }}</div>
<a-tag
:key="cmd"
v-for="cmd in item.cmds"
:class="{ executable: !cmd.label }"
>
<span
@click="
!cmd.label &&
openPlugin({
code: item.code,
cmd,
})
"
>
{{ cmd.label || cmd }}
</span>
<template v-if="!cmd.label" #icon>
<a-tooltip
v-if="!hasAdded(cmd)"
placement="topLeft"
:title="$t('feature.installed.addToPanel')"
>
<PlusCircleOutlined
@click="addCmdToSuperPanel({ code: item.code, cmd })"
/>
</a-tooltip>
<a-tooltip
v-else
placement="topLeft"
:title="$t('feature.installed.removeFromPanel')"
>
<MinusCircleOutlined
@click="removePluginToSuperPanel({ cmd })"
/>
</a-tooltip>
</template>
</a-tag>
<div class="plugin-detail">
<div class="plugin-top">
<div class="left">
<div class="title">
{{ pluginDetail.pluginName }}
<a-tag>{{ pluginDetail.version }}</a-tag>
</div>
<div class="desc">
{{ $t('feature.installed.developer') }}{{
`${pluginDetail.author || $t('feature.installed.unknown')}`
}}
</div>
<div class="desc">
{{ pluginDetail.description }}
</div>
</div>
</a-tab-pane>
<a-tab-pane key="2" :tab="$t('feature.installed.detailInfo')">
<div class="detail-container" v-html="readme"></div>
</a-tab-pane>
</a-tabs>
<div class="right">
<a-button
type="primary"
size="small"
shape="round"
:loading="pluginDetail.isloading"
@click="deletePlugin(pluginDetail)"
>
{{ $t('feature.installed.remove') }}
</a-button>
</div>
</div>
<div class="feature-container">
<template
:key="index"
v-for="(item, index) in pluginDetail.features"
>
<div
class="desc-item"
v-if="item.cmds.filter(cmd => !cmd.label).length > 0"
>
<div>{{ item.explain }}</div>
<template :key="cmd" v-for="cmd in item.cmds">
<a-dropdown
v-if="!cmd.label"
:class="{ executable: !cmd.label }"
>
<template #overlay>
<a-menu @click="({key}) => handleMenuClick(key, item, cmd)">
<a-menu-item key="open">
<CaretRightOutlined />
运行
</a-menu-item>
<a-menu-item v-if="!hasAdded(cmd)" key="add">
<PushpinOutlined />
固定到超级面板
</a-menu-item>
<a-menu-item v-else key="remove">
<PushpinFilled />
从超级面板中取消固定
</a-menu-item>
</a-menu>
</template>
<a-button size="small" class="keyword-tag">
{{ cmd.label || cmd }}
<DownOutlined />
</a-button>
</a-dropdown>
</template>
</div>
</template>
</div>
</div>
</div>
</div>
</div>
@ -113,22 +108,31 @@
<script setup>
import { useStore } from 'vuex';
import { computed, ref, toRaw } from 'vue';
import { computed, ref, toRaw, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import path from 'path';
import MarkdownIt from 'markdown-it';
import { PlusCircleOutlined, MinusCircleOutlined } from '@ant-design/icons-vue';
import {
PushpinOutlined,
PushpinFilled,
CaretRightOutlined,
DownOutlined,
} from '@ant-design/icons-vue';
import { message } from 'ant-design-vue';
import emptyJson from '@/assets/lottie/empty.json';
const { ipcRenderer } = window.require('electron');
const remote = window.require('@electron/remote');
const fs = window.require('fs');
const md = new MarkdownIt();
const appPath = remote.app.getPath('userData');
const baseDir = path.join(appPath, './rubick-plugins');
const store = useStore();
const route = useRoute();
const router = useRouter();
const localPlugins = computed(() =>
store.state.localPlugins.filter(
(plugin) => plugin.name !== 'rubick-system-feature'
@ -138,10 +142,16 @@ const updateLocalPlugin = () => store.dispatch('updateLocalPlugin');
const startUnDownload = (name) => store.dispatch('startUnDownload', name);
const errorUnDownload = (name) => store.dispatch('errorUnDownload', name);
const currentSelect = ref([0]);
const currentSelect = ref([route.query.plugin || localPlugins?.value[0]?.name]);
watch(localPlugins, () => {
currentSelect.value = [localPlugins?.value[0]?.name];
});
const pluginDetail = computed(() => {
return localPlugins.value[currentSelect.value] || {};
return (
localPlugins.value.find((v) => v.name === currentSelect.value[0]) || {}
);
});
const superPanelPlugins = ref(
@ -151,6 +161,19 @@ const superPanelPlugins = ref(
}
);
const handleMenuClick = (key, item, cmd) => {
if(key === 'open') {
openPlugin({
code: item.code,
cmd,
});
} else if (key === 'add') {
addCmdToSuperPanel({cmd, code: item.code});
} else {
removePluginToSuperPanel({cmd, name: item.name})
}
};
const addCmdToSuperPanel = ({ cmd, code }) => {
const plugin = {
...toRaw(pluginDetail.value),
@ -203,21 +226,6 @@ const openPlugin = ({ cmd, code }) => {
);
};
const readme = computed(() => {
if (!pluginDetail.value.name) return '';
const readmePath = path.resolve(
baseDir,
'node_modules',
pluginDetail.value.name,
'README.md'
);
if (fs.existsSync(readmePath)) {
const str = fs.readFileSync(readmePath, 'utf-8');
return md.render(str);
}
return '';
});
const deletePlugin = async (plugin) => {
startUnDownload(plugin.name);
const timer = setTimeout(() => {
@ -230,7 +238,10 @@ const deletePlugin = async (plugin) => {
clearTimeout(timer);
};
const gotoFinder = () => {
router.push('/finder');
store.commit('commonUpdate', { active: ['finder'] });
};
</script>
<style lang="less" scoped>
@ -238,14 +249,29 @@ const deletePlugin = async (plugin) => {
box-sizing: border-box;
width: 100%;
overflow: hidden;
background: var(--color-body-bg);
height: calc(~'100vh - 46px');
height: calc(~'100vh - 34px');
.view-title {
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
color: var(--color-text-primary);
}
.view-container {
border-radius: 8px;
background: var(--color-body-bg);
overflow: auto;
height: calc(~'100vh - 84px');
}
:deep(.ant-result-title) {
color: var(--color-text-primary);
}
:deep(.ant-result-subtitle) {
color: var(--color-text-desc);
}
.keyword-tag {
font-size: 13px;
margin: 4px;
}
.container {
box-sizing: border-box;
@ -257,7 +283,7 @@ const deletePlugin = async (plugin) => {
}
.installed-list {
width: 40%;
width: 38%;
background: var(--color-body-bg);
height: 100%;
padding: 10px 0;
@ -269,17 +295,29 @@ const deletePlugin = async (plugin) => {
display: flex;
align-items: center;
color: var(--color-text-content);
border-bottom: 1px dashed var(--color-border-light);
cursor: pointer;
&:last-child {
border-bottom: none;
}
img {
width: 40px;
height: 40px;
margin-right: 20px;
width: 34px;
height: 34px;
margin-right: 12px;
}
.desc {
font-size: 12px;
color: var(--color-text-desc);
display: -webkit-box;
-webkit-box-orient: vertical;
overflow: hidden;
-webkit-line-clamp: 2;
text-overflow: ellipsis;
}
&.active {
color: var(--ant-primary-color);
background: var(--color-list-hover);
}
}
@ -288,16 +326,18 @@ const deletePlugin = async (plugin) => {
.plugin-detail {
padding: 20px 20px 0 20px;
box-sizing: border-box;
width: 60%;
width: 62%;
height: 100%;
background: var(--color-body-bg);
.plugin-top {
display: flex;
align-items: flex-start;
justify-content: space-between;
border-bottom: 1px solid #eee;
padding-bottom: 12px;
margin-bottom: 12px;
.title {
font-size: 20px;
font-size: 16px;
display: flex;
align-items: center;
color: var(--color-text-primary);
@ -314,12 +354,6 @@ const deletePlugin = async (plugin) => {
color: var(--color-text-desc);
}
}
.ant-tabs {
:deep(.ant-tabs-bar) {
color: var(--color-text-content);
border-bottom: 1px solid var(--color-border-light);
}
}
.detail-container,
.feature-container {
@ -332,7 +366,6 @@ const deletePlugin = async (plugin) => {
}
.desc-item {
border-bottom: 1px solid var(--color-border-light);
padding: 10px 0;
color: var(--color-text-content);
.ant-tag {

View File

@ -42,7 +42,6 @@ const dev = computed(() => {
<style lang="less">
.system {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
}

View File

@ -1,20 +1,17 @@
<template>
<div class="finder">
<a-carousel arrows>
<template #prevArrow>
<div class="custom-slick-arrow" style="left: 10px; z-index: 1">
<left-circle-outlined />
</div>
</template>
<template #nextArrow>
<div class="custom-slick-arrow" style="right: 10px">
<right-circle-outlined />
</div>
</template>
<div :key="index" v-for="(banner, index) in data.banners || []">
<img @click="jumpTo(banner.link)" width="100%" :src="banner.src" />
</div>
</a-carousel>
<Carousel :itemsToShow="2" :transition="500">
<Slide :key="index" v-for="(banner, index) in data.banners || []">
<img class="carousel__item" @click="jumpTo(banner.link)" :src="banner.src" />
</Slide>
</Carousel>
<a-divider />
<PluginList
v-if="must && !!must.length"
@downloadSuccess="downloadSuccess"
:title="$t('feature.market.finder.must')"
:list="must"
/>
<PluginList
v-if="recommend && !!recommend.length"
@downloadSuccess="downloadSuccess"
@ -30,8 +27,9 @@
</template>
<script setup>
import { LeftCircleOutlined, RightCircleOutlined } from '@ant-design/icons-vue';
import { ref, computed, onBeforeMount } from 'vue';
import 'vue3-carousel/dist/carousel.css';
import { Carousel, Slide } from 'vue3-carousel';
import request from '../../../assets/request/index';
import PluginList from './plugin-list.vue';
@ -45,6 +43,24 @@ onBeforeMount(async () => {
data.value = await request.getFinderDetail();
});
const must = computed(() => {
const defaultData = data.value.must || [];
if (!defaultData.length) return [];
return defaultData.map((plugin) => {
let searchInfo = null;
totalPlugins.value.forEach((t) => {
if (t.name === plugin) {
searchInfo = t;
}
});
return searchInfo;
});
});
const jumpTo = (url) => {
window.rubick.shellOpenExternal(url);
};
const recommend = computed(() => {
const defaultData = data.value.recommend || [];
if (!defaultData.length) return [];
@ -76,47 +92,46 @@ const newList = computed(() => {
<style lang="less">
.finder {
position: relative;
width: 100%;
height: 100%;
overflow-x: hidden;
box-sizing: border-box;
&::-webkit-scrollbar {
width: 0;
}
.ant-carousel .slick-slide {
text-align: center;
height: 235px;
line-height: 160px;
overflow: hidden;
border-radius: 4px;
img {
width: 100%;
height: 235px;
}
}
.ant-carousel .custom-slick-arrow {
width: 25px;
height: 25px;
font-size: 25px;
color: #fff;
background-color: rgba(31, 45, 61, 0.11);
opacity: 0.3;
}
.ant-carousel .custom-slick-arrow.slick-next:focus {
color: #fff;
}
.ant-carousel .custom-slick-arrow:before {
display: none;
}
.ant-carousel .custom-slick-arrow:hover {
opacity: 0.5;
}
.ant-carousel .slick-slide h3 {
color: #fff;
.ant-divider-horizontal {
margin: 17px 0;
}
}
.carousel__item {
cursor: pointer;
min-height: 180px;
width: 100%;
background-color: var(--vc-clr-primary);
color: var(--vc-clr-white);
font-size: 20px;
border-radius: 8px;
display: flex;
justify-content: center;
align-items: center;
}
.carousel__track {
margin-bottom: 0;
}
.carousel__slide {
padding-right: 6px;
&:last-child {
padding-left: 6px;
}
}
.carousel__prev,
.carousel__next {
box-sizing: content-box;
border: 5px solid white;
}
</style>

View File

@ -42,7 +42,6 @@ const system = computed(() => {
<style lang="less">
.system {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
}

View File

@ -15,10 +15,15 @@
:loading="item.isloading"
>
<CloudDownloadOutlined
v-show="!item.isloading && !item.isdownload"
v-if="!item.isloading && !item.isdownload"
@click.stop="downloadPlugin(item, index)"
style="font-size: 20px; cursor: pointer"
/>
<SelectOutlined
v-if="!item.isloading && item.isdownload"
@click.stop="openPlugin(item)"
style="font-size: 18px; cursor: pointer"
/>
</a-button>
</template>
<a-list-item-meta>
@ -36,68 +41,82 @@
</template>
</a-list>
</div>
</div>
<a-drawer
width="100%"
placement="right"
:closable="false"
:visible="visible"
:get-container="false"
class="plugin-info"
:style="{ position: 'absolute' }"
@close="visible = false"
>
<template #title>
<div class="plugin-title-info">
<div class="back-icon" @click="visible = false">
<ArrowLeftOutlined />
</div>
<div class="info">
<img :src="detail.logo" class="plugin-icon" />
<div class="plugin-desc">
<div class="title">
{{ detail.pluginName }}
<a-drawer
width="77%"
v-if="visible"
placement="right"
:closable="false"
:visible="visible"
class="plugin-info"
:style="{ position: 'absolute' }"
@close="visible = false"
>
<template #title>
<div class="plugin-title-info">
<div class="info">
<img :src="detail.logo" class="plugin-icon" />
<div class="plugin-desc">
<div>
<div class="title">
{{ detail.pluginName }}
</div>
<div class="desc">
{{ detail.description }}
</div>
</div>
<a-button
v-if="!detail.isdownload"
@click.stop="downloadPlugin(detail)"
shape="round"
type="primary"
:loading="detail.isloading"
>
<template #icon>
<CloudDownloadOutlined
v-show="!detail.isloading && !detail.isdownload"
/>
</template>
{{ $t('feature.market.install') }}
</a-button>
</div>
<div class="desc">
{{ detail.description }}
</div>
<a-button
v-if="!detail.isdownload"
@click.stop="downloadPlugin(detail)"
shape="round"
type="primary"
:loading="detail.isloading"
>
<template #icon>
<CloudDownloadOutlined
v-show="!detail.isloading && !detail.isdownload"
/>
</template>
{{ $t('feature.market.install') }}
</a-button>
</div>
</div>
</div>
</template>
<div v-html="content" class="home-page-container"></div>
</a-drawer>
</template>
<a-spin :spinning="!content" tip="内容加载中...">
<div v-if="content !== 'error'" v-html="content" class="home-page-container"></div>
<a-result
class="error-content"
v-else
sub-title="插件主页内容走丢啦!"
>
<template #icon>
<Vue3Lottie :animationData="notFountJson" :height="240" :width="240" />
</template>
</a-result>
</a-spin>
</a-drawer>
</div>
</template>
<script setup>
import {
CloudDownloadOutlined,
ArrowLeftOutlined,
SelectOutlined
} from '@ant-design/icons-vue';
import { defineProps, ref } from 'vue';
import { useStore } from 'vuex';
import { message } from 'ant-design-vue';
import MarkdownIt from 'markdown-it';
import request from '../../../assets/request/index';
import { useRouter } from 'vue-router';
import request from '@/assets/request/index';
import notFountJson from '@/assets/lottie/404.json';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const store = useStore();
const router = useRouter();
const startDownload = (name) => store.dispatch('startDownload', name);
const successDownload = (name) => store.dispatch('successDownload', name);
@ -113,7 +132,7 @@ defineProps({
const downloadPlugin = async (plugin) => {
startDownload(plugin.name);
await window.market.downloadPlugin(plugin);
message.success(t('feature.dev.installSuccess', { pluginName: plugin.name }));
message.success(t('feature.dev.installSuccess', { pluginName: plugin.pluginName }));
successDownload(plugin.name);
};
@ -125,11 +144,24 @@ const content = ref('');
const showDetail = async (item) => {
visible.value = true;
detail.value = item;
content.value = '';
let mdContent = '暂无内容';
if (item.homePage) {
mdContent = await request.getPluginDetail(item.homePage);
try {
if (item.homePage) {
mdContent = await request.getPluginDetail(item.homePage);
}
content.value = markdown.render(mdContent);
} catch (e) {
content.value = 'error';
}
content.value = markdown.render(mdContent);
};
const openPlugin = (item) => {
store.commit('commonUpdate', {active: ['installed']})
router.push({
path: '/installed',
query: {plugin: item.name}
});
};
</script>
@ -138,7 +170,7 @@ const showDetail = async (item) => {
width: 0;
}
.panel-item {
margin: 20px 0;
margin-bottom: 17px;
.download-plugin-btn {
color: var(--ant-primary-color);
}
@ -170,7 +202,9 @@ const showDetail = async (item) => {
}
&:last-child {
border-bottom: none;
&:after {
border-bottom: none;
}
}
}
.plugin-info {
@ -199,23 +233,23 @@ const showDetail = async (item) => {
.plugin-title-info {
display: flex;
align-items: flex-start;
.back-icon {
font-size: 16px;
margin-right: 40px;
}
width: 100%;
.info {
width: 100%;
display: flex;
align-items: center;
align-items: flex-start;
.plugin-icon {
width: 100px;
height: 100px;
width: 40px;
height: 40px;
margin-right: 20px;
}
.plugin-desc {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
.title {
font-size: 18px;
font-weight: bold;
@ -225,14 +259,18 @@ const showDetail = async (item) => {
.desc {
font-size: 12px;
font-weight: normal;
margin-top: 5px;
margin-bottom: 20px;
color: var(--color-text-desc);
}
}
}
}
.error-content {
&.ant-result {
padding: 0;
}
}
.home-page-container {
min-height: 200px;
* {
color: var(--color-text-content);
}

View File

@ -6,11 +6,21 @@
:title="$t('feature.market.searchResult')"
:list="result"
/>
<a-result
class="error-content"
v-else
sub-title="哎呀,暂时还没有这个插件哟!"
>
<template #icon>
<Vue3Lottie :animationData="emptyJson" :height="240" :width="240" />
</template>
</a-result>
</div>
</template>
<script setup>
import { computed } from 'vue';
import emptyJson from '@/assets/lottie/empty.json';
import PluginList from './plugin-list.vue';
import { useStore } from 'vuex';
@ -38,8 +48,10 @@ const result = computed(() => {
<style lang="less">
.result {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
.error-content {
padding-top: 40px;
}
}
</style>

View File

@ -42,7 +42,6 @@ const system = computed(() => {
<style lang="less">
.system {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
}

View File

@ -42,7 +42,6 @@ const tools = computed(() => {
<style lang="less">
.worker {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
}

View File

@ -42,7 +42,6 @@ const system = computed(() => {
<style lang="less">
.worker {
width: 100%;
height: 100vh;
overflow-x: hidden;
box-sizing: border-box;
}

View File

@ -1,133 +0,0 @@
<template>
<div class="market">
<div class="left-menu">
<div class="search-container">
<a-input-search
v-model:value="searchValue"
:placeholder="$t('feature.market.search')"
style="width: 100%"
class="search"
@search="onSearch"
/>
</div>
<a-menu v-model:selectedKeys="current" mode="inline">
<a-menu-item key="finder">
<template #icon>
<StarOutlined />
</template>
{{ $t('feature.market.explore') }}
</a-menu-item>
<a-menu-item key="worker">
<template #icon>
<SendOutlined style="transform: rotate(-45deg)" />
</template>
{{ $t('feature.market.efficiency') }}
</a-menu-item>
<a-menu-item key="tools">
<template #icon>
<SearchOutlined />
</template>
{{ $t('feature.market.searchTool') }}
</a-menu-item>
<a-menu-item key="image">
<template #icon>
<FileImageOutlined />
</template>
{{ $t('feature.market.imageTool') }}
</a-menu-item>
<a-menu-item key="dev">
<template #icon>
<CodeOutlined />
</template>
{{ $t('feature.market.developTool') }}
</a-menu-item>
<a-menu-item key="system">
<template #icon>
<DatabaseOutlined />
</template>
{{ $t('feature.market.systemTool') }}
</a-menu-item>
</a-menu>
</div>
<div class="container">
<component :totalPlugins="totalPlugins" :is="Components[current[0]]" />
</div>
</div>
</template>
<script lang="ts" setup>
import {
StarOutlined,
SendOutlined,
SearchOutlined,
FileImageOutlined,
DatabaseOutlined,
CodeOutlined,
} from '@ant-design/icons-vue';
import { reactive, toRefs, computed } from 'vue';
import { useStore } from 'vuex';
import Finder from './components/finder.vue';
import System from './components/system.vue';
import Worker from './components/worker.vue';
import Tools from './components/tools.vue';
import Dev from './components/devlopment.vue';
import Image from './components/image.vue';
import Result from './components/result.vue';
const Components = {
finder: Finder,
system: System,
worker: Worker,
image: Image,
tools: Tools,
dev: Dev,
result: Result,
};
const state = reactive({
searchValue: '',
current: ['finder'],
});
const store = useStore();
const totalPlugins = computed(() => store.state.totalPlugins);
const { searchValue, current } = toRefs(state);
const onSearch = (searchValue: string) => {
state.current = ['result'];
store.commit('setSearchValue', searchValue);
};
</script>
<style lang="less" scoped>
@import '~@/assets/common.less';
.market {
display: flex;
box-sizing: border-box;
align-items: flex-start;
width: 100%;
overflow: hidden;
background: var(--color-menu-bg);
height: calc(~'100vh - 46px');
.search {
:deep(.ant-btn),
:deep(.ant-input),
:deep(.ant-input-group-addon) {
color: var(--ant-primary-color) !important;
background: var(--color-input-hover);
border-color: var(--color-border-light);
}
}
.container {
background: var(--color-body-bg);
width: calc(~'100% - 200px');
height: 100%;
box-sizing: border-box;
padding: 10px 20px;
position: relative;
}
}
</style>

View File

@ -0,0 +1,268 @@
<template>
<div class="export-header">
<a-button @click="exportData" size="small" type="primary" style="margin-right: 10px;">
导出数据
<template #icon>
<ExportOutlined />
</template>
</a-button>
<a-button @click="importData" danger size="small" style="margin-right: 10px;">
导入数据
<template #icon>
<ImportOutlined />
</template>
</a-button>
<a-button type="link" size="small" @click="showSetting = true">
<template #icon>
<SettingOutlined />
</template>
</a-button>
</div>
<a-list item-layout="horizontal" :data-source="dataPlugins">
<template #renderItem="{ item }">
<a-list-item>
<template #actions>
<a v-if="!item.plugin.isdownload && !item.plugin.isloading" key="list-loadmore-edit"
@click="() => downloadPlugin(item.plugin)">
<CloudDownloadOutlined style="font-size: 18px;"/>
</a>
<a v-if="item.plugin.isloading" key="list-loadmore-edit">
<LoadingOutlined style="font-size: 18px;"/>
</a>
<a key="list-loadmore-edit" @click="() => showKeys(item)">
<DatabaseOutlined style="font-size: 18px;"/>
</a>
</template>
<a-list-item-meta :description="`${item.keys.length} 份文档`">
<template #title>
<div>
<span>{{ item.plugin.pluginName }}</span>
</div>
</template>
<template #avatar>
<a-avatar shape="square" :src="item.plugin.logo"/>
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
<a-drawer
v-model:visible="open"
width="400"
:closable="false"
:title="currentSelect.plugin.pluginName"
placement="right"
>
<p
class="key-item"
:key="key"
@click="() => showDetail(key)"
v-for="key in currentSelect.keys"
>
{{ key }}
</p>
</a-drawer>
<a-modal
centered
bodyStyle="max-height: 500px; overflow: auto"
:footer="null"
:closable="false"
v-model:visible="show"
>
<pre>{{ JSON.stringify(detail, null, 2) }}</pre>
</a-modal>
<a-modal
v-model:visible="showSetting"
title="webdav 账户配置"
:footer="null"
>
<a-alert v-if="formState.suport === 'jianguo'" style="margin-bottom: 20px;" type="info" show-icon>
<template #message>
<div
@click="openHelp"
class="openHelp">
点击查看如何获取坚果云账号密码
</div>
</template>
</a-alert>
<a-form
:model="formState"
name="basic"
:label-col="{ span: 8 }"
:wrapper-col="{ span: 16 }"
autocomplete="off"
@finish="handleOk"
>
<a-form-item
label="webdav 提供商"
name="suport"
>
<a-select v-model:value="formState.suport">
<a-select-option value="jianguo">坚果云</a-select-option>
<a-select-option value="auto">自定义</a-select-option>
</a-select>
</a-form-item>
<a-form-item
label="服务器地址"
name="url"
v-show="formState.suport === 'auto'"
:rules="[{ required: true, message: '请填写服务器地址!' }]"
>
<a-input v-model:value="formState.url" />
</a-form-item>
<a-form-item
label="账户"
name="username"
:rules="[{ required: true, message: '请填写 username!' }]"
>
<a-input v-model:value="formState.username" />
</a-form-item>
<a-form-item
label="密码"
name="password"
:rules="[{ required: true, message: '请填写 password!' }]"
>
<a-input-password v-model:value="formState.password" />
</a-form-item>
<a-form-item :wrapper-col="{ offset: 8, span: 16 }">
<a-button type="primary" html-type="submit">保存设置</a-button>
</a-form-item>
</a-form>
</a-modal>
</template>
<script setup>
import { useStore } from 'vuex';
import { computed, ref, reactive } from 'vue';
import {
DatabaseOutlined,
CloudDownloadOutlined,
LoadingOutlined,
ExportOutlined,
ImportOutlined,
SettingOutlined,
} from '@ant-design/icons-vue';
import { message, Modal } from 'ant-design-vue';
import { useI18n } from 'vue-i18n';
const { t } = useI18n();
const open = ref(false);
const show = ref(false);
const showSetting = ref(false);
const currentSelect = ref({ plugin: {} });
const detail = ref({});
const defaultConfig = window.rubick.dbStorage.getItem(
'rubick-db-jg-webdav'
) || {
url: 'https://dav.jianguoyun.com/dav/',
username: '',
password: '',
};
if (!defaultConfig.suport) {
defaultConfig.suport = 'jianguo';
}
const formState = reactive(defaultConfig);
const showKeys = (item) => {
open.value = true;
currentSelect.value = item;
};
const handleOk = () => {
window.rubick.dbStorage.setItem(
'rubick-db-jg-webdav',
JSON.parse(JSON.stringify(formState))
);
message.success('保存成功');
showSetting.value = false;
};
const showDetail = (key) => {
show.value = true;
detail.value = window.rubick.db.get(key);
};
const exportData = () => {
if (!formState.password || !formState.username) {
return showSetting.value = true;
}
window.market.dbDump(JSON.parse(JSON.stringify(formState)));
};
const importData = () => {
if (!formState.password || !formState.username) {
return showSetting.value = true;
}
Modal.confirm({
title: '导入确认',
content: '导入坚果云数据将会覆盖本地数据,是否确认导入?',
onOk() {
window.market.dbImport(JSON.parse(JSON.stringify(formState)));
},
});
};
const openHelp = () => {
window.rubick.shellOpenExternal('https://help.jianguoyun.com/?p=2064');
};
const store = useStore();
const pluginsData = window.rubick.db.get('RUBICK_PLUGIN_INFO');
const totalPlugins = computed(() => store.state.totalPlugins);
const dataPlugins = computed(() => {
if (!pluginsData) return [];
return pluginsData.data.map((item) => {
let plugin = null;
if (['rubick-system-feature'].includes(item.name)) {
plugin = {
pluginName: '主程序',
isdownload: true,
logo: require('../../assets/logo.png'),
};
} else {
plugin = totalPlugins.value.find((p) => p.name === item.name);
}
const data = item.keys.map((key) => window.rubick.db.get(key));
return {
...item,
plugin,
data,
};
});
});
const startDownload = (name) => store.dispatch('startDownload', name);
const successDownload = (name) => store.dispatch('successDownload', name);
const downloadPlugin = async (plugin) => {
startDownload(plugin.name);
await window.market.downloadPlugin(plugin);
message.success(t('feature.dev.installSuccess', { pluginName: plugin.name }));
successDownload(plugin.name);
};
</script>
<style lang="less">
.openHelp {
cursor: pointer;
text-decoration: underline;
}
.export-header {
width: 100%;
height: 40px;
border-bottom: 1px solid #eee;
text-align: right;
}
.key-item {
cursor: pointer;
&:hover {
color: var(--ant-primary-color);
}
}
</style>

View File

@ -1,232 +1,221 @@
<template>
<div class="settings">
<div class="left-menu">
<a-menu v-model:selectedKeys="currentSelect" mode="inline">
<div class="view-title"> {{ $t('feature.settings.title') }}</div>
<div class="view-container">
<a-menu v-model:selectedKeys="currentSelect" mode="horizontal">
<a-menu-item key="userInfo">
<template #icon>
<UserOutlined />
</template>
{{ $t('feature.settings.account.accountInfo') }}
</a-menu-item>
<a-menu-item key="normal">
<template #icon>
<ToolOutlined />
</template>
{{ $t('feature.settings.basic.title') }}
</a-menu-item>
<a-menu-item key="localstart">
<template #icon>
<FolderOpenOutlined />
</template>
{{ $t('feature.settings.localstart.title') }}
</a-menu-item>
<a-menu-item key="global">
<template #icon>
<LaptopOutlined />
</template>
{{ $t('feature.settings.global.title') }}
</a-menu-item>
<!-- <a-menu-item key="superpanel">-->
<!-- <template #icon>-->
<!-- <FileAddOutlined />-->
<!-- </template>-->
<!-- {{ $t('feature.settings.superPanel.title') }}-->
<!-- </a-menu-item>-->
<!-- <a-menu-item key="superpanel">-->
<!-- <template #icon>-->
<!-- <FileAddOutlined />-->
<!-- </template>-->
<!-- {{ $t('feature.settings.superPanel.title') }}-->
<!-- </a-menu-item>-->
<a-menu-item key="database">
{{ $t('feature.settings.database.title') }}
</a-menu-item>
<a-menu-item key="localhost">
<template #icon>
<DatabaseOutlined />
</template>
{{ $t('feature.settings.intranet.title') }}
</a-menu-item>
</a-menu>
</div>
<div class="settings-detail">
<UserInfo v-if="currentSelect[0] === 'userInfo'" />
<div v-if="currentSelect[0] === 'normal'">
<div class="setting-item">
<div class="title">
{{ $t('feature.settings.basic.shortcutKey') }}
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.showOrHiddle') }}
<div class="settings-detail">
<UserInfo v-if="currentSelect[0] === 'userInfo'" />
<div v-if="currentSelect[0] === 'normal'">
<div class="setting-item">
<div class="title">
{{ $t('feature.settings.basic.shortcutKey') }}
</div>
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }}</span>
<template v-if="isWindows">
<br />
<span
style="cursor: pointer; text-decoration: underline"
@click="resetDefault('Alt')"
>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.showOrHiddle') }}
</div>
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }}</span>
<template v-if="isWindows">
<br />
<span
style="cursor: pointer; text-decoration: underline"
@click="resetDefault('Alt')"
>
Alt+Space
</span>
<span
style="
<span
style="
cursor: pointer;
margin-left: 8px;
text-decoration: underline;
"
@click="resetDefault('Ctrl')"
>
@click="resetDefault('Ctrl')"
>
Ctrl+Space
</span>
</template>
</template>
</template>
<div
class="value"
tabIndex="-1"
@keyup="(e) => changeShortCut(e, 'showAndHidden')"
>
{{ shortCut.showAndHidden }}
<div
class="value"
tabIndex="-1"
@keyup="(e) => changeShortCut(e, 'showAndHidden')"
>
{{ shortCut.showAndHidden }}
</div>
</a-tooltip>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.screenCapture') }}
</div>
</a-tooltip>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.screenCapture') }}
</div>
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }}</span>
</template>
<div
class="value"
tabIndex="-1"
@keyup="(e) => changeShortCut(e, 'capture')"
>
{{ shortCut.capture }}
</div>
</a-tooltip>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.common') }}</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.autoPaste') }}
</div>
<a-switch
v-model:checked="common.autoPast"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
<div class="settings-item-li">
<div class="label">{{ $t('feature.settings.basic.autoBoot') }}</div>
<a-switch
v-model:checked="common.start"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.spaceExec') }}
</div>
<a-switch
v-model:checked="common.space"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.theme') }}</div>
<div class="settings-item-li">
<div class="label">{{ $t('feature.settings.basic.darkMode') }}</div>
<a-switch
v-model:checked="common.darkMode"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.language') }}</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.changeLang') }}
</div>
<a-select
v-model:value="state.common.lang"
label-in-value
style="width: 240px"
:options="options"
@change="changeLanguage"
></a-select>
</div>
</div>
</div>
<div v-if="currentSelect[0] === 'global'">
<a-collapse>
<a-collapse-panel
key="1"
:header="$t('feature.settings.global.instructions')"
>
<div>
{{ $t('feature.settings.global.tips') }}
</div>
<h3 style="margin-top: 10px">
{{ $t('feature.settings.global.example') }}
</h3>
<a-divider style="margin: 5px 0" />
<a-list item-layout="horizontal" :data-source="examples">
<template #renderItem="{ item }">
<a-list-item>
<a-list-item-meta :description="item.desc">
<template #title>
<div>{{ item.title }}</div>
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
</a-collapse-panel>
</a-collapse>
<div class="feature-container">
<div class="keywords item">
<div>{{ $t('feature.settings.global.shortcutKey') }}</div>
<template :key="index" v-for="(item, index) in global">
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }}</span>
</template>
<div
class="value"
tabIndex="2"
@keyup="(e) => changeGlobalKey(e, index)"
tabIndex="-1"
@keyup="(e) => changeShortCut(e, 'capture')"
>
{{ item.key }}
<MinusCircleOutlined
@click.stop="deleteGlobalKey(e, index)"
/>
{{ shortCut.capture }}
</div>
</a-tooltip>
</template>
</div>
</div>
<div class="short-cut item">
<div>{{ $t('feature.settings.global.funtionKey') }}</div>
<template v-for="(item, index) in global" :key="index">
<a-input
:value="item.value"
class="value"
allowClear
:disabled="!item.key"
@change="(e) => changeGlobalValue(index, e.target.value)"
/>
</template>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.common') }}</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.autoPaste') }}
</div>
<a-switch
v-model:checked="common.autoPast"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
<div class="settings-item-li">
<div class="label">{{ $t('feature.settings.basic.autoBoot') }}</div>
<a-switch
v-model:checked="common.start"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.spaceExec') }}
</div>
<a-switch
v-model:checked="common.space"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.theme') }}</div>
<div class="settings-item-li">
<div class="label">{{ $t('feature.settings.basic.darkMode') }}</div>
<a-switch
v-model:checked="common.darkMode"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.language') }}</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.changeLang') }}
</div>
<a-select
v-model:value="state.common.lang"
label-in-value
style="width: 240px"
:options="options"
@change="changeLanguage"
></a-select>
</div>
</div>
</div>
<div @click="addConfig" class="add-global">
<PlusCircleOutlined />
{{ $t('feature.settings.global.addShortcutKey') }}
<div v-if="currentSelect[0] === 'global'">
<a-collapse>
<a-collapse-panel
key="1"
:header="$t('feature.settings.global.instructions')"
>
<div>
{{ $t('feature.settings.global.tips') }}
</div>
<h3 style="margin-top: 10px">
{{ $t('feature.settings.global.example') }}
</h3>
<a-divider style="margin: 5px 0" />
<a-list item-layout="horizontal" :data-source="examples">
<template #renderItem="{ item }">
<a-list-item>
<a-list-item-meta :description="item.desc">
<template #title>
<div>{{ item.title }}</div>
</template>
</a-list-item-meta>
</a-list-item>
</template>
</a-list>
</a-collapse-panel>
</a-collapse>
<div class="feature-container">
<div class="keywords item">
<div>{{ $t('feature.settings.global.shortcutKey') }}</div>
<template :key="index" v-for="(item, index) in global">
<a-tooltip placement="top" trigger="click">
<template #title>
<span>{{ tipText }}</span>
</template>
<div
class="value"
tabIndex="2"
@keyup="(e) => changeGlobalKey(e, index)"
>
{{ item.key }}
<MinusCircleOutlined
@click.stop="deleteGlobalKey(e, index)"
/>
</div>
</a-tooltip>
</template>
</div>
<div class="short-cut item">
<div>{{ $t('feature.settings.global.funtionKey') }}</div>
<template v-for="(item, index) in global" :key="index">
<a-input
:value="item.value"
class="value"
allowClear
:disabled="!item.key"
@change="(e) => changeGlobalValue(index, e.target.value)"
/>
</template>
</div>
</div>
<div @click="addConfig" class="add-global">
<PlusCircleOutlined />
{{ $t('feature.settings.global.addShortcutKey') }}
</div>
</div>
<Localhost v-if="currentSelect[0] === 'localhost'" />
<LocalStart v-if="currentSelect[0] === 'localstart'" />
<DataBase v-if="currentSelect[0] === 'database'" />
</div>
<SuperPanel v-if="currentSelect[0] === 'superpanel'" />
<Localhost v-if="currentSelect[0] === 'localhost'" />
<LocalStart v-if="currentSelect[0] === 'localstart'" />
</div>
</div>
</template>
@ -240,14 +229,15 @@ import {
PlusCircleOutlined,
UserOutlined,
FolderOpenOutlined,
SafetyOutlined,
} from '@ant-design/icons-vue';
import debounce from 'lodash.debounce';
import { ref, reactive, watch, toRefs, computed } from 'vue';
import keycodes from './keycode';
import Localhost from './localhost.vue';
import SuperPanel from './super-panel.vue';
import UserInfo from './user-info';
import LocalStart from './local-start';
import DataBase from './database';
import { useI18n } from 'vue-i18n';
import localConfig from '@/confOp';
@ -444,10 +434,23 @@ const changeLanguage = (value) => {
box-sizing: border-box;
width: 100%;
overflow-x: hidden;
background: var(--color-body-bg);
height: calc(~'100vh - 46px');
display: flex;
background: var(--color-body-bg2);
height: calc(~'100vh - 34px');
.ant-menu-horizontal {
border-bottom: 1px solid var(--color-border-light);
}
.view-title {
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
color: var(--color-text-primary);
}
.view-container {
border-radius: 8px;
background: var(--color-body-bg);
overflow: auto;
height: calc(~'100vh - 84px');
}
.ant-menu {
background: var(--color-body-bg) !important;
color: var(--color-text-content) !important;
@ -458,7 +461,6 @@ const changeLanguage = (value) => {
box-sizing: border-box;
flex: 1;
overflow: auto;
height: 100%;
background: var(--color-body-bg);
.setting-item {
@ -470,7 +472,7 @@ const changeLanguage = (value) => {
.title {
color: var(--ant-primary-color);
font-size: 15px;
font-size: 14px;
margin-bottom: 10px;
}
@ -583,7 +585,6 @@ const changeLanguage = (value) => {
.ant-collapse {
background: var(--color-input-hover);
.ant-collapse-content {
background: var(--color-input-hover);
color: var(--color-text-content);

View File

@ -27,6 +27,7 @@
<script setup>
import { ref } from 'vue';
const fs = window.require('fs');
const process = window.require('process');
const dbId = 'rubick-local-start-app';
@ -97,7 +98,7 @@ const checkDrop = (e) => {
width: 100%;
overflow-x: hidden;
background: var(--color-body-bg);
height: calc(~'100vh - 106px');
height: calc(~'100vh - 180px');
.del-title {
text-decoration-line: line-through;
text-decoration-color: var(--ant-error-color);

View File

@ -1,103 +1,17 @@
<template>
<div class="user-info">
<!-- <div class="info-container">-->
<!-- <a-result-->
<!-- class="user-info-result"-->
<!-- :title="userInfo.name || $t('feature.settings.account.tips1')"-->
<!-- :sub-title="$t('feature.settings.account.tips2')"-->
<!-- >-->
<!-- <template #icon>-->
<!-- <a-avatar :size="64" v-if="!userInfo.avatar">-->
<!-- <template #icon><UserOutlined /></template>-->
<!-- </a-avatar>-->
<!-- <a-avatar :src="userInfo.avatar" :size="64" v-else />-->
<!-- </template>-->
<!-- </a-result>-->
<!-- </div>-->
<div class="settings-container">
<div class="setting-item">
<div class="title">
{{ $t('feature.settings.account.themeColor') }}
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.primaryColor') }}
</div>
<a-input v-model:value="custom.primaryColor" class="value">
<template #prefix>
<div
:style="{
background: custom.primaryColor,
width: '10px',
height: '10px',
}"
></div>
</template>
</a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.errorColor') }}
</div>
<a-input v-model:value="custom.errorColor" class="value">
<template #prefix>
<div
:style="{
background: custom.errorColor,
width: '10px',
height: '10px',
}"
></div>
</template>
</a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.warningColor') }}
</div>
<a-input v-model:value="custom.warningColor" class="value">
<template #prefix>
<div
:style="{
background: custom.warningColor,
width: '10px',
height: '10px',
}"
></div>
</template>
</a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.successColor') }}
</div>
<a-input v-model:value="custom.successColor" class="value">
<template #prefix>
<div
:style="{
background: custom.successColor,
width: '10px',
height: '10px',
}"
></div>
</template>
</a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.infoColor') }}
</div>
<a-input v-model:value="custom.infoColor" class="value">
<template #prefix>
<div
:style="{
background: custom.infoColor,
width: '10px',
height: '10px',
}"
></div>
</template>
</a-input>
<a-radio-group @change="changeTheme" v-model:value="theme" button-style="solid">
<a-radio-button value="SPRING">{{ $t('feature.settings.account.spring') }}</a-radio-button>
<a-radio-button value="SUMMER">{{ $t('feature.settings.account.summer') }}</a-radio-button>
<a-radio-button value="AUTUMN">{{ $t('feature.settings.account.autumn') }}</a-radio-button>
<a-radio-button value="WINTER">{{ $t('feature.settings.account.winter') }}</a-radio-button>
</a-radio-group>
</div>
</div>
<div class="setting-item">
@ -110,34 +24,33 @@
</div>
<a-input v-model:value="custom.placeholder" class="value"></a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.name') }}
</div>
<a-input v-model:value="custom.username" class="value"></a-input>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.account.logo') }}
</div>
<div class="img-container">
<img class="custom-img" :src="custom.logo" />
<a-button @click="changeLogo" size="small" type="link">
<a-button class="btn" @click="changeLogo" shape="round" size="small" type="primary">
{{ $t('feature.settings.account.replace') }}
</a-button>
</div>
</div>
</div>
<!-- <div class="footer-btn">-->
<!-- <a-button @click="reset" type="danger">-->
<!-- {{ $t('feature.settings.account.reset') }}-->
<!-- </a-button>-->
<!-- </div>-->
</div>
</div>
</template>
<script setup>
import { reactive, ref, toRefs, watch } from 'vue';
import { reactive, toRefs, watch, ref } from 'vue';
import debounce from 'lodash.debounce';
import localConfig from '@/confOp';
import service from '../../assets/service';
import * as Themes from '@/assets/constans';
const { ipcRenderer } = window.require('electron');
const state = reactive({
@ -146,14 +59,10 @@ const state = reactive({
const { perf } = localConfig.getConfig();
const theme = ref(perf.custom.theme);
state.custom = perf.custom || {};
const userInfo = ref(window.rubick.dbStorage.getItem('rubick-user-info'));
// service.getUserInfo({ openId: userInfo.value.openId }).then((res) => {
// userInfo.value = res;
// });
const setConfig = debounce(() => {
localConfig.setConfig(
JSON.parse(
@ -180,6 +89,13 @@ const changeLogo = () => {
state.custom.logo = `file://${logoPath}`;
};
const changeTheme = () => {
state.custom = {
...state.custom,
...Themes[theme.value],
};
};
// const reset = () => {
// Modal.warning({
// title: '',
@ -194,11 +110,17 @@ const changeLogo = () => {
</script>
<style lang="less">
.settings-container {
margin-top: 18px;
.ant-radio-button-wrapper {
background: var(--color-body-bg);
color: var(--color-text-content);
}
.user-info-result {
padding: 0;
.theme-preview {
width: 20px;
height: 20px;
border-radius: 100%;
}
&.ant-result {
padding: 24px;
}
@ -214,6 +136,10 @@ const changeLogo = () => {
}
.img-container {
width: 300px;
.btn {
margin-left: 10px;
font-size: 12px;
}
}
.custom-img {
width: 60px;

View File

@ -77,7 +77,6 @@ watch([visible], () => {
width: 100%;
overflow-x: hidden;
background: var(--color-body-bg);
height: calc(~'100vh - 46px');
:deep(.ant-result-title) {
color: var(--color-text-primary);
}

View File

@ -1,13 +1,22 @@
const path = require("path");
const path = require('path');
module.exports = {
css: { // 配置css模块
loaderOptions: { // 向预处理器 Loader 传递配置选项
less: { // 配置less其他样式解析用法一致
javascriptEnabled: true // 设置为true
}
}
css: {
// 配置css模块
loaderOptions: {
// 向预处理器 Loader 传递配置选项
less: {
// 配置less其他样式解析用法一致
javascriptEnabled: true, // 设置为true
},
},
},
outputDir: path.join(__dirname, "../public/feature"),
publicPath: process.env.NODE_ENV === "production" ? "" : "/",
outputDir: path.join(__dirname, '../public/feature'),
publicPath: process.env.NODE_ENV === 'production' ? '' : '/',
// chainWebpack: (config) => {
// // 查看打包文件体积大小
// config
// .plugin('webpack-bundle-analyzer')
// .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin);
// },
};

View File

@ -968,6 +968,11 @@
resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32"
integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
"@discoveryjs/json-ext@0.5.7":
version "0.5.7"
resolved "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@ -1009,6 +1014,44 @@
cssnano-preset-default "^4.0.0"
postcss "^7.0.0"
"@intlify/core-base@9.2.2":
version "9.2.2"
resolved "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
integrity sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==
dependencies:
"@intlify/devtools-if" "9.2.2"
"@intlify/message-compiler" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/vue-devtools" "9.2.2"
"@intlify/devtools-if@9.2.2":
version "9.2.2"
resolved "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz#b13d9ac4b4e2fe6d2e7daa556517a8061fe8bd39"
integrity sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==
dependencies:
"@intlify/shared" "9.2.2"
"@intlify/message-compiler@9.2.2":
version "9.2.2"
resolved "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz#e42ab6939b8ae5b3d21faf6a44045667a18bba1c"
integrity sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==
dependencies:
"@intlify/shared" "9.2.2"
source-map "0.6.1"
"@intlify/shared@9.2.2":
version "9.2.2"
resolved "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
"@intlify/vue-devtools@9.2.2":
version "9.2.2"
resolved "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
integrity sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==
dependencies:
"@intlify/core-base" "9.2.2"
"@intlify/shared" "9.2.2"
"@jridgewell/gen-mapping@^0.1.0":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
@ -1090,6 +1133,11 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
"@polka/url@^1.0.0-next.20":
version "1.0.0-next.23"
resolved "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.23.tgz#498e41218ab3b6a1419c735e5c6ae2c5ed609b6c"
integrity sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==
"@simonwep/pickr@~1.8.0":
version "1.8.2"
resolved "https://registry.yarnpkg.com/@simonwep/pickr/-/pickr-1.8.2.tgz#96dc86675940d7cad63d69c22083dd1cbb9797cb"
@ -1720,6 +1768,11 @@
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.1.4.tgz#b4aec2f4b4599e11ba774a50c67fa378c9824e53"
integrity sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ==
"@vue/devtools-api@^6.2.1":
version "6.5.0"
resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07"
integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==
"@vue/eslint-config-prettier@^6.0.0":
version "6.0.0"
resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz#ad5912b308f4ae468458e02a2b05db0b9d246700"
@ -1981,6 +2034,11 @@ acorn-walk@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
acorn-walk@^8.0.0:
version "8.2.0"
resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^6.4.1:
version "6.4.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6"
@ -1991,6 +2049,11 @@ acorn@^7.1.1, acorn@^7.4.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.0.4:
version "8.10.0"
resolved "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
address@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9"
@ -2334,6 +2397,13 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
babel-plugin-import@^1.13.8:
version "1.13.8"
resolved "https://registry.npmmirror.com/babel-plugin-import/-/babel-plugin-import-1.13.8.tgz#782c517f6bbf2de3b1f75aaafd6d20a491c4878c"
integrity sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
babel-plugin-polyfill-corejs2@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
@ -3046,6 +3116,11 @@ commander@^2.12.1, commander@^2.18.0, commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^7.2.0:
version "7.2.0"
resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
commander@~2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
@ -3802,7 +3877,7 @@ dotenv@^8.2.0:
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b"
integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==
duplexer@^0.1.1:
duplexer@^0.1.1, duplexer@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
@ -3988,6 +4063,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
eslint-config-prettier@^6.0.0:
version "6.15.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.15.0.tgz#7f93f6cb7d45a92f1537a70ecc06366e1ac6fed9"
@ -4861,6 +4941,13 @@ gzip-size@^5.0.0:
duplexer "^0.1.1"
pify "^4.0.1"
gzip-size@^6.0.0:
version "6.0.0"
resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==
dependencies:
duplexer "^0.1.2"
handle-thing@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
@ -5615,6 +5702,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
is-plain-object@^5.0.0:
version "5.0.0"
resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
is-regex@^1.0.4, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
@ -5982,7 +6074,7 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.17.15:
lodash-es@^4.17.15, lodash-es@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
@ -5997,6 +6089,21 @@ lodash.defaultsdeep@^4.6.1:
resolved "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz#512e9bd721d272d94e3d3a63653fa17516741ca6"
integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==
lodash.escape@^4.0.1:
version "4.0.1"
resolved "https://registry.npmmirror.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98"
integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==
lodash.flatten@^4.4.0:
version "4.4.0"
resolved "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
lodash.invokemap@^4.6.0:
version "4.6.0"
resolved "https://registry.npmmirror.com/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz#1748cda5d8b0ef8369c4eb3ec54c21feba1f2d62"
integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==
lodash.kebabcase@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36"
@ -6012,6 +6119,11 @@ lodash.memoize@^4.1.2:
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
lodash.pullall@^4.2.0:
version "4.2.0"
resolved "https://registry.npmmirror.com/lodash.pullall/-/lodash.pullall-4.2.0.tgz#9d98b8518b7c965b0fae4099bd9fb7df8bbf38ba"
integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
@ -6027,6 +6139,11 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
lodash.uniqby@^4.7.0:
version "4.7.0"
resolved "https://registry.npmmirror.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302"
integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==
lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@ -6051,6 +6168,11 @@ loose-envify@^1.0.0:
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lottie-web@5.12.2:
version "5.12.2"
resolved "https://registry.npmmirror.com/lottie-web/-/lottie-web-5.12.2.tgz#579ca9fe6d3fd9e352571edd3c0be162492f68e5"
integrity sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==
lower-case@^1.1.1:
version "1.1.4"
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
@ -6356,6 +6478,11 @@ move-concurrently@^1.0.1:
rimraf "^2.5.4"
run-queue "^1.0.3"
mrmime@^1.0.0:
version "1.0.1"
resolved "https://registry.npmmirror.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27"
integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -6720,7 +6847,7 @@ open@^6.3.0:
dependencies:
is-wsl "^1.1.0"
opener@^1.5.1:
opener@^1.5.1, opener@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
@ -8170,6 +8297,15 @@ simple-swizzle@^0.2.2:
dependencies:
is-arrayish "^0.3.1"
sirv@^2.0.3:
version "2.0.3"
resolved "https://registry.npmmirror.com/sirv/-/sirv-2.0.3.tgz#ca5868b87205a74bef62a469ed0296abceccd446"
integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==
dependencies:
"@polka/url" "^1.0.0-next.20"
mrmime "^1.0.0"
totalist "^3.0.0"
slash@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@ -8285,16 +8421,16 @@ source-map-url@^0.4.0:
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@^0.5.6:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
source-map@^0.7.3:
version "0.7.3"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
@ -8771,6 +8907,11 @@ toposort@^1.0.0:
resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
totalist@^3.0.0:
version "3.0.1"
resolved "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8"
integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@ -9117,11 +9258,6 @@ uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
uuid@^9.0.0:
version "9.0.0"
resolved "https://registry.npmmirror.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5"
integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==
v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
@ -9177,6 +9313,16 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
vue-i18n@9.2.2:
version "9.2.2"
resolved "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz#aeb49d9424923c77e0d6441e3f21dafcecd0e666"
integrity sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==
dependencies:
"@intlify/core-base" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/vue-devtools" "9.2.2"
"@vue/devtools-api" "^6.2.1"
"vue-loader-v16@npm:vue-loader@^16.1.0":
version "16.8.3"
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087"
@ -9224,6 +9370,19 @@ vue-types@^3.0.0:
dependencies:
is-plain-object "3.0.1"
vue3-carousel@^0.3.1:
version "0.3.1"
resolved "https://registry.npmmirror.com/vue3-carousel/-/vue3-carousel-0.3.1.tgz#d001be7dea416dc2f4e66afc4d56af66696dc117"
integrity sha512-86vUkNPBzL2PVuR9w6hUsI90ccFjLp+K8cSFpRTISf+SjUQY3fMHc5CFF5MUL62v1xYYm27zEBmQupO9VQx9Kw==
vue3-lottie@^3.1.0:
version "3.1.0"
resolved "https://registry.npmmirror.com/vue3-lottie/-/vue3-lottie-3.1.0.tgz#39e2a595a83a7401f3308dfc923b28b0bb91a214"
integrity sha512-dS6/cjEuAoN/CWYqthPjGVVaeW5jRVB1yGEcFQbBcbDfCeMlVhC7pzn0Qatdz7gasOUIvZcJCmhfUe681GwhSg==
dependencies:
lodash-es "^4.17.21"
lottie-web "5.12.2"
vue@3.2.45:
version "3.2.45"
resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8"
@ -9300,6 +9459,29 @@ webpack-bundle-analyzer@^3.8.0:
opener "^1.5.1"
ws "^6.0.0"
webpack-bundle-analyzer@^4.9.1:
version "4.9.1"
resolved "https://registry.npmmirror.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d"
integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==
dependencies:
"@discoveryjs/json-ext" "0.5.7"
acorn "^8.0.4"
acorn-walk "^8.0.0"
commander "^7.2.0"
escape-string-regexp "^4.0.0"
gzip-size "^6.0.0"
is-plain-object "^5.0.0"
lodash.debounce "^4.0.8"
lodash.escape "^4.0.1"
lodash.flatten "^4.4.0"
lodash.invokemap "^4.6.0"
lodash.pullall "^4.2.0"
lodash.uniqby "^4.7.0"
opener "^1.5.2"
picocolors "^1.0.0"
sirv "^2.0.3"
ws "^7.3.1"
webpack-chain@^6.4.0:
version "6.5.1"
resolved "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.5.1.tgz#4f27284cbbb637e3c8fbdef43eef588d4d861206"
@ -9519,6 +9701,11 @@ ws@^6.0.0, ws@^6.2.1:
dependencies:
async-limiter "~1.0.0"
ws@^7.3.1:
version "7.5.9"
resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"

20388
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "rubick",
"version": "3.1.0",
"version": "4.0.1",
"author": "muwoo <2424880409@qq.com>",
"private": true,
"scripts": {
@ -31,13 +31,17 @@
"get-mac-apps": "^1.0.2",
"got": "^11.8.3",
"lodash.throttle": "^4.1.1",
"memorystream": "^0.3.1",
"node-key-sender": "^1.0.11",
"pinyin-match": "^1.2.4",
"pouchdb": "^7.2.2",
"pouchdb-load": "^1.4.6",
"pouchdb-replication-stream": "^1.2.9",
"simple-plist": "0.2.1",
"vue": "^3.0.0",
"vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0",
"webdav": "4.11.3",
"worker-loader": "^3.0.8"
},
"devDependencies": {
@ -69,6 +73,7 @@
"worker-plugin": "^5.0.1"
},
"resolutions": {
"vue-cli-plugin-electron-builder/electron-builder": "^23.0.3"
"vue-cli-plugin-electron-builder/electron-builder": "^23.0.3",
"leveldown": "6.0.3"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.worker{width:100%;overflow-x:hidden;box-sizing:border-box}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.worker{width:100%;overflow-x:hidden;box-sizing:border-box}

View File

@ -0,0 +1 @@
::-webkit-scrollbar{width:0}.panel-item{margin-bottom:17px}.panel-item .download-plugin-btn{color:var(--ant-primary-color)}.panel-item .title{margin-bottom:30px;color:var(--color-text-primary)}.panel-item .ellipse{display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:100%;color:var(--color-text-content)}.panel-item .ellipse.desc{color:var(--color-text-desc)}.panel-item:after{content:" ";display:block;width:100%;height:1px;border-bottom:1px solid var(--color-border-light);transform:scaleY(.5)}.panel-item .ant-list-item{display:flex!important}.panel-item:last-child:after{border-bottom:none}.plugin-info{width:100%}.plugin-info .ant-drawer-content-wrapper{box-shadow:none!important}.plugin-info .ant-drawer-content-wrapper .ant-drawer-content{background:var(--color-body-bg)}.plugin-info .ant-drawer-content-wrapper .ant-drawer-header{background:var(--color-body-bg);border-bottom:1px solid var(--color-border-light)}.dark .plugin-title-info .back-icon{filter:invert(1) brightness(200%)}.plugin-title-info,.plugin-title-info .info{display:flex;align-items:flex-start;width:100%}.plugin-title-info .info .plugin-icon{width:40px;height:40px;margin-right:20px}.plugin-title-info .info .plugin-desc{flex:1;display:flex;align-items:center;justify-content:space-between}.plugin-title-info .info .plugin-desc .title{font-size:18px;font-weight:700;color:var(--color-text-primary)}.plugin-title-info .info .plugin-desc .desc{font-size:12px;font-weight:400;color:var(--color-text-desc)}.error-content.ant-result{padding:0}.home-page-container{min-height:200px}.home-page-container *{color:var(--color-text-content)}.home-page-container img{width:100%}

View File

@ -0,0 +1 @@
.result{width:100%;overflow-x:hidden;box-sizing:border-box}.result .error-content{padding-top:100px}

View File

@ -0,0 +1 @@
.system{width:100%;overflow-x:hidden;box-sizing:border-box}

View File

@ -0,0 +1 @@
.dev[data-v-6fb0031c]{box-sizing:border-box;width:100%;overflow-x:hidden;height:calc(100vh - 34px)}.dev .view-title[data-v-6fb0031c]{font-size:16px;font-weight:500;margin-bottom:16px;color:var(--color-text-primary)}.dev .view-container[data-v-6fb0031c]{padding:10px;box-sizing:border-box;border-radius:8px;background:var(--color-body-bg);overflow:auto;height:calc(100vh - 84px)}.dev[data-v-6fb0031c] label{color:var(--color-text-content)}.dev[data-v-6fb0031c] .ant-input{background:var(--color-input-hover);color:var(--color-text-content)}

View File

@ -0,0 +1 @@
.account[data-v-2bc021e6]{box-sizing:border-box;width:100%;overflow-x:hidden;background:var(--color-body-bg);height:calc(100vh - 46px)}.account[data-v-2bc021e6] .ant-result-title{color:var(--color-text-primary)}.account[data-v-2bc021e6] .ant-result-subtitle{color:var(--color-text-desc)}

View File

@ -0,0 +1 @@
:root{--vc-clr-primary:#000;--vc-clr-secondary:rgba(9,15,32,0.4980392156862745);--vc-clr-white:#fff;--vc-icn-width:1.2em;--vc-nav-width:30px;--vc-nav-height:30px;--vc-nav-border-radius:0;--vc-nav-color:var(--vc-clr-primary);--vc-nav-color-hover:var(--vc-clr-secondary);--vc-nav-background:transparent;--vc-pgn-width:12px;--vc-pgn-height:4px;--vc-pgn-margin:4px;--vc-pgn-border-radius:0;--vc-pgn-background-color:var(--vc-clr-secondary);--vc-pgn-active-color:var(--vc-clr-primary)}.carousel__next,.carousel__prev{background:var(--vc-nav-background);border-radius:var(--vc-nav-border-radius);width:var(--vc-nav-width);height:var(--vc-nav-height);text-align:center;font-size:var(--vc-nav-height);padding:0;color:var(--vc-nav-color);display:flex;justify-content:center;align-items:center;position:absolute;border:0;cursor:pointer;margin:0 10px;top:50%;transform:translateY(-50%)}.carousel__next:hover,.carousel__prev:hover{color:var(--vc-nav-color-hover)}.carousel__next--disabled,.carousel__prev--disabled{cursor:not-allowed;opacity:.5}.carousel__prev{left:0}.carousel__next{right:0}.carousel--rtl .carousel__prev{left:auto;right:0}.carousel--rtl .carousel__next{right:auto;left:0}.carousel{position:relative;text-align:center;box-sizing:border-box;touch-action:pan-y;-ms-scroll-chaining:none;overscroll-behavior:none}.carousel.is-dragging{touch-action:none}.carousel *{box-sizing:border-box}.carousel__track{display:flex;padding:0!important;position:relative}.carousel__viewport{overflow:hidden}.carousel__sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.carousel__icon{width:var(--vc-icn-width);height:var(--vc-icn-width);fill:currentColor}.carousel__pagination{display:flex;justify-content:center;list-style:none;line-height:0;margin:10px 0 0}.carousel__pagination-button{display:block;border:0;margin:0;cursor:pointer;padding:var(--vc-pgn-margin);background:transparent}.carousel__pagination-button:after{display:block;content:"";width:var(--vc-pgn-width);height:var(--vc-pgn-height);border-radius:var(--vc-pgn-border-radius);background-color:var(--vc-pgn-background-color)}.carousel__pagination-button--active:after,.carousel__pagination-button:hover:after{background-color:var(--vc-pgn-active-color)}.carousel__slide{scroll-snap-stop:auto;flex-shrink:0;margin:0;position:relative;display:flex;justify-content:center;align-items:center;transform:translateZ(0)}.finder{position:relative;width:100%;overflow-x:hidden;box-sizing:border-box}.finder::-webkit-scrollbar{width:0}.finder .ant-divider-horizontal{margin:17px 0}.carousel__item{cursor:pointer;min-height:180px;width:100%;background-color:var(--vc-clr-primary);color:var(--vc-clr-white);font-size:20px;border-radius:8px;display:flex;justify-content:center;align-items:center}.carousel__track{margin-bottom:0}.carousel__slide{padding-right:6px}.carousel__slide:last-child{padding-left:6px}.carousel__next,.carousel__prev{box-sizing:content-box;border:5px solid #fff}

View File

@ -0,0 +1 @@
.installed[data-v-6aedeb48]{box-sizing:border-box;width:100%;overflow:hidden;height:calc(100vh - 34px)}.installed .view-title[data-v-6aedeb48]{font-size:16px;font-weight:500;margin-bottom:16px;color:var(--color-text-primary)}.installed .view-container[data-v-6aedeb48]{border-radius:8px;background:var(--color-body-bg);overflow:auto;height:calc(100vh - 84px)}.installed[data-v-6aedeb48] .ant-result-title{color:var(--color-text-primary)}.installed[data-v-6aedeb48] .ant-result-subtitle{color:var(--color-text-desc)}.installed .keyword-tag[data-v-6aedeb48]{font-size:13px;margin:4px}.installed .container[data-v-6aedeb48]{box-sizing:border-box;width:100%;overflow:hidden;background:#f3efef;height:100%;display:flex}.installed .installed-list[data-v-6aedeb48]{width:38%;background:var(--color-body-bg);height:100%;padding:10px 0;border-right:1px solid var(--color-border-light);overflow:auto}.installed .installed-list .item[data-v-6aedeb48]{padding:10px 20px;display:flex;align-items:center;color:var(--color-text-content);border-bottom:1px dashed var(--color-border-light);cursor:pointer}.installed .installed-list .item[data-v-6aedeb48]:last-child{border-bottom:none}.installed .installed-list .item img[data-v-6aedeb48]{width:34px;height:34px;margin-right:12px}.installed .installed-list .item .desc[data-v-6aedeb48]{font-size:12px;color:var(--color-text-desc);display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden;-webkit-line-clamp:2;text-overflow:ellipsis}.installed .installed-list .item.active[data-v-6aedeb48]{color:var(--ant-primary-color);background:var(--color-list-hover)}.installed .plugin-detail[data-v-6aedeb48]{padding:20px 20px 0 20px;box-sizing:border-box;width:62%;height:100%;background:var(--color-body-bg)}.installed .plugin-detail .plugin-top[data-v-6aedeb48]{display:flex;align-items:flex-start;justify-content:space-between;border-bottom:1px solid #eee;padding-bottom:12px;margin-bottom:12px}.installed .plugin-detail .plugin-top .title[data-v-6aedeb48]{font-size:16px;display:flex;align-items:center;color:var(--color-text-primary)}.installed .plugin-detail .plugin-top .title .ant-tag[data-v-6aedeb48]{background:var(--color-input-hover);border:1px solid var(--color-border-light);color:var(--color-text-content);margin-left:8px}.installed .plugin-detail .plugin-top .desc[data-v-6aedeb48]{font-size:13px;color:var(--color-text-desc)}.installed .plugin-detail .detail-container[data-v-6aedeb48],.installed .plugin-detail .feature-container[data-v-6aedeb48]{height:380px;overflow:auto;color:var(--color-text-content)}.installed .plugin-detail .detail-container img[data-v-6aedeb48],.installed .plugin-detail .feature-container img[data-v-6aedeb48]{width:100%}.installed .plugin-detail .desc-item[data-v-6aedeb48]{padding:10px 0;color:var(--color-text-content)}.installed .plugin-detail .desc-item .ant-tag[data-v-6aedeb48]{margin-top:6px}.installed .plugin-detail .desc-item .ant-tag.executable[data-v-6aedeb48]{cursor:pointer;color:var(--ant-info-color)}.installed .plugin-detail .desc-item .ant-tag.executable[data-v-6aedeb48]:hover{transform:translateY(-2px)}.installed .plugin-detail .desc-item .desc-title[data-v-6aedeb48]{display:flex;align-items:center;justify-content:space-between}.installed .plugin-detail .desc-item .desc-info[data-v-6aedeb48]{color:var(--color-text-desc)}

View File

@ -0,0 +1 @@
.system{width:100%;overflow-x:hidden;box-sizing:border-box}

View File

@ -0,0 +1 @@
.system{width:100%;overflow-x:hidden;box-sizing:border-box}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>feature</title><link href="css/app.4e3502cb.css" rel="preload" as="style"><link href="css/chunk-vendors.7f9dcb72.css" rel="preload" as="style"><link href="js/app.5fe607e9.js" rel="preload" as="script"><link href="js/chunk-vendors.73a23bae.js" rel="preload" as="script"><link href="css/chunk-vendors.7f9dcb72.css" rel="stylesheet"><link href="css/app.4e3502cb.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but feature doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.73a23bae.js"></script><script src="js/app.5fe607e9.js"></script></body></html>
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>feature</title><link href="css/chunk-111de227.2450c00b.css" rel="prefetch"><link href="css/chunk-15a45f31.f40ad637.css" rel="prefetch"><link href="css/chunk-1af68a6e.2450c00b.css" rel="prefetch"><link href="css/chunk-2ab2dd18.830bb4d6.css" rel="prefetch"><link href="css/chunk-322da6db.cb08d5f6.css" rel="prefetch"><link href="css/chunk-596c6184.9be2495c.css" rel="prefetch"><link href="css/chunk-82ca94ea.b470edf6.css" rel="prefetch"><link href="css/chunk-a1c10494.a43ed20b.css" rel="prefetch"><link href="css/chunk-a2b32e48.67429700.css" rel="prefetch"><link href="css/chunk-ca86664e.dd10748e.css" rel="prefetch"><link href="css/chunk-cf61e458.9be2495c.css" rel="prefetch"><link href="css/chunk-f69c766e.9be2495c.css" rel="prefetch"><link href="js/chunk-111de227.0ad80221.js" rel="prefetch"><link href="js/chunk-15a45f31.36dccd15.js" rel="prefetch"><link href="js/chunk-1af68a6e.c1d36c0f.js" rel="prefetch"><link href="js/chunk-2ab2dd18.69b0e89c.js" rel="prefetch"><link href="js/chunk-322da6db.f9b18700.js" rel="prefetch"><link href="js/chunk-596c6184.83021bf7.js" rel="prefetch"><link href="js/chunk-82ca94ea.71d77dba.js" rel="prefetch"><link href="js/chunk-a1c10494.7497b556.js" rel="prefetch"><link href="js/chunk-a2b32e48.f483e0e9.js" rel="prefetch"><link href="js/chunk-ca86664e.b3dc97d9.js" rel="prefetch"><link href="js/chunk-cf61e458.d98b4577.js" rel="prefetch"><link href="js/chunk-f69c766e.7fe57a21.js" rel="prefetch"><link href="css/app.d8360197.css" rel="preload" as="style"><link href="css/chunk-vendors.7f9dcb72.css" rel="preload" as="style"><link href="js/app.0d80f1c1.js" rel="preload" as="script"><link href="js/chunk-vendors.31673d31.js" rel="preload" as="script"><link href="css/chunk-vendors.7f9dcb72.css" rel="stylesheet"><link href="css/app.d8360197.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but feature doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="js/chunk-vendors.31673d31.js"></script><script src="js/app.0d80f1c1.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-111de227"],{3271:function(t,e,n){},be50:function(t,e,n){"use strict";n.r(e);var c=n("c7eb"),a=n("1da1"),r=(n("d81d"),n("d3b7"),n("159b"),n("b0c0"),n("7a23")),o=n("0eaf"),u=n("be89"),s=n("5502"),b={class:"tools"},i={__name:"tools",setup:function(t){var e=Object(s["b"])(),n=Object(r["j"])((function(){return e.state.totalPlugins})),i=Object(r["Q"])([]);Object(r["D"])(Object(a["a"])(Object(c["a"])().mark((function t(){return Object(c["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,o["a"].getSearchDetail();case 2:i.value=t.sent;case 3:case"end":return t.stop()}}),t)}))));var l=Object(r["j"])((function(){var t=i.value||[];return t.length?t.map((function(t){var e=null;return n.value.forEach((function(n){n.name===t&&(e=n)})),e})):[]}));return function(t,e){return Object(r["L"])(),Object(r["n"])("div",b,[Object(r["bb"])(l)&&Object(r["bb"])(l).length?(Object(r["L"])(),Object(r["l"])(u["a"],{key:0,onDownloadSuccess:t.downloadSuccess,title:t.$t("feature.market.searchTool"),list:Object(r["bb"])(l)},null,8,["onDownloadSuccess","title","list"])):Object(r["m"])("",!0)])}}};n("f1e9");const l=i;e["default"]=l},d81d:function(t,e,n){"use strict";var c=n("23e7"),a=n("b727").map,r=n("1dde"),o=r("map");c({target:"Array",proto:!0,forced:!o},{map:function(t){return a(this,t,arguments.length>1?arguments[1]:void 0)}})},f1e9:function(t,e,n){"use strict";n("3271")}}]);
//# sourceMappingURL=chunk-111de227.0ad80221.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/market/components/tools.vue","webpack:///./src/views/market/components/tools.vue?bbe3","webpack:///./node_modules/core-js/modules/es.array.map.js","webpack:///./src/views/market/components/tools.vue?df38"],"names":["store","useStore","totalPlugins","computed","state","data","ref","onBeforeMount","request","getSearchDetail","value","tools","defaultData","length","map","plugin","searchInfo","forEach","t","name","__exports__","$","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","callbackfn","this","arguments","undefined"],"mappings":"0TAiBA,IAAMA,EAAQC,iBACRC,EAAeC,gBAAS,kBAAMH,EAAMI,MAAMF,gBAE1CG,EAAOC,eAAI,IAEjBC,eAAa,sCAAC,4GACOC,OAAQC,kBADf,OACZJ,EAAKK,MADO,mDAId,IAAMC,EAAQR,gBAAS,WACrB,IAAMS,EAAcP,EAAKK,OAAS,GAClC,OAAKE,EAAYC,OACVD,EAAYE,KAAI,SAACC,GACtB,IAAIC,EAAa,KAMjB,OALAd,EAAaQ,MAAMO,SAAQ,SAACC,GACtBA,EAAEC,OAASJ,IACbC,EAAaE,MAGVF,KARuB,M,0VCvBlC,MAAMI,EAAc,EAEL,gB,kCCNf,IAAIC,EAAI,EAAQ,QACZC,EAAO,EAAQ,QAAgCR,IAC/CS,EAA+B,EAAQ,QAEvCC,EAAsBD,EAA6B,OAKvDF,EAAE,CAAEI,OAAQ,QAASC,OAAO,EAAMC,QAASH,GAAuB,CAChEV,IAAK,SAAac,GAChB,OAAON,EAAKO,KAAMD,EAAYE,UAAUjB,OAAS,EAAIiB,UAAU,QAAKC,O,kCCZxE","file":"js/chunk-111de227.0ad80221.js","sourcesContent":["<template>\n <div class=\"tools\">\n <PluginList\n v-if=\"tools && !!tools.length\"\n @downloadSuccess=\"downloadSuccess\"\n :title=\"$t('feature.market.searchTool')\"\n :list=\"tools\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onBeforeMount } from 'vue';\nimport request from '../../../assets/request/index';\nimport PluginList from './plugin-list.vue';\n\nimport { useStore } from 'vuex';\nconst store = useStore();\nconst totalPlugins = computed(() => store.state.totalPlugins);\n\nconst data = ref([]);\n\nonBeforeMount(async () => {\n data.value = await request.getSearchDetail();\n});\n\nconst tools = computed(() => {\n const defaultData = data.value || [];\n if (!defaultData.length) return [];\n return defaultData.map((plugin) => {\n let searchInfo = null;\n totalPlugins.value.forEach((t) => {\n if (t.name === plugin) {\n searchInfo = t;\n }\n });\n return searchInfo;\n });\n});\n</script>\n\n<style lang=\"less\">\n.worker {\n width: 100%;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n</style>\n","import script from \"./tools.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./tools.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./tools.vue?vue&type=style&index=0&id=6bc47f78&lang=less\"\n\nconst __exports__ = script;\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./tools.vue?vue&type=style&index=0&id=6bc47f78&lang=less\""],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1af68a6e"],{5458:function(e,t,n){"use strict";n.r(t);var c=n("c7eb"),a=n("1da1"),r=(n("d81d"),n("d3b7"),n("159b"),n("b0c0"),n("7a23")),u=n("0eaf"),o=n("be89"),b=n("5502"),i={class:"worker"},s={__name:"worker",setup:function(e){var t=Object(b["b"])(),n=Object(r["j"])((function(){return t.state.totalPlugins})),s=Object(r["Q"])([]);Object(r["D"])(Object(a["a"])(Object(c["a"])().mark((function e(){return Object(c["a"])().wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,u["a"].getWorkerDetail();case 2:s.value=e.sent;case 3:case"end":return e.stop()}}),e)}))));var l=Object(r["j"])((function(){var e=s.value||[];return e.length?e.map((function(e){var t=null;return n.value.forEach((function(n){n.name===e&&(t=n)})),t})):[]}));return function(e,t){return Object(r["L"])(),Object(r["n"])("div",i,[Object(r["bb"])(l)&&Object(r["bb"])(l).length?(Object(r["L"])(),Object(r["l"])(o["a"],{key:0,onDownloadSuccess:e.downloadSuccess,title:e.$t("feature.market.efficiency"),list:Object(r["bb"])(l)},null,8,["onDownloadSuccess","title","list"])):Object(r["m"])("",!0)])}}};n("b63b");const l=s;t["default"]=l},"6a1f":function(e,t,n){},b63b:function(e,t,n){"use strict";n("6a1f")},d81d:function(e,t,n){"use strict";var c=n("23e7"),a=n("b727").map,r=n("1dde"),u=r("map");c({target:"Array",proto:!0,forced:!u},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})}}]);
//# sourceMappingURL=chunk-1af68a6e.c1d36c0f.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/market/components/worker.vue","webpack:///./src/views/market/components/worker.vue?ab7e","webpack:///./src/views/market/components/worker.vue?b4e5","webpack:///./node_modules/core-js/modules/es.array.map.js"],"names":["store","useStore","totalPlugins","computed","state","data","ref","onBeforeMount","request","getWorkerDetail","value","system","defaultData","length","map","plugin","searchInfo","forEach","t","name","__exports__","$","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","callbackfn","this","arguments","undefined"],"mappings":"qSAiBA,IAAMA,EAAQC,iBACRC,EAAeC,gBAAS,kBAAMH,EAAMI,MAAMF,gBAE1CG,EAAOC,eAAI,IAEjBC,eAAa,sCAAC,4GACOC,OAAQC,kBADf,OACZJ,EAAKK,MADO,mDAId,IAAMC,EAASR,gBAAS,WACtB,IAAMS,EAAcP,EAAKK,OAAS,GAClC,OAAKE,EAAYC,OACVD,EAAYE,KAAI,SAACC,GACtB,IAAIC,EAAa,KAMjB,OALAd,EAAaQ,MAAMO,SAAQ,SAACC,GACtBA,EAAEC,OAASJ,IACbC,EAAaE,MAGVF,KARuB,M,0VCvBlC,MAAMI,EAAc,EAEL,gB,2DCPf,W,kCCCA,IAAIC,EAAI,EAAQ,QACZC,EAAO,EAAQ,QAAgCR,IAC/CS,EAA+B,EAAQ,QAEvCC,EAAsBD,EAA6B,OAKvDF,EAAE,CAAEI,OAAQ,QAASC,OAAO,EAAMC,QAASH,GAAuB,CAChEV,IAAK,SAAac,GAChB,OAAON,EAAKO,KAAMD,EAAYE,UAAUjB,OAAS,EAAIiB,UAAU,QAAKC","file":"js/chunk-1af68a6e.c1d36c0f.js","sourcesContent":["<template>\n <div class=\"worker\">\n <PluginList\n v-if=\"system && !!system.length\"\n @downloadSuccess=\"downloadSuccess\"\n :title=\"$t('feature.market.efficiency')\"\n :list=\"system\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onBeforeMount } from 'vue';\nimport request from '../../../assets/request/index';\nimport PluginList from './plugin-list.vue';\n\nimport { useStore } from 'vuex';\nconst store = useStore();\nconst totalPlugins = computed(() => store.state.totalPlugins);\n\nconst data = ref([]);\n\nonBeforeMount(async () => {\n data.value = await request.getWorkerDetail();\n});\n\nconst system = computed(() => {\n const defaultData = data.value || [];\n if (!defaultData.length) return [];\n return defaultData.map((plugin) => {\n let searchInfo = null;\n totalPlugins.value.forEach((t) => {\n if (t.name === plugin) {\n searchInfo = t;\n }\n });\n return searchInfo;\n });\n});\n</script>\n\n<style lang=\"less\">\n.worker {\n width: 100%;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n</style>\n","import script from \"./worker.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./worker.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./worker.vue?vue&type=style&index=0&id=81c5c93e&lang=less\"\n\nconst __exports__ = script;\n\nexport default __exports__","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./worker.vue?vue&type=style&index=0&id=81c5c93e&lang=less\"","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-596c6184"],{"10dc":function(e,t,n){"use strict";n.r(t);var c=n("c7eb"),a=n("1da1"),r=(n("d81d"),n("d3b7"),n("159b"),n("b0c0"),n("7a23")),u=n("0eaf"),o=n("be89"),b=n("5502"),s={class:"system"},i={__name:"devlopment",setup:function(e){var t=Object(b["b"])(),n=Object(r["j"])((function(){return t.state.totalPlugins})),i=Object(r["Q"])([]);Object(r["D"])(Object(a["a"])(Object(c["a"])().mark((function e(){return Object(c["a"])().wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,u["a"].getDevDetail();case 2:i.value=e.sent;case 3:case"end":return e.stop()}}),e)}))));var l=Object(r["j"])((function(){var e=i.value||[];return e.length?e.map((function(e){var t=null;return n.value.forEach((function(n){n.name===e&&(t=n)})),t})):[]}));return function(e,t){return Object(r["L"])(),Object(r["n"])("div",s,[Object(r["bb"])(l)&&Object(r["bb"])(l).length?(Object(r["L"])(),Object(r["l"])(o["a"],{key:0,onDownloadSuccess:e.downloadSuccess,title:e.$t("feature.market.developTool"),list:Object(r["bb"])(l)},null,8,["onDownloadSuccess","title","list"])):Object(r["m"])("",!0)])}}};n("edb3");const l=i;t["default"]=l},b7d6:function(e,t,n){},d81d:function(e,t,n){"use strict";var c=n("23e7"),a=n("b727").map,r=n("1dde"),u=r("map");c({target:"Array",proto:!0,forced:!u},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})},edb3:function(e,t,n){"use strict";n("b7d6")}}]);
//# sourceMappingURL=chunk-596c6184.83021bf7.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/market/components/devlopment.vue","webpack:///./src/views/market/components/devlopment.vue?c17b","webpack:///./node_modules/core-js/modules/es.array.map.js","webpack:///./src/views/market/components/devlopment.vue?3da4"],"names":["store","useStore","totalPlugins","computed","state","data","ref","onBeforeMount","request","getDevDetail","value","dev","defaultData","length","map","plugin","searchInfo","forEach","t","name","__exports__","$","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","callbackfn","this","arguments","undefined"],"mappings":"2SAiBA,IAAMA,EAAQC,iBACRC,EAAeC,gBAAS,kBAAMH,EAAMI,MAAMF,gBAE1CG,EAAOC,eAAI,IAEjBC,eAAa,sCAAC,4GACOC,OAAQC,eADf,OACZJ,EAAKK,MADO,mDAId,IAAMC,EAAMR,gBAAS,WACnB,IAAMS,EAAcP,EAAKK,OAAS,GAClC,OAAKE,EAAYC,OACVD,EAAYE,KAAI,SAACC,GACtB,IAAIC,EAAa,KAMjB,OALAd,EAAaQ,MAAMO,SAAQ,SAACC,GACtBA,EAAEC,OAASJ,IACbC,EAAaE,MAGVF,KARuB,M,2VCvBlC,MAAMI,EAAc,EAEL,gB,yDCNf,IAAIC,EAAI,EAAQ,QACZC,EAAO,EAAQ,QAAgCR,IAC/CS,EAA+B,EAAQ,QAEvCC,EAAsBD,EAA6B,OAKvDF,EAAE,CAAEI,OAAQ,QAASC,OAAO,EAAMC,QAASH,GAAuB,CAChEV,IAAK,SAAac,GAChB,OAAON,EAAKO,KAAMD,EAAYE,UAAUjB,OAAS,EAAIiB,UAAU,QAAKC,O,kCCZxE","file":"js/chunk-596c6184.83021bf7.js","sourcesContent":["<template>\n <div class=\"system\">\n <PluginList\n v-if=\"dev && !!dev.length\"\n @downloadSuccess=\"downloadSuccess\"\n :title=\"$t('feature.market.developTool')\"\n :list=\"dev\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onBeforeMount } from 'vue';\nimport request from '../../../assets/request/index';\nimport PluginList from './plugin-list.vue';\n\nimport { useStore } from 'vuex';\nconst store = useStore();\nconst totalPlugins = computed(() => store.state.totalPlugins);\n\nconst data = ref([]);\n\nonBeforeMount(async () => {\n data.value = await request.getDevDetail();\n});\n\nconst dev = computed(() => {\n const defaultData = data.value || [];\n if (!defaultData.length) return [];\n return defaultData.map((plugin) => {\n let searchInfo = null;\n totalPlugins.value.forEach((t) => {\n if (t.name === plugin) {\n searchInfo = t;\n }\n });\n return searchInfo;\n });\n});\n</script>\n\n<style lang=\"less\">\n.system {\n width: 100%;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n</style>\n","import script from \"./devlopment.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./devlopment.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./devlopment.vue?vue&type=style&index=0&id=fbcc4bb8&lang=less\"\n\nconst __exports__ = script;\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./devlopment.vue?vue&type=style&index=0&id=fbcc4bb8&lang=less\""],"sourceRoot":""}

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-82ca94ea"],{"44e73":function(e,t,n){"use strict";n.r(t);var a=n("c7eb"),c=n("1da1"),u=(n("b0c0"),n("7a23")),r=n("f64c"),i=n("47e2"),l={class:"dev"},s={class:"view-title"},o={class:"view-container"},b={__name:"index",setup:function(e){var t=Object(i["b"])(),n=t.t,b=Object(u["Q"])(),f=Object(u["P"])({name:void 0}),d={name:{required:!0,message:"Please input name"}},j=function(){b.value.validate().then((function(){O(f.name)}))},p=Object(u["Q"])(!1),O=function(){var e=Object(c["a"])(Object(a["a"])().mark((function e(t){return Object(a["a"])().wrap((function(e){while(1)switch(e.prev=e.next){case 0:return p.value=!0,e.next=3,window.market.downloadPlugin({name:t,isDev:!0});case 3:r["a"].success(n("feature.dev.installSuccess",{pluginName:t})),p.value=!1;case 5:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}(),m=function(){b.value.validate().then((function(){window.market.refreshPlugin({name:f.name}),r["a"].success(n("feature.dev.refreshSuccess",{pluginName:f.name}))}))},v={span:4},g={span:14};return function(e,t){var n=Object(u["U"])("a-alert"),a=Object(u["U"])("a-input"),c=Object(u["U"])("a-form-item"),r=Object(u["U"])("a-button"),i=Object(u["U"])("a-form");return Object(u["L"])(),Object(u["n"])("div",l,[Object(u["o"])("div",s,Object(u["X"])(e.$t("feature.dev.title")),1),Object(u["o"])("div",o,[Object(u["q"])(n,{style:{"margin-bottom":"40px"},message:e.$t("feature.dev.tips"),type:"warning"},null,8,["message"]),Object(u["q"])(i,{ref_key:"formRef",ref:b,model:f,rules:d,"label-col":v,"wrapper-col":g},{default:Object(u["gb"])((function(){return[Object(u["q"])(c,{label:e.$t("feature.dev.pluginName"),name:"name"},{default:Object(u["gb"])((function(){return[Object(u["q"])(a,{value:f.name,"onUpdate:value":t[0]||(t[0]=function(e){return f.name=e})},null,8,["value"])]})),_:1},8,["label"]),Object(u["q"])(c,{"wrapper-col":{span:14,offset:4}},{default:Object(u["gb"])((function(){return[Object(u["q"])(r,{loading:p.value,type:"primary",onClick:j},{default:Object(u["gb"])((function(){return[Object(u["p"])(Object(u["X"])(e.$t("feature.dev.install")),1)]})),_:1},8,["loading"]),Object(u["q"])(r,{onClick:m,style:{"margin-left":"10px"}},{default:Object(u["gb"])((function(){return[Object(u["p"])(Object(u["X"])(e.$t("feature.dev.refreshPlugins")),1)]})),_:1})]})),_:1})]})),_:1},8,["model"])])])}}},f=(n("ef18"),n("6b0d")),d=n.n(f);const j=d()(b,[["__scopeId","data-v-6fb0031c"]]);t["default"]=j},ef18:function(e,t,n){"use strict";n("f44a")},f44a:function(e,t,n){}}]);
//# sourceMappingURL=chunk-82ca94ea.71d77dba.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/dev/index.vue","webpack:///./src/views/dev/index.vue?465d","webpack:///./src/views/dev/index.vue?35c7"],"names":["useI18n","t","formRef","ref","formState","reactive","name","undefined","rules","required","message","onSubmit","value","validate","then","downloadPlugin","loading","pluginName","window","market","isDev","success","refresh","refreshPlugin","labelCol","span","wrapperCol","__exports__"],"mappings":"4SAqCA,MAAcA,iBAANC,EAAR,EAAQA,EAEFC,EAAUC,iBACVC,EAAYC,eAAS,CACzBC,UAAMC,IAEFC,EAAQ,CACZF,KAAM,CACJG,UAAU,EACVC,QAAS,sBAGPC,EAAW,WACfT,EAAQU,MAAMC,WAAWC,MAAK,WAC5BC,EAAeX,EAAUE,UAIvBU,EAAUb,gBAAI,GACdY,EAAc,uDAAG,WAAOE,GAAP,sFACrBD,EAAQJ,OAAQ,EADK,SAEfM,OAAOC,OAAOJ,eAAe,CACjCT,KAAMW,EACNG,OAAO,IAJY,OAMrBV,OAAQW,QAAQpB,EAAE,6BAA8B,CAAEgB,WAAYA,KAC9DD,EAAQJ,OAAQ,EAPK,2CAAH,sDAUdU,EAAU,WACdpB,EAAQU,MAAMC,WAAWC,MAAK,WAC5BI,OAAOC,OAAOI,cAAc,CAC1BjB,KAAMF,EAAUE,OAElBI,OAAQW,QACNpB,EAAE,6BAA8B,CAAEgB,WAAYb,EAAUE,YAKxDkB,EAAW,CAAEC,KAAM,GACnBC,EAAa,CAAED,KAAM,I,8zCCxE3B,MAAME,EAA2B,IAAgB,EAAQ,CAAC,CAAC,YAAY,qBAExD,gB,kCCRf,W","file":"js/chunk-82ca94ea.71d77dba.js","sourcesContent":["<template>\n <div class=\"dev\">\n <div class=\"view-title\">{{ $t('feature.dev.title') }}</div>\n <div class=\"view-container\">\n <a-alert\n style=\"margin-bottom: 40px\"\n :message=\"$t('feature.dev.tips')\"\n type=\"warning\"\n />\n <a-form\n ref=\"formRef\"\n :model=\"formState\"\n :rules=\"rules\"\n :label-col=\"labelCol\"\n :wrapper-col=\"wrapperCol\"\n >\n <a-form-item :label=\"$t('feature.dev.pluginName')\" name=\"name\">\n <a-input v-model:value=\"formState.name\" />\n </a-form-item>\n \n <a-form-item :wrapper-col=\"{ span: 14, offset: 4 }\">\n <a-button :loading=\"loading\" type=\"primary\" @click=\"onSubmit\">\n {{ $t('feature.dev.install') }}\n </a-button>\n <a-button @click=\"refresh\" style=\"margin-left: 10px\">\n {{ $t('feature.dev.refreshPlugins') }}\n </a-button>\n </a-form-item>\n </a-form>\n </div>\n </div>\n</template>\n\n<script setup>\nimport { reactive, ref } from 'vue';\nimport { message } from 'ant-design-vue';\nimport { useI18n } from 'vue-i18n';\nconst { t } = useI18n();\n\nconst formRef = ref();\nconst formState = reactive({\n name: undefined,\n});\nconst rules = {\n name: {\n required: true,\n message: 'Please input name',\n },\n};\nconst onSubmit = () => {\n formRef.value.validate().then(() => {\n downloadPlugin(formState.name);\n });\n};\n\nconst loading = ref(false);\nconst downloadPlugin = async (pluginName) => {\n loading.value = true;\n await window.market.downloadPlugin({\n name: pluginName,\n isDev: true,\n });\n message.success(t('feature.dev.installSuccess', { pluginName: pluginName }));\n loading.value = false;\n};\n\nconst refresh = () => {\n formRef.value.validate().then(() => {\n window.market.refreshPlugin({\n name: formState.name,\n });\n message.success(\n t('feature.dev.refreshSuccess', { pluginName: formState.name })\n );\n });\n};\n\nconst labelCol = { span: 4 };\nconst wrapperCol = { span: 14 };\n</script>\n\n<style lang=\"less\" scoped>\n.dev {\n box-sizing: border-box;\n width: 100%;\n overflow-x: hidden;\n height: calc(~'100vh - 34px');\n .view-title {\n font-size: 16px;\n font-weight: 500;\n margin-bottom: 16px;\n color: var(--color-text-primary);\n }\n .view-container {\n padding: 10px;\n box-sizing: border-box;\n border-radius: 8px;\n background: var(--color-body-bg);\n overflow: auto;\n height: calc(~'100vh - 84px');\n }\n :deep(label) {\n color: var(--color-text-content);\n }\n :deep(.ant-input) {\n background: var(--color-input-hover);\n color: var(--color-text-content);\n }\n}\n</style>\n","import script from \"./index.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./index.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./index.vue?vue&type=style&index=0&id=6fb0031c&lang=less&scoped=true\"\n\nimport exportComponent from \"/Users/muwoo/rubick-wks/rubick/feature/node_modules/vue-loader-v16/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-6fb0031c\"]])\n\nexport default __exports__","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./index.vue?vue&type=style&index=0&id=6fb0031c&lang=less&scoped=true\""],"sourceRoot":""}

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-a1c10494"],{"3e1f":function(e,t,n){"use strict";n.r(t);var c=n("7a23"),r=n("e1bd"),a=n("f64c"),u=n("f5e0"),s={class:"account"},i=["src"],o={__name:"index",setup:function(e){var t=Object(c["Q"])(window.rubick.dbStorage.getItem("rubick-user-info")),n=Object(c["Q"])(""),o=Object(r["a"])(),b=Object(c["Q"])(!1),l=function(){b.value=!0,n.value||t.value||u["a"].getScanCode({scene:o}).then((function(e){n.value="data:image/png;base64,".concat(e.dataUrl)}))},d=null;return Object(c["eb"])([b],(function(){b.value?d=setInterval((function(){u["a"].checkLoginStatus({scene:o}).then((function(e){console.log(e),e.openId&&(window.rubick.dbStorage.setItem("rubick-user-info",e),t.value=e,a["a"].success("登录成功!"),b.value=!1,clearInterval(d),d=null)}))}),2e3):(clearInterval(d),d=null)})),function(e,r){var a=Object(c["U"])("a-button"),u=Object(c["U"])("a-result"),o=Object(c["U"])("a-modal");return Object(c["L"])(),Object(c["n"])("div",s,[t.value?Object(c["m"])("",!0):(Object(c["L"])(),Object(c["l"])(u,{key:0,title:"请先登录","sub-title":"用户暂未登录,无法体验更多设置"},{extra:Object(c["gb"])((function(){return[Object(c["q"])(a,{onClick:l,type:"primary"},{default:Object(c["gb"])((function(){return[Object(c["p"])(" 使用微信小程序登录 ")]})),_:1})]})),_:1})),Object(c["q"])(o,{footer:null,visible:b.value,"onUpdate:visible":r[0]||(r[0]=function(e){return b.value=e})},{default:Object(c["gb"])((function(){return[Object(c["q"])(u,{title:"请使用微信扫码登录!","sub-title":"使用微信扫描上面的 rubick 小程序二维码进行授权登录"},{icon:Object(c["gb"])((function(){return[Object(c["o"])("img",{width:"200",src:n.value},null,8,i)]})),_:1})]})),_:1},8,["visible"])])}}},b=(n("7251"),n("6b0d")),l=n.n(b);const d=l()(o,[["__scopeId","data-v-2bc021e6"]]);t["default"]=d},7251:function(e,t,n){"use strict";n("9d3e")},"9d3e":function(e,t,n){},e1bd:function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));let c=(e=21)=>crypto.getRandomValues(new Uint8Array(e)).reduce((e,t)=>(t&=63,e+=t<36?t.toString(36):t<62?(t-26).toString(36).toUpperCase():t>62?"-":"_",e),"")},f5e0:function(e,t,n){"use strict";var c=n("c7eb"),r=n("1da1"),a=n("bc3a"),u=n.n(a),s=u.a.create({baseURL:"https://rubick.vip/api/"});t["a"]={getScanCode:function(e){return Object(r["a"])(Object(c["a"])().mark((function t(){var n,r;return Object(c["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.scene,t.next=3,s.get("/users/getScanCode",{params:{scene:n}});case 3:return r=t.sent,t.abrupt("return",r.data);case 5:case"end":return t.stop()}}),t)})))()},checkLoginStatus:function(e){return Object(r["a"])(Object(c["a"])().mark((function t(){var n,r;return Object(c["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.scene,t.next=3,s.post("/users/checkLoginStatus",{scene:n});case 3:return r=t.sent,t.abrupt("return",r.data);case 5:case"end":return t.stop()}}),t)})))()},getUserInfo:function(e){return Object(r["a"])(Object(c["a"])().mark((function t(){var n,r;return Object(c["a"])().wrap((function(t){while(1)switch(t.prev=t.next){case 0:return n=e.openId,t.next=3,s.post("/users/getUserInfo",{openId:n});case 3:return r=t.sent,t.abrupt("return",r.data);case 5:case"end":return t.stop()}}),t)})))()}}}}]);
//# sourceMappingURL=chunk-a1c10494.7497b556.js.map

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-cf61e458"],{"166f":function(e,t,n){},"5e94":function(e,t,n){"use strict";n("166f")},b805:function(e,t,n){"use strict";n.r(t);var c=n("c7eb"),a=n("1da1"),r=(n("d81d"),n("d3b7"),n("159b"),n("b0c0"),n("7a23")),u=n("0eaf"),o=n("be89"),s=n("5502"),b={class:"system"},i={__name:"image",setup:function(e){var t=Object(s["b"])(),n=Object(r["j"])((function(){return t.state.totalPlugins})),i=Object(r["Q"])([]);Object(r["D"])(Object(a["a"])(Object(c["a"])().mark((function e(){return Object(c["a"])().wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,u["a"].getImageDetail();case 2:i.value=e.sent;case 3:case"end":return e.stop()}}),e)}))));var l=Object(r["j"])((function(){var e=i.value||[];return e.length?e.map((function(e){var t=null;return n.value.forEach((function(n){n.name===e&&(t=n)})),t})):[]}));return function(e,t){return Object(r["L"])(),Object(r["n"])("div",b,[Object(r["bb"])(l)&&Object(r["bb"])(l).length?(Object(r["L"])(),Object(r["l"])(o["a"],{key:0,onDownloadSuccess:e.downloadSuccess,title:e.$t("feature.market.imageTool"),list:Object(r["bb"])(l)},null,8,["onDownloadSuccess","title","list"])):Object(r["m"])("",!0)])}}};n("5e94");const l=i;t["default"]=l},d81d:function(e,t,n){"use strict";var c=n("23e7"),a=n("b727").map,r=n("1dde"),u=r("map");c({target:"Array",proto:!0,forced:!u},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})}}]);
//# sourceMappingURL=chunk-cf61e458.d98b4577.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/market/components/image.vue?4c36","webpack:///./src/views/market/components/image.vue","webpack:///./src/views/market/components/image.vue?eb79","webpack:///./node_modules/core-js/modules/es.array.map.js"],"names":["store","useStore","totalPlugins","computed","state","data","ref","onBeforeMount","request","getImageDetail","value","system","defaultData","length","map","plugin","searchInfo","forEach","t","name","__exports__","$","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","callbackfn","this","arguments","undefined"],"mappings":"2IAAA,W,sNCiBA,IAAMA,EAAQC,iBACRC,EAAeC,gBAAS,kBAAMH,EAAMI,MAAMF,gBAE1CG,EAAOC,eAAI,IAEjBC,eAAa,sCAAC,4GACOC,OAAQC,iBADf,OACZJ,EAAKK,MADO,mDAId,IAAMC,EAASR,gBAAS,WACtB,IAAMS,EAAcP,EAAKK,OAAS,GAClC,OAAKE,EAAYC,OACVD,EAAYE,KAAI,SAACC,GACtB,IAAIC,EAAa,KAMjB,OALAd,EAAaQ,MAAMO,SAAQ,SAACC,GACtBA,EAAEC,OAASJ,IACbC,EAAaE,MAGVF,KARuB,M,yVCvBlC,MAAMI,EAAc,EAEL,gB,kCCNf,IAAIC,EAAI,EAAQ,QACZC,EAAO,EAAQ,QAAgCR,IAC/CS,EAA+B,EAAQ,QAEvCC,EAAsBD,EAA6B,OAKvDF,EAAE,CAAEI,OAAQ,QAASC,OAAO,EAAMC,QAASH,GAAuB,CAChEV,IAAK,SAAac,GAChB,OAAON,EAAKO,KAAMD,EAAYE,UAAUjB,OAAS,EAAIiB,UAAU,QAAKC","file":"js/chunk-cf61e458.d98b4577.js","sourcesContent":["export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./image.vue?vue&type=style&index=0&id=02d11799&lang=less\"","<template>\n <div class=\"system\">\n <PluginList\n v-if=\"system && !!system.length\"\n @downloadSuccess=\"downloadSuccess\"\n :title=\"$t('feature.market.imageTool')\"\n :list=\"system\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onBeforeMount } from 'vue';\nimport request from '../../../assets/request/index';\nimport PluginList from './plugin-list.vue';\n\nimport { useStore } from 'vuex';\nconst store = useStore();\nconst totalPlugins = computed(() => store.state.totalPlugins);\n\nconst data = ref([]);\n\nonBeforeMount(async () => {\n data.value = await request.getImageDetail();\n});\n\nconst system = computed(() => {\n const defaultData = data.value || [];\n if (!defaultData.length) return [];\n return defaultData.map((plugin) => {\n let searchInfo = null;\n totalPlugins.value.forEach((t) => {\n if (t.name === plugin) {\n searchInfo = t;\n }\n });\n return searchInfo;\n });\n});\n</script>\n\n<style lang=\"less\">\n.system {\n width: 100%;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n</style>\n","import script from \"./image.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./image.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./image.vue?vue&type=style&index=0&id=02d11799&lang=less\"\n\nconst __exports__ = script;\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n"],"sourceRoot":""}

View File

@ -0,0 +1,2 @@
(window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-f69c766e"],{2957:function(e,t,n){"use strict";n("aed9e")},"83d4":function(e,t,n){"use strict";n.r(t);var c=n("c7eb"),a=n("1da1"),r=(n("d81d"),n("d3b7"),n("159b"),n("b0c0"),n("7a23")),u=n("0eaf"),s=n("be89"),o=n("5502"),b={class:"system"},i={__name:"system",setup:function(e){var t=Object(o["b"])(),n=Object(r["j"])((function(){return t.state.totalPlugins})),i=Object(r["Q"])([]);Object(r["D"])(Object(a["a"])(Object(c["a"])().mark((function e(){return Object(c["a"])().wrap((function(e){while(1)switch(e.prev=e.next){case 0:return e.next=2,u["a"].getSystemDetail();case 2:i.value=e.sent;case 3:case"end":return e.stop()}}),e)}))));var l=Object(r["j"])((function(){var e=i.value||[];return e.length?e.map((function(e){var t=null;return n.value.forEach((function(n){n.name===e&&(t=n)})),t})):[]}));return function(e,t){return Object(r["L"])(),Object(r["n"])("div",b,[Object(r["bb"])(l)&&Object(r["bb"])(l).length?(Object(r["L"])(),Object(r["l"])(s["a"],{key:0,onDownloadSuccess:e.downloadSuccess,title:e.$t("feature.market.systemTool"),list:Object(r["bb"])(l)},null,8,["onDownloadSuccess","title","list"])):Object(r["m"])("",!0)])}}};n("2957");const l=i;t["default"]=l},aed9e:function(e,t,n){},d81d:function(e,t,n){"use strict";var c=n("23e7"),a=n("b727").map,r=n("1dde"),u=r("map");c({target:"Array",proto:!0,forced:!u},{map:function(e){return a(this,e,arguments.length>1?arguments[1]:void 0)}})}}]);
//# sourceMappingURL=chunk-f69c766e.7fe57a21.js.map

View File

@ -0,0 +1 @@
{"version":3,"sources":["webpack:///./src/views/market/components/system.vue?d800","webpack:///./src/views/market/components/system.vue","webpack:///./src/views/market/components/system.vue?ea4f","webpack:///./node_modules/core-js/modules/es.array.map.js"],"names":["store","useStore","totalPlugins","computed","state","data","ref","onBeforeMount","request","getSystemDetail","value","system","defaultData","length","map","plugin","searchInfo","forEach","t","name","__exports__","$","$map","arrayMethodHasSpeciesSupport","HAS_SPECIES_SUPPORT","target","proto","forced","callbackfn","this","arguments","undefined"],"mappings":"gHAAA,Y,yNCiBA,IAAMA,EAAQC,iBACRC,EAAeC,gBAAS,kBAAMH,EAAMI,MAAMF,gBAE1CG,EAAOC,eAAI,IAEjBC,eAAa,sCAAC,4GACOC,OAAQC,kBADf,OACZJ,EAAKK,MADO,mDAId,IAAMC,EAASR,gBAAS,WACtB,IAAMS,EAAcP,EAAKK,OAAS,GAClC,OAAKE,EAAYC,OACVD,EAAYE,KAAI,SAACC,GACtB,IAAIC,EAAa,KAMjB,OALAd,EAAaQ,MAAMO,SAAQ,SAACC,GACtBA,EAAEC,OAASJ,IACbC,EAAaE,MAGVF,KARuB,M,0VCvBlC,MAAMI,EAAc,EAEL,gB,0DCNf,IAAIC,EAAI,EAAQ,QACZC,EAAO,EAAQ,QAAgCR,IAC/CS,EAA+B,EAAQ,QAEvCC,EAAsBD,EAA6B,OAKvDF,EAAE,CAAEI,OAAQ,QAASC,OAAO,EAAMC,QAASH,GAAuB,CAChEV,IAAK,SAAac,GAChB,OAAON,EAAKO,KAAMD,EAAYE,UAAUjB,OAAS,EAAIiB,UAAU,QAAKC","file":"js/chunk-f69c766e.7fe57a21.js","sourcesContent":["export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--11-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--11-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--11-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--11-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--1-1!./system.vue?vue&type=style&index=0&id=48de9761&lang=less\"","<template>\n <div class=\"system\">\n <PluginList\n v-if=\"system && !!system.length\"\n @downloadSuccess=\"downloadSuccess\"\n :title=\"$t('feature.market.systemTool')\"\n :list=\"system\"\n />\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onBeforeMount } from 'vue';\nimport request from '../../../assets/request/index';\nimport PluginList from './plugin-list.vue';\n\nimport { useStore } from 'vuex';\nconst store = useStore();\nconst totalPlugins = computed(() => store.state.totalPlugins);\n\nconst data = ref([]);\n\nonBeforeMount(async () => {\n data.value = await request.getSystemDetail();\n});\n\nconst system = computed(() => {\n const defaultData = data.value || [];\n if (!defaultData.length) return [];\n return defaultData.map((plugin) => {\n let searchInfo = null;\n totalPlugins.value.forEach((t) => {\n if (t.name === plugin) {\n searchInfo = t;\n }\n });\n return searchInfo;\n });\n});\n</script>\n\n<style lang=\"less\">\n.system {\n width: 100%;\n overflow-x: hidden;\n box-sizing: border-box;\n}\n</style>\n","import script from \"./system.vue?vue&type=script&setup=true&lang=js\"\nexport * from \"./system.vue?vue&type=script&setup=true&lang=js\"\n\nimport \"./system.vue?vue&type=style&index=0&id=48de9761&lang=less\"\n\nconst __exports__ = script;\n\nexport default __exports__","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\n// `Array.prototype.map` method\n// https://tc39.es/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n"],"sourceRoot":""}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -9,7 +9,7 @@
"pluginType": "ui",
"features": [
{
"code": "market",
"code": "finder",
"explain": "插件市场",
"cmds":[
"插件市场"

View File

@ -36,4 +36,11 @@ window.market = {
removeLocalStartPlugin(plugin) {
ipcSend('removeLocalStartPlugin', { plugin });
},
dbDump(target) {
ipcSend('dbDump', { target });
},
dbImport(target) {
ipcSend('dbImport', { target });
},
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

13
public/installer.nsh Normal file
View File

@ -0,0 +1,13 @@
!macro customInstall
SetRegView 64
WriteRegStr HKCR "*\shell\rubick" "" "open w&ith rubick"
WriteRegStr HKCR "*\shell\rubick" "Icon" "$INSTDIR\rubick.exe"
WriteRegStr HKCR "*\shell\rubick\command" "" '"$INSTDIR\rubick.exe" "search" "%1"'
SetRegView 32
WriteRegStr HKCR "*\shell\rubick" "" "open w&ith rubick"
WriteRegStr HKCR "*\shell\rubick" "Icon" "$INSTDIR\rubick.exe"
WriteRegStr HKCR "*\shell\rubick\command" "" '"$INSTDIR\rubick.exe" "search" "%1"'
!macroend
!macro customUninstall
DeleteRegKey HKCR "*\shell\rubick"
!macroend

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSServices</key>
<array>
<dict>
<key>NSBackgroundColorName</key>
<string>background</string>
<key>NSIconName</key>
<string>NSTouchBarSend</string>
<key>NSMenuItem</key>
<dict>
<key>default</key>
<string>rubick 打开</string>
</dict>
<key>NSMessage</key>
<string>runWorkflowAsService</string>
<key>NSRequiredContext</key>
<dict>
<key>NSApplicationIdentifier</key>
<string>com.apple.finder</string>
</dict>
<key>NSSendFileTypes</key>
<array>
<string>public.item</string>
</array>
</dict>
</array>
</dict>
</plist>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AMApplicationBuild</key>
<string>512</string>
<key>AMApplicationVersion</key>
<string>2.10</string>
<key>AMDocumentVersion</key>
<string>2</string>
<key>actions</key>
<array>
<dict>
<key>action</key>
<dict>
<key>AMAccepts</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Optional</key>
<true/>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>AMActionVersion</key>
<string>2.0.3</string>
<key>AMApplication</key>
<array>
<string>自动操作</string>
</array>
<key>AMParameterProperties</key>
<dict>
<key>COMMAND_STRING</key>
<dict/>
<key>CheckedForUserDefaultShell</key>
<dict/>
<key>inputMethod</key>
<dict/>
<key>shell</key>
<dict/>
<key>source</key>
<dict/>
</dict>
<key>AMProvides</key>
<dict>
<key>Container</key>
<string>List</string>
<key>Types</key>
<array>
<string>com.apple.cocoa.string</string>
</array>
</dict>
<key>ActionBundlePath</key>
<string>/System/Library/Automator/Run Shell Script.action</string>
<key>ActionName</key>
<string>运行Shell脚本</string>
<key>ActionParameters</key>
<dict>
<key>COMMAND_STRING</key>
<string>/Applications/rubick.app/Contents/MacOS/rubick search "$@" &gt; /dev/null 2&gt;&amp;1 &amp;</string>
<key>CheckedForUserDefaultShell</key>
<true/>
<key>inputMethod</key>
<integer>1</integer>
<key>shell</key>
<string>/bin/bash</string>
<key>source</key>
<string></string>
</dict>
<key>BundleIdentifier</key>
<string>com.apple.RunShellScript</string>
<key>CFBundleVersion</key>
<string>2.0.3</string>
<key>CanShowSelectedItemsWhenRun</key>
<false/>
<key>CanShowWhenRun</key>
<true/>
<key>Category</key>
<array>
<string>AMCategoryUtilities</string>
</array>
<key>Class Name</key>
<string>RunShellScriptAction</string>
<key>InputUUID</key>
<string>7E11290E-3E3F-4D65-988B-3E2A8B597EEF</string>
<key>Keywords</key>
<array>
<string>Shell</string>
<string>脚本</string>
<string>命令</string>
<string>运行</string>
<string>Unix</string>
</array>
<key>OutputUUID</key>
<string>475C56B3-F23A-4D39-BB41-4B00F76B096B</string>
<key>UUID</key>
<string>BBBABDAB-D65B-41BF-B1EB-03ACA5AF4714</string>
<key>UnlocalizedApplications</key>
<array>
<string>Automator</string>
</array>
<key>arguments</key>
<dict>
<key>0</key>
<dict>
<key>default value</key>
<integer>0</integer>
<key>name</key>
<string>inputMethod</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>0</string>
</dict>
<key>1</key>
<dict>
<key>default value</key>
<false/>
<key>name</key>
<string>CheckedForUserDefaultShell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>1</string>
</dict>
<key>2</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>source</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>2</string>
</dict>
<key>3</key>
<dict>
<key>default value</key>
<string></string>
<key>name</key>
<string>COMMAND_STRING</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>3</string>
</dict>
<key>4</key>
<dict>
<key>default value</key>
<string>/bin/sh</string>
<key>name</key>
<string>shell</string>
<key>required</key>
<string>0</string>
<key>type</key>
<string>0</string>
<key>uuid</key>
<string>4</string>
</dict>
</dict>
<key>isViewVisible</key>
<integer>1</integer>
<key>location</key>
<string>309.000000:305.000000</string>
<key>nibPath</key>
<string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
</dict>
<key>isViewVisible</key>
<integer>1</integer>
</dict>
</array>
<key>connectors</key>
<dict/>
<key>workflowMetaData</key>
<dict>
<key>applicationBundleID</key>
<string>com.apple.finder</string>
<key>applicationBundleIDsByPath</key>
<dict>
<key>/System/Library/CoreServices/Finder.app</key>
<string>com.apple.finder</string>
</dict>
<key>applicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>applicationPaths</key>
<array>
<string>/System/Library/CoreServices/Finder.app</string>
</array>
<key>inputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject</string>
<key>outputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>presentationMode</key>
<integer>15</integer>
<key>processesInput</key>
<false/>
<key>serviceApplicationBundleID</key>
<string>com.apple.finder</string>
<key>serviceApplicationPath</key>
<string>/System/Library/CoreServices/Finder.app</string>
<key>serviceInputTypeIdentifier</key>
<string>com.apple.Automator.fileSystemObject</string>
<key>serviceOutputTypeIdentifier</key>
<string>com.apple.Automator.nothing</string>
<key>serviceProcessesInput</key>
<false/>
<key>systemImageName</key>
<string>NSTouchBarSend</string>
<key>useAutomaticInputType</key>
<false/>
<key>workflowTypeIdentifier</key>
<string>com.apple.Automator.servicesMenu</string>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,2 @@
export const WINDOW_WIDTH = 688;
export const WINDOW_HEIGHT = 60;

Some files were not shown because too many files have changed in this diff Show More