代码格式调整:*.vue
parent
edb9f0325b
commit
572caf0be7
|
@ -45,7 +45,7 @@ const NodePlugin = function (context) {
|
||||||
|
|
||||||
const cmds = []
|
const cmds = []
|
||||||
for (const item of list) {
|
for (const item of list) {
|
||||||
if (item.value != null && item.value.length > 0 && item.value !== 'null') {
|
if (item.value != null && item.value.length > 0 && item.value !== 'default') {
|
||||||
cmds.push(`${command} config set ${item.key} ${item.value}`)
|
cmds.push(`${command} config set ${item.key} ${item.value}`)
|
||||||
} else {
|
} else {
|
||||||
cmds.push(`${command} config delete ${item.key}`)
|
cmds.push(`${command} config delete ${item.key}`)
|
||||||
|
@ -68,7 +68,7 @@ const NodePlugin = function (context) {
|
||||||
const cmds = []
|
const cmds = []
|
||||||
log.debug('yarn set:', JSON.stringify(list))
|
log.debug('yarn set:', JSON.stringify(list))
|
||||||
for (const item of list) {
|
for (const item of list) {
|
||||||
if (item.value != null && item.value.length > 0 && item.value !== 'null') {
|
if (item.value != null && item.value.length > 0 && item.value !== 'default') {
|
||||||
cmds.push(`yarn config set ${item.key} ${item.value}`)
|
cmds.push(`yarn config set ${item.key} ${item.value}`)
|
||||||
} else {
|
} else {
|
||||||
cmds.push(`yarn config delete ${item.key}`)
|
cmds.push(`yarn config delete ${item.key}`)
|
||||||
|
|
|
@ -155,7 +155,7 @@ function install (app, api) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
||||||
<hr/>
|
<hr>
|
||||||
<pre style="max-height:350px;font-family:auto">
|
<pre style="max-height:350px;font-family:auto">
|
||||||
{releaseNotes}
|
{releaseNotes}
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -201,7 +201,7 @@ function install (app, api) {
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
||||||
<hr/>
|
<hr>
|
||||||
<pre style="max-height:350px;font-family:auto">
|
<pre style="max-height:350px;font-family:auto">
|
||||||
{releaseNotes}
|
{releaseNotes}
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -1,49 +1,7 @@
|
||||||
<template>
|
|
||||||
<a-config-provider :locale="locale">
|
|
||||||
<div class="ds_layout" :class="themeClass">
|
|
||||||
<a-layout>
|
|
||||||
<a-layout-sider :theme="theme">
|
|
||||||
<div class="logo"></div>
|
|
||||||
<div class="aside">
|
|
||||||
<a-menu
|
|
||||||
mode="inline"
|
|
||||||
:defaultSelectedKeys="[$route.fullPath]"
|
|
||||||
:defaultOpenKeys="['/plugin']"
|
|
||||||
>
|
|
||||||
<template v-for="(item) of menus">
|
|
||||||
<a-sub-menu v-if="item.children && item.children.length>0" :key="item.path" @titleClick="titleClick(item)">
|
|
||||||
<span slot="title"><a-icon :type="item.icon?item.icon:'file'"/><span>{{item.title}}</span></span>
|
|
||||||
<a-menu-item v-for="(sub) of item.children" :key="sub.path" @click="menuClick(sub)">
|
|
||||||
<a-icon :type="sub.icon?sub.icon:'file'"/> {{ sub.title }}
|
|
||||||
</a-menu-item>
|
|
||||||
</a-sub-menu>
|
|
||||||
<a-menu-item v-else :key="item.path" @click="menuClick(item)">
|
|
||||||
<a-icon :type="item.icon?item.icon:'file'"/>
|
|
||||||
<span class="nav-text">{{ item.title }}</span>
|
|
||||||
</a-menu-item>
|
|
||||||
</template>
|
|
||||||
</a-menu>
|
|
||||||
</div>
|
|
||||||
</a-layout-sider>
|
|
||||||
<a-layout>
|
|
||||||
<!-- <a-layout-header>Header</a-layout-header>-->
|
|
||||||
<a-layout-content>
|
|
||||||
<router-view></router-view>
|
|
||||||
</a-layout-content>
|
|
||||||
<a-layout-footer>
|
|
||||||
<div class="footer">
|
|
||||||
©2020-2024 docmirror.cn by Greper, WangLiang <span>{{info.version}}</span>
|
|
||||||
</div>
|
|
||||||
</a-layout-footer>
|
|
||||||
</a-layout>
|
|
||||||
</a-layout>
|
|
||||||
</div>
|
|
||||||
</a-config-provider>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import createMenus from '@/view/router/menu'
|
import createMenus from '@/view/router/menu'
|
||||||
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
|
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'App',
|
name: 'App',
|
||||||
components: {
|
components: {
|
||||||
|
@ -53,12 +11,12 @@ export default {
|
||||||
locale: zhCN,
|
locale: zhCN,
|
||||||
info: {},
|
info: {},
|
||||||
menus: undefined,
|
menus: undefined,
|
||||||
config: undefined
|
config: undefined,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
themeClass () {
|
themeClass () {
|
||||||
return 'theme-' + this.config.app.theme
|
return `theme-${this.config.app.theme}`
|
||||||
},
|
},
|
||||||
theme () {
|
theme () {
|
||||||
return this.config.app.theme
|
return this.config.app.theme
|
||||||
|
@ -67,7 +25,7 @@ export default {
|
||||||
created () {
|
created () {
|
||||||
this.menus = createMenus(this)
|
this.menus = createMenus(this)
|
||||||
this.config = this.$global.config
|
this.config = this.$global.config
|
||||||
this.$api.info.get().then(ret => {
|
this.$api.info.get().then((ret) => {
|
||||||
this.info = ret
|
this.info = ret
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -81,11 +39,54 @@ export default {
|
||||||
menuClick (item) {
|
menuClick (item) {
|
||||||
console.log('menu click', item)
|
console.log('menu click', item)
|
||||||
this.$router.replace(item.path)
|
this.$router.replace(item.path)
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<a-config-provider :locale="locale">
|
||||||
|
<div class="ds_layout" :class="themeClass">
|
||||||
|
<a-layout>
|
||||||
|
<a-layout-sider :theme="theme">
|
||||||
|
<div class="logo" />
|
||||||
|
<div class="aside">
|
||||||
|
<a-menu
|
||||||
|
mode="inline"
|
||||||
|
:default-selected-keys="[$route.fullPath]"
|
||||||
|
:default-open-keys="['/plugin']"
|
||||||
|
>
|
||||||
|
<template v-for="(item) of menus">
|
||||||
|
<a-sub-menu v-if="item.children && item.children.length > 0" :key="item.path" @titleClick="titleClick(item)">
|
||||||
|
<span slot="title"><a-icon :type="item.icon ? item.icon : 'file'" /><span>{{ item.title }}</span></span>
|
||||||
|
<a-menu-item v-for="(sub) of item.children" :key="sub.path" @click="menuClick(sub)">
|
||||||
|
<a-icon :type="sub.icon ? sub.icon : 'file'" /> {{ sub.title }}
|
||||||
|
</a-menu-item>
|
||||||
|
</a-sub-menu>
|
||||||
|
<a-menu-item v-else :key="item.path" @click="menuClick(item)">
|
||||||
|
<a-icon :type="item.icon ? item.icon : 'file'" />
|
||||||
|
<span class="nav-text">{{ item.title }}</span>
|
||||||
|
</a-menu-item>
|
||||||
|
</template>
|
||||||
|
</a-menu>
|
||||||
|
</div>
|
||||||
|
</a-layout-sider>
|
||||||
|
<a-layout>
|
||||||
|
<!-- <a-layout-header>Header</a-layout-header> -->
|
||||||
|
<a-layout-content>
|
||||||
|
<router-view />
|
||||||
|
</a-layout-content>
|
||||||
|
<a-layout-footer>
|
||||||
|
<div class="footer">
|
||||||
|
©2020-2024 docmirror.cn by Greper, WangLiang <span>{{ info.version }}</span>
|
||||||
|
</div>
|
||||||
|
</a-layout-footer>
|
||||||
|
</a-layout>
|
||||||
|
</a-layout>
|
||||||
|
</div>
|
||||||
|
</a-config-provider>
|
||||||
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
body{
|
body{
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
|
@ -53,7 +53,7 @@ export function apiInit (app) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise((resolve) => {
|
||||||
resolve(apiObj)
|
resolve(apiObj)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'DsContainer',
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="ds-container">
|
<div class="ds-container">
|
||||||
<div class="body-wrapper">
|
<div class="body-wrapper">
|
||||||
<div v-if="$slots.header" class="container-header"><slot name="header"></slot></div>
|
<div v-if="$slots.header" class="container-header"><slot name="header" /></div>
|
||||||
<div class="container-body"> <slot></slot></div>
|
<div class="container-body"><slot /></div>
|
||||||
<div class="container-footer"> <slot name="footer"></slot></div>
|
<div class="container-footer"><slot name="footer" /></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'ds-container'
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.ds-container{
|
.ds-container{
|
||||||
height:100%;
|
height:100%;
|
||||||
|
@ -49,5 +49,4 @@ export default {
|
||||||
padding:15px;
|
padding:15px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,66 +1,23 @@
|
||||||
<template>
|
|
||||||
<a-drawer
|
|
||||||
placement="right"
|
|
||||||
:closable="false"
|
|
||||||
:visible="visible"
|
|
||||||
:after-visible-change="afterVisibleChange"
|
|
||||||
@close="onClose"
|
|
||||||
width="660px"
|
|
||||||
height="100%"
|
|
||||||
:slots="{ title: 'title' }"
|
|
||||||
wrapClassName="json-wrapper"
|
|
||||||
>
|
|
||||||
<template slot="title">
|
|
||||||
{{title}}
|
|
||||||
<a-button type="primary" style="float:right" @click="doSetup()">点此去安装</a-button>
|
|
||||||
<a-button style="float:right;margin-right:10px;" @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/caroot.md')">为什么要安装证书?</a-button>
|
|
||||||
</template>
|
|
||||||
<div>
|
|
||||||
<b>本应用在非“安全模式”下必须安装和信任CA根证书</b>,该证书是应用启动时本地随机生成的<br/>
|
|
||||||
|
|
||||||
<template v-if="this.systemPlatform === 'mac'">
|
|
||||||
1、点击右上角“点此去安装按钮”,打开钥匙串,<b style="color:red">选择”系统“</b><br/>
|
|
||||||
2、然后按如下图步骤将随机生成的根证书设置为始终信任<br/>
|
|
||||||
3、可能需要重新启动应用和浏览器才能生效<br/>
|
|
||||||
4、注意:如果出现无法导入提示时,先点一下钥匙串的左边切换到<b style="color:red">“系统”栏</b>,然后再重新安装证书即可<br/>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="this.systemPlatform === 'linux'">
|
|
||||||
1、点击右上角“点此去安装按钮”,将自动安装到系统证书库中<br/>
|
|
||||||
2、<b color="red">火狐、chrome等浏览器不走系统证书</b>,需要手动安装(下图以chrome为例安装根证书)<br/>
|
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
1、点击右上角“点此去安装按钮”,打开证书<br/>
|
|
||||||
2、然后按如下图步骤将根证书添加到<b style="color:red">信任的根证书颁发机构</b>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
<img width="100%" :src="setupImage"/>
|
|
||||||
</a-drawer>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
name: 'setup-ca',
|
name: 'SetupCa',
|
||||||
components: {
|
components: {
|
||||||
|
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
default: '安装根证书'
|
default: '安装根证书',
|
||||||
},
|
},
|
||||||
visible: {
|
visible: {
|
||||||
type: Boolean
|
type: Boolean,
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
systemPlatform: ''
|
systemPlatform: '',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async created () {
|
|
||||||
const platform = await this.$api.info.getSystemPlatform()
|
|
||||||
this.systemPlatform = platform
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
setupImage () {
|
setupImage () {
|
||||||
if (this.systemPlatform === 'mac') {
|
if (this.systemPlatform === 'mac') {
|
||||||
|
@ -70,7 +27,11 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
return '/setup.png'
|
return '/setup.png'
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
},
|
||||||
|
async created () {
|
||||||
|
const platform = await this.$api.info.getSystemPlatform()
|
||||||
|
this.systemPlatform = platform
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async openExternal (url) {
|
async openExternal (url) {
|
||||||
|
@ -89,10 +50,50 @@ export default {
|
||||||
if (this.systemPlatform === 'linux') {
|
if (this.systemPlatform === 'linux') {
|
||||||
this.$message.success('根证书已成功安装到系统证书库(注意:浏览器仍然需要手动安装)')
|
this.$message.success('根证书已成功安装到系统证书库(注意:浏览器仍然需要手动安装)')
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style>
|
<template>
|
||||||
</style>
|
<a-drawer
|
||||||
|
placement="right"
|
||||||
|
:closable="false"
|
||||||
|
:visible="visible"
|
||||||
|
:after-visible-change="afterVisibleChange"
|
||||||
|
width="660px"
|
||||||
|
height="100%"
|
||||||
|
:slots="{ title: 'title' }"
|
||||||
|
wrap-class-name="json-wrapper"
|
||||||
|
@close="onClose"
|
||||||
|
>
|
||||||
|
<template slot="title">
|
||||||
|
{{ title }}
|
||||||
|
<a-button type="primary" style="float:right" @click="doSetup()">
|
||||||
|
点此去安装
|
||||||
|
</a-button>
|
||||||
|
<a-button style="float:right;margin-right:10px;" @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/caroot.md')">
|
||||||
|
为什么要安装证书?
|
||||||
|
</a-button>
|
||||||
|
</template>
|
||||||
|
<div>
|
||||||
|
<b>本应用在非“安全模式”下必须安装和信任CA根证书</b>,该证书是应用启动时本地随机生成的<br>
|
||||||
|
|
||||||
|
<template v-if="systemPlatform === 'mac'">
|
||||||
|
1、点击右上角“点此去安装按钮”,打开钥匙串,<b style="color:red">选择”系统“</b><br>
|
||||||
|
2、然后按如下图步骤将随机生成的根证书设置为始终信任<br>
|
||||||
|
3、可能需要重新启动应用和浏览器才能生效<br>
|
||||||
|
4、注意:如果出现无法导入提示时,先点一下钥匙串的左边切换到<b style="color:red">“系统”栏</b>,然后再重新安装证书即可<br>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="systemPlatform === 'linux'">
|
||||||
|
1、点击右上角“点此去安装按钮”,将自动安装到系统证书库中<br>
|
||||||
|
2、<b color="red">火狐、chrome等浏览器不走系统证书</b>,需要手动安装(下图以chrome为例安装根证书)<br>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
1、点击右上角“点此去安装按钮”,打开证书<br>
|
||||||
|
2、然后按如下图步骤将根证书添加到<b style="color:red">信任的根证书颁发机构</b>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<img width="100%" :src="setupImage">
|
||||||
|
</a-drawer>
|
||||||
|
</template>
|
||||||
|
|
|
@ -1,132 +1,13 @@
|
||||||
<template>
|
|
||||||
<ds-container class="page_index">
|
|
||||||
<template slot="header">
|
|
||||||
给开发者的辅助工具
|
|
||||||
<span>
|
|
||||||
<a-button style="margin-right:10px" @click="openSetupCa">
|
|
||||||
<a-badge :count="_rootCaSetuped?0:1" dot>安装根证书</a-badge>
|
|
||||||
</a-button>
|
|
||||||
|
|
||||||
<a-button style="margin-right:10px" @click="doCheckUpdate(true)" :loading="update.downloading || update.checking"
|
|
||||||
:title="'当前版本:'+info.version">
|
|
||||||
<a-badge :count="update.newVersion?1:0" dot>
|
|
||||||
<span v-if="update.downloading">{{ update.progress }}%</span>{{ update.downloading ? '新版本下载中' : ('检查更新' + (update.checking ? '中' : '')) }}
|
|
||||||
</a-badge>
|
|
||||||
</a-button>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div class="box">
|
|
||||||
<a-alert v-if="config && config.app.showShutdownTip" message="本应用开启后会修改系统代理,直接重启电脑可能会无法上网,您可以再次启动本应用即可恢复。如您需要卸载,在卸载前请务必完全退出本应用再进行卸载" banner closable @close="onShutdownTipClose"/>
|
|
||||||
<div class="mode-bar" style="margin:20px;" v-if="config && config.app">
|
|
||||||
<a-radio-group v-model="config.app.mode" button-style="solid" @change="modeChange">
|
|
||||||
<a-tooltip placement="topLeft" title="启用测速,关闭拦截,关闭增强(不稳定,不需要安装证书,最安全)">
|
|
||||||
<a-radio-button value="safe">
|
|
||||||
安全模式
|
|
||||||
</a-radio-button>
|
|
||||||
</a-tooltip>
|
|
||||||
<a-tooltip placement="topLeft" title="启用测速,启用拦截,关闭增强(需要安装证书)">
|
|
||||||
<a-radio-button value="default">
|
|
||||||
默认模式
|
|
||||||
</a-radio-button>
|
|
||||||
</a-tooltip>
|
|
||||||
<a-tooltip v-if="setting.overwall" placement="topLeft" title="一个简单的梯子(敏感原因,默认隐藏,更多信息请点击左侧增强功能菜单)">
|
|
||||||
<a-radio-button value="ow">
|
|
||||||
增强模式
|
|
||||||
</a-radio-button>
|
|
||||||
</a-tooltip>
|
|
||||||
<a-tooltip v-else placement="topLeft" title="这个页面有个彩蛋">
|
|
||||||
<a-radio-button :disabled="true" value="ow">
|
|
||||||
彩蛋
|
|
||||||
</a-radio-button>
|
|
||||||
</a-tooltip>
|
|
||||||
</a-radio-group>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div v-if="status"
|
|
||||||
style="margin-top:20px;display: flex; align-items:center;justify-content:space-around;flex-direction: row">
|
|
||||||
|
|
||||||
<div style="text-align: center">
|
|
||||||
<div class="big_button">
|
|
||||||
<a-button shape="circle" :type="startup.type()" :loading="startup.loading" @click="startup.doClick">
|
|
||||||
<img v-if="!startup.loading && !status.server.enabled" width="50" src="/logo/logo-simple.svg">
|
|
||||||
<img v-if="!startup.loading && status.server.enabled" width="50" src="/logo/logo-fff.svg">
|
|
||||||
</a-button>
|
|
||||||
<div class="mt10">{{ status.server.enabled ? '已开启' : '已关闭' }}</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div :span="12">
|
|
||||||
<a-form style="margin-top:20px" :label-col="{ span: 15 }" :wrapper-col="{ span: 9 }">
|
|
||||||
<a-form-item v-for=" (item, key) in switchBtns" :key="key" :label="item.label">
|
|
||||||
<a-tooltip placement="topLeft">
|
|
||||||
<a-switch style="margin-left:10px" :loading="item.loading" :checked="item.status()" default-checked
|
|
||||||
@change="item.doClick">
|
|
||||||
<a-icon slot="checkedChildren" type="check"/>
|
|
||||||
<a-icon slot="unCheckedChildren" type="close"/>
|
|
||||||
</a-switch>
|
|
||||||
</a-tooltip>
|
|
||||||
</a-form-item>
|
|
||||||
</a-form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<setup-ca title="安装证书" :visible.sync="setupCa.visible" @setup="handleCaSetuped"></setup-ca>
|
|
||||||
<div slot="footer">
|
|
||||||
<div class="star" v-if="!setting.overwall">
|
|
||||||
<div class="donate">
|
|
||||||
<a-tooltip placement="topLeft" title="彩蛋,点我">
|
|
||||||
<span style="display: block;width:100px;height:50px;" @click="wantOW()"></span>
|
|
||||||
</a-tooltip>
|
|
||||||
</div>
|
|
||||||
<div class="right"></div>
|
|
||||||
</div>
|
|
||||||
<div class="star" v-if="setting.development == null || !setting.development">
|
|
||||||
<div class="donate" @click="donateModal=true">
|
|
||||||
<a-icon type="like" theme="outlined"/>
|
|
||||||
捐赠
|
|
||||||
</div>
|
|
||||||
<div class="right">
|
|
||||||
<div>如果它解决了你的问题,请不要吝啬你的star哟!点这里
|
|
||||||
<a-icon style="margin-right:10px;" type="arrow-right" theme="outlined"/>
|
|
||||||
</div>
|
|
||||||
<a @click="openExternal('https://github.com/docmirror/dev-sidecar')"><img alt="GitHub stars"
|
|
||||||
src="https://img.shields.io/github/stars/docmirror/dev-sidecar?logo=github"></a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a-modal title="捐赠" v-if="setting.development == null || !setting.development" v-model="donateModal" width="550px" cancelText="不了" okText="果断支持" @ok="goDonate">
|
|
||||||
<div>* 本应用完全免费,如果觉得好用,可以给予捐赠。</div>
|
|
||||||
<div>* 开源项目持续发展离不开您的支持,感谢</div>
|
|
||||||
<div class="payQrcode">
|
|
||||||
<img height="200px" src="/pay.jpg"/>
|
|
||||||
</div>
|
|
||||||
</a-modal>
|
|
||||||
</div>
|
|
||||||
</ds-container>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import lodash from 'lodash'
|
import lodash from 'lodash'
|
||||||
import setupCa from '../components/setup-ca'
|
|
||||||
import DsContainer from '../components/container'
|
import DsContainer from '../components/container'
|
||||||
|
import SetupCa from '../components/setup-ca'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Index',
|
name: 'Index',
|
||||||
components: {
|
components: {
|
||||||
DsContainer,
|
DsContainer,
|
||||||
setupCa
|
SetupCa,
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
_rootCaSetuped () {
|
|
||||||
if (this.setting.rootCa) {
|
|
||||||
return this.setting.rootCa.setuped === true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
@ -143,7 +24,7 @@ export default {
|
||||||
} else {
|
} else {
|
||||||
this.apiCall(this.startup, this.$api.startup)
|
this.apiCall(this.startup, this.$api.startup)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
info: {},
|
info: {},
|
||||||
newVersionDownloading: false,
|
newVersionDownloading: false,
|
||||||
|
@ -153,16 +34,24 @@ export default {
|
||||||
loading: false,
|
loading: false,
|
||||||
doClick: (checked) => {
|
doClick: (checked) => {
|
||||||
this.onServerClick(checked)
|
this.onServerClick(checked)
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
switchBtns: undefined,
|
switchBtns: undefined,
|
||||||
config: undefined,
|
config: undefined,
|
||||||
setupCa: {
|
setupCa: {
|
||||||
visible: false
|
visible: false,
|
||||||
},
|
},
|
||||||
update: { checking: false, downloading: false, progress: 0, newVersion: false }
|
update: { checking: false, downloading: false, progress: 0, newVersion: false },
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
_rootCaSetuped () {
|
||||||
|
if (this.setting.rootCa) {
|
||||||
|
return this.setting.rootCa.setuped === true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
},
|
||||||
async created () {
|
async created () {
|
||||||
await this.doCheckRootCa()
|
await this.doCheckRootCa()
|
||||||
await this.reloadConfig()
|
await this.reloadConfig()
|
||||||
|
@ -173,7 +62,7 @@ export default {
|
||||||
this.update.autoChecked = true // 应用启动时,执行一次
|
this.update.autoChecked = true // 应用启动时,执行一次
|
||||||
this.doCheckUpdate(false)
|
this.doCheckUpdate(false)
|
||||||
}
|
}
|
||||||
this.$api.info.get().then(ret => {
|
this.$api.info.get().then((ret) => {
|
||||||
this.info = ret
|
this.info = ret
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -212,9 +101,9 @@ export default {
|
||||||
title: '彩蛋(增强模式)',
|
title: '彩蛋(增强模式)',
|
||||||
content: (
|
content: (
|
||||||
<div>
|
<div>
|
||||||
我把它藏在了源码里,感兴趣的话可以找一找它(线索提示 // TODO)
|
我把它藏在了源码里,感兴趣的话可以找一找它(线索提示 // TODO)
|
||||||
</div>
|
</div>
|
||||||
)
|
),
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
async doCheckRootCa () {
|
async doCheckRootCa () {
|
||||||
|
@ -237,7 +126,7 @@ export default {
|
||||||
// const rootCa = this.setting.rootCa
|
// const rootCa = this.setting.rootCa
|
||||||
// rootCa.noTip = true
|
// rootCa.noTip = true
|
||||||
// this.$api.setting.save(this.setting)
|
// this.$api.setting.save(this.setting)
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
openSetupCa () {
|
openSetupCa () {
|
||||||
|
@ -273,7 +162,7 @@ export default {
|
||||||
this.$api.setting.save(this.setting)
|
this.$api.setting.save(this.setting)
|
||||||
},
|
},
|
||||||
reloadConfig () {
|
reloadConfig () {
|
||||||
return this.$api.config.reload().then(ret => {
|
return this.$api.config.reload().then((ret) => {
|
||||||
this.config = ret
|
this.config = ret
|
||||||
return ret
|
return ret
|
||||||
})
|
})
|
||||||
|
@ -303,7 +192,7 @@ export default {
|
||||||
},
|
},
|
||||||
doClick: (checked) => {
|
doClick: (checked) => {
|
||||||
this.onSwitchClick(this.switchBtns[key], apiTarget.start, apiTarget.close, checked)
|
this.onSwitchClick(this.switchBtns[key], apiTarget.start, apiTarget.close, checked)
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async apiCall (btn, api, param) {
|
async apiCall (btn, api, param) {
|
||||||
|
@ -360,12 +249,131 @@ export default {
|
||||||
cancelText: '下次还显示',
|
cancelText: '下次还显示',
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
this.$api.config.update({ app: { showShutdownTip: false } })
|
this.$api.config.update({ app: { showShutdownTip: false } })
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<DsContainer class="page_index">
|
||||||
|
<template slot="header">
|
||||||
|
给开发者的辅助工具
|
||||||
|
<span>
|
||||||
|
<a-button style="margin-right:10px" @click="openSetupCa">
|
||||||
|
<a-badge :count="_rootCaSetuped ? 0 : 1" dot>安装根证书</a-badge>
|
||||||
|
</a-button>
|
||||||
|
|
||||||
|
<a-button
|
||||||
|
style="margin-right:10px" :loading="update.downloading || update.checking" :title="`当前版本:${info.version}`"
|
||||||
|
@click="doCheckUpdate(true)"
|
||||||
|
>
|
||||||
|
<a-badge :count="update.newVersion ? 1 : 0" dot>
|
||||||
|
<span v-if="update.downloading">{{ update.progress }}%</span>{{ update.downloading ? '新版本下载中' : (`检查更新${update.checking ? '中' : ''}`) }}
|
||||||
|
</a-badge>
|
||||||
|
</a-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div class="box">
|
||||||
|
<a-alert v-if="config && config.app.showShutdownTip" message="本应用开启后会修改系统代理,直接重启电脑可能会无法上网,您可以再次启动本应用即可恢复。如您需要卸载,在卸载前请务必完全退出本应用再进行卸载" banner closable @close="onShutdownTipClose" />
|
||||||
|
<div v-if="config && config.app" class="mode-bar" style="margin:20px;">
|
||||||
|
<a-radio-group v-model="config.app.mode" button-style="solid" @change="modeChange">
|
||||||
|
<a-tooltip placement="topLeft" title="启用测速,关闭拦截,关闭增强(不稳定,不需要安装证书,最安全)">
|
||||||
|
<a-radio-button value="safe">
|
||||||
|
安全模式
|
||||||
|
</a-radio-button>
|
||||||
|
</a-tooltip>
|
||||||
|
<a-tooltip placement="topLeft" title="启用测速,启用拦截,关闭增强(需要安装证书)">
|
||||||
|
<a-radio-button value="default">
|
||||||
|
默认模式
|
||||||
|
</a-radio-button>
|
||||||
|
</a-tooltip>
|
||||||
|
<a-tooltip v-if="setting.overwall" placement="topLeft" title="一个简单的梯子(敏感原因,默认隐藏,更多信息请点击左侧增强功能菜单)">
|
||||||
|
<a-radio-button value="ow">
|
||||||
|
增强模式
|
||||||
|
</a-radio-button>
|
||||||
|
</a-tooltip>
|
||||||
|
<a-tooltip v-else placement="topLeft" title="这个页面有个彩蛋">
|
||||||
|
<a-radio-button :disabled="true" value="ow">
|
||||||
|
彩蛋
|
||||||
|
</a-radio-button>
|
||||||
|
</a-tooltip>
|
||||||
|
</a-radio-group>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="status"
|
||||||
|
style="margin-top:20px;display: flex; align-items:center;justify-content:space-around;flex-direction: row"
|
||||||
|
>
|
||||||
|
<div style="text-align: center">
|
||||||
|
<div class="big_button">
|
||||||
|
<a-button shape="circle" :type="startup.type()" :loading="startup.loading" @click="startup.doClick">
|
||||||
|
<img v-if="!startup.loading && !status.server.enabled" width="50" src="/logo/logo-simple.svg">
|
||||||
|
<img v-if="!startup.loading && status.server.enabled" width="50" src="/logo/logo-fff.svg">
|
||||||
|
</a-button>
|
||||||
|
<div class="mt10">
|
||||||
|
{{ status.server.enabled ? '已开启' : '已关闭' }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div :span="12">
|
||||||
|
<a-form style="margin-top:20px" :label-col="{ span: 15 }" :wrapper-col="{ span: 9 }">
|
||||||
|
<a-form-item v-for=" (item, key) in switchBtns" :key="key" :label="item.label">
|
||||||
|
<a-tooltip placement="topLeft">
|
||||||
|
<a-switch
|
||||||
|
style="margin-left:10px" :loading="item.loading" :checked="item.status()" default-checked
|
||||||
|
@change="item.doClick"
|
||||||
|
>
|
||||||
|
<a-icon slot="checkedChildren" type="check" />
|
||||||
|
<a-icon slot="unCheckedChildren" type="close" />
|
||||||
|
</a-switch>
|
||||||
|
</a-tooltip>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SetupCa title="安装证书" :visible.sync="setupCa.visible" @setup="handleCaSetuped" />
|
||||||
|
<div slot="footer">
|
||||||
|
<div v-if="!setting.overwall" class="star">
|
||||||
|
<div class="donate">
|
||||||
|
<a-tooltip placement="topLeft" title="彩蛋,点我">
|
||||||
|
<span style="display: block;width:100px;height:50px;" @click="wantOW()" />
|
||||||
|
</a-tooltip>
|
||||||
|
</div>
|
||||||
|
<div class="right" />
|
||||||
|
</div>
|
||||||
|
<div v-if="setting.development == null || !setting.development" class="star">
|
||||||
|
<div class="donate" @click="donateModal = true">
|
||||||
|
<a-icon type="like" theme="outlined" />
|
||||||
|
捐赠
|
||||||
|
</div>
|
||||||
|
<div class="right">
|
||||||
|
<div>
|
||||||
|
如果它解决了你的问题,请不要吝啬你的star哟!点这里
|
||||||
|
<a-icon style="margin-right:10px;" type="arrow-right" theme="outlined" />
|
||||||
|
</div>
|
||||||
|
<a @click="openExternal('https://github.com/docmirror/dev-sidecar')"><img
|
||||||
|
alt="GitHub stars"
|
||||||
|
src="https://img.shields.io/github/stars/docmirror/dev-sidecar?logo=github"
|
||||||
|
></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a-modal v-if="setting.development == null || !setting.development" v-model="donateModal" title="捐赠" width="550px" cancel-text="不了" ok-text="果断支持" @ok="goDonate">
|
||||||
|
<div>* 本应用完全免费,如果觉得好用,可以给予捐赠。</div>
|
||||||
|
<div>* 开源项目持续发展离不开您的支持,感谢</div>
|
||||||
|
<div class="payQrcode">
|
||||||
|
<img height="200px" src="/pay.jpg">
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
|
</div>
|
||||||
|
</DsContainer>
|
||||||
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.page_index {
|
.page_index {
|
||||||
.mode-bar {
|
.mode-bar {
|
||||||
|
|
|
@ -1,3 +1,68 @@
|
||||||
|
<script>
|
||||||
|
import Plugin from '../../mixins/plugin'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'Git',
|
||||||
|
mixins: [Plugin],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
key: 'plugin.git',
|
||||||
|
noProxyUrls: [],
|
||||||
|
needRestart: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
console.log('status:', this.status)
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
ready () {
|
||||||
|
this.initNoProxyUrls()
|
||||||
|
},
|
||||||
|
async applyBefore () {
|
||||||
|
if (this.status.plugin.git.enabled) {
|
||||||
|
await this.$api.plugin.git.close()
|
||||||
|
this.needRestart = true
|
||||||
|
} else {
|
||||||
|
this.needRestart = false
|
||||||
|
}
|
||||||
|
this.submitNoProxyUrls()
|
||||||
|
},
|
||||||
|
async applyAfter () {
|
||||||
|
if (this.needRestart) {
|
||||||
|
await this.$api.plugin.git.start()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
initNoProxyUrls () {
|
||||||
|
this.noProxyUrls = []
|
||||||
|
for (const key in this.config.plugin.git.setting.noProxyUrls) {
|
||||||
|
const value = this.config.plugin.git.setting.noProxyUrls[key]
|
||||||
|
this.noProxyUrls.push({
|
||||||
|
key,
|
||||||
|
value,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
addNoProxyUrl () {
|
||||||
|
this.noProxyUrls.unshift({ key: '', value: true })
|
||||||
|
},
|
||||||
|
delNoProxyUrl (item, index) {
|
||||||
|
this.noProxyUrls.splice(index, 1)
|
||||||
|
},
|
||||||
|
submitNoProxyUrls () {
|
||||||
|
const noProxyUrls = {}
|
||||||
|
for (const item of this.noProxyUrls) {
|
||||||
|
if (item.key) {
|
||||||
|
noProxyUrls[item.key] = item.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.config.plugin.git.setting.noProxyUrls = noProxyUrls
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ds-container>
|
<ds-container>
|
||||||
<template slot="header">
|
<template slot="header">
|
||||||
|
@ -33,15 +98,15 @@
|
||||||
<span><code>Git.exe</code>将不代理以下仓库;可以是根地址、组织/机构地址、完整地址</span>
|
<span><code>Git.exe</code>将不代理以下仓库;可以是根地址、组织/机构地址、完整地址</span>
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="2">
|
<a-col :span="2">
|
||||||
<a-button type="primary" icon="plus" @click="addNoProxyUrl()"/>
|
<a-button type="primary" icon="plus" @click="addNoProxyUrl()" />
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
<a-row :gutter="10" v-for="(item,index) of noProxyUrls" :key='index'>
|
<a-row v-for="(item, index) of noProxyUrls" :key="index" :gutter="10">
|
||||||
<a-col :span="22">
|
<a-col :span="22">
|
||||||
<a-input :disabled="item.value === false" v-model="item.key"></a-input>
|
<a-input v-model="item.key" :disabled="item.value === false" />
|
||||||
</a-col>
|
</a-col>
|
||||||
<a-col :span="2">
|
<a-col :span="2">
|
||||||
<a-button type="danger" icon="minus" @click="delNoProxyUrl(item,index)"/>
|
<a-button type="danger" icon="minus" @click="delNoProxyUrl(item, index)" />
|
||||||
</a-col>
|
</a-col>
|
||||||
</a-row>
|
</a-row>
|
||||||
</div>
|
</div>
|
||||||
|
@ -55,69 +120,4 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</ds-container>
|
</ds-container>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import Plugin from '../../mixins/plugin'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Git',
|
|
||||||
mixins: [Plugin],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
key: 'plugin.git',
|
|
||||||
noProxyUrls: [],
|
|
||||||
needRestart: false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
console.log('status:', this.status)
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
ready () {
|
|
||||||
this.initNoProxyUrls()
|
|
||||||
},
|
|
||||||
async applyBefore () {
|
|
||||||
if (this.status.plugin.git.enabled) {
|
|
||||||
await this.$api.plugin.git.close()
|
|
||||||
this.needRestart = true
|
|
||||||
} else {
|
|
||||||
this.needRestart = false
|
|
||||||
}
|
|
||||||
this.submitNoProxyUrls()
|
|
||||||
},
|
|
||||||
async applyAfter () {
|
|
||||||
if (this.needRestart) {
|
|
||||||
await this.$api.plugin.git.start()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
initNoProxyUrls () {
|
|
||||||
this.noProxyUrls = []
|
|
||||||
for (const key in this.config.plugin.git.setting.noProxyUrls) {
|
|
||||||
const value = this.config.plugin.git.setting.noProxyUrls[key]
|
|
||||||
this.noProxyUrls.push({
|
|
||||||
key, value
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
addNoProxyUrl () {
|
|
||||||
this.noProxyUrls.unshift({ key: '', value: true })
|
|
||||||
},
|
|
||||||
delNoProxyUrl (item, index) {
|
|
||||||
this.noProxyUrls.splice(index, 1)
|
|
||||||
},
|
|
||||||
submitNoProxyUrls () {
|
|
||||||
const noProxyUrls = {}
|
|
||||||
for (const item of this.noProxyUrls) {
|
|
||||||
if (item.key) {
|
|
||||||
noProxyUrls[item.key] = item.value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.config.plugin.git.setting.noProxyUrls = noProxyUrls
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
|
@ -1,90 +1,3 @@
|
||||||
<template>
|
|
||||||
<ds-container>
|
|
||||||
<template slot="header">
|
|
||||||
NPM加速
|
|
||||||
<span style="color:#999;">
|
|
||||||
由于nodejs不走系统证书,所以npm加速不是很好用,可以用淘宝registry
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div v-if="config">
|
|
||||||
<a-form layout="horizontal">
|
|
||||||
<a-form-item label="启用NPM代理" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.node.enabled">
|
|
||||||
随应用启动
|
|
||||||
</a-checkbox>
|
|
||||||
<a-tag v-if="status.plugin.node.enabled" color="green">
|
|
||||||
当前已启动
|
|
||||||
</a-tag>
|
|
||||||
<a-tag v-else color="red">
|
|
||||||
当前未启动
|
|
||||||
</a-tag>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="npm命令名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.plugin.node.setting.command"></a-input>
|
|
||||||
<div class="form-help">如果你的npm命令改成了其他名字,或者想设置绿色版npm程序路径,可在此处修改</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="SSL校验" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.node.setting['strict-ssl']">
|
|
||||||
关闭strict-ssl
|
|
||||||
</a-checkbox>
|
|
||||||
npm代理启用后必须关闭
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="npm仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.plugin.node.setting.registry" @change="onSwitchRegistry"
|
|
||||||
default-value="https://registry.npmjs.org" button-style="solid">
|
|
||||||
<a-radio-button value="https://registry.npmjs.org" title="https://registry.npmjs.org">
|
|
||||||
npmjs原生
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button value="https://registry.npmmirror.com" title="https://registry.npmmirror.com">
|
|
||||||
taobao镜像
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">设置后立即生效,即使关闭 ds 也会继续保持</div>
|
|
||||||
</a-form-item>
|
|
||||||
|
|
||||||
<a-form-item label="yarn仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.plugin.node.setting.yarnRegistry" :default-value="'null'" @change="onSwitchYarnRegistry" button-style="solid">
|
|
||||||
<a-radio-button :value="'null'" title="https://registry.yarnpkg.com">
|
|
||||||
yarn原生
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button value="https://registry.npmmirror.com" title="https://registry.npmmirror.com">
|
|
||||||
taobao镜像
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">设置后立即生效,即使关闭 ds 也会继续保持</div>
|
|
||||||
</a-form-item>
|
|
||||||
|
|
||||||
<a-form-item label="镜像变量设置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.node.startup.variables">
|
|
||||||
自动设置,启动npm加速开关时将会设置如下环境变量
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">某些库需要自己设置镜像变量,才能下载,比如:<code>electron</code></div>
|
|
||||||
<a-row :gutter="10" style="margin-top: 2px" v-for="(item,index) of npmVariables" :key='index'>
|
|
||||||
<a-col :span="10">
|
|
||||||
<a-input v-model="item.key" :title="item.key" readOnly></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="10">
|
|
||||||
<a-input v-model="item.value" :title="item.value" readOnly></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="4">
|
|
||||||
<a-icon v-if="item.exists && item.hadSet" title="已设置" style="color:green" type="check"/>
|
|
||||||
<a-icon v-else title="还未设置" style="color:red" type="exclamation-circle"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-form-item>
|
|
||||||
</a-form>
|
|
||||||
</div>
|
|
||||||
<template slot="footer">
|
|
||||||
<div class="footer-bar">
|
|
||||||
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
|
||||||
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ds-container>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Plugin from '../../mixins/plugin'
|
import Plugin from '../../mixins/plugin'
|
||||||
|
|
||||||
|
@ -95,7 +8,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
key: 'plugin.node',
|
key: 'plugin.node',
|
||||||
npmVariables: undefined,
|
npmVariables: undefined,
|
||||||
registry: false
|
registry: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
|
@ -105,7 +18,7 @@ export default {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
ready () {
|
ready () {
|
||||||
return this.$api.plugin.node.getVariables().then(ret => {
|
return this.$api.plugin.node.getVariables().then((ret) => {
|
||||||
console.log('variables', ret)
|
console.log('variables', ret)
|
||||||
this.npmVariables = ret
|
this.npmVariables = ret
|
||||||
})
|
})
|
||||||
|
@ -129,9 +42,103 @@ export default {
|
||||||
this.saveConfig().then(() => {
|
this.saveConfig().then(() => {
|
||||||
this.$api.plugin.node.setVariables()
|
this.$api.plugin.node.setVariables()
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass">
|
|
||||||
</style>
|
<template>
|
||||||
|
<ds-container>
|
||||||
|
<template slot="header">
|
||||||
|
NPM加速
|
||||||
|
<span style="color:#999;">
|
||||||
|
由于nodejs不走系统证书,所以npm加速不是很好用,可以用淘宝registry
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div v-if="config">
|
||||||
|
<a-form layout="horizontal">
|
||||||
|
<a-form-item label="启用NPM代理" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.node.enabled">
|
||||||
|
随应用启动
|
||||||
|
</a-checkbox>
|
||||||
|
<a-tag v-if="status.plugin.node.enabled" color="green">
|
||||||
|
当前已启动
|
||||||
|
</a-tag>
|
||||||
|
<a-tag v-else color="red">
|
||||||
|
当前未启动
|
||||||
|
</a-tag>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="npm命令名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.plugin.node.setting.command" />
|
||||||
|
<div class="form-help">
|
||||||
|
如果你的npm命令改成了其他名字,或者想设置绿色版npm程序路径,可在此处修改
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="SSL校验" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.node.setting['strict-ssl']">
|
||||||
|
关闭strict-ssl
|
||||||
|
</a-checkbox>
|
||||||
|
npm代理启用后必须关闭
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="npm仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group
|
||||||
|
v-model="config.plugin.node.setting.registry" default-value="https://registry.npmjs.org"
|
||||||
|
button-style="solid" @change="onSwitchRegistry"
|
||||||
|
>
|
||||||
|
<a-radio-button value="https://registry.npmjs.org" title="https://registry.npmjs.org">
|
||||||
|
npmjs原生
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button value="https://registry.npmmirror.com" title="https://registry.npmmirror.com">
|
||||||
|
taobao镜像
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
设置后立即生效,即使关闭 ds 也会继续保持
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item label="yarn仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.plugin.node.setting.yarnRegistry" default-value="null" button-style="solid" @change="onSwitchYarnRegistry">
|
||||||
|
<a-radio-button value="default" title="https://registry.yarnpkg.com">
|
||||||
|
yarn原生
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button value="https://registry.npmmirror.com" title="https://registry.npmmirror.com">
|
||||||
|
taobao镜像
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
设置后立即生效,即使关闭 ds 也会继续保持
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<a-form-item label="镜像变量设置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.node.startup.variables">
|
||||||
|
自动设置,启动npm加速开关时将会设置如下环境变量
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
某些库需要自己设置镜像变量,才能下载,比如:<code>electron</code>
|
||||||
|
</div>
|
||||||
|
<a-row v-for="(item, index) of npmVariables" :key="index" :gutter="10" style="margin-top: 2px">
|
||||||
|
<a-col :span="10">
|
||||||
|
<a-input v-model="item.key" :title="item.key" read-only />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="10">
|
||||||
|
<a-input v-model="item.value" :title="item.value" read-only />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-icon v-if="item.exists && item.hadSet" title="已设置" style="color:green" type="check" />
|
||||||
|
<a-icon v-else title="还未设置" style="color:red" type="exclamation-circle" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<template slot="footer">
|
||||||
|
<div class="footer-bar">
|
||||||
|
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
||||||
|
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ds-container>
|
||||||
|
</template>
|
||||||
|
|
|
@ -1,118 +1,3 @@
|
||||||
<template>
|
|
||||||
<ds-container>
|
|
||||||
<template slot="header">
|
|
||||||
梯子
|
|
||||||
<span>
|
|
||||||
<a-button type="primary" @click="openExternal('https://github.com/docmirror/dev-sidecar-doc/blob/main/ow.md')">原理说明</a-button>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div v-if="config">
|
|
||||||
<a-form layout="horizontal">
|
|
||||||
<a-form-item label="梯子" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.overwall.enabled">
|
|
||||||
启用
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
这是什么功能?你懂的!偷偷的用,别声张。<code><i>注:请不要看视频,流量挺小的!</i></code><br/>
|
|
||||||
建议参照右上角的<code>原理说明</code>,自建二层代理服务端,并在此页下方配置<code>代理服务端</code>。<br/>
|
|
||||||
声明:此功能仅供技术学习与探讨!
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="PAC" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.overwall.pac.enabled">
|
|
||||||
启用PAC
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">PAC内收录了常见的被封杀的域名<br/>当里面某些域名你不想被拦截时,你可以配置这些域名为<code>禁用</code>,也可以关闭PAC</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="自动更新PAC" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.plugin.overwall.pac.autoUpdate">
|
|
||||||
是否自动更新PAC
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
开启自动更新后,启动代理服务时,将会异步从下面的远程地址下载PAC文件到本地。<br/>
|
|
||||||
注:只要下载成功后,即使关闭自动更新功能,也会优先读取最近下载的文件!
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="远程PAC文件地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.plugin.overwall.pac.pacFileUpdateUrl" :title="config.plugin.overwall.pac.pacFileUpdateUrl"/>
|
|
||||||
<div class="form-help">
|
|
||||||
远程PAC文件内容可以是<code>base64</code>编码格式,也可以是未经过编码的
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="自定义域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<div>
|
|
||||||
<a-row :gutter="10" style="">
|
|
||||||
<a-col :span="22">
|
|
||||||
<span>PAC没有拦截到的域名,可以在此处定义;配置为<code>禁用</code>时,将不使用梯子</span>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="primary" icon="plus" @click="addTarget()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" v-for="(item,index) of targets" :key="index">
|
|
||||||
<a-col :span="18">
|
|
||||||
<a-input v-model="item.key"></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="4">
|
|
||||||
<a-select v-model="item.value" style="width:100%">
|
|
||||||
<a-select-option v-for="(item) of overwallOptions" :key="item.value" :value="item.value">
|
|
||||||
{{ item.label }}
|
|
||||||
</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="danger" icon="minus" @click="deleteTarget(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="代理服务端" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<div>
|
|
||||||
<a-row :gutter="10" style="">
|
|
||||||
<a-col :span="22">
|
|
||||||
<span>Nginx二层代理服务端配置</span>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="primary" icon="plus" @click="addServer()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" v-for="(item,index) of servers" :key="index">
|
|
||||||
<a-col :span="6">
|
|
||||||
<a-input addon-before="域名" placeholder="yourdomain.com" v-model="item.key"/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="5">
|
|
||||||
<a-input addon-before="端口" placeholder="443" v-model="item.value.port"/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="6">
|
|
||||||
<a-input addon-before="路径" placeholder="xxxxxx" v-model="item.value.path"/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="5">
|
|
||||||
<a-input addon-before="密码" type="password" placeholder="password" v-model="item.value.password"/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="danger" icon="minus" @click="deleteServer(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<div class="form-help">
|
|
||||||
您可以在此处配置自己的代理服务器地址。<br/>
|
|
||||||
警告:请勿使用来源不明的服务器地址,有安全风险!
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
</a-form>
|
|
||||||
</div>
|
|
||||||
<template slot="footer">
|
|
||||||
<div class="footer-bar">
|
|
||||||
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
|
||||||
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ds-container>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Plugin from '../../mixins/plugin'
|
import Plugin from '../../mixins/plugin'
|
||||||
|
|
||||||
|
@ -127,13 +12,13 @@ export default {
|
||||||
overwallOptions: [
|
overwallOptions: [
|
||||||
{
|
{
|
||||||
value: true,
|
value: true,
|
||||||
label: '启用'
|
label: '启用',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
value: false,
|
value: false,
|
||||||
label: '禁用'
|
label: '禁用',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
|
@ -164,7 +49,8 @@ export default {
|
||||||
for (const key in targetsMap) {
|
for (const key in targetsMap) {
|
||||||
const value = targetsMap[key]
|
const value = targetsMap[key]
|
||||||
this.targets.push({
|
this.targets.push({
|
||||||
key, value
|
key,
|
||||||
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -190,7 +76,8 @@ export default {
|
||||||
for (const key in targetsMap) {
|
for (const key in targetsMap) {
|
||||||
const value = targetsMap[key]
|
const value = targetsMap[key]
|
||||||
this.servers.push({
|
this.servers.push({
|
||||||
key, value
|
key,
|
||||||
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
if (this.servers.length === 0) {
|
if (this.servers.length === 0) {
|
||||||
|
@ -211,9 +98,124 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.config.plugin.overwall.server = map
|
this.config.plugin.overwall.server = map
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass">
|
|
||||||
</style>
|
<template>
|
||||||
|
<ds-container>
|
||||||
|
<template slot="header">
|
||||||
|
梯子
|
||||||
|
<span>
|
||||||
|
<a-button type="primary" @click="openExternal('https://github.com/docmirror/dev-sidecar-doc/blob/main/ow.md')">原理说明</a-button>
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div v-if="config">
|
||||||
|
<a-form layout="horizontal">
|
||||||
|
<a-form-item label="梯子" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.overwall.enabled">
|
||||||
|
启用
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
这是什么功能?你懂的!偷偷的用,别声张。<code><i>注:请不要看视频,流量挺小的!</i></code><br>
|
||||||
|
建议参照右上角的<code>原理说明</code>,自建二层代理服务端,并在此页下方配置<code>代理服务端</code>。<br>
|
||||||
|
声明:此功能仅供技术学习与探讨!
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="PAC" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.overwall.pac.enabled">
|
||||||
|
启用PAC
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
PAC内收录了常见的被封杀的域名<br>当里面某些域名你不想被拦截时,你可以配置这些域名为<code>禁用</code>,也可以关闭PAC
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="自动更新PAC" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.plugin.overwall.pac.autoUpdate">
|
||||||
|
是否自动更新PAC
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
开启自动更新后,启动代理服务时,将会异步从下面的远程地址下载PAC文件到本地。<br>
|
||||||
|
注:只要下载成功后,即使关闭自动更新功能,也会优先读取最近下载的文件!
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="远程PAC文件地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.plugin.overwall.pac.pacFileUpdateUrl" :title="config.plugin.overwall.pac.pacFileUpdateUrl" />
|
||||||
|
<div class="form-help">
|
||||||
|
远程PAC文件内容可以是<code>base64</code>编码格式,也可以是未经过编码的
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="自定义域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<div>
|
||||||
|
<a-row :gutter="10" style="">
|
||||||
|
<a-col :span="22">
|
||||||
|
<span>PAC没有拦截到的域名,可以在此处定义;配置为<code>禁用</code>时,将不使用梯子</span>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="primary" icon="plus" @click="addTarget()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row v-for="(item, index) of targets" :key="index" :gutter="10">
|
||||||
|
<a-col :span="18">
|
||||||
|
<a-input v-model="item.key" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="4">
|
||||||
|
<a-select v-model="item.value" style="width:100%">
|
||||||
|
<a-select-option v-for="(item) of overwallOptions" :key="item.value" :value="item.value">
|
||||||
|
{{ item.label }}
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="danger" icon="minus" @click="deleteTarget(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="代理服务端" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<div>
|
||||||
|
<a-row :gutter="10" style="">
|
||||||
|
<a-col :span="22">
|
||||||
|
<span>Nginx二层代理服务端配置</span>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="primary" icon="plus" @click="addServer()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row v-for="(item, index) of servers" :key="index" :gutter="10">
|
||||||
|
<a-col :span="6">
|
||||||
|
<a-input v-model="item.key" addon-before="域名" placeholder="yourdomain.com" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="5">
|
||||||
|
<a-input v-model="item.value.port" addon-before="端口" placeholder="443" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="6">
|
||||||
|
<a-input v-model="item.value.path" addon-before="路径" placeholder="xxxxxx" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="5">
|
||||||
|
<a-input v-model="item.value.password" addon-before="密码" type="password" placeholder="password" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="danger" icon="minus" @click="deleteServer(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<div class="form-help">
|
||||||
|
您可以在此处配置自己的代理服务器地址。<br>
|
||||||
|
警告:请勿使用来源不明的服务器地址,有安全风险!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<template slot="footer">
|
||||||
|
<div class="footer-bar">
|
||||||
|
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
||||||
|
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ds-container>
|
||||||
|
</template>
|
||||||
|
|
|
@ -1,31 +1,76 @@
|
||||||
|
<script>
|
||||||
|
import Plugin from '../../mixins/plugin'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'pip',
|
||||||
|
mixins: [Plugin],
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
key: 'plugin.pip',
|
||||||
|
npmVariables: undefined,
|
||||||
|
registry: false,
|
||||||
|
trustedHostList: [],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
console.log('status:', this.status)
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
ready () {
|
||||||
|
},
|
||||||
|
async applyBefore () {
|
||||||
|
this.config.plugin.pip.setting.trustedHost = this.config.plugin.pip.setting.trustedHost.replaceAll(/[,,。+\s]+/g, ' ').trim()
|
||||||
|
},
|
||||||
|
async applyAfter () {
|
||||||
|
await this.$api.plugin.pip.start()
|
||||||
|
await this.$api.proxy.restart()
|
||||||
|
},
|
||||||
|
async onSwitchRegistry (event) {
|
||||||
|
await this.setRegistry({ registry: event.target.value })
|
||||||
|
this.$message.success('切换成功')
|
||||||
|
},
|
||||||
|
async setRegistry ({ registry }) {
|
||||||
|
this.config.plugin.pip.setting.registry = registry
|
||||||
|
const domain = registry.substring(registry.indexOf('//') + 2, registry.indexOf('/', 8))
|
||||||
|
this.config.plugin.pip.setting.trustedHost = domain
|
||||||
|
await this.apply()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ds-container>
|
<ds-container>
|
||||||
<template slot="header">
|
<template slot="header">
|
||||||
PIP加速
|
PIP加速
|
||||||
<span style="color:#999;">
|
|
||||||
</span>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div v-if="config">
|
<div v-if="config">
|
||||||
<a-form layout="horizontal">
|
<a-form layout="horizontal">
|
||||||
<!-- <a-form-item label="启用PIP加速" :label-col="labelCol" :wrapper-col="wrapperCol">-->
|
<!-- <a-form-item label="启用PIP加速" :label-col="labelCol" :wrapper-col="wrapperCol"> -->
|
||||||
<!-- <a-checkbox v-model="config.plugin.pip.enabled">-->
|
<!-- <a-checkbox v-model="config.plugin.pip.enabled"> -->
|
||||||
<!-- 随应用启动-->
|
<!-- 随应用启动 -->
|
||||||
<!-- </a-checkbox>-->
|
<!-- </a-checkbox> -->
|
||||||
<!-- <a-tag v-if="status.plugin.pip.enabled" color="green">-->
|
<!-- <a-tag v-if="status.plugin.pip.enabled" color="green"> -->
|
||||||
<!-- 当前已启动-->
|
<!-- 当前已启动 -->
|
||||||
<!-- </a-tag>-->
|
<!-- </a-tag> -->
|
||||||
<!-- <a-tag v-else color="red">-->
|
<!-- <a-tag v-else color="red"> -->
|
||||||
<!-- 当前未启动-->
|
<!-- 当前未启动 -->
|
||||||
<!-- </a-tag>-->
|
<!-- </a-tag> -->
|
||||||
<!-- </a-form-item>-->
|
<!-- </a-form-item> -->
|
||||||
<a-form-item label="pip命令名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form-item label="pip命令名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-input v-model="config.plugin.pip.setting.command"></a-input>
|
<a-input v-model="config.plugin.pip.setting.command" />
|
||||||
<div class="form-help">如果你的<code>pip</code>命令改成了其他名字(如<code>pip3</code>),或想设置绿色版<code>pip</code>程序路径,可在此处修改</div>
|
<div class="form-help">
|
||||||
|
如果你的<code>pip</code>命令改成了其他名字(如<code>pip3</code>),或想设置绿色版<code>pip</code>程序路径,可在此处修改
|
||||||
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form-item label="仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-radio-group v-model="config.plugin.pip.setting.registry" @change="onSwitchRegistry"
|
<a-radio-group
|
||||||
default-value="https://pypi.org/simple/" button-style="solid">
|
v-model="config.plugin.pip.setting.registry" default-value="https://pypi.org/simple/"
|
||||||
|
button-style="solid" @change="onSwitchRegistry"
|
||||||
|
>
|
||||||
<a-radio-button value="https://pypi.org/simple/" title="https://pypi.org/simple/">
|
<a-radio-button value="https://pypi.org/simple/" title="https://pypi.org/simple/">
|
||||||
原生
|
原生
|
||||||
</a-radio-button>
|
</a-radio-button>
|
||||||
|
@ -60,12 +105,14 @@
|
||||||
山东理工大学镜像
|
山东理工大学镜像
|
||||||
</a-radio-button>
|
</a-radio-button>
|
||||||
</a-radio-group>
|
</a-radio-group>
|
||||||
<div class="form-help">设置后立即生效,即使关闭 ds 也会继续保持</div>
|
<div class="form-help">
|
||||||
|
设置后立即生效,即使关闭 ds 也会继续保持
|
||||||
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
<a-form-item label="信任仓库域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
<a-form-item label="信任仓库域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
<a-input v-model="config.plugin.pip.setting.trustedHost"></a-input>
|
<a-input v-model="config.plugin.pip.setting.trustedHost" />
|
||||||
<div class="form-help">
|
<div class="form-help">
|
||||||
使用以上域名安装包时,不会进行SSL证书验证,多个域名用空格隔开<br/>
|
使用以上域名安装包时,不会进行SSL证书验证,多个域名用空格隔开<br>
|
||||||
注意:切换仓库镜像同时会修改<code>pip.ini</code>中的<code>trusted-host</code>配置,即使关闭 ds 也会继续保持
|
注意:切换仓库镜像同时会修改<code>pip.ini</code>中的<code>trusted-host</code>配置,即使关闭 ds 也会继续保持
|
||||||
</div>
|
</div>
|
||||||
</a-form-item>
|
</a-form-item>
|
||||||
|
@ -78,51 +125,4 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</ds-container>
|
</ds-container>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
|
||||||
import Plugin from '../../mixins/plugin'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'pip',
|
|
||||||
mixins: [Plugin],
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
key: 'plugin.pip',
|
|
||||||
npmVariables: undefined,
|
|
||||||
registry: false,
|
|
||||||
trustedHostList: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
created () {
|
|
||||||
console.log('status:', this.status)
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
ready () {
|
|
||||||
},
|
|
||||||
async applyBefore () {
|
|
||||||
this.config.plugin.pip.setting.trustedHost = this.config.plugin.pip.setting.trustedHost.replaceAll(/[,,。+\s]+/g, ' ').trim()
|
|
||||||
},
|
|
||||||
async applyAfter () {
|
|
||||||
await this.$api.plugin.pip.start()
|
|
||||||
await this.$api.proxy.restart()
|
|
||||||
},
|
|
||||||
async onSwitchRegistry (event) {
|
|
||||||
await this.setRegistry({ registry: event.target.value })
|
|
||||||
this.$message.success('切换成功')
|
|
||||||
},
|
|
||||||
async setRegistry ({ registry }) {
|
|
||||||
this.config.plugin.pip.setting.registry = registry
|
|
||||||
const domain = registry.substring(registry.indexOf('//') + 2, registry.indexOf('/', 8))
|
|
||||||
this.config.plugin.pip.setting.trustedHost = domain
|
|
||||||
await this.apply()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<style lang="sass">
|
|
||||||
</style>
|
|
||||||
|
|
|
@ -1,126 +1,6 @@
|
||||||
<template>
|
|
||||||
<ds-container>
|
|
||||||
<template slot="header">
|
|
||||||
系统代理设置
|
|
||||||
<span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div v-if="config">
|
|
||||||
<a-form-item label="启用系统代理" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.proxy.enabled" >
|
|
||||||
随应用启动
|
|
||||||
</a-checkbox>
|
|
||||||
<a-tag v-if="status.proxy.enabled" color="green">
|
|
||||||
当前已启动
|
|
||||||
</a-tag>
|
|
||||||
<a-tag v-else color="red">
|
|
||||||
当前未启动
|
|
||||||
</a-tag>
|
|
||||||
<div class="form-help">
|
|
||||||
<a @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/recover.md')">卸载与恢复网络说明</a>
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="代理HTTP请求" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.proxy.proxyHttp" >
|
|
||||||
是否代理HTTP请求
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
勾选时,同时代理<code>HTTP</code>和<code>HTTPS</code>请求;不勾选时,只代理<code>HTTPS</code>请求<br/>
|
|
||||||
提示:仅为了加速访问<code>Github网站</code>的用户,建议不勾选。
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
|
|
||||||
<!-- 以下两个功能仅windows支持,mac和linux暂不支持 -->
|
|
||||||
<a-form-item v-if="isWindows()" label="设置环境变量" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.proxy.setEnv" >
|
|
||||||
是否同时修改<code>HTTPS_PROXY</code>环境变量(不好用,不建议勾选)
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
当发现某些应用并没有走加速通道或加速报错时,可尝试勾选此选项,并重新开启系统代理开关<br/>
|
|
||||||
注意:当前已打开的命令行并不会实时生效,需要重新打开一个新的命令行窗口
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item v-if="isWindows()" label="设置loopback" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-button @click="loopbackVisible=true">去设置</a-button>
|
|
||||||
<div class="form-help">解决<code>OneNote</code>、<code>MicrosoftStore</code>、<code>Outlook</code>等<code>UWP应用</code>开启代理后无法访问网络的问题</div>
|
|
||||||
</a-form-item>
|
|
||||||
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="排除国内域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.proxy.excludeDomesticDomainAllowList" >
|
|
||||||
是否排除国内域名白名单
|
|
||||||
</a-checkbox>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="自动更新国内域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.proxy.autoUpdateDomesticDomainAllowList" >
|
|
||||||
是否自动更新国内域名白名单
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
开启自动更新并启动系统代理时,将会异步从下面的远程地址下载国内域名白名单文件到本地。<br/>
|
|
||||||
注:只要下载成功后,即使关闭自动更新功能,也会优先读取最近下载的文件!
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="远程国内域名地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.proxy.remoteDomesticDomainAllowListFileUrl" :title="config.proxy.remoteDomesticDomainAllowListFileUrl"></a-input>
|
|
||||||
<div class="form-help">
|
|
||||||
远程国内域名白名单文件内容可以是<code>base64</code>编码格式,也可以是未经过编码的
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="自定义排除域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-row :gutter="10">
|
|
||||||
<a-col :span="22">
|
|
||||||
<span>访问的域名或IP符合下列配置时,将跳过系统代理</span>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="primary" icon="plus" @click="addExcludeIp()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" v-for="(item,index) of excludeIpList" :key='index'>
|
|
||||||
<a-col :span="22">
|
|
||||||
<a-input :disabled="item.value === false" v-model="item.key"></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button type="danger" icon="minus" @click="delExcludeIp(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-form-item>
|
|
||||||
</div>
|
|
||||||
<template slot="footer">
|
|
||||||
<div class="footer-bar">
|
|
||||||
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
|
||||||
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<a-drawer
|
|
||||||
placement="right"
|
|
||||||
:closable="false"
|
|
||||||
:visible.sync="loopbackVisible"
|
|
||||||
width="660px"
|
|
||||||
height="100%"
|
|
||||||
@close="loopbackVisible=false"
|
|
||||||
:slots="{ title: 'title' }"
|
|
||||||
wrapClassName="json-wrapper"
|
|
||||||
>
|
|
||||||
<template slot="title">
|
|
||||||
设置Loopback <a-button style="float:right;margin-right:10px;" @click="openEnableLoopback()">打开EnableLoopback</a-button>
|
|
||||||
</template>
|
|
||||||
<div>
|
|
||||||
<div>1、此设置用于解决OneNote、MicrosoftStore、Outlook等UWP应用无法访问网络的问题。</div>
|
|
||||||
<div>2、点击右上方按钮,打开EnableLoopback,然后按下图所示操作即可</div>
|
|
||||||
<div>3、注意:此操作需要<b style="color:red">DevSidecar以管理员身份启动</b>,才能打开下面的EnableLoopback设置界面</div>
|
|
||||||
<img style="margin-top:20px;border:1px solid #eee" width="80%" src="loopback.png"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</a-drawer>
|
|
||||||
</ds-container>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Plugin from '../mixins/plugin'
|
import Plugin from '../mixins/plugin'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Proxy',
|
name: 'Proxy',
|
||||||
mixins: [Plugin],
|
mixins: [Plugin],
|
||||||
|
@ -128,7 +8,7 @@ export default {
|
||||||
return {
|
return {
|
||||||
key: 'proxy',
|
key: 'proxy',
|
||||||
loopbackVisible: false,
|
loopbackVisible: false,
|
||||||
excludeIpList: []
|
excludeIpList: [],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async created () {
|
async created () {
|
||||||
|
@ -152,11 +32,11 @@ export default {
|
||||||
try {
|
try {
|
||||||
await this.$api.proxy.setEnableLoopback()
|
await this.$api.proxy.setEnableLoopback()
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (e.message.indexOf('EACCES') !== -1) {
|
if (e.message.includes('EACCES')) {
|
||||||
this.$message.error('请将DevSidecar关闭后,以管理员身份重新打开,再尝试此操作')
|
this.$message.error('请将DevSidecar关闭后,以管理员身份重新打开,再尝试此操作')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
this.$message.error('打开失败:' + e.message)
|
this.$message.error(`打开失败:${e.message}`)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
getProxyConfig () {
|
getProxyConfig () {
|
||||||
|
@ -167,7 +47,8 @@ export default {
|
||||||
for (const key in this.config.proxy.excludeIpList) {
|
for (const key in this.config.proxy.excludeIpList) {
|
||||||
const value = this.config.proxy.excludeIpList[key]
|
const value = this.config.proxy.excludeIpList[key]
|
||||||
this.excludeIpList.push({
|
this.excludeIpList.push({
|
||||||
key, value
|
key,
|
||||||
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -185,9 +66,127 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.config.proxy.excludeIpList = excludeIpList
|
this.config.proxy.excludeIpList = excludeIpList
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass">
|
|
||||||
</style>
|
<template>
|
||||||
|
<ds-container>
|
||||||
|
<template slot="header">
|
||||||
|
系统代理设置
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div v-if="config">
|
||||||
|
<a-form-item label="启用系统代理" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.proxy.enabled">
|
||||||
|
随应用启动
|
||||||
|
</a-checkbox>
|
||||||
|
<a-tag v-if="status.proxy.enabled" color="green">
|
||||||
|
当前已启动
|
||||||
|
</a-tag>
|
||||||
|
<a-tag v-else color="red">
|
||||||
|
当前未启动
|
||||||
|
</a-tag>
|
||||||
|
<div class="form-help">
|
||||||
|
<a @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/recover.md')">卸载与恢复网络说明</a>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="代理HTTP请求" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.proxy.proxyHttp">
|
||||||
|
是否代理HTTP请求
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
勾选时,同时代理<code>HTTP</code>和<code>HTTPS</code>请求;不勾选时,只代理<code>HTTPS</code>请求<br>
|
||||||
|
提示:仅为了加速访问<code>Github网站</code>的用户,建议不勾选。
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<!-- 以下两个功能仅windows支持,mac和linux暂不支持 -->
|
||||||
|
<a-form-item v-if="isWindows()" label="设置环境变量" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.proxy.setEnv">
|
||||||
|
是否同时修改<code>HTTPS_PROXY</code>环境变量(不好用,不建议勾选)
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
当发现某些应用并没有走加速通道或加速报错时,可尝试勾选此选项,并重新开启系统代理开关<br>
|
||||||
|
注意:当前已打开的命令行并不会实时生效,需要重新打开一个新的命令行窗口
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item v-if="isWindows()" label="设置loopback" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-button @click="loopbackVisible = true">去设置</a-button>
|
||||||
|
<div class="form-help">
|
||||||
|
解决<code>OneNote</code>、<code>MicrosoftStore</code>、<code>Outlook</code>等<code>UWP应用</code>开启代理后无法访问网络的问题
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="排除国内域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.proxy.excludeDomesticDomainAllowList">
|
||||||
|
是否排除国内域名白名单
|
||||||
|
</a-checkbox>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="自动更新国内域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.proxy.autoUpdateDomesticDomainAllowList">
|
||||||
|
是否自动更新国内域名白名单
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
开启自动更新并启动系统代理时,将会异步从下面的远程地址下载国内域名白名单文件到本地。<br>
|
||||||
|
注:只要下载成功后,即使关闭自动更新功能,也会优先读取最近下载的文件!
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="远程国内域名地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.proxy.remoteDomesticDomainAllowListFileUrl" :title="config.proxy.remoteDomesticDomainAllowListFileUrl" />
|
||||||
|
<div class="form-help">
|
||||||
|
远程国内域名白名单文件内容可以是<code>base64</code>编码格式,也可以是未经过编码的
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="自定义排除域名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="10">
|
||||||
|
<a-col :span="22">
|
||||||
|
<span>访问的域名或IP符合下列配置时,将跳过系统代理</span>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="primary" icon="plus" @click="addExcludeIp()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row v-for="(item, index) of excludeIpList" :key="index" :gutter="10">
|
||||||
|
<a-col :span="22">
|
||||||
|
<a-input v-model="item.key" :disabled="item.value === false" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button type="danger" icon="minus" @click="delExcludeIp(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<template slot="footer">
|
||||||
|
<div class="footer-bar">
|
||||||
|
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
||||||
|
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<a-drawer
|
||||||
|
placement="right"
|
||||||
|
:closable="false"
|
||||||
|
:visible.sync="loopbackVisible"
|
||||||
|
width="660px"
|
||||||
|
height="100%"
|
||||||
|
:slots="{ title: 'title' }"
|
||||||
|
wrap-class-name="json-wrapper"
|
||||||
|
@close="loopbackVisible = false"
|
||||||
|
>
|
||||||
|
<template slot="title">
|
||||||
|
设置Loopback
|
||||||
|
<a-button style="float:right;margin-right:10px;" @click="openEnableLoopback()">打开EnableLoopback</a-button>
|
||||||
|
</template>
|
||||||
|
<div>
|
||||||
|
<div>1、此设置用于解决OneNote、MicrosoftStore、Outlook等UWP应用无法访问网络的问题。</div>
|
||||||
|
<div>2、点击右上方按钮,打开EnableLoopback,然后按下图所示操作即可</div>
|
||||||
|
<div>3、注意:此操作需要<b style="color:red">DevSidecar以管理员身份启动</b>,才能打开下面的EnableLoopback设置界面</div>
|
||||||
|
<img style="margin-top:20px;border:1px solid #eee" width="80%" src="loopback.png">
|
||||||
|
</div>
|
||||||
|
</a-drawer>
|
||||||
|
</ds-container>
|
||||||
|
</template>
|
||||||
|
|
|
@ -1,247 +1,12 @@
|
||||||
<template>
|
|
||||||
<ds-container>
|
|
||||||
<template slot="header">
|
|
||||||
加速服务设置
|
|
||||||
<span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div style="height: 100%" class="json-wrapper">
|
|
||||||
<a-tabs
|
|
||||||
default-active-key="1"
|
|
||||||
tab-position="left"
|
|
||||||
:style="{ height: '100%' }"
|
|
||||||
v-if="config"
|
|
||||||
@change="handleTabChange"
|
|
||||||
>
|
|
||||||
<a-tab-pane tab="基本设置" key="1">
|
|
||||||
<div style="padding-right:10px">
|
|
||||||
<a-form-item label="代理服务:" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.server.enabled">
|
|
||||||
随应用启动
|
|
||||||
</a-checkbox>
|
|
||||||
<a-tag v-if="status.proxy.enabled" color="green">
|
|
||||||
当前已启动
|
|
||||||
</a-tag>
|
|
||||||
<a-tag v-else color="red">
|
|
||||||
当前未启动
|
|
||||||
</a-tag>
|
|
||||||
<a-button class="md-mr-10" icon="profile" @click="openLog()">日志</a-button>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="绑定IP" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.server.host"/>
|
|
||||||
<div class="form-help">你可以设置为<code>0.0.0.0</code>,让其他电脑可以使用此代理服务</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="代理端口" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input-number v-model="config.server.port" :min="0" :max="65535"/>
|
|
||||||
<div class="form-help">修改后需要重启应用</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="全局校验SSL" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.server.setting.NODE_TLS_REJECT_UNAUTHORIZED">
|
|
||||||
NODE_TLS_REJECT_UNAUTHORIZED
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">高风险操作,没有特殊情况请勿关闭</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="代理校验SSL" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.server.setting.verifySsl">
|
|
||||||
校验加速目标网站的ssl证书
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">如果目标网站证书有问题,但你想强行访问,可以临时关闭此项</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="根证书" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input-search addon-before="Cert" enter-button="选择" @search="onCrtSelect"
|
|
||||||
v-model="config.server.setting.rootCaFile.certPath"
|
|
||||||
:title="config.server.setting.rootCaFile.certPath"/>
|
|
||||||
<a-input-search addon-before="Key" enter-button="选择" @search="onKeySelect"
|
|
||||||
v-model="config.server.setting.rootCaFile.keyPath"
|
|
||||||
:title="config.server.setting.rootCaFile.keyPath"/>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="启用拦截" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.server.intercept.enabled">
|
|
||||||
启用拦截
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">关闭拦截,且关闭功能增强时,就不需要安装根证书,退化为安全模式</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="启用脚本" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.server.setting.script.enabled">
|
|
||||||
允许插入并运行脚本
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">关闭后,<code>Github油猴脚本</code>也将关闭</div>
|
|
||||||
</a-form-item>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="拦截设置" key="2">
|
|
||||||
<vue-json-editor style="height:100%" ref="editor" v-model="config.server.intercepts" mode="code"
|
|
||||||
:show-btns="false" :expandedOnStart="true"></vue-json-editor>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="超时时间设置" key="3">
|
|
||||||
<div style="height:100%;display:flex;flex-direction:column;padding-right:10px">
|
|
||||||
<a-form-item label="默认超时时间" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
请求:<a-input-number v-model="config.server.setting.defaultTimeout" :step="1000" :min="1000"/> ms,对应<code>timeout</code>配置<br/>
|
|
||||||
连接:<a-input-number v-model="config.server.setting.defaultKeepAliveTimeout" :step="1000" :min="1000"/> ms,对应<code>keepAliveTimeout</code>配置
|
|
||||||
</a-form-item>
|
|
||||||
<hr style="margin-bottom:15px"/>
|
|
||||||
<div>这里指定域名的超时时间:<span class="form-help">(域名配置可使用通配符或正则)</span></div>
|
|
||||||
<vue-json-editor style="flex-grow:1;min-height:300px;margin-top:10px" ref="editor" v-model="config.server.setting.timeoutMapping" mode="code"
|
|
||||||
:show-btns="false" :expandedOnStart="true"></vue-json-editor>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="域名白名单" key="4">
|
|
||||||
<a-row style="margin-top:10px">
|
|
||||||
<a-col span="19">
|
|
||||||
<div>这里配置的域名不会通过代理</div>
|
|
||||||
</a-col>
|
|
||||||
<a-col span="3">
|
|
||||||
<a-button style="margin-left:8px" type="primary" icon="plus" @click="addWhiteList()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" style="margin-top: 5px" v-for="(item,index) of whiteList" :key='index'>
|
|
||||||
<a-col :span="19">
|
|
||||||
<a-input :disabled="item.value === false" v-model="item.key"></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="3">
|
|
||||||
<a-button v-if="item.value !== false" type="danger" icon="minus" @click="deleteWhiteList(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="自动兼容程序" key="5">
|
|
||||||
<div style="height:100%;display:flex;flex-direction:column">
|
|
||||||
<div>
|
|
||||||
说明:<code>自动兼容程序</code>会自动根据错误信息进行兼容性调整,并将兼容设置保存在 <code>~/.dev-sidecar/automaticCompatibleConfig.json</code> 文件中。但并不是所有的兼容设置都是正确的,所以需要通过以下配置来覆盖错误的兼容设置。
|
|
||||||
</div>
|
|
||||||
<vue-json-editor style="flex-grow:1;min-height:300px;margin-top:10px;" ref="editor" v-model="config.server.compatible" mode="code"
|
|
||||||
:show-btns="false" :expandedOnStart="true"></vue-json-editor>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="IP预设置" key="6">
|
|
||||||
<div style="height:100%;display:flex;flex-direction:column">
|
|
||||||
<div>
|
|
||||||
提示:<code>IP预设置</code>功能,优先级高于 <code>DNS设置</code>
|
|
||||||
<span class="form-help">(域名配置可使用通配符或正则)</span>
|
|
||||||
</div>
|
|
||||||
<vue-json-editor style="flex-grow:1;min-height:300px;margin-top:10px;" ref="editor" v-model="config.server.preSetIpList" mode="code"
|
|
||||||
:show-btns="false" :expandedOnStart="true"></vue-json-editor>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="DNS服务管理" key="7">
|
|
||||||
<vue-json-editor style="height:100%" ref="editor" v-model="config.server.dns.providers" mode="code"
|
|
||||||
:show-btns="false" :expandedOnStart="true"></vue-json-editor>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="DNS设置" key="8">
|
|
||||||
<div>
|
|
||||||
<a-row style="margin-top:10px">
|
|
||||||
<a-col span="19">
|
|
||||||
<div>这里配置哪些域名需要通过国外DNS服务器获取IP进行访问</div>
|
|
||||||
</a-col>
|
|
||||||
<a-col span="3">
|
|
||||||
<a-button style="margin-left:8px" type="primary" icon="plus" @click="addDnsMapping()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" style="margin-top: 5px" v-for="(item,index) of dnsMappings" :key='index'>
|
|
||||||
<a-col :span="14">
|
|
||||||
<a-input :disabled="item.value === false" v-model="item.key"></a-input>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="5">
|
|
||||||
<a-select :disabled="item.value === false" v-model="item.value" style="width: 100%">
|
|
||||||
<a-select-option v-for="(item) of speedDnsOptions" :key="item.value" :value="item.value">
|
|
||||||
{{ item.value }}
|
|
||||||
</a-select-option>
|
|
||||||
</a-select>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="3">
|
|
||||||
<a-button v-if="item.value !== false" type="danger" icon="minus" @click="deleteDnsMapping(item,index)"/>
|
|
||||||
<a-button v-if="item.value === false" type="primary" icon="checked" @click="restoreDefDnsMapping(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
<a-tab-pane tab="IP测速" key="9">
|
|
||||||
<div class="ip-tester" style="padding-right: 10px">
|
|
||||||
<a-alert type="info" message="对从DNS获取到的IP进行测速,使用速度最快的IP进行访问(注意:对使用了增强功能的域名没啥用)"></a-alert>
|
|
||||||
<a-form-item label="开启DNS测速" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="getSpeedTestConfig().enabled">
|
|
||||||
启用
|
|
||||||
</a-checkbox>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="自动测试间隔" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input-number v-model="getSpeedTestConfig().interval" :step="1000" :min="1"/> ms
|
|
||||||
</a-form-item>
|
|
||||||
<!--<a-form-item label="慢速IP阈值" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input-number v-model="config.server.setting.lowSpeedDelay" :step="10" :min="100"/> ms
|
|
||||||
</a-form-item>-->
|
|
||||||
<div>使用以下DNS获取IP进行测速</div>
|
|
||||||
<a-row style="margin-top:10px">
|
|
||||||
<a-col span="24">
|
|
||||||
<a-checkbox-group
|
|
||||||
v-model="getSpeedTestConfig().dnsProviders"
|
|
||||||
:options="speedDnsOptions"
|
|
||||||
/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" class="mt20">
|
|
||||||
<a-col :span="21">
|
|
||||||
以下域名在启动后立即进行测速,其他域名在第一次访问时才测速
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button style="margin-left:10px" type="primary" icon="plus" @click="addSpeedHostname()"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
<a-row :gutter="10" style="margin-top: 5px" v-for="(item,index) of getSpeedTestConfig().hostnameList"
|
|
||||||
:key='index'>
|
|
||||||
<a-col :span="21">
|
|
||||||
<a-input v-model="getSpeedTestConfig().hostnameList[index]"/>
|
|
||||||
</a-col>
|
|
||||||
<a-col :span="2">
|
|
||||||
<a-button style="margin-left:10px" type="danger" icon="minus" @click="delSpeedHostname(item,index)"/>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
|
|
||||||
<a-divider/>
|
|
||||||
<a-row :gutter="10" class="mt10">
|
|
||||||
<a-col span="24">
|
|
||||||
<a-button type="primary" icon="plus" @click="reSpeedTest()">立即重新测速</a-button>
|
|
||||||
<a-button class="md-ml-10" type="primary" icon="reload" @click="reloadAllSpeedTester()">刷新</a-button>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
|
|
||||||
<a-row :gutter="20">
|
|
||||||
<a-col span="12" v-for="(item,key) of speedTestList" :key='key'>
|
|
||||||
<a-card size="small" class="md-mt-10" :title="key">
|
|
||||||
<a slot="extra" href="#">
|
|
||||||
<a-icon v-if="item.alive.length>0" type="check"/>
|
|
||||||
<a-icon v-else type="info-circle"/>
|
|
||||||
</a>
|
|
||||||
<a-tag style="margin:2px;" v-for="(element,index) of item.backupList" :title="element.dns"
|
|
||||||
:color="element.time?(element.time>config.server.setting.lowSpeedDelay?'orange':'green'):'red'" :key='index'>
|
|
||||||
{{ element.host }} {{ element.time }}{{ element.time ? 'ms' : '' }} {{ element.dns }}
|
|
||||||
</a-tag>
|
|
||||||
</a-card>
|
|
||||||
</a-col>
|
|
||||||
</a-row>
|
|
||||||
</div>
|
|
||||||
</a-tab-pane>
|
|
||||||
</a-tabs>
|
|
||||||
</div>
|
|
||||||
<template slot="footer">
|
|
||||||
<div class="footer-bar">
|
|
||||||
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
|
||||||
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ds-container>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import _ from 'lodash'
|
||||||
import vueJsonEditor from 'vue-json-editor-fix-cn'
|
import vueJsonEditor from 'vue-json-editor-fix-cn'
|
||||||
import Plugin from '../mixins/plugin'
|
import Plugin from '../mixins/plugin'
|
||||||
import _ from 'lodash'
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Server',
|
name: 'Server',
|
||||||
components: {
|
components: {
|
||||||
vueJsonEditor
|
VueJsonEditor: vueJsonEditor,
|
||||||
},
|
},
|
||||||
mixins: [Plugin],
|
mixins: [Plugin],
|
||||||
data () {
|
data () {
|
||||||
|
@ -249,14 +14,9 @@ export default {
|
||||||
key: 'server',
|
key: 'server',
|
||||||
dnsMappings: [],
|
dnsMappings: [],
|
||||||
speedTestList: [],
|
speedTestList: [],
|
||||||
whiteList: []
|
whiteList: [],
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
this.registerSpeedTestEvent()
|
|
||||||
},
|
|
||||||
computed: {
|
computed: {
|
||||||
speedDnsOptions () {
|
speedDnsOptions () {
|
||||||
const options = []
|
const options = []
|
||||||
|
@ -266,11 +26,16 @@ export default {
|
||||||
_.forEach(this.config.server.dns.providers, (dnsConfig, key) => {
|
_.forEach(this.config.server.dns.providers, (dnsConfig, key) => {
|
||||||
options.push({
|
options.push({
|
||||||
value: key,
|
value: key,
|
||||||
label: key
|
label: key,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
return options
|
return options
|
||||||
}
|
},
|
||||||
|
},
|
||||||
|
created () {
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
this.registerSpeedTestEvent()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async onCrtSelect () {
|
async onCrtSelect () {
|
||||||
|
@ -307,7 +72,8 @@ export default {
|
||||||
for (const key in this.config.server.dns.mapping) {
|
for (const key in this.config.server.dns.mapping) {
|
||||||
const value = this.config.server.dns.mapping[key]
|
const value = this.config.server.dns.mapping[key]
|
||||||
this.dnsMappings.push({
|
this.dnsMappings.push({
|
||||||
key, value
|
key,
|
||||||
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -336,7 +102,8 @@ export default {
|
||||||
for (const key in this.config.server.whiteList) {
|
for (const key in this.config.server.whiteList) {
|
||||||
const value = this.config.server.whiteList[key]
|
const value = this.config.server.whiteList[key]
|
||||||
this.whiteList.push({
|
this.whiteList.push({
|
||||||
key, value
|
key,
|
||||||
|
value,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -357,7 +124,7 @@ export default {
|
||||||
},
|
},
|
||||||
async openLog () {
|
async openLog () {
|
||||||
const dir = await this.$api.info.getConfigDir()
|
const dir = await this.$api.info.getConfigDir()
|
||||||
this.$api.ipc.openPath(dir + '/logs/')
|
this.$api.ipc.openPath(`${dir}/logs/`)
|
||||||
},
|
},
|
||||||
getSpeedTestConfig () {
|
getSpeedTestConfig () {
|
||||||
return this.config.server.dns.speedTest
|
return this.config.server.dns.speedTest
|
||||||
|
@ -404,10 +171,276 @@ export default {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
window.dispatchEvent(new Event('resize'))
|
window.dispatchEvent(new Event('resize'))
|
||||||
}, 10)
|
}, 10)
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<ds-container>
|
||||||
|
<template slot="header">
|
||||||
|
加速服务设置
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div style="height: 100%" class="json-wrapper">
|
||||||
|
<a-tabs
|
||||||
|
v-if="config"
|
||||||
|
default-active-key="1"
|
||||||
|
tab-position="left"
|
||||||
|
:style="{ height: '100%' }"
|
||||||
|
@change="handleTabChange"
|
||||||
|
>
|
||||||
|
<a-tab-pane key="1" tab="基本设置">
|
||||||
|
<div style="padding-right:10px">
|
||||||
|
<a-form-item label="代理服务:" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.server.enabled">
|
||||||
|
随应用启动
|
||||||
|
</a-checkbox>
|
||||||
|
<a-tag v-if="status.proxy.enabled" color="green">
|
||||||
|
当前已启动
|
||||||
|
</a-tag>
|
||||||
|
<a-tag v-else color="red">
|
||||||
|
当前未启动
|
||||||
|
</a-tag>
|
||||||
|
<a-button class="md-mr-10" icon="profile" @click="openLog()">
|
||||||
|
日志
|
||||||
|
</a-button>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="绑定IP" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.server.host" />
|
||||||
|
<div class="form-help">
|
||||||
|
你可以设置为<code>0.0.0.0</code>,让其他电脑可以使用此代理服务
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="代理端口" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input-number v-model="config.server.port" :min="0" :max="65535" />
|
||||||
|
<div class="form-help">
|
||||||
|
修改后需要重启应用
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="全局校验SSL" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.server.setting.NODE_TLS_REJECT_UNAUTHORIZED">
|
||||||
|
NODE_TLS_REJECT_UNAUTHORIZED
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
高风险操作,没有特殊情况请勿关闭
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="代理校验SSL" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.server.setting.verifySsl">
|
||||||
|
校验加速目标网站的ssl证书
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
如果目标网站证书有问题,但你想强行访问,可以临时关闭此项
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="根证书" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input-search
|
||||||
|
v-model="config.server.setting.rootCaFile.certPath" addon-before="Cert" enter-button="选择"
|
||||||
|
:title="config.server.setting.rootCaFile.certPath"
|
||||||
|
@search="onCrtSelect"
|
||||||
|
/>
|
||||||
|
<a-input-search
|
||||||
|
v-model="config.server.setting.rootCaFile.keyPath" addon-before="Key" enter-button="选择"
|
||||||
|
:title="config.server.setting.rootCaFile.keyPath"
|
||||||
|
@search="onKeySelect"
|
||||||
|
/>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="启用拦截" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.server.intercept.enabled">
|
||||||
|
启用拦截
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
关闭拦截,且关闭功能增强时,就不需要安装根证书,退化为安全模式
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="启用脚本" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.server.setting.script.enabled">
|
||||||
|
允许插入并运行脚本
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
关闭后,<code>Github油猴脚本</code>也将关闭
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="2" tab="拦截设置">
|
||||||
|
<VueJsonEditor
|
||||||
|
ref="editor" v-model="config.server.intercepts" style="height:100%" mode="code"
|
||||||
|
:show-btns="false" :expanded-on-start="true"
|
||||||
|
/>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="3" tab="超时时间设置">
|
||||||
|
<div style="height:100%;display:flex;flex-direction:column;padding-right:10px">
|
||||||
|
<a-form-item label="默认超时时间" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
请求:<a-input-number v-model="config.server.setting.defaultTimeout" :step="1000" :min="1000" /> ms,对应<code>timeout</code>配置<br>
|
||||||
|
连接:<a-input-number v-model="config.server.setting.defaultKeepAliveTimeout" :step="1000" :min="1000" /> ms,对应<code>keepAliveTimeout</code>配置
|
||||||
|
</a-form-item>
|
||||||
|
<hr style="margin-bottom:15px">
|
||||||
|
<div>这里指定域名的超时时间:<span class="form-help">(域名配置可使用通配符或正则)</span></div>
|
||||||
|
<VueJsonEditor
|
||||||
|
ref="editor" v-model="config.server.setting.timeoutMapping" style="flex-grow:1;min-height:300px;margin-top:10px" mode="code"
|
||||||
|
:show-btns="false" :expanded-on-start="true"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="4" tab="域名白名单">
|
||||||
|
<a-row style="margin-top:10px">
|
||||||
|
<a-col span="19">
|
||||||
|
<div>这里配置的域名不会通过代理</div>
|
||||||
|
</a-col>
|
||||||
|
<a-col span="3">
|
||||||
|
<a-button style="margin-left:8px" type="primary" icon="plus" @click="addWhiteList()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row v-for="(item, index) of whiteList" :key="index" :gutter="10" style="margin-top: 5px">
|
||||||
|
<a-col :span="19">
|
||||||
|
<a-input v-model="item.key" :disabled="item.value === false" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="3">
|
||||||
|
<a-button v-if="item.value !== false" type="danger" icon="minus" @click="deleteWhiteList(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="5" tab="自动兼容程序">
|
||||||
|
<div style="height:100%;display:flex;flex-direction:column">
|
||||||
|
<div>
|
||||||
|
说明:<code>自动兼容程序</code>会自动根据错误信息进行兼容性调整,并将兼容设置保存在 <code>~/.dev-sidecar/automaticCompatibleConfig.json</code> 文件中。但并不是所有的兼容设置都是正确的,所以需要通过以下配置来覆盖错误的兼容设置。
|
||||||
|
</div>
|
||||||
|
<VueJsonEditor
|
||||||
|
ref="editor" v-model="config.server.compatible" style="flex-grow:1;min-height:300px;margin-top:10px;" mode="code"
|
||||||
|
:show-btns="false" :expanded-on-start="true"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="6" tab="IP预设置">
|
||||||
|
<div style="height:100%;display:flex;flex-direction:column">
|
||||||
|
<div>
|
||||||
|
提示:<code>IP预设置</code>功能,优先级高于 <code>DNS设置</code>
|
||||||
|
<span class="form-help">(域名配置可使用通配符或正则)</span>
|
||||||
|
</div>
|
||||||
|
<VueJsonEditor
|
||||||
|
ref="editor" v-model="config.server.preSetIpList" style="flex-grow:1;min-height:300px;margin-top:10px;" mode="code"
|
||||||
|
:show-btns="false" :expanded-on-start="true"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="7" tab="DNS服务管理">
|
||||||
|
<VueJsonEditor
|
||||||
|
ref="editor" v-model="config.server.dns.providers" style="height:100%" mode="code"
|
||||||
|
:show-btns="false" :expanded-on-start="true"
|
||||||
|
/>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="8" tab="DNS设置">
|
||||||
|
<div>
|
||||||
|
<a-row style="margin-top:10px">
|
||||||
|
<a-col span="19">
|
||||||
|
<div>这里配置哪些域名需要通过国外DNS服务器获取IP进行访问</div>
|
||||||
|
</a-col>
|
||||||
|
<a-col span="3">
|
||||||
|
<a-button style="margin-left:8px" type="primary" icon="plus" @click="addDnsMapping()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row v-for="(item, index) of dnsMappings" :key="index" :gutter="10" style="margin-top: 5px">
|
||||||
|
<a-col :span="14">
|
||||||
|
<a-input v-model="item.key" :disabled="item.value === false" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="5">
|
||||||
|
<a-select v-model="item.value" :disabled="item.value === false" style="width: 100%">
|
||||||
|
<a-select-option v-for="(item) of speedDnsOptions" :key="item.value" :value="item.value">
|
||||||
|
{{ item.value }}
|
||||||
|
</a-select-option>
|
||||||
|
</a-select>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="3">
|
||||||
|
<a-button v-if="item.value !== false" type="danger" icon="minus" @click="deleteDnsMapping(item, index)" />
|
||||||
|
<a-button v-if="item.value === false" type="primary" icon="checked" @click="restoreDefDnsMapping(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
<a-tab-pane key="9" tab="IP测速">
|
||||||
|
<div class="ip-tester" style="padding-right: 10px">
|
||||||
|
<a-alert type="info" message="对从DNS获取到的IP进行测速,使用速度最快的IP进行访问(注意:对使用了增强功能的域名没啥用)" />
|
||||||
|
<a-form-item label="开启DNS测速" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="getSpeedTestConfig().enabled">
|
||||||
|
启用
|
||||||
|
</a-checkbox>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="自动测试间隔" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input-number v-model="getSpeedTestConfig().interval" :step="1000" :min="1" /> ms
|
||||||
|
</a-form-item>
|
||||||
|
<!-- <a-form-item label="慢速IP阈值" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input-number v-model="config.server.setting.lowSpeedDelay" :step="10" :min="100"/> ms
|
||||||
|
</a-form-item> -->
|
||||||
|
<div>使用以下DNS获取IP进行测速</div>
|
||||||
|
<a-row style="margin-top:10px">
|
||||||
|
<a-col span="24">
|
||||||
|
<a-checkbox-group
|
||||||
|
v-model="getSpeedTestConfig().dnsProviders"
|
||||||
|
:options="speedDnsOptions"
|
||||||
|
/>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row :gutter="10" class="mt20">
|
||||||
|
<a-col :span="21">
|
||||||
|
以下域名在启动后立即进行测速,其他域名在第一次访问时才测速
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button style="margin-left:10px" type="primary" icon="plus" @click="addSpeedHostname()" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
<a-row
|
||||||
|
v-for="(item, index) of getSpeedTestConfig().hostnameList" :key="index" :gutter="10"
|
||||||
|
style="margin-top: 5px"
|
||||||
|
>
|
||||||
|
<a-col :span="21">
|
||||||
|
<a-input v-model="getSpeedTestConfig().hostnameList[index]" />
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="2">
|
||||||
|
<a-button style="margin-left:10px" type="danger" icon="minus" @click="delSpeedHostname(item, index)" />
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
|
<a-divider />
|
||||||
|
<a-row :gutter="10" class="mt10">
|
||||||
|
<a-col span="24">
|
||||||
|
<a-button type="primary" icon="plus" @click="reSpeedTest()">立即重新测速</a-button>
|
||||||
|
<a-button class="md-ml-10" type="primary" icon="reload" @click="reloadAllSpeedTester()">刷新</a-button>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
|
||||||
|
<a-row :gutter="20">
|
||||||
|
<a-col v-for="(item, key) of speedTestList" :key="key" span="12">
|
||||||
|
<a-card size="small" class="md-mt-10" :title="key">
|
||||||
|
<a slot="extra" href="#">
|
||||||
|
<a-icon v-if="item.alive.length > 0" type="check" />
|
||||||
|
<a-icon v-else type="info-circle" />
|
||||||
|
</a>
|
||||||
|
<a-tag
|
||||||
|
v-for="(element, index) of item.backupList" :key="index" style="margin:2px;"
|
||||||
|
:title="element.dns" :color="element.time ? (element.time > config.server.setting.lowSpeedDelay ? 'orange' : 'green') : 'red'"
|
||||||
|
>
|
||||||
|
{{ element.host }} {{ element.time }}{{ element.time ? 'ms' : '' }} {{ element.dns }}
|
||||||
|
</a-tag>
|
||||||
|
</a-card>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</div>
|
||||||
|
</a-tab-pane>
|
||||||
|
</a-tabs>
|
||||||
|
</div>
|
||||||
|
<template slot="footer">
|
||||||
|
<div class="footer-bar">
|
||||||
|
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
||||||
|
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ds-container>
|
||||||
|
</template>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.json-wrapper {
|
.json-wrapper {
|
||||||
.ant-drawer-wrapper-body {
|
.ant-drawer-wrapper-body {
|
||||||
|
|
|
@ -1,159 +1,6 @@
|
||||||
<template>
|
|
||||||
<ds-container>
|
|
||||||
<template slot="header">
|
|
||||||
设置
|
|
||||||
<span>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<div v-if="config">
|
|
||||||
<a-form-item label="开机自启" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.app.autoStart.enabled" @change="onAutoStartChange">
|
|
||||||
本应用开机自启
|
|
||||||
</a-checkbox>
|
|
||||||
<a-button class="md-mr-10" icon="profile" @click="openLog()">日志</a-button>
|
|
||||||
<div class="form-help">
|
|
||||||
windows下建议开启开机自启。<a @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/recover.md')">更多说明参考</a>
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item v-if="systemPlatform === 'mac'" label="隐藏Dock图标" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.app.dock.hideWhenWinClose">
|
|
||||||
关闭窗口时隐藏Dock图标(仅限Mac)
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
修改后需要重启应用
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="远程配置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-checkbox v-model="config.app.remoteConfig.enabled" @change="onRemoteConfigEnabledChange">
|
|
||||||
启用远程配置
|
|
||||||
</a-checkbox>
|
|
||||||
<div class="form-help">
|
|
||||||
应用启动时会向下面的地址请求配置补丁,获得最新的优化后的github访问体验。<br/>
|
|
||||||
如果您觉得远程配置有安全风险,请关闭此功能,或删除共享远程配置,仅使用个人远程配置。<br/>
|
|
||||||
配置优先级:本地修改配置 > 个人远程配置 > 共享远程配置 > 默认配置
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="共享远程配置地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.app.remoteConfig.url" :title="config.app.remoteConfig.url"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="个人远程配置地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.app.remoteConfig.personalUrl" :title="config.app.remoteConfig.personalUrl"></a-input>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="重载远程配置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-button :disabled="config.app.remoteConfig.enabled === false" :loading="reloadLoading" icon="sync" @click="reloadRemoteConfig()">重载远程配置</a-button>
|
|
||||||
<div class="form-help">
|
|
||||||
注意,部分远程配置文件所在站点,修改内容后可能需要等待一段时间才能生效。<br/>
|
|
||||||
如果重载远程配置后发现下载的还是修改前的内容,请稍等片刻再重试。
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="主题设置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.theme" default-value="light" button-style="solid">
|
|
||||||
<a-radio-button :value="'light'" title="light">
|
|
||||||
亮色
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="'dark'" title="dark">
|
|
||||||
暗色
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="首页提示" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.showShutdownTip" default-value="true" button-style="solid">
|
|
||||||
<a-radio-button :value="true">
|
|
||||||
显示
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="false">
|
|
||||||
隐藏
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">
|
|
||||||
是否显示首页的警告提示
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item v-if="!isLinux()" label="关闭策略" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.closeStrategy" default-value="0" button-style="solid">
|
|
||||||
<a-radio-button :value="0">
|
|
||||||
弹出提示
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="1">
|
|
||||||
直接退出
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="2">
|
|
||||||
最小化到系统托盘
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">
|
|
||||||
点击窗口右上角关闭按钮的效果
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="打开窗口快捷键" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input v-model="config.app.showHideShortcut" @change="shortcutChange" @keydown="shortcutKeyDown" @keyup="shortcutKeyUp"></a-input>
|
|
||||||
<div class="form-help">
|
|
||||||
部分快捷键已被占用:F5=刷新页面,F12=开发者工具(DevTools)
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="启动时打开窗口" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.startShowWindow" default-value="true" button-style="solid">
|
|
||||||
<a-radio-button :value="true">
|
|
||||||
打开窗口
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="false">
|
|
||||||
隐藏窗口
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">
|
|
||||||
启动软件时,是否打开窗口。提示:如果设置为隐藏窗口,可点击系统托盘小图标打开窗口。
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="启动时窗口大小" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-input-number v-model="config.app.windowSize.width" :step="50" :min="600" :max="2400"/> ×
|
|
||||||
<a-input-number v-model="config.app.windowSize.height" :step="50" :min="500" :max="2000"/>
|
|
||||||
</a-form-item>
|
|
||||||
<hr/>
|
|
||||||
<a-form-item label="自动检查更新" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.autoChecked" default-value="light" button-style="solid">
|
|
||||||
<a-radio-button :value="true">
|
|
||||||
开启
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="false">
|
|
||||||
关闭
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">
|
|
||||||
开启自动检查更新后,每次应用启动时会检查一次更新,如有新版本,则会弹出提示。
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
<a-form-item label="忽略预发布版本" :label-col="labelCol" :wrapper-col="wrapperCol">
|
|
||||||
<a-radio-group v-model="config.app.skipPreRelease" default-value="light" button-style="solid">
|
|
||||||
<a-radio-button :value="true">
|
|
||||||
忽略
|
|
||||||
</a-radio-button>
|
|
||||||
<a-radio-button :value="false">
|
|
||||||
不忽略
|
|
||||||
</a-radio-button>
|
|
||||||
</a-radio-group>
|
|
||||||
<div class="form-help">
|
|
||||||
预发布版本号为带有 “<code>-</code>” 的版本。注:该配置只对当前版本为正式版本时有效。
|
|
||||||
</div>
|
|
||||||
</a-form-item>
|
|
||||||
</div>
|
|
||||||
<template slot="footer">
|
|
||||||
<div class="footer-bar">
|
|
||||||
<a-button :loading="removeUserConfigLoading" class="md-mr-10" icon="sync" @click="restoreFactorySettings()">恢复出厂设置</a-button>
|
|
||||||
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">恢复默认</a-button>
|
|
||||||
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">应用</a-button>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
</ds-container>
|
|
||||||
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Plugin from '../mixins/plugin'
|
|
||||||
import { ipcRenderer } from 'electron'
|
import { ipcRenderer } from 'electron'
|
||||||
|
import Plugin from '../mixins/plugin'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Setting',
|
name: 'Setting',
|
||||||
|
@ -165,7 +12,7 @@ export default {
|
||||||
reloadLoading: false,
|
reloadLoading: false,
|
||||||
themeBackup: null,
|
themeBackup: null,
|
||||||
urlBackup: null,
|
urlBackup: null,
|
||||||
personalUrlBackup: null
|
personalUrlBackup: null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
|
@ -181,7 +28,7 @@ export default {
|
||||||
},
|
},
|
||||||
async openLog () {
|
async openLog () {
|
||||||
const dir = await this.$api.info.getConfigDir()
|
const dir = await this.$api.info.getConfigDir()
|
||||||
this.$api.ipc.openPath(dir + '/logs/')
|
this.$api.ipc.openPath(`${dir}/logs/`)
|
||||||
},
|
},
|
||||||
getEventKey (event) {
|
getEventKey (event) {
|
||||||
// 忽略以下键
|
// 忽略以下键
|
||||||
|
@ -283,7 +130,7 @@ export default {
|
||||||
async disableBeforeInputEvent () {
|
async disableBeforeInputEvent () {
|
||||||
clearTimeout(window.enableBeforeInputEventTimeout)
|
clearTimeout(window.enableBeforeInputEventTimeout)
|
||||||
window.config.disableBeforeInputEvent = true
|
window.config.disableBeforeInputEvent = true
|
||||||
window.enableBeforeInputEventTimeout = setTimeout(function () {
|
window.enableBeforeInputEventTimeout = setTimeout(() => {
|
||||||
window.config.disableBeforeInputEvent = false
|
window.config.disableBeforeInputEvent = false
|
||||||
}, 2000)
|
}, 2000)
|
||||||
},
|
},
|
||||||
|
@ -311,12 +158,18 @@ export default {
|
||||||
|
|
||||||
// 判断 Ctrl、Alt、Shift、Window 按钮是否已按下,如果已按下,则拼接键值
|
// 判断 Ctrl、Alt、Shift、Window 按钮是否已按下,如果已按下,则拼接键值
|
||||||
let shortcut = event.ctrlKey ? 'Ctrl + ' : ''
|
let shortcut = event.ctrlKey ? 'Ctrl + ' : ''
|
||||||
if (event.altKey) shortcut += 'Alt + '
|
if (event.altKey) {
|
||||||
if (event.shiftKey) shortcut += 'Shift + '
|
shortcut += 'Alt + '
|
||||||
if (event.metaKey) shortcut += 'Meta + '
|
}
|
||||||
|
if (event.shiftKey) {
|
||||||
|
shortcut += 'Shift + '
|
||||||
|
}
|
||||||
|
if (event.metaKey) {
|
||||||
|
shortcut += 'Meta + '
|
||||||
|
}
|
||||||
|
|
||||||
// 如果以上按钮都没有按下,并且当前键不是F1~F4、F6~F11时,则直接返回(注:F5已经是刷新页面快捷键、F12已经是打开DevTools的快捷键了)
|
// 如果以上按钮都没有按下,并且当前键不是F1~F4、F6~F11时,则直接返回(注:F5已经是刷新页面快捷键、F12已经是打开DevTools的快捷键了)
|
||||||
if (shortcut === '' && !key.match(/^F([12346789]|1[01])$/g)) {
|
if (shortcut === '' && !key.match(/^F([1-46-9]|1[01])$/g)) {
|
||||||
this.config.app.showHideShortcut = '无'
|
this.config.app.showHideShortcut = '无'
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -403,24 +256,29 @@ export default {
|
||||||
this.$confirm({
|
this.$confirm({
|
||||||
title: '确定要恢复出厂设置吗?',
|
title: '确定要恢复出厂设置吗?',
|
||||||
width: 610,
|
width: 610,
|
||||||
content: h =>
|
content: (h) => (
|
||||||
<div class="restore-factory-settings">
|
<div class="restore-factory-settings">
|
||||||
<hr/>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
<h3>操作警告:</h3>
|
<h3>操作警告:</h3>
|
||||||
<div>
|
<div>
|
||||||
该功能将备份您的所有页面的个性化配置,并重载<span>默认配置</span>及<span>远程配置</span>,请谨慎操作!!!
|
该功能将备份您的所有页面的个性化配置,并重载
|
||||||
|
<span>默认配置</span>
|
||||||
|
及
|
||||||
|
<span>远程配置</span>
|
||||||
|
,请谨慎操作!!!
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
<hr/>
|
<hr>
|
||||||
<p>
|
<p>
|
||||||
<h3>找回个性化配置的方法:</h3>
|
<h3>找回个性化配置的方法:</h3>
|
||||||
<div>
|
<div>
|
||||||
1. 找到备份文件,路径:<span>~/.dev-sidecar/config.json.时间戳.bak.json</span><br/>
|
1. 找到备份文件,路径:<span>~/.dev-sidecar/config.json.时间戳.bak.json</span><br>
|
||||||
2. 将该备份文件重命名为<span>config.json</span>,再重启软件即可恢复个性化配置。
|
2. 将该备份文件重命名为<span>config.json</span>,再重启软件即可恢复个性化配置。
|
||||||
</div>
|
</div>
|
||||||
</p>
|
</p>
|
||||||
</div>,
|
</div>
|
||||||
|
),
|
||||||
cancelText: '取消',
|
cancelText: '取消',
|
||||||
okText: '确定',
|
okText: '确定',
|
||||||
onOk: async () => {
|
onOk: async () => {
|
||||||
|
@ -438,11 +296,167 @@ export default {
|
||||||
this.removeUserConfigLoading = false
|
this.removeUserConfigLoading = false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onCancel () {}
|
onCancel () {},
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<style lang="sass">
|
|
||||||
</style>
|
<template>
|
||||||
|
<ds-container>
|
||||||
|
<template slot="header">
|
||||||
|
设置
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<div v-if="config">
|
||||||
|
<a-form-item label="开机自启" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.app.autoStart.enabled" @change="onAutoStartChange">
|
||||||
|
本应用开机自启
|
||||||
|
</a-checkbox>
|
||||||
|
<a-button class="md-mr-10" icon="profile" @click="openLog()">日志</a-button>
|
||||||
|
<div class="form-help">
|
||||||
|
windows下建议开启开机自启。<a @click="openExternal('https://github.com/docmirror/dev-sidecar/blob/master/doc/recover.md')">更多说明参考</a>
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item v-if="systemPlatform === 'mac'" label="隐藏Dock图标" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.app.dock.hideWhenWinClose">
|
||||||
|
关闭窗口时隐藏Dock图标(仅限Mac)
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
修改后需要重启应用
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="远程配置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-checkbox v-model="config.app.remoteConfig.enabled" @change="onRemoteConfigEnabledChange">
|
||||||
|
启用远程配置
|
||||||
|
</a-checkbox>
|
||||||
|
<div class="form-help">
|
||||||
|
应用启动时会向下面的地址请求配置补丁,获得最新的优化后的github访问体验。<br>
|
||||||
|
如果您觉得远程配置有安全风险,请关闭此功能,或删除共享远程配置,仅使用个人远程配置。<br>
|
||||||
|
配置优先级:本地修改配置 > 个人远程配置 > 共享远程配置 > 默认配置
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="共享远程配置地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.app.remoteConfig.url" :title="config.app.remoteConfig.url" />
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="个人远程配置地址" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.app.remoteConfig.personalUrl" :title="config.app.remoteConfig.personalUrl" />
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="重载远程配置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-button :disabled="config.app.remoteConfig.enabled === false" :loading="reloadLoading" icon="sync" @click="reloadRemoteConfig()">
|
||||||
|
重载远程配置
|
||||||
|
</a-button>
|
||||||
|
<div class="form-help">
|
||||||
|
注意,部分远程配置文件所在站点,修改内容后可能需要等待一段时间才能生效。<br>
|
||||||
|
如果重载远程配置后发现下载的还是修改前的内容,请稍等片刻再重试。
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="主题设置" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.theme" default-value="light" button-style="solid">
|
||||||
|
<a-radio-button value="light" title="light">
|
||||||
|
亮色
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button value="dark" title="dark">
|
||||||
|
暗色
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="首页提示" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.showShutdownTip" default-value="true" button-style="solid">
|
||||||
|
<a-radio-button :value="true">
|
||||||
|
显示
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="false">
|
||||||
|
隐藏
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
是否显示首页的警告提示
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item v-if="!isLinux()" label="关闭策略" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.closeStrategy" default-value="0" button-style="solid">
|
||||||
|
<a-radio-button :value="0">
|
||||||
|
弹出提示
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="1">
|
||||||
|
直接退出
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="2">
|
||||||
|
最小化到系统托盘
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
点击窗口右上角关闭按钮的效果
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="打开窗口快捷键" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input v-model="config.app.showHideShortcut" @change="shortcutChange" @keydown="shortcutKeyDown" @keyup="shortcutKeyUp" />
|
||||||
|
<div class="form-help">
|
||||||
|
部分快捷键已被占用:F5=刷新页面,F12=开发者工具(DevTools)
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="启动时打开窗口" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.startShowWindow" default-value="true" button-style="solid">
|
||||||
|
<a-radio-button :value="true">
|
||||||
|
打开窗口
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="false">
|
||||||
|
隐藏窗口
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
启动软件时,是否打开窗口。提示:如果设置为隐藏窗口,可点击系统托盘小图标打开窗口。
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="启动时窗口大小" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-input-number v-model="config.app.windowSize.width" :step="50" :min="600" :max="2400" /> ×
|
||||||
|
<a-input-number v-model="config.app.windowSize.height" :step="50" :min="500" :max="2000" />
|
||||||
|
</a-form-item>
|
||||||
|
<hr>
|
||||||
|
<a-form-item label="自动检查更新" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.autoChecked" default-value="light" button-style="solid">
|
||||||
|
<a-radio-button :value="true">
|
||||||
|
开启
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="false">
|
||||||
|
关闭
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
开启自动检查更新后,每次应用启动时会检查一次更新,如有新版本,则会弹出提示。
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
<a-form-item label="忽略预发布版本" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-radio-group v-model="config.app.skipPreRelease" default-value="light" button-style="solid">
|
||||||
|
<a-radio-button :value="true">
|
||||||
|
忽略
|
||||||
|
</a-radio-button>
|
||||||
|
<a-radio-button :value="false">
|
||||||
|
不忽略
|
||||||
|
</a-radio-button>
|
||||||
|
</a-radio-group>
|
||||||
|
<div class="form-help">
|
||||||
|
预发布版本号为带有 “<code>-</code>” 的版本。注:该配置只对当前版本为正式版本时有效。
|
||||||
|
</div>
|
||||||
|
</a-form-item>
|
||||||
|
</div>
|
||||||
|
<template slot="footer">
|
||||||
|
<div class="footer-bar">
|
||||||
|
<a-button :loading="removeUserConfigLoading" class="md-mr-10" icon="sync" @click="restoreFactorySettings()">
|
||||||
|
恢复出厂设置
|
||||||
|
</a-button>
|
||||||
|
<a-button :loading="resetDefaultLoading" class="md-mr-10" icon="sync" @click="resetDefault()">
|
||||||
|
恢复默认
|
||||||
|
</a-button>
|
||||||
|
<a-button :loading="applyLoading" icon="check" type="primary" @click="apply()">
|
||||||
|
应用
|
||||||
|
</a-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</ds-container>
|
||||||
|
</template>
|
||||||
|
|
|
@ -171,7 +171,9 @@ module.exports = {
|
||||||
res.writeHead(200, headers)
|
res.writeHead(200, headers)
|
||||||
res.write(JSON.stringify(result)) // 格式如:{"words_result":[{"words":"6525"}],"words_result_num":1,"log_id":1818877093747960000}
|
res.write(JSON.stringify(result)) // 格式如:{"words_result":[{"words":"6525"}],"words_result_num":1,"log_id":1818877093747960000}
|
||||||
res.end()
|
res.end()
|
||||||
if (next) next() // 异步执行完继续next
|
if (next) {
|
||||||
|
next() // 异步执行完继续next
|
||||||
|
}
|
||||||
}).catch((err) => {
|
}).catch((err) => {
|
||||||
log.info('baiduOcr error:', err)
|
log.info('baiduOcr error:', err)
|
||||||
res.writeHead(200, headers)
|
res.writeHead(200, headers)
|
||||||
|
|
|
@ -30,5 +30,5 @@ module.exports = [
|
||||||
|
|
||||||
// response interceptor impls
|
// response interceptor impls
|
||||||
OPTIONSHeaders, cacheRes, responseReplace,
|
OPTIONSHeaders, cacheRes, responseReplace,
|
||||||
script
|
script,
|
||||||
]
|
]
|
||||||
|
|
|
@ -21,7 +21,7 @@ function getTimeoutConfig (hostname, serverSetting) {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
timeout: timeoutConfig.timeout || serverSetting.defaultTimeout || 20000,
|
timeout: timeoutConfig.timeout || serverSetting.defaultTimeout || 20000,
|
||||||
keepAliveTimeout: timeoutConfig.keepAliveTimeout || serverSetting.defaultKeepAliveTimeout || 30000
|
keepAliveTimeout: timeoutConfig.keepAliveTimeout || serverSetting.defaultKeepAliveTimeout || 30000,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue