From 79a94d25bdd92b73f1e59e29ef316a6e1b217213 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Mon, 10 Jan 2022 19:27:43 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E4=B8=8B=E8=BD=BD=E6=96=B0=E7=89=88=E6=9C=AC=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/main.js | 111 ++++++++++----- electron/package.json | 7 +- electron/utils.js | 106 ++++++++++++++ resources/assets/js/App.vue | 4 +- resources/assets/js/components/AppDown.vue | 129 ++++++++++-------- resources/assets/js/pages/login.vue | 3 - .../assets/js/pages/manage/dashboard.vue | 5 +- 7 files changed, 267 insertions(+), 98 deletions(-) create mode 100644 electron/utils.js diff --git a/electron/main.js b/electron/main.js index b7b36542..cf6ee411 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,47 +1,23 @@ const fs = require('fs') +const os = require("os"); const path = require('path') const XLSX = require('xlsx'); const {app, BrowserWindow, ipcMain, dialog} = require('electron') +const utils = require('./utils'); +const log = require("electron-log"); let mainWindow = null, subWindow = [], + downloadList = [], willQuitApp = false, inheritClose = false, devloadCachePath = path.resolve(__dirname, ".devload"), devloadUrl = ""; + if (fs.existsSync(devloadCachePath)) { devloadUrl = fs.readFileSync(devloadCachePath, 'utf8') } -function runNum(str, fixed) { - let _s = Number(str); - if (_s + "" === "NaN") { - _s = 0; - } - if (/^[0-9]*[1-9][0-9]*$/.test(fixed)) { - _s = _s.toFixed(fixed); - let rs = _s.indexOf('.'); - if (rs < 0) { - _s += "."; - for (let i = 0; i < fixed; i++) { - _s += "0"; - } - } - } - return _s; -} - -function randomString(len) { - len = len || 32; - let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678oOLl9gqVvUuI1'; - let maxPos = $chars.length; - let pwd = ''; - for (let i = 0; i < len; i++) { - pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); - } - return pwd; -} - function createMainWindow() { mainWindow = new BrowserWindow({ width: 1280, @@ -54,7 +30,7 @@ function createMainWindow() { contextIsolation: false } }) - mainWindow.webContents.setUserAgent(mainWindow.webContents.getUserAgent() + " MainTaskWindow/1.0"); + mainWindow.webContents.setUserAgent(mainWindow.webContents.getUserAgent() + " MainTaskWindow/" + process.platform + "/" + os.arch() + "/1.0"); if (devloadUrl) { mainWindow.loadURL(devloadUrl).then(r => { @@ -86,6 +62,42 @@ function createMainWindow() { } } }) + + mainWindow.webContents.session.on('will-download', (event, item) => { + item.setSavePath(path.join(app.getPath('temp'), item.getFilename())); + item.on('done', (event, state) => { + try { + const info = { + state, + name: item.getFilename(), + url: item.getURL(), + chain: item.getURLChain(), + savePath: item.getSavePath(), + mimeType: item.getMimeType(), + totalBytes: item.getTotalBytes(), + }; + mainWindow.webContents.send("downloadDone", info) + // + if (info.state == "completed") { + // 下载完成 + info.chain.some(url => { + let download = downloadList.find(item => item.url == url) + if (download) { + download.status = "completed" + download.info = info + } + }) + } else { + // 下载失败 + info.chain.some(url => { + downloadList = downloadList.filter(item => item.url != url) + }) + } + } catch (e) { + // + } + }) + }) } function createSubWindow(args) { @@ -100,7 +112,7 @@ function createSubWindow(args) { } } - let name = args.name || "auto_" + randomString(6); + let name = args.name || "auto_" + utils.randomString(6); let item = subWindow.find(item => item.name == name); let browser = item ? item.browser : null; if (browser) { @@ -139,7 +151,7 @@ function createSubWindow(args) { }) subWindow.push({ name, browser }) } - browser.webContents.setUserAgent(browser.webContents.getUserAgent() + " SubTaskWindow/1.0" + (args.userAgent ? (" " + args.userAgent) : "")); + browser.webContents.setUserAgent(browser.webContents.getUserAgent() + " SubTaskWindow/" + process.platform + "/" + os.arch() + "/1.0" + (args.userAgent ? (" " + args.userAgent) : "")); if (devloadUrl) { browser.loadURL(devloadUrl + '#' + (args.hash || args.path)).then(r => { @@ -177,6 +189,39 @@ ipcMain.on('inheritClose', (event) => { event.returnValue = "ok" }) +ipcMain.on('downloadURL', (event, args) => { + const download = downloadList.find(({url}) => url == args.url); + if (download) { + if (download.status == "completed") { + if (fs.existsSync(download.info.savePath)) { + log.warn("已下载完成", args) + mainWindow.webContents.send("downloadDone", download.info) + } else { + log.info("开始重新下载", args) + download.status = "progressing" + mainWindow.webContents.downloadURL(args.url); + } + } else { + log.warn("已在下载列表中", args) + } + } else { + log.info("开始下载", args) + downloadList.push(Object.assign(args, { status: "progressing" })) + mainWindow.webContents.downloadURL(args.url); + } + event.returnValue = "ok" +}) + +ipcMain.on('openFile', (event, args) => { + utils.openFile(args.path) + event.returnValue = "ok" +}) + +ipcMain.on('windowQuit', (event) => { + event.returnValue = "ok" + app.quit(); +}) + ipcMain.on('windowRouter', (event, args) => { createSubWindow(args) event.returnValue = "ok" @@ -278,7 +323,7 @@ ipcMain.on('setDockBadge', (event, args) => { // Mac only return; } - if (runNum(args) > 0) { + if (utils.runNum(args) > 0) { app.dock.setBadge(String(args)) } else { app.dock.setBadge("") diff --git a/electron/package.json b/electron/package.json index f73d66fe..35f40b90 100644 --- a/electron/package.json +++ b/electron/package.json @@ -25,7 +25,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/kuaifan/dootask.git" + "url": "https://github.com/kuaifan/dootask.git" }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.61", @@ -36,11 +36,12 @@ "dmg-license": "^1.0.10", "dotenv": "^10.0.0", "electron": "^16.0.5", - "electron-builder": "^22.14.5", - "electron-log": "^4.4.3" + "electron-builder": "^22.14.5" }, "dependencies": { + "axios": "^0.24.0", "electron-squirrel-startup": "^1.0.0", + "electron-log": "^4.4.3", "fs-extra": "^10.0.0", "xlsx": "^0.17.2" }, diff --git a/electron/utils.js b/electron/utils.js new file mode 100644 index 00000000..60792cad --- /dev/null +++ b/electron/utils.js @@ -0,0 +1,106 @@ +const fs = require("fs"); +const {shell} = require("electron"); + +module.exports = { + /** + * 随机数字 + * @param str + * @param fixed + * @returns {number} + */ + runNum(str, fixed) { + let _s = Number(str); + if (_s + "" === "NaN") { + _s = 0; + } + if (/^[0-9]*[1-9][0-9]*$/.test(fixed)) { + _s = _s.toFixed(fixed); + let rs = _s.indexOf('.'); + if (rs < 0) { + _s += "."; + for (let i = 0; i < fixed; i++) { + _s += "0"; + } + } + } + return _s; + }, + + /** + * 随机字符串 + * @param len + * @returns {string} + */ + randomString(len) { + len = len || 32; + let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678oOLl9gqVvUuI1'; + let maxPos = $chars.length; + let pwd = ''; + for (let i = 0; i < len; i++) { + pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); + } + return pwd; + }, + + /** + * 字符串包含 + * @param string + * @param find + * @param lower + * @returns {boolean} + */ + strExists(string, find, lower = false) { + string += ""; + find += ""; + if (lower !== true) { + string = string.toLowerCase(); + find = find.toLowerCase(); + } + return (string.indexOf(find) !== -1); + }, + + /** + * 字符串是否左边包含 + * @param string + * @param find + * @param lower + * @returns {boolean} + */ + leftExists(string, find, lower = false) { + string += ""; + find += ""; + if (lower !== true) { + string = string.toLowerCase(); + find = find.toLowerCase(); + } + return (string.substring(0, find.length) === find); + }, + + /** + * 删除左边字符串 + * @param string + * @param find + * @param lower + * @returns {string} + */ + leftDelete(string, find, lower = false) { + string += ""; + find += ""; + if (this.leftExists(string, find, lower)) { + string = string.substring(find.length) + } + return string ? string : ''; + }, + + /** + * 打开文件 + * @param path + */ + openFile(path) { + if (!fs.existsSync(path)) { + return + } + shell.openPath(path).then(() => { + }) + }, +} diff --git a/resources/assets/js/App.vue b/resources/assets/js/App.vue index c281a21a..326e0800 100755 --- a/resources/assets/js/App.vue +++ b/resources/assets/js/App.vue @@ -6,15 +6,17 @@ +