Commit c896ce68 by zhuzhequan

版本更新

parent b1226def
provider: generic
updaterCacheDirName: dev-updater
url: "https://console.jomalls.com/production/"
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
"name": "JomallProductionAssistant", "name": "JomallProductionAssistant",
"productName": "JomallProductionAssistant", "productName": "JomallProductionAssistant",
"description": "", "description": "",
"version": "0.1.0", "version": "1.0.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "serve": "vue-cli-service serve",
"build": "vue-cli-service build", "build": "vue-cli-service build",
"lint": "vue-cli-service lint", "lint": "vue-cli-service lint",
"electron:build": "vue-cli-service electron:build", "electron:build": "vue-cli-service electron:build",
"electron:serve": "nodemon --watch src/backend --exec vue-cli-service electron:serve", "electron:serve": "nodemon --watch src/server --exec vue-cli-service electron:serve",
"postinstall": "electron-builder install-app-deps", "postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps",
"electron:generate-icons": "electron-icon-builder --input=./src/assets/logo.jpg --output=build --flatten" "electron:generate-icons": "electron-icon-builder --input=./src/assets/logo.jpg --output=build --flatten"
...@@ -21,13 +21,18 @@ ...@@ -21,13 +21,18 @@
"axios": "^0.19.2", "axios": "^0.19.2",
"compressing": "^1.10.1", "compressing": "^1.10.1",
"core-js": "^3.6.4", "core-js": "^3.6.4",
"electron": "^6.1.1",
"electron-builder": "^24.13.3",
"electron-icon-builder": "^2.0.1", "electron-icon-builder": "^2.0.1",
"electron-log": "^5.1.7",
"electron-store": "^4.0.0", "electron-store": "^4.0.0",
"electron-updater": "^6.2.1", "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",
"lodash-id": "^0.14.0", "lodash-id": "^0.14.0",
"log4js": "^6.9.1",
"moment": "^2.30.1",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"multiparty": "^4.2.3", "multiparty": "^4.2.3",
"nodemon": "^3.1.4", "nodemon": "^3.1.4",
...@@ -47,7 +52,6 @@ ...@@ -47,7 +52,6 @@
"@vue/cli-service": "^4.2.0", "@vue/cli-service": "^4.2.0",
"@vue/eslint-config-prettier": "^6.0.0", "@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.0.3", "babel-eslint": "^10.0.3",
"electron": "^6.0.0",
"eslint": "^6.7.2", "eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.1", "eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^6.1.2", "eslint-plugin-vue": "^6.1.2",
......
{
"name": "vue-node-lowdb",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"electron:build": "vue-cli-service electron:build",
"electron:serve": "vue-cli-service electron:serve",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps"
},
"main": "background_simple.js",
"dependencies": {
"@vue/composition-api": "^0.3.4",
"axios": "^0.19.2",
"core-js": "^3.6.4",
"element-ui": "^2.13.0",
"express": "^4.17.1",
"lodash-id": "^0.14.0",
"lowdb": "^1.0.0",
"morgan": "^1.10.0",
"normalize.css": "^8.0.1",
"vue": "^2.6.11",
"vue-router": "^3.1.5",
"vuex": "^3.1.2"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.2.0",
"@vue/cli-plugin-eslint": "^4.2.0",
"@vue/cli-plugin-router": "^4.2.0",
"@vue/cli-plugin-vuex": "^4.2.0",
"@vue/cli-service": "^4.2.0",
"@vue/eslint-config-prettier": "^6.0.0",
"babel-eslint": "^10.0.3",
"electron": "^6.0.0",
"eslint": "^6.7.2",
"eslint-plugin-prettier": "^3.1.1",
"eslint-plugin-vue": "^6.1.2",
"node-sass": "^4.13.1",
"prettier": "^1.19.1",
"pug": "^2.0.4",
"pug-html-loader": "^1.1.5",
"pug-plain-loader": "^1.0.0",
"sass-loader": "^8.0.2",
"vue-cli-plugin-electron-builder": "^1.4.6",
"vue-template-compiler": "^2.6.11"
}
}
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
</div> </div>
</template> </template>
<script> <script>
import { ipcRenderer } from "electron";
export default { export default {
data() { data() {
...@@ -13,23 +12,8 @@ export default { ...@@ -13,23 +12,8 @@ export default {
}; };
}, },
mounted() { 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: {}
}; };
......
"use strict"; "use strict";
import { ipcMain } from "electron"; import { ipcMain } from "electron";
import { app, protocol, BrowserWindow, screen } from "electron"; import { app, protocol, BrowserWindow, screen, globalShortcut } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib"; import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
import { createServer } from "@/server/index.js"; import { createServer } from "@/server/index.js";
const checkUpdate = require("./update.js") import { autoUpdater } from "electron-updater";
import * as path from "path";
Object.defineProperty(app, "isPackaged", {
get() {
return true;
}
});
createServer(); createServer();
const isDevelopment = process.env.NODE_ENV !== "production"; const isDevelopment = process.env.NODE_ENV !== "production";
...@@ -16,10 +20,10 @@ protocol.registerSchemesAsPrivileged([ ...@@ -16,10 +20,10 @@ protocol.registerSchemesAsPrivileged([
]); ]);
const winURL = const winURL =
process.env.NODE_ENV === "development" process.env.NODE_ENV === "development"
? "http://localhost:8090" ? "http://localhost:8050"
: `file://${__dirname}/index.html`; : `file://${__dirname}/index.html`;
function createWindow() { async function createWindow() {
win = new BrowserWindow({ win = new BrowserWindow({
width: 1500, width: 1500,
height: 1000, height: 1000,
...@@ -29,9 +33,6 @@ function createWindow() { ...@@ -29,9 +33,6 @@ function createWindow() {
nodeIntegration: true nodeIntegration: true
} }
}); });
win.webContents.on('did-finish-load', () => {
checkUpdate(win, ipcMain)
})
let displays = screen.getAllDisplays(); let displays = screen.getAllDisplays();
...@@ -54,9 +55,9 @@ function createWindow() { ...@@ -54,9 +55,9 @@ function createWindow() {
// preload: path.join(__dirname, "./preloadOther.js") // preload: path.join(__dirname, "./preloadOther.js")
} }
}); });
console.log(winURL + "#" + `/design-detail`);
//指定副屏幕打开的网页 //指定副屏幕打开的网页
otherWindow.loadURL(winURL + "#" + `/design-detail`); await otherWindow.loadURL(winURL + "#" + `/design-detail`);
otherWindow.on("closed", () => { otherWindow.on("closed", () => {
//这一段放外面的话,如果你电脑没双屏会报错。 //这一段放外面的话,如果你电脑没双屏会报错。
otherWindow = null; otherWindow = null;
...@@ -69,35 +70,93 @@ function createWindow() { ...@@ -69,35 +70,93 @@ function createWindow() {
// 把获取的打印机列表发送给渲染进程 // 把获取的打印机列表发送给渲染进程
win.webContents.send("printName", printers); win.webContents.send("printName", printers);
}); });
ipcMain.on("win-subScreen", (data, v) => { ipcMain.on("win-subScreen", (data, v) => {
if (otherWindow) otherWindow.webContents.send("getProductionNoInfo", v); if (otherWindow) otherWindow.webContents.send("getProductionNoInfo", v);
}); });
if (process.env.WEBPACK_DEV_SERVER_URL) { if (process.env.WEBPACK_DEV_SERVER_URL) {
win.loadURL(process.env.WEBPACK_DEV_SERVER_URL); await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) win.webContents.openDevTools(); if (!process.env.IS_TEST) win.webContents.openDevTools();
} else { } else {
createProtocol("app"); createProtocol("app");
win.loadURL("app://./index.html"); await win.loadURL("app://./index.html");
} }
ipcMain.on("send-card", (event, obj) => { ipcMain.on("send-card", (event, obj) => {
win.webContents.send("sendWebsockt", obj); win.webContents.send("sendWebsockt", obj);
}); });
win.on("closed", () => { win.on("closed", () => {
win.removeAllListeners();
win = null; win = null;
otherWindow = null; otherWindow = null;
}); });
// 自动更新逻辑开始
autoUpdater.autoDownload = false
autoUpdater.autoInstallOnAppQuit = false; // 应用退出后自动安装
autoUpdater.on("download-progress", progress => {
// 下载进度监听
if (win.isDestroyed()) return;
win.webContents.send("update", {
speed: Math.ceil(progress.bytesPerSecond / 1000), // 网速
percent: Math.ceil(progress.percent) // 百分比
});
});
autoUpdater.on("error", err => {
// 下载失败监听
if (win.isDestroyed()) return;
win.webContents.send("update-error",err);
});
autoUpdater.on("update-downloaded", info => {
// 下载完成监听
if (win.isDestroyed()) return;
console.log(info, "info");
win.webContents.send("downloaded", info);
});
ipcMain.on("install", () => {
// 退出安装
autoUpdater.quitAndInstall();
});
ipcMain.on("toUpdateApp", (data, item) => {
// 去手动下载更新
if (win.isDestroyed()) return;
autoUpdater.setFeedURL({
provider: "generic",
url: item.url
});
autoUpdater.checkForUpdates().then(res=>{
console.log(res);
autoUpdater.downloadUpdate()
})
});
} }
app.on("activate", () => { app.on("activate", async () => {
if (win === null) { if (win === null) {
createWindow(); await createWindow();
} }
}); });
app.on("ready", async () => { app.on("ready", async () => {
createWindow(); await createWindow();
globalShortcut.register("F5", () => {
return false;
});
globalShortcut.register("CommandOrControl+R", () => {
return false;
});
});
app.on("will-quit", () => {
globalShortcut.unregister("F5");
globalShortcut.unregister("CommandOrControl+R");
}); });
if (isDevelopment) { if (isDevelopment) {
......
...@@ -41,6 +41,7 @@ const router = new VueRouter({ ...@@ -41,6 +41,7 @@ const router = new VueRouter({
routes routes
}); });
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
console.log(to, from);
let user = Vue.prototype.$dataStore.get("user"); let user = Vue.prototype.$dataStore.get("user");
if (to.path.includes("design-detail")) { if (to.path.includes("design-detail")) {
return next(); return next();
...@@ -48,7 +49,6 @@ router.beforeEach((to, from, next) => { ...@@ -48,7 +49,6 @@ router.beforeEach((to, from, next) => {
if (to.name === "login") { if (to.name === "login") {
if (user) { if (user) {
console.log(1);
return next({ path: "/design" }); return next({ path: "/design" });
} else { } else {
return next(); return next();
......
...@@ -4,13 +4,16 @@ import { ...@@ -4,13 +4,16 @@ import {
writeProfileXml writeProfileXml
} from "@/server/utils"; } from "@/server/utils";
var request = require("request");
const compressing = require("compressing"); const compressing = require("compressing");
var uuid = require("uuid"); const uuid = require("uuid");
const path = require("path"); const path = require("path");
const fs = require("fs"); const fs = require("fs");
const os = require("os"); const os = require("os");
import axios from "axios"; import axios from "axios";
var multiparty = require("multiparty");
axios.defaults.timeout = 12600000;
const multiparty = require("multiparty");
export default { export default {
getPodProductionInfo: async (req, res) => { getPodProductionInfo: async (req, res) => {
const token = req.headers["jwt-token"]; const token = req.headers["jwt-token"];
...@@ -25,6 +28,9 @@ export default { ...@@ -25,6 +28,9 @@ export default {
console.log(data); console.log(data);
if (data.code === 200 && data.data && data.data.length > 0) { if (data.code === 200 && data.data && data.data.length > 0) {
let f = data.data.find(el => !el.productionFile); let f = data.data.find(el => !el.productionFile);
if (f) {
return res.json({ code: 500, msg: "存在地址错误的素材图" });
}
data.data.forEach(el => { data.data.forEach(el => {
if (!el.productionFile.includes("http")) { if (!el.productionFile.includes("http")) {
el.productionFile = el.productionFile.replace( el.productionFile = el.productionFile.replace(
...@@ -34,10 +40,6 @@ export default { ...@@ -34,10 +40,6 @@ export default {
el.productionFile = `https://${company}/upload/erp${el.productionFile}`; el.productionFile = `https://${company}/upload/erp${el.productionFile}`;
} }
}); });
if (f) {
return res.json({ code: 500, msg: "存在地址错误的素材图" });
}
downloadImage(data.data) downloadImage(data.data)
.then(data => { .then(data => {
res.json({ code: 200, data }); res.json({ code: 200, data });
...@@ -46,7 +48,7 @@ export default { ...@@ -46,7 +48,7 @@ export default {
res.json({ code: 500, msg: err }); res.json({ code: 500, msg: err });
}); });
} else { } else {
res.json({ code: 200, msg: "未找到素材图", data: [] }); res.json({ code: 500, msg: data.message, data: [] });
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err);
...@@ -234,6 +236,51 @@ export default { ...@@ -234,6 +236,51 @@ export default {
.catch(err => { .catch(err => {
res.send({ code: 500, msg: err }); res.send({ code: 500, msg: err });
}); });
},
checkUpdate: async (req, res) => {
// const company = "http://10.168.31.188:8096";
const company = "https://admin.jomalls.com";
try {
let q = `${company}/api/manage/rest/app/checkUpdate?version=${req.query.version}&businessType=production_assistant`;
let { data } = await axios.get(q);
if (data.data) {
q = `${company}/api/manage/rest/app/getLatest?businessType=production_assistant`;
let r = await axios.get(q);
res.send(r.data);
} else {
res.send(data);
}
} catch (err) {
console.log(err);
res.json({ code: 500, msg: err });
}
},
incrementalUpdates: async (req, res) => {
try {
let from = path.join(process.cwd(), "./resources/app/css.zip");
let dirName = path.join(process.cwd(), "./resources/app/");
let stream = fs.createWriteStream(from);
const company = req.headers["company"];
req.body.url = "https://" + company + req.body.url;
console.log(req.body.url, "下载zip地址");
request(req.body.url)
.pipe(stream)
.on("close", function() {
compressing.zip
.uncompress(from, dirName, { zipFileNameEncoding: "gbk" })
.then(() => {
fs.unlinkSync(from);
res.json({ code: 200, msg: "更新成功" });
}).catch(err => {
res.json({ code: 500, msg: err.message });
});
});
} catch (err) {
res.json({ code: 500, msg: err.message });
}
} }
}; };
import express from "express"; import express from "express";
import router from "./routes/index.js"; import router from "./routes/index.js";
import {logMiddleWare} from './utils/log'
const PORT = 3000; const PORT = 3000;
export const createServer = () => { export const createServer = () => {
const webApp = express(); const webApp = express();
//webApp.use(logger("./logs")); //webApp.use(logger("./logs"));
webApp.use( logMiddleWare());
webApp.use(express.json()); webApp.use(express.json());
webApp.use(express.urlencoded({ extended: false })); webApp.use(express.urlencoded({ extended: false }));
webApp.use("/", router); webApp.use("/", router);
// catch 404 // catch 404
webApp.use((req, res) => { webApp.use((req, res) => {
res.status(404).send("Sorry! 404 Error."); res.status(404).send("Sorry! 404 Error.");
......
...@@ -5,6 +5,7 @@ import fn from "../entity/function.js"; ...@@ -5,6 +5,7 @@ import fn from "../entity/function.js";
let router = express.Router(); let router = express.Router();
// 执行打印命令 // 执行打印命令
router.post("/toPrint", fn.toPrint); router.post("/toPrint", fn.toPrint);
// 登录接口 // 登录接口
...@@ -25,6 +26,10 @@ router.post("/getPodProductionInfo", fn.getPodProductionInfo); ...@@ -25,6 +26,10 @@ router.post("/getPodProductionInfo", fn.getPodProductionInfo);
router.post("/completeDelivery", fn.completeDelivery); router.post("/completeDelivery", fn.completeDelivery);
// 根据生产单号查询详情 // 根据生产单号查询详情
router.post("/findByPodProductionNo", fn.findByPodProductionNo); router.post("/findByPodProductionNo", fn.findByPodProductionNo);
// 查询版本更新
router.get("/checkUpdate", fn.checkUpdate);
// 增量更新
router.post("/incrementalUpdates", fn.incrementalUpdates);
export { router as default }; export { router as default };
const log4js = require("log4js");
const moment = require("moment");
const fs = require("fs");
const path = require("path");
function returnLogFilePath() {
const today = moment(new Date()).format("YYYY-MM-DD");
const low_path = process.cwd();
const dir = path.join(low_path, `/logs/${today}`);
console.log(dir);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
return path.join(dir, "api.log");
}
//日志对象
const logger = (name) => {
const logFilePath = returnLogFilePath();
log4js.configure({
appenders: {
out: { type: "console" }, //在控制台输出日志
cheese: {
type: "file",
filename: logFilePath,
maxLogSize: 1024 * 1000 * 10 //10M
}
},
categories: {
//需要在控制台输出日志时:appenders: ['cheese', 'out']
default: { appenders: ["cheese"], level: log4js.levels.DEBUG }
}
});
return log4js.getLogger(name);
};
//添加日志
const addFormatLog = function(req, res, data) {
const now = new Date();
const resTime = now - req._startTime;
const token = req.headers["jwt-token"]
const company = req.headers["company"]
const {
ip,
headers,
method,
url,
body,
httpVersion,
res: { statusCode, _headers }
} = req;
let logInfo = {
ip,
host: headers.host,
resTime,
method,
url,
token,
company,
body,
httpVersion,
statusCode,
contentLength: _headers["content-length"],
userAgent: headers["user-agent"],
data: data[0]
};
// ${JSON.stringify(logInfo)}
logger("log").info(`
时间:${moment(new Date()).format("YYYY-MM-DD HH:mm:ss")}
ip : ${logInfo.ip}
host : ${logInfo.host}
响应时间 : ${logInfo.resTime / 1000} s
method :${logInfo.method}
url :${logInfo.url}
客户 :${logInfo.company || ''}
token :${logInfo.token || ''}
body :${JSON.stringify(logInfo.body)}
状态码 :${logInfo.statusCode}
data :${JSON.stringify(logInfo.data)}
`
);
};
//日志中间件
export const logMiddleWare = () => {
return function(req, res, next) {
req._startTime = new Date();
const oldSend = res.send;
res.send = function() {
oldSend.apply(res, arguments);
if (typeof [...arguments][0] === "object") {
res.once("finish", () => addFormatLog(req, res, arguments));
}
};
return next();
};
};
// 实现自动更新逻辑 // 实现自动更新逻辑
const { autoUpdater } = require("electron-updater"); const { autoUpdater } = require("electron-updater");
const { join } = require("path");
let mainWin = null; let mainWin = null;
const checkUpdate = (win, ipcMain) => { function downloadProgress(win, progress) {
autoUpdater.autoDownload = true; // 自动下载 if (win.isDestroyed()) {
autoUpdater.autoInstallOnAppQuit = true; // 应用退出后自动安装 return;
// autoUpdater.forceDevUpdateConfig = true; }
// autoUpdater.updateConfigPath = join(__dirname, "../dev-update.yml"); console.log("正在下载中");
mainWin = win;
// 检测是否有更新包并通知
autoUpdater.checkForUpdatesAndNotify().catch();
// 监听渲染进程的 install 事件,触发退出应用并安装
ipcMain.on("install", () => autoUpdater.quitAndInstall());
autoUpdater.on("download-progress", (prog) => {
win.webContents.send("update", { win.webContents.send("update", {
speed: Math.ceil(prog.bytesPerSecond / 1000), // 网速 speed: Math.ceil(progress.bytesPerSecond / 1000), // 网速
percent: Math.ceil(prog.percent) // 百分比 percent: Math.ceil(progress.percent) // 百分比
});
}); });
autoUpdater.on('update-available', (info) => { autoUpdater.removeListener("update-downloaded", progress =>
downloadProgress(win, progress)
);
}
function updateAvailable(win, info) {
if (win.isDestroyed()) {
return;
}
// 检查到有新版本 // 检查到有新版本
win.webContents.send("update-available", info); win.webContents.send("update-available", info);
console.log('检查到有新版本',info); autoUpdater.removeListener("update-available", info => updateAvailable(win, info));
}) }
autoUpdater.on('error', (err) => {
function downloadError(win, err) {
if (win.isDestroyed()) {
return;
}
console.log(111);
// 自动升级遇到错误 // 自动升级遇到错误
console.log("自动升级遇到错误", err);
win.webContents.send("update-error", err); win.webContents.send("update-error", err);
// 执行原有升级逻辑 autoUpdater.removeListener("error", err => downloadError(win, err));
}) }
autoUpdater.on('update-not-available', (info) => { function updateNotAvailable(win, info) {
console.log('检查到无新版本',info); if (win.isDestroyed()) {
return;
}
console.log("检查到无新版本", info);
win.webContents.send("update-not-available", info); win.webContents.send("update-not-available", info);
// 检查到无新版本 autoUpdater.removeListener("error", err => downloadError(win, err));
// 提醒用户当前版本已经是最新版,无需更新 }
})
autoUpdater.on("update-downloaded", (info) => { function updateDownloaded(win, info) {
if (win.isDestroyed()) {
return;
}
console.log(info, "info"); console.log(info, "info");
win.webContents.send("downloaded", info); win.webContents.send("downloaded", info);
// 下载完成后强制用户安装,不推荐 }
// autoUpdater.quitAndInstall(); const checkUpdate = (win, ipcMain, data) => {
if (win.isDestroyed()) {
return;
}
autoUpdater.autoDownload = true; // 自动下载
autoUpdater.autoInstallOnAppQuit = false; // 应用退出后自动安装
// autoUpdater.forceDevUpdateConfig = true;
// autoUpdater.updateConfigPath = url + "latest.yml";
mainWin = win;
autoUpdater.setFeedURL({
provider: "generic",
url: data.url
});
ipcMain.on("install", () => {
autoUpdater.quitAndInstall();
}); });
// 检测是否有更新包并通知
autoUpdater
.checkForUpdatesAndNotify({
title: data.title,
body: data.content
})
.catch();
// 监听渲染进程的 install 事件,触发退出应用并安装
autoUpdater.on("download-progress", progress =>
downloadProgress(win, progress)
);
autoUpdater.on("update-available", info => updateAvailable(win, info));
autoUpdater.on("error", err => downloadError(win, err));
autoUpdater.on("update-not-available", info => updateNotAvailable(win, info));
autoUpdater.on("update-downloaded", info => updateDownloaded(win, info));
}; };
......
import axios from "axios"; import axios from "axios";
import Vue from "vue"; import Vue from "vue";
import { Loading } from "element-ui"; import { Loading } from "element-ui";
import router from "../router/index";
// create an axios instance // create an axios instance
const service = axios.create({ const service = axios.create({
baseURL: "http://localhost:3000", // url = base url + request url baseURL: "http://localhost:3000", // url = base url + request url
......
...@@ -7,7 +7,7 @@ import html2canvas from "html2canvas"; ...@@ -7,7 +7,7 @@ import html2canvas from "html2canvas";
export default { export default {
data() { data() {
return { return {
dialogShow: false, dialogShow: true,
axios, axios,
fieldDescription, fieldDescription,
printerList: [], printerList: [],
...@@ -364,6 +364,10 @@ export default { ...@@ -364,6 +364,10 @@ export default {
<template> <template>
<div class="print-div"> <div class="print-div">
<div :class="dialogShow ? 'open-expand' : 'close-expand'">
<slot></slot>
</div>
<div v-show="dialogShow" class="print-content">
<el-form <el-form
label-width="170px" label-width="170px"
label-position="left" label-position="left"
...@@ -426,8 +430,8 @@ export default { ...@@ -426,8 +430,8 @@ export default {
></el-input> ></el-input>
<div class="save-footer"> <div class="save-footer">
<el-button size="medium" @click="showPopover = false" <el-button size="medium" @click="showPopover = false"
>取消</el-button >取消
> </el-button>
<el-button <el-button
@click="saveSetting" @click="saveSetting"
:disabled="settingName === ''" :disabled="settingName === ''"
...@@ -443,8 +447,8 @@ export default { ...@@ -443,8 +447,8 @@ export default {
:disabled="printSettingVal === 0" :disabled="printSettingVal === 0"
@click="delSetting" @click="delSetting"
type="danger" type="danger"
>删除</el-button >删除
> </el-button>
</div> </div>
</div> </div>
</el-form-item> </el-form-item>
...@@ -485,7 +489,9 @@ export default { ...@@ -485,7 +489,9 @@ export default {
</template> </template>
<div v-if="printSetting.byInk === 2"> <div v-if="printSetting.byInk === 2">
<el-form-item label="利用底材的黑色"> <el-form-item label="利用底材的黑色">
<el-switch v-model="printSetting.bMaterialBlack"></el-switch> <el-switch
v-model="printSetting.bMaterialBlack"
></el-switch>
</el-form-item> </el-form-item>
</div> </div>
</el-tooltip> </el-tooltip>
...@@ -866,8 +872,9 @@ export default { ...@@ -866,8 +872,9 @@ export default {
@click="getPrintCmd" @click="getPrintCmd"
type="primary" type="primary"
style="width: 100%;height: 50px" style="width: 100%;height: 50px"
>打印</el-button >打印
> </el-button>
</div>
</div> </div>
</template> </template>
...@@ -877,15 +884,18 @@ export default { ...@@ -877,15 +884,18 @@ export default {
align-items: center; align-items: center;
display: flex; display: flex;
align-items: center; align-items: center;
span { span {
margin-left: 10px; margin-left: 10px;
} }
.el-slider { .el-slider {
flex: 1; flex: 1;
flex-shrink: 0; flex-shrink: 0;
margin: 0 10px; margin: 0 10px;
} }
} }
.el-form { .el-form {
height: 84%; height: 84%;
display: flex; display: flex;
...@@ -893,6 +903,7 @@ export default { ...@@ -893,6 +903,7 @@ export default {
padding-top: 15px; padding-top: 15px;
border-top: 1px solid #ececec; border-top: 1px solid #ececec;
} }
.detail-setting { .detail-setting {
border-top: 2px solid transparent; border-top: 2px solid transparent;
display: flex; display: flex;
...@@ -902,6 +913,7 @@ export default { ...@@ -902,6 +913,7 @@ export default {
flex-shrink: 0; flex-shrink: 0;
overflow: auto; overflow: auto;
} }
.left-block-item { .left-block-item {
.setting-title { .setting-title {
font-weight: bold; font-weight: bold;
...@@ -914,6 +926,7 @@ export default { ...@@ -914,6 +926,7 @@ export default {
left: -15px; left: -15px;
} }
} }
.setting-right { .setting-right {
box-sizing: border-box; box-sizing: border-box;
padding: 20px; padding: 20px;
...@@ -921,17 +934,20 @@ export default { ...@@ -921,17 +934,20 @@ export default {
height: 100%; height: 100%;
color: #333; color: #333;
} }
.setting-left { .setting-left {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 15px 30px; padding: 15px 30px;
background-color: white; background-color: white;
} }
.fixed-top { .fixed-top {
position: absolute; position: absolute;
word-break: break-all; word-break: break-all;
max-width: 44%; max-width: 44%;
} }
.bottom-info { .bottom-info {
padding: 15px 0; padding: 15px 0;
margin-top: 20px; margin-top: 20px;
...@@ -939,38 +955,97 @@ export default { ...@@ -939,38 +955,97 @@ export default {
justify-content: space-between; justify-content: space-between;
border-top: 1px solid #ececec; border-top: 1px solid #ececec;
} }
.info { .info {
width: 62%; width: 62%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
.info-item { .info-item {
span { span {
margin-right: 5px; margin-right: 5px;
} }
} }
.save-setting { .save-setting {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
} }
.save-footer { .save-footer {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
margin-top: 15px; margin-top: 15px;
} }
.print-div { .print-div {
background: #ececec;
border-left: 1px solid gray;
padding: 10px;
position: fixed; position: fixed;
box-sizing: border-box; box-sizing: border-box;
right: 0; right: 0;
z-index: 4; z-index: 4;
bottom: 0; bottom: 0;
height: calc(100% - 51px); height: calc(100% - 51px);
.print-content {
background: #ececec;
border-left: 1px solid gray;
height: 100%;
padding: 10px;
display: flex;
width: 430px; width: 430px;
flex-direction: column;
}
}
.close-expand {
position: fixed;
right: 0;
cursor: pointer;
top: 50%;
width: 20px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
height: 40px;
display: flex;
align-items: center;
background-color: blueviolet;
color: white;
justify-content: center;
i{
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
} }
.open-expand {
position: absolute;
left: -20px;
cursor: pointer;
top: 50%;
width: 20px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
height: 40px;
display: flex;
align-items: center;
background-color: blueviolet;
color: white;
justify-content: center;
i{
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
}
</style> </style>
<style> <style>
.my-popper { .my-popper {
......
<script> <script>
import PHead from './head/index.vue' import PHead from "./head/index.vue";
import PMain from './main/index.vue' import PMain from "./main/index.vue";
import update from "./update";
import UpdateDialog from "@/views/design/updateDialog.vue";
export default { export default {
components: {PHead, PMain}, components: { PHead, PMain, UpdateDialog },
data() { data() {
return { return {
user: {}, user: {},
company:{} company: {}
} };
}, },
mounted() { mounted() {
this.user = this.$dataStore.get('user') this.user = this.$dataStore.get("user");
this.company = this.$dataStore.get('company') this.company = this.$dataStore.get("company");
console.log(this.$dataStore) const Update = new update();
Update.checkUpdate().then(data => {
if (data) {
// 有新版本更新
this.$refs.updateDialog.open(data);
} }
} });
}
};
</script> </script>
<template> <template>
<div class="page"> <div class="page">
<p-head :company="company" :user="user" /> <p-head :company="company" :user="user" />
<p-main/> <p-main />
<update-dialog ref="updateDialog" />
</div> </div>
</template> </template>
......
import pkg from "../../../package.json";
import axios from "../../utils/axios";
export default class Update {
version;
constructor() {
this.version = pkg.version;
}
async checkUpdate() {
return new Promise((resolve, reject) => {
try {
axios
.get(`/checkUpdate?version=${this.version}`)
.then(res => {
resolve(res.data);
})
.catch(err => {
reject(err);
});
} catch (err) {
reject(err);
}
});
}
}
<script>
import { ipcRenderer } from "electron";
export default {
data() {
return {
visible: false,
downloaded: false,
percent: 0,
loading: false,
speed: 0,
item: {}
};
},
created() {
let that = this;
ipcRenderer.on("update", (event, data) => {
console.log("下載進度", data);
if (!that.loading) that.loading = true;
that.percent = data.percent;
that.speed = data.speed;
});
ipcRenderer.on("update-error", (event, data) => {
console.log(data);
that.$message.error(`安装包下载失败`);
that.loading = false;
});
ipcRenderer.on("downloaded", () => {
that.loading = false;
that.download();
});
},
methods: {
download() {
this.$confirm("新版本已下载,是否立即安装?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
showCancelButton: this.item.forcedUpdate === 0,
showClose: this.item.forcedUpdate === 0,
type: "success"
})
.then(() => {
ipcRenderer.send("install");
this.visible = false;
})
.catch(() => {});
},
incrementalUpdates() {
this.$confirm("新版本已下载,是否刷新页面", "提示", {
confirmButtonText: "确定",
showCancelButton: this.item.forcedUpdate === 0,
showClose: this.item.forcedUpdate === 0,
cancelButtonText: "取消",
type: "success"
})
.then(() => {
window.location.reload();
})
.catch(() => {});
},
async toUpdate(type) {
if (type === 1) {
this.visible = false;
if (this.loading) return;
} else {
this.loading = true;
}
if (!this.item.fileList || this.item.fileList.length === 0) {
return this.$message.warning("缺少更新文件");
}
console.log("开始下载");
if (this.item.fullUpdate) {
// 全量更新
const domain = "https://" + this.$dataStore.get("company").domain;
this.item.url =
domain + this.item.fileList[0].versionPath.replace("/data", "");
console.log(this.item.url);
ipcRenderer.send("toUpdateApp", this.item);
} else {
try {
this.loading = false;
await this.$api.post("/incrementalUpdates", {
url: this.item.fileList[0].fileUrl.replace("/data", "")
});
this.incrementalUpdates();
} catch (e) {
// this.$message.warning("更新失败");
}
}
},
open(data) {
this.item = data;
this.visible = true;
}
}
};
</script>
<template>
<el-dialog
:show-close="item.forcedUpdate === 0"
destroy-on-close
:close-on-press-escape="false"
:close-on-click-modal="false"
width="500px"
:title="item.title"
:visible.sync="visible"
>
<pre>{{ item.content }}</pre>
<!-- <el-progress :text-inside="true" :stroke-width="26" :percentage="percent"></el-progress>-->
<template slot="footer">
<el-button
@click="visible = false"
v-if="item.forcedUpdate === 0"
size="small"
>关闭
</el-button>
<!-- <el-button @click="toUpdate(1)" size="small" type="warning"-->
<!-- >后台更新-->
<!-- </el-button-->
<!-- >-->
<el-button
@click="toUpdate(2)"
size="small"
type="primary"
:loading="loading"
>
{{ loading ? `正在下载中(${percent}%)` : "确定更新" }}
</el-button>
</template>
</el-dialog>
</template>
<style scoped lang="less"></style>
...@@ -4,7 +4,7 @@ export default { ...@@ -4,7 +4,7 @@ export default {
data() { data() {
return { return {
rules: { rules: {
company: [{ validator: this.validatePass, required: true, trigger: "blur" }], company: [{ message: "请选择客户名称", required: true, trigger: "change" }],
loginName: [{ message: "请输入用户名", required: true, trigger: "blur" }], loginName: [{ message: "请输入用户名", required: true, trigger: "blur" }],
password: [{ message: "请输入密码", required: true, trigger: "blur" }] password: [{ message: "请输入密码", required: true, trigger: "blur" }]
}, },
...@@ -59,7 +59,7 @@ export default { ...@@ -59,7 +59,7 @@ export default {
...this.form ...this.form
}, { }, {
headers: { headers: {
"company": this.form.company + ".jomalls.com" "company": this.form.company
} }
}).then((res) => { }).then((res) => {
if (res.code === 200) { if (res.code === 200) {
...@@ -93,9 +93,7 @@ export default { ...@@ -93,9 +93,7 @@ export default {
this.$refs.formRef.validate(async valid => { this.$refs.formRef.validate(async valid => {
if (valid) { if (valid) {
let f = JSON.parse(JSON.stringify(this.form)); let f = JSON.parse(JSON.stringify(this.form));
if (f.company.split(".").length === 1) {
f.company = f.company + ".jomalls.com";
}
if (!f.deviceId) { if (!f.deviceId) {
f.deviceId = this.$dataStore.get("deviceId" + this.form.loginName); f.deviceId = this.$dataStore.get("deviceId" + this.form.loginName);
} }
...@@ -142,7 +140,7 @@ export default { ...@@ -142,7 +140,7 @@ export default {
return; return;
} }
console.log(this.userList, v); console.log(this.userList, v);
this.form.company = this.userList[v].company.split(".")[0]; this.form.company = this.userList[v].company;
this.form.loginName = this.userList[v].loginName; this.form.loginName = this.userList[v].loginName;
this.form.password = this.userList[v].password; this.form.password = this.userList[v].password;
this.form.deviceId = this.userList[v].deviceId; this.form.deviceId = this.userList[v].deviceId;
...@@ -170,15 +168,20 @@ export default { ...@@ -170,15 +168,20 @@ export default {
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="!company" prop="company"> <el-form-item v-if="!company" prop="company">
<el-input placeholder="客户(例如demo)" prefix-icon="el-icon-monitor" v-model="form.company" <!-- <el-select prefix-icon="el-icon-monitor" v-model="form.company">-->
clearable></el-input> <!-- <el-option v-for="(it,i) in companyList" :key="i" :label="it.companyName" :value="it.domain.replace('.jomalls.com','')"></el-option>-->
<!-- <el-select filterable style="width: 100%;" placeholder="系统" v-model="form.company"-->
<!-- clearable>-->
<!-- <template slot="prefix">-->
<!-- <i class="el-icon-monitor"></i>-->
<!-- </template>-->
<!-- <el-option v-for="(it,i) in companyList" :key="i" :label="it.companyName" :value="it.domain"></el-option>-->
<!-- </el-select>--> <!-- </el-select>-->
<!--&lt;!&ndash; <el-input placeholder="客户(例如demo)" prefix-icon="el-icon-monitor" v-model="form.company"&ndash;&gt;-->
<!--&lt;!&ndash; clearable>&ndash;&gt;-->
<!--&lt;!&ndash; </el-input>&ndash;&gt;-->
<el-select filterable style="width: 100%;" placeholder="系统" v-model="form.company"
clearable>
<template slot="prefix">
<i class="el-icon-monitor"></i>
</template>
<el-option v-for="(it,i) in companyList" :key="i" :label="it.companyName" :value="it.domain"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item prop="loginName"> <el-form-item prop="loginName">
...@@ -188,10 +191,10 @@ export default { ...@@ -188,10 +191,10 @@ export default {
<el-input placeholder="密码" show-password prefix-icon="el-icon-lock" type="password" v-model="form.password" <el-input placeholder="密码" show-password prefix-icon="el-icon-lock" type="password" v-model="form.password"
clearable></el-input> clearable></el-input>
</el-form-item> </el-form-item>
<!-- <el-form-item v-if="len===0" prop="授权信息">--> <!-- <el-form-item v-if="len===0" prop="授权信息">-->
<!-- <el-input placeholder="授权信息" prefix-icon="el-icon-lock" v-model="form.auth"--> <!-- <el-input placeholder="授权信息" prefix-icon="el-icon-lock" v-model="form.auth"-->
<!-- clearable></el-input>--> <!-- clearable></el-input>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
<div class="check"> <div class="check">
<el-checkbox v-model="remember">记住账号</el-checkbox> <el-checkbox v-model="remember">记住账号</el-checkbox>
</div> </div>
......
...@@ -6,6 +6,7 @@ module.exports = { ...@@ -6,6 +6,7 @@ module.exports = {
outputDir: process.env.NODE_ENV === "production" ? "dist" : "devdist", outputDir: process.env.NODE_ENV === "production" ? "dist" : "devdist",
// eslint-loader 是否在保存的时候检查 // eslint-loader 是否在保存的时候检查
lintOnSave: false, lintOnSave: false,
/** vue3.0内置了webpack所有东西, /** vue3.0内置了webpack所有东西,
* webpack配置,see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md * webpack配置,see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
**/ **/
...@@ -67,7 +68,7 @@ module.exports = { ...@@ -67,7 +68,7 @@ module.exports = {
devServer: { devServer: {
open: false, // 编译完成是否打开网页 open: false, // 编译完成是否打开网页
host: "0.0.0.0", // 指定使用地址,默认localhost,0.0.0.0代表可以被外界访问 host: "0.0.0.0", // 指定使用地址,默认localhost,0.0.0.0代表可以被外界访问
port: 8090, // 访问端口 port: 8050, // 访问端口
https: false, // 编译失败时刷新页面 https: false, // 编译失败时刷新页面
hot: true, // 开启热加载 hot: true, // 开启热加载
hotOnly: false, hotOnly: false,
...@@ -94,12 +95,17 @@ module.exports = { ...@@ -94,12 +95,17 @@ module.exports = {
* 第三方插件配置 * 第三方插件配置
*/ */
pluginOptions: { pluginOptions: {
electronBuilder:{ electronBuilder: {
builderOptions: { builderOptions: {
"extraResources": [ asar: false,
extraResources: [
{
from: "./print/",
to: "../print"
},
{ {
"from": "./print/", from: "./logs/",
"to": "../print" to: "../logs"
} }
] ]
} }
......
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