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 @@
+