├── src ├── main │ ├── libs │ │ ├── settings.js │ │ ├── runCheck.js │ │ ├── extensions.js │ │ ├── shortcut.js │ │ └── compress.js │ ├── favicon │ │ ├── favicon.icns │ │ ├── favicon.ico │ │ └── favicon.png │ ├── win │ │ └── index.js │ └── main.js ├── render │ ├── libs │ │ ├── css │ │ │ ├── public.less │ │ │ ├── iview-custom-theme.less │ │ │ ├── theme.less │ │ │ └── reset.less │ │ ├── interface │ │ │ ├── context.js │ │ │ ├── baseContext.js │ │ │ └── public.js │ │ ├── images │ │ │ ├── logo.png │ │ │ └── loading.gif │ │ └── js │ │ │ └── event.js │ ├── store │ │ ├── actions.js │ │ ├── mutations.js │ │ └── index.js │ ├── App.vue │ ├── views │ │ ├── extensions.vue │ │ ├── guide.vue │ │ ├── markdown │ │ │ └── extensions.md │ │ ├── modules │ │ │ └── markdown.vue │ │ ├── index.vue │ │ └── checkUpdate.vue │ ├── electron.ejs │ ├── electron.js │ ├── index.js │ ├── index.ejs │ └── router │ │ └── index.js └── preload │ ├── index.js │ └── update.preload.js ├── updateServer ├── files │ ├── dev-1.0.1.zip │ └── update.json └── app.js ├── resources └── extensions │ └── vue-devtool │ ├── devtools-background.html │ ├── icons │ ├── 128.png │ ├── 16.png │ ├── 48.png │ ├── 128-beta.png │ ├── 128-gray.png │ ├── 128.nuxt.png │ ├── 16-beta.png │ ├── 16-gray.png │ ├── 16.nuxt.png │ ├── 48-beta.png │ ├── 48-gray.png │ └── 48.nuxt.png │ ├── popups │ ├── devtools-screenshot.png │ ├── not-found.html │ ├── disabled.html │ ├── disabled.nuxt.html │ ├── enabled.html │ ├── enabled.nuxt.html │ └── popup.css │ ├── build │ ├── 2906.js.LICENSE.txt │ ├── proxy.js │ ├── devtools-background.js │ ├── 1569.js │ ├── 4896.js │ ├── background.js │ ├── 9741.js │ ├── 6330.js │ ├── 1594.js │ ├── 3553.js │ ├── 1585.js │ ├── 3315.js │ ├── 6331.js │ ├── 7135.js │ ├── 6022.js │ ├── 8309.js │ ├── 7125.js │ ├── 3855.js │ ├── 4035.js │ ├── 3673.js │ ├── 8147.js │ ├── 4454.js │ ├── 1593.js │ ├── 491.js │ ├── 3399.js │ ├── 8677.js │ ├── 868.js │ ├── 4073.js │ ├── 9342.js │ ├── 5924.js │ ├── 5669.js │ ├── 2014.js │ ├── 3504.js │ ├── 1649.js │ ├── 4511.js │ ├── 6844.js │ ├── 9953.js │ ├── 8947.js │ ├── 6792.js │ ├── 3008.js │ ├── 4610.js │ ├── 5974.js │ ├── 2906.js │ ├── 7447.js │ ├── 4558.js │ ├── 4858.js │ ├── 6175.js │ ├── 5925.js │ ├── 7148.js │ ├── 5900.js │ ├── 849.js │ ├── 5881.js │ ├── 6751.js │ ├── 2287.js │ └── 2388.js │ ├── devtools.html │ ├── package.json │ └── manifest.json ├── .babelrc ├── .gitignore ├── config ├── index.js └── devServerConfig.js ├── README.md └── package.json /src/main/libs/settings.js: -------------------------------------------------------------------------------- 1 | // 客户端设置相关的轻量数据 2 | const settings = require('electron-settings'); -------------------------------------------------------------------------------- /src/render/libs/css/public.less: -------------------------------------------------------------------------------- 1 | @import './reset.less'; 2 | @import './iview-custom-theme.less'; -------------------------------------------------------------------------------- /src/render/libs/interface/context.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "name": "/pageContext", 3 | "api": "/api" 4 | } -------------------------------------------------------------------------------- /src/main/favicon/favicon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/src/main/favicon/favicon.icns -------------------------------------------------------------------------------- /src/main/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/src/main/favicon/favicon.ico -------------------------------------------------------------------------------- /src/main/favicon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/src/main/favicon/favicon.png -------------------------------------------------------------------------------- /src/render/libs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/src/render/libs/images/logo.png -------------------------------------------------------------------------------- /updateServer/files/dev-1.0.1.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/updateServer/files/dev-1.0.1.zip -------------------------------------------------------------------------------- /src/render/libs/images/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/src/render/libs/images/loading.gif -------------------------------------------------------------------------------- /src/render/libs/interface/baseContext.js: -------------------------------------------------------------------------------- 1 | const name = '/pageContext' 2 | const api = '/api'; 3 | module.exports = { 4 | name, api 5 | } -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/devtools-background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/render/libs/css/iview-custom-theme.less: -------------------------------------------------------------------------------- 1 | @import '~view-design/src/styles/index.less'; 2 | @import './theme.less'; 3 | @primary-color: @themeColor; -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/128.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/16.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/48.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/128-beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/128-beta.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/128-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/128-gray.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/128.nuxt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/128.nuxt.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/16-beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/16-beta.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/16-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/16-gray.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/16.nuxt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/16.nuxt.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/48-beta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/48-beta.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/48-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/48-gray.png -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/icons/48.nuxt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/icons/48.nuxt.png -------------------------------------------------------------------------------- /src/render/libs/interface/public.js: -------------------------------------------------------------------------------- 1 | var context =require('./context.js'); 2 | let publicUrl = { 3 | login: context.api + '/login' 4 | }; 5 | 6 | export default publicUrl; -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/devtools-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lhc-up/electron-vue-template/HEAD/resources/extensions/vue-devtool/popups/devtools-screenshot.png -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ], 5 | "plugins": [ 6 | "@babel/syntax-dynamic-import", 7 | "@babel/proposal-function-bind" 8 | ] 9 | } -------------------------------------------------------------------------------- /src/main/win/index.js: -------------------------------------------------------------------------------- 1 | const BaseWindow = require('./baseWindow.js'); 2 | class MainWindow extends BaseWindow { 3 | constructor(options={}) { 4 | super(options); 5 | } 6 | } 7 | 8 | module.exports = MainWindow; -------------------------------------------------------------------------------- /src/render/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async getUserInfo({ commit }) { 3 | // console.log(window.app) 4 | // await getUserInfo()..... 5 | // commit('setUserInfo', userInfo); 6 | } 7 | } -------------------------------------------------------------------------------- /updateServer/files/update.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": [ 3 | 1, 4 | 0, 5 | 1 6 | ], 7 | "hard": false, 8 | "zipUrl": "http://127.0.0.1:8889/dev-1.0.1.zip", 9 | "exeUrl": "" 10 | } -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/not-found.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Vue.js not detected 6 |

7 | -------------------------------------------------------------------------------- /src/preload/index.js: -------------------------------------------------------------------------------- 1 | const { ipcRenderer } = require('electron'); 2 | const { app, getGlobal } = require('@electron/remote'); 3 | import * as Event from '@/render/libs/js/event.js'; 4 | import './update.preload.js'; 5 | window.isElectron = true; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Thumbs.db 2 | ehthumbs.db 3 | Desktop.ini 4 | 5 | .idea/ 6 | .DS_Store 7 | ._DS_Store 8 | ._* 9 | node_modules/ 10 | .project 11 | yarn.lock 12 | npm-debug.log 13 | \._node_modules 14 | cache 15 | .vscode/ 16 | dist/ 17 | app/ 18 | pack/ 19 | -------------------------------------------------------------------------------- /src/render/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | //设置用户信息 3 | setUserInfo(state, userInfo) { 4 | if (!userInfo) { 5 | state.userInfo = {}; 6 | } 7 | for (let key in userInfo) { 8 | state.userInfo[key] = userInfo[key]; 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/2906.js.LICENSE.txt: -------------------------------------------------------------------------------- 1 | /*!--------------------------------------------------------------------------------------------- 2 | * Copyright (C) David Owens II, owensd.io. All rights reserved. 3 | *--------------------------------------------------------------------------------------------*/ 4 | -------------------------------------------------------------------------------- /src/render/App.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/disabled.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Vue.js is detected on this page.
6 | Devtools inspection is not available because it's in 7 | production mode or explicitly disabled by the author. 8 |

9 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/disabled.nuxt.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | Nuxt + Vue.js is detected on this page.
6 | Devtools inspection is not available because it's in 7 | production mode or explicitly disabled by the author. 8 |

9 | -------------------------------------------------------------------------------- /updateServer/app.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa'); 2 | const static = require('koa-static'); 3 | const path = require('path'); 4 | 5 | const app = new Koa(); 6 | app.use(static(path.join(__dirname, 'files'))); 7 | 8 | app.listen(8889, err => { 9 | if (err) return console.log(err); 10 | console.log('update-server running at port 8889!'); 11 | }); 12 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | const { devServerConfig, hostMap } = require('./devServerConfig'); 2 | const { PLATFORM, PROXY_ENV } = process.env; 3 | module.exports = { 4 | version: [1, 0, 0], 5 | context: { 6 | api: `${PLATFORM === 'electron' ? hostMap[PROXY_ENV] : ''}/api`, 7 | page: '/page' 8 | }, 9 | hostMap, 10 | devServer: devServerConfig 11 | } -------------------------------------------------------------------------------- /src/render/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import actions from './actions.js'; 4 | import mutations from './mutations.js'; 5 | Vue.use(Vuex); 6 | // 这里为全局的,模块内的请在模块内动态注册 7 | const store = new Vuex.Store({ 8 | strict: true, 9 | state: { 10 | userInfo: {} 11 | }, 12 | getters: {}, 13 | mutations, 14 | actions 15 | }); 16 | export default store; 17 | -------------------------------------------------------------------------------- /src/render/views/extensions.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/devtools.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 15 | 16 | 17 |
18 |
19 |
20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/proxy.js: -------------------------------------------------------------------------------- 1 | (()=>{const e=chrome.runtime.connect({name:"content-script"});function n(e){window.postMessage({source:"vue-devtools-proxy",payload:e},"*")}function t(t){t.data&&"vue-devtools-backend"===t.data.source?e.postMessage(t.data.payload):t.data&&"vue-devtools-backend-injection"===t.data.source&&"listening"===t.data.payload&&n("init")}function o(){window.removeEventListener("message",t),n("shutdown")}e.onMessage.addListener(n),window.addEventListener("message",t),e.onDisconnect.addListener(o),n("init")})(); -------------------------------------------------------------------------------- /src/render/views/guide.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 18 | -------------------------------------------------------------------------------- /src/main/libs/runCheck.js: -------------------------------------------------------------------------------- 1 | const { app, BrowserWindow } = require('electron'); 2 | module.exports = () => { 3 | // 单实例检查 4 | const gotTheLock = app.requestSingleInstanceLock(); 5 | if (!gotTheLock) return app.quit(); 6 | app.on('second-instance', () => { 7 | let myWindows = BrowserWindow.getAllWindows(); 8 | myWindows.forEach(win => { 9 | if (win && !win.isDestroyed()) { 10 | if (win.isMinimized()) win.restore(); 11 | win.focus(); 12 | } 13 | }); 14 | }); 15 | }; 16 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@vue-devtools/shell-chrome", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "build": "rimraf ./build && cross-env NODE_ENV=production webpack --progress" 6 | }, 7 | "dependencies": { 8 | "@vue-devtools/app-backend-core": "^0.0.0", 9 | "@vue-devtools/app-frontend": "^0.0.0", 10 | "@vue-devtools/shared-utils": "^0.0.0" 11 | }, 12 | "devDependencies": { 13 | "@vue-devtools/build-tools": "^0.0.0", 14 | "rimraf": "^3.0.2", 15 | "webpack": "^5.35.1", 16 | "webpack-cli": "^4.6.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/render/libs/js/event.js: -------------------------------------------------------------------------------- 1 | export const dispatchEvent = function (name, args, isBubbling, isBroadcast) { 2 | const event = document.createEvent('HTMLEvents'); 3 | // name:事件类型,isBubbling:是否冒泡,isBroadcast:是否阻止浏览器的默认行为 4 | event.initEvent(name, isBubbling, isBroadcast); 5 | Object.assign(event, args); 6 | document.dispatchEvent(event); 7 | return event.result; 8 | } 9 | export const addEventListener = function (name, cb) { 10 | document.addEventListener(name, cb); 11 | } 12 | export const removeEventListener = function (name, cb) { 13 | document.removeEventListener(name, cb); 14 | } -------------------------------------------------------------------------------- /src/render/electron.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | <%= htmlWebpackPlugin.options.title %> 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/enabled.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 | Screenshot 7 |
8 | 9 |
10 |

11 | Vue.js is detected on this page.
12 | Open DevTools and look for the Vue panel. 13 |

14 | 15 |

16 | Troubleshooting 17 |

18 |
19 |
20 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/enabled.nuxt.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 | Screenshot 7 |
8 | 9 |
10 |

11 | Nuxt + Vue.js is detected on this page.
12 | Open DevTools and look for the Vue panel. 13 |

14 | 15 |

16 | Troubleshooting 17 |

18 |
19 |
20 | -------------------------------------------------------------------------------- /src/render/electron.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import ViewUI from 'view-design'; 3 | import VueRouter from 'vue-router'; 4 | import store from './store/index.js'; 5 | import routers from './router/index.js'; 6 | import index from './App.vue'; 7 | import '@/render/libs/css/public.less'; 8 | 9 | Vue.use(VueRouter); 10 | Vue.use(ViewUI); 11 | 12 | let router = new VueRouter({ 13 | // mode: 'history', 14 | routes: routers 15 | }); 16 | 17 | //取消 Vue 所有的日志与警告 18 | Vue.config.silent = true; 19 | const app = new Vue({ 20 | el: '#app', 21 | router, 22 | store, 23 | render: h => h(index) 24 | }); 25 | 26 | window.myApp = app; -------------------------------------------------------------------------------- /src/render/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import ViewUI from 'view-design'; 3 | import VueRouter from 'vue-router'; 4 | import store from './store/index.js'; 5 | import routers from './router/index.js'; 6 | import index from './App.vue'; 7 | import '@/render/libs/css/public.less'; 8 | 9 | Vue.use(VueRouter); 10 | Vue.use(ViewUI); 11 | 12 | const router = new VueRouter({ 13 | mode: 'history', 14 | routes: routers 15 | }); 16 | 17 | //取消 Vue 所有的日志与警告 18 | Vue.config.silent = true; 19 | const app = new Vue({ 20 | el: '#app', 21 | router, 22 | store, 23 | render: h => h(index) 24 | }); 25 | 26 | window.myApp = app; -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/devtools-background.js: -------------------------------------------------------------------------------- 1 | (()=>{let e=!1,n=0;chrome.devtools.network.onNavigated.addListener(t);const o=setInterval(t,1e3);function t(){e||n++>10?clearInterval(o):chrome.devtools.inspectedWindow.eval("!!(window.__VUE_DEVTOOLS_GLOBAL_HOOK__ && (window.__VUE_DEVTOOLS_GLOBAL_HOOK__.Vue || window.__VUE_DEVTOOLS_GLOBAL_HOOK__.apps.length))",(function(n){n&&!e&&(clearInterval(o),e=!0,chrome.devtools.panels.create("Vue","icons/128.png","devtools.html",(e=>{e.onShown.addListener(d),e.onHidden.addListener(_)})))}))}function d(){chrome.runtime.sendMessage("vue-panel-shown")}function _(){chrome.runtime.sendMessage("vue-panel-hidden")}t()})(); -------------------------------------------------------------------------------- /src/render/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <% const favicon = require('../main/favicon/favicon.ico') %> 5 | 6 | <%= htmlWebpackPlugin.options.title %> 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | -------------------------------------------------------------------------------- /src/render/libs/css/theme.less: -------------------------------------------------------------------------------- 1 | @themeColor: #722ed1; 2 | @themeFontColor: #ffffff; 3 | @themeHoverColor: shade(@themeColor, 15%); 4 | 5 | //成功主题色 6 | @successThemeColor: #2ed150; 7 | @successThemeFontColor: #ffffff; 8 | @successThemeHoverColor: shade(@successThemeColor, 15%); 9 | 10 | //警告主题色 11 | @warningThemeColor: #f8ec07; 12 | @warningThemeFontColor: #ffffff; 13 | @warningThemeHoverColor: shade(@warningThemeColor, 15%); 14 | 15 | //错误主题色 16 | @errorThemeColor: #ee0e12; 17 | @errorThemeFontColor: #ffffff; 18 | @errorThemeHoverColor: shade(@errorThemeColor, 15%); 19 | 20 | //信息主题色 21 | @infoThemeColor: #90949a; 22 | @infoThemeFontColor: #ffffff; 23 | @infoThemeHoverColor: shade(@infoThemeColor, 15%); 24 | 25 | @fontColor: #120338; 26 | @borderColor: #dcdcdc; -------------------------------------------------------------------------------- /src/render/views/markdown/extensions.md: -------------------------------------------------------------------------------- 1 | # [添加Chrome扩展](https://www.electronjs.org/docs/latest/api/session#sesloadextensionpath-options) 2 | 3 | ```javascript 4 | const { app, session } = require('electron'); 5 | app.on('ready', async () => { 6 | await session.defaultSession.loadExtension( 7 | // 解压后的插件目录,不支持crx格式 8 | // 可使用在线工具(https://www.ezyzip.com/cn-crx.html)进行解压 9 | extensionPath, 10 | { 11 | allowFileAccess: true 12 | } 13 | ); 14 | // 创建窗口 15 | }); 16 | ``` 17 | 18 | 具体代码实现见:`src/main/libs/extensions.js`、`src/main/main.js` 19 | 20 | ### 注意 21 | 22 | `Electron`并非支持所有的`Chrome`插件,引入插件时需要考虑插件中是否使用了`Electron`不支持的API,[参考文档](https://www.electronjs.org/docs/latest/api/extensions#supported-extensions-apis) 23 | -------------------------------------------------------------------------------- /src/main/libs/extensions.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const { session } = require('electron'); 3 | import installExtension, { VUEJS_DEVTOOLS} from 'electron-devtools-installer'; 4 | 5 | const isDev = process.env.NODE_ENV === 'development'; 6 | 7 | // 资源目录 8 | const resourceDir = isDev ? path.join(process.cwd(), 'resources') : process.resourcesPath; 9 | // 插件目录 10 | const extensionsDir = path.join(resourceDir, 'extensions'); 11 | 12 | export async function addVueDevtool() { 13 | // 通用加载方式 14 | // const extensionPath = path.join(extensionsDir, 'vue-devtool'); 15 | // await session.defaultSession.loadExtension(extensionPath, { 16 | // allowFileAccess: true 17 | // }); 18 | 19 | // 使用electron-devtools-installer包,添加常用的devtool 20 | await installExtension(VUEJS_DEVTOOLS); 21 | } -------------------------------------------------------------------------------- /src/main/libs/shortcut.js: -------------------------------------------------------------------------------- 1 | const { 2 | app, 3 | BrowserWindow 4 | } = require("electron"); 5 | const globalShortcut = require("electron").globalShortcut; 6 | class Shortcut{ 7 | register(keys='Command+Control+Alt+F4'){ 8 | globalShortcut.register(keys, function () { 9 | let allWindow = BrowserWindow.getAllWindows(); 10 | for(let index =0;index < allWindow.length ;index++){ 11 | let win=allWindow[index] 12 | if(win.webContents && !win.webContents.isDevToolsOpened()){ 13 | win.webContents.openDevTools({mode: 'detach'}); 14 | } 15 | } 16 | }) 17 | } 18 | 19 | } 20 | app.on('will-quit', function () { 21 | globalShortcut.unregisterAll() 22 | }); 23 | module.exports=new Shortcut(); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/1569.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[1569],{51569:(e,t,s)=>{s.r(t),s.d(t,{conf:()=>n,language:()=>o});var n={comments:{lineComment:"#"}},o={defaultToken:"keyword",ignoreCase:!0,tokenPostfix:".azcli",str:/[^#\s]/,tokenizer:{root:[{include:"@comment"},[/\s-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}],[/^-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":{token:"key.identifier",next:"@type"}}}]],type:[{include:"@comment"},[/-+@str*\s*/,{cases:{"@eos":{token:"key.identifier",next:"@popall"},"@default":"key.identifier"}}],[/@str+\s*/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}]],comment:[[/#.*$/,{cases:{"@eos":{token:"comment",next:"@popall"}}}]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/popups/popup.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700,700i'); 2 | 3 | body { 4 | font-family: Roboto, Avenir, Helvetica, Arial, sans-serif; 5 | font-size: 14px; 6 | font-weight: 400; 7 | line-height: 1.4; 8 | padding: 18px 24px; 9 | color: #2c3e50; 10 | } 11 | 12 | body, 13 | p { 14 | margin: 0; 15 | } 16 | 17 | p { 18 | min-width: 200px; 19 | max-width: 300px; 20 | } 21 | 22 | .short-paragraph { 23 | min-width: initial; 24 | white-space: nowrap; 25 | } 26 | 27 | a { 28 | color: #42B983; 29 | } 30 | 31 | .flex { 32 | display: flex; 33 | align-items: center; 34 | } 35 | 36 | .screenshot { 37 | position: relative; 38 | } 39 | 40 | .screenshot > img { 41 | width: 140px; 42 | height: 140px; 43 | object-fit: cover; 44 | border-radius: 100%; 45 | margin-right: 24px; 46 | box-shadow: 0 0 15px rgb(0 0 0 / 10%); 47 | } 48 | -------------------------------------------------------------------------------- /config/devServerConfig.js: -------------------------------------------------------------------------------- 1 | /** 2 | * devServer相关配置 3 | */ 4 | const hostMap = { 5 | dev: 'https://dev.server.com:8088', 6 | test: 'https://test.server.com', 7 | release: 'https://server.com' 8 | } 9 | 10 | const proxyPath = ['/api/', '/sys/']; 11 | 12 | const proxyMap = {}; 13 | Object.keys(hostMap).forEach(env => { 14 | proxyMap[env] = {}; 15 | proxyPath.forEach(prefix => { 16 | const target = hostMap[env]; 17 | proxyMap[env][prefix] = { 18 | target, 19 | secure: false, 20 | changeOrigin: true, 21 | headers: { 22 | Referer: target 23 | } 24 | } 25 | }); 26 | }); 27 | 28 | // 导出服务配置 29 | module.exports = { 30 | devServerConfig: { 31 | host: '127.0.0.1', 32 | port: 8888, 33 | openBrowserAfterComplete: true, 34 | proxy: proxyMap[process.env.PROXY_ENV] 35 | }, 36 | hostMap 37 | } -------------------------------------------------------------------------------- /src/render/views/modules/markdown.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/4896.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[4896],{64896:(e,s,n)=>{n.r(s),n.d(s,{conf:()=>o,language:()=>t});var o={comments:{lineComment:"#"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},t={defaultToken:"",tokenPostfix:".ini",escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^\[[^\]]*\]/,"metatag"],[/(^\w+)(\s*)(\=)/,["key","","delimiter"]],{include:"@whitespace"},[/\d+/,"number"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],whitespace:[[/[ \t\r\n]+/,""],[/^\s*[#;].*$/,"comment"]],string:[[/[^\\"']+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/["']/,{cases:{"$#==$S2":{token:"string",next:"@pop"},"@default":"string"}}]]}}}}]); -------------------------------------------------------------------------------- /src/main/main.js: -------------------------------------------------------------------------------- 1 | require('./libs/runCheck.js')(); 2 | require('./libs/compress.js'); 3 | const shortcut = require('./libs/shortcut.js'); 4 | const { app, BrowserWindow, ipcMain } = require('electron'); 5 | import { addVueDevtool } from '@/main/libs/extensions.js'; 6 | const remote = require('@electron/remote/main'); 7 | remote.initialize(); 8 | 9 | const MainWindow = require('./win/index.js'); 10 | 11 | // (electron) The default value of app.allowRendererProcessReuse is deprecated, it is currently "false". 12 | // It will change to be "true" in Electron 9. 13 | // For more information please check https://github.com/electron/electron/issues/18397 14 | // 手动设置为false,跟当前默认值保持一致,同时可清除终端中的log警告 15 | app.allowRendererProcessReuse = false; 16 | 17 | // 禁用硬件加速 18 | app.disableHardwareAcceleration(); 19 | 20 | //注册全局变量 21 | Object.assign(global, { 22 | // 页面跟路径配置,优先使用此配置,考虑到小版本更新时,版本之间的切换 23 | wwwroot: __dirname, 24 | // 区分不同域下的cookie 25 | cookie: {} 26 | }); 27 | 28 | app.on('ready', async () => { 29 | // 注册快捷键打开控制台事件 30 | shortcut.register('Command+Control+Alt+F5'); 31 | // await addVueDevtool(); 32 | const win = new MainWindow(); 33 | win.create(); 34 | }); 35 | 36 | app.on('window-all-closed', function () { 37 | const allwindow = BrowserWindow.getAllWindows(); 38 | if (allwindow.length === 0) app.exit(1); 39 | }); 40 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/background.js: -------------------------------------------------------------------------------- 1 | (()=>{const e={};function n(e){return+e+""===e}function o(n){chrome.tabs.executeScript(n,{file:"/build/proxy.js"},(function(o){o||e[n].devtools.postMessage("proxy-fail")}))}function t(n,o,t){function s(e){if("log"===e.event)return console.log("tab "+n,e.payload);t.postMessage(e)}function a(e){if("log"===e.event)return console.log("tab "+n,e.payload);o.postMessage(e)}function c(){o.onMessage.removeListener(s),t.onMessage.removeListener(a),o.disconnect(),t.disconnect(),e[n]=null}o.onMessage.addListener(s),t.onMessage.addListener(a),o.onDisconnect.addListener(c),t.onDisconnect.addListener(c)}chrome.runtime.onConnect.addListener((s=>{let a,c;n(s.name)?(a=s.name,c="devtools",o(+s.name)):(a=s.sender.tab.id,c="backend"),e[a]||(e[a]={devtools:null,backend:null}),e[a][c]=s,e[a].devtools&&e[a].backend&&t(a,e[a].devtools,e[a].backend)})),chrome.runtime.onMessage.addListener(((e,n)=>{if(n.tab&&e.vueDetected){const o=e.nuxtDetected?".nuxt":"";chrome.browserAction.setIcon({tabId:n.tab.id,path:{16:`icons/16${o}.png`,48:`icons/48${o}.png`,128:`icons/128${o}.png`}}),chrome.browserAction.setPopup({tabId:n.tab.id,popup:e.devtoolsEnabled?`popups/enabled${o}.html`:`popups/disabled${o}.html`})}"vue-take-screenshot"===e.action&&"devtools_child"===n.envType&&browser.tabs.captureVisibleTab({format:"png"}).then((n=>{browser.runtime.sendMessage({action:"vue-screenshot-result",id:e.id,dataUrl:n})}))}))})(); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/9741.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[9741],{39741:(t,e,r)=>{r.r(e),r.d(e,{conf:()=>s,language:()=>o});var s={brackets:[],autoClosingPairs:[],surroundingPairs:[]},o={keywords:[],typeKeywords:[],tokenPostfix:".csp",operators:[],symbols:/[=>", 37 | "storage" 38 | ], 39 | "content_scripts": [ 40 | { 41 | "matches": [ 42 | "" 43 | ], 44 | "js": [ 45 | "build/hook.js" 46 | ], 47 | "run_at": "document_start" 48 | }, 49 | { 50 | "matches": [ 51 | "" 52 | ], 53 | "js": [ 54 | "build/detector.js" 55 | ], 56 | "run_at": "document_idle" 57 | } 58 | ], 59 | "content_security_policy": "script-src 'self'; object-src 'self'" 60 | } -------------------------------------------------------------------------------- /src/render/router/index.js: -------------------------------------------------------------------------------- 1 | const { context } = require('../../../config/index.js'); 2 | module.exports = [ 3 | { 4 | path: context.page + '/index.html', 5 | name: 'index', 6 | meta: { 7 | title: '首页', 8 | author: '--', 9 | parentRouter: '--' 10 | }, 11 | component: () => import('../views/index.vue'), 12 | children: [ 13 | { 14 | path: context.page + '/guide.html', 15 | name: 'guide', 16 | meta: { 17 | title: 'guide', 18 | author: '--', 19 | parentRouter: '--' 20 | }, 21 | component: () => import('../views/guide.vue') 22 | }, 23 | { 24 | path: context.page + '/checkUpdate.html', 25 | name: 'checkUpdate', 26 | meta: { 27 | title: 'checkUpdate', 28 | author: '--', 29 | parentRouter: '--' 30 | }, 31 | component: () => import('../views/checkUpdate.vue') 32 | }, 33 | { 34 | path: context.page + '/extensions.html', 35 | name: 'extensions', 36 | meta: { 37 | title: 'extensions', 38 | author: '--', 39 | parentRouter: '--' 40 | }, 41 | component: () => import('../views/extensions.vue') 42 | } 43 | ] 44 | } 45 | ]; 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # electron-vue-template 2 | 3 | **1、一套代码同时构建web端和客户端,提升开发效率;** 4 | **2、总结、实现桌面端特有需求,构建媲美原生应用的客户端。注意:需做好web代码和客户端代码的隔离。** 5 | 6 | - [x] 区分客户端和web端 7 | - [x] 检查更新 8 | - [ ] 录音 9 | - [ ] 全局异常捕获,崩溃日志、上报 10 | - [ ] auto-updater 11 | - [ ] 多窗口 12 | - [ ] 原生模块、dll 13 | - [x] chrome插件 14 | - [ ] 主进程断点调试 15 | - [x] 单实例检查,同时只能启动一个客户端 16 | - [x] 注册全局快捷键,打开调试窗口 17 | - [ ] 主进程代码加密 18 | - [ ] 注册自定义协议,web端唤醒,传递参数 19 | - [ ] 分阶段打包,生成免安装程序、构建exe 20 | - [ ] 自定义nsis脚本 21 | - [ ] 按条件编译 22 | - [x] 根据png格式的logo,打包时自动生成.ico或.icns格式的图片[https://github.com/lhc-up/create-icons](https://github.com/lhc-up/create-icons) 23 | - [ ] 数据库 24 | - [ ] 录屏 25 | - [ ] 共享桌面 26 | - [ ] 不同系统安装包,Windows、Mac、Linux、国产操作系统等 27 | - [ ] Mac新建日程 28 | - [ ] 系统托盘 29 | - [ ] 右键菜单(程序级别和系统级别) 30 | 31 | ## 安装依赖 32 | 33 | ```bash 34 | git clone https://github.com/lhc-up/electron-vue-template.git 35 | cd electron-vue-template 36 | npm install 37 | ``` 38 | 39 | ## 本地调试 40 | 41 | ### 客户端 42 | 43 | ```bash 44 | npm start 45 | ``` 46 | 47 | start实际执行的命令是 `cross-env NODE_ENV=development PROXY_ENV=dev PLATFORM=electron node ./buildClient/dev.js`,`PROXY_ENV`表示请求的后端服务环境,不同开发阶段,我们可能需要连接到后端服务的不同环境。 48 | 切换环境只需修改`PROXY_ENV`为对应环境的标识即可,具体配置在config文件夹下。 49 | 50 | ### web端 51 | 52 | ```bash 53 | npm run start:web 54 | ``` 55 | 56 | ## 打包 57 | 58 | ### 打包客户端 59 | 60 | ```bash 61 | npm run build 62 | ``` 63 | 64 | 客户端打包产物除了安装包之外,还包含渲染进程的zip压缩包,用于热更新使用。 65 | 根目录的update.json是版本更新配置文件,实际场景可能是从接口获取版本配置。 66 | updateFiles文件夹中有1.0.0.1小版本文件,可用于模拟自动更新。 67 | 小版本自动更新效果需要打包后才能看到,因为调试环境下,页面访问的始终是本地最新代码。 68 | 69 | ### 打包web端 70 | 71 | ```bash 72 | npm run build:web 73 | ``` 74 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/6330.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[6330],{6330:(e,o,n)=>{n.r(o),n.d(o,{conf:()=>s,language:()=>t});var s={comments:{lineComment:";",blockComment:["#|","|#"]},brackets:[["(",")"],["{","}"],["[","]"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}]},t={defaultToken:"",ignoreCase:!0,tokenPostfix:".scheme",brackets:[{open:"(",close:")",token:"delimiter.parenthesis"},{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"}],keywords:["case","do","let","loop","if","else","when","cons","car","cdr","cond","lambda","lambda*","syntax-rules","format","set!","quote","eval","append","list","list?","member?","load"],constants:["#t","#f"],operators:["eq?","eqv?","equal?","and","or","not","null?"],tokenizer:{root:[[/#[xXoObB][0-9a-fA-F]+/,"number.hex"],[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/,"number.float"],[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/,["keyword","white","variable"]],{include:"@whitespace"},{include:"@strings"},[/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,{cases:{"@keywords":"keyword","@constants":"constant","@operators":"operators","@default":"identifier"}}]],comment:[[/[^\|#]+/,"comment"],[/#\|/,"comment","@push"],[/\|#/,"comment","@pop"],[/[\|#]/,"comment"]],whitespace:[[/[ \t\r\n]+/,"white"],[/#\|/,"comment","@comment"],[/;.*$/,"comment"]],strings:[[/"$/,"string","@popall"],[/"(?=.)/,"string","@multiLineString"]],multiLineString:[[/[^\\"]+$/,"string","@popall"],[/[^\\"]+/,"string"],[/\\./,"string.escape"],[/"/,"string","@popall"],[/\\$/,"string"]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/1594.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[1594],{71594:(e,o,n)=>{n.r(o),n.d(o,{conf:()=>t,language:()=>r});var t={comments:{lineComment:"'"},brackets:[["(",")"],["[","]"],["If","EndIf"],["While","EndWhile"],["For","EndFor"],["Sub","EndSub"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]}]},r={defaultToken:"",tokenPostfix:".sb",ignoreCase:!0,brackets:[{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"keyword.tag-if",open:"If",close:"EndIf"},{token:"keyword.tag-while",open:"While",close:"EndWhile"},{token:"keyword.tag-for",open:"For",close:"EndFor"},{token:"keyword.tag-sub",open:"Sub",close:"EndSub"}],keywords:["Else","ElseIf","EndFor","EndIf","EndSub","EndWhile","For","Goto","If","Step","Sub","Then","To","While"],tagwords:["If","Sub","While","For"],operators:[">","<","<>","<=",">=","And","Or","+","-","*","/","="],identifier:/[a-zA-Z_][\w]*/,symbols:/[=><:+\-*\/%\.,]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[{include:"@whitespace"},[/(@identifier)(?=[.])/,"type"],[/@identifier/,{cases:{"@keywords":{token:"keyword.$0"},"@operators":"operator","@default":"variable.name"}}],[/([.])(@identifier)/,{cases:{$2:["delimiter","type.member"],"@default":""}}],[/\d*\.\d+/,"number.float"],[/\d+/,"number"],[/[()\[\]]/,"@brackets"],[/@symbols/,{cases:{"@operators":"operator","@default":"delimiter"}}],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,"string","@string"]],whitespace:[[/[ \t\r\n]+/,""],[/(\').*$/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"C?/,"string","@pop"]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/3553.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[3553],{53553:(e,s,o)=>{o.r(s),o.d(s,{conf:()=>t,language:()=>n});var t={comments:{lineComment:"REM"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],surroundingPairs:[{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*(::\\s*|REM\\s+)#region"),end:new RegExp("^\\s*(::\\s*|REM\\s+)#endregion")}}},n={defaultToken:"",ignoreCase:!0,tokenPostfix:".bat",brackets:[{token:"delimiter.bracket",open:"{",close:"}"},{token:"delimiter.parenthesis",open:"(",close:")"},{token:"delimiter.square",open:"[",close:"]"}],keywords:/call|defined|echo|errorlevel|exist|for|goto|if|pause|set|shift|start|title|not|pushd|popd/,symbols:/[=>{o.r(s),o.d(s,{conf:()=>l,language:()=>n});var l={brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},n={defaultToken:"",tokenPostfix:".dockerfile",variable:/\${?[\w]+}?/,tokenizer:{root:[{include:"@whitespace"},{include:"@comment"},[/(ONBUILD)(\s+)/,["keyword",""]],[/(ENV)(\s+)([\w]+)/,["keyword","",{token:"variable",next:"@arguments"}]],[/(FROM|MAINTAINER|RUN|EXPOSE|ENV|ADD|ARG|VOLUME|LABEL|USER|WORKDIR|COPY|CMD|STOPSIGNAL|SHELL|HEALTHCHECK|ENTRYPOINT)/,{token:"keyword",next:"@arguments"}]],arguments:[{include:"@whitespace"},{include:"@strings"},[/(@variable)/,{cases:{"@eos":{token:"variable",next:"@popall"},"@default":"variable"}}],[/\\/,{cases:{"@eos":"","@default":""}}],[/./,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],whitespace:[[/\s+/,{cases:{"@eos":{token:"",next:"@popall"},"@default":""}}]],comment:[[/(^#.*$)/,"comment","@popall"]],strings:[[/\\'$/,"","@popall"],[/\\'/,""],[/'$/,"string","@popall"],[/'/,"string","@stringBody"],[/"$/,"string","@popall"],[/"/,"string","@dblStringBody"]],stringBody:[[/[^\\\$']/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/'$/,"string","@popall"],[/'/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]],dblStringBody:[[/[^\\\$"]/,{cases:{"@eos":{token:"string",next:"@popall"},"@default":"string"}}],[/\\./,"string.escape"],[/"$/,"string","@popall"],[/"/,"string","@pop"],[/(@variable)/,"variable"],[/\\$/,"string"],[/$/,"string","@popall"]]}}}}]); -------------------------------------------------------------------------------- /src/render/libs/css/reset.less: -------------------------------------------------------------------------------- 1 | *{box-sizing:border-box;outline:none;word-break: break-all;} 2 | html,body{color:#444;font-size:14px;font-family: "Microsoft YaHei","Apple LiGothic Medium","NSimSun","FontAwesome","Arial" !important;} 3 | input,textarea,button{ outline:none;font-size:14px;font-family: "Microsoft YaHei","Apple LiGothic Medium","NSimSun","FontAwesome","Arial" !important;} 4 | html{ position:relative; min-height: 100%;} 5 | body{ background: #f0f2f5; } 6 | a, address, b, big,blockquote, body, center, cite, code, dd, del, div, dl, dt, em, fieldset, font, form, h1, h2, h3, h4, h5, h6, html, i, iframe, img, ins, label, legend, p, pre, small, span, strong, u, var, button {margin:0; padding:0; list-style:none;} 7 | form, article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary {display: block;} 8 | blockquote{ margin-left: 30px;}; 9 | ol li{list-style: decimal;list-style-position:inside;} 10 | /*选中文字颜色*/ 11 | ::selection{background:@themeColor;color:#FFF;} 12 | ::-moz-selection{background:@themeColor;color:#FFF;} 13 | ::-webkit-selection{background:@themeColor;color:#FFF;} 14 | ::-ms-selection{background:@themeColor;color:#FFF;} 15 | ::-o-selection{background:@themeColor;color:#FFF;} 16 | table{table-layout: fixed; word-break: break-all; word-wrap:break-word;} 17 | .hide {display: none;} 18 | .clearfix{zoom:1; clear: both;} 19 | .clearfix:after {clear: both;content: " ";display: block;height: 0;overflow: hidden;line-height: 0;font-size: 0;} 20 | .fl{float:left;} 21 | .fr{float:right;} 22 | /*滚动条样式*/ 23 | /*滚动条样式*/ 24 | div::-webkit-scrollbar-track{width: 5px; height: 5px; border-radius: 2.5px; background-color: #E9F4FA;} 25 | div::-webkit-scrollbar{width: 5px; height: 5px; background-color: #E9F4FA;} 26 | div::-webkit-scrollbar-thumb{width: 5px; height: 5px; border-radius: 2.5px; background-color: #efdbff;} 27 | table tr th{white-space: nowrap;} -------------------------------------------------------------------------------- /src/main/libs/compress.js: -------------------------------------------------------------------------------- 1 | const { ipcMain } = require('electron'); 2 | const fs = require('fs'); 3 | const archiver = require('archiver'); 4 | const AdmZip = require('adm-zip'); 5 | const path = require('path'); 6 | // 压缩上传数据 7 | ipcMain.on('main-compress-path', (event, arg) => { 8 | compress(arg.filePath, arg.zipPath, arg.level, (result, info) => { 9 | if (arg.callbackTag) 10 | event.sender.send(arg.callbackTag, result, arg.zipPath, info); 11 | }); 12 | }); 13 | // 解压最新的下载包文件夹 14 | ipcMain.on('main-unzip-file', (event, arg) => { 15 | let unzip = new AdmZip(path.join(arg.inPath, arg.fileName)); 16 | unzip.extractAllTo(path.join(arg.outPath, arg.fileNameWithOutExt), true); 17 | event.returnValue = ''; 18 | }); 19 | 20 | // 获取压缩文件 21 | ipcMain.on('main-get-compress-file', (event, path, fileName, type) => { 22 | event.returnValue = getInfo(path, fileName, type); 23 | }); 24 | // 不解压的情况下读取相关文件 25 | function getInfo(path, fileName, type) { 26 | let fileInfo; 27 | let zip = new AdmZip(path); 28 | let zipEntries = zip.getEntries(); 29 | zipEntries.forEach(item => { 30 | if (item.name === fileName) { 31 | fileInfo = item.getData(); 32 | } 33 | }); 34 | return type === 'json' ? JSON.parse(fileInfo.toString()) : fileInfo; 35 | } 36 | // 压缩指定目录的文件 37 | function compress(filePath, zipPath, level, callback) { 38 | const output = fs.createWriteStream(zipPath); 39 | const archive = archiver('zip', { 40 | zlib: { level: level ?? 9 } 41 | }); 42 | // 通过管道方法将输出流存档到文件 43 | archive.pipe(output); 44 | archive.directory(filePath, false); 45 | archive.on('error', function (err) { 46 | callback('error', '压缩错误' + err); 47 | }); 48 | output.on('close', function () { 49 | let size = archive.pointer(); 50 | callback('success', size); 51 | }); 52 | //完成归档 53 | archive.finalize(); 54 | } 55 | -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/3315.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[3315],{3315:(e,o,n)=>{n.r(o),n.d(o,{conf:()=>s,language:()=>t});var s={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},t={defaultToken:"",tokenPostfix:".pascaligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["begin","block","case","const","else","end","fail","for","from","function","if","is","nil","of","remove","return","skip","then","type","var","while","with","option","None","transaction"],typeKeywords:["bool","int","list","map","nat","record","string","unit","address","map","mtz","xtz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/6331.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[6331],{36331:(e,o,t)=>{t.r(o),t.d(o,{conf:()=>n,language:()=>s});var n={comments:{lineComment:"//",blockComment:["(*","*)"]},brackets:[["{","}"],["[","]"],["(",")"],["<",">"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"}]},s={defaultToken:"",tokenPostfix:".cameligo",ignoreCase:!0,brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["abs","begin","Bytes","Crypto","Current","else","end","failwith","false","fun","if","in","let","let%entry","let%init","List","list","Map","map","match","match%nat","mod","not","operation","Operation","of","Set","set","sender","source","String","then","true","type","with"],typeKeywords:["int","unit","string","tz"],operators:["=",">","<","<=",">=","<>",":",":=","and","mod","or","+","-","*","/","@","&","^","%","->","<-"],symbols:/[=><:@\^&|+\-*\/\^%]+/,tokenizer:{root:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],{include:"@whitespace"},[/[{}()\[\]]/,"@brackets"],[/[<>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/\d*\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\$[0-9a-fA-F]{1,16}/,"number.hex"],[/\d+/,"number"],[/[;,.]/,"delimiter"],[/'([^'\\]|\\.)*$/,"string.invalid"],[/'/,"string","@string"],[/'[^\\']'/,"string"],[/'/,"string.invalid"],[/\#\d+/,"string"]],comment:[[/[^\(\*]+/,"comment"],[/\*\)/,"comment","@pop"],[/\(\*/,"comment"]],string:[[/[^\\']+/,"string"],[/\\./,"string.escape.invalid"],[/'/,{token:"string.quote",bracket:"@close",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,"white"],[/\(\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/7135.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[7135],{87135:(e,t,n)=>{n.r(t),n.d(t,{conf:()=>i,language:()=>a});var o=n(82526),i={comments:{blockComment:["\x3c!--","--\x3e"]},brackets:[["<",">"]],autoClosingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],surroundingPairs:[{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],onEnterRules:[{beforeText:new RegExp("<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$","i"),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:o.Mj.IndentAction.IndentOutdent}},{beforeText:new RegExp("<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$","i"),action:{indentAction:o.Mj.IndentAction.Indent}}]},a={defaultToken:"",tokenPostfix:".xml",ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,""],{include:"@whitespace"},[/(<)(@qualifiedName)/,[{token:"delimiter"},{token:"tag",next:"@tag"}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:"delimiter"},{token:"tag"},"",{token:"delimiter"}]],[/(<\?)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/(<\!)(@qualifiedName)/,[{token:"delimiter"},{token:"metatag",next:"@tag"}]],[/<\!\[CDATA\[/,{token:"delimiter.cdata",next:"@cdata"}],[/&\w+;/,"string.escape"]],cdata:[[/[^\]]+/,""],[/\]\]>/,{token:"delimiter.cdata",next:"@pop"}],[/\]/,""]],tag:[[/[ \t\r\n]+/,""],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,["attribute.name","","attribute.value"]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,["attribute.name","","attribute.value"]],[/@qualifiedName/,"attribute.name"],[/\?>/,{token:"delimiter",next:"@pop"}],[/(\/)(>)/,[{token:"tag"},{token:"delimiter",next:"@pop"}]],[/>/,{token:"delimiter",next:"@pop"}]],whitespace:[[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//,"comment","@pop"],[//,"comment","@pop"],[/[^-]+/,"comment.content"],[/./,"comment.content"]],otherTag:[[/\/?>/,"delimiter","@pop"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name","@scriptAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter","@scriptAfterTypeEquals"],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name","@styleAfterType"],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter","tag",{token:"delimiter",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter","@styleAfterTypeEquals"],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value"],[/'([^']*)'/,"attribute.value"],[/[\w\-]+/,"attribute.name"],[/=/,"delimiter"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/4858.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[4858],{64858:(e,t,n)=>{n.r(t),n.d(t,{conf:()=>r,language:()=>o});var r={wordPattern:/(#?-?\d*\.\d\w*%?)|((::|[@#.!:])?[\w-?]+%?)|::|[@#.!:]/g,comments:{blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],folding:{markers:{start:new RegExp("^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\/"),end:new RegExp("^\\s*\\/\\*\\s*#endregion\\b.*\\*\\/")}}},o={defaultToken:"",tokenPostfix:".css",ws:"[ \t\n\r\f]*",identifier:"-?-?([a-zA-Z]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))([\\w\\-]|(\\\\(([0-9a-fA-F]{1,6}\\s?)|[^[0-9a-fA-F])))*",brackets:[{open:"{",close:"}",token:"delimiter.bracket"},{open:"[",close:"]",token:"delimiter.bracket"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],tokenizer:{root:[{include:"@selector"}],selector:[{include:"@comments"},{include:"@import"},{include:"@strings"},["[@](keyframes|-webkit-keyframes|-moz-keyframes|-o-keyframes)",{token:"keyword",next:"@keyframedeclaration"}],["[@](page|content|font-face|-moz-document)",{token:"keyword"}],["[@](charset|namespace)",{token:"keyword",next:"@declarationbody"}],["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@selectorname"},["[\\*]","tag"],["[>\\+,]","delimiter"],["\\[",{token:"delimiter.bracket",next:"@selectorattribute"}],["{",{token:"delimiter.bracket",next:"@selectorbody"}]],selectorbody:[{include:"@comments"},["[*_]?@identifier@ws:(?=(\\s|\\d|[^{;}]*[;}]))","attribute.name","@rulevalue"],["}",{token:"delimiter.bracket",next:"@pop"}]],selectorname:[["(\\.|#(?=[^{])|%|(@identifier)|:)+","tag"]],selectorattribute:[{include:"@term"},["]",{token:"delimiter.bracket",next:"@pop"}]],term:[{include:"@comments"},["(url-prefix)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],["(url)(\\()",["attribute.value",{token:"delimiter.parenthesis",next:"@urldeclaration"}]],{include:"@functioninvocation"},{include:"@numbers"},{include:"@name"},{include:"@strings"},["([<>=\\+\\-\\*\\/\\^\\|\\~,])","delimiter"],[",","delimiter"]],rulevalue:[{include:"@comments"},{include:"@strings"},{include:"@term"},["!important","keyword"],[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],warndebug:[["[@](warn|debug)",{token:"keyword",next:"@declarationbody"}]],import:[["[@](import)",{token:"keyword",next:"@declarationbody"}]],urldeclaration:[{include:"@strings"},["[^)\r\n]+","string"],["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],parenthizedterm:[{include:"@term"},["\\)",{token:"delimiter.parenthesis",next:"@pop"}]],declarationbody:[{include:"@term"},[";","delimiter","@pop"],["(?=})",{token:"",next:"@pop"}]],comments:[["\\/\\*","comment","@comment"],["\\/\\/+.*","comment"]],comment:[["\\*\\/","comment","@pop"],[/[^*/]+/,"comment"],[/./,"comment"]],name:[["@identifier","attribute.value"]],numbers:[["-?(\\d*\\.)?\\d+([eE][\\-+]?\\d+)?",{token:"attribute.value.number",next:"@units"}],["#[0-9a-fA-F_]+(?!\\w)","attribute.value.hex"]],units:[["(em|ex|ch|rem|vmin|vmax|vw|vh|vm|cm|mm|in|px|pt|pc|deg|grad|rad|turn|s|ms|Hz|kHz|%)?","attribute.value.unit","@pop"]],keyframedeclaration:[["@identifier","attribute.value"],["{",{token:"delimiter.bracket",switchTo:"@keyframebody"}]],keyframebody:[{include:"@term"},["{",{token:"delimiter.bracket",next:"@selectorbody"}],["}",{token:"delimiter.bracket",next:"@pop"}]],functioninvocation:[["@identifier\\(",{token:"attribute.value",next:"@functionarguments"}]],functionarguments:[["\\$@identifier@ws:","attribute.name"],["[,]","delimiter"],{include:"@term"},["\\)",{token:"attribute.value",next:"@pop"}]],strings:[['~?"',{token:"string",next:"@stringenddoublequote"}],["~?'",{token:"string",next:"@stringendquote"}]],stringenddoublequote:[["\\\\.","string"],['"',{token:"string",next:"@pop"}],[/[^\\"]+/,"string"],[".","string"]],stringendquote:[["\\\\.","string"],["'",{token:"string",next:"@pop"}],[/[^\\']+/,"string"],[".","string"]]}}}}]); -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/6175.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[6175],{6175:(e,t,n)=>{n.r(t),n.d(t,{conf:()=>s,language:()=>o});var s={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\#\$\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:"//",blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"'",close:"'",notIn:["string","comment"]},{open:'"',close:'"',notIn:["string","comment"]}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:"'",close:"'"},{open:'"',close:'"'}],folding:{markers:{start:new RegExp("^\\s*#region\\b"),end:new RegExp("^\\s*#endregion\\b")}}},o={defaultToken:"",tokenPostfix:".cs",brackets:[{open:"{",close:"}",token:"delimiter.curly"},{open:"[",close:"]",token:"delimiter.square"},{open:"(",close:")",token:"delimiter.parenthesis"},{open:"<",close:">",token:"delimiter.angle"}],keywords:["extern","alias","using","bool","decimal","sbyte","byte","short","ushort","int","uint","long","ulong","char","float","double","object","dynamic","string","assembly","is","as","ref","out","this","base","new","typeof","void","checked","unchecked","default","delegate","var","const","if","else","switch","case","while","do","for","foreach","in","break","continue","goto","return","throw","try","catch","finally","lock","yield","from","let","where","join","on","equals","into","orderby","ascending","descending","select","group","by","namespace","partial","class","field","event","method","param","public","protected","internal","private","abstract","sealed","static","struct","readonly","volatile","virtual","override","params","get","set","add","remove","operator","true","false","implicit","explicit","interface","enum","null","async","await","fixed","sizeof","stackalloc","unsafe","nameof","when"],namespaceFollows:["namespace","using"],parenFollows:["if","for","while","switch","foreach","using","catch","when"],operators:["=","??","||","&&","|","^","&","==","!=","<=",">=","<<","+","-","*","/","%","!","~","++","--","+=","-=","*=","/=","%=","&=","|=","^=","<<=",">>=",">>","=>"],symbols:/[=>](?!@symbols)/,"@brackets"],[/@symbols/,{cases:{"@operators":"delimiter","@default":""}}],[/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?[fFdD]?/,"number.float"],[/0[xX][0-9a-fA-F_]+/,"number.hex"],[/0[bB][01_]+/,"number.hex"],[/[0-9_]+/,"number"],[/[;,.]/,"delimiter"],[/"([^"\\]|\\.)*$/,"string.invalid"],[/"/,{token:"string.quote",next:"@string"}],[/\$\@"/,{token:"string.quote",next:"@litinterpstring"}],[/\@"/,{token:"string.quote",next:"@litstring"}],[/\$"/,{token:"string.quote",next:"@interpolatedstring"}],[/'[^\\']'/,"string"],[/(')(@escapes)(')/,["string","string.escape","string"]],[/'/,"string.invalid"]],qualified:[[/[a-zA-Z_][\w]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":"identifier"}}],[/\./,"delimiter"],["","","@pop"]],namespace:[{include:"@whitespace"},[/[A-Z]\w*/,"namespace"],[/[\.=]/,"delimiter"],["","","@pop"]],comment:[[/[^\/*]+/,"comment"],["\\*/","comment","@pop"],[/[\/*]/,"comment"]],string:[[/[^\\"]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/"/,{token:"string.quote",next:"@pop"}]],litstring:[[/[^"]+/,"string"],[/""/,"string.escape"],[/"/,{token:"string.quote",next:"@pop"}]],litinterpstring:[[/[^"{]+/,"string"],[/""/,"string.escape"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.litinterpstring"}],[/"/,{token:"string.quote",next:"@pop"}]],interpolatedstring:[[/[^\\"{]+/,"string"],[/@escapes/,"string.escape"],[/\\./,"string.escape.invalid"],[/{{/,"string.escape"],[/}}/,"string.escape"],[/{/,{token:"string.quote",next:"root.interpolatedstring"}],[/"/,{token:"string.quote",next:"@pop"}]],whitespace:[[/^[ \t\v\f]*#((r)|(load))(?=\s)/,"directive.csx"],[/^[ \t\v\f]*#\w.*$/,"namespace.cpp"],[/[ \t\v\f\r\n]+/,""],[/\/\*/,"comment","@comment"],[/\/\/.*$/,"comment"]]}}}}]); -------------------------------------------------------------------------------- /src/render/views/checkUpdate.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 105 | 106 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "electron-vue-template", 3 | "version": "1.0.0", 4 | "description": "electron-vue-template", 5 | "appName": "electron-vue-template", 6 | "main": "app/main.js", 7 | "scripts": { 8 | "start": "cross-env NODE_ENV=development PROXY_ENV=dev PLATFORM=electron node ./buildClient/dev.js", 9 | "build": "cross-env NODE_ENV=production PROXY_ENV=dev PLATFORM=electron node ./buildClient/build.js", 10 | "start:web": "cross-env NODE_ENV=development PROXY_ENV=dev PLATFORM=web node ./buildWeb/dev.js", 11 | "build:web": "cross-env NODE_ENV=production PROXY_ENV=dev PLATFORM=web node ./buildWeb/build.js", 12 | "server": "node ./updateServer/app.js" 13 | }, 14 | "license": "ISC", 15 | "browserslist": [ 16 | "> 10%", 17 | "last 7 versions", 18 | "ie >= 9", 19 | "firefox >= 20" 20 | ], 21 | "build": { 22 | "asar": true, 23 | "productName": "Electron+vue+webpack", 24 | "appId": "com.electron.template", 25 | "copyright": "Copyright © template", 26 | "directories": { 27 | "output": "pack" 28 | }, 29 | "files": [ 30 | "app/**" 31 | ], 32 | "extraResources": [ 33 | "./resources/**" 34 | ], 35 | "mac": { 36 | "identity": "com.electron.templat", 37 | "target": [ 38 | "dmg" 39 | ], 40 | "artifactName": "${productName}.${ext}", 41 | "icon": "src/main/favicon/favicon.icns" 42 | }, 43 | "dmg": { 44 | "title": "${productName}", 45 | "artifactName": "${productName}.${ext}", 46 | "icon": "src/main/favicon/favicon.icns" 47 | }, 48 | "win": { 49 | "legalTrademarks": "Copyright © template", 50 | "publisherName": "electron", 51 | "requestedExecutionLevel": "highestAvailable", 52 | "target": [ 53 | { 54 | "target": "nsis", 55 | "arch": [ 56 | "ia32" 57 | ] 58 | } 59 | ], 60 | "artifactName": "${productName}.${ext}", 61 | "icon": "main/favicon/favicon.ico" 62 | }, 63 | "nsis": { 64 | "oneClick": false, 65 | "allowToChangeInstallationDirectory": true, 66 | "perMachine": true, 67 | "allowElevation": true, 68 | "artifactName": "${productName}-安装包-V${version}.${ext}", 69 | "runAfterFinish": true, 70 | "shortcutName": "Electron+vue+webpack-template", 71 | "uninstallDisplayName": "${productName}", 72 | "guid": "com.template.webpack.vue.electron", 73 | "language": "2052" 74 | } 75 | }, 76 | "devDependencies": { 77 | "@babel/core": "^7.9.6", 78 | "@babel/plugin-proposal-function-bind": "^7.8.3", 79 | "@babel/plugin-syntax-dynamic-import": "^7.8.3", 80 | "@babel/polyfill": "^7.8.7", 81 | "@babel/preset-env": "^7.9.6", 82 | "@electron/remote": "^2.0.9", 83 | "adm-zip": "^0.4.14", 84 | "archiver": "^4.0.1", 85 | "autoprefixer": "^9.7.6", 86 | "axios": "^0.19.2", 87 | "babel-loader": "^8.1.0", 88 | "cross-env": "^7.0.3", 89 | "css-hot-loader": "^1.4.4", 90 | "css-loader": "^3.5.3", 91 | "electron": "^24.2.0", 92 | "electron-builder": "^22.4.0", 93 | "electron-devtools-installer": "^3.2.0", 94 | "electron-settings": "^4.0.2", 95 | "file-loader": "^6.0.0", 96 | "fs-extra": "^11.1.1", 97 | "html-loader": "^4.2.0", 98 | "html-webpack-plugin": "^5.5.1", 99 | "koa": "^2.15.3", 100 | "koa-static": "^5.0.0", 101 | "less": "^3.11.1", 102 | "less-loader": "^6.1.0", 103 | "markdown-loader": "^8.0.0", 104 | "marked": "^5.0.1", 105 | "mini-css-extract-plugin": "^2.7.5", 106 | "node-stream-zip": "^1.15.0", 107 | "postcss-loader": "^3.0.0", 108 | "progress-bar-webpack-plugin": "^2.1.0", 109 | "url": "^0.11.0", 110 | "url-loader": "^4.1.0", 111 | "view-design": "^4.7.0", 112 | "vue": "^2.6.11", 113 | "vue-loader": "^15.9.2", 114 | "vue-router": "^3.1.6", 115 | "vue-template-compiler": "^2.6.11", 116 | "vuex": "^3.4.0", 117 | "webpack": "^5.82.0", 118 | "webpack-dev-server": "^4.15.0" 119 | } 120 | } -------------------------------------------------------------------------------- /resources/extensions/vue-devtool/build/5925.js: -------------------------------------------------------------------------------- 1 | "use strict";(self["webpackChunk_vue_devtools_shell_chrome"]=self["webpackChunk_vue_devtools_shell_chrome"]||[]).push([[5925],{25925:(e,t,n)=>{n.r(t),n.d(t,{conf:()=>o,language:()=>a});var o={comments:{lineComment:"//"},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:'"',close:'"',notIn:["string","comment"]},{open:"'",close:"'",notIn:["string","comment"]},{open:"{",close:"}",notIn:["string","comment"]},{open:"[",close:"]",notIn:["string","comment"]},{open:"(",close:")",notIn:["string","comment"]}],folding:{offSide:!0}},a={defaultToken:"",tokenPostfix:".pug",ignoreCase:!0,brackets:[{token:"delimiter.curly",open:"{",close:"}"},{token:"delimiter.array",open:"[",close:"]"},{token:"delimiter.parenthesis",open:"(",close:")"}],keywords:["append","block","case","default","doctype","each","else","extends","for","if","in","include","mixin","typeof","unless","var","when"],tags:["a","abbr","acronym","address","area","article","aside","audio","b","base","basefont","bdi","bdo","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","command","datalist","dd","del","details","dfn","div","dl","dt","em","embed","fieldset","figcaption","figure","font","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","keygen","kbd","label","li","link","map","mark","menu","meta","meter","nav","noframes","noscript","object","ol","optgroup","option","output","p","param","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strike","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","tracks","tt","u","ul","video","wbr"],symbols:/[\+\-\*\%\&\|\!\=\/\.\,\:]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,tokenizer:{root:[[/^(\s*)([a-zA-Z_-][\w-]*)/,{cases:{"$2@tags":{cases:{"@eos":["","tag"],"@default":["",{token:"tag",next:"@tag.$1"}]}},"$2@keywords":["",{token:"keyword.$2"}],"@default":["",""]}}],[/^(\s*)(#[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.id"],"@default":["",{token:"tag.id",next:"@tag.$1"}]}}],[/^(\s*)(\.[a-zA-Z_-][\w-]*)/,{cases:{"@eos":["","tag.class"],"@default":["",{token:"tag.class",next:"@tag.$1"}]}}],[/^(\s*)(\|.*)$/,""],{include:"@whitespace"},[/[a-zA-Z_$][\w$]*/,{cases:{"@keywords":{token:"keyword.$0"},"@default":""}}],[/[{}()\[\]]/,"@brackets"],[/@symbols/,"delimiter"],[/\d+\.\d+([eE][\-+]?\d+)?/,"number.float"],[/\d+/,"number"],[/"/,"string",'@string."'],[/'/,"string","@string.'"]],tag:[[/(\.)(\s*$)/,[{token:"delimiter",next:"@blockText.$S2."},""]],[/\s+/,{token:"",next:"@simpleText"}],[/#[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.id",next:"@pop"},"@default":"tag.id"}}],[/\.[a-zA-Z_-][\w-]*/,{cases:{"@eos":{token:"tag.class",next:"@pop"},"@default":"tag.class"}}],[/\(/,{token:"delimiter.parenthesis",next:"@attributeList"}]],simpleText:[[/[^#]+$/,{token:"",next:"@popall"}],[/[^#]+/,{token:""}],[/(#{)([^}]*)(})/,{cases:{"@eos":["interpolation.delimiter","interpolation",{token:"interpolation.delimiter",next:"@popall"}],"@default":["interpolation.delimiter","interpolation","interpolation.delimiter"]}}],[/#$/,{token:"",next:"@popall"}],[/#/,""]],attributeList:[[/\s+/,""],[/(\w+)(\s*=\s*)("|')/,["attribute.name","delimiter",{token:"attribute.value",next:"@value.$3"}]],[/\w+/,"attribute.name"],[/,/,{cases:{"@eos":{token:"attribute.delimiter",next:"@popall"},"@default":"attribute.delimiter"}}],[/\)$/,{token:"delimiter.parenthesis",next:"@popall"}],[/\)/,{token:"delimiter.parenthesis",next:"@pop"}]],whitespace:[[/^(\s*)(\/\/.*)$/,{token:"comment",next:"@blockText.$1.comment"}],[/[ \t\r\n]+/,""],[//,{token:"comment",next:"@pop"}],[//,"comment.html","@pop"],[/[^-]+/,"comment.content.html"],[/./,"comment.content.html"]],otherTag:[[/\/?>/,"delimiter.html","@pop"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/]],script:[[/type/,"attribute.name.html","@scriptAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],scriptAfterType:[[/=/,"delimiter.html","@scriptAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@scriptWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@scriptEmbedded",nextEmbedded:"text/javascript"}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptWithCustomType:[[/>/,{token:"delimiter.html",next:"@scriptEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:"@rematch",next:"@pop"}]],scriptEmbedded:[[/<\/script/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]],style:[[/type/,"attribute.name.html","@styleAfterType"],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,["delimiter.html","tag.html",{token:"delimiter.html",next:"@pop"}]]],styleAfterType:[[/=/,"delimiter.html","@styleAfterTypeEquals"],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/'([^']*)'/,{token:"attribute.value.html",switchTo:"@styleWithCustomType.$1"}],[/>/,{token:"delimiter.html",next:"@styleEmbedded",nextEmbedded:"text/css"}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleWithCustomType:[[/>/,{token:"delimiter.html",next:"@styleEmbedded.$S2",nextEmbedded:"$S2"}],[/"([^"]*)"/,"attribute.value.html"],[/'([^']*)'/,"attribute.value.html"],[/[\w\-]+/,"attribute.name.html"],[/=/,"delimiter.html"],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:"@rematch",next:"@pop"}]],styleEmbedded:[[/<\/style/,{token:"@rematch",next:"@pop",nextEmbedded:"@pop"}],[/[^<]+/,""]]}}}}]); --------------------------------------------------------------------------------