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) {
if (win.isDestroyed()) {
return;
}
console.log("正在下载中");
win.webContents.send("update", {
speed: Math.ceil(progress.bytesPerSecond / 1000), // 网速
percent: Math.ceil(progress.percent) // 百分比
});
autoUpdater.removeListener("update-downloaded", progress =>
downloadProgress(win, progress)
);
}
function updateAvailable(win, info) {
if (win.isDestroyed()) {
return;
}
// 检查到有新版本
win.webContents.send("update-available", info);
autoUpdater.removeListener("update-available", info => updateAvailable(win, info));
}
function downloadError(win, err) {
if (win.isDestroyed()) {
return;
}
console.log(111);
// 自动升级遇到错误
console.log("自动升级遇到错误", err);
win.webContents.send("update-error", err);
autoUpdater.removeListener("error", err => downloadError(win, err));
}
function updateNotAvailable(win, info) {
if (win.isDestroyed()) {
return;
}
console.log("检查到无新版本", info);
win.webContents.send("update-not-available", info);
autoUpdater.removeListener("error", err => downloadError(win, err));
}
function updateDownloaded(win, info) {
if (win.isDestroyed()) {
return;
}
console.log(info, "info");
win.webContents.send("downloaded", info);
}
const checkUpdate = (win, ipcMain, data) => {
if (win.isDestroyed()) {
return;
}
autoUpdater.autoDownload = true; // 自动下载 autoUpdater.autoDownload = true; // 自动下载
autoUpdater.autoInstallOnAppQuit = true; // 应用退出后自动安装 autoUpdater.autoInstallOnAppQuit = false; // 应用退出后自动安装
// autoUpdater.forceDevUpdateConfig = true; // autoUpdater.forceDevUpdateConfig = true;
// autoUpdater.updateConfigPath = join(__dirname, "../dev-update.yml"); // autoUpdater.updateConfigPath = url + "latest.yml";
mainWin = win; mainWin = win;
autoUpdater.setFeedURL({
// 检测是否有更新包并通知 provider: "generic",
autoUpdater.checkForUpdatesAndNotify().catch(); url: data.url
// 监听渲染进程的 install 事件,触发退出应用并安装
ipcMain.on("install", () => autoUpdater.quitAndInstall());
autoUpdater.on("download-progress", (prog) => {
win.webContents.send("update", {
speed: Math.ceil(prog.bytesPerSecond / 1000), // 网速
percent: Math.ceil(prog.percent) // 百分比
});
}); });
autoUpdater.on('update-available', (info) => { ipcMain.on("install", () => {
// 检查到有新版本 autoUpdater.quitAndInstall();
win.webContents.send("update-available", info);
console.log('检查到有新版本',info);
})
autoUpdater.on('error', (err) => {
// 自动升级遇到错误
win.webContents.send("update-error", err);
// 执行原有升级逻辑
})
autoUpdater.on('update-not-available', (info) => {
console.log('检查到无新版本',info);
win.webContents.send("update-not-available", info);
// 检查到无新版本
// 提醒用户当前版本已经是最新版,无需更新
})
autoUpdater.on("update-downloaded", (info) => {
console.log(info, "info");
win.webContents.send("downloaded", info);
// 下载完成后强制用户安装,不推荐
// autoUpdater.quitAndInstall();
}); });
// 检测是否有更新包并通知
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
......
...@@ -3,9 +3,11 @@ import bus from "@/bus"; ...@@ -3,9 +3,11 @@ import bus from "@/bus";
import PrintDialog from "./printDialog.vue"; import PrintDialog from "./printDialog.vue";
import { ipcRenderer } from "electron"; import { ipcRenderer } from "electron";
import { grid } from "../data"; import { grid } from "../data";
import pkg from "../../../../package.json";
import update from "@/views/design/update";
import UpdateDialog from "@/views/design/updateDialog.vue";
export default { export default {
components: { PrintDialog }, components: { PrintDialog,UpdateDialog },
props: { props: {
user: { user: {
default: { default: {
...@@ -21,6 +23,7 @@ export default { ...@@ -21,6 +23,7 @@ export default {
data() { data() {
return { return {
selectGridIndex: 0, selectGridIndex: 0,
pkg,
actionIndex: -1, actionIndex: -1,
isAutoFinish: false, isAutoFinish: false,
showPrintDialog: false, showPrintDialog: false,
...@@ -63,7 +66,9 @@ export default { ...@@ -63,7 +66,9 @@ export default {
if (host.includes("console")) { if (host.includes("console")) {
host = host.replace(".jomalls.com", ".joshine.cn"); host = host.replace(".jomalls.com", ".joshine.cn");
} }
let avatar = this.user.avatar.includes("http") ? this.user.avatar : `https://${host}/erpimg/${this.user.avatar}`; let avatar = this.user.avatar.includes("http")
? this.user.avatar
: `https://${host}/erpimg/${this.user.avatar}`;
console.log(avatar); console.log(avatar);
return avatar; return avatar;
} }
...@@ -74,6 +79,7 @@ export default { ...@@ -74,6 +79,7 @@ export default {
} }
}, },
mounted() { mounted() {
console.log(pkg, "pkg");
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.searchRef.focus(); this.$refs.searchRef.focus();
}); });
...@@ -84,7 +90,6 @@ export default { ...@@ -84,7 +90,6 @@ export default {
} else { } else {
this.$dataStore.set("setting", this.setting); this.$dataStore.set("setting", this.setting);
} }
}, },
watch: { watch: {
setting: { setting: {
...@@ -96,6 +101,17 @@ export default { ...@@ -96,6 +101,17 @@ export default {
} }
}, },
methods: { methods: {
checkUpdate() {
const Update = new update();
Update.checkUpdate().then(data => {
if (data) {
// 有新版本更新
this.$refs.updateDialog.open(data);
}else{
this.$message.warning('已是最新版本')
}
});
},
dropdownCommand(v) { dropdownCommand(v) {
switch (v) { switch (v) {
case "logout": case "logout":
...@@ -103,25 +119,27 @@ export default { ...@@ -103,25 +119,27 @@ export default {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { })
this.$dataStore.delete("user"); .then(() => {
this.$router.push("/"); this.$dataStore.delete("user");
}).catch(() => { this.$router.push("/");
})
}); .catch(() => {
});
break; break;
case "company": case "company":
this.$confirm("是否切换系统?", "提示", { this.$confirm("是否切换系统?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { })
this.$dataStore.delete("company"); .then(() => {
this.$dataStore.delete("user"); this.$dataStore.delete("company");
this.$router.push("/"); this.$dataStore.delete("user");
}).catch(() => { this.$router.push("/");
})
}); .catch(() => {
});
break; break;
case "clear": case "clear":
// this.$confirm("是否清除缓存?", "提示", { // this.$confirm("是否清除缓存?", "提示", {
...@@ -149,20 +167,17 @@ export default { ...@@ -149,20 +167,17 @@ export default {
if (!this.detail || Object.keys(this.detail).length <= 1) { if (!this.detail || Object.keys(this.detail).length <= 1) {
return this.$message.warning("请扫描生产单号"); return this.$message.warning("请扫描生产单号");
} }
this.$confirm( this.$confirm(`确定生产完成?`, "提示", {
`确定生产完成?`, confirmButtonText: "确定",
"提示", cancelButtonText: "取消",
{ type: "warning"
confirmButtonText: "确定", }).then(async () => {
cancelButtonText: "取消",
type: "warning"
}
).then(async () => {
await this.setData(this.detail); await this.setData(this.detail);
}); });
}, },
async downloadImage() { async downloadImage() {
if (!this.detail || Object.keys(this.detail).length === 0) return this.$message.warning("请扫描生产单号"); if (!this.detail || Object.keys(this.detail).length === 0)
return this.$message.warning("请扫描生产单号");
let params = { let params = {
productionNo: this.detail.podProductionNo, productionNo: this.detail.podProductionNo,
imgList: this.imgList imgList: this.imgList
...@@ -172,21 +187,32 @@ export default { ...@@ -172,21 +187,32 @@ export default {
this.$message.success(res.msg); this.$message.success(res.msg);
}, },
async getDataInfo() { async getDataInfo() {
if (this.detail && Object.keys(this.detail).length > 0 && this.isAutoFinish) { if (
this.detail &&
Object.keys(this.detail).length > 0 &&
this.isAutoFinish
) {
await this.setData(this.detail); await this.setData(this.detail);
} }
if (this.productionNo === "") return this.$message.warning("请录入生产单号"); if (this.productionNo === "")
return this.$message.warning("请录入生产单号");
try { try {
//查找生产单号信息传给第二个显示器 //查找生产单号信息传给第二个显示器
const findByPodProductionNo = await this.$api.post("/findByPodProductionNo", { const findByPodProductionNo = await this.$api.post(
podProductionNo: this.productionNo, "/findByPodProductionNo",
status: "IN_PRODUCTION" {
}); podProductionNo: this.productionNo,
status: "IN_PRODUCTION"
}
);
this.detail = findByPodProductionNo.data; this.detail = findByPodProductionNo.data;
ipcRenderer.send("win-subScreen", findByPodProductionNo.data); ipcRenderer.send("win-subScreen", findByPodProductionNo.data);
// 根据生产单号查找 素材图片 下载到本地 然后返回本地地址去显示 // 根据生产单号查找 素材图片 下载到本地 然后返回本地地址去显示
let res = await this.$api.post("/getPodProductionInfo", { productionNo: this.productionNo }); let res = await this.$api.post("/getPodProductionInfo", {
if (res.data.length === 0) return this.$message.warning("未找到素材图!"); productionNo: this.productionNo
});
if (res.data.length === 0)
return this.$message.warning("未找到素材图!");
let arr = []; let arr = [];
res.data.forEach(el => { res.data.forEach(el => {
arr.push(el); arr.push(el);
...@@ -210,7 +236,6 @@ export default { ...@@ -210,7 +236,6 @@ export default {
this.productionNo = ""; this.productionNo = "";
this.$refs.searchRef.focus(); this.$refs.searchRef.focus();
} }
}, },
changeActionIndex(t) { changeActionIndex(t) {
let index = this.actionIndex; let index = this.actionIndex;
...@@ -263,10 +288,12 @@ export default { ...@@ -263,10 +288,12 @@ export default {
command(i) { command(i) {
this.selectGridIndex = i; this.selectGridIndex = i;
this.setting.gridValue = i; this.setting.gridValue = i;
this.$store.commit("updateSystemSetting", { field: "gridValue", value: this.grid[i] }); this.$store.commit("updateSystemSetting", {
field: "gridValue",
value: this.grid[i]
});
bus.$emit("busEmit", { type: "grid", value: this.grid[i] }); bus.$emit("busEmit", { type: "grid", value: this.grid[i] });
} }
} }
}; };
</script> </script>
...@@ -282,8 +309,6 @@ export default { ...@@ -282,8 +309,6 @@ export default {
.left-btn { .left-btn {
display: flex; display: flex;
} }
</style> </style>
<template> <template>
<div> <div>
...@@ -294,9 +319,12 @@ export default { ...@@ -294,9 +319,12 @@ export default {
<!-- </el-tooltip>--> <!-- </el-tooltip>-->
<el-dropdown trigger="click" @command="command" :hide-on-click="false"> <el-dropdown trigger="click" @command="command" :hide-on-click="false">
<el-button style="height: 100%;margin-right: 0px" size="small">{{ grid[selectGridIndex].label }}</el-button> <el-button style="height: 100%;margin-right: 0px" size="small">{{
grid[selectGridIndex].label
}}
</el-button>
<el-dropdown-menu slot="dropdown"> <el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="i" v-for="(it,i) in grid" :key="i"> <el-dropdown-item :command="i" v-for="(it, i) in grid" :key="i">
{{ it.label }} {{ it.label }}
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
...@@ -307,7 +335,13 @@ export default { ...@@ -307,7 +335,13 @@ export default {
<!-- </el-button>--> <!-- </el-button>-->
<!-- </el-tooltip>--> <!-- </el-tooltip>-->
<el-tooltip content="图片"> <el-tooltip content="图片">
<el-upload accept=".png" action="" :show-file-list="false" multiple :before-upload="uploadImage"> <el-upload
accept=".png"
action=""
:show-file-list="false"
multiple
:before-upload="uploadImage"
>
<el-button style="height: 100%;margin:0 8px" size="small"> <el-button style="height: 100%;margin:0 8px" size="small">
<i class="el-icon-picture" style="font-size: 15px;"></i> <i class="el-icon-picture" style="font-size: 15px;"></i>
</el-button> </el-button>
...@@ -333,7 +367,8 @@ export default { ...@@ -333,7 +367,8 @@ export default {
v-model="selectBgColor" v-model="selectBgColor"
@change="setBg" @change="setBg"
color-format="hex" color-format="hex"
:predefine="predefineColors"> :predefine="predefineColors"
>
</el-color-picker> </el-color-picker>
</el-tooltip> </el-tooltip>
...@@ -342,35 +377,76 @@ export default { ...@@ -342,35 +377,76 @@ export default {
:offset="-120" :offset="-120"
trigger="click" trigger="click"
placement="bottom" placement="bottom"
> >
<div class="setting-form"> <div class="setting-form">
<el-form :model="setting" label-position="left" label-width="80px" size="small"> <el-form
:model="setting"
label-position="left"
label-width="80px"
size="small"
>
<el-form-item prop="setting" label="网格显示"> <el-form-item prop="setting" label="网格显示">
<el-select @change="(e)=>settingChange('gridShow',e)" clearable v-model="setting.gridShow"> <el-select
@change="e => settingChange('gridShow', e)"
clearable
v-model="setting.gridShow"
>
<el-option :value="1" label="未缩放的网格"></el-option> <el-option :value="1" label="未缩放的网格"></el-option>
<el-option :value="0" label="无"></el-option> <el-option :value="0" label="无"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="gridSpacing" label="单位"> <el-form-item prop="gridSpacing" label="单位">
<el-select @change="(e)=>settingChange('unit',e)" clearable v-model="setting.unit"> <el-select
@change="e => settingChange('unit', e)"
clearable
v-model="setting.unit"
>
<el-option value="mm" label="mm"></el-option> <el-option value="mm" label="mm"></el-option>
<el-option value="inch" label="inch"></el-option> <el-option value="inch" label="inch"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="gridSpacing" label="网格间隔"> <el-form-item prop="gridSpacing" label="网格间隔">
<el-select @change="(e)=>settingChange('gridSpacing',e)" clearable v-model="setting.gridSpacing"> <el-select
<el-option v-if="setting.unit==='mm'" :value="20" :label="`20 ${setting.unit}`"></el-option> @change="e => settingChange('gridSpacing', e)"
<el-option v-if="setting.unit==='mm'" :value="10" :label="`10 ${setting.unit}`"></el-option> clearable
<el-option v-if="setting.unit==='inch'" :value="1" :label="`1 ${setting.unit}`"></el-option> v-model="setting.gridSpacing"
<el-option v-if="setting.unit==='inch'" :value="0.5" :label="`0.5 ${setting.unit}`"></el-option> >
<el-option
v-if="setting.unit === 'mm'"
:value="20"
:label="`20 ${setting.unit}`"
></el-option>
<el-option
v-if="setting.unit === 'mm'"
:value="10"
:label="`10 ${setting.unit}`"
></el-option>
<el-option
v-if="setting.unit === 'inch'"
:value="1"
:label="`1 ${setting.unit}`"
></el-option>
<el-option
v-if="setting.unit === 'inch'"
:value="0.5"
:label="`0.5 ${setting.unit}`"
></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="language" label="语言设置"> <el-form-item prop="language" label="语言设置">
<el-select @change="(e)=>settingChange('language',e)" clearable v-model="setting.language"> <el-select
@change="e => settingChange('language', e)"
clearable
v-model="setting.language"
>
<el-option value="cn" label="中文"></el-option> <el-option value="cn" label="中文"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="language" label="版本号">
<b>{{ pkg.version || "" }}</b>
<el-button @click="checkUpdate" style="margin-left: 15px" type="text">检查更新</el-button>
</el-form-item>
<!-- <el-form-item label="自动打印模式">--> <!-- <el-form-item label="自动打印模式">-->
<!-- <el-switch @change="(e)=>settingChange('autoPrint',e)" v-model="setting.autoPrint"></el-switch>--> <!-- <el-switch @change="(e)=>settingChange('autoPrint',e)" v-model="setting.autoPrint"></el-switch>-->
<!-- </el-form-item>--> <!-- </el-form-item>-->
...@@ -385,7 +461,11 @@ export default { ...@@ -385,7 +461,11 @@ export default {
</div> </div>
<el-tooltip slot="reference" content="设置"> <el-tooltip slot="reference" content="设置">
<el-button style="margin-right: 8px" size="small"> <el-button style="margin-right: 8px" size="small">
<img style="width: 15px;height: 15px" src="@/static/icon/shezhi.png" alt=""> <img
style="width: 15px;height: 15px"
src="@/static/icon/shezhi.png"
alt=""
/>
</el-button> </el-button>
</el-tooltip> </el-tooltip>
</el-popover> </el-popover>
...@@ -397,17 +477,40 @@ export default { ...@@ -397,17 +477,40 @@ export default {
<!-- </el-tooltip>--> <!-- </el-tooltip>-->
</div> </div>
<div class="center-input"> <div class="center-input">
<el-input @keyup.enter.native="getDataInfo" style="width: 40%;" size="medium" placeholder="请扫描生产单号" <el-input
ref="searchRef" v-model="productionNo"></el-input> @keyup.enter.native="getDataInfo"
<el-button @click="getDataInfo" size="medium" style="margin-left: 10px" type="primary">查询</el-button> style="width: 40%;"
size="medium"
placeholder="请扫描生产单号"
ref="searchRef"
v-model="productionNo"
></el-input>
<el-button
@click="getDataInfo"
size="medium"
style="margin-left: 10px"
type="primary"
>查询
</el-button
>
<div class="sure-btn"> <div class="sure-btn">
<el-button @click="sureData" size="medium" style="margin-left: 10px;width: 100%;" type="success">生产完成 <el-button
@click="sureData"
size="medium"
style="margin-left: 10px;width: 100%;"
type="success"
>生产完成
</el-button> </el-button>
<div class="check"> <div class="check">
<el-checkbox v-model="isAutoFinish">自动完成上一单</el-checkbox> <el-checkbox v-model="isAutoFinish">自动完成上一单</el-checkbox>
</div> </div>
</div> </div>
<el-button @click="downloadImage" size="medium" style="margin-left: 15px" type="primary">下载素材 <el-button
@click="downloadImage"
size="medium"
style="margin-left: 15px"
type="primary"
>下载素材
</el-button> </el-button>
</div> </div>
<div class="right-user"> <div class="right-user">
...@@ -423,8 +526,8 @@ export default { ...@@ -423,8 +526,8 @@ export default {
</el-dropdown> </el-dropdown>
</div> </div>
</div> </div>
<!-- <print-dialog :byPlatenSize="grid[selectGridIndex].value" @close="showPrintDialog=false"--> <update-dialog ref="updateDialog" />
<!-- :visible="showPrintDialog"></print-dialog>-->
</div> </div>
</template> </template>
...@@ -514,5 +617,4 @@ export default { ...@@ -514,5 +617,4 @@ export default {
z-index: 2; z-index: 2;
color: white; color: white;
} }
</style>
</style>
\ No newline at end of file
...@@ -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: [],
...@@ -324,7 +324,7 @@ export default { ...@@ -324,7 +324,7 @@ export default {
".png", ".png",
"" ""
)}.xml`}" -I "${"Input\\" + )}.xml`}" -I "${"Input\\" +
imgFileName}" -A "Output\\${imgFileName.replace( imgFileName}" -A "Output\\${imgFileName.replace(
".png", ".png",
"" ""
)}.arxp" -S ${size} -L ${position} -D ${r} -W ${whitePrint}`; )}.arxp" -S ${size} -L ${position} -D ${r} -W ${whitePrint}`;
...@@ -364,510 +364,517 @@ export default { ...@@ -364,510 +364,517 @@ export default {
<template> <template>
<div class="print-div"> <div class="print-div">
<el-form <div :class="dialogShow ? 'open-expand' : 'close-expand'">
label-width="170px" <slot></slot>
label-position="left" </div>
size="mini" <div v-show="dialogShow" class="print-content">
:model="printSetting" <el-form
> label-width="170px"
<el-form-item label-width="55px" label="打印机"> label-position="left"
<div class="flex-row"> size="mini"
<el-select v-model="printer" clearable> :model="printSetting"
<el-option >
v-for="(it, i) in printerList" <el-form-item label-width="55px" label="打印机">
:key="i" <div class="flex-row">
:label="it.name" <el-select v-model="printer" clearable>
:value="it.name" <el-option
></el-option> v-for="(it, i) in printerList"
</el-select> :key="i"
<el-button :label="it.name"
title="刷新" :value="it.name"
@click="getPrinter" ></el-option>
style="margin-left: 10px" </el-select>
icon="el-icon-refresh" <el-button
></el-button> title="刷新"
</div> @click="getPrinter"
</el-form-item> style="margin-left: 10px"
<el-form-item label-width="50px" label="预设"> icon="el-icon-refresh"
<div class="flex-row"> ></el-button>
<el-select </div>
@change="printSettingChange" </el-form-item>
filterable <el-form-item label-width="50px" label="预设">
v-model="printSettingVal" <div class="flex-row">
clearable <el-select
> @change="printSettingChange"
<el-option filterable
v-for="(it, i) in printSettingList" v-model="printSettingVal"
:key="i" clearable
:value="i"
:label="it.label"
></el-option>
</el-select>
<div style="margin-left: 15px;display: flex" class="save-btn">
<el-popover
placement="bottom"
width="200"
v-model="showPopover"
trigger="manual"
> >
<el-button <el-option
style="margin-right: 10px" v-for="(it, i) in printSettingList"
@click="openPopover" :key="i"
slot="reference" :value="i"
type="primary" :label="it.label"
></el-option>
</el-select>
<div style="margin-left: 15px;display: flex" class="save-btn">
<el-popover
placement="bottom"
width="200"
v-model="showPopover"
trigger="manual"
>
<el-button
style="margin-right: 10px"
@click="openPopover"
slot="reference"
type="primary"
>保存预设 >保存预设
</el-button> </el-button>
<div class="save-setting"> <div class="save-setting">
<el-input <el-input
size="large" size="large"
maxlength="10" maxlength="10"
v-model="settingName" v-model="settingName"
placeholder="预设名称:" placeholder="预设名称:"
></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 === ''"
size="medium" size="medium"
type="primary" type="primary"
>保存 >保存
</el-button> </el-button>
</div>
</div> </div>
</div> </el-popover>
</el-popover>
<el-button <el-button
:disabled="printSettingVal === 0" :disabled="printSettingVal === 0"
@click="delSetting" @click="delSetting"
type="danger" type="danger"
>删除</el-button >删除
> </el-button>
</div> </div>
</div>
</el-form-item>
<div class="detail-setting">
<div class="setting-left">
<div class="left-block-item">
<b class="setting-title">基本设置</b>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['byInk'] || ''"></div>
</template>
<el-form-item label="油墨选择">
<el-select v-model="printSetting.byInk" clearable>
<el-option
:label="it.label"
:value="i"
:key="i"
v-for="(it, i) in printInkList"
></el-option>
</el-select>
</el-form-item>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bEcoMode'] || ''"></div>
</template>
<el-form-item v-if="printSetting.byInk === 2" label="模式">
<el-select v-model="printSetting.bEcoMode" clearable>
<el-option label="通常" :value="false"></el-option>
<el-option label="白色油墨削减" :value="true"></el-option>
</el-select>
</el-form-item>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bMaterialBlack'] || ''"></div>
</template>
<div v-if="printSetting.byInk === 2">
<el-form-item label="利用底材的黑色">
<el-switch v-model="printSetting.bMaterialBlack"></el-switch>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bMultiple'] || ''"></div>
</template>
<div v-if="printSetting.byInk !== 1">
<el-form-item label="彩色的复合路径打印">
<el-switch v-model="printSetting.bMultiple"></el-switch>
</el-form-item>
</div>
</el-tooltip>
</div> </div>
<div </el-form-item>
class="left-block-item" <div class="detail-setting">
v-if="[0, 3].includes(printSetting.byInk)" <div class="setting-left">
> <div class="left-block-item">
<b class="setting-title">彩色油墨设置</b> <b class="setting-title">基本设置</b>
<el-tooltip placement="left" popper-class="my-popper"> <el-tooltip placement="left" popper-class="my-popper">
<template slot="content"> <template slot="content">
<div v-html="fieldDescription['byInkVolume'] || ''"></div> <div v-html="fieldDescription['byInk'] || ''"></div>
</template> </template>
<div> <el-form-item label="油墨选择">
<el-form-item label="油墨量"> <el-select v-model="printSetting.byInk" clearable>
<div class="flex-row"> <el-option
<el-slider :label="it.label"
:step="1" :value="i"
:min="1" :key="i"
:max="10" v-for="(it, i) in printInkList"
v-model="printSetting.byInkVolume" ></el-option>
></el-slider> </el-select>
<span>{{ printSetting.byInkVolume }}</span>
</div>
</el-form-item> </el-form-item>
</div> </el-tooltip>
</el-tooltip> <el-tooltip placement="left" popper-class="my-popper">
<el-tooltip placement="left" popper-class="my-popper"> <template slot="content">
<template slot="content"> <div v-html="fieldDescription['bEcoMode'] || ''"></div>
<div v-html="fieldDescription['byDoublePrint'] || ''"></div> </template>
</template> <el-form-item v-if="printSetting.byInk === 2" label="模式">
<div> <el-select v-model="printSetting.bEcoMode" clearable>
<el-form-item label="2次打印"> <el-option label="通常" :value="false"></el-option>
<div class="flex-row"> <el-option label="白色油墨削减" :value="true"></el-option>
<el-slider </el-select>
:step="1"
:min="0"
:max="3"
v-model="printSetting.byDoublePrint"
></el-slider>
<span>{{ printSetting.byDoublePrint }}</span>
</div>
</el-form-item> </el-form-item>
</div> </el-tooltip>
</el-tooltip>
</div> <el-tooltip placement="left" popper-class="my-popper">
<div <template slot="content">
class="left-block-item" <div v-html="fieldDescription['bMaterialBlack'] || ''"></div>
v-if="[1, 2].includes(printSetting.byInk)" </template>
> <div v-if="printSetting.byInk === 2">
<b class="setting-title">白色油墨设置</b> <el-form-item label="利用底材的黑色">
<el-tooltip placement="left" popper-class="my-popper"> <el-switch
<template slot="content"> v-model="printSetting.bMaterialBlack"
<div v-html="fieldDescription['byHighlight'] || ''"></div> ></el-switch>
</template> </el-form-item>
<div> </div>
<el-form-item label="高光"> </el-tooltip>
<div class="flex-row">
<el-slider <el-tooltip placement="left" popper-class="my-popper">
:step="1" <template slot="content">
:min="1" <div v-html="fieldDescription['bMultiple'] || ''"></div>
:max="9" </template>
v-model="printSetting.byHighlight" <div v-if="printSetting.byInk !== 1">
></el-slider> <el-form-item label="彩色的复合路径打印">
<span>{{ printSetting.byHighlight }}</span> <el-switch v-model="printSetting.bMultiple"></el-switch>
</div> </el-form-item>
</el-form-item> </div>
</div> </el-tooltip>
</el-tooltip> </div>
<el-tooltip placement="left" popper-class="my-popper"> <div
<template slot="content"> class="left-block-item"
<div v-html="fieldDescription['byMask'] || ''"></div> v-if="[0, 3].includes(printSetting.byInk)"
</template> >
<div> <b class="setting-title">彩色油墨设置</b>
<el-form-item label="遮光"> <el-tooltip placement="left" popper-class="my-popper">
<div class="flex-row"> <template slot="content">
<el-slider <div v-html="fieldDescription['byInkVolume'] || ''"></div>
:step="1" </template>
:min="1" <div>
:max="5" <el-form-item label="油墨量">
v-model="printSetting.byMask" <div class="flex-row">
></el-slider>
<span>{{ printSetting.byMask }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bFastMode'] || ''"></div>
</template>
<div v-if="[2].includes(printSetting.byInk)">
<el-form-item label="白色高速打印">
<el-switch v-model="printSetting.bFastMode"></el-switch>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bDivide'] || ''"></div>
</template>
<div>
<el-form-item label="白色分次打印">
<el-switch v-model="printSetting.bDivide"></el-switch>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bPause'] || ''"></div>
</template>
<div v-if="[2].includes(printSetting.byInk)">
<el-form-item label="白色/彩色个别打印">
<el-switch v-model="printSetting.bPause"></el-switch>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bTransColor'] || ''"></div>
</template>
<div>
<el-form-item label="透明色">
<el-switch v-model="printSetting.bTransColor"></el-switch>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['byChoke'] || ''"></div>
</template>
<div v-if="[2].includes(printSetting.byInk)">
<el-form-item label="白色油墨的削减范围">
<div class="flex-row">
<el-slider
:step="1"
:min="0"
:max="10"
v-model="printSetting.byChoke"
></el-slider>
<span>{{ printSetting.byChoke }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['byMinWhite'] || ''"></div>
</template>
<div v-if="[2].includes(printSetting.byInk)">
<el-form-item label="最小白色油墨量">
<div class="flex-column">
<el-select v-model="printSetting.minWhiteInkType">
<el-option label="通常" :value="0"></el-option>
<el-option label="特殊" :value="1"></el-option>
</el-select>
<div class="slider flex-row">
<el-slider <el-slider
:step="1" :step="1"
:min="1" :min="1"
:max="printSetting.minWhiteInkType === 1 ? 6 : 3" :max="10"
v-model="printSetting.byMinWhite" v-model="printSetting.byInkVolume"
></el-slider> ></el-slider>
<span>{{ printSetting.byMinWhite }}</span> <span>{{ printSetting.byInkVolume }}</span>
</div> </div>
</div> </el-form-item>
</el-form-item> </div>
</div> </el-tooltip>
</el-tooltip> <el-tooltip placement="left" popper-class="my-popper">
</div> <template slot="content">
<div v-show="detailShow" class="left-block-item"> <div v-html="fieldDescription['byDoublePrint'] || ''"></div>
<b class="setting-title">画质设置</b> </template>
<el-tooltip placement="left" popper-class="my-popper"> <div>
<template slot="content"> <el-form-item label="2次打印">
<div v-html="fieldDescription['bySaturation'] || ''"></div> <div class="flex-row">
</template> <el-slider
<div> :step="1"
<el-form-item label="饱和度"> :min="0"
<div class="flex-row"> :max="3"
<el-slider v-model="printSetting.byDoublePrint"
:step="1" ></el-slider>
:min="0" <span>{{ printSetting.byDoublePrint }}</span>
:max="40" </div>
v-model="printSetting.bySaturation" </el-form-item>
></el-slider> </div>
<span>{{ printSetting.bySaturation }}</span> </el-tooltip>
</div> </div>
</el-form-item> <div
</div> class="left-block-item"
</el-tooltip> v-if="[1, 2].includes(printSetting.byInk)"
<el-tooltip placement="left" popper-class="my-popper"> >
<template slot="content"> <b class="setting-title">白色油墨设置</b>
<div v-html="fieldDescription['byBrightness'] || ''"></div> <el-tooltip placement="left" popper-class="my-popper">
</template> <template slot="content">
<div> <div v-html="fieldDescription['byHighlight'] || ''"></div>
<el-form-item label="亮度"> </template>
<div class="flex-row"> <div>
<el-slider <el-form-item label="高光">
:step="1" <div class="flex-row">
:min="0" <el-slider
:max="40" :step="1"
v-model="printSetting.byBrightness" :min="1"
></el-slider> :max="9"
<span>{{ printSetting.byBrightness }}</span> v-model="printSetting.byHighlight"
</div> ></el-slider>
</el-form-item> <span>{{ printSetting.byHighlight }}</span>
</div> </div>
</el-tooltip> </el-form-item>
<el-tooltip placement="left" popper-class="my-popper"> </div>
<template slot="content"> </el-tooltip>
<div v-html="fieldDescription['byContrast'] || ''"></div> <el-tooltip placement="left" popper-class="my-popper">
</template> <template slot="content">
<div> <div v-html="fieldDescription['byMask'] || ''"></div>
<el-form-item label="对比度"> </template>
<div class="flex-row"> <div>
<el-slider <el-form-item label="遮光">
:step="1" <div class="flex-row">
:min="0" <el-slider
:max="40" :step="1"
v-model="printSetting.byContrast" :min="1"
></el-slider> :max="5"
<span>{{ printSetting.byContrast }}</span> v-model="printSetting.byMask"
</div> ></el-slider>
</el-form-item> <span>{{ printSetting.byMask }}</span>
</div> </div>
</el-tooltip> </el-form-item>
</div>
<el-tooltip placement="left" popper-class="my-popper"> </el-tooltip>
<template slot="content">
<div v-html="fieldDescription['bUniPrint'] || ''"></div> <el-tooltip placement="left" popper-class="my-popper">
</template> <template slot="content">
<div v-if="[1].includes(printSetting.byInk)"> <div v-html="fieldDescription['bFastMode'] || ''"></div>
<el-form-item label="单向打印"> </template>
<el-switch v-model="printSetting.bUniPrint"></el-switch> <div v-if="[2].includes(printSetting.byInk)">
</el-form-item> <el-form-item label="白色高速打印">
</div> <el-switch v-model="printSetting.bFastMode"></el-switch>
</el-tooltip> </el-form-item>
</div> </div>
<div </el-tooltip>
v-if="detailShow && ![1].includes(printSetting.byInk)" <el-tooltip placement="left" popper-class="my-popper">
class="left-block-item" <template slot="content">
> <div v-html="fieldDescription['bDivide'] || ''"></div>
<b class="setting-title">彩色平衡</b> </template>
<el-tooltip placement="left" popper-class="my-popper"> <div>
<template slot="content"> <el-form-item label="白色分次打印">
<div v-html="fieldDescription['iCyanBalance'] || ''"></div> <el-switch v-model="printSetting.bDivide"></el-switch>
</template> </el-form-item>
<div v-if="![3].includes(printSetting.byInk)"> </div>
<el-form-item label="青色"> </el-tooltip>
<div class="flex-row"> <el-tooltip placement="left" popper-class="my-popper">
<el-slider <template slot="content">
:step="1" <div v-html="fieldDescription['bPause'] || ''"></div>
:min="-5" </template>
:max="5" <div v-if="[2].includes(printSetting.byInk)">
v-model="printSetting.iCyanBalance" <el-form-item label="白色/彩色个别打印">
></el-slider> <el-switch v-model="printSetting.bPause"></el-switch>
<span>{{ printSetting.iCyanBalance }}</span> </el-form-item>
</div> </div>
</el-form-item> </el-tooltip>
</div> <el-tooltip placement="left" popper-class="my-popper">
</el-tooltip> <template slot="content">
<el-tooltip placement="left" popper-class="my-popper"> <div v-html="fieldDescription['bTransColor'] || ''"></div>
<template slot="content"> </template>
<div v-html="fieldDescription['iMagentaBalance'] || ''"></div> <div>
</template> <el-form-item label="透明色">
<div v-if="![3].includes(printSetting.byInk)"> <el-switch v-model="printSetting.bTransColor"></el-switch>
<el-form-item label="红色"> </el-form-item>
<div class="flex-row"> </div>
<el-slider </el-tooltip>
:step="1" <el-tooltip placement="left" popper-class="my-popper">
:min="-5" <template slot="content">
:max="5" <div v-html="fieldDescription['byChoke'] || ''"></div>
v-model="printSetting.iMagentaBalance" </template>
></el-slider> <div v-if="[2].includes(printSetting.byInk)">
<span>{{ printSetting.iMagentaBalance }}</span> <el-form-item label="白色油墨的削减范围">
</div> <div class="flex-row">
</el-form-item> <el-slider
</div> :step="1"
</el-tooltip> :min="0"
<el-tooltip placement="left" popper-class="my-popper"> :max="10"
<template slot="content"> v-model="printSetting.byChoke"
<div v-html="fieldDescription['iYellowBalance'] || ''"></div> ></el-slider>
</template> <span>{{ printSetting.byChoke }}</span>
<div v-if="![3].includes(printSetting.byInk)"> </div>
<el-form-item label="黄色"> </el-form-item>
<div class="flex-row"> </div>
<el-slider </el-tooltip>
:step="1" <el-tooltip placement="left" popper-class="my-popper">
:min="-5" <template slot="content">
:max="5" <div v-html="fieldDescription['byMinWhite'] || ''"></div>
v-model="printSetting.iYellowBalance" </template>
></el-slider> <div v-if="[2].includes(printSetting.byInk)">
<span>{{ printSetting.iYellowBalance }}</span> <el-form-item label="最小白色油墨量">
</div> <div class="flex-column">
</el-form-item> <el-select v-model="printSetting.minWhiteInkType">
</div> <el-option label="通常" :value="0"></el-option>
</el-tooltip> <el-option label="特殊" :value="1"></el-option>
<el-tooltip placement="left" popper-class="my-popper"> </el-select>
<template slot="content"> <div class="slider flex-row">
<div v-html="fieldDescription['iBlackBalance'] || ''"></div> <el-slider
</template> :step="1"
<div> :min="1"
<el-form-item label="黑色"> :max="printSetting.minWhiteInkType === 1 ? 6 : 3"
<div class="flex-row"> v-model="printSetting.byMinWhite"
<el-slider ></el-slider>
:step="1" <span>{{ printSetting.byMinWhite }}</span>
:min="-5" </div>
:max="5" </div>
v-model="printSetting.iBlackBalance" </el-form-item>
></el-slider> </div>
<span>{{ printSetting.iBlackBalance }}</span> </el-tooltip>
</div> </div>
</el-form-item> <div v-show="detailShow" class="left-block-item">
</div> <b class="setting-title">画质设置</b>
</el-tooltip> <el-tooltip placement="left" popper-class="my-popper">
<el-tooltip placement="left" popper-class="my-popper"> <template slot="content">
<template slot="content"> <div v-html="fieldDescription['bySaturation'] || ''"></div>
<div v-html="fieldDescription['bUniPrint'] || ''"></div> </template>
</template> <div>
<div> <el-form-item label="饱和度">
<el-form-item label="单向打印"> <div class="flex-row">
<el-switch v-model="printSetting.bUniPrint"></el-switch> <el-slider
</el-form-item> :step="1"
</div> :min="0"
</el-tooltip> :max="40"
</div> v-model="printSetting.bySaturation"
<el-button size="small" @click="setDetailShow" ></el-slider>
<span>{{ printSetting.bySaturation }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['byBrightness'] || ''"></div>
</template>
<div>
<el-form-item label="亮度">
<div class="flex-row">
<el-slider
:step="1"
:min="0"
:max="40"
v-model="printSetting.byBrightness"
></el-slider>
<span>{{ printSetting.byBrightness }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['byContrast'] || ''"></div>
</template>
<div>
<el-form-item label="对比度">
<div class="flex-row">
<el-slider
:step="1"
:min="0"
:max="40"
v-model="printSetting.byContrast"
></el-slider>
<span>{{ printSetting.byContrast }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bUniPrint'] || ''"></div>
</template>
<div v-if="[1].includes(printSetting.byInk)">
<el-form-item label="单向打印">
<el-switch v-model="printSetting.bUniPrint"></el-switch>
</el-form-item>
</div>
</el-tooltip>
</div>
<div
v-if="detailShow && ![1].includes(printSetting.byInk)"
class="left-block-item"
>
<b class="setting-title">彩色平衡</b>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['iCyanBalance'] || ''"></div>
</template>
<div v-if="![3].includes(printSetting.byInk)">
<el-form-item label="青色">
<div class="flex-row">
<el-slider
:step="1"
:min="-5"
:max="5"
v-model="printSetting.iCyanBalance"
></el-slider>
<span>{{ printSetting.iCyanBalance }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['iMagentaBalance'] || ''"></div>
</template>
<div v-if="![3].includes(printSetting.byInk)">
<el-form-item label="红色">
<div class="flex-row">
<el-slider
:step="1"
:min="-5"
:max="5"
v-model="printSetting.iMagentaBalance"
></el-slider>
<span>{{ printSetting.iMagentaBalance }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['iYellowBalance'] || ''"></div>
</template>
<div v-if="![3].includes(printSetting.byInk)">
<el-form-item label="黄色">
<div class="flex-row">
<el-slider
:step="1"
:min="-5"
:max="5"
v-model="printSetting.iYellowBalance"
></el-slider>
<span>{{ printSetting.iYellowBalance }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['iBlackBalance'] || ''"></div>
</template>
<div>
<el-form-item label="黑色">
<div class="flex-row">
<el-slider
:step="1"
:min="-5"
:max="5"
v-model="printSetting.iBlackBalance"
></el-slider>
<span>{{ printSetting.iBlackBalance }}</span>
</div>
</el-form-item>
</div>
</el-tooltip>
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['bUniPrint'] || ''"></div>
</template>
<div>
<el-form-item label="单向打印">
<el-switch v-model="printSetting.bUniPrint"></el-switch>
</el-form-item>
</div>
</el-tooltip>
</div>
<el-button size="small" @click="setDetailShow"
>{{ detailShow ? "关闭详细设置" : "打开详细设置" }}... >{{ detailShow ? "关闭详细设置" : "打开详细设置" }}...
</el-button> </el-button>
</div>
</div>
</el-form>
<div class="bottom-info flex-row">
<div class="info">
<el-tooltip placement="left" popper-class="my-popper">
<template slot="content">
<div v-html="fieldDescription['printTime'] || ''"></div>
</template>
<div class="info-item">
<span>打印时间</span>
<b>×{{ defaultTime }}</b>
</div> </div>
</el-tooltip> </div>
<el-tooltip placement="left" popper-class="my-popper"> </el-form>
<template slot="content"> <div class="bottom-info flex-row">
<div v-html="fieldDescription['whiteInk'] || ''"></div> <div class="info">
</template> <el-tooltip placement="left" popper-class="my-popper">
<div class="info-item"> <template slot="content">
<span>白色油墨量</span> <div v-html="fieldDescription['printTime'] || ''"></div>
<b>{{ inkNum }}%</b> </template>
</div> <div class="info-item">
</el-tooltip> <span>打印时间</span>
</div> <b>×{{ defaultTime }}</b>
<div class="btn"> </div>
<el-input </el-tooltip>
size="small" <el-tooltip placement="left" popper-class="my-popper">
style="width: 100px;" <template slot="content">
oninput="value=value.replace(/[^\-?\d]/g,'')" <div v-html="fieldDescription['whiteInk'] || ''"></div>
v-model="printSetting.printNum" </template>
></el-input> <div class="info-item">
<span>白色油墨量</span>
<span></span> <b>{{ inkNum }}%</b>
</div>
</el-tooltip>
</div>
<div class="btn">
<el-input
size="small"
style="width: 100px;"
oninput="value=value.replace(/[^\-?\d]/g,'')"
v-model="printSetting.printNum"
></el-input>
<span></span>
</div>
</div> </div>
<el-button
@click="getPrintCmd"
type="primary"
style="width: 100%;height: 50px"
>打印
</el-button>
</div> </div>
<el-button
@click="getPrintCmd"
type="primary"
style="width: 100%;height: 50px"
>打印</el-button
>
</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);
width: 430px;
.print-content {
background: #ececec;
border-left: 1px solid gray;
height: 100%;
padding: 10px;
display: flex;
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>
......
...@@ -20,7 +20,12 @@ export default { ...@@ -20,7 +20,12 @@ export default {
computed: { computed: {
gridWH() { gridWH() {
if (!this.systemSetting || !this.grid || !this.grid[this.systemSetting.gridValue]) return { w: 0, h: 0, v: 1 }; if (
!this.systemSetting ||
!this.grid ||
!this.grid[this.systemSetting.gridValue]
)
return { w: 0, h: 0, v: 1 };
return { return {
w: this.grid[this.systemSetting.gridValue].w, w: this.grid[this.systemSetting.gridValue].w,
v: this.grid[this.systemSetting.gridValue].value, v: this.grid[this.systemSetting.gridValue].value,
...@@ -30,7 +35,10 @@ export default { ...@@ -30,7 +35,10 @@ export default {
gridSpacing() { gridSpacing() {
if (!this.systemSetting) return { w: 0, h: 0 }; if (!this.systemSetting) return { w: 0, h: 0 };
if (this.systemSetting.unit === "mm") { if (this.systemSetting.unit === "mm") {
return { w: this.systemSetting.gridSpacing + "px", h: this.systemSetting.gridSpacing + "px" }; return {
w: this.systemSetting.gridSpacing + "px",
h: this.systemSetting.gridSpacing + "px"
};
} else if (this.systemSetting.unit === "inch") { } else if (this.systemSetting.unit === "inch") {
console.log(this.systemSetting.gridValue); console.log(this.systemSetting.gridValue);
let w = this.grid[this.systemSetting.gridValue].w; let w = this.grid[this.systemSetting.gridValue].w;
...@@ -39,10 +47,9 @@ export default { ...@@ -39,10 +47,9 @@ export default {
let h = this.grid[this.systemSetting.gridValue].h; let h = this.grid[this.systemSetting.gridValue].h;
return { return {
w: this.systemSetting.gridSpacing * ((w - row + 1) / row) + "px", w: this.systemSetting.gridSpacing * ((w - row + 1) / row) + "px",
h: this.systemSetting.gridSpacing * ((h) / col) + "px" h: this.systemSetting.gridSpacing * (h / col) + "px"
}; };
} }
}, },
computedGridSize() { computedGridSize() {
const getter = this.systemSetting; const getter = this.systemSetting;
...@@ -54,18 +61,16 @@ export default { ...@@ -54,18 +61,16 @@ export default {
if (this.selectIndex < 0) { if (this.selectIndex < 0) {
this.showImgSetting = false; this.showImgSetting = false;
return null; return null;
} }
let item = this.imgList[this.selectIndex]; let item = this.imgList[this.selectIndex];
if (item) { if (item) {
item = JSON.parse(JSON.stringify(item)); item = JSON.parse(JSON.stringify(item));
item.x = Number(item.x) - Number(item.w); item.x = Number(item.x) - Number(item.w);
item.y = Number(item.y) + (Number(item.h) / 2); item.y = Number(item.y) + Number(item.h) / 2;
return JSON.parse(JSON.stringify(this.imgList[this.selectIndex])); return JSON.parse(JSON.stringify(this.imgList[this.selectIndex]));
} }
this.showImgSetting = false; this.showImgSetting = false;
return null; return null;
} }
}, },
data() { data() {
...@@ -78,6 +83,7 @@ export default { ...@@ -78,6 +83,7 @@ export default {
bus: 0, bus: 0,
grid, grid,
showImgSetting: false, showImgSetting: false,
printDialogShow: true,
parentHeight: 0, parentHeight: 0,
width: 0, width: 0,
selectIndex: -1, selectIndex: -1,
...@@ -101,8 +107,11 @@ export default { ...@@ -101,8 +107,11 @@ export default {
let dom = document.getElementsByClassName("drr"); let dom = document.getElementsByClassName("drr");
this.imgList.forEach((el, i) => { this.imgList.forEach((el, i) => {
let dom_i = document.getElementsByClassName("drr")[i]; let dom_i = document.getElementsByClassName("drr")[i];
dom_i.style.zIndex = dom_i.style.zIndex === "" || !dom_i.style.zIndex ? 0 : dom_i.style.zIndex; dom_i.style.zIndex =
dom[i].addEventListener("click", (e) => { dom_i.style.zIndex === "" || !dom_i.style.zIndex
? 0
: dom_i.style.zIndex;
dom[i].addEventListener("click", e => {
this.selectIndex = i; this.selectIndex = i;
this.selectItem(i); this.selectItem(i);
}); });
...@@ -125,6 +134,9 @@ export default { ...@@ -125,6 +134,9 @@ export default {
} }
}, },
methods: { methods: {
changePrintDialogShow() {
this.printDialogShow = !this.printDialogShow;
},
async drop(e) { async drop(e) {
let that = this; let that = this;
e.stopPropagation(); e.stopPropagation();
...@@ -164,30 +176,44 @@ export default { ...@@ -164,30 +176,44 @@ export default {
this.imgList = JSON.parse(JSON.stringify(this.imgHistoryList[i])); this.imgList = JSON.parse(JSON.stringify(this.imgHistoryList[i]));
this.imgHistoryIndex = this.imgHistoryIndex + 1; this.imgHistoryIndex = this.imgHistoryIndex + 1;
} }
} }
if (this.selectIndex >= 0) { if (this.selectIndex >= 0) {
if (e.keyCode === 38) { if (e.keyCode === 38) {
//上 //上
this.$set(this.imgList[this.selectIndex], "y", Number(this.imgList[this.selectIndex].y) - 1); this.$set(
this.imgList[this.selectIndex],
"y",
Number(this.imgList[this.selectIndex].y) - 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
} }
if (e.keyCode === 40) { if (e.keyCode === 40) {
//下 //下
this.$set(this.imgList[this.selectIndex], "y", Number(this.imgList[this.selectIndex].y) + 1); this.$set(
this.imgList[this.selectIndex],
"y",
Number(this.imgList[this.selectIndex].y) + 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
} }
if (e.keyCode === 37) { if (e.keyCode === 37) {
//左 //左
this.$set(this.imgList[this.selectIndex], "x", Number(this.imgList[this.selectIndex].x) - 1); this.$set(
this.imgList[this.selectIndex],
"x",
Number(this.imgList[this.selectIndex].x) - 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
} }
if (e.keyCode === 39) { if (e.keyCode === 39) {
//右 //右
this.$set(this.imgList[this.selectIndex], "x", Number(this.imgList[this.selectIndex].x) + 1); this.$set(
this.imgList[this.selectIndex],
"x",
Number(this.imgList[this.selectIndex].x) + 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
} }
} }
if (e.keyCode === 8) { if (e.keyCode === 8) {
if (this.selectIndex >= 0) { if (this.selectIndex >= 0) {
...@@ -197,7 +223,6 @@ export default { ...@@ -197,7 +223,6 @@ export default {
} else { } else {
this.selectIndex = -1; this.selectIndex = -1;
} }
} }
} }
}, },
...@@ -233,7 +258,6 @@ export default { ...@@ -233,7 +258,6 @@ export default {
return mm1.width; return mm1.width;
}, },
selectImg(it, i) { selectImg(it, i) {
// this.selectImgIndexList.push(i) // this.selectImgIndexList.push(i)
// this.selectImgIndexList = Array.from(new Set(this.selectImgIndexList)) // this.selectImgIndexList = Array.from(new Set(this.selectImgIndexList))
this.getBackFile([it], file => { this.getBackFile([it], file => {
...@@ -248,7 +272,8 @@ export default { ...@@ -248,7 +272,8 @@ export default {
let w = document.getElementById("line").clientWidth / 2; let w = document.getElementById("line").clientWidth / 2;
let h = document.getElementById("line").clientHeight / 2; let h = document.getElementById("line").clientHeight / 2;
let dom = document.getElementsByClassName("drr")[this.selectIndex]; let dom = document.getElementsByClassName("drr")[this.selectIndex];
let z_index = dom.style.zIndex === "" || !dom.style.zIndex ? 0 : dom.style.zIndex; let z_index =
dom.style.zIndex === "" || !dom.style.zIndex ? 0 : dom.style.zIndex;
switch (type) { switch (type) {
case "center": case "center":
this.$set(this.imgList[this.selectIndex], "x", Number(w)); this.$set(this.imgList[this.selectIndex], "x", Number(w));
...@@ -264,16 +289,23 @@ export default { ...@@ -264,16 +289,23 @@ export default {
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
break; break;
case "add_index": case "add_index":
dom.style.zIndex = Number(z_index) + 1; dom.style.zIndex = Number(z_index) + 1;
console.log(dom.style.zIndex); console.log(dom.style.zIndex);
this.$set(this.imgList[this.selectIndex], "zIndex", this.imgList[this.selectIndex].zIndex + 1); this.$set(
this.imgList[this.selectIndex],
"zIndex",
this.imgList[this.selectIndex].zIndex + 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
break; break;
case "reduce_index": case "reduce_index":
dom.style.zIndex = Number(z_index) - 1; dom.style.zIndex = Number(z_index) - 1;
console.log(dom.style.zIndex); console.log(dom.style.zIndex);
this.$set(this.imgList[this.selectIndex], "zIndex", this.imgList[this.selectIndex].zIndex - 1); this.$set(
this.imgList[this.selectIndex],
"zIndex",
this.imgList[this.selectIndex].zIndex - 1
);
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
break; break;
default: default:
...@@ -299,12 +331,9 @@ export default { ...@@ -299,12 +331,9 @@ export default {
close() { close() {
this.showImgSetting = false; this.showImgSetting = false;
}, },
onDragDebounce(left, top, item, index) { onDragDebounce(left, top, item, index) {},
},
dragStop(data, item) { dragStop(data, item) {
this.$set(item, "y", data.y); this.$set(item, "y", data.y);
this.$set(item, "x", data.x); this.$set(item, "x", data.x);
// console.log(left, top) // console.log(left, top)
...@@ -340,23 +369,24 @@ export default { ...@@ -340,23 +369,24 @@ export default {
// this.$store.commit('changeActionList', this.actionList) // this.$store.commit('changeActionList', this.actionList)
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
}, },
resizing(index) { resizing(index) {},
},
rotating(data, item) { rotating(data, item) {
console.log(data); console.log(data);
this.$set(item, "r", data.angle.toFixed(2)); this.$set(item, "r", data.angle.toFixed(2));
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList)));
}, },
outsideClick(e) { outsideClick(e) {
if (!(e.target.className.includes("drr") || e.target.className.includes("sucaitu-img"))) { if (
!(
e.target.className.includes("drr") ||
e.target.className.includes("sucaitu-img")
)
) {
this.selectIndex = -1; this.selectIndex = -1;
this.close(); this.close();
} }
}, },
selectItem(index) { selectItem(index) {
let dom = document.getElementsByClassName("drr"); let dom = document.getElementsByClassName("drr");
for (let i = 0; i < dom.length; i++) { for (let i = 0; i < dom.length; i++) {
if (index !== i) { if (index !== i) {
...@@ -432,7 +462,6 @@ export default { ...@@ -432,7 +462,6 @@ export default {
}); });
}); });
} }
}, },
addFile(file, callback) { addFile(file, callback) {
let that = this; let that = this;
...@@ -503,15 +532,17 @@ export default { ...@@ -503,15 +532,17 @@ export default {
let newB = parseInt("0x" + color.substr(5, 2)); let newB = parseInt("0x" + color.substr(5, 2));
//图片加载后进行处理 //图片加载后进行处理
img.onload = function() { img.onload = function() {
let width = img.width,
let width = img.width, height = img.height, canvas = document.createElement("canvas"), height = img.height,
canvas = document.createElement("canvas"),
ctx = canvas.getContext("2d"); ctx = canvas.getContext("2d");
canvas.width = width; canvas.width = width;
canvas.height = height; canvas.height = height;
// 将源图片复制到画布上 // 将源图片复制到画布上
ctx.drawImage(img, 0, 0, width, height); ctx.drawImage(img, 0, 0, width, height);
// 获取画布的像素信息 // 获取画布的像素信息
let imageData = ctx.getImageData(0, 0, width, height), data = imageData.data; let imageData = ctx.getImageData(0, 0, width, height),
data = imageData.data;
// 对像素集合中的单个像素进行循环,每个像素是由4个通道组成,所以要注意 // 对像素集合中的单个像素进行循环,每个像素是由4个通道组成,所以要注意
let i = 0; let i = 0;
while (i < data.length) { while (i < data.length) {
...@@ -546,7 +577,7 @@ export default { ...@@ -546,7 +577,7 @@ export default {
mounted() { mounted() {
this.imgHeight = window.screen.height + "px"; this.imgHeight = window.screen.height + "px";
this.systemSetting = this.$dataStore.get("setting"); this.systemSetting = this.$dataStore.get("setting");
bus.$on("busEmit", (v) => { bus.$on("busEmit", v => {
let { type, value } = v; let { type, value } = v;
switch (type) { switch (type) {
case "grid": case "grid":
...@@ -557,7 +588,7 @@ export default { ...@@ -557,7 +588,7 @@ export default {
this.indexChange(value); this.indexChange(value);
break; break;
case "bg": case "bg":
this.changeImageColor(value, (res) => { this.changeImageColor(value, res => {
this.img = res; this.img = res;
}); });
break; break;
...@@ -580,7 +611,9 @@ export default { ...@@ -580,7 +611,9 @@ export default {
this.selectImgList = value; this.selectImgList = value;
this.selectImgIndex = 0; this.selectImgIndex = 0;
this.getBackFile([value[0]], file => { this.getBackFile([value[0]], file => {
this.imgHistoryList.push(JSON.parse(JSON.stringify(this.imgList))); this.imgHistoryList.push(
JSON.parse(JSON.stringify(this.imgList))
);
}); });
// this.addFile([value[0].file]) // this.addFile([value[0].file])
} }
...@@ -593,10 +626,7 @@ export default { ...@@ -593,10 +626,7 @@ export default {
document.addEventListener("keyup", this.keyup); document.addEventListener("keyup", this.keyup);
this.$nextTick(() => { this.$nextTick(() => {
this.listenUpload(); this.listenUpload();
}); });
} }
}; };
</script> </script>
...@@ -605,18 +635,23 @@ export default { ...@@ -605,18 +635,23 @@ export default {
<div class="page-main"> <div class="page-main">
<div @click="outsideClick" class="main-bg"> <div @click="outsideClick" class="main-bg">
<div class="container"> <div class="container">
<div class="select-img" v-if="selectImgList.length>1"> <div class="select-img" v-if="selectImgList.length > 1">
<div @click="selectImg(it,i)" v-for="(it,i) in selectImgList" <div
:key="i" @click="selectImg(it, i)"
class="img-item"> v-for="(it, i) in selectImgList"
:key="i"
class="img-item"
>
<img style="width: 100px;height: auto;" :src="it.productionFile" /> <img style="width: 100px;height: auto;" :src="it.productionFile" />
<span>{{ it.designId }}</span> <span>{{ it.designId }}</span>
</div> </div>
</div> </div>
<div :style="{height:imgHeight}" id="img"> <div :style="{ height: imgHeight }" id="img">
<div id="line"> <div id="line">
<div class="sucaitu" <div
:style="{width:gridWH.w+'px',height:gridWH.h+'px'}"> class="sucaitu"
:style="{ width: gridWH.w + 'px', height: gridWH.h + 'px' }"
>
<vue-drag-resize-rotate <vue-drag-resize-rotate
:w="item.w" :w="item.w"
class-name="my-drag-resize-rotate" class-name="my-drag-resize-rotate"
...@@ -625,49 +660,87 @@ export default { ...@@ -625,49 +660,87 @@ export default {
:x="item.x" :x="item.x"
:z="item.zIndex" :z="item.zIndex"
:aspectRatio="true" :aspectRatio="true"
:isActive="index===selectIndex" :isActive="index === selectIndex"
:y="item.y" :y="item.y"
v-for="(item,index) in imgList" v-for="(item, index) in imgList"
:key="index" :key="index"
:draggable="true" :draggable="true"
:resizable="true" :resizable="true"
:rotatable="true" :rotatable="true"
@dragstop="(a)=>dragStop(a,item)" @dragstop="a => dragStop(a, item)"
@resizestop="(a)=>resizeStop(a,item)" @resizestop="a => resizeStop(a, item)"
@rotatestop="(a)=>rotating(a,item)" @rotatestop="a => rotating(a, item)"
:angle="item.r" :angle="item.r"
> >
<div ref="sucaitu-img" <div
:class="{'active': index === selectIndex}" ref="sucaitu-img"
:style="{zIndex: item.zIndex}" :class="{ active: index === selectIndex }"
class="sucaitu-img img element"> :style="{ zIndex: item.zIndex }"
<img crossOrigin="anonymous" :src="item.url" alt="" class="sucaitu-img"> class="sucaitu-img img element"
<i @click="delImg(index)" v-if="index===selectIndex" class=" close el-icon-close"></i> >
<div v-if="index===selectIndex" class="control-point control-rotator"></div> <img
crossOrigin="anonymous"
:src="item.url"
alt=""
class="sucaitu-img"
/>
<i
@click="delImg(index)"
v-if="index === selectIndex"
class=" close el-icon-close"
></i>
<div
v-if="index === selectIndex"
class="control-point control-rotator"
></div>
</div> </div>
</vue-drag-resize-rotate> </vue-drag-resize-rotate>
</div> </div>
<div v-if="systemSetting.gridShow===1" <div
:style="{width:gridWH.w+'px',height:gridWH.h+'px'}" v-if="systemSetting.gridShow === 1"
class="grid"> :style="{ width: gridWH.w + 'px', height: gridWH.h + 'px' }"
<div :style="{height:gridSpacing.h,lineHeight:gridSpacing.h}" class="grid-row" v-for="it in 100" class="grid"
:key="it"> >
<div :style="{width:gridSpacing.w,height:gridSpacing.h}" <div
class="grid-col" v-for="it in 100" :key="it"> :style="{ height: gridSpacing.h, lineHeight: gridSpacing.h }"
class="grid-row"
</div> v-for="it in 100"
:key="it"
>
<div
:style="{ width: gridSpacing.w, height: gridSpacing.h }"
class="grid-col"
v-for="it in 100"
:key="it"
></div>
</div> </div>
</div> </div>
</div> </div>
<img class="template-img" draggable="false" :src="img" alt=""> <img class="template-img" draggable="false" :src="img" alt="" />
</div> </div>
<print-dialog :imgList="imgList" :byPlatenSize="gridWH.v" /> <print-dialog
:visible="printDialogShow"
:imgList="imgList"
:byPlatenSize="gridWH.v"
>
<i
@click="changePrintDialogShow"
:class="
!printDialogShow ? 'el-icon-arrow-left' : 'el-icon-arrow-right'
"
></i>
</print-dialog>
</div> </div>
</div> </div>
<img-setting @ev="ev" @change="formChange" :item="returnItem" @close="close" <img-setting
:visible="showImgSetting"></img-setting> @ev="ev"
@change="formChange"
:item="returnItem"
@close="close"
:visible="showImgSetting"
>
</img-setting>
</div> </div>
</template> </template>
...@@ -678,19 +751,23 @@ export default { ...@@ -678,19 +751,23 @@ export default {
overflow: hidden; overflow: hidden;
box-sizing: border-box; box-sizing: border-box;
} }
.main-bg { .main-bg {
height: 100%; height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
#line { #line {
position: absolute; position: absolute;
z-index: 2; z-index: 2;
} }
.grid { .grid {
border: 1px solid gray; border: 1px solid gray;
overflow: hidden; overflow: hidden;
.grid-row { .grid-row {
.grid-col { .grid-col {
display: inline-block; display: inline-block;
...@@ -700,28 +777,33 @@ export default { ...@@ -700,28 +777,33 @@ export default {
} }
} }
} }
.grid-row { .grid-row {
width: 100%; width: 100%;
overflow: hidden; overflow: hidden;
height: 10px; height: 10px;
line-height: 10px; line-height: 10px;
white-space: nowrap; white-space: nowrap;
&:nth-of-type(1) { &:nth-of-type(1) {
.grid-col { .grid-col {
border-top: none !important; border-top: none !important;
} }
} }
&:nth-last-of-type(1) { &:nth-last-of-type(1) {
.grid-col { .grid-col {
border-bottom: none !important; border-bottom: none !important;
} }
} }
.grid-col { .grid-col {
&:nth-of-type(1) { &:nth-of-type(1) {
border-left: none !important; border-left: none !important;
} }
} }
} }
#img { #img {
position: absolute; position: absolute;
z-index: 1; z-index: 1;
...@@ -731,12 +813,14 @@ export default { ...@@ -731,12 +813,14 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
width: auto; width: auto;
img { img {
pointer-events: none; pointer-events: none;
width: auto; width: auto;
height: 100%; height: 100%;
} }
} }
.container { .container {
display: flex; display: flex;
width: 100%; width: 100%;
...@@ -745,6 +829,7 @@ export default { ...@@ -745,6 +829,7 @@ export default {
align-items: center; align-items: center;
position: relative; position: relative;
} }
.sucaitu { .sucaitu {
position: absolute; position: absolute;
z-index: 0; z-index: 0;
...@@ -753,10 +838,12 @@ export default { ...@@ -753,10 +838,12 @@ export default {
//justify-content: center; //justify-content: center;
//align-items: center; //align-items: center;
height: 100%; height: 100%;
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.close { .close {
position: absolute; position: absolute;
top: -11px; top: -11px;
...@@ -772,6 +859,7 @@ export default { ...@@ -772,6 +859,7 @@ export default {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
.img { .img {
height: fit-content; height: fit-content;
width: 100%; width: 100%;
...@@ -780,6 +868,7 @@ export default { ...@@ -780,6 +868,7 @@ export default {
border: 1px dashed transparent; border: 1px dashed transparent;
} }
} }
.select-img { .select-img {
border-color: #409eff; border-color: #409eff;
width: 120px; width: 120px;
...@@ -794,17 +883,22 @@ export default { ...@@ -794,17 +883,22 @@ export default {
bottom: 0; bottom: 0;
border-right: 1px solid #ececec; border-right: 1px solid #ececec;
} }
img { img {
user-select: none; user-select: none;
user-drag: none; user-drag: none;
} }
::v-deep .active, .active {
::v-deep .active,
.active {
border-color: #66b1ff !important; border-color: #66b1ff !important;
} }
.select-img-index { .select-img-index {
box-sizing: border-box; box-sizing: border-box;
border-color: #409eff !important; border-color: #409eff !important;
} }
.img-item { .img-item {
padding: 5px; padding: 5px;
display: flex; display: flex;
...@@ -814,15 +908,16 @@ img { ...@@ -814,15 +908,16 @@ img {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
span { span {
margin: 5px 0; margin: 5px 0;
color: white; color: white;
} }
} }
.sucaitu-img { .sucaitu-img {
position: relative; position: relative;
} }
</style> </style>
<style> <style>
.el-upload { .el-upload {
...@@ -841,7 +936,8 @@ img { ...@@ -841,7 +936,8 @@ img {
border-color: transparent; border-color: transparent;
} }
.handle-rot::before, .handle-rot::after { .handle-rot::before,
.handle-rot::after {
display: none; display: none;
} }
</style> </style>
\ No newline at end of file
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