Browse Source

commit

master
yonghang 2 years ago
parent
commit
1574c271d7
  1. 2
      .gitignore
  2. 17
      .vscode/launch.json
  3. 39
      app/main/SinceTimeTool.js
  4. BIN
      app/main/assets/big.png
  5. BIN
      app/main/assets/close-new.png
  6. BIN
      app/main/assets/mainphoto.png
  7. BIN
      app/main/assets/small.png
  8. BIN
      app/main/assets/test1.pdf
  9. 2
      app/main/child_process.js
  10. 10
      app/main/constant.js
  11. 152
      app/main/index.html
  12. 46
      app/main/index.js
  13. 339
      app/main/ipc.js
  14. 9
      app/main/windows/application.js
  15. 43
      app/main/windows/lib/common.js
  16. 2
      app/main/windows/lib/data.json
  17. 117
      app/main/windows/lib/preload.js
  18. 16
      app/main/windows/lib/store.js
  19. 108
      app/main/windows/main.js
  20. 4
      app/main/windows/screen.json
  21. 2
      app/main/windows/suspension.js
  22. 3
      app/package.json
  23. 3
      app/renderer/pages/suspension/index.html
  24. 3
      app/renderer/src/main/src/router/index.js
  25. 239
      app/yarn.lock
  26. 11
      package.json
  27. 2708
      yarn.lock

2
.gitignore

@ -1,3 +1,5 @@
*.swp
node_modules
app/data.json
OutApp*

17
.vscode/launch.json

@ -0,0 +1,17 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}\\app\\main\\index.js"
}
]
}

39
app/main/SinceTimeTool.js

@ -0,0 +1,39 @@
let globalSinceTime = {}
async function sinceTime(title = '默认标记') {
try {
let startTime = 0
if (performance) {
startTime = performance.now()
} else {
startTime = new Date().getTime()
}
globalSinceTime[title] = startTime
return Promise.resolve(true)
} catch (e) {
return Promise.reject(e)
}
}
async function sinceTimeEnd(title = '默认标记') {
try {
let endTime = 0
if (performance) {
endTime = performance.now()
} else {
endTime = new Date().getTime()
}
let startTime = 0
if (globalSinceTime.hasOwnProperty(title)) {
startTime = globalSinceTime[title]
}
let since = endTime - startTime
console.log(title + ' 耗时:', since, '毫秒')
return Promise.resolve(since)
} catch (e) {
return Promise.reject(e)
}
}
exports.sinceTime = sinceTime
exports.sinceTimeEnd = sinceTimeEnd

BIN
app/main/assets/big.png

After

Width: 60  |  Height: 60  |  Size: 969 B

BIN
app/main/assets/close-new.png

After

Width: 22  |  Height: 22  |  Size: 1.1 KiB

BIN
app/main/assets/mainphoto.png

After

Width: 24  |  Height: 24  |  Size: 623 B

BIN
app/main/assets/small.png

After

Width: 22  |  Height: 22  |  Size: 1.0 KiB

BIN
app/main/assets/test1.pdf

2
app/main/child_process.js

@ -28,7 +28,7 @@ function start(command, args, options = {}) {
}
function kill(pid) {
const childProgress = pidMap[pid]
let childProgress = pidMap[pid]
let status = false
if (childProgress && !childProgress.killed) {
status = childProgress.kill()

10
app/main/constant.js

@ -17,16 +17,18 @@ try {
data = {schema:"QB"}
}
const schema = data.schema;
let url = "";
// let url = "file://" + path.resolve(__dirname, './index.html')
switch (schema) {
case 'KT':
url = 'http://localhost:8080/';
url = 'http://localhost:3806/';
break;
case 'QB':
url = 'http://localhost:8080/TIS_PLATFORM/';
url = 'http://localhost:3806/TIS_PLATFORM/';
// url = 'http://localhost:8080/TIS_PLATFORM/';
// url = 'http://tis.inscloudtech.com:9009/TIS_PLATFORM/#/pc';
break;
default:
url = 'http://localhost:8080/TIS_PLATFORM/';
url = 'http://localhost:3806/TIS_PLATFORM/';
break;
}
exports.MAIN_WINDOW_URL = url;

152
app/main/index.html

@ -0,0 +1,152 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>系统运行监控</title>
<meta http-equiv="Pragma" content="no-cache">
<META HTTP-EQUIV="Cache-Control" content="no-cache">
<META HTTP-EQUIV="Expires" content="0">
</head>
<body class="main">
<section style="-webkit-app-region: drag;width: 100%">
<div class="heading">
<div class="title">
<img class="title-img" src="assets/mainphoto.png">
<span class="head_title">系统运行监控</span>
</div>
<div class="use-btn" style="-webkit-app-region: no-drag">
<a class="small" id="min" onclick="minFun()"></a>
<!-- <a class="big" id="max" onclick="maxFun()"></a> -->
<a class="close" id="closed" onclick="closeFun()"></a>
</div>
</div>
</section>
<div class="fromBox">
<!-- <webview id="obj" class="obj" type="text/html" src="http://localhost:3806/TIS_PLATFORM?appId=TIS_APP_FRAME_YXJK&launcher=monitor"></webview> -->
<!-- <webview id="obj" class="obj" type="text/html" src="http://localhost:3806/TIS_PLATFORM/?appId=TIS_APP_FRAME_YXJK&launcher=monitor#/pc"></webview> -->
<!-- <webview id="obj" class="obj" type="text/html" src="http://10.12.33.74:3806/TIS_PLATFORM/?appId=TIS_APP_FRAME_YXJK&launcher=monitor#/pc"></webview> -->
<iframe src="./assets/test1.pdf" width="100%" height="100%" frameborder="0"></iframe>
</div>
<script type="text/javascript">
function minFun() {
window.api && window.api.minimize()
}
function closeFun() {
window.api && window.api.exitSystem()
}
</script>
<style>
* {
margin: 0;
padding: 0;
}
@font-face {
font-family: 思源黑体bold;
src: url("./font/SourceHanSansCN-Bold.otf");
}
.main {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
.main .heading {
width: 100%;
height: 4vh;
/* line-height: 5vh; */
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
background-image: linear-gradient(0deg, #212123 0%, #383839 40%, #4e4e4e 100%),
linear-gradient(#212123,
#212123);
background-blend-mode: normal,
normal;
border-radius: 10px 10px 0px 0px;
}
.main .heading .title {
display: flex;
align-items: center;
padding: 0 0 0 1vw;
font-size: 1.6vw;
color: #d8d8d8;
height: 5vh;
line-height: 5vh;
}
.main .heading .title img {
width: 2.6vh;
height: 2.6vh;
}
.main .heading .title span {
display: block;
padding: 0 0 0 5px;
}
.main .heading .use-btn {
display: flex;
flex-direction: row;
padding: 1.5vh 1vw;
}
.main .heading .use-btn a {
margin-left: 3px;
width: 2vh;
height: 2vh;
}
.main .fromBox {
display: flex;
width: 100%;
justify-content: center;
background-color: #000000;
height: 95vh;
border-radius: 0 0 10px 10px;
box-shadow: 4px 4px 10px 0px rgba(33, 33, 35, 0.35);
}
.main .fromBox .obj {
height: 99%;
width: 99%;
}
.big {
background: url("assets/big.png") no-repeat 0 0;
background-size: 100% 100%;
margin-right: 1vw;
}
.small {
background: url("assets/small.png") no-repeat 0 0;
background-size: 100% 100%;
margin-right: 1vw;
}
.close {
background: url("assets/close-new.png") no-repeat 0 0;
background-size: 100% 100%;
}
.head_title {
width: 253px;
/* height: 54px; */
font-family: 思源黑体bold;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
line-height: 50px;
letter-spacing: 2px;
color: #ffffff;
}
</style>
</body>
</html>

46
app/main/index.js

@ -1,16 +1,50 @@
const { app, BrowserWindow, dialog, protocol } = require('electron')
const { create: createMainWindow } = require('./windows/main')
const { MANUAL_CREATED_FLAG } = require('./constant')
const {app, BrowserWindow, dialog, protocol, ipcMain} = require('electron')
const {create: createMainWindow} = require('./windows/main')
const {MANUAL_CREATED_FLAG,} = require('./constant')
const handleIPC = require('./ipc')
app.commandLine.appendSwitch("--disable-http-cache");
const {sinceTime,sinceTimeEnd} = require('./SinceTimeTool')
sinceTime()
const store = require('./windows/lib/store');
const isFirstInstall = store.get("firstInstall");
if (isFirstInstall) {
console.log('<========清除历史缓存=====>')
app.commandLine.appendSwitch("--disable-http-cache");
store.set("firstInstall", false);
}
// 关闭GPU加速
// app.disableHardwareAcceleration()
// app.allowRendererProcessReuse = true
app.whenReady().then(() => {
// 启动应用时自动启动监控平台接口服务
// const child_process = require('child_process')
// if (global.worker !== 'start') {
// let worker = child_process.fork('D:\\linyun\\workspace\\front-monitor-api\\src\\app.js',[])
// global.worker = 'start'
// }
const gotTheLock = app.requestSingleInstanceLock();
console.log('gotTheLock',gotTheLock)
// if (!gotTheLock) {
// dialog.showMessageBox(win,{
// type: "warning",
// title: "提示",
// message: "您已打开指挥系统!请勿重复操作",
// }).then(() => {
// app.exit()
// })
// return;
// }
protocol.registerFileProtocol('file', (request, callback) => {
const pathname = decodeURI(request.url.replace('file:///', ''));
callback(pathname);
});
sinceTimeEnd('whenReady')
handleIPC();
createMainWindow()
sinceTimeEnd('handleIPC')
createMainWindow();
sinceTimeEnd('createWindowEnd')
app.on('browser-window-created', (event, window) => {
setTimeout(() => {
if (window[MANUAL_CREATED_FLAG]) { // allow safe created manually
@ -42,4 +76,4 @@ app.whenReady().then(() => {
// explicitly with Cmd + Q.
app.on('window-all-closed', function () {
if (process.platform !== 'darwin') app.quit()
})
})

339
app/main/ipc.js

@ -1,4 +1,6 @@
const {BrowserWindow} = require('electron');
const {BrowserWindow, desktopCapturer} = require('electron');
// const {net} = require('electron');
const electron = require('electron');
const ipc = require('electron').ipcMain;
// const screen = require('electron').screen;
const store = require('./windows/lib/store');
@ -6,56 +8,61 @@ const {create: createMainWindow} = require('./windows/main')
// const { create: createLoginWindow } = require('./windows/login')
// const { create: createAppWindow } = require('./windows/app')
const childProcess = require('./child_process')
const { create: openWindow } = require('./windows/application')
const {create: openWindow} = require('./windows/application')
// const querystring = require("querystring");
const {MAIN_WINDOW_FLAG, SUSPENSION_WINDOW_FLAG} = require('./constant');
const { ipcRenderer } = require('electron/renderer');
// const installApp = require('./ipc/installApp');
// const getApps = require('./ipc/getApps');
// const removeApp = require('./ipc/removeApp');
// connect redis
const { createClient } = require('redis')
;(async () => {
/**
* createClient({
* url: 'redis://alice:foobared@awesome.redis.server:6380'
* });
*/
const client = createClient()
client.on('error', (err) => console.log('Redis Client Error', err));
await client.connect()
// const {createClient} = require('redis')
// ;(async () => {
// /**
// * createClient({
// * url: 'redis://alice:foobared@awesome.redis.server:6380'
// * });
// */
// const client = createClient(
// // {
// // url: "redis://localhost:3807"
// // }
// );
// // client.on('error', (err) => console.log('Redis Client Error', err));
// await client.connect()
// 订阅者
const subscriber = client.duplicate();
await subscriber.connect();
// // 订阅者
// const subscriber = client.duplicate();
// await subscriber.connect();
// 发布者
const publisher = client.duplicate()
await publisher.connect()
// // 发布者
// const publisher = client.duplicate()
// await publisher.connect()
// 通过main向外发布消息
ipc.on('publishMessage', (events, { channel, ...message }) => {
publisher.publish(channel, JSON.stringify(message))
})
// // 通过main向外发布消息
// ipc.on('publishMessage', (events, {channel, ...message}) => {
// publisher.publish(channel, JSON.stringify(message))
// })
// 订阅外部消息
subscriber.subscribe('openMap', message => {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
});
found.webContents.send('openMap', JSON.parse(message))
})
// // 订阅外部消息
// subscriber.subscribe('openMap', message => {
// const windows = BrowserWindow.getAllWindows()
// const found = windows.find((window) => {
// return window[MAIN_WINDOW_FLAG]
// });
// found.webContents.send('openMap', JSON.parse(message))
// })
// 订阅外部消息(正则)
subscriber.pSubscribe('openMap*', (message, channel) => {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
});
found.webContents.send(channel, JSON.parse(message))
})
})();
// // 订阅外部消息(正则)
// subscriber.pSubscribe('openMap*', (message, channel) => {
// const windows = BrowserWindow.getAllWindows()
// const found = windows.find((window) => {
// return window[MAIN_WINDOW_FLAG]
// });
// found.webContents.send(channel, JSON.parse(message))
// })
// })();
module.exports = () => {
let winStartPostion = {x: 0, y: 0};
@ -86,21 +93,21 @@ module.exports = () => {
let sWidth = areaSize.width;
// console.log(sWidth - x);
if (sWidth - x === 130) {
win.setSize(640, 130, true);
win.setSize(410, 130, true);
win.setPosition(sWidth - 660, y, true);
}
win.webContents.send("getUnReadMessage", [message])
}
});
ipc.on("showSuspensionWindow",()=>{
ipc.on("showSuspensionWindow", () => {
let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
const windows = BrowserWindow.getAllWindows()
const win = windows.find((window) => {
return window[SUSPENSION_WINDOW_FLAG]
});
console.log('恢复原始大小')
win.setSize(640, 130, true);
win.setSize(410, 130, true);
const y = win.getPosition()[1];
win.setPosition(areaSize.width - win.getSize()[0], y, true);
win.webContents.send("winResize", [win.getSize()])
@ -113,11 +120,11 @@ module.exports = () => {
return window[SUSPENSION_WINDOW_FLAG]
});
const startWidth = win.getSize()[0];
if(startWidth < 640){
if (startWidth < 410) {
const x = win.getPosition()[0];
const y = win.getPosition()[1];
win.setSize(640, 130, true);
if(x > areaSize.width - win.getSize()[0] ){
win.setSize(410, 130, true);
if (x > areaSize.width - win.getSize()[0]) {
win.setPosition(areaSize.width - win.getSize()[0] - 50, y, true);
}
@ -133,8 +140,8 @@ module.exports = () => {
/**
* 窗口移动事件
*/
if (!win) return;
if (canMoving) {
if (!win) return;
//读取原位置
const winPosition = win.getPosition();
winStartPostion = {x: winPosition[0], y: winPosition[1]};
@ -145,10 +152,13 @@ module.exports = () => {
}
//新开
movingInterVal = setInterval(() => {
if(!win){
clearInterval(movingInterVal);
return;
}
const cursorPosition = screen.getCursorScreenPoint();
const x = winStartPostion.x + cursorPosition.x - mouseStartPosition.x;
const y = winStartPostion.y + cursorPosition.y - mouseStartPosition.y;
win.setPosition(x, y, true)
}, 20)
} else {
@ -156,22 +166,22 @@ module.exports = () => {
let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
const x = win.getPosition()[0];
const y = win.getPosition()[1];
store.set("position",{x,y});
store.set("position", {x, y});
let sWidth = areaSize.width;
let winWidth = win.getSize()[0];
// console.log(x + winWidth >= sWidth, sWidth - x - winWidth);
// 靠边吸附效果
console.log("0000000",x + winWidth >= sWidth,sWidth - x - winWidth <= 20)
console.log("0000000", x + winWidth >= sWidth, sWidth - x - winWidth <= 20)
if (x + winWidth >= sWidth || sWidth - x - winWidth <= 20) {
win.setResizable(true);
win.setSize(130,130,true)
win.setSize(130, 130, true)
win.setPosition(sWidth - 130, y, true);
win.setResizable(false);
console.log("靠边吸附",win.getSize(),win.getPosition())
console.log("靠边吸附", win.getSize(), win.getPosition())
//通知渲染进程大小发生改变
}else{
win.setSize(650,130,true)
} else {
win.setSize(410, 130, true)
}
win.webContents.send("winResize", [win.getSize()])
movingInterVal = null;
@ -191,6 +201,7 @@ module.exports = () => {
return true
});
ipc.on('hideMainWindow', () => {
console.log('最小化hideMainWindow');
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
@ -201,14 +212,20 @@ module.exports = () => {
return true
});
ipc.on('minimize', () => {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
if (found) {
found.minimize();
}
return true
// const windows = BrowserWindow.getAllWindows()
// const found = windows.find((window) => {
// return window[MAIN_WINDOW_FLAG]
// })
// if (found) {
// found.minimize();
// }
// return true
try {
const windows = BrowserWindow.getAllWindows()
for (let win of windows) {
win && win.minimize()
}
}catch (e) {}
});
ipc.on('hideSuspensionWindow', (event, arg) => {
@ -228,16 +245,18 @@ module.exports = () => {
});
ipc.on('exitSystem', () => {
const windows = BrowserWindow.getAllWindows()
const mainWindow = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
const suspWindow = windows.find((window) => {
return window[SUSPENSION_WINDOW_FLAG]
});
store.delete("unReadMessage");
mainWindow && mainWindow.close();
suspWindow && suspWindow.close();
console.log('global',global.worker);
try {
const windows = BrowserWindow.getAllWindows()
for (let win of windows) {
win && win.close()
}
global.worker === 'stop'
store.delete("unReadMessage");
}catch (e) {
}
});
// ipc.handle('openWidget', (event, widget = {}) => {
// createAppWindow(widget)
@ -255,55 +274,141 @@ module.exports = () => {
//
// ipc.handle('removeApp', removeApp);
/* ipcRenderer
ipcRenderer.send('spawn', {
command: '微信.exe',
args: null || ['--disable-cache'],
key: + new Date // 唯一key,用来做关闭识别,
})
*/
ipc.on('spawn', (event, arg) => {
const { pid, promise } = childProcess.start(arg.command, arg.args, arg.key)
event.sender.send('spawn-success', {
key: arg.key,
pid
/* ipcRenderer
ipcRenderer.send('spawn', {
command: '微信.exe',
args: null || ['--disable-cache'],
key: + new Date // 唯一key,用来做关闭识别,
})
*/
ipc.on('spawn', (event, arg) => {
const {pid, promise} = childProcess.start(arg.command, arg.args, arg.key)
event.sender.send('spawn-success', {
key: arg.key,
pid
})
promise.then(data => {
event.sender.send('spawn-success', {
key: arg.key,
data
})
})
promise.catch(err => {
event.sender.send('spawn-error', {
key: arg.key,
err
})
})
})
promise.then(data => {
event.sender.send('spawn-success', {
key: arg.key,
data
})
// ipcRenderer.send('kill-process', [pid])
ipc.on('kill-process', function (event, arg) {
childProcess.kill(arg[0])
})
promise.catch(err => {
event.sender.send('spawn-error', {
key: arg.key,
err
})
// 通信桥梁
ipc.on('bridge', function (event, {channel, targetId, ...message}) {
console.log('bridge message', channel, message)
const windows = BrowserWindow.getAllWindows()
// const found = windows.find((window) => {
// return window[SUSPENSION_WINDOW_FLAG]
// });
for (let win of windows) {
if (!targetId || win[targetId]) {
win.webContents.send(channel, message);
}
}
})
})
const windowMap = new Map();
// 通过main打开新窗口
ipc.on('openWindow', function (event, arg) {
//如果存在第二块屏幕,在第二块屏幕打开
let displays = electron.screen.getAllDisplays();
let externalDisplay = displays.find((display)=>{
return display.bounds.x !== 0 || display.bounds.y !== 0
});
let options = {};
if(externalDisplay){
options = {
fullscreen:true,
x:externalDisplay.bounds.x,
y:externalDisplay.bounds.y,
};
//关闭上一个,同一时间在拓展屏只能打开两个,打开多个或引起卡顿
if(windowMap.size > 2){
const win = windowMap.values().next().value;
win.close();
windowMap.delete(windowMap.keys().next().value);
}
}
console.log('openWindow request from renderer process', arg);
const windows = BrowserWindow.getAllWindows();
const found = windows.find((window) => {
return window[arg.id]
});
if (!arg.id || !arg.entry) {
return;
}
//未打开过,新建窗口
if(!found){
const temp = openWindow(arg,options)
windowMap.set(arg.id,temp);
}else{//打开且未关闭,切换至前台
found.focus()
}
// ipcRenderer.send('kill-process', [pid])
ipc.on('kill-process', function (event, arg) {
childProcess.kill(arg[0])
})
// 通信桥梁
ipc.on('bridge', function (event, { channel, targetId, ...message }) {
const windows = BrowserWindow.getAllWindows()
for (let win of windows) {
if (win.webContents.id === event.sender.id) continue;
if (!targetId || win[targetId]) {
win.webContents.send(channel, message)
}
}
})
})
//返回上一个窗口
ipc.on("backPreviousApp",function (event,arg) {
const keys = [...windowMap.keys()];
const curKey = keys.findIndex(v=>v === arg.id);
if(keys.length > 1){
let preKey = curKey > 0? curKey - 1 : keys.length - 1;
const preId = keys[preKey];
windowMap.get(preId).focus();
}
// 通过main打开新窗口
ipc.on('openWindow', function (event, arg) {
console.log('openWindow request from renderer process', arg)
if (!arg.id || !arg.entry) {
return;
}
openWindow(arg)
})
});
//根据指定id关闭窗口
ipc.on('closeWindowById', function (event, arg) {
const windows = BrowserWindow.getAllWindows();
const found = windows.find((window) => {
return window[arg.id]
});
found.close();
windowMap.delete(arg.id);
})
// 监听调用截屏事件
ipc.on('PrtSc', function (event, arg) {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
if (found) {
found.webContents.send('PrtSc');
}
})
// 监听下载截屏的图片
ipc.on('downloadImg', function (event, arg) {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
if (found) {
found.webContents.send('downloadImg');
}
})
// 取消截屏显示
ipc.on('removeCanvas', function (event, arg) {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
if (found) {
found.webContents.send('removeCanvas');
}
})
}

9
app/main/windows/application.js

@ -1,8 +1,8 @@
const { BrowserWindow } = require('electron')
const { BrowserWindow } = require('electron')
const { createWindow } = require('./lib/common')
// props: { id: 'TIS_APP_TEMPLATE_KT', entry: '' }
const create = props => {
const create = (props,options) => {
const windows = BrowserWindow.getAllWindows()
const found = windows.find(w => w[props.id])
if (found) {
@ -12,9 +12,10 @@ const create = props => {
}
const win = createWindow(props.entry, {
show: true
show: true,
...options,
})
win[props.id] = true
win[props.id] = Symbol(props.id);
return win
}

43
app/main/windows/lib/common.js

@ -1,14 +1,24 @@
const { BrowserWindow } = require('electron')
const { BrowserWindow,Menu,globalShortcut, ipcMain, desktopCapturer } = require('electron')
const path = require('path')
const { MANUAL_CREATED_FLAG } = require('../../constant')
const {sinceTimeEnd} = require('../../SinceTimeTool')
// 引入初始化remote模块
const remote = require('@electron/remote/main')
remote.initialize()
function createWindow(url,options,node=false) {
// let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize
const window = new BrowserWindow({
Menu.setApplicationMenu(null);
const win = new BrowserWindow({
// width: 870,
// height: 530,
webPreferences: {
// webSecurity: false,
// contextIsolation: false,
// enableRemoteModule:true,
nodeIntegration: node,
// webviewTag: true,
// devTools: true,
// preload: path.join(__dirname, 'preload.js')
webSecurity: false,
contextIsolation: false,
enableRemoteModule:true,
@ -18,12 +28,29 @@ function createWindow(url,options,node=false) {
...options
})
window[MANUAL_CREATED_FLAG] = true
win[MANUAL_CREATED_FLAG] = true
console.log('openWindow', url)
window.loadURL(url)
// window.webContents.openDevTools() // Open the DevTools.
return window
win.loadURL(url);
sinceTimeEnd('loadURL')
// 清除缓存
// const ses = win.webContents.session
// ses.clearCache()
// 启用remote模块
remote.enable(win.webContents)
// 注册快捷键
win.on('focus', () => {
globalShortcut.register('CommandOrControl+Alt+F', function () {
win && win.webContents.toggleDevTools();
})
});
win.on('blur', () => {
globalShortcut.unregisterAll() // 注销键盘事件
})
// win.webContents.openDevTools() // Open the DevTools.
return win
}
module.exports = { createWindow }

2
app/main/windows/lib/data.json

@ -1 +1 @@
{"test":{"a":1},"test2":{"name":"我是你爹"}}
{"firstInstall":false,"position":{"x":1155,"y":775}}

117
app/main/windows/lib/preload.js

@ -1,38 +1,99 @@
// All of the Node.js APIs are available in the preload process.
// It has the same sandbox as a Chrome extension.
const {ipcRenderer} = require('electron')
const {ipcRenderer, desktopCapturer} = require('electron');
const remote = require('@electron/remote');
window.currentFrame = 'platform';
window.api = [
"showSuspensionWindow",
"resizeWindow",
"setUnReadMessage",
"getUnReadMessage",
"windowMoveHandle",
"exitSystem",
"openDevTools",
"hideMainWindow",
"showMainWindow",
"minimize",
"hideSuspensionWindow"
].reduce((acc, apiName) => {
'showSuspensionWindow',
'resizeWindow',
'setUnReadMessage',
'getUnReadMessage',
'windowMoveHandle',
'exitSystem',
'openDevTools',
'hideMainWindow',
'showMainWindow',
'minimize',
'hideSuspensionWindow',
'closeWindowById',
'PrtSc',
'downloadImg',
'removeCanvas',
].reduce(
(acc, apiName) => {
acc[apiName] = (...params) => {
return ipcRenderer.send(apiName, ...params)
}
return acc
}, {
return ipcRenderer.send(apiName, ...params);
};
return acc;
},
{
on: ipcRenderer.on.bind(ipcRenderer),
send: ipcRenderer.send.bind(ipcRenderer),
removeListener: ipcRenderer.removeListener.bind(ipcRenderer)
});
removeListener: ipcRenderer.removeListener.bind(ipcRenderer),
}
);
ipcRenderer.on('getUnReadMessage', (e, args) => {
window.getUnReadMessage(args[0]);
window.getUnReadMessage(args[0]);
});
window.addEventListener("keydown", e => {
const {altKey, ctrlKey, keyCode} = e;
if (altKey && ctrlKey && keyCode === 70) {
const currentWindow = require('electron').remote.getCurrentWindow();
currentWindow && currentWindow.toggleDevTools();
e.preventDefault();
let ImgSrc = null;
// 监听用户截屏
ipcRenderer.on('PrtSc', (e, args) => {
// 显示截屏区域
let screenContent = document.querySelector('.screen-canvas');
screenContent.style.display = 'block';
// 获取当前屏幕的宽高
const {width, height} = remote.getCurrentWindow().getBounds();
console.log(width, height);
// 获取canvas元素
const canvas = document.getElementById('thumbnailCanvas');
const ctx = canvas.getContext('2d');
// 这里的300可根据需要自定义,显示的是截屏后图片显示的大小
canvas.width = (height - 300) * 16 / 9;
canvas.height = height - 300;
desktopCapturer.getSources({types: ['screen'], thumbnailSize: {width: canvas.width, height: canvas.height}}).then(async sources => {
try {
sources.forEach(source => {
const img = new Image();
img.src = source.thumbnail.toDataURL();
ImgSrc = img.src
img.onload = () => {
ctx.drawImage(img, 0, 0);
};
});
} catch (error) {
console.log(error);
}
})
});
});
// 监听用户下载截屏图片
ipcRenderer.on('downloadImg', (e, args) => {
downLoadImage(ImgSrc);
});
// 下载图片
function downLoadImage(src) {
const link = document.createElement('a');
link.href = src;
link.download = new Date().getTime() + '.png';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// 监听用户取消截屏图片显示
ipcRenderer.on('removeCanvas', (e, args) => {
removeCanvas()
});
function removeCanvas() {
// 获取canvas元素
const canvas = document.getElementById('thumbnailCanvas');
const ctx = canvas.getContext('2d');
// 清除画布
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 隐藏截屏区域
let screenContent = document.querySelector('.screen-canvas');
screenContent.style.display = 'none';
}

16
app/main/windows/lib/store.js

@ -1,28 +1,28 @@
// const Store = require('electron-store');
// const store = new Store();//
const data_path = "./data.json";
const path = require("path")
const data_path = path.join(__dirname, './data.json');
const fs = require("fs")
class Store {
constructor(){
fs.writeFileSync(data_path,JSON.stringify({}))
// fs.writeFileSync(data_path,JSON.stringify({}))
}
set(key, param) {
// let saveData = {key:param};
console.log("------",key,param);
let oldData = require('./data.json');
// console.log("------",key,param);
let oldData = require(data_path);
oldData[key] = param;
// console.log('======',oldData);
// console.log('======',JSON.stringify(oldData),data_path);
fs.writeFileSync(data_path,JSON.stringify(oldData))
}
get(key){
const data = JSON.parse(fs.readFileSync(data_path,'utf-8'));
// console.log('get>>>>>>>>>',data[key])
// console.log('get>>>>>>>>>',data[key],data_path)
return data[key];
}
delete(key){
let oldData = require('./data.json');
let oldData = require(data_path);
delete oldData[key];
fs.writeFileSync(data_path,JSON.stringify(oldData))
}

108
app/main/windows/main.js

@ -1,37 +1,85 @@
const { MAIN_WINDOW_FLAG, MAIN_WINDOW_URL } = require("../constant")
const { createWindow } = require('./lib/common')
const { BrowserWindow } = require('electron')
const { create: createSuspensionWindow } = require('./suspension');
const {MAIN_WINDOW_FLAG, MAIN_WINDOW_URL} = require("../constant")
const {createWindow} = require('./lib/common')
const {BrowserWindow} = require('electron')
const {create: createSuspensionWindow} = require('./suspension');
const screen = require("./screen.json");
const {sinceTimeEnd} = require('../SinceTimeTool')
const exec = require('child_process')
const start = () => {
// 任何你期望执行的cmd命令,ls都可以
// let cmdStr1 = 'node D:\linyun\2022-06-07\front-monitor-api\src\app.js'
let cmdStr1 = 'D:\linyun\2022-06-07\front-monitor-api\src\app.js'
let cmdPath = '../../../../../2022-06-07/front-monitor-api/'
// 子进程名称
let workerProcess
function runExec (cmdStr) {
workerProcess = exec.fork(cmdStr)
// 打印正常的后台可执行程序输出
workerProcess.stdout.on('data', function (data) {
console.log('stdout: ' + data)
})
// 打印错误的后台可执行程序输出
workerProcess.stderr.on('data', function (data) {
console.log('stderr: ' + data)
})
// 退出之后的输出
workerProcess.on('close', function (code) {
console.log('out code:' + code)
})
}
runExec(cmdStr1)
}
const create = () => {
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
if (found) {
found.show();
found.center();
found.maximize();
return found;
} else {
const win = createWindow(MAIN_WINDOW_URL,{
fullscreen:true,
offScreen:false,
frame: false, //要创建无边框窗口
show:true
const windows = BrowserWindow.getAllWindows()
const found = windows.find((window) => {
return window[MAIN_WINDOW_FLAG]
})
win[MAIN_WINDOW_FLAG] = true
// win.on('ready-to-show', () => {
// win.show();
// });
win.on('hide', () => {
createSuspensionWindow();
});
return create();
}
if (found) {
found.show();
found.center();
found.maximize();
return found;
} else {
let areaSize = require('electron').screen.getPrimaryDisplay().workAreaSize;
let width = areaSize.width;
let height = areaSize.height;
let resizable = true;
if (screen.width > 0 && screen.height > 0) {
const ratios = screen.width / screen.height;
height = areaSize.height;
width = Math.floor(areaSize.height * ratios);
resizable = false;
}
const win = createWindow(MAIN_WINDOW_URL, {
//alwaysOnTop: true, //窗口是否总是显示在其他窗口之前
fullscreen: true,
offScreen: false,
frame: false, //要创建无边框窗口
width: width, //悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框
height: height, //悬浮窗口的高度 比实际DIV的高度要多2px 因为有1px的边框
resizable: resizable, //禁止窗口大小缩放
show: false, //先不让窗口显示
// backgroundColor: "#0a0a0a"
})
win[MAIN_WINDOW_FLAG] = true
// start()
sinceTimeEnd('createWindow')
win.on('ready-to-show', () => {
sinceTimeEnd('ready-to-show')
win.show();
sinceTimeEnd('win.show')
});
win.on('hide', () => {
console.log('窗口hide');
createSuspensionWindow();
});
return create();
}
}
module.exports = { create }
module.exports = {create}

4
app/main/windows/screen.json

@ -0,0 +1,4 @@
{
"width":0,
"height":0
}

2
app/main/windows/suspension.js

@ -24,7 +24,7 @@ const create = () => {
// maximizable: false,
// resizable: false,
// focusable: true
width: 427, //悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框
width: 310, //悬浮窗口的宽度 比实际DIV的宽度要多2px 因为有1px的边框
height: 130, //悬浮窗口的高度 比实际DIV的高度要多2px 因为有1px的边框
// width: 500,
// height: 500,

3
app/package.json

@ -33,12 +33,13 @@
"devDependencies": {
"asar": "^3.0.3",
"cross-env": "^5.2.0",
"electron": "4.1.2",
"electron": "15.5.7",
"electron-builder": "^22.6.1",
"electron-packager": "^13.1.1",
"electron-store": "^8.0.0"
},
"dependencies": {
"@electron/remote": "^2.0.8",
"redis": "^4.0.1"
}
}

3
app/renderer/pages/suspension/index.html

@ -125,7 +125,7 @@
<script type="text/javascript">
const {Menu} = require("electron").remote;
const {Menu} = require('@electron/remote');
const ipcRenderer = require('electron').ipcRenderer;
let template = [
{
@ -166,7 +166,6 @@
created(){
this.msgCount = 15;
window.getUnReadMessage = (message)=>{
console.log('aaaaaaaa',message)
this.msgCount = message.length;
this.unMessage = message;
window.api.resizeWindow();

3
app/renderer/src/main/src/router/index.js

@ -31,7 +31,8 @@ const routes = [
];
const router = new VueRouter({
mode: "history",
// mode: "history",
mode: "hash",
base: process.env.BASE_URL,
routes
});

239
app/yarn.lock

@ -15,6 +15,27 @@
ajv "^6.12.0"
ajv-keywords "^3.4.1"
"@electron/get@^1.13.0":
version "1.14.1"
resolved "https://registry.npmmirror.com/@electron/get/-/get-1.14.1.tgz#16ba75f02dffb74c23965e72d617adc721d27f40"
integrity sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==
dependencies:
debug "^4.1.1"
env-paths "^2.2.0"
fs-extra "^8.1.0"
got "^9.6.0"
progress "^2.0.3"
semver "^6.2.0"
sumchecker "^3.0.1"
optionalDependencies:
global-agent "^3.0.0"
global-tunnel-ng "^2.7.1"
"@electron/remote@^2.0.8":
version "2.0.8"
resolved "https://registry.npmmirror.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3"
integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw==
"@electron/universal@1.0.5":
version "1.0.5"
resolved "https://registry.npmmirror.com/@electron/universal/download/@electron/universal-1.0.5.tgz#b812340e4ef21da2b3ee77b2b4d35c9b86defe37"
@ -117,10 +138,10 @@
resolved "https://registry.npmmirror.com/@types/node/download/@types/node-17.0.2.tgz#a4c07d47ff737e8ee7e586fe636ff0e1ddff070a"
integrity sha512-JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA==
"@types/node@^10.12.18":
version "10.17.60"
resolved "https://registry.npmmirror.com/@types/node/download/@types/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b"
integrity sha1-NfPWIT2u2V2n8Pc+dbzGmA6QWXs=
"@types/node@^14.6.2":
version "14.18.24"
resolved "https://registry.npmmirror.com/@types/node/-/node-14.18.24.tgz#406b220dc748947e1959d8a38a75979e87166704"
integrity sha512-aJdn8XErcSrfr7k8ZDDfU6/2OgjZcB2Fu9d+ESK8D7Oa5mtsv8Fa8GpcwTA0v60kuZBaalKPzuzun4Ov1YWO/w==
"@types/plist@^3.0.1":
version "3.0.2"
@ -368,6 +389,11 @@ bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.5:
resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28=
boolean@^3.0.1:
version "3.2.0"
resolved "https://registry.npmmirror.com/boolean/-/boolean-3.2.0.tgz#9e5294af4e98314494cbb17979fa54ca159f116b"
integrity sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==
boxen@^5.0.0:
version "5.1.2"
resolved "https://registry.npmmirror.com/boxen/download/boxen-5.1.2.tgz?cache=0&sync_timestamp=1634028659618&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fboxen%2Fdownload%2Fboxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
@ -661,6 +687,14 @@ conf@^10.0.3:
pkg-up "^3.1.0"
semver "^7.3.5"
config-chain@^1.1.11:
version "1.1.13"
resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
dependencies:
ini "^1.3.4"
proto-list "~1.2.1"
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.npm.taobao.org/configstore/download/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
@ -791,11 +825,24 @@ defer-to-connect@^1.0.1:
resolved "https://registry.npm.taobao.org/defer-to-connect/download/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
integrity sha1-MxrgUMCNz3ifjIOnuB8O2U9KxZE=
define-properties@^1.1.3:
version "1.1.4"
resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
dependencies:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
delayed-stream@~1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
detect-node@^2.0.4:
version "2.1.0"
resolved "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
dir-compare@^2.4.0:
version "2.4.0"
resolved "https://registry.nlark.com/dir-compare/download/dir-compare-2.4.0.tgz#785c41dc5f645b34343a4eafc50b79bac7f11631"
@ -896,7 +943,7 @@ electron-builder@^22.6.1:
update-notifier "^5.1.0"
yargs "^17.0.1"
electron-download@^4.1.0, electron-download@^4.1.1:
electron-download@^4.1.1:
version "4.1.1"
resolved "https://registry.npm.taobao.org/electron-download/download/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8"
integrity sha1-AuaVVnBcxFblIPngNVVu1aAV6+g=
@ -987,13 +1034,13 @@ electron-store@^8.0.0:
conf "^10.0.3"
type-fest "^1.0.2"
electron@4.1.2:
version "4.1.2"
resolved "https://registry.npmmirror.com/electron/download/electron-4.1.2.tgz#dc8be0f219c73d60a97675d6d3c5b040c4f50513"
integrity sha512-QWz298CaH2jLyFVje01sj4fSEdXJj+oKVw2jNUovrhZE5jmFE4cr/KqZ7iHX00DG6AwmDF4W1Xrv0V+aQOkieQ==
electron@15.5.7:
version "15.5.7"
resolved "https://registry.npmmirror.com/electron/-/electron-15.5.7.tgz#aadb0081c504f2c2d8f81ea5fd23e38881afe86a"
integrity sha512-n4mVlxoMc4eYx07wWFWGficL+iOMz5xZEf5dBtE/wwLm0fQpYVyW4AlknMFG9F8Css0MM0JSwNMOyRg5e1vDtg==
dependencies:
"@types/node" "^10.12.18"
electron-download "^4.1.0"
"@electron/get" "^1.13.0"
"@types/node" "^14.6.2"
extract-zip "^1.0.3"
emoji-regex@^8.0.0:
@ -1001,6 +1048,11 @@ emoji-regex@^8.0.0:
resolved "https://registry.npmmirror.com/emoji-regex/download/emoji-regex-8.0.0.tgz?cache=0&sync_timestamp=1632751408145&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Femoji-regex%2Fdownload%2Femoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=
encodeurl@^1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.nlark.com/end-of-stream/download/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@ -1013,7 +1065,7 @@ env-paths@^1.0.0:
resolved "https://registry.nlark.com/env-paths/download/env-paths-1.0.0.tgz?cache=0&sync_timestamp=1630096406006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenv-paths%2Fdownload%2Fenv-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
integrity sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=
env-paths@^2.2.1:
env-paths@^2.2.0, env-paths@^2.2.1:
version "2.2.1"
resolved "https://registry.nlark.com/env-paths/download/env-paths-2.2.1.tgz?cache=0&sync_timestamp=1630096406006&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fenv-paths%2Fdownload%2Fenv-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
integrity sha1-QgOZ1BbOH76bwKB8Yvpo1n/Q+PI=
@ -1025,6 +1077,11 @@ error-ex@^1.2.0:
dependencies:
is-arrayish "^0.2.1"
es6-error@^4.1.1:
version "4.1.1"
resolved "https://registry.npmmirror.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.nlark.com/escalade/download/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@ -1040,6 +1097,11 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
escape-string-regexp@^4.0.0:
version "4.0.0"
resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
@ -1169,6 +1231,15 @@ fs-extra@^7.0.0:
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
dependencies:
graceful-fs "^4.2.0"
jsonfile "^4.0.0"
universalify "^0.1.0"
fs-extra@^9.0.0, fs-extra@^9.0.1:
version "9.1.0"
resolved "https://registry.nlark.com/fs-extra/download/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
@ -1208,6 +1279,15 @@ get-caller-file@^2.0.5:
resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=
get-intrinsic@^1.1.1:
version "1.1.2"
resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
has-symbols "^1.0.3"
get-package-info@^1.0.0:
version "1.0.0"
resolved "https://registry.npm.taobao.org/get-package-info/download/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c"
@ -1256,6 +1336,18 @@ glob@^7.1.3, glob@^7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
global-agent@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/global-agent/-/global-agent-3.0.0.tgz#ae7cd31bd3583b93c5a16437a1afe27cc33a1ab6"
integrity sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==
dependencies:
boolean "^3.0.1"
es6-error "^4.1.1"
matcher "^3.0.0"
roarr "^2.15.3"
semver "^7.3.2"
serialize-error "^7.0.1"
global-dirs@^3.0.0:
version "3.0.0"
resolved "https://registry.nlark.com/global-dirs/download/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686"
@ -1263,6 +1355,23 @@ global-dirs@^3.0.0:
dependencies:
ini "2.0.0"
global-tunnel-ng@^2.7.1:
version "2.7.1"
resolved "https://registry.npmmirror.com/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz#d03b5102dfde3a69914f5ee7d86761ca35d57d8f"
integrity sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==
dependencies:
encodeurl "^1.0.2"
lodash "^4.17.10"
npm-conf "^1.1.3"
tunnel "^0.0.6"
globalthis@^1.0.1:
version "1.0.3"
resolved "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
dependencies:
define-properties "^1.1.3"
got@^9.6.0:
version "9.6.0"
resolved "https://registry.npmmirror.com/got/download/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
@ -1313,6 +1422,18 @@ has-flag@^4.0.0:
resolved "https://registry.nlark.com/has-flag/download/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=
has-property-descriptors@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
dependencies:
get-intrinsic "^1.1.1"
has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
has-yarn@^2.1.0:
version "2.1.0"
resolved "https://registry.nlark.com/has-yarn/download/has-yarn-2.1.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhas-yarn%2Fdownload%2Fhas-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
@ -1406,7 +1527,7 @@ ini@2.0.0:
resolved "https://registry.npm.taobao.org/ini/download/ini-2.0.0.tgz?cache=0&sync_timestamp=1607907834147&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fini%2Fdownload%2Fini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5"
integrity sha1-5f1Vbs3VcmvpePoQAYYurLCpS8U=
ini@~1.3.0:
ini@^1.3.4, ini@~1.3.0:
version "1.3.8"
resolved "https://registry.npm.taobao.org/ini/download/ini-1.3.8.tgz?cache=0&sync_timestamp=1607907834147&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fini%2Fdownload%2Fini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
integrity sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=
@ -1571,7 +1692,7 @@ json-schema@0.4.0:
resolved "https://registry.npmmirror.com/json-schema/download/json-schema-0.4.0.tgz?cache=0&sync_timestamp=1636423578797&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
json-stringify-safe@~5.0.1:
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.nlark.com/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
@ -1670,7 +1791,7 @@ lodash.get@^4.0.0:
resolved "https://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz?cache=0&sync_timestamp=1586263972105&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.get%2Fdownload%2Flodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=
lodash@^4.17.15:
lodash@^4.17.10, lodash@^4.17.15:
version "4.17.21"
resolved "https://registry.npmmirror.com/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@ -1712,6 +1833,13 @@ map-obj@^1.0.0, map-obj@^1.0.1:
resolved "https://registry.npmmirror.com/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=
matcher@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
integrity sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==
dependencies:
escape-string-regexp "^4.0.0"
meow@^3.1.0:
version "3.7.0"
resolved "https://registry.npmmirror.com/meow/download/meow-3.7.0.tgz?cache=0&sync_timestamp=1637477517282&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmeow%2Fdownload%2Fmeow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@ -1819,6 +1947,14 @@ normalize-url@^4.1.0:
resolved "https://registry.nlark.com/normalize-url/download/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a"
integrity sha1-DdkM8SiO4dExO4cIHJpZMu5IUYo=
npm-conf@^1.1.3:
version "1.1.3"
resolved "https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
dependencies:
config-chain "^1.1.11"
pify "^3.0.0"
nugget@^2.0.1:
version "2.0.1"
resolved "https://registry.npm.taobao.org/nugget/download/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
@ -1847,6 +1983,11 @@ object-assign@^4.0.1:
resolved "https://registry.nlark.com/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
object-keys@~0.4.0:
version "0.4.0"
resolved "https://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
@ -1996,6 +2137,11 @@ pify@^2.0.0:
resolved "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
pify@^4.0.0, pify@^4.0.1:
version "4.0.1"
resolved "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@ -2054,6 +2200,16 @@ progress-stream@^1.1.0:
speedometer "~0.1.2"
through2 "~0.2.3"
progress@^2.0.3:
version "2.0.3"
resolved "https://registry.npmmirror.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@ -2283,6 +2439,18 @@ rimraf@^3.0.0:
dependencies:
glob "^7.1.3"
roarr@^2.15.3:
version "2.15.4"
resolved "https://registry.npmmirror.com/roarr/-/roarr-2.15.4.tgz#f5fe795b7b838ccfe35dc608e0282b9eba2e7afd"
integrity sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==
dependencies:
boolean "^3.0.1"
detect-node "^2.0.4"
globalthis "^1.0.1"
json-stringify-safe "^5.0.1"
semver-compare "^1.0.0"
sprintf-js "^1.1.2"
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
version "5.2.1"
resolved "https://registry.nlark.com/safe-buffer/download/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@ -2310,6 +2478,11 @@ sax@^1.2.4:
resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk=
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
semver-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.nlark.com/semver-diff/download/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
@ -2327,6 +2500,13 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=
semver@^7.3.2:
version "7.3.7"
resolved "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
semver@^7.3.4, semver@^7.3.5:
version "7.3.5"
resolved "https://registry.npm.taobao.org/semver/download/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
@ -2334,6 +2514,13 @@ semver@^7.3.4, semver@^7.3.5:
dependencies:
lru-cache "^6.0.0"
serialize-error@^7.0.1:
version "7.0.1"
resolved "https://registry.npmmirror.com/serialize-error/-/serialize-error-7.0.1.tgz#f1360b0447f61ffb483ec4157c737fab7d778e18"
integrity sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==
dependencies:
type-fest "^0.13.1"
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.nlark.com/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@ -2428,6 +2615,11 @@ speedometer@~0.1.2:
resolved "https://registry.npm.taobao.org/speedometer/download/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d"
integrity sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=
sprintf-js@^1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
sshpk@^1.7.0:
version "1.16.1"
resolved "https://registry.nlark.com/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
@ -2523,6 +2715,13 @@ sumchecker@^2.0.2:
dependencies:
debug "^2.2.0"
sumchecker@^3.0.1:
version "3.0.1"
resolved "https://registry.npmmirror.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
integrity sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==
dependencies:
debug "^4.1.0"
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.npmmirror.com/supports-color/download/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@ -2619,11 +2818,21 @@ tunnel-agent@^0.6.0:
dependencies:
safe-buffer "^5.0.1"
tunnel@^0.0.6:
version "0.0.6"
resolved "https://registry.npmmirror.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz?cache=0&sync_timestamp=1589682745749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftweetnacl%2Fdownload%2Ftweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-fest@^0.13.1:
version "0.13.1"
resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934"
integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==
type-fest@^0.20.2:
version "0.20.2"
resolved "https://registry.npmmirror.com/type-fest/download/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"

11
package.json

@ -3,7 +3,7 @@
"version": "4.0.0",
"description": "",
"#main": "main.js",
"main":"app/main/index.js",
"main": "app/main/index.js",
"build": {
"appId": "com.rjjh.app",
"win": {
@ -13,12 +13,12 @@
]
}
},
"scripts":{
"scripts": {
"start": "cross-env NODE_ENV=development electron ./app ",
"packager": "electron-packager ./app esdesktop-app --all --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_win": "cross-env NODE_ENV=production electron-packager ./app launcher --platform=win32 --arch=x64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_linux": "cross-env NODE_ENV=production electron-packager ./app launcher --platform=linux --arch=x64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_arm64": "electron-packager ./app launcher --platform=linux --arch=arm64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_linux": "cross-env NODE_ENV=production electron-packager ./app launcher --platform=linux --arch=x64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico --ignore-gpu-blacklist --ignore-gpu-blocklist",
"electron_arm64": "electron-packager ./app launcher --platform=linux --arch=arm64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico --ignore-gpu-blacklist --ignore-gpu-blocklist",
"electron_mips64el": "electron-packager ./app launcher --platform=linux --arch=mips64el --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_mips": "electron-packager ./app launcher --platform=linux --arch=mips --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
"electron_yw_arm64": "electron-packager ./tisywkj tisywkj --platform=linux --arch=arm64 --out ./OutApp --app-version 1.4.0 --overwrite --icon=./tray/appicon.ico",
@ -33,9 +33,10 @@
"devDependencies": {
"asar": "^3.0.3",
"cross-env": "^5.2.0",
"electron": "4.1.2"
"electron": "15.5.7"
},
"dependencies": {
"@electron/remote": "^2.0.8",
"axios": "^0.18.1",
"electron-builder": "^22.6.1",
"electron-packager": "^13.1.1"

2708
yarn.lock
File diff suppressed because it is too large
View File

Loading…
Cancel
Save