Commit 495695bd by zhuzhequan

转为工厂端

parent a7b73f94
{
"apiApiHost":"https://factory.jomalls.com/api",
"fileApiUrl":"https://factory.jomalls.com/upload/factory",
"visionUrl":"https://console.jomalls.com"
}
"use strict"; "use strict";
import { ipcMain } from "electron"; import { ipcMain } from "electron";
import { app, protocol, BrowserWindow, screen, globalShortcut } 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";
import { autoUpdater } from "electron-updater"; import { autoUpdater } from "electron-updater";
Object.defineProperty(app, "isPackaged", { Object.defineProperty(app, "isPackaged", {
get() { get() {
return true; return true;
} }
}); });
createServer(); createServer();
const isDevelopment = process.env.NODE_ENV !== "production"; const isDevelopment = process.env.NODE_ENV !== "production";
let win; let win;
let newWindow; let newWindow;
protocol.registerSchemesAsPrivileged([ protocol.registerSchemesAsPrivileged([
{ scheme: "app", privileges: { secure: true, standard: true } } { scheme: "app", privileges: { secure: true, standard: true } }
]); ]);
const winURL = const winURL =
process.env.NODE_ENV === "development" process.env.NODE_ENV === "development"
? "http://localhost:8050" ? "http://localhost:8050"
: `file://${__dirname}/index.html`; : `file://${__dirname}/index.html`;
async function createWindow() { async function createWindow() {
win = new BrowserWindow({ win = new BrowserWindow({
width: 1500, width: 1500,
height: 1000, height: 1000,
icon: "./src/assets/logo.jpg", icon: "./src/assets/logo.jpg",
webPreferences: { webPreferences: {
webSecurity: false, webSecurity: false,
nodeIntegration: true nodeIntegration: true
} }
}); });
let newWindow = new BrowserWindow({ let newWindow = new BrowserWindow({
fullscreen: false, fullscreen: false,
width: 1000, width: 1000,
height: 1000, height: 1000,
webPreferences: { webPreferences: {
nodeIntegration: true nodeIntegration: true
//配置预加载脚本文件(preload),此处起名为preloadOther //配置预加载脚本文件(preload),此处起名为preloadOther
//p.s.路径为绝对路径 //p.s.路径为绝对路径
// preload: path.join(__dirname, "./preloadOther.js") // preload: path.join(__dirname, "./preloadOther.js")
} }
}); });
console.log(winURL + "#" + `/design-detail`); console.log(winURL + "#" + `/design-detail`);
//指定副屏幕打开的网页 //指定副屏幕打开的网页
await newWindow.loadURL(winURL + "#" + `/design-detail`); await newWindow.loadURL(winURL + "#" + `/design-detail`);
win.on("closed", () => { win.on("closed", () => {
//这一段放外面的话,如果你电脑没双屏会报错。 //这一段放外面的话,如果你电脑没双屏会报错。
win = null; win = null;
}); });
ipcMain.on("allPrint", () => { ipcMain.on("allPrint", () => {
// 获取到打印机列表 // 获取到打印机列表
const printers = win.webContents.getPrinters(); const printers = win.webContents.getPrinters();
// 把获取的打印机列表发送给渲染进程 // 把获取的打印机列表发送给渲染进程
win.webContents.send("printName", printers); win.webContents.send("printName", printers);
}); });
ipcMain.on("win-subScreen", (data, v) => { ipcMain.on("win-subScreen", (data, v) => {
if (newWindow) newWindow.webContents.send("getProductionNoInfo", v); if (newWindow) newWindow.webContents.send("getProductionNoInfo", v);
}); });
if (process.env.WEBPACK_DEV_SERVER_URL) { if (process.env.WEBPACK_DEV_SERVER_URL) {
await 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");
await 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 && win.removeAllListeners();
win = null; win = null;
newWindow = null; newWindow && newWindow.close()
}); newWindow = null;
});
// 自动更新逻辑开始
autoUpdater.autoDownload = false // 自动更新逻辑开始
autoUpdater.autoInstallOnAppQuit = false; // 应用退出后自动安装 autoUpdater.autoDownload = false
autoUpdater.on("download-progress", progress => { autoUpdater.autoInstallOnAppQuit = false; // 应用退出后自动安装
// 下载进度监听 autoUpdater.on("download-progress", progress => {
if (win.isDestroyed()) return; // 下载进度监听
win.webContents.send("update", { if (win.isDestroyed()) return;
speed: Math.ceil(progress.bytesPerSecond / 1000), // 网速 win.webContents.send("update", {
percent: Math.ceil(progress.percent) // 百分比 speed: Math.ceil(progress.bytesPerSecond / 1000), // 网速
}); percent: Math.ceil(progress.percent) // 百分比
}); });
});
autoUpdater.on("error", err => {
// 下载失败监听 autoUpdater.on("error", err => {
if (win.isDestroyed()) return; // 下载失败监听
win.webContents.send("update-error",err); if (win.isDestroyed()) return;
}); win.webContents.send("update-error",err);
});
autoUpdater.on("update-downloaded", info => {
// 下载完成监听 autoUpdater.on("update-downloaded", info => {
if (win.isDestroyed()) return; // 下载完成监听
console.log(info, "info"); if (win.isDestroyed()) return;
win.webContents.send("downloaded", info); console.log(info, "info");
}); win.webContents.send("downloaded", info);
});
ipcMain.on("install", () => {
// 退出安装 ipcMain.on("install", () => {
autoUpdater.quitAndInstall(); // 退出安装
}); autoUpdater.quitAndInstall();
});
ipcMain.on("toUpdateApp", (data, item) => {
// 去手动下载更新 ipcMain.on("toUpdateApp", (data, item) => {
if (win.isDestroyed()) return; // 去手动下载更新
autoUpdater.setFeedURL({ if (win.isDestroyed()) return;
provider: "generic", autoUpdater.setFeedURL({
url: item.url provider: "generic",
}); url: item.url
autoUpdater.checkForUpdates().then(res=>{ });
console.log(res); autoUpdater.checkForUpdates().then(res=>{
autoUpdater.downloadUpdate() console.log(res);
}) autoUpdater.downloadUpdate()
})
});
} });
}
app.on("activate", async () => {
if (win === null) { app.on("activate", async () => {
await createWindow(); if (win === null) {
} await createWindow();
}); }
});
app.on("ready", async () => {
await createWindow(); app.on("ready", async () => {
globalShortcut.register("F5", () => { await createWindow();
return false; globalShortcut.register("F5", () => {
}); return false;
globalShortcut.register("CommandOrControl+R", () => { });
return false; globalShortcut.register("CommandOrControl+R", () => {
}); return false;
}); });
});
app.on("will-quit", () => {
globalShortcut.unregister("F5"); app.on("will-quit", () => {
globalShortcut.unregister("CommandOrControl+R"); globalShortcut.unregister("F5");
}); globalShortcut.unregister("CommandOrControl+R");
});
if (isDevelopment) {
if (process.platform === "win32") { if (isDevelopment) {
process.on("message", data => { if (process.platform === "win32") {
if (data === "graceful-exit") { process.on("message", data => {
app.quit(); if (data === "graceful-exit") {
} app.quit();
}); }
} else { });
process.on("SIGTERM", () => { } else {
app.quit(); process.on("SIGTERM", () => {
}); app.quit();
} });
} }
}
import { downloadImage, toSend, writeProfileXml } from "@/server/utils"; import { downloadImage, toSend, writeProfileXml } from "@/server/utils";
import axios from "axios";
import { returnLogFilePath } from "../utils/log";
var request = require("request"); var request = require("request");
const compressing = require("compressing"); const compressing = require("compressing");
const 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"; const { app } = require("electron");
import { returnLogFilePath } from "../utils/log"; let fileEnv, env, visionUrl;
axios.defaults.timeout = 12600000; axios.defaults.timeout = 12600000;
const multiparty = require("multiparty"); const multiparty = require("multiparty");
function readEnv() {
let exePath,configPath
if(process.env.NODE_ENV === "development") {
configPath = path.join(__dirname, "../config/env.json");
}else{
exePath = path.dirname(app.getPath("exe")).replace(/\\/g, "/");
configPath = `${exePath}/config/env.json`;
}
console.log(configPath,__dirname);
fs.readFile(configPath, "utf-8", (err, data) => {
if (err) {
console.error("读取配置文件失败:", err);
return;
}
const config = JSON.parse(data);
fileEnv = config.fileApiUrl;
env = config.apiApiHost;
visionUrl = config.visionUrl;
});
}
readEnv()
export default { export default {
writePrintLog: async (req, res) => { writePrintLog: async (req, res) => {
try { try {
...@@ -33,32 +56,24 @@ export default { ...@@ -33,32 +56,24 @@ export default {
res.json({ code: 500, msg: e }); res.json({ code: 500, msg: e });
} }
}, },
getPodProductionInfo: async (req, res) => { downloadBySubOrderNumber: async (req, res) => {
const token = req.headers["jwt-token"]; const token = req.headers["jwt-token"];
const company = req.headers["company"];
const productionNo = req.body.productionNo;
try { try {
let { data } = await axios.post( let {
`https://${company}/api/podDesignCenter/getPodImageByProduction`, data
{ productionNo }, } = await axios.get(
{ headers: { "jwt-token": token } } `${env}/factory/podJomallOrder/downloadBySubOrderNumber`,
{ params: req.body, headers: { "jwt-token": token } }
); );
console.log(data); console.log(data);
if (data.code === 200 && data.data && data.data.length > 0) { let files = [];
let f = data.data.find(el => !el.productionFile); if (data.code === 200 && data.message) {
if (f) { files = [data.message];
return res.json({ code: 500, msg: "存在地址错误的素材图" }); files = files.map(el => {
} return { url: `${fileEnv}${el}` };
data.data.forEach(el => {
if (!el.productionFile.includes("http")) {
el.productionFile = el.productionFile.replace(
"/data/upload/erp/",
""
);
el.productionFile = `https://${company}/upload/erp${el.productionFile}`;
}
}); });
downloadImage(data.data) console.log(files);
downloadImage(files)
.then(data => { .then(data => {
res.json({ code: 200, data }); res.json({ code: 200, data });
}) })
...@@ -75,11 +90,10 @@ export default { ...@@ -75,11 +90,10 @@ export default {
}, },
findByPodProductionNo: async (req, res) => { findByPodProductionNo: async (req, res) => {
const token = req.headers["jwt-token"]; const token = req.headers["jwt-token"];
const company = req.headers["company"];
const q = req.body; const q = req.body;
try { try {
let { data } = await axios.get( let { data } = await axios.get(
`https://${company}/api/pod/podProductionInfo/findByPodProductionNo`, `${env}/factory/podJomallOrderProduct/getSubOrderBySubOrderNumber`,
{ {
params: q, params: q,
headers: { "jwt-token": token } headers: { "jwt-token": token }
...@@ -101,34 +115,20 @@ export default { ...@@ -101,34 +115,20 @@ export default {
res.json({ code: 500, msg: err }); res.json({ code: 500, msg: err });
} }
}, },
commitApply: async (req, res) => { commitApply: async (req, res) => {},
const company = req.headers["company"];
const q = req.body;
try {
let { data } = await axios.post(
`https://${company}/api/sysDeviceInfo/commitApply`,
q
);
res.send(data);
} catch (err) {
console.log(err);
res.json({ code: 500, msg: err });
}
},
completeDelivery: async (req, res) => { completeDelivery: async (req, res) => {
const token = req.headers["jwt-token"]; const token = req.headers["jwt-token"];
const company = req.headers["company"];
const q = req.body;
try { try {
let { data } = await axios.post( let {
`https://${company}/api/pod/podProductionInfo/completeDelivery`, data
q, } = await axios.post(
{ `${env}/factory/podJomallOrderProduct/completeDelivery`,
headers: { "jwt-token": token } req.body,
} { headers: { "jwt-token": token } }
); );
res.json(data); res.send(data);
} catch (err) { } catch (err) {
console.log(err);
res.json({ code: 500, msg: err }); res.json({ code: 500, msg: err });
} }
}, },
...@@ -232,14 +232,9 @@ export default { ...@@ -232,14 +232,9 @@ export default {
} }
}, },
login: async (req, res) => { login: async (req, res) => {
const { loginName, company, password, deviceId } = req.body;
try { try {
let { data } = await axios.post(`https://${company}/api/sysLogin/login`, { console.log(`${env}/factory/login`);
loginName, let { data } = await axios.post(`${env}/factory/login`, req.body);
password,
deviceId
});
res.send(data); res.send(data);
} catch (err) { } catch (err) {
console.log(err); console.log(err);
...@@ -282,8 +277,7 @@ export default { ...@@ -282,8 +277,7 @@ export default {
let from = path.join(process.cwd(), "./resources/app/css.zip"); let from = path.join(process.cwd(), "./resources/app/css.zip");
let dirName = path.join(process.cwd(), "./resources/app/"); let dirName = path.join(process.cwd(), "./resources/app/");
let stream = fs.createWriteStream(from); let stream = fs.createWriteStream(from);
const company = req.headers["company"]; req.body.url = visionUrl + req.body.url;
req.body.url = "https://" + company + req.body.url;
console.log(req.body.url, "下载zip地址"); console.log(req.body.url, "下载zip地址");
request(req.body.url) request(req.body.url)
.pipe(stream) .pipe(stream)
......
import express from "express"; import express from "express";
import fn from "../entity/function.js"; import fn from "../entity/function.js";
let router = express.Router(); let router = express.Router();
// 执行打印命令 // 执行打印命令
router.post("/toPrint", fn.toPrint); router.post("/toPrint", fn.toPrint);
// 打印日志添加 // 打印日志添加
router.post("/writePrintLog", fn.writePrintLog); router.post("/writePrintLog", fn.writePrintLog);
// 登录接口 // 登录接口
router.post("/login", fn.login); router.post("/login", fn.login);
// 获取本地文件返回 // 获取本地文件返回
router.post("/getPngImg", fn.getPngImg); router.post("/getPngImg", fn.getPngImg);
// 上传文件到本地 // 上传文件到本地
router.post("/uploadImage", fn.uploadImage); router.post("/uploadImage", fn.uploadImage);
// 获取公司列表 // 获取公司列表
router.get("/getCompanyList", fn.getCompanyList); router.get("/getCompanyList", fn.getCompanyList);
// 提交授权申请 // 提交授权申请
router.post("/commitApply", fn.commitApply); router.post("/commitApply", fn.commitApply);
// 下载素材到本地 // 下载素材到本地
router.post("/downloadByDesignId", fn.downloadByDesignId); router.post("/downloadByDesignId", fn.downloadByDesignId);
// 获取 生产单号返回素材地址 // 获取 生产单号返回素材地址
router.post("/getPodProductionInfo", fn.getPodProductionInfo); router.post("/downloadBySubOrderNumber", fn.downloadBySubOrderNumber);
// 提交生产完成 // 提交生产完成
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.get("/checkUpdate", fn.checkUpdate);
// 增量更新 // 增量更新
router.post("/incrementalUpdates", fn.incrementalUpdates); router.post("/incrementalUpdates", fn.incrementalUpdates);
export { router as default }; export { router as default };
const log4js = require("log4js"); const log4js = require("log4js");
const moment = require("moment"); const moment = require("moment");
const fs = require("fs"); const fs = require("fs");
const path = require("path"); const path = require("path");
export function returnLogFilePath() { export function returnLogFilePath() {
const today = moment(new Date()).format("YYYY-MM-DD"); const today = moment(new Date()).format("YYYY-MM-DD");
const low_path = process.cwd(); const low_path = process.cwd();
let log_dir = path.join(low_path, "logs") let log_dir = path.join(low_path, "logs")
if (!fs.existsSync(log_dir)) { if (!fs.existsSync(log_dir)) {
fs.mkdirSync(log_dir) // 创建日志文件夹 fs.mkdirSync(log_dir) // 创建日志文件夹
} }
const dir = path.join(low_path, `/logs/${today}`); const dir = path.join(low_path, `/logs/${today}`);
if (!fs.existsSync(dir)) { if (!fs.existsSync(dir)) {
fs.mkdirSync(dir); fs.mkdirSync(dir);
} }
return path.join(dir, "api.log"); return path.join(dir, "api.log");
} }
//日志对象 //日志对象
const logger = (name) => { const logger = (name) => {
const logFilePath = returnLogFilePath(); const logFilePath = returnLogFilePath();
log4js.configure({ log4js.configure({
appenders: { appenders: {
out: { type: "console" }, //在控制台输出日志 out: { type: "console" }, //在控制台输出日志
cheese: { cheese: {
type: "file", type: "file",
filename: logFilePath, filename: logFilePath,
maxLogSize: 1024 * 1000 * 10 //10M maxLogSize: 1024 * 1000 * 10 //10M
} }
}, },
categories: { categories: {
//需要在控制台输出日志时:appenders: ['cheese', 'out'] //需要在控制台输出日志时:appenders: ['cheese', 'out']
default: { appenders: ["cheese"], level: log4js.levels.DEBUG } default: { appenders: ["cheese"], level: log4js.levels.DEBUG }
} }
}); });
return log4js.getLogger(name); return log4js.getLogger(name);
}; };
//添加日志 //添加日志
const addFormatLog = function(req, res, data) { const addFormatLog = function(req, res, data) {
const now = new Date(); const now = new Date();
const resTime = now - req._startTime; const resTime = now - req._startTime;
const token = req.headers["jwt-token"]; const token = req.headers["jwt-token"];
const company = req.headers["company"]; const {
const { ip,
ip, headers,
headers, method,
method, url,
url, body,
body, httpVersion,
httpVersion, res: { statusCode, _headers }
res: { statusCode, _headers } } = req;
} = req; let logInfo = {
let logInfo = { ip,
ip, host: headers.host,
host: headers.host, resTime,
resTime, method,
method, url,
url, token,
token, body,
company, httpVersion,
body, statusCode,
httpVersion, contentLength: _headers["content-length"],
statusCode, userAgent: headers["user-agent"],
contentLength: _headers["content-length"], data: data[0]
userAgent: headers["user-agent"], };
data: data[0] // ${JSON.stringify(logInfo)}
}; logger("log").info(`
// ${JSON.stringify(logInfo)} 时间:${moment(new Date()).format("YYYY-MM-DD HH:mm:ss")}
logger("log").info(` ip : ${logInfo.ip}
host : ${logInfo.host}
响应时间 : ${logInfo.resTime / 1000} s
时间:${moment(new Date()).format("YYYY-MM-DD HH:mm:ss")} method :${logInfo.method}
ip : ${logInfo.ip} url :${logInfo.url}
host : ${logInfo.host} token :${logInfo.token || ""}
响应时间 : ${logInfo.resTime / 1000} s body :${JSON.stringify(logInfo.body)}
method :${logInfo.method} 状态码 :${logInfo.statusCode}
url :${logInfo.url} data :${JSON.stringify(logInfo.data)}
客户 :${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);
export const logMiddleWare = () => { if (typeof [...arguments][0] === "object") {
return function(req, res, next) { res.once("finish", () => addFormatLog(req, res, arguments));
req._startTime = new Date(); }
};
const oldSend = res.send;
res.send = function() { return next();
oldSend.apply(res, arguments); };
if (typeof [...arguments][0] === "object") { };
res.once("finish", () => addFormatLog(req, res, arguments));
}
};
return next();
};
};
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";
// 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
// withCredentials: true, // send cookies when cross-domain requests // withCredentials: true, // send cookies when cross-domain requests
timeout: 50000000 // request timeout timeout: 50000000 // request timeout
}); });
let loading; let loading;
function startLoading() { function startLoading() {
loading = Loading.service({ loading = Loading.service({
lock: true, lock: true,
text: "拼命加载中...", text: "拼命加载中...",
spinner: "el-icon-loading", spinner: "el-icon-loading",
background: "rgba(0,0,0,.7)" background: "rgba(0,0,0,.7)"
}); });
} }
function endLoading() { function endLoading() {
loading.close(); loading.close();
} }
// Add a request interceptor // Add a request interceptor
service.interceptors.request.use( service.interceptors.request.use(
config => { config => {
console.log(Vue.prototype.$dataStore); console.log(Vue.prototype.$dataStore);
const user = Vue.prototype.$dataStore.get("user"); const user = Vue.prototype.$dataStore.get("user");
const company = Vue.prototype.$dataStore.get("company"); if (user) {
if (user) { config.headers["jwt-token"] = user.token;
config.headers["jwt-token"] = user.token; }
config.headers["company"] = company.domain; startLoading();
} return config;
startLoading(); },
return config; error => {
}, endLoading();
error => { // do something with request error
endLoading(); return Promise.reject(error);
// do something with request error }
return Promise.reject(error); );
}
); // Add a response interceptor
service.interceptors.response.use(
// Add a response interceptor /**
service.interceptors.response.use( * If you want to get http information such as headers or status
/** * Please return response => response
* If you want to get http information such as headers or status */
* Please return response => response
*/ /**
* Determine the request status by custom code
/** * Here is just an example
* Determine the request status by custom code * You can also judge the status by HTTP Status Code
* Here is just an example */
* You can also judge the status by HTTP Status Code async response => {
*/ // do something with response data
async response => { const res = response.data;
// do something with response data endLoading();
const res = response.data; if (res.code) {
endLoading(); if (res.code !== 200) {
if (res.code) { if (res.code === 411) {
if (res.code !== 200) { return Promise.resolve(res);
if (res.code === 411) { }
return Promise.resolve(res); if (res.code === 403) {
} Vue.prototype.$dataStore.delete("user");
if (res.code === 403) { Vue.prototype.$message.error({
Vue.prototype.$dataStore.delete("user"); showClose: true,
Vue.prototype.$message.error({ message: res.msg || res.message || "Error"
showClose: true, });
message: res.msg || res.message || "Error" setTimeout(() => {
}); location.reload();
setTimeout(() => { }, 500);
location.reload();
}, 500); return Promise.reject(new Error(res.msg || res.message || "Error"));
}
return Promise.reject(new Error(res.msg || res.message || "Error"));
} // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired; // TODO: to re-login
if (res.code === 50008 || res.code === 50012 || res.code === 50014) { }
// TODO: to re-login Vue.prototype.$message.error({
} showClose: true,
Vue.prototype.$message.error({ message: res.msg || res.message || "Error"
showClose: true, });
message: res.msg || res.message || "Error" // reject
}); return Promise.reject(new Error(res.msg || res.message || "Error"));
// reject } else {
return Promise.reject(new Error(res.msg || res.message || "Error")); return Promise.resolve(res);
} else { }
return Promise.resolve(res); }
} return Promise.resolve(res);
} },
return Promise.resolve(res); error => {
}, endLoading();
error => { // do something with response error
endLoading(); return Promise.reject(error);
// do something with response error }
return Promise.reject(error); );
}
); export default service;
export default service;
<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 UpdateDialog from "@/views/design/updateDialog.vue"; import UpdateDialog from "@/views/design/updateDialog.vue";
export default { export default {
components: { PHead, PMain, UpdateDialog }, components: { PHead, PMain, UpdateDialog },
data() { data() {
return { return {
user: {}, user: {},
company: {} };
}; },
}, mounted() {
mounted() { this.user = this.$dataStore.get("user");
this.user = this.$dataStore.get("user"); this.$refs.updateDialog.checkUpdate().then(data => {
this.company = this.$dataStore.get("company"); if (data) {
this.$refs.updateDialog.checkUpdate().then(data => { // 有新版本更新
if (data) { this.$refs.updateDialog.open(data);
// 有新版本更新 }
this.$refs.updateDialog.open(data); });
} }
}); };
} </script>
};
</script> <template>
<div class="page">
<template> <p-head :user="user" />
<div class="page"> <p-main />
<p-head :company="company" :user="user" /> <update-dialog ref="updateDialog" />
<p-main /> </div>
<update-dialog ref="updateDialog" /> </template>
</div>
</template> <style scoped>
.page {
<style scoped> width: 100%;
.page { height: 100%;
width: 100%; display: flex;
height: 100%; flex-direction: column;
display: flex; }
flex-direction: column; </style>
}
</style>
\ No newline at end of file
<script> <script>
import { ipcRenderer } from "electron"; import { ipcRenderer } from "electron";
import pkg from "../../../package.json"; import pkg from "../../../package.json";
import axios from "@/utils/axios"; import axios from "@/utils/axios";
export default { export default {
data() { data() {
return { return {
visible: false, visible: false,
version: pkg.version, version: pkg.version,
downloaded: false, downloaded: false,
percent: 0, percent: 0,
loading: false, loading: false,
speed: 0, speed: 0,
item: {} item: {}
}; };
}, },
created() { created() {
let that = this; let that = this;
ipcRenderer.on("update", (event, data) => { ipcRenderer.on("update", (event, data) => {
console.log("下載進度", data); console.log("下載進度", data);
if (!that.loading) that.loading = true; if (!that.loading) that.loading = true;
that.percent = data.percent; that.percent = data.percent;
that.speed = data.speed; that.speed = data.speed;
}); });
ipcRenderer.on("update-error", (event, data) => { ipcRenderer.on("update-error", (event, data) => {
console.log(data); console.log(data);
that.$message.error(`安装包下载失败`); that.$message.error(`安装包下载失败`);
that.loading = false; that.loading = false;
}); });
ipcRenderer.on("downloaded", () => { ipcRenderer.on("downloaded", () => {
that.loading = false; that.loading = false;
that.download(); that.download();
}); });
}, },
methods: { methods: {
async checkUpdate() { async checkUpdate() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
axios axios
.get(`/checkUpdate?version=${this.version}`) .get(`/checkUpdate?version=${this.version}`)
.then(res => { .then(res => {
resolve(res.data); resolve(res.data);
}) })
.catch(err => { .catch(err => {
reject(err); reject(err);
}); });
} catch (err) { } catch (err) {
reject(err); reject(err);
} }
}); });
}, },
download() { download() {
this.$confirm("新版本已下载,是否立即安装?", "提示", { this.$confirm("新版本已下载,是否立即安装?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
showCancelButton: this.item.forcedUpdate === 0, showCancelButton: this.item.forcedUpdate === 0,
showClose: this.item.forcedUpdate === 0, showClose: this.item.forcedUpdate === 0,
type: "success" type: "success"
}) })
.then(() => { .then(() => {
ipcRenderer.send("install"); ipcRenderer.send("install");
this.visible = false; this.visible = false;
}) })
.catch(() => {}); .catch(() => {});
}, },
incrementalUpdates() { incrementalUpdates() {
this.$confirm("新版本已下载,是否刷新页面", "提示", { this.$confirm("新版本已下载,是否刷新页面", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
showCancelButton: this.item.forcedUpdate === 0, showCancelButton: this.item.forcedUpdate === 0,
showClose: this.item.forcedUpdate === 0, showClose: this.item.forcedUpdate === 0,
cancelButtonText: "取消", cancelButtonText: "取消",
type: "success" type: "success"
}) })
.then(() => { .then(() => {
window.location.reload(); window.location.reload();
}) })
.catch(() => {}); .catch(() => {});
}, },
async toUpdate(type) { async toUpdate(type) {
if (type === 1) { if (type === 1) {
this.visible = false; this.visible = false;
if (this.loading) return; if (this.loading) return;
} else { } else {
this.loading = true; this.loading = true;
} }
if (!this.item.fileList || this.item.fileList.length === 0) { if (!this.item.fileList || this.item.fileList.length === 0) {
return this.$message.warning("缺少更新文件"); return this.$message.warning("缺少更新文件");
} }
console.log("开始下载"); console.log("开始下载");
if (this.item.fullUpdate) { if (this.item.fullUpdate) {
// 全量更新 // 全量更新
const domain = "https://" + this.$dataStore.get("company").domain; const domain = "https://console.jomalls.com";
this.item.url = this.item.url =
domain + this.item.fileList[0].versionPath.replace("/data", ""); domain + this.item.fileList[0].versionPath.replace("/data", "");
console.log(this.item.url); console.log(this.item.url);
ipcRenderer.send("toUpdateApp", this.item); ipcRenderer.send("toUpdateApp", this.item);
} else { } else {
try { try {
this.loading = false; this.loading = false;
await this.$api.post("/incrementalUpdates", { await this.$api.post("/incrementalUpdates", {
url: this.item.fileList[0].fileUrl.replace("/data", "") url: this.item.fileList[0].fileUrl.replace("/data", "")
}); });
this.incrementalUpdates(); this.incrementalUpdates();
} catch (e) { } catch (e) {
// this.$message.warning("更新失败"); // this.$message.warning("更新失败");
} }
} }
}, },
open(data) { open(data) {
this.item = data; this.item = data;
this.visible = true; this.visible = true;
} }
} }
}; };
</script> </script>
<template> <template>
<el-dialog <el-dialog
:show-close="item.forcedUpdate === 0" :show-close="item.forcedUpdate === 0"
destroy-on-close destroy-on-close
:close-on-press-escape="false" :close-on-press-escape="false"
:close-on-click-modal="false" :close-on-click-modal="false"
width="500px" width="500px"
:title="item.title" :title="item.title"
:visible.sync="visible" :visible.sync="visible"
> >
<pre>{{ item.content }}</pre> <pre>{{ item.content }}</pre>
<!-- <el-progress :text-inside="true" :stroke-width="26" :percentage="percent"></el-progress>--> <!-- <el-progress :text-inside="true" :stroke-width="26" :percentage="percent"></el-progress>-->
<template slot="footer"> <template slot="footer">
<el-button <el-button
@click="visible = false" @click="visible = false"
v-if="item.forcedUpdate === 0" v-if="item.forcedUpdate === 0"
size="small" size="small"
>关闭 >关闭
</el-button> </el-button>
<!-- <el-button @click="toUpdate(1)" size="small" type="warning"--> <!-- <el-button @click="toUpdate(1)" size="small" type="warning"-->
<!-- >后台更新--> <!-- >后台更新-->
<!-- </el-button--> <!-- </el-button-->
<!-- >--> <!-- >-->
<el-button <el-button
@click="toUpdate(2)" @click="toUpdate(2)"
size="small" size="small"
type="primary" type="primary"
:loading="loading" :loading="loading"
> >
{{ loading ? `正在下载中(${percent}%)` : "确定更新" }} {{ loading ? `正在下载中(${percent}%)` : "确定更新" }}
</el-button> </el-button>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<style scoped lang="less"></style> <style scoped lang="less"></style>
const path = require("path"); const path = require("path");
module.exports = { module.exports = {
// 基本路径 // 基本路径
publicPath: process.env.NODE_ENV === "production" ? "" : "/", publicPath: process.env.NODE_ENV === "production" ? "" : "/",
// 输出文件目录 // 输出文件目录
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
**/ **/
chainWebpack: config => { chainWebpack: config => {
const svgRule = config.module.rule("svg"); const svgRule = config.module.rule("svg");
svgRule.uses.clear(); svgRule.uses.clear();
svgRule svgRule
.use("svg-sprite-loader") .use("svg-sprite-loader")
.loader("svg-sprite-loader") .loader("svg-sprite-loader")
.options({ .options({
symbolId: "icon-[name]", symbolId: "icon-[name]",
include: ["./src/icons"] include: ["./src/icons"]
}); });
config.module config.module
.rule("pug") .rule("pug")
.test(/\.pug$/) .test(/\.pug$/)
.use("pug-html-loader") .use("pug-html-loader")
.loader("pug-html-loader") .loader("pug-html-loader")
.end(); .end();
}, },
configureWebpack: config => { configureWebpack: config => {
config.resolve = { config.resolve = {
// 配置解析别名 // 配置解析别名
extensions: [".js", ".json", ".vue"], // 自动添加文件名后缀 extensions: [".js", ".json", ".vue"], // 自动添加文件名后缀
alias: { alias: {
vue: "vue/dist/vue.js", vue: "vue/dist/vue.js",
"@": path.resolve(__dirname, "./src"), "@": path.resolve(__dirname, "./src"),
"@c": path.resolve(__dirname, "./src/components") "@c": path.resolve(__dirname, "./src/components")
} }
}; };
}, },
// 生产环境是否生成 sourceMap 文件 // 生产环境是否生成 sourceMap 文件
productionSourceMap: false, productionSourceMap: false,
// css相关配置 // css相关配置
css: { css: {
// 是否使用css分离插件 ExtractTextPlugin // 是否使用css分离插件 ExtractTextPlugin
extract: true, extract: true,
// 开启 CSS source maps? // 开启 CSS source maps?
sourceMap: false, sourceMap: false,
// css预设器配置项 // css预设器配置项
loaderOptions: { loaderOptions: {
sass: { sass: {
prependData: `@import "./src/styles/main.css";` prependData: `@import "./src/styles/main.css";`
} }
}, },
// 启用 CSS modules for all css / pre-processor files. // 启用 CSS modules for all css / pre-processor files.
requireModuleExtension: true // 是否开启支持‘foo.module.css’样式 requireModuleExtension: true // 是否开启支持‘foo.module.css’样式
}, },
// use thread-loader for babel & TS in production build // use thread-loader for babel & TS in production build
// enabled by default if the machine has more than 1 cores // enabled by default if the machine has more than 1 cores
parallel: require("os").cpus().length > 1, parallel: require("os").cpus().length > 1,
/** /**
* PWA 插件相关配置,see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa * PWA 插件相关配置,see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
*/ */
pwa: {}, pwa: {},
// webpack-dev-server 相关配置 // webpack-dev-server 相关配置
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: 8050, // 访问端口 port: 8050, // 访问端口
https: false, // 编译失败时刷新页面 https: false, // 编译失败时刷新页面
hot: true, // 开启热加载 hot: true, // 开启热加载
hotOnly: false, hotOnly: false,
proxy: { proxy: {
// 配置跨域 // 配置跨域
"/devApi": { "/devApi": {
//要访问的跨域的api的域名 //要访问的跨域的api的域名
target: "http://localhost:3000", target: "http://localhost:3000",
ws: true, ws: true,
changOrigin: true, changOrigin: true,
pathRewrite: { pathRewrite: {
"^/devApi": "" "^/devApi": ""
} }
} }
}, },
overlay: { overlay: {
// 全屏模式下是否显示脚本错误 // 全屏模式下是否显示脚本错误
warnings: true, warnings: true,
errors: true errors: true
}, },
before: app => {} before: app => {}
}, },
/** /**
* 第三方插件配置 * 第三方插件配置
*/ */
pluginOptions: { pluginOptions: {
electronBuilder: { electronBuilder: {
builderOptions: { builderOptions: {
asar: false, asar: false,
extraResources: [ extraResources: [
{ {
from: "./print/", from: "./print/",
to: "../print" to: "../print"
}, },
{ {
from: "./logs/", from: "./logs/",
to: "../logs" to: "../logs"
} },
] {
} from: "./config/",
} to: "../config"
} }
}; ]
}
}
}
};
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