feat: 设置界面

pull/180/head
xiaojunnuo 2020-11-01 01:48:15 +08:00
parent e701e1ffbb
commit 2d218c1463
13 changed files with 476 additions and 158 deletions

View File

@ -1815,16 +1815,6 @@
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
@ -1851,27 +1841,6 @@
"unique-filename": "^1.1.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
@ -1893,18 +1862,6 @@
"path-exists": "^4.0.0"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -1995,18 +1952,6 @@
"webpack-sources": "^1.4.3"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.0.0-beta.9",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz",
"integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
},
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@ -12483,6 +12428,63 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.0.0-beta.9",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz",
"integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
},
"vue-style-loader": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",

View File

@ -11,7 +11,7 @@ module.exports = {
cafile: true,
NODE_EXTRA_CA_CERTS: true,
NODE_TLS_REJECT_UNAUTHORIZED: false,
registry: 'http://registry.npmjs.org'// 可以选择切换官方或者淘宝镜像
registry: 'https://registry.npmjs.org'// 可以选择切换官方或者淘宝镜像
},
intercepts: {
'cdn.cypress.io': [{ regexp: '/desktop/.*', proxy: 'http://npm.taobao.org/mirrors/cypress/' }]

View File

@ -1,31 +1,31 @@
const nodeConfig = require('./config')
const NodePlugin = function (context) {
const { config, shell, event, rootCaFile } = context
const api = {
const nodeApi = {
async start () {
try {
await api.setVariables()
await nodeApi.setVariables()
} catch (err) {
console.warn('set variables error', err)
}
const ip = '127.0.0.1'
const port = config.get().server.port
await api.setProxy(ip, port)
await nodeApi.setProxy(ip, port)
return { ip, port }
},
async close () {
return api.unsetProxy()
return nodeApi.unsetProxy()
},
async restart () {
await api.close()
await api.start()
await nodeApi.close()
await nodeApi.start()
},
async save (newConfig) {
api.setVariables()
nodeApi.setVariables()
},
async getNpmEnv () {
const ret = await shell.exec(['npm config list --json'], { type: 'cmd' })
@ -55,7 +55,7 @@ const NodePlugin = function (context) {
},
async getVariables () {
const currentMap = await api.getNpmEnv()
const currentMap = await nodeApi.getNpmEnv()
const list = []
const map = config.get().plugin.node.variables
for (const key in map) {
@ -72,15 +72,21 @@ const NodePlugin = function (context) {
},
async setVariables () {
const list = await api.getVariables()
const list = await nodeApi.getVariables()
const noSetList = list.filter(item => {
return !item.exists
})
if (noSetList.length > 0) {
return api.setNpmEnv(noSetList)
return nodeApi.setNpmEnv(noSetList)
}
},
async setRegistry (registry) {
await nodeApi.setNpmEnv([{ key: 'registry', value: registry }])
console.log(1111)
return true
},
async setProxy (ip, port) {
const cmds = [
`npm config set proxy=http://${ip}:${port}`,
@ -135,7 +141,7 @@ const NodePlugin = function (context) {
return ret
}
}
return api
return nodeApi
}
module.exports = {

View File

@ -2371,16 +2371,6 @@
"integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
"dev": true
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npm.taobao.org/cacache/download/cacache-13.0.1.tgz",
@ -2407,34 +2397,6 @@
"unique-filename": "^1.1.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"find-cache-dir": {
"version": "3.3.1",
"resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz",
@ -2456,25 +2418,6 @@
"path-exists": "^4.0.0"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz",
@ -2539,16 +2482,6 @@
"minipass": "^3.1.1"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
},
"terser-webpack-plugin": {
"version": "2.3.8",
"resolved": "https://registry.npm.taobao.org/terser-webpack-plugin/download/terser-webpack-plugin-2.3.8.tgz?cache=0&sync_timestamp=1602701885709&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fterser-webpack-plugin%2Fdownload%2Fterser-webpack-plugin-2.3.8.tgz",
@ -2565,18 +2498,6 @@
"terser": "^4.6.12",
"webpack-sources": "^1.4.3"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.0.0-beta.9",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz",
"integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
}
}
}
},
@ -16440,6 +16361,87 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.0.0-beta.9",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz",
"integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-ref": {
"version": "2.0.0",
"resolved": "https://registry.npm.taobao.org/vue-ref/download/vue-ref-2.0.0.tgz",

View File

@ -7,6 +7,7 @@ import { apiInit } from './view/api'
import VueRouter from 'vue-router'
import routes from './view/router'
import DsContainer from './view/components/container'
import './view/style/index.scss'
Vue.config.productionTip = false
Vue.use(antd)
Vue.use(VueRouter)

View File

@ -9,6 +9,7 @@
<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)">
@ -56,9 +57,9 @@ export default {
{ title: '系统代理', path: '/proxy' },
{
title: '应用',
path: '/app',
path: '/plugin',
children: [
{ title: 'NPM加速', path: '/app/node' }
{ title: 'NPM加速', path: '/plugin/node' }
]
}
]

View File

@ -1,3 +0,0 @@
<template>
<div>node</div>
</template>

View File

@ -0,0 +1,104 @@
<template>
<ds-container>
<template slot="header">
NPM加速
<span>
</span>
</template>
<div v-if="config">
<div>
<a-form-item label="启用NPM加速插件" >
<a-checkbox v-model="config.plugin.node.enabled" >
自动开启NPM加速
</a-checkbox>
当前状态
<a-tag v-if="status.plugin.node.enabled" color="green">
已启动
</a-tag>
</a-form-item>
<a-form-item label="切换registry" >
<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">
npmjs
</a-radio-button>
<a-radio-button value="https://registry.npm.taobao.org">
taobao
</a-radio-button>
</a-radio-group>
</a-form-item>
</div>
<div>
<div>某些库需要自己设置镜像变量才能下载比如electron</div>
<a-row :gutter="10" style="margin-top: 10px" v-for="(item,index) of npmVariables" :key = 'index'>
<a-col :span="10">
<a-input :disabled="item.key ===false" v-model="item.key"></a-input>
</a-col>
<a-col :span="10">
<a-input :disabled="item.value ===false" v-model="item.value"></a-input>
</a-col>
<a-col :span="4">
<a-icon v-if="item.exists" style="color:green" type="check" />
<a-icon v-if="!item.exists || !item.set" title="还未设置" style="color:red" type="exclamation-circle" />
</a-col>
</a-row>
</div>
</div>
<template slot="footer">
<div class="footer-bar">
<a-button type="primary" @click="submit()"></a-button>
</div>
</template>
</ds-container>
</template>
<script>
import DsContainer from '../../components/container'
import api from '../../api'
import status from '../../status'
export default {
name: 'Node',
components: {
DsContainer
},
data () {
return {
config: undefined,
status: status,
npmVariables: undefined,
registry: false
}
},
created () {
api.config.reload().then(ret => {
this.config = ret
})
api.plugin.node.getVariables().then(ret => {
this.npmVariables = ret
})
},
mounted () {
},
methods: {
onSwitchRegistry (event) {
return this.setRegistry(event.target.value).then(() => {
this.$message.success('切换成功')
})
},
setRegistry (registry) {
return api.plugin.node.setRegistry(registry)
},
submit () {
return api.config.set(this.config).then(() => {
this.$message.success('设置已保存')
})
}
}
}
</script>
<style lang="sass">
</style>

View File

@ -1,3 +1,62 @@
<template>
<div>proxy</div>
<ds-container>
<template slot="header">
系统代理设置
<span>
</span>
</template>
<div v-if="config">
<a-form-item label="启用系统代理" >
<a-checkbox v-model="config.proxy.enabled" >
自动开启系统代理
</a-checkbox>
当前状态
<a-tag v-if="status.plugin.node.enabled" color="green">
已启动
</a-tag>
</a-form-item>
</div>
<template slot="footer">
<div class="footer-bar">
<a-button type="primary" @click="submit()"></a-button>
</div>
</template>
</ds-container>
</template>
<script>
import DsContainer from '../components/container'
import api from '../api'
import status from '../status'
export default {
name: 'Proxy',
components: {
DsContainer
},
data () {
return {
config: undefined,
status: status
}
},
created () {
api.config.reload().then(ret => {
this.config = ret
})
},
mounted () {
},
methods: {
submit () {
api.config.set(this.config).then(() => {
this.$message.info('设置已保存')
})
}
}
}
</script>
<style lang="sass">
</style>

View File

@ -1,3 +1,140 @@
<template>
<div>server</div>
<ds-container>
<template slot="header">
系统代理设置
<span>
</span>
</template>
<div style="height: 100%" >
<a-tabs
default-active-key="1"
tab-position="left"
:style="{ height: '100%' }"
v-if="config"
>
<a-tab-pane tab="基本设置" key="1" >
<a-form-item label="启用代理服务" >
<a-checkbox :checked="config.server.enabled" @change="config.server.enabled = $event">
自动开启代理服务
</a-checkbox>
当前状态
<a-tag v-if="status.plugin.node.enabled" color="green">
已启动
</a-tag>
</a-form-item>
<a-form-item label="代理端口" >
<a-input v-model="config.server.port"/>
</a-form-item>
</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" @json-change="onJsonChange" ></vue-json-editor>
</a-tab-pane>
<a-tab-pane tab="DNS设置" key="3">
<div>
<div>某些域名有时候需要通过其他DNS服务器获取到的IP才可以访问</div>
<a-row style="margin-top:10px">
<a-col>
<a-button type="primary" icon="plus" @click="addDnsMapping()" />
</a-col>
</a-row>
<a-row :gutter="10" style="margin-top: 10px" 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">
<a-select-option value="usa">USA DNS</a-select-option>
<a-select-option value="aliyun">Aliyun DNS</a-select-option>
</a-select>
</a-col>
<a-col :span="3">
<a-button v-if="item.value!==false" style="margin-left:10px" type="danger" icon="minus" @click="deleteDnsMapping(item,index)" />
<a-button v-if="item.value===false" style="margin-left:10px" type="primary" icon="checked" @click="restoreDefDnsMapping(item,index)" ></a-button>
</a-col>
</a-row>
</div>
</a-tab-pane>
</a-tabs>
</div>
<template slot="footer">
<div class="footer-bar">
<a-button type="primary" @click="submit()"></a-button>
</div>
</template>
</ds-container>
</template>
<script>
import vueJsonEditor from 'vue-json-editor'
import DsContainer from '../components/container'
import api from '../api'
import status from '../status'
export default {
name: 'Server',
components: {
DsContainer, vueJsonEditor
},
data () {
return {
config: undefined,
status: status,
dnsMappings: []
}
},
created () {
api.config.reload().then(ret => {
this.config = ret
this.dnsMappings = []
for (const key in this.config.server.dns.mapping) {
const value = this.config.server.dns.mapping[key]
this.dnsMappings.push({
key, value
})
}
})
},
mounted () {
},
methods: {
onJsonChange (json) {
},
submit () {
api.config.set(this.config).then(() => {
this.$message.info('设置已保存')
})
}
}
}
</script>
<style lang="scss">
.json-wrapper {
.ant-drawer-wrapper-body{
display: flex;
flex-direction: column;
.ant-drawer-body{
flex: 1;
height: 0;
}
}
.jsoneditor-vue{
height:100%
}
.ant-tabs{
height: 100%;
}
.ant-tabs-content{
height: 100%;
}
.ant-tabs-tabpane-active{
height: 100%;
overflow-y: auto;
overflow-x: hidden;
}
}
</style>

View File

@ -1,14 +1,14 @@
import Index from '../pages/index'
import Server from '../pages/server'
import Proxy from '../pages/proxy'
import Node from '../pages/app/node'
import Node from '../pages/plugin/node'
const routes = [
{ path: '/', redirect: '/index' },
{ path: '/index', component: Index },
{ path: '/server', component: Server },
{ path: '/proxy', component: Proxy },
{ path: '/app/node', component: Node }
{ path: '/plugin/node', component: Node }
]

View File

@ -1,8 +1,12 @@
const status = {
server: false,
server: {
enabled: false
},
proxy: {
system: false,
npm: false
enabled: false
},
plugin: {
node: {}
}
}
export default status

View File

@ -0,0 +1,5 @@
.footer-bar{
padding:10px;
text-align: right;
border-top:#eee 1px solid;
}