代码格式调整:*.vue
parent
edb9f0325b
commit
572caf0be7
|
@ -45,7 +45,7 @@ const NodePlugin = function (context) {
|
|||
|
||||
const cmds = []
|
||||
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}`)
|
||||
} else {
|
||||
cmds.push(`${command} config delete ${item.key}`)
|
||||
|
@ -68,7 +68,7 @@ const NodePlugin = function (context) {
|
|||
const cmds = []
|
||||
log.debug('yarn set:', JSON.stringify(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}`)
|
||||
} else {
|
||||
cmds.push(`yarn config delete ${item.key}`)
|
||||
|
|
|
@ -155,7 +155,7 @@ function install (app, api) {
|
|||
return (
|
||||
<div>
|
||||
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
||||
<hr/>
|
||||
<hr>
|
||||
<pre style="max-height:350px;font-family:auto">
|
||||
{releaseNotes}
|
||||
</pre>
|
||||
|
@ -201,7 +201,7 @@ function install (app, api) {
|
|||
return (
|
||||
<div>
|
||||
<div>发布公告:<a onClick={openGithubUrl}>https://github.com/docmirror/dev-sidecar/releases</a></div>
|
||||
<hr/>
|
||||
<hr>
|
||||
<pre style="max-height:350px;font-family:auto">
|
||||
{releaseNotes}
|
||||
</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>
|
||||
import createMenus from '@/view/router/menu'
|
||||
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
|
||||
|
||||
export default {
|
||||
name: 'App',
|
||||
components: {
|
||||
|
@ -53,12 +11,12 @@ export default {
|
|||
locale: zhCN,
|
||||
info: {},
|
||||
menus: undefined,
|
||||
config: undefined
|
||||
config: undefined,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
themeClass () {
|
||||
return 'theme-' + this.config.app.theme
|
||||
return `theme-${this.config.app.theme}`
|
||||
},
|
||||
theme () {
|
||||
return this.config.app.theme
|
||||
|
@ -67,7 +25,7 @@ export default {
|
|||
created () {
|
||||
this.menus = createMenus(this)
|
||||
this.config = this.$global.config
|
||||
this.$api.info.get().then(ret => {
|
||||
this.$api.info.get().then((ret) => {
|
||||
this.info = ret
|
||||
})
|
||||
},
|
||||
|
@ -81,11 +39,54 @@ export default {
|
|||
menuClick (item) {
|
||||
console.log('menu click', item)
|
||||
this.$router.replace(item.path)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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">
|
||||
body{
|
||||
height: 100%;
|
||||
|
|
|
@ -53,7 +53,7 @@ export function apiInit (app) {
|
|||
})
|
||||
}
|
||||
|
||||
return new Promise(resolve => {
|
||||
return new Promise((resolve) => {
|
||||
resolve(apiObj)
|
||||
})
|
||||
}
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
<script>
|
||||
export default {
|
||||
name: 'DsContainer',
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="ds-container">
|
||||
<div class="body-wrapper">
|
||||
<div v-if="$slots.header" class="container-header"><slot name="header"></slot></div>
|
||||
<div class="container-body"> <slot></slot></div>
|
||||
<div class="container-footer"> <slot name="footer"></slot></div>
|
||||
<div v-if="$slots.header" class="container-header"><slot name="header" /></div>
|
||||
<div class="container-body"><slot /></div>
|
||||
<div class="container-footer"><slot name="footer" /></div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'ds-container'
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.ds-container{
|
||||
height:100%;
|
||||
|
@ -49,5 +49,4 @@ export default {
|
|||
padding:15px;
|
||||
}
|
||||
}
|
||||
|
||||
</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>
|
||||
export default {
|
||||
name: 'setup-ca',
|
||||
name: 'SetupCa',
|
||||
components: {
|
||||
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
type: String,
|
||||
default: '安装根证书'
|
||||
default: '安装根证书',
|
||||
},
|
||||
visible: {
|
||||
type: Boolean
|
||||
}
|
||||
type: Boolean,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
systemPlatform: ''
|
||||
systemPlatform: '',
|
||||
}
|
||||
},
|
||||
async created () {
|
||||
const platform = await this.$api.info.getSystemPlatform()
|
||||
this.systemPlatform = platform
|
||||
},
|
||||
computed: {
|
||||
setupImage () {
|
||||
if (this.systemPlatform === 'mac') {
|
||||
|
@ -70,7 +27,11 @@ export default {
|
|||
} else {
|
||||
return '/setup.png'
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
async created () {
|
||||
const platform = await this.$api.info.getSystemPlatform()
|
||||
this.systemPlatform = platform
|
||||
},
|
||||
methods: {
|
||||
async openExternal (url) {
|
||||
|
@ -89,10 +50,50 @@ export default {
|
|||
if (this.systemPlatform === 'linux') {
|
||||
this.$message.success('根证书已成功安装到系统证书库(注意:浏览器仍然需要手动安装)')
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
<template>
|
||||
<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>
|
||||
import lodash from 'lodash'
|
||||
import setupCa from '../components/setup-ca'
|
||||
import DsContainer from '../components/container'
|
||||
import SetupCa from '../components/setup-ca'
|
||||
|
||||
export default {
|
||||
name: 'Index',
|
||||
components: {
|
||||
DsContainer,
|
||||
setupCa
|
||||
},
|
||||
computed: {
|
||||
_rootCaSetuped () {
|
||||
if (this.setting.rootCa) {
|
||||
return this.setting.rootCa.setuped === true
|
||||
}
|
||||
return false
|
||||
}
|
||||
SetupCa,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
@ -143,7 +24,7 @@ export default {
|
|||
} else {
|
||||
this.apiCall(this.startup, this.$api.startup)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
info: {},
|
||||
newVersionDownloading: false,
|
||||
|
@ -153,16 +34,24 @@ export default {
|
|||
loading: false,
|
||||
doClick: (checked) => {
|
||||
this.onServerClick(checked)
|
||||
}
|
||||
},
|
||||
},
|
||||
switchBtns: undefined,
|
||||
config: undefined,
|
||||
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 () {
|
||||
await this.doCheckRootCa()
|
||||
await this.reloadConfig()
|
||||
|
@ -173,7 +62,7 @@ export default {
|
|||
this.update.autoChecked = true // 应用启动时,执行一次
|
||||
this.doCheckUpdate(false)
|
||||
}
|
||||
this.$api.info.get().then(ret => {
|
||||
this.$api.info.get().then((ret) => {
|
||||
this.info = ret
|
||||
})
|
||||
},
|
||||
|
@ -212,9 +101,9 @@ export default {
|
|||
title: '彩蛋(增强模式)',
|
||||
content: (
|
||||
<div>
|
||||
我把它藏在了源码里,感兴趣的话可以找一找它(线索提示 // TODO)
|
||||
我把它藏在了源码里,感兴趣的话可以找一找它(线索提示 // TODO)
|
||||
</div>
|
||||
)
|
||||
),
|
||||
})
|
||||
},
|
||||
async doCheckRootCa () {
|
||||
|
@ -237,7 +126,7 @@ export default {
|
|||
// const rootCa = this.setting.rootCa
|
||||
// rootCa.noTip = true
|
||||
// this.$api.setting.save(this.setting)
|
||||
}
|
||||
},
|
||||
})
|
||||
},
|
||||
openSetupCa () {
|
||||
|
@ -273,7 +162,7 @@ export default {
|
|||
this.$api.setting.save(this.setting)
|
||||
},
|
||||
reloadConfig () {
|
||||
return this.$api.config.reload().then(ret => {
|
||||
return this.$api.config.reload().then((ret) => {
|
||||
this.config = ret
|
||||
return ret
|
||||
})
|
||||
|
@ -303,7 +192,7 @@ export default {
|
|||
},
|
||||
doClick: (checked) => {
|
||||
this.onSwitchClick(this.switchBtns[key], apiTarget.start, apiTarget.close, checked)
|
||||
}
|
||||
},
|
||||
}
|
||||
},
|
||||
async apiCall (btn, api, param) {
|
||||
|
@ -360,12 +249,131 @@ export default {
|
|||
cancelText: '下次还显示',
|
||||
onOk: () => {
|
||||
this.$api.config.update({ app: { showShutdownTip: false } })
|
||||
}
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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">
|
||||
.page_index {
|
||||
.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>
|
||||
<ds-container>
|
||||
<template slot="header">
|
||||
|
@ -33,15 +98,15 @@
|
|||
<span><code>Git.exe</code>将不代理以下仓库;可以是根地址、组织/机构地址、完整地址</span>
|
||||
</a-col>
|
||||
<a-col :span="2">
|
||||
<a-button type="primary" icon="plus" @click="addNoProxyUrl()"/>
|
||||
<a-button type="primary" icon="plus" @click="addNoProxyUrl()" />
|
||||
</a-col>
|
||||
</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-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 :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-row>
|
||||
</div>
|
||||
|
@ -55,69 +120,4 @@
|
|||
</div>
|
||||
</template>
|
||||
</ds-container>
|
||||
|
||||
</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>
|
||||
import Plugin from '../../mixins/plugin'
|
||||
|
||||
|
@ -95,7 +8,7 @@ export default {
|
|||
return {
|
||||
key: 'plugin.node',
|
||||
npmVariables: undefined,
|
||||
registry: false
|
||||
registry: false,
|
||||
}
|
||||
},
|
||||
created () {
|
||||
|
@ -105,7 +18,7 @@ export default {
|
|||
},
|
||||
methods: {
|
||||
ready () {
|
||||
return this.$api.plugin.node.getVariables().then(ret => {
|
||||
return this.$api.plugin.node.getVariables().then((ret) => {
|
||||
console.log('variables', ret)
|
||||
this.npmVariables = ret
|
||||
})
|
||||
|
@ -129,9 +42,103 @@ export default {
|
|||
this.saveConfig().then(() => {
|
||||
this.$api.plugin.node.setVariables()
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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>
|
||||
import Plugin from '../../mixins/plugin'
|
||||
|
||||
|
@ -127,13 +12,13 @@ export default {
|
|||
overwallOptions: [
|
||||
{
|
||||
value: true,
|
||||
label: '启用'
|
||||
label: '启用',
|
||||
},
|
||||
{
|
||||
value: false,
|
||||
label: '禁用'
|
||||
}
|
||||
]
|
||||
label: '禁用',
|
||||
},
|
||||
],
|
||||
}
|
||||
},
|
||||
created () {
|
||||
|
@ -164,7 +49,8 @@ export default {
|
|||
for (const key in targetsMap) {
|
||||
const value = targetsMap[key]
|
||||
this.targets.push({
|
||||
key, value
|
||||
key,
|
||||
value,
|
||||
})
|
||||
}
|
||||
},
|
||||
|
@ -190,7 +76,8 @@ export default {
|
|||
for (const key in targetsMap) {
|
||||
const value = targetsMap[key]
|
||||
this.servers.push({
|
||||
key, value
|
||||
key,
|
||||
value,
|
||||
})
|
||||
}
|
||||
if (this.servers.length === 0) {
|
||||
|
@ -211,9 +98,124 @@ export default {
|
|||
}
|
||||
}
|
||||
this.config.plugin.overwall.server = map
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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>
|
||||
<ds-container>
|
||||
<template slot="header">
|
||||
PIP加速
|
||||
<span style="color:#999;">
|
||||
</span>
|
||||
</template>
|
||||
|
||||
<div v-if="config">
|
||||
<a-form layout="horizontal">
|
||||
<!-- <a-form-item label="启用PIP加速" :label-col="labelCol" :wrapper-col="wrapperCol">-->
|
||||
<!-- <a-checkbox v-model="config.plugin.pip.enabled">-->
|
||||
<!-- 随应用启动-->
|
||||
<!-- </a-checkbox>-->
|
||||
<!-- <a-tag v-if="status.plugin.pip.enabled" color="green">-->
|
||||
<!-- 当前已启动-->
|
||||
<!-- </a-tag>-->
|
||||
<!-- <a-tag v-else color="red">-->
|
||||
<!-- 当前未启动-->
|
||||
<!-- </a-tag>-->
|
||||
<!-- </a-form-item>-->
|
||||
<!-- <a-form-item label="启用PIP加速" :label-col="labelCol" :wrapper-col="wrapperCol"> -->
|
||||
<!-- <a-checkbox v-model="config.plugin.pip.enabled"> -->
|
||||
<!-- 随应用启动 -->
|
||||
<!-- </a-checkbox> -->
|
||||
<!-- <a-tag v-if="status.plugin.pip.enabled" color="green"> -->
|
||||
<!-- 当前已启动 -->
|
||||
<!-- </a-tag> -->
|
||||
<!-- <a-tag v-else color="red"> -->
|
||||
<!-- 当前未启动 -->
|
||||
<!-- </a-tag> -->
|
||||
<!-- </a-form-item> -->
|
||||
<a-form-item label="pip命令名" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-input v-model="config.plugin.pip.setting.command"></a-input>
|
||||
<div class="form-help">如果你的<code>pip</code>命令改成了其他名字(如<code>pip3</code>),或想设置绿色版<code>pip</code>程序路径,可在此处修改</div>
|
||||
<a-input v-model="config.plugin.pip.setting.command" />
|
||||
<div class="form-help">
|
||||
如果你的<code>pip</code>命令改成了其他名字(如<code>pip3</code>),或想设置绿色版<code>pip</code>程序路径,可在此处修改
|
||||
</div>
|
||||
</a-form-item>
|
||||
<a-form-item label="仓库镜像" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||
<a-radio-group v-model="config.plugin.pip.setting.registry" @change="onSwitchRegistry"
|
||||
default-value="https://pypi.org/simple/" button-style="solid">
|
||||
<a-radio-group
|
||||
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>
|
||||
|
@ -60,12 +105,14 @@
|
|||
山东理工大学镜像
|
||||
</a-radio-button>
|
||||
</a-radio-group>
|
||||
<div class="form-help">设置后立即生效,即使关闭 ds 也会继续保持</div>
|
||||
<div class="form-help">
|
||||
设置后立即生效,即使关闭 ds 也会继续保持
|
||||
</div>
|
||||
</a-form-item>
|
||||
<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">
|
||||
使用以上域名安装包时,不会进行SSL证书验证,多个域名用空格隔开<br/>
|
||||
使用以上域名安装包时,不会进行SSL证书验证,多个域名用空格隔开<br>
|
||||
注意:切换仓库镜像同时会修改<code>pip.ini</code>中的<code>trusted-host</code>配置,即使关闭 ds 也会继续保持
|
||||
</div>
|
||||
</a-form-item>
|
||||
|
@ -78,51 +125,4 @@
|
|||
</div>
|
||||
</template>
|
||||
</ds-container>
|
||||
|
||||
</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>
|
||||
import Plugin from '../mixins/plugin'
|
||||
|
||||
export default {
|
||||
name: 'Proxy',
|
||||
mixins: [Plugin],
|
||||
|
@ -128,7 +8,7 @@ export default {
|
|||
return {
|
||||
key: 'proxy',
|
||||
loopbackVisible: false,
|
||||
excludeIpList: []
|
||||
excludeIpList: [],
|
||||
}
|
||||
},
|
||||
async created () {
|
||||
|
@ -152,11 +32,11 @@ export default {
|
|||
try {
|
||||
await this.$api.proxy.setEnableLoopback()
|
||||
} catch (e) {
|
||||
if (e.message.indexOf('EACCES') !== -1) {
|
||||
if (e.message.includes('EACCES')) {
|
||||
this.$message.error('请将DevSidecar关闭后,以管理员身份重新打开,再尝试此操作')
|
||||
return
|
||||
}
|
||||
this.$message.error('打开失败:' + e.message)
|
||||
this.$message.error(`打开失败:${e.message}`)
|
||||
}
|
||||
},
|
||||
getProxyConfig () {
|
||||
|
@ -167,7 +47,8 @@ export default {
|
|||
for (const key in this.config.proxy.excludeIpList) {
|
||||
const value = this.config.proxy.excludeIpList[key]
|
||||
this.excludeIpList.push({
|
||||
key, value
|
||||
key,
|
||||
value,
|
||||
})
|
||||
}
|
||||
},
|
||||
|
@ -185,9 +66,127 @@ export default {
|
|||
}
|
||||
}
|
||||
this.config.proxy.excludeIpList = excludeIpList
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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>
|
||||
import _ from 'lodash'
|
||||
import vueJsonEditor from 'vue-json-editor-fix-cn'
|
||||
import Plugin from '../mixins/plugin'
|
||||
import _ from 'lodash'
|
||||
|
||||
export default {
|
||||
name: 'Server',
|
||||
components: {
|
||||
vueJsonEditor
|
||||
VueJsonEditor: vueJsonEditor,
|
||||
},
|
||||
mixins: [Plugin],
|
||||
data () {
|
||||
|
@ -249,14 +14,9 @@ export default {
|
|||
key: 'server',
|
||||
dnsMappings: [],
|
||||
speedTestList: [],
|
||||
whiteList: []
|
||||
whiteList: [],
|
||||
}
|
||||
},
|
||||
created () {
|
||||
},
|
||||
mounted () {
|
||||
this.registerSpeedTestEvent()
|
||||
},
|
||||
computed: {
|
||||
speedDnsOptions () {
|
||||
const options = []
|
||||
|
@ -266,11 +26,16 @@ export default {
|
|||
_.forEach(this.config.server.dns.providers, (dnsConfig, key) => {
|
||||
options.push({
|
||||
value: key,
|
||||
label: key
|
||||
label: key,
|
||||
})
|
||||
})
|
||||
return options
|
||||
}
|
||||
},
|
||||
},
|
||||
created () {
|
||||
},
|
||||
mounted () {
|
||||
this.registerSpeedTestEvent()
|
||||
},
|
||||
methods: {
|
||||
async onCrtSelect () {
|
||||
|
@ -307,7 +72,8 @@ export default {
|
|||
for (const key in this.config.server.dns.mapping) {
|
||||
const value = this.config.server.dns.mapping[key]
|
||||
this.dnsMappings.push({
|
||||
key, value
|
||||
key,
|
||||
value,
|
||||
})
|
||||
}
|
||||
},
|
||||
|
@ -336,7 +102,8 @@ export default {
|
|||
for (const key in this.config.server.whiteList) {
|
||||
const value = this.config.server.whiteList[key]
|
||||
this.whiteList.push({
|
||||
key, value
|
||||
key,
|
||||
value,
|
||||
})
|
||||
}
|
||||
},
|
||||
|
@ -357,7 +124,7 @@ export default {
|
|||
},
|
||||
async openLog () {
|
||||
const dir = await this.$api.info.getConfigDir()
|
||||
this.$api.ipc.openPath(dir + '/logs/')
|
||||
this.$api.ipc.openPath(`${dir}/logs/`)
|
||||
},
|
||||
getSpeedTestConfig () {
|
||||
return this.config.server.dns.speedTest
|
||||
|
@ -404,10 +171,276 @@ export default {
|
|||
setTimeout(() => {
|
||||
window.dispatchEvent(new Event('resize'))
|
||||
}, 10)
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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">
|
||||
.json-wrapper {
|
||||
.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>
|
||||
import Plugin from '../mixins/plugin'
|
||||
import { ipcRenderer } from 'electron'
|
||||
import Plugin from '../mixins/plugin'
|
||||
|
||||
export default {
|
||||
name: 'Setting',
|
||||
|
@ -165,7 +12,7 @@ export default {
|
|||
reloadLoading: false,
|
||||
themeBackup: null,
|
||||
urlBackup: null,
|
||||
personalUrlBackup: null
|
||||
personalUrlBackup: null,
|
||||
}
|
||||
},
|
||||
created () {
|
||||
|
@ -181,7 +28,7 @@ export default {
|
|||
},
|
||||
async openLog () {
|
||||
const dir = await this.$api.info.getConfigDir()
|
||||
this.$api.ipc.openPath(dir + '/logs/')
|
||||
this.$api.ipc.openPath(`${dir}/logs/`)
|
||||
},
|
||||
getEventKey (event) {
|
||||
// 忽略以下键
|
||||
|
@ -283,7 +130,7 @@ export default {
|
|||
async disableBeforeInputEvent () {
|
||||
clearTimeout(window.enableBeforeInputEventTimeout)
|
||||
window.config.disableBeforeInputEvent = true
|
||||
window.enableBeforeInputEventTimeout = setTimeout(function () {
|
||||
window.enableBeforeInputEventTimeout = setTimeout(() => {
|
||||
window.config.disableBeforeInputEvent = false
|
||||
}, 2000)
|
||||
},
|
||||
|
@ -311,12 +158,18 @@ export default {
|
|||
|
||||
// 判断 Ctrl、Alt、Shift、Window 按钮是否已按下,如果已按下,则拼接键值
|
||||
let shortcut = event.ctrlKey ? 'Ctrl + ' : ''
|
||||
if (event.altKey) shortcut += 'Alt + '
|
||||
if (event.shiftKey) shortcut += 'Shift + '
|
||||
if (event.metaKey) shortcut += 'Meta + '
|
||||
if (event.altKey) {
|
||||
shortcut += 'Alt + '
|
||||
}
|
||||
if (event.shiftKey) {
|
||||
shortcut += 'Shift + '
|
||||
}
|
||||
if (event.metaKey) {
|
||||
shortcut += 'Meta + '
|
||||
}
|
||||
|
||||
// 如果以上按钮都没有按下,并且当前键不是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 = '无'
|
||||
return
|
||||
}
|
||||
|
@ -403,24 +256,29 @@ export default {
|
|||
this.$confirm({
|
||||
title: '确定要恢复出厂设置吗?',
|
||||
width: 610,
|
||||
content: h =>
|
||||
content: (h) => (
|
||||
<div class="restore-factory-settings">
|
||||
<hr/>
|
||||
<hr>
|
||||
<p>
|
||||
<h3>操作警告:</h3>
|
||||
<div>
|
||||
该功能将备份您的所有页面的个性化配置,并重载<span>默认配置</span>及<span>远程配置</span>,请谨慎操作!!!
|
||||
该功能将备份您的所有页面的个性化配置,并重载
|
||||
<span>默认配置</span>
|
||||
及
|
||||
<span>远程配置</span>
|
||||
,请谨慎操作!!!
|
||||
</div>
|
||||
</p>
|
||||
<hr/>
|
||||
<hr>
|
||||
<p>
|
||||
<h3>找回个性化配置的方法:</h3>
|
||||
<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>,再重启软件即可恢复个性化配置。
|
||||
</div>
|
||||
</p>
|
||||
</div>,
|
||||
</div>
|
||||
),
|
||||
cancelText: '取消',
|
||||
okText: '确定',
|
||||
onOk: async () => {
|
||||
|
@ -438,11 +296,167 @@ export default {
|
|||
this.removeUserConfigLoading = false
|
||||
}
|
||||
},
|
||||
onCancel () {}
|
||||
onCancel () {},
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
</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.write(JSON.stringify(result)) // 格式如:{"words_result":[{"words":"6525"}],"words_result_num":1,"log_id":1818877093747960000}
|
||||
res.end()
|
||||
if (next) next() // 异步执行完继续next
|
||||
if (next) {
|
||||
next() // 异步执行完继续next
|
||||
}
|
||||
}).catch((err) => {
|
||||
log.info('baiduOcr error:', err)
|
||||
res.writeHead(200, headers)
|
||||
|
|
|
@ -30,5 +30,5 @@ module.exports = [
|
|||
|
||||
// response interceptor impls
|
||||
OPTIONSHeaders, cacheRes, responseReplace,
|
||||
script
|
||||
script,
|
||||
]
|
||||
|
|
|
@ -21,7 +21,7 @@ function getTimeoutConfig (hostname, serverSetting) {
|
|||
|
||||
return {
|
||||
timeout: timeoutConfig.timeout || serverSetting.defaultTimeout || 20000,
|
||||
keepAliveTimeout: timeoutConfig.keepAliveTimeout || serverSetting.defaultKeepAliveTimeout || 30000
|
||||
keepAliveTimeout: timeoutConfig.keepAliveTimeout || serverSetting.defaultKeepAliveTimeout || 30000,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue