Commit 84cfda63 by 朱哲铨

添加自动更新

parent 7f74230c
...@@ -497,7 +497,7 @@ ...@@ -497,7 +497,7 @@
be_sysConfig.js 系统设置 be_sysConfig.js 系统设置
routes 目录: 存放 exporess 路由 routes 目录: 存放 exporess 路由
index.js 路由定义 index.js 路由定义
server.js express 服务器 index.js express 服务器
``` ```
- 增加 lowdb 支持 - 增加 lowdb 支持
...@@ -575,7 +575,7 @@ ...@@ -575,7 +575,7 @@
- Web Server 服务器 - Web Server 服务器
代码: src/backend/webserver/server.js: 代码: src/backend/webserver/index.js:
```javascript ```javascript
import express from "express"; import express from "express";
...@@ -681,7 +681,7 @@ ...@@ -681,7 +681,7 @@
import { app, protocol, BrowserWindow, Menu } from "electron"; import { app, protocol, BrowserWindow, Menu } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
+ import webApp from "@/backend/webserver/server.js"; + import webApp from "@/backend/webserver/index.js";
... ...
``` ```
......
provider: generic
updaterCacheDirName: dev-updater
url: "https://console.jomalls.com/production/"
\ No newline at end of file
{
"publish": [
{
"provider": "generic",
"url": "https://admin.jomalls.com/production/"
}
]
}
\ No newline at end of file
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
"core-js": "^3.6.4", "core-js": "^3.6.4",
"electron-icon-builder": "^2.0.1", "electron-icon-builder": "^2.0.1",
"electron-store": "^4.0.0", "electron-store": "^4.0.0",
"electron-updater": "^6.2.1",
"element-ui": "^2.13.0", "element-ui": "^2.13.0",
"express": "^4.17.1", "express": "^4.17.1",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
......
...@@ -4,21 +4,40 @@ ...@@ -4,21 +4,40 @@
</div> </div>
</template> </template>
<script> <script>
import { ipcRenderer } from "electron";
export default { export default {
data() { data() {
return { return {
} update_info: null
};
},
mounted() {
ipcRenderer.on("update-available", (event, data) => {
console.log("检查到有新版本", data);
});
ipcRenderer.on("update", (event, data) => {
console.log("下載進度", data);
});
ipcRenderer.on("update-not-available", (event, data) => {
console.log("检查到沒有新版本", data);
});
ipcRenderer.on("downloaded", (event, data) => {
console.log(data,'data');
this.update_info = null;
let res = confirm("新版本已下载,是否立即安装?");
if (res) {
ipcRenderer.send("install");
}
});
}, },
methods: {} methods: {}
} };
</script> </script>
<style> <style>
body { body {
margin: 0; margin: 0;
height: 100vh; height: 100vh;
} }
#app { #app {
...@@ -27,6 +46,5 @@ body { ...@@ -27,6 +46,5 @@ body {
overflow: hidden; overflow: hidden;
width: 100vw; width: 100vw;
flex-direction: column; flex-direction: column;
} }
</style> </style>
"use strict"; "use strict";
import { ipcMain } from "electron"; import { ipcMain } from "electron";
import { app, protocol, BrowserWindow, screen } from "electron"; import { app, protocol, BrowserWindow, screen } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
import webApp from "@/backend/server.js"; import { createServer } from "@/server/index.js";
const checkUpdate = require("./update.js")
import * as path from "path";
createServer();
const isDevelopment = process.env.NODE_ENV !== "production"; const isDevelopment = process.env.NODE_ENV !== "production";
let win; let win;
...@@ -24,9 +27,11 @@ function createWindow() { ...@@ -24,9 +27,11 @@ function createWindow() {
webPreferences: { webPreferences: {
webSecurity: false, webSecurity: false,
nodeIntegration: true nodeIntegration: true
// preload: path.join(__dirname, "./preload.js")
} }
}); });
win.webContents.on('did-finish-load', () => {
checkUpdate(win, ipcMain)
})
let displays = screen.getAllDisplays(); let displays = screen.getAllDisplays();
......
import Vue from 'vue'; import Vue from 'vue';
export default new Vue(); export default new Vue();
\ No newline at end of file
...@@ -2,7 +2,7 @@ import { ...@@ -2,7 +2,7 @@ import {
downloadImage, downloadImage,
toSend, toSend,
writeProfileXml writeProfileXml
} from "@/backend/utils"; } from "@/server/utils";
const compressing = require("compressing"); const compressing = require("compressing");
var uuid = require("uuid"); var uuid = require("uuid");
......
import express from "express"; import express from "express";
import router from "./routes/index.js"; import router from "./routes/index.js";
const PORT = 3000; const PORT = 3000;
export const createServer = () => {
const webApp = express();
//webApp.use(logger("./logs"));
webApp.use(express.json());
webApp.use(express.urlencoded({ extended: false }));
webApp.use("/", router);
const webApp = express(); // catch 404
//webApp.use(logger("./logs")); webApp.use((req, res) => {
webApp.use(express.json()); res.status(404).send("Sorry! 404 Error.");
webApp.use(express.urlencoded({ extended: false })); });
webApp.use("/", router);
// catch 404
webApp.use((req, res) => {
res.status(404).send("Sorry! 404 Error.");
});
// error handler, 4个参数 // error handler, 4个参数
webApp.use((err, req, res) => { webApp.use((err, req, res) => {
// set locals, only providing error in development // set locals, only providing error in development
res.locals.message = err.message; res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {}; res.locals.error = req.app.get("env") === "development" ? err : {};
// render the error page // render the error page
res.status(err.status || 500); res.status(err.status || 500);
res.json({ res.json({
message: err.message, message: err.message,
error: err error: err
});
}); });
});
webApp.set("port", PORT); webApp.set("port", PORT);
webApp.listen(PORT, () => console.log(`App listening on port ${PORT}`));
export { webApp as default }; webApp.listen(PORT, () => console.log(`App listening on port ${PORT}`));
};
// 实现自动更新逻辑
const { autoUpdater } = require("electron-updater");
const { join } = require("path");
let mainWin = null;
const checkUpdate = (win, ipcMain) => {
autoUpdater.autoDownload = true; // 自动下载
autoUpdater.autoInstallOnAppQuit = true; // 应用退出后自动安装
// autoUpdater.forceDevUpdateConfig = true;
// autoUpdater.updateConfigPath = join(__dirname, "../dev-update.yml");
mainWin = win;
// 检测是否有更新包并通知
autoUpdater.checkForUpdatesAndNotify().catch();
// 监听渲染进程的 install 事件,触发退出应用并安装
ipcMain.on("install", () => autoUpdater.quitAndInstall());
autoUpdater.on("download-progress", (prog) => {
win.webContents.send("update", {
speed: Math.ceil(prog.bytesPerSecond / 1000), // 网速
percent: Math.ceil(prog.percent) // 百分比
});
});
autoUpdater.on('update-available', (info) => {
// 检查到有新版本
win.webContents.send("update-available", info);
console.log('检查到有新版本',info);
})
autoUpdater.on('error', (err) => {
// 自动升级遇到错误
win.webContents.send("update-error", err);
// 执行原有升级逻辑
})
autoUpdater.on('update-not-available', (info) => {
console.log('检查到无新版本',info);
win.webContents.send("update-not-available", info);
// 检查到无新版本
// 提醒用户当前版本已经是最新版,无需更新
})
autoUpdater.on("update-downloaded", (info) => {
console.log(info, "info");
win.webContents.send("downloaded", info);
// 下载完成后强制用户安装,不推荐
// autoUpdater.quitAndInstall();
});
};
module.exports = checkUpdate;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment