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";
import { ipcMain } from "electron";
import { app, protocol, BrowserWindow, screen, globalShortcut } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
import { createServer } from "@/server/index.js";
import { autoUpdater } from "electron-updater";
Object.defineProperty(app, "isPackaged", {
get() {
return true;
}
});
createServer();
const isDevelopment = process.env.NODE_ENV !== "production";
let win;
let newWindow;
protocol.registerSchemesAsPrivileged([
{ scheme: "app", privileges: { secure: true, standard: true } }
]);
const winURL =
process.env.NODE_ENV === "development"
? "http://localhost:8050"
: `file://${__dirname}/index.html`;
async function createWindow() {
win = new BrowserWindow({
width: 1500,
height: 1000,
icon: "./src/assets/logo.jpg",
webPreferences: {
webSecurity: false,
nodeIntegration: true
}
});
let newWindow = new BrowserWindow({
fullscreen: false,
width: 1000,
height: 1000,
webPreferences: {
nodeIntegration: true
//配置预加载脚本文件(preload),此处起名为preloadOther
//p.s.路径为绝对路径
// preload: path.join(__dirname, "./preloadOther.js")
}
});
console.log(winURL + "#" + `/design-detail`);
//指定副屏幕打开的网页
await newWindow.loadURL(winURL + "#" + `/design-detail`);
win.on("closed", () => {
//这一段放外面的话,如果你电脑没双屏会报错。
win = null;
});
ipcMain.on("allPrint", () => {
// 获取到打印机列表
const printers = win.webContents.getPrinters();
// 把获取的打印机列表发送给渲染进程
win.webContents.send("printName", printers);
});
ipcMain.on("win-subScreen", (data, v) => {
if (newWindow) newWindow.webContents.send("getProductionNoInfo", v);
});
if (process.env.WEBPACK_DEV_SERVER_URL) {
await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) win.webContents.openDevTools();
} else {
createProtocol("app");
await win.loadURL("app://./index.html");
}
ipcMain.on("send-card", (event, obj) => {
win.webContents.send("sendWebsockt", obj);
});
win.on("closed", () => {
win.removeAllListeners();
win = null;
newWindow = 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", async () => {
if (win === null) {
await createWindow();
}
});
app.on("ready", async () => {
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 (process.platform === "win32") {
process.on("message", data => {
if (data === "graceful-exit") {
app.quit();
}
});
} else {
process.on("SIGTERM", () => {
app.quit();
});
}
}
"use strict";
import { ipcMain } from "electron";
import { app, protocol, BrowserWindow, screen, globalShortcut } from "electron";
import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
import { createServer } from "@/server/index.js";
import { autoUpdater } from "electron-updater";
Object.defineProperty(app, "isPackaged", {
get() {
return true;
}
});
createServer();
const isDevelopment = process.env.NODE_ENV !== "production";
let win;
let newWindow;
protocol.registerSchemesAsPrivileged([
{ scheme: "app", privileges: { secure: true, standard: true } }
]);
const winURL =
process.env.NODE_ENV === "development"
? "http://localhost:8050"
: `file://${__dirname}/index.html`;
async function createWindow() {
win = new BrowserWindow({
width: 1500,
height: 1000,
icon: "./src/assets/logo.jpg",
webPreferences: {
webSecurity: false,
nodeIntegration: true
}
});
let newWindow = new BrowserWindow({
fullscreen: false,
width: 1000,
height: 1000,
webPreferences: {
nodeIntegration: true
//配置预加载脚本文件(preload),此处起名为preloadOther
//p.s.路径为绝对路径
// preload: path.join(__dirname, "./preloadOther.js")
}
});
console.log(winURL + "#" + `/design-detail`);
//指定副屏幕打开的网页
await newWindow.loadURL(winURL + "#" + `/design-detail`);
win.on("closed", () => {
//这一段放外面的话,如果你电脑没双屏会报错。
win = null;
});
ipcMain.on("allPrint", () => {
// 获取到打印机列表
const printers = win.webContents.getPrinters();
// 把获取的打印机列表发送给渲染进程
win.webContents.send("printName", printers);
});
ipcMain.on("win-subScreen", (data, v) => {
if (newWindow) newWindow.webContents.send("getProductionNoInfo", v);
});
if (process.env.WEBPACK_DEV_SERVER_URL) {
await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
if (!process.env.IS_TEST) win.webContents.openDevTools();
} else {
createProtocol("app");
await win.loadURL("app://./index.html");
}
ipcMain.on("send-card", (event, obj) => {
win.webContents.send("sendWebsockt", obj);
});
win.on("closed", () => {
win && win.removeAllListeners();
win = null;
newWindow && newWindow.close()
newWindow = 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", async () => {
if (win === null) {
await createWindow();
}
});
app.on("ready", async () => {
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 (process.platform === "win32") {
process.on("message", data => {
if (data === "graceful-exit") {
app.quit();
}
});
} else {
process.on("SIGTERM", () => {
app.quit();
});
}
}
import { downloadImage, toSend, writeProfileXml } from "@/server/utils";
import axios from "axios";
import { returnLogFilePath } from "../utils/log";
var request = require("request");
const compressing = require("compressing");
const uuid = require("uuid");
const path = require("path");
const fs = require("fs");
const os = require("os");
import axios from "axios";
import { returnLogFilePath } from "../utils/log";
const { app } = require("electron");
let fileEnv, env, visionUrl;
axios.defaults.timeout = 12600000;
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 {
writePrintLog: async (req, res) => {
try {
......@@ -33,32 +56,24 @@ export default {
res.json({ code: 500, msg: e });
}
},
getPodProductionInfo: async (req, res) => {
downloadBySubOrderNumber: async (req, res) => {
const token = req.headers["jwt-token"];
const company = req.headers["company"];
const productionNo = req.body.productionNo;
try {
let { data } = await axios.post(
`https://${company}/api/podDesignCenter/getPodImageByProduction`,
{ productionNo },
{ headers: { "jwt-token": token } }
let {
data
} = await axios.get(
`${env}/factory/podJomallOrder/downloadBySubOrderNumber`,
{ params: req.body, headers: { "jwt-token": token } }
);
console.log(data);
if (data.code === 200 && data.data && data.data.length > 0) {
let f = data.data.find(el => !el.productionFile);
if (f) {
return res.json({ code: 500, msg: "存在地址错误的素材图" });
}
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}`;
}
let files = [];
if (data.code === 200 && data.message) {
files = [data.message];
files = files.map(el => {
return { url: `${fileEnv}${el}` };
});
downloadImage(data.data)
console.log(files);
downloadImage(files)
.then(data => {
res.json({ code: 200, data });
})
......@@ -75,11 +90,10 @@ export default {
},
findByPodProductionNo: async (req, res) => {
const token = req.headers["jwt-token"];
const company = req.headers["company"];
const q = req.body;
try {
let { data } = await axios.get(
`https://${company}/api/pod/podProductionInfo/findByPodProductionNo`,
`${env}/factory/podJomallOrderProduct/getSubOrderBySubOrderNumber`,
{
params: q,
headers: { "jwt-token": token }
......@@ -101,34 +115,20 @@ export default {
res.json({ code: 500, msg: err });
}
},
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 });
}
},
commitApply: async (req, res) => {},
completeDelivery: async (req, res) => {
const token = req.headers["jwt-token"];
const company = req.headers["company"];
const q = req.body;
try {
let { data } = await axios.post(
`https://${company}/api/pod/podProductionInfo/completeDelivery`,
q,
{
headers: { "jwt-token": token }
}
let {
data
} = await axios.post(
`${env}/factory/podJomallOrderProduct/completeDelivery`,
req.body,
{ headers: { "jwt-token": token } }
);
res.json(data);
res.send(data);
} catch (err) {
console.log(err);
res.json({ code: 500, msg: err });
}
},
......@@ -232,14 +232,9 @@ export default {
}
},
login: async (req, res) => {
const { loginName, company, password, deviceId } = req.body;
try {
let { data } = await axios.post(`https://${company}/api/sysLogin/login`, {
loginName,
password,
deviceId
});
console.log(`${env}/factory/login`);
let { data } = await axios.post(`${env}/factory/login`, req.body);
res.send(data);
} catch (err) {
console.log(err);
......@@ -282,8 +277,7 @@ export default {
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;
req.body.url = visionUrl + req.body.url;
console.log(req.body.url, "下载zip地址");
request(req.body.url)
.pipe(stream)
......
import express from "express";
import fn from "../entity/function.js";
let router = express.Router();
// 执行打印命令
router.post("/toPrint", fn.toPrint);
// 打印日志添加
router.post("/writePrintLog", fn.writePrintLog);
// 登录接口
router.post("/login", fn.login);
// 获取本地文件返回
router.post("/getPngImg", fn.getPngImg);
// 上传文件到本地
router.post("/uploadImage", fn.uploadImage);
// 获取公司列表
router.get("/getCompanyList", fn.getCompanyList);
// 提交授权申请
router.post("/commitApply", fn.commitApply);
// 下载素材到本地
router.post("/downloadByDesignId", fn.downloadByDesignId);
// 获取 生产单号返回素材地址
router.post("/getPodProductionInfo", fn.getPodProductionInfo);
// 提交生产完成
router.post("/completeDelivery", fn.completeDelivery);
// 根据生产单号查询详情
router.post("/findByPodProductionNo", fn.findByPodProductionNo);
// 查询版本更新
router.get("/checkUpdate", fn.checkUpdate);
// 增量更新
router.post("/incrementalUpdates", fn.incrementalUpdates);
export { router as default };
import express from "express";
import fn from "../entity/function.js";
let router = express.Router();
// 执行打印命令
router.post("/toPrint", fn.toPrint);
// 打印日志添加
router.post("/writePrintLog", fn.writePrintLog);
// 登录接口
router.post("/login", fn.login);
// 获取本地文件返回
router.post("/getPngImg", fn.getPngImg);
// 上传文件到本地
router.post("/uploadImage", fn.uploadImage);
// 获取公司列表
router.get("/getCompanyList", fn.getCompanyList);
// 提交授权申请
router.post("/commitApply", fn.commitApply);
// 下载素材到本地
router.post("/downloadByDesignId", fn.downloadByDesignId);
// 获取 生产单号返回素材地址
router.post("/downloadBySubOrderNumber", fn.downloadBySubOrderNumber);
// 提交生产完成
router.post("/completeDelivery", fn.completeDelivery);
// 根据生产单号查询详情
router.post("/findByPodProductionNo", fn.findByPodProductionNo);
// 查询版本更新
router.get("/checkUpdate", fn.checkUpdate);
// 增量更新
router.post("/incrementalUpdates", fn.incrementalUpdates);
export { router as default };
const log4js = require("log4js");
const moment = require("moment");
const fs = require("fs");
const path = require("path");
export function returnLogFilePath() {
const today = moment(new Date()).format("YYYY-MM-DD");
const low_path = process.cwd();
let log_dir = path.join(low_path, "logs")
if (!fs.existsSync(log_dir)) {
fs.mkdirSync(log_dir) // 创建日志文件夹
}
const dir = path.join(low_path, `/logs/${today}`);
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 log4js = require("log4js");
const moment = require("moment");
const fs = require("fs");
const path = require("path");
export function returnLogFilePath() {
const today = moment(new Date()).format("YYYY-MM-DD");
const low_path = process.cwd();
let log_dir = path.join(low_path, "logs")
if (!fs.existsSync(log_dir)) {
fs.mkdirSync(log_dir) // 创建日志文件夹
}
const dir = path.join(low_path, `/logs/${today}`);
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 {
ip,
headers,
method,
url,
body,
httpVersion,
res: { statusCode, _headers }
} = req;
let logInfo = {
ip,
host: headers.host,
resTime,
method,
url,
token,
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}
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();
};
};
import axios from "axios";
import Vue from "vue";
import { Loading } from "element-ui";
// create an axios instance
const service = axios.create({
baseURL: "http://localhost:3000", // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 50000000 // request timeout
});
let loading;
function startLoading() {
loading = Loading.service({
lock: true,
text: "拼命加载中...",
spinner: "el-icon-loading",
background: "rgba(0,0,0,.7)"
});
}
function endLoading() {
loading.close();
}
// Add a request interceptor
service.interceptors.request.use(
config => {
console.log(Vue.prototype.$dataStore);
const user = Vue.prototype.$dataStore.get("user");
const company = Vue.prototype.$dataStore.get("company");
if (user) {
config.headers["jwt-token"] = user.token;
config.headers["company"] = company.domain;
}
startLoading();
return config;
},
error => {
endLoading();
// do something with request error
return Promise.reject(error);
}
);
// Add a response interceptor
service.interceptors.response.use(
/**
* 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
* You can also judge the status by HTTP Status Code
*/
async response => {
// do something with response data
const res = response.data;
endLoading();
if (res.code) {
if (res.code !== 200) {
if (res.code === 411) {
return Promise.resolve(res);
}
if (res.code === 403) {
Vue.prototype.$dataStore.delete("user");
Vue.prototype.$message.error({
showClose: true,
message: res.msg || res.message || "Error"
});
setTimeout(() => {
location.reload();
}, 500);
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) {
// TODO: to re-login
}
Vue.prototype.$message.error({
showClose: true,
message: res.msg || res.message || "Error"
});
// reject
return Promise.reject(new Error(res.msg || res.message || "Error"));
} else {
return Promise.resolve(res);
}
}
return Promise.resolve(res);
},
error => {
endLoading();
// do something with response error
return Promise.reject(error);
}
);
export default service;
import axios from "axios";
import Vue from "vue";
import { Loading } from "element-ui";
// create an axios instance
const service = axios.create({
baseURL: "http://localhost:3000", // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 50000000 // request timeout
});
let loading;
function startLoading() {
loading = Loading.service({
lock: true,
text: "拼命加载中...",
spinner: "el-icon-loading",
background: "rgba(0,0,0,.7)"
});
}
function endLoading() {
loading.close();
}
// Add a request interceptor
service.interceptors.request.use(
config => {
console.log(Vue.prototype.$dataStore);
const user = Vue.prototype.$dataStore.get("user");
if (user) {
config.headers["jwt-token"] = user.token;
}
startLoading();
return config;
},
error => {
endLoading();
// do something with request error
return Promise.reject(error);
}
);
// Add a response interceptor
service.interceptors.response.use(
/**
* 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
* You can also judge the status by HTTP Status Code
*/
async response => {
// do something with response data
const res = response.data;
endLoading();
if (res.code) {
if (res.code !== 200) {
if (res.code === 411) {
return Promise.resolve(res);
}
if (res.code === 403) {
Vue.prototype.$dataStore.delete("user");
Vue.prototype.$message.error({
showClose: true,
message: res.msg || res.message || "Error"
});
setTimeout(() => {
location.reload();
}, 500);
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) {
// TODO: to re-login
}
Vue.prototype.$message.error({
showClose: true,
message: res.msg || res.message || "Error"
});
// reject
return Promise.reject(new Error(res.msg || res.message || "Error"));
} else {
return Promise.resolve(res);
}
}
return Promise.resolve(res);
},
error => {
endLoading();
// do something with response error
return Promise.reject(error);
}
);
export default service;
<script>
import PHead from "./head/index.vue";
import PMain from "./main/index.vue";
import UpdateDialog from "@/views/design/updateDialog.vue";
export default {
components: { PHead, PMain, UpdateDialog },
data() {
return {
user: {},
company: {}
};
},
mounted() {
this.user = this.$dataStore.get("user");
this.company = this.$dataStore.get("company");
this.$refs.updateDialog.checkUpdate().then(data => {
if (data) {
// 有新版本更新
this.$refs.updateDialog.open(data);
}
});
}
};
</script>
<template>
<div class="page">
<p-head :company="company" :user="user" />
<p-main />
<update-dialog ref="updateDialog" />
</div>
</template>
<style scoped>
.page {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
</style>
\ No newline at end of file
<script>
import PHead from "./head/index.vue";
import PMain from "./main/index.vue";
import UpdateDialog from "@/views/design/updateDialog.vue";
export default {
components: { PHead, PMain, UpdateDialog },
data() {
return {
user: {},
};
},
mounted() {
this.user = this.$dataStore.get("user");
this.$refs.updateDialog.checkUpdate().then(data => {
if (data) {
// 有新版本更新
this.$refs.updateDialog.open(data);
}
});
}
};
</script>
<template>
<div class="page">
<p-head :user="user" />
<p-main />
<update-dialog ref="updateDialog" />
</div>
</template>
<style scoped>
.page {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
}
</style>
<script>
import { ipcRenderer } from "electron";
import pkg from "../../../package.json";
import axios from "@/utils/axios";
export default {
data() {
return {
visible: false,
version: pkg.version,
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: {
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);
}
});
},
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>
<script>
import { ipcRenderer } from "electron";
import pkg from "../../../package.json";
import axios from "@/utils/axios";
export default {
data() {
return {
visible: false,
version: pkg.version,
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: {
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);
}
});
},
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://console.jomalls.com";
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>
const path = require("path");
module.exports = {
// 基本路径
publicPath: process.env.NODE_ENV === "production" ? "" : "/",
// 输出文件目录
outputDir: process.env.NODE_ENV === "production" ? "dist" : "devdist",
// eslint-loader 是否在保存的时候检查
lintOnSave: false,
/** vue3.0内置了webpack所有东西,
* webpack配置,see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
**/
chainWebpack: config => {
const svgRule = config.module.rule("svg");
svgRule.uses.clear();
svgRule
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]",
include: ["./src/icons"]
});
config.module
.rule("pug")
.test(/\.pug$/)
.use("pug-html-loader")
.loader("pug-html-loader")
.end();
},
configureWebpack: config => {
config.resolve = {
// 配置解析别名
extensions: [".js", ".json", ".vue"], // 自动添加文件名后缀
alias: {
vue: "vue/dist/vue.js",
"@": path.resolve(__dirname, "./src"),
"@c": path.resolve(__dirname, "./src/components")
}
};
},
// 生产环境是否生成 sourceMap 文件
productionSourceMap: false,
// css相关配置
css: {
// 是否使用css分离插件 ExtractTextPlugin
extract: true,
// 开启 CSS source maps?
sourceMap: false,
// css预设器配置项
loaderOptions: {
sass: {
prependData: `@import "./src/styles/main.css";`
}
},
// 启用 CSS modules for all css / pre-processor files.
requireModuleExtension: true // 是否开启支持‘foo.module.css’样式
},
// use thread-loader for babel & TS in production build
// enabled by default if the machine has more than 1 cores
parallel: require("os").cpus().length > 1,
/**
* PWA 插件相关配置,see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
*/
pwa: {},
// webpack-dev-server 相关配置
devServer: {
open: false, // 编译完成是否打开网页
host: "0.0.0.0", // 指定使用地址,默认localhost,0.0.0.0代表可以被外界访问
port: 8050, // 访问端口
https: false, // 编译失败时刷新页面
hot: true, // 开启热加载
hotOnly: false,
proxy: {
// 配置跨域
"/devApi": {
//要访问的跨域的api的域名
target: "http://localhost:3000",
ws: true,
changOrigin: true,
pathRewrite: {
"^/devApi": ""
}
}
},
overlay: {
// 全屏模式下是否显示脚本错误
warnings: true,
errors: true
},
before: app => {}
},
/**
* 第三方插件配置
*/
pluginOptions: {
electronBuilder: {
builderOptions: {
asar: false,
extraResources: [
{
from: "./print/",
to: "../print"
},
{
from: "./logs/",
to: "../logs"
}
]
}
}
}
};
const path = require("path");
module.exports = {
// 基本路径
publicPath: process.env.NODE_ENV === "production" ? "" : "/",
// 输出文件目录
outputDir: process.env.NODE_ENV === "production" ? "dist" : "devdist",
// eslint-loader 是否在保存的时候检查
lintOnSave: false,
/** vue3.0内置了webpack所有东西,
* webpack配置,see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
**/
chainWebpack: config => {
const svgRule = config.module.rule("svg");
svgRule.uses.clear();
svgRule
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]",
include: ["./src/icons"]
});
config.module
.rule("pug")
.test(/\.pug$/)
.use("pug-html-loader")
.loader("pug-html-loader")
.end();
},
configureWebpack: config => {
config.resolve = {
// 配置解析别名
extensions: [".js", ".json", ".vue"], // 自动添加文件名后缀
alias: {
vue: "vue/dist/vue.js",
"@": path.resolve(__dirname, "./src"),
"@c": path.resolve(__dirname, "./src/components")
}
};
},
// 生产环境是否生成 sourceMap 文件
productionSourceMap: false,
// css相关配置
css: {
// 是否使用css分离插件 ExtractTextPlugin
extract: true,
// 开启 CSS source maps?
sourceMap: false,
// css预设器配置项
loaderOptions: {
sass: {
prependData: `@import "./src/styles/main.css";`
}
},
// 启用 CSS modules for all css / pre-processor files.
requireModuleExtension: true // 是否开启支持‘foo.module.css’样式
},
// use thread-loader for babel & TS in production build
// enabled by default if the machine has more than 1 cores
parallel: require("os").cpus().length > 1,
/**
* PWA 插件相关配置,see https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-pwa
*/
pwa: {},
// webpack-dev-server 相关配置
devServer: {
open: false, // 编译完成是否打开网页
host: "0.0.0.0", // 指定使用地址,默认localhost,0.0.0.0代表可以被外界访问
port: 8050, // 访问端口
https: false, // 编译失败时刷新页面
hot: true, // 开启热加载
hotOnly: false,
proxy: {
// 配置跨域
"/devApi": {
//要访问的跨域的api的域名
target: "http://localhost:3000",
ws: true,
changOrigin: true,
pathRewrite: {
"^/devApi": ""
}
}
},
overlay: {
// 全屏模式下是否显示脚本错误
warnings: true,
errors: true
},
before: app => {}
},
/**
* 第三方插件配置
*/
pluginOptions: {
electronBuilder: {
builderOptions: {
asar: false,
extraResources: [
{
from: "./print/",
to: "../print"
},
{
from: "./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