From 6c34d8df858b0c795dd06da0962c22f9d1c40bd2 Mon Sep 17 00:00:00 2001
From: ZhangXianQiang <1135831638@qq.com>
Date: 星期四, 13 六月 2024 14:50:48 +0800
Subject: [PATCH] feat(在线培训):添加在线培训流程
---
dist-electron/background.js | 33 ++
src/preload.js | 5
package-lock.json | 336 ++++++++++++++++++++++++++++++
src/views/train/data-list/index.vue | 78 +++++++
index.html | 6
src/views/train/index.vue | 61 +++++
package.json | 1
src/background.js | 38 +++
src/views/meet/index.vue | 30 ++
src/assets/image/list-card-bg.jpg | 0
src/router/index.js | 17 +
src/views/menu/index.vue | 11
12 files changed, 594 insertions(+), 22 deletions(-)
diff --git a/dist-electron/background.js b/dist-electron/background.js
index aedb9c8..a903300 100644
--- a/dist-electron/background.js
+++ b/dist-electron/background.js
@@ -1,15 +1,18 @@
"use strict";
-const { app, BrowserWindow, screen } = require("electron");
+const { app, BrowserWindow, screen, globalShortcut, ipcMain } = require("electron");
const { join } = require("path");
process.env["ELECTRON_DISABLE_SECURITY_WARNINGS"] = "true";
-const createWindow = () => {
- const { width, height } = screen.getPrimaryDisplay().bounds;
+const createWindow = (width, height) => {
const win = new BrowserWindow({
width,
height,
minWidth: 1280,
- minHeight: 720
+ minHeight: 720,
+ webPreferences: {
+ preload: join(__dirname, "preload.js")
+ }
});
+ win.maximize();
if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL);
win.webContents.openDevTools();
@@ -18,11 +21,31 @@
}
};
app.whenReady().then(() => {
- createWindow();
+ const { width, height } = screen.getPrimaryDisplay().bounds;
+ createWindow(width, height);
app.on("activate", () => {
if (BrowserWindow.getAllWindows().length === 0)
createWindow();
});
+ ipcMain.on("open-new-window", () => {
+ const childWin = new BrowserWindow({
+ width,
+ height,
+ minWidth: width,
+ minHeight: height,
+ webPreferences: {
+ preload: join(__dirname, "preload.js")
+ }
+ });
+ childWin.maximize();
+ if (process.env.VITE_DEV_SERVER_URL) {
+ childWin.loadURL(process.env.VITE_DEV_SERVER_URL + "#/meet");
+ } else {
+ childWin.loadFile(join(__dirname, "../dist/index.html"), {
+ hash: "/meet"
+ });
+ }
+ });
});
app.on("window-all-closed", () => {
if (process.platform !== "darwin")
diff --git a/index.html b/index.html
index 8388c4b..1f7f6f8 100644
--- a/index.html
+++ b/index.html
@@ -5,9 +5,15 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
+ <script src='https://meet.jit.si/external_api.js'></script>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
+ <script>
+ window.onload = () => {
+ window.JitsiMeetExternalAPI = JitsiMeetExternalAPI;
+ }
+ </script>
</body>
</html>
diff --git a/package-lock.json b/package-lock.json
index 693490d..a7c2315 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
"name": "jxkg-new-ui",
"version": "0.0.0",
"dependencies": {
+ "@jitsi/electron-sdk": "^6.0.40",
"axios": "^1.7.2",
"dayjs": "^1.11.11",
"element-plus": "^2.7.3",
@@ -832,6 +833,48 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/@jitsi/electron-sdk": {
+ "version": "6.0.40",
+ "resolved": "https://registry.npmmirror.com/@jitsi/electron-sdk/-/electron-sdk-6.0.40.tgz",
+ "integrity": "sha512-dUr74XakxX4Keiq8Z2VSNhKw5W3e2GQy4TVh5JhhLi/lltxito5ulZzak22rlHaL1qQ3u35hI2+Lale7x2FFIQ==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@jitsi/logger": "^2.0.2",
+ "@jitsi/robotjs": "^0.6.13",
+ "electron-store": "^8.0.1",
+ "node-addon-api": "^8.0.0",
+ "node-gyp-build": "4.8.1",
+ "postis": "^2.2.0"
+ }
+ },
+ "node_modules/@jitsi/electron-sdk/node_modules/node-addon-api": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-8.0.0.tgz",
+ "integrity": "sha512-ipO7rsHEBqa9STO5C5T10fj732ml+5kLN1cAG8/jdHd56ldQeGj3Q7+scUS+VHK/qy1zLEwC4wMK5+yM0btPvw==",
+ "engines": {
+ "node": "^18 || ^20 || >= 21"
+ }
+ },
+ "node_modules/@jitsi/logger": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/@jitsi/logger/-/logger-2.0.2.tgz",
+ "integrity": "sha512-qwbpRwuwkBFgh0F5jivq/5fAm46yVoXURc5LCklEs8lAShYVangFEXKW7RLpZuZ5nQnrHrlvU8MswQNREmvahg=="
+ },
+ "node_modules/@jitsi/robotjs": {
+ "version": "0.6.13",
+ "resolved": "https://registry.npmmirror.com/@jitsi/robotjs/-/robotjs-0.6.13.tgz",
+ "integrity": "sha512-uFxRQp83jbKfMzk3lYIjgevy1X1dU/Z7OMPnqfdO1LcyPaXsOf+FCWSxM/KIxz0PvbBbORxUzuae5O5dAF5Kqw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "node-addon-api": "^4.2.0",
+ "node-gyp-build": "^4.3.0"
+ }
+ },
+ "node_modules/@jitsi/robotjs/node_modules/node-addon-api": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz",
+ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ=="
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
@@ -1623,6 +1666,42 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
+ "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.4.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
"node_modules/ajv-keywords": {
"version": "3.5.2",
"resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -1908,6 +1987,14 @@
"dev": true,
"engines": {
"node": ">= 4.0.0"
+ }
+ },
+ "node_modules/atomically": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/atomically/-/atomically-1.7.0.tgz",
+ "integrity": "sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==",
+ "engines": {
+ "node": ">=10.12.0"
}
},
"node_modules/autoprefixer": {
@@ -2440,6 +2527,60 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true
},
+ "node_modules/conf": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmmirror.com/conf/-/conf-10.2.0.tgz",
+ "integrity": "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==",
+ "dependencies": {
+ "ajv": "^8.6.3",
+ "ajv-formats": "^2.1.1",
+ "atomically": "^1.7.0",
+ "debounce-fn": "^4.0.0",
+ "dot-prop": "^6.0.1",
+ "env-paths": "^2.2.1",
+ "json-schema-typed": "^7.0.3",
+ "onetime": "^5.1.2",
+ "pkg-up": "^3.1.0",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conf/node_modules/ajv": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz",
+ "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2",
+ "uri-js": "^4.4.1"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/conf/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
+ },
+ "node_modules/conf/node_modules/semver": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz",
+ "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/confbox": {
"version": "0.1.7",
"resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.7.tgz",
@@ -2580,6 +2721,17 @@
"version": "1.11.11",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.11.tgz",
"integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
+ },
+ "node_modules/debounce-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/debounce-fn/-/debounce-fn-4.0.0.tgz",
+ "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==",
+ "dependencies": {
+ "mimic-fn": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
"node_modules/debug": {
"version": "4.3.4",
@@ -2805,6 +2957,20 @@
},
"engines": {
"node": ">=8"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-6.0.1.tgz",
+ "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/dotenv": {
@@ -3047,6 +3213,29 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/electron-store": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmmirror.com/electron-store/-/electron-store-8.2.0.tgz",
+ "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==",
+ "dependencies": {
+ "conf": "^10.2.0",
+ "type-fest": "^2.17.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/electron-store/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.4.788",
"resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.788.tgz",
@@ -3108,7 +3297,6 @@
"version": "2.2.1",
"resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-2.2.1.tgz",
"integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -3252,8 +3440,7 @@
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
},
"node_modules/fast-glob": {
"version": "3.3.2",
@@ -3314,6 +3501,17 @@
},
"engines": {
"node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
"node_modules/follow-redirects": {
@@ -3913,6 +4111,14 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
@@ -4030,6 +4236,11 @@
"resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
+ },
+ "node_modules/json-schema-typed": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmmirror.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz",
+ "integrity": "sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A=="
},
"node_modules/json-stringify-safe": {
"version": "5.0.1",
@@ -4202,6 +4413,18 @@
"url": "https://github.com/sponsors/antfu"
}
},
+ "node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
@@ -4357,6 +4580,14 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-fn": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-3.1.0.tgz",
+ "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/mimic-response": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz",
@@ -4486,6 +4717,16 @@
"dev": true,
"optional": true
},
+ "node_modules/node-gyp-build": {
+ "version": "4.8.1",
+ "resolved": "https://registry.npmmirror.com/node-gyp-build/-/node-gyp-build-4.8.1.tgz",
+ "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==",
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
+ }
+ },
"node_modules/node-releases": {
"version": "2.0.14",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
@@ -4564,6 +4805,28 @@
"wrappy": "1"
}
},
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/onetime/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-2.1.1.tgz",
@@ -4573,11 +4836,52 @@
"node": ">=8"
}
},
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pako": {
"version": "1.0.11",
"resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"dev": true
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "engines": {
+ "node": ">=4"
+ }
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
@@ -4734,6 +5038,17 @@
"confbox": "^0.1.7",
"mlly": "^1.7.0",
"pathe": "^1.1.2"
+ }
+ },
+ "node_modules/pkg-up": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/pkg-up/-/pkg-up-3.1.0.tgz",
+ "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
"node_modules/plist": {
@@ -4898,6 +5213,11 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "node_modules/postis": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/postis/-/postis-2.2.0.tgz",
+ "integrity": "sha512-MKoPQqjjNU6aDr9IN3VFMZk+ND2jXjBGVHdU/Kgyffb8mr11ZQSE7QwmpLw+iYRjF8YIDSgdVoaPLugJ0ycHYg=="
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -4945,7 +5265,6 @@
"version": "2.3.1",
"resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
"engines": {
"node": ">=6"
}
@@ -5050,6 +5369,14 @@
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"engines": {
"node": ">=0.10.0"
}
@@ -6077,7 +6404,6 @@
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
"dependencies": {
"punycode": "^2.1.0"
}
diff --git a/package.json b/package.json
index 4b74a76..9bf3fc5 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
"electron:dev": "vite && electron"
},
"dependencies": {
+ "@jitsi/electron-sdk": "^6.0.40",
"axios": "^1.7.2",
"dayjs": "^1.11.11",
"element-plus": "^2.7.3",
diff --git a/src/assets/image/list-card-bg.jpg b/src/assets/image/list-card-bg.jpg
new file mode 100644
index 0000000..34346f6
--- /dev/null
+++ b/src/assets/image/list-card-bg.jpg
Binary files differ
diff --git a/src/background.js b/src/background.js
index c7c4802..1cc5e7a 100644
--- a/src/background.js
+++ b/src/background.js
@@ -1,5 +1,5 @@
// src-electron/main.js
-const { app, BrowserWindow,screen } = require('electron');
+const { app, BrowserWindow, screen, globalShortcut, ipcMain } = require('electron');
const { join } = require('path');
// 灞忚斀瀹夊叏璀﹀憡
@@ -7,16 +7,18 @@
process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true';
// 鍒涘缓娴忚鍣ㄧ獥鍙f椂锛岃皟鐢ㄨ繖涓嚱鏁般��
-const createWindow = () => {
- const {width, height} = screen.getPrimaryDisplay().bounds;
+const createWindow = (width, height) => {
const win = new BrowserWindow({
width: width,
height: height,
minWidth: 1280,
minHeight: 720,
+ webPreferences: {
+ preload: join(__dirname, 'preload.js')
+ }
});
- // win.loadURL('http://localhost:3000')
+ win.maximize();
// development妯″紡
if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL);
@@ -29,12 +31,38 @@
// Electron 浼氬湪鍒濆鍖栧悗骞跺噯澶�
app.whenReady().then(() => {
- createWindow();
+ const { width, height } = screen.getPrimaryDisplay().bounds;
+ createWindow(width, height);
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
+ });
+
+ // 鐩戝惉鎵撳紑鏂扮獥鍙�
+ ipcMain.on('open-new-window', () => {
+ const childWin = new BrowserWindow({
+ width: width,
+ height: height,
+ minWidth: width,
+ minHeight: height,
+ webPreferences: {
+ preload: join(__dirname, 'preload.js')
+ }
+ });
+ childWin.maximize();
+ // development妯″紡
+ if (process.env.VITE_DEV_SERVER_URL) {
+ childWin.loadURL(process.env.VITE_DEV_SERVER_URL + '#/meet');
+ } else {
+ childWin.loadFile(join(__dirname, '../dist/index.html'), {
+ hash: '/meet'
+ });
+ }
});
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit();
});
+
+
+
diff --git a/src/preload.js b/src/preload.js
new file mode 100644
index 0000000..6540bd3
--- /dev/null
+++ b/src/preload.js
@@ -0,0 +1,5 @@
+const { contextBridge, ipcRenderer } = require('electron');
+
+contextBridge.exposeInMainWorld('electron', {
+ openNewWindow: (arg) => ipcRenderer.send('open-new-window', arg)
+});
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
index 91a47a3..802dfd4 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,11 +1,11 @@
-import { createMemoryHistory, createRouter } from 'vue-router';
+import { createWebHashHistory, createRouter } from 'vue-router';
import Layout from '@/layout/index.vue';
const routes = [
{
path: '/',
- redirect: '/exam'
+ redirect: '/index'
},
{
@@ -24,7 +24,16 @@
},
]
},
-
+ // 鍦ㄧ嚎鍩硅
+ {
+ path: '/train',
+ component: () => import('@/views/train/index.vue'),
+ },
+ // 浼氳
+ {
+ path: '/meet',
+ component: () => import('@/views/meet/index.vue'),
+ },
// 鑰冭瘯鍒楄〃
{
path: '/exam-list',
@@ -44,7 +53,7 @@
];
const router = createRouter({
- history: createMemoryHistory(),
+ history: createWebHashHistory(),
routes,
});
diff --git a/src/views/meet/index.vue b/src/views/meet/index.vue
new file mode 100644
index 0000000..cd6e192
--- /dev/null
+++ b/src/views/meet/index.vue
@@ -0,0 +1,30 @@
+<template>
+ <div class="meet-container w-screen h-screen">
+ <div id="meet" ref="meet"></div>
+ </div>
+</template>
+
+<script setup>
+import { ref, onMounted } from 'vue';
+const meet = ref(null);
+onMounted(() => {
+ const width = window.innerWidth;
+ const height = window.innerHeight;
+ const domain = 'ycl.easyblog.vip:8443';
+ const options = {
+ roomName: 'test',
+ width: width,
+ height: height,
+ parentNode: meet.value,
+ lang: 'zh_CN',
+ configOverwrite: {
+ prejoinConfig: {
+ enabled: false
+ }
+ },
+ };
+ const api = new JitsiMeetExternalAPI(domain, options);
+});
+</script>
+
+<style lang="scss" scoped></style>
\ No newline at end of file
diff --git a/src/views/menu/index.vue b/src/views/menu/index.vue
index 4ff1669..668c68a 100644
--- a/src/views/menu/index.vue
+++ b/src/views/menu/index.vue
@@ -25,7 +25,7 @@
<script setup>
import { ref } from 'vue';
-import {useRouter} from 'vue-router';
+import { useRouter } from 'vue-router';
const router = useRouter();
@@ -33,6 +33,11 @@
{
name: '璇剧▼',
categroy: [
+ {
+ title: '鍦ㄧ嚎鍩硅',
+ iconPath: new URL('@/assets/icons/icon2.png', import.meta.url).href,
+ path: '/train'
+ },
{
title: '鎴戠殑璇剧▼',
iconPath: new URL('@/assets/icons/icon1.png', import.meta.url).href,
@@ -58,10 +63,10 @@
]);
const menuClick = (item) => {
- if(item.path) {
+ if (item.path) {
router.push(item.path);
}
-}
+};
</script>
<style lang="scss" scoped>
diff --git a/src/views/train/data-list/index.vue b/src/views/train/data-list/index.vue
new file mode 100644
index 0000000..72bfe2c
--- /dev/null
+++ b/src/views/train/data-list/index.vue
@@ -0,0 +1,78 @@
+<template>
+ <div class="list-container w-full h-full">
+ <el-scrollbar>
+ <el-row :gutter="20">
+ <el-col :span="6" v-for="item in dataList">
+ <el-card shadow="hover" class="list-card cursor-pointer" :body-style="{ padding: 0 }" @click="itemClick(item)">
+ <div class="img-container w-full">
+ <img src="@/assets/image/list-card-bg.jpg" class="w-full">
+ </div>
+ <div class="item-info p-3">
+ <div class="info-title font-bold">{{ item.title }}</div>
+ <div class="info-teacher flex text-sm text-gray-500">
+ <div class="info-label">涓昏:</div>
+ <div class="info-text">{{ item.teacher }}</div>
+ </div>
+ <div class="info-time flex text-sm text-gray-500">
+ <div class="info-label">寮�濮嬫椂闂�:</div>
+ <div class="info-text">{{ item.startTime }}</div>
+ </div>
+ <div class="info-time flex text-sm text-gray-500">
+ <div class="info-label">缁撴潫鏃堕棿:</div>
+ <div class="info-text">{{ item.endTime }}</div>
+ </div>
+ </div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </el-scrollbar>
+ </div>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import { Timer } from '@element-plus/icons-vue';
+import { useRouter } from 'vue-router';
+const router = useRouter();
+
+const dataList = ref([
+ {
+ title: '娴嬭瘯1',
+ startTime: '2024-6-13 8:00',
+ endTime: '2024-6-13 8:00',
+ teacher: '娴嬭瘯娴嬭瘯',
+ roomName: 'test'
+ }
+])
+
+
+const itemClick = (item) => {
+ if(window.electron) {
+ window.electron.openNewWindow();
+ }
+}
+
+</script>
+
+<style lang="scss" scoped>
+.item {
+ width: 100%;
+ min-height: 120px;
+}
+
+.bottom-item {
+ margin-right: 30px;
+}
+
+.img-container {
+ object-fit: cover;
+ object-position: center;
+ width: 100%;
+ max-height: 160px;
+ overflow: hidden;
+}
+
+.list-card {
+ border-radius: 10px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/train/index.vue b/src/views/train/index.vue
new file mode 100644
index 0000000..ca45a28
--- /dev/null
+++ b/src/views/train/index.vue
@@ -0,0 +1,61 @@
+<template>
+ <div class="train-container w-screen h-screen bg-slate-50 flex flex-col items-center">
+ <NormalHeader class="shrink-0"></NormalHeader>
+
+ <div class="list-container container grow relative">
+ <div class="list-content absolute top-0 bottom-0 left-0 right-0 py-4">
+ <div class="list-wrapper w-full h-full">
+ <el-card class="h-full" :body-style="{ height: '100%' }">
+ <div class="card-wrapper w-full h-full flex flex-col px-8 box-border">
+ <div class="card-header flex justify-between items-center shrink-0">
+ <div class="header-tab">
+ <el-tabs v-model="activeName" @tab-click="handleClick">
+ <el-tab-pane label="鍏ㄩ儴" name="1"></el-tab-pane>
+ <el-tab-pane label="鏈紑濮�" name="2"></el-tab-pane>
+ <el-tab-pane label="杩涜涓�" name="3"></el-tab-pane>
+ <el-tab-pane label="宸茬粨鏉�" name="4"></el-tab-pane>
+ </el-tabs>
+ </div>
+ <div class="header-search flex items-center">
+ <el-input v-model="searchText" placeholder="璇疯緭鍏ヨ�冭瘯鍚嶇О" :prefix-icon="Search" />
+ <el-button type="primary" class="ml-4">鎼滅储</el-button>
+ </div>
+ </div>
+
+ <div class="card-main flex-1 my-5 relative">
+ <div class="main-content absolute top-0 bottom-0 left-0 right-0">
+ <DataList></DataList>
+
+ <div id="meet" ref="meet"></div>
+ </div>
+ </div>
+
+ <div class="card-footer flex justify-center mb-7 shrink-0">
+ <el-pagination background layout="prev, pager, next" :total="1000" />
+ </div>
+ </div>
+ </el-card>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import NormalHeader from '@/components/NormalHeader/index.vue';
+import DataList from './data-list/index.vue';
+import { Search } from '@element-plus/icons-vue';
+const activeName = ref('1');
+const searchText = ref('');
+
+const handleClick = (tab, event) => {
+};
+
+</script>
+
+<style lang="scss" scoped>
+:deep(.el-tabs__nav-wrap:after) {
+ display: none;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.8.0