From f0552d5cce28d4ea298ccd623ddbaf57f0739bf6 Mon Sep 17 00:00:00 2001 From: xiaojunnuo Date: Tue, 10 Nov 2020 22:12:42 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E8=87=AA=E5=8A=A8=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 44 ++++++--- doc/avatar1.png | Bin 0 -> 13110 bytes doc/avatar2.png | Bin 0 -> 4623 bytes packages/core/package.json | 24 +---- packages/core/src/config/index.js | 9 +- packages/gui/public/index.html | 3 - packages/gui/src/background.js | 13 ++- packages/gui/src/bridge/index.js | 53 ++++++++-- packages/gui/src/bridge/update-handle.js | 72 ++++++++------ packages/gui/src/main.js | 10 +- packages/gui/src/view/api.js | 14 ++- packages/gui/src/view/index.js | 13 ++- packages/gui/src/view/mixins/plugin.js | 33 +++++-- .../view/{event.js => modules/error/index.js} | 20 ++-- packages/gui/src/view/modules/index.js | 9 ++ packages/gui/src/view/modules/update/index.js | 91 ++++++++++++++++++ packages/gui/src/view/pages/index.vue | 70 ++++++++------ packages/gui/src/view/pages/plugin/node.vue | 3 +- packages/gui/src/view/pages/proxy.vue | 4 +- packages/gui/src/view/pages/server.vue | 3 +- packages/gui/src/view/status.js | 19 +++- packages/mitmproxy/package.json | 31 ++---- .../proxy/mitmproxy/createConnectHandler.js | 3 - .../proxy/mitmproxy/createRequestHandler.js | 44 +++++++-- packages/mitmproxy/yarn.lock | 48 ++++++++- 25 files changed, 450 insertions(+), 183 deletions(-) create mode 100644 doc/avatar1.png create mode 100644 doc/avatar2.png rename packages/gui/src/view/{event.js => modules/error/index.js} (64%) create mode 100644 packages/gui/src/view/modules/index.js create mode 100644 packages/gui/src/view/modules/update/index.js diff --git a/README.md b/README.md index 8ef5e3d2..454451d5 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,22 @@ ### 1、 github的release、source、zip下载加速 可解决npm install 时某些安装包下载不下来的问题 -### 2、 解决git push某些情况下需要临时输入账号密码的问题 -通过将api.github.com域名解析到美国服务器 +### 2、 dns优选 +根据网络状况智能解析域名ip地址,获取最佳网络速度 +比如: +1. 解决git push 偶尔失败需要输入账号密码的问题 +2. 解决github头像加载不出来的问题 +3. 解决gist.github.com访问不到的问题 ### 3、 github的源代码查看(raw/blame查看) 通过跳转到国内加速链接上 + ### 4、 Stack Overflow 加速 -将ajax.google.com代理到加速代理上 ,recaptcha 加速 + +将ajax.google.com代理到加速CDN上 +recaptcha 图片验证码加速 + + ### 5、 google cdn 加速 通过代理到加速链接上 @@ -90,10 +99,16 @@ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keyc 1. yarn 设置淘宝镜像registry 2. npm设置官方registry。 3. 项目install使用yarn,发布包publish用npm,互不影响 - + 4. 某些库用cnpm也下载不下来的话,可以试试打开dev-sidecar的npm加速 ### 其他加速 - 1. git clone 加速 [fgit-go](https://github.com/FastGitORG/fgit-go) - 2. github.com代理网站(不能登录) [hub.fastgit.org](https://hub.fastgit.org/) + 1. git clone 加速 + > 使用方式用实际的名称替换{}的内容,即可加速clone + > https://hub.fastgit.org/{username}/{reponame}.git + > clone 出来的 remote "origin" 为fastgit的地址,需要手动改回来 + > 你也可以直接使用他们的clone加速工具 [fgit-go](https://github.com/FastGitORG/fgit-go) + 2. github.com的镜像网站(注意:不能登录) + >1. [hub.fastgit.org](https://hub.fastgit.org/) + >2. [github.com.cnpmjs.org](https://github.com.cnpmjs.org/) 这个很容易超限 ## api @@ -128,21 +143,28 @@ const intercepts = { } ``` -### DNS配置 +### DNS优选 某些域名(比如api.github.com)会被解析到新加坡的ip上,新加坡的服务器在上午挺好,到了晚上就卡死,基本不可用。 所以将这些域名解析到美国服务器上就可以正常访问 +另外,配置了dns mapping的域名,将会从dns获取到的ip列表中选择相对快一点的服务器进行访问 + ```js dns: { mapping: { - // "解决push的时候需要输入密码的问题", - 'api.github.com': 'usa', //配置该域名,使用USA的域名解析服务器 - 'gist.github.com': 'usa' - // "avatars*.githubusercontent.com": "usa" + // + 'api.github.com': 'usa', // "解决push的时候需要输入密码的问题", + 'gist.github.com': 'usa' // 解决gist无法访问的问题 + "*.githubusercontent.com": "usa" // 解决github头像经常下载不到的问题 } }, ``` 注意:暂时只支持IPv4的解析 +#### 开启前vs 开启后 +![](./doc/avatar2.png) +![](./doc/avatar1.png) + + ## 感谢 本项目使用lerna包管理工具 diff --git a/doc/avatar1.png b/doc/avatar1.png new file mode 100644 index 0000000000000000000000000000000000000000..623aa936415d7ac95b062d6c4392a5f8e99d41eb GIT binary patch literal 13110 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 d6K>=!q=KJ${n19V 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 literal 0 HcmV?d00001 diff --git a/packages/core/package.json b/packages/core/package.json index 9bd8bcf3..49a7e49f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,31 +1,21 @@ { "name": "@docmirror/dev-sidecar", "version": "1.0.1", - "description": "", + "description": "给开发者的加速代理工具", "main": "src/index.js", - "depedencies": {}, - "keywords": [], + "keywords": ["dev-sidecar","github加速","google加速","代理"], "author": "docmirror.cn", "license": "MPL-2.0", "private": false, "scripts": { - "start": "node ./start", - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" + "start": "node ./start" }, "dependencies": { "agentkeepalive": "^2.1.1", - "babel-core": "^6.8.0", - "babel-plugin-transform-async-to-generator": "^6.7.4", - "babel-polyfill": "^6.8.0", - "babel-preset-es2015": "^6.6.0", - "babel-register": "^6.8.0", "charset": "^1.0.0", "child_process": "^1.0.2", "colors": "^1.1.2", "commander": "^2.9.0", - "core-js": "^3.6.5", "debug": "^4.1.1", "dns-over-http": "^0.2.0", "dns-over-tls": "^0.0.8", @@ -38,22 +28,17 @@ "mkdirp": "^0.5.1", "node-cmd": "^3.0.0", "node-forge": "^0.8.2", - "node-mitmproxy": "^3.1.1", "node-powershell": "^4.0.0", "require-context": "^1.1.0", - "ssl-root-cas": "^1.3.1", "through2": "^2.0.1", "tunnel-agent": "^0.4.3", "util": "^0.12.3", "validator": "^13.1.17", - "vue": "^2.6.11", "winreg": "^1.2.4", "@docmirror/mitmproxy": "1.0.1" }, "devDependencies": { - "@vue/cli-plugin-babel": "~4.5.0", "@vue/cli-plugin-eslint": "~4.5.0", - "@vue/cli-service": "~4.5.0", "@vue/eslint-config-standard": "^5.1.2", "babel-eslint": "^10.1.0", "eslint": "^6.7.2", @@ -61,8 +46,7 @@ "eslint-plugin-node": "^11.1.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.0", - "eslint-plugin-vue": "^6.2.2", - "vue-template-compiler": "^2.6.11" + "eslint-plugin-vue": "^6.2.2" }, "eslintConfig": { "root": true, diff --git a/packages/core/src/config/index.js b/packages/core/src/config/index.js index 9c87c962..071615f0 100644 --- a/packages/core/src/config/index.js +++ b/packages/core/src/config/index.js @@ -23,7 +23,7 @@ module.exports = { 'raw.githubusercontent.com': { '.*': { proxy: 'raw.fastgit.org' } }, - 'github.githubassets.com': { + 'github11.githubassets.com': { '.*': { proxy: 'assets.fastgit.org', test: 'https://github.githubassets.com/favicons/favicon.svg' } }, 'customer-stories-feed.github.com': { @@ -100,10 +100,11 @@ module.exports = { } }, mapping: { + '*.github.com': 'usa', + '*.githubusercontent.com': 'usa', + '*.githubassets.com': 'usa', // "解决push的时候需要输入密码的问题", - 'api.github.com': 'usa', - 'gist.github.com': 'usa' - // "avatars*.githubusercontent.com": "usa" + 'github.com': 'usa' } } }, diff --git a/packages/gui/public/index.html b/packages/gui/public/index.html index 60adb88e..41cb07a2 100644 --- a/packages/gui/public/index.html +++ b/packages/gui/public/index.html @@ -8,9 +8,6 @@ <%= htmlWebpackPlugin.options.title %> -
diff --git a/packages/gui/src/background.js b/packages/gui/src/background.js index 20176602..a43f738b 100644 --- a/packages/gui/src/background.js +++ b/packages/gui/src/background.js @@ -75,6 +75,7 @@ function createWindow () { win = new BrowserWindow({ width: 900, height: 700, + title: 'Dev-Sidecar', webPreferences: { enableRemoteModule: true, // preload: path.join(__dirname, 'preload.js'), @@ -167,7 +168,17 @@ if (!isFirstInstance) { } createWindow() bridge.init(win) - updateHandle(win, 'http://localhost/dev-sidecar/') + + let updateUrl = 'https://dev-sidecar.docmirror.cn/update/' + if (process.env.NODE_ENV === 'development') { + Object.defineProperty(app, 'isPackaged', { + get () { + return true + } + }) + updateUrl = 'http://localhost/dev-sidecar/' + } + updateHandle(win, updateUrl) try { // 最小化到托盘 tray = setTray(app) diff --git a/packages/gui/src/bridge/index.js b/packages/gui/src/bridge/index.js index 4b2088c3..fae19b92 100644 --- a/packages/gui/src/bridge/index.js +++ b/packages/gui/src/bridge/index.js @@ -1,11 +1,15 @@ import lodash from 'lodash' import DevSidecar from '@docmirror/dev-sidecar' -import { ipcMain } from 'electron' +import { ipcMain, Menu } from 'electron' import fs from 'fs' import JSON5 from 'json5' import path from 'path' const mitmproxyPath = path.join(__dirname, 'mitmproxy.js') const localApi = { + /** + * 返回所有api列表,供vue来ipc调用 + * @returns {[]} + */ getApiList () { const core = lodash.cloneDeep(DevSidecar.api) const local = lodash.cloneDeep(localApi) @@ -15,13 +19,40 @@ const localApi = { // console.log('api list:', list) return list }, + /** + * 软件设置 + */ + setting: { + load () { + const settingPath = _getSettingPath() + const file = fs.readFileSync(settingPath) + const settings = JSON5.parse(file.toString()) + return settings || {} + }, + save (settings = {}) { + const settingPath = _getSettingPath() + fs.writeFileSync(settingPath, JSON5.stringify(settings, null, 2)) + } + }, + /** + * 启动所有 + * @returns {Promise} + */ startup () { return DevSidecar.api.startup({ mitmproxyPath }) }, server: { + /** + * 启动代理服务 + * @returns {Promise<{port: *}>} + */ start () { return DevSidecar.api.server.start({ mitmproxyPath }) }, + /** + * 重启代理服务 + * @returns {Promise} + */ restart () { return DevSidecar.api.server.restart({ mitmproxyPath }) } @@ -35,15 +66,13 @@ const localApi = { // 对比默认config的异同 const defConfig = DevSidecar.api.config.getDefault() const saveConfig = doMerge(defConfig, newConfig) - - // _merge(defConfig, newConfig, saveConfig, 'intercepts') - // _merge(defConfig, newConfig, saveConfig, 'dns.mapping') - // _merge(defConfig, newConfig, saveConfig, 'setting.startup.server', true) - // _merge(defConfig, newConfig, saveConfig, 'setting.startup.proxy') - fs.writeFileSync(_getConfigPath(), JSON5.stringify(saveConfig, null, 2)) return saveConfig }, + /** + * 读取后合并配置 + * @returns {*} + */ reload () { const path = _getConfigPath() if (!fs.existsSync(path)) { @@ -53,7 +82,7 @@ const localApi = { const userConfig = JSON5.parse(file.toString()) DevSidecar.api.config.set(userConfig) const config = DevSidecar.api.config.get() - return config + return config || {} } } } @@ -69,6 +98,13 @@ function _deepFindFunction (list, parent, parentKey) { } } +function _getSettingPath () { + const dir = './config/' + if (!fs.existsSync(dir)) { + fs.mkdirSync(dir) + } + return dir + 'setting.json5' +} function _getConfigPath () { const dir = './config/' if (!fs.existsSync(dir)) { @@ -147,6 +183,7 @@ export default { // 合并用户配置 localApi.config.reload() + // 启动所有 localApi.startup() }, devSidecar: DevSidecar diff --git a/packages/gui/src/bridge/update-handle.js b/packages/gui/src/bridge/update-handle.js index a8d9062e..30f8415a 100644 --- a/packages/gui/src/bridge/update-handle.js +++ b/packages/gui/src/bridge/update-handle.js @@ -1,6 +1,6 @@ -import { ipcMain } from 'electron' +import { ipcMain, dialog } from 'electron' import { autoUpdater } from 'electron-updater' - +import path from 'path' // win是所有窗口的引用 // const path = require('path') // 引入path模块 // const fs = require('fs-extra') @@ -14,61 +14,77 @@ function updateHandle (win, updateUrl) { // fs.emptyDir(updatePendingPath) // // 更新前,删除本地安装包 ↑ const message = { - error: 'update error', - checking: 'updating...', - updateAva: 'fetch new version and downloading...', - updateNotAva: 'do not to update' + error: '更新失败', + checking: '检查更新中', + updateAva: '发现新版本', + updateNotAva: '当前为最新版本,无需更新' } // 本地开发环境,改变app-update.yml地址 - // if (process.env.NODE_ENV === 'development' && !isMac) { - // autoUpdater.updateConfigPath = path.join(__dirname, 'win-unpacked/resources/app-update.yml') - // } + if (process.env.NODE_ENV === 'development' && !isMac) { + autoUpdater.updateConfigPath = path.join(__dirname, 'win-unpacked/resources/app-update.yml') + } + autoUpdater.autoDownload = false + // 设置服务器更新地址 autoUpdater.setFeedURL({ provider: 'generic', url: updateUrl }) - autoUpdater.on('error', function (err) { - console.log('autoUpdater error', err) - sendUpdateMessage(message.error) + autoUpdater.on('error', function (error) { + console.log('autoUpdater error', error) + sendUpdateMessage({ key: 'error', value: error, error: error }) + // dialog.showErrorBox('Error: ', error == null ? 'unknown' : (error.stack || error).toString()) }) autoUpdater.on('checking-for-update', function () { console.log('autoUpdater checking-for-update') - sendUpdateMessage(message.checking) + sendUpdateMessage({ key: 'checking', value: message.checking }) }) - // 准备更新,打开进度条读取页面,关闭其他页面 autoUpdater.on('update-available', function (info) { console.log('autoUpdater update-available') - sendUpdateMessage(message.updateAva) + sendUpdateMessage({ key: 'available', value: info }) }) autoUpdater.on('update-not-available', function (info) { console.log('autoUpdater update-not-available') - sendUpdateMessage(message.updateNotAva) + sendUpdateMessage({ key: 'notAvailable', value: message.updateNotAva }) }) // 更新下载进度 autoUpdater.on('download-progress', function (progressObj) { console.log('autoUpdater download-progress') - win.webContents.send('download-progress', parseInt(progressObj.percent)) + win.webContents.send('update', { key: 'progress', value: parseInt(progressObj.percent) }) }) // 更新完成,重启应用 - autoUpdater.on('update-downloaded', function (event, releaseNotes, releaseName, releaseDate, updateUrl, quitAndUpdate) { - ipcMain.on('isUpdateNow', (e, arg) => { - // some code here to handle event - autoUpdater.quitAndInstall() + autoUpdater.on('update-downloaded', function (info) { + console.log('download complete', info.version) + win.webContents.send('update', { + key: 'downloaded', + value: { + version: info.version, + releaseData: info.releaseDate + } }) - win.webContents.send('isUpdateNow') }) - ipcMain.on('checkForUpdate', () => { - // 执行自动更新检查 - console.log('autoUpdater checkForUpdates') - autoUpdater.checkForUpdates() + + ipcMain.on('update', (e, arg) => { + if (arg.key === 'doUpdateNow') { + // some code here to handle event + autoUpdater.quitAndInstall(true, true) + } else if (arg.key === 'checkForUpdate') { + // 执行自动更新检查 + console.log('autoUpdater checkForUpdates') + autoUpdater.checkForUpdates() + } else if (arg.key === 'downloadUpdate') { + // 下载新版本 + console.log('autoUpdater downloadUpdate') + autoUpdater.downloadUpdate() + } }) // 通过main进程发送事件给renderer进程,提示更新信息 - function sendUpdateMessage (text) { + function sendUpdateMessage (message) { console.log('autoUpdater sendUpdateMessage') - win.webContents.send('message', text) + win.webContents.send('update', message) } console.log('auto update inited') + return autoUpdater } export default updateHandle diff --git a/packages/gui/src/main.js b/packages/gui/src/main.js index 19ea4f79..e536112e 100644 --- a/packages/gui/src/main.js +++ b/packages/gui/src/main.js @@ -3,7 +3,6 @@ import App from './view/App.vue' import antd from 'ant-design-vue' import 'ant-design-vue/dist/antd.css' import view from './view' -import { apiInit } from './view/api' import VueRouter from 'vue-router' import routes from './view/router' import DsContainer from './view/components/container' @@ -17,16 +16,17 @@ Vue.component(DsContainer) const router = new VueRouter({ routes // (缩写) 相当于 routes: routes }) - -apiInit().then((api) => { +Vue.prototype.$global = {} +view.initApi().then(async (api) => { Vue.prototype.$api = api - + // 初始化status + await view.initPre(api) const app = new Vue({ router, render: h => h(App) }).$mount('#app') - view.init(app) + view.initModules(app) }) // fix vue-router NavigationDuplicated diff --git a/packages/gui/src/view/api.js b/packages/gui/src/view/api.js index 9271d973..03699a54 100644 --- a/packages/gui/src/view/api.js +++ b/packages/gui/src/view/api.js @@ -1,27 +1,32 @@ import lodash from 'lodash' import { ipcRenderer } from 'electron' -const doInvoke = (api, args) => { +const invoke = (api, args) => { return ipcRenderer.invoke('apiInvoke', [api, args]).catch(err => { console.error('api invoke error:', err) }) } +const send = (channel, message) => { + console.log('do send,', channel, message) + return ipcRenderer.send(channel, message) +} const bindApi = (api, param1) => { lodash.set(apiObj, api, (param2) => { - return doInvoke(api, param2 || param1) + return invoke(api, param2 || param1) }) } const apiObj = { on (channel, callback) { ipcRenderer.on(channel, callback) }, - doInvoke + invoke, + send } let inited = false export function apiInit () { if (!inited) { - return doInvoke('getApiList').then(list => { + return invoke('getApiList').then(list => { inited = true for (const item of list) { bindApi(item) @@ -30,7 +35,6 @@ export function apiInit () { return apiObj }) } - ipcRenderer.send('checkForUpdate') return new Promise(resolve => { resolve(apiObj) diff --git a/packages/gui/src/view/index.js b/packages/gui/src/view/index.js index 436bbdde..96d709d7 100644 --- a/packages/gui/src/view/index.js +++ b/packages/gui/src/view/index.js @@ -1,7 +1,12 @@ -import './status' -import register from './event' +import api, { apiInit } from './api' +import modules from './modules' +import status from './status' export default { - init (app) { - register(app) + initApi: apiInit, + async initPre (api) { + await status.install(api) + }, + initModules (app) { + modules.install(app, api) } } diff --git a/packages/gui/src/view/mixins/plugin.js b/packages/gui/src/view/mixins/plugin.js index b5597c7d..74aa0314 100644 --- a/packages/gui/src/view/mixins/plugin.js +++ b/packages/gui/src/view/mixins/plugin.js @@ -1,6 +1,6 @@ import DsContainer from '../components/container' -import status from '../status' import lodash from 'lodash' + export default { components: { DsContainer @@ -8,7 +8,7 @@ export default { data () { return { config: undefined, - status: status, + status: {}, labelCol: { span: 4 }, wrapperCol: { span: 20 }, applyLoading: false @@ -20,8 +20,15 @@ export default { mounted () { }, methods: { + getKey () { + if (this.key) { + return this.key + } + throw new Error('请设置key') + }, init () { - this.$api.config.reload().then(ret => { + this.status = this.$status + return this.$api.config.reload().then(ret => { this.config = ret if (this.ready) { return this.ready(this.config) @@ -40,11 +47,21 @@ export default { async applyBefore () { }, - reloadDefault (key) { - this.$api.config.resetDefault(key).then(ret => { - this.config = ret - }).then(() => { - this.apply() + resetDefault () { + const key = this.getKey() + this.$confirm({ + title: '提示', + content: '确定要恢复默认设置吗?', + cancelText: '取消', + okText: '确定', + onOk: async () => { + this.config = await this.$api.config.resetDefault(key) + if (this.ready) { + await this.ready(this.config) + } + await this.apply() + }, + onCancel () {} }) }, saveConfig () { diff --git a/packages/gui/src/view/event.js b/packages/gui/src/view/modules/error/index.js similarity index 64% rename from packages/gui/src/view/event.js rename to packages/gui/src/view/modules/error/index.js index a11f8a54..d8fd718c 100644 --- a/packages/gui/src/view/event.js +++ b/packages/gui/src/view/modules/error/index.js @@ -1,19 +1,9 @@ -import api from './api' -import status from './status' -import lodash from 'lodash' -function register (app) { - api.on('status', (event, message) => { - console.log('view on status', event, message) - const value = message.value - const key = message.key - lodash.set(status, key, value) - }) - +function install (app, api) { api.on('error.core', (event, message) => { console.error('view on error', message) const key = message.key if (key === 'server') { - handleServerStartError(message, message.error, app) + handleServerStartError(message, message.error, app, api) } }) api.on('error', (event, message) => { @@ -21,7 +11,7 @@ function register (app) { }) } -function handleServerStartError (message, err, app) { +function handleServerStartError (message, err, app, api) { if (message.value === 'EADDRINUSE') { app.$confirm({ title: '端口被占用,代理服务启动失败', @@ -42,4 +32,6 @@ function handleServerStartError (message, err, app) { } } -export default register +export default { + install +} diff --git a/packages/gui/src/view/modules/index.js b/packages/gui/src/view/modules/index.js new file mode 100644 index 00000000..522310ad --- /dev/null +++ b/packages/gui/src/view/modules/index.js @@ -0,0 +1,9 @@ +import update from './update' +import error from './error' + +export default { + install (app, api) { + error.install(app, api) + update.install(app, api) + } +} diff --git a/packages/gui/src/view/modules/update/index.js b/packages/gui/src/view/modules/update/index.js new file mode 100644 index 00000000..28f6fed4 --- /dev/null +++ b/packages/gui/src/view/modules/update/index.js @@ -0,0 +1,91 @@ +let updateParams = { } +function install (app, api) { + api.on('update', (event, message) => { + console.log('on message', event, message) + handleUpdateMessage(message, app) + }) + + api.update = { + checkForUpdate (params) { + updateParams = params || { fromUser: false, autoDownload: true, progress: 0 } + api.send('update', { key: 'checkForUpdate' }) + }, + downloadUpdate () { + api.send('update', { key: 'downloadUpdate' }) + }, + doUpdateNow () { + api.send('update', { key: 'doUpdateNow' }) + } + } + + function handleUpdateMessage (message) { + const type = message.key + if (type === 'available') { + foundNewVersion(message.value) + } else if (type === 'notAvailable') { + noNewVersion() + } else if (type === 'downloaded') { + // 更新包已下载完成,让用户确认是否更新 + newUpdateIsReady(message.value) + } else if (type === 'progress') { + progressUpdate(message.value) + } else if (type === 'error') { + const error = message.error + app.$message.error('Error: ' + (error == null ? '未知错误' : (error.stack || error).toString())) + } + } + + function noNewVersion (value) { + updateParams.newVersion = false + if (updateParams.fromUser) { + app.$message.info('当前已经是最新版本') + } + } + + function progressUpdate (value) { + updateParams.progress = value + } + function foundNewVersion (value) { + updateParams.newVersion = true + + if (updateParams.autoDownload !== false) { + api.update.downloadUpdate() + return + } + app.$confirm({ + title: '发现新版本', + content: `是否要更新到v${value.version}?`, + cancelText: '暂不升级', + okText: '升级', + // content: h =>

{value.version}更新内容:

{value.releaseNotes}
, + onOk () { + console.log('OK') + api.update.downloadUpdate() + }, + onCancel () { + console.log('Cancel') + } + }) + } + + function newUpdateIsReady (value) { + app.$confirm({ + title: '新版本已准备好', + content: `是否立即升级安装v${value.version}?`, + cancelText: '暂不升级', + okText: '立即升级', + // content: h =>

{value.version}更新内容:

{value.releaseNotes}
, + onOk () { + console.log('OK') + api.update.doUpdateNow() + }, + onCancel () { + console.log('Cancel') + } + }) + } +} + +export default { + install +} diff --git a/packages/gui/src/view/pages/index.vue b/packages/gui/src/view/pages/index.vue index 6ff938b8..9c3c9aeb 100644 --- a/packages/gui/src/view/pages/index.vue +++ b/packages/gui/src/view/pages/index.vue @@ -4,10 +4,13 @@ 给开发者的辅助工具 安装根证书 + + 检查更新 + -
+
@@ -38,8 +41,6 @@