Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
electron-printer
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhuzhequan
electron-printer
Commits
f487e64e
Commit
f487e64e
authored
Apr 28, 2025
by
zhuzhequan
Browse files
Options
Browse Files
Download
Plain Diff
添加自动打印逻辑
parents
259b924d
ee10b4cf
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
278 additions
and
104 deletions
+278
-104
.gitignore
+2
-1
config/env.json
+0
-0
logs/2025-04-28/api.log
+48
-0
src/background.js
+33
-19
src/server/entity/function.js
+3
-3
src/store/index.js
+12
-0
src/utils/axios.js
+9
-8
src/views/design/data.js
+6
-4
src/views/design/head/index.vue
+59
-5
src/views/design/head/printDialog.vue
+12
-9
src/views/design/main/imgSetting.vue
+94
-55
src/views/design/main/index.vue
+0
-0
No files found.
.gitignore
View file @
f487e64e
...
...
@@ -25,7 +25,7 @@ yarn-error.log*
/dist_electron
# 排除 print/Input 目录下的 .bat 文件
!/print/Input/*.bat
/print/Input/*.png
print/Profile/*
/logs
\ No newline at end of file
config/env.json
View file @
f487e64e
logs/2025-04-28/api.log
View file @
f487e64e
...
...
@@ -250,3 +250,51 @@
状态码 :200
data :{"code":200,"data":false,"message":"操作成功"}
[2025-04-28T17:02:14.737] [INFO] log -
时间:2025-04-28 17:02:14
ip : ::1
host : localhost:3000
响应时间 : 0.236 s
method :GET
url :/checkUpdate?version=1.0.8
token :eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzeXNVc2VyIjp7ImlkIjo0NiwiYWNjb3VudCI6IjEyMzQ1NiIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdXBwZXJNYXJrIjoxLCJmYWN0b3J5SWQiOjMzLCJmYWN0b3J5Q29kZSI6IlQzNCIsInN0YXR1cyI6MSwiZmFjdG9yeSI6eyJpZCI6MzMsImJpYW5tYSI6IlQzNCIsInRpdGxlIjoiVDM0NjYiLCJ0eXBlSWQiOjE2LCJuYW1lIjoiMTIzIiwibW9iaWxlIjoiMTIzNDU2IiwiZ29vZHNOdW1iZXIiOjg0LCJhdXRob3JpemVOdW1iZXIiOjAsInN0YXR1cyI6MX19LCJleHAiOjE3NDU4OTM0NjB9.-zK0EZjr3Q2wIykEgls8SFjgU9aQwmw3tKTQ0r1ZGIrivuy7bJdBCMRn29oPTwXkFmRJjpneYi3pLTZErXjCSA
body :{}
状态码 :304
data :{"code":200,"data":false,"message":"操作成功"}
[2025-04-28T17:03:37.996] [INFO] log -
时间:2025-04-28 17:03:37
ip : ::1
host : localhost:3000
响应时间 : 0.284 s
method :GET
url :/checkUpdate?version=1.0.8
token :eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzeXNVc2VyIjp7ImlkIjo0NiwiYWNjb3VudCI6IjEyMzQ1NiIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdXBwZXJNYXJrIjoxLCJmYWN0b3J5SWQiOjMzLCJmYWN0b3J5Q29kZSI6IlQzNCIsInN0YXR1cyI6MSwiZmFjdG9yeSI6eyJpZCI6MzMsImJpYW5tYSI6IlQzNCIsInRpdGxlIjoiVDM0NjYiLCJ0eXBlSWQiOjE2LCJuYW1lIjoiMTIzIiwibW9iaWxlIjoiMTIzNDU2IiwiZ29vZHNOdW1iZXIiOjg0LCJhdXRob3JpemVOdW1iZXIiOjAsInN0YXR1cyI6MX19LCJleHAiOjE3NDU4OTM0NjB9.-zK0EZjr3Q2wIykEgls8SFjgU9aQwmw3tKTQ0r1ZGIrivuy7bJdBCMRn29oPTwXkFmRJjpneYi3pLTZErXjCSA
body :{}
状态码 :304
data :{"code":200,"data":false,"message":"操作成功"}
[2025-04-28T17:03:52.329] [INFO] log -
时间:2025-04-28 17:03:52
ip : ::1
host : localhost:3000
响应时间 : 0.167 s
method :GET
url :/checkUpdate?version=1.0.8
token :eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzeXNVc2VyIjp7ImlkIjo0NiwiYWNjb3VudCI6IjEyMzQ1NiIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdXBwZXJNYXJrIjoxLCJmYWN0b3J5SWQiOjMzLCJmYWN0b3J5Q29kZSI6IlQzNCIsInN0YXR1cyI6MSwiZmFjdG9yeSI6eyJpZCI6MzMsImJpYW5tYSI6IlQzNCIsInRpdGxlIjoiVDM0NjYiLCJ0eXBlSWQiOjE2LCJuYW1lIjoiMTIzIiwibW9iaWxlIjoiMTIzNDU2IiwiZ29vZHNOdW1iZXIiOjg0LCJhdXRob3JpemVOdW1iZXIiOjAsInN0YXR1cyI6MX19LCJleHAiOjE3NDU4OTM0NjB9.-zK0EZjr3Q2wIykEgls8SFjgU9aQwmw3tKTQ0r1ZGIrivuy7bJdBCMRn29oPTwXkFmRJjpneYi3pLTZErXjCSA
body :{}
状态码 :304
data :{"code":200,"data":false,"message":"操作成功"}
[2025-04-28T17:04:15.177] [INFO] log -
时间:2025-04-28 17:04:15
ip : ::1
host : localhost:3000
响应时间 : 0.166 s
method :GET
url :/checkUpdate?version=1.0.8
token :eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzeXNVc2VyIjp7ImlkIjo0NiwiYWNjb3VudCI6IjEyMzQ1NiIsInBhc3N3b3JkIjoiZTEwYWRjMzk0OWJhNTlhYmJlNTZlMDU3ZjIwZjg4M2UiLCJzdXBwZXJNYXJrIjoxLCJmYWN0b3J5SWQiOjMzLCJmYWN0b3J5Q29kZSI6IlQzNCIsInN0YXR1cyI6MSwiZmFjdG9yeSI6eyJpZCI6MzMsImJpYW5tYSI6IlQzNCIsInRpdGxlIjoiVDM0NjYiLCJ0eXBlSWQiOjE2LCJuYW1lIjoiMTIzIiwibW9iaWxlIjoiMTIzNDU2IiwiZ29vZHNOdW1iZXIiOjg0LCJhdXRob3JpemVOdW1iZXIiOjAsInN0YXR1cyI6MX19LCJleHAiOjE3NDU4OTM0NjB9.-zK0EZjr3Q2wIykEgls8SFjgU9aQwmw3tKTQ0r1ZGIrivuy7bJdBCMRn29oPTwXkFmRJjpneYi3pLTZErXjCSA
body :{}
状态码 :304
data :{"code":200,"data":false,"message":"操作成功"}
src/background.js
View file @
f487e64e
...
...
@@ -36,22 +36,23 @@ async function createWindow() {
nodeIntegration
:
true
,
},
});
let
newWindow
=
new
BrowserWindow
({
fullscreen
:
false
,
width
:
1000
,
height
:
1000
,
webPreferences
:
{
nodeIntegration
:
true
,
//配置预加载脚本文件(preload),此处起名为preloadOther
//p.s.路径为绝对路径
// preload: path.join(__dirname, "./preloadOther.js")
},
});
// let newWindow = new BrowserWindow({
// fullscreen: false,
// width: 1000,
// height: 1000,
// webPreferences: {
// nodeIntegration: true,
// //配置预加载脚本文件(preload),此处起名为preloadOther
// //p.s.路径为绝对路径
// // preload: path.join(__dirname, "./preloadOther.js")
// },
// });
console
.
log
(
winURL
+
"#"
+
`/design-detail`
);
//指定副屏幕打开的网页
await
newWindow
.
loadURL
(
winURL
+
"#"
+
`/design-detail`
);
newWindow
.
reload
();
//
//
指定副屏幕打开的网页
//
await newWindow.loadURL(winURL + "#" + `/design-detail`);
//
newWindow.reload();
// win.on("closed", () => {
// //这一段放外面的话,如果你电脑没双屏会报错。
// win = null;
...
...
@@ -90,11 +91,11 @@ async function createWindow() {
win
.
removeAllListeners
();
win
=
null
;
}
// 确保 newWindow 还未销毁,才执行关闭操作
if
(
newWindow
&&
!
newWindow
.
isDestroyed
())
{
newWindow
.
close
();
newWindow
=
null
;
}
//
//
确保 newWindow 还未销毁,才执行关闭操作
//
if (newWindow && !newWindow.isDestroyed()) {
//
newWindow.close();
//
newWindow = null;
//
}
});
// 自动更新逻辑开始
...
...
@@ -166,6 +167,16 @@ async function createWindow() {
});
});
});
win
.
on
(
"resize"
,
()
=>
{
const
{
width
,
height
}
=
win
.
getBounds
();
win
.
webContents
.
send
(
"window-size"
,
{
width
,
height
});
});
// 监听窗口的 reload 事件
win
.
webContents
.
on
(
"did-finish-load"
,
()
=>
{
const
{
width
,
height
}
=
win
.
getBounds
();
win
.
webContents
.
send
(
"window-size"
,
{
width
,
height
});
});
}
app
.
on
(
"activate"
,
async
()
=>
{
...
...
@@ -176,6 +187,9 @@ app.on("activate", async () => {
app
.
on
(
"ready"
,
async
()
=>
{
await
createWindow
();
// 获取当前窗口的尺寸
const
{
width
,
height
}
=
win
.
getBounds
();
win
.
webContents
.
send
(
"window-size"
,
{
width
,
height
});
globalShortcut
.
register
(
"F5"
,
()
=>
{
return
false
;
});
...
...
src/server/entity/function.js
View file @
f487e64e
...
...
@@ -77,7 +77,7 @@ export default {
data
,
}
=
await
axios
.
post
(
`
${
env
}
/factory/podJomallOrder/downloadByProduction`
,
params
,
[
req
.
body
[
0
]]
,
{
headers
:
{
"jwt-token"
:
token
}
}
);
let
files
=
[];
...
...
@@ -86,8 +86,8 @@ export default {
files
=
files
.
map
((
el
)
=>
{
return
{
url
:
`
${
fileEnv
}${
el
}
`
};
});
console
.
log
(
89
,
files
);
// res.json({ code: 200, data: "" }
);
// return;
if
(
req
.
body
[
1
]
===
1
)
{
downloadImage
(
files
)
.
then
((
data
)
=>
{
...
...
src/store/index.js
View file @
f487e64e
...
...
@@ -13,7 +13,10 @@ export default new Vuex.Store({
state
:
{
actionList
:
[],
imgList
:
[],
productDetail
:
{},
desktopDevice
:
1
,
//1是兄弟,2是其他
WHproportion
:
1
,
//宽高比例
isPreView
:
false
,
//宽高比例
actionIndex
:
-
1
,
systemSetting
:
{
gridShow
:
1
,
...
...
@@ -43,6 +46,15 @@ export default new Vuex.Store({
changeDesktopDevice
(
state
,
value
)
{
state
.
desktopDevice
=
value
;
},
setProductDetail
(
state
,
value
)
{
state
.
productDetail
=
value
;
},
setWHproportion
(
state
,
value
)
{
state
.
WHproportion
=
value
;
},
setIsPreView
(
state
,
value
)
{
state
.
isPreView
=
value
;
},
},
getters
:
{
systemSetting
(
state
)
{
...
...
src/utils/axios.js
View file @
f487e64e
...
...
@@ -6,7 +6,7 @@ import { Loading } from "element-ui";
const
service
=
axios
.
create
({
baseURL
:
"http://localhost:3000"
,
// url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout
:
50000000
// request timeout
timeout
:
50000000
,
// request timeout
});
let
loading
;
...
...
@@ -15,7 +15,7 @@ function startLoading() {
lock
:
true
,
text
:
"拼命加载中..."
,
spinner
:
"el-icon-loading"
,
background
:
"rgba(0,0,0,.7)"
background
:
"rgba(0,0,0,.7)"
,
});
}
...
...
@@ -25,7 +25,7 @@ function endLoading() {
// Add a request interceptor
service
.
interceptors
.
request
.
use
(
config
=>
{
(
config
)
=>
{
console
.
log
(
Vue
.
prototype
.
$dataStore
);
const
user
=
Vue
.
prototype
.
$dataStore
.
get
(
"user"
);
if
(
user
)
{
...
...
@@ -34,7 +34,7 @@ service.interceptors.request.use(
startLoading
();
return
config
;
},
error
=>
{
(
error
)
=>
{
endLoading
();
// do something with request error
return
Promise
.
reject
(
error
);
...
...
@@ -53,7 +53,7 @@ service.interceptors.response.use(
* Here is just an example
* You can also judge the status by HTTP Status Code
*/
async
response
=>
{
async
(
response
)
=>
{
// do something with response data
const
res
=
response
.
data
;
endLoading
();
...
...
@@ -66,7 +66,7 @@ service.interceptors.response.use(
Vue
.
prototype
.
$dataStore
.
delete
(
"user"
);
Vue
.
prototype
.
$message
.
error
({
showClose
:
true
,
message
:
res
.
msg
||
res
.
message
||
"Error"
message
:
res
.
msg
||
res
.
message
||
"Error"
,
});
setTimeout
(()
=>
{
location
.
reload
();
...
...
@@ -81,7 +81,7 @@ service.interceptors.response.use(
}
Vue
.
prototype
.
$message
.
error
({
showClose
:
true
,
message
:
res
.
msg
||
res
.
message
||
"Error"
message
:
res
.
msg
||
res
.
message
||
"Error"
,
});
// reject
return
Promise
.
reject
(
new
Error
(
res
.
msg
||
res
.
message
||
"Error"
));
...
...
@@ -91,7 +91,7 @@ service.interceptors.response.use(
}
return
Promise
.
resolve
(
res
);
},
error
=>
{
(
error
)
=>
{
endLoading
();
// do something with response error
return
Promise
.
reject
(
error
);
...
...
@@ -99,3 +99,4 @@ service.interceptors.response.use(
);
export
default
service
;
export
{
startLoading
,
endLoading
};
src/views/design/data.js
View file @
f487e64e
...
...
@@ -22,11 +22,13 @@ export const grid = [
value
:
1
,
row
:
16
,
col
:
18
,
h
:
542
,
w
:
482
}
// h: 540,
// w: 480,
h
:
0
,
w
:
0
,
},
// {
// label: '16×21',
// label: '16×21',
#77797a
// value: 0,
// col: 16,
// row: 21
...
...
src/views/design/head/index.vue
View file @
f487e64e
...
...
@@ -5,8 +5,10 @@ import { ipcRenderer } from "electron";
import
{
grid
}
from
"../data"
;
import
pkg
from
"../../../../package.json"
;
import
UpdateDialog
from
"@/views/design/updateDialog.vue"
;
//
import path from "path"; // 引入 path 模块
import
path
from
"path"
;
// 引入 path 模块
import
store
from
"@/store/index.js"
;
const
uuid
=
require
(
"uuid"
);
const
fs
=
require
(
"fs"
);
export
default
{
components
:
{
PrintDialog
,
UpdateDialog
},
...
...
@@ -23,6 +25,7 @@ export default {
return
{
checkList
:
[],
desktopDevice
:
1
,
checked
:
false
,
cacheList
:
[
{
label
:
"清除当前登录信息"
,
...
...
@@ -216,6 +219,9 @@ export default {
}
);
this
.
detail
=
findByPodProductionNo
.
data
;
console
.
log
(
219
,
this
.
detail
);
this
.
$store
.
commit
(
"setProductDetail"
,
findByPodProductionNo
.
data
);
ipcRenderer
.
send
(
"win-subScreen"
,
findByPodProductionNo
.
data
);
// 根据生产单号查找 素材图片 下载到本地 然后返回本地地址去显示
...
...
@@ -223,7 +229,6 @@ export default {
this
.
detail
.
id
,
this
.
$store
.
state
.
desktopDevice
,
]);
console
.
log
(
"res111"
,
res
);
this
.
imgList
=
[];
res
.
data
.
forEach
((
el
)
=>
{
this
.
imgList
=
this
.
imgList
.
concat
(
el
.
list
||
[]);
...
...
@@ -240,9 +245,13 @@ export default {
});
}
});
console
.
log
(
arr
,
"arr"
);
res
.
data
=
arr
.
filter
((
el
)
=>
el
.
type
!==
1
);
let
newImgList
;
if
(
this
.
checked
)
{
newImgList
=
await
this
.
cutImgFn
(
res
.
data
);
}
else
{
newImgList
=
res
.
data
;
}
// 延迟后强制激活窗口
if
(
this
.
desktopDevice
!==
1
)
{
if
(
this
.
imgList
.
length
)
{
...
...
@@ -261,7 +270,7 @@ export default {
console.log(260, res.data);
let obj = {
type: "
sendFile
",
value:
res.data
,
value:
newImgList
,
}
if(this.detail.mssWidth && this.detail.mssHeight){
obj.size = { width: this.detail.mssWidth, height: this.detail.mssHeight }
...
...
@@ -356,6 +365,48 @@ export default {
this.$store.commit("
changeImgList
", []);
console.log(347, store.state.desktopDevice);
},
async cutImgFn(arr) {
if (!arr.length) return;
try {
const processQueue = await Promise.all(
arr.map(async (el) => {
try {
const outputDir = path.dirname(el.productionFile);
const outputFileName = `${uuid.v4()}.png`;
const outputPath = path.join(outputDir, outputFileName);
const params = {
inputPath: el.productionFile,
outputPath: outputPath,
};
const res = await this.$api.post("
/
processImage
", params);
fs.unlinkSync(el.productionFile);
return {
fileName: outputFileName,
productionFile: res.msg[0]?.outputPath,
designId: el.designId,
};
} catch (error) {
console.error(`处理失败: ${el.productionFile}`, error);
}
})
);
// 等待所有异步操作完成
await new Promise((resolve) => setTimeout(resolve, 100));
const newMap = new Map(processQueue.map((el) => [el.designId, el]));
processQueue.forEach((el) => {
if (newMap.has(el.designId)) {
el.fileName = newMap.get(el.designId).fileName;
el.productionFile = newMap.get(el.designId).productionFile;
}
});
console.log("
processQueue
", processQueue);
return processQueue;
} catch (error) {
console.error("
错误
", error);
return [];
}
},
},
};
</
script
>
...
...
@@ -596,6 +647,9 @@ export default {
<el-checkbox
v-model=
"isAutoFinish"
>
自动完成上一单
</el-checkbox>
</div>
</div>
<div
style=
"margin-left: 10px;"
>
<el-checkbox
v-model=
"checked"
>
自动裁切素材
</el-checkbox>
</div>
<el-button
@
click=
"downloadImage"
size=
"medium"
...
...
src/views/design/head/printDialog.vue
View file @
f487e64e
...
...
@@ -6,6 +6,7 @@ import html2canvas from "html2canvas";
import
moment
from
"moment"
;
import
pkg
from
"../../../../package.json"
;
import
{
pxToUnit
}
from
"../../../utils/index"
;
import
{
mapState
}
from
"vuex"
;
export
default
{
data
()
{
...
...
@@ -123,6 +124,7 @@ export default {
return
"1.5"
;
}
},
...
mapState
([
"WHproportion"
]),
},
watch
:
{
printSetting
:
{
...
...
@@ -300,11 +302,11 @@ export default {
const
relativeY
=
imageRect
.
top
-
lineRect
.
top
;
console
.
log
(
dom_id
);
// 获取图片的宽高
let
w
=
image
.
clientWidth
;
// 图片宽
let
h
=
image
.
clientHeight
;
// 图片高
let
w
=
image
.
clientWidth
/
this
.
WHproportion
;
// 图片宽
let
h
=
image
.
clientHeight
/
this
.
WHproportion
;
// 图片高
console
.
log
(
w
,
h
,
"w,h"
);
const
x
=
relativeX
;
const
y
=
relativeY
;
const
x
=
relativeX
/
this
.
WHproportion
;
const
y
=
relativeY
/
this
.
WHproportion
;
const
r
=
this
.
imgList
[
0
].
r
;
console
.
log
(
w
,
h
);
const
x_mm
=
this
.
pxToUnit
(
x
,
"mm"
);
...
...
@@ -370,12 +372,13 @@ export default {
y
=
this
.
numberToStr4
(
y
);
w
=
this
.
numberToStr4
(
w
);
h
=
this
.
numberToStr4
(
h
);
console
.
log
(
"print"
,
x
,
y
,
w
,
h
);
console
.
log
(
"print"
,
w
,
h
);
// console.log(x, "x");
// console.log(y, "y");
// console.log(w, "w");
// console.log(h, "h");
if
(
w
>
4200
||
h
>
4700
)
{
return
this
.
$message
.
warning
(
"打印图片素材宽度不能超过410mm,长度不能超过450mm"
);
}
r
=
Number
(
r
).
toFixed
(
0
);
const
imgFileName
=
this
.
imgList
[
0
].
fileName
;
let
position
=
""
;
// 位置
...
...
src/views/design/main/imgSetting.vue
View file @
f487e64e
This diff is collapsed.
Click to expand it.
src/views/design/main/index.vue
View file @
f487e64e
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment