From 76347132b4c8796b52616487450ebfe2b3f0f03c Mon Sep 17 00:00:00 2001 From: xiangcongshuai Date: Fri, 8 Aug 2025 13:22:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B0=E5=AD=97=E4=BA=BA=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/dbHandler.js | 295 ++++++++++---- electron/main.js | 78 ++-- electron/preload.js | 15 +- package.json | 12 +- pnpm-lock.yaml | 235 ++++++++++- src/App.vue | 2 +- src/api/chat.ts | 4 +- src/api/user.ts | 3 +- src/assets/live/loading.png | Bin 0 -> 2595 bytes src/components/Sidebar/index.vue | 33 +- src/layout/hooks/useLayout.ts | 2 +- src/style/element-plus.scss | 30 +- src/style/index.scss | 2 +- src/types/electron-api.d.ts | 7 +- src/utils/httpProxy.ts | 10 + src/utils/responsive.ts | 2 +- src/views/AiLive/components/BasicSettings.vue | 123 ++++-- src/views/AiLive/components/GoodsManage.vue | 2 +- src/views/AiLive/index.vue | 10 +- src/views/DigitalHuman/list/index.vue | 23 +- src/views/Live/index.vue | 378 +++++++++++++++++- src/views/login/index.vue | 13 +- 22 files changed, 1037 insertions(+), 242 deletions(-) create mode 100644 src/assets/live/loading.png create mode 100644 src/utils/httpProxy.ts diff --git a/electron/dbHandler.js b/electron/dbHandler.js index 153ca79..25e7f69 100644 --- a/electron/dbHandler.js +++ b/electron/dbHandler.js @@ -1,24 +1,46 @@ const sqlite3 = require("sqlite3").verbose(); const path = require("path"); +const { app } = require("electron"); +const { spawn, exec } = require("child_process"); -// 获取数据库路径 +// ù +const processes = { + LiveTalkingProcess: null, + gptsovitsProcess: null, + chatProcess: null +}; +// ȡݿ· function getDatabasePath() { - const dbPath = path.join(__dirname, "..", "..", "live_chat.db"); - return dbPath; -} + if (process.env.NODE_ENV === "development") { + const dbPath = path.join(__dirname, "..", "..", "live_chat.db"); + return dbPath; + } else { + const exePath = app.getPath("exe"); + + // ȡwin-unpackedļ· + const winUnpackedDir = path.dirname(exePath); + + // ȡwin-unpackedϼĿ¼win-unpackedͬĿ¼ + const parentDir = path.dirname(winUnpackedDir); -// 更新配置值 -function updateConfigValue(key, value) { + // live_chat.db· + const dbPath = path.join(parentDir, "live_chat.db"); + console.log("dbPath", dbPath); + return dbPath; + } +} +// ֵ +function updateConfig(tableName, key, value) { return new Promise((resolve, reject) => { const db = new sqlite3.Database(getDatabasePath(), err => { if (err) { - console.error("数据库连接错误:", err.message); + console.error("ݿӴ:", err.message); return reject(err); } }); - // 先尝试更新,如果影响行数为0则插入新记录 + // ȳԸ£ӰΪ0¼¼ db.run( - `UPDATE config SET value = ? WHERE key = ?`, + `UPDATE ${tableName} SET value = ? WHERE key = ?`, [value, key], function (err) { if (err) { @@ -26,10 +48,10 @@ function updateConfigValue(key, value) { return reject(err); } - // 如果没有匹配的记录则插入 + // ûƥļ¼ if (this.changes === 0) { db.run( - `INSERT INTO config (key, value) VALUES (?, ?)`, + `INSERT INTO ${tableName} (key, value) VALUES (?, ?)`, [key, value], function (err) { db.close(); @@ -50,8 +72,8 @@ function updateConfigValue(key, value) { }); } -// 获取配置值 -function getConfigValue(key) { +// ȡֵ +function getConfigValue(tableName, key) { return new Promise((resolve, reject) => { const db = new sqlite3.Database(getDatabasePath(), err => { if (err) { @@ -59,18 +81,23 @@ function getConfigValue(key) { } }); - db.get(`SELECT value FROM config WHERE key = ?`, [key], (err, row) => { - db.close(); - if (err) return reject(err); - resolve(row ? row.value : null); - }); + db.get( + `SELECT value FROM ${tableName} WHERE key = ?`, + [key], + (err, row) => { + db.close(); + if (err) return reject(err); + resolve(row ? row.value : null); + } + ); }); } -// 批量插入系统消息 +// ϵͳϢ const bulkInsertSystemMessages = messages => { + console.log("ϵͳϢ:", messages); return new Promise((resolve, reject) => { if (!Array.isArray(messages) || messages.length === 0) { - reject(new Error("请提供有效的消息数组")); + reject(new Error("ṩЧϢ")); return; } @@ -80,74 +107,54 @@ const bulkInsertSystemMessages = messages => { reject(err); return; } - // 清空表 - db.run("DELETE FROM system_message", function (err) { + + // ʹ룬 + db.run("BEGIN TRANSACTION", err => { if (err) { - db.close(); reject(err); + db.close(); return; } - // 重置自增计数器(SQLite特定) - db.run( - "DELETE FROM sqlite_sequence WHERE name = 'system_message'", - err => { - if (err) { - db.close(); - reject(err); - return; - } else { - // 使用事务进行批量插入,提高性能 - db.run("BEGIN TRANSACTION", err => { - if (err) { - reject(err); + const stmt = db.prepare( + "INSERT INTO system_message (message) VALUES (?)" + ); + let completed = 0; + let errorOccurred = null; + + messages.forEach(message => { + stmt.run(message, function (err) { + if (err && !errorOccurred) { + errorOccurred = err; + } + + completed++; + + // Ϣ + if (completed === messages.length) { + stmt.finalize(); + + if (errorOccurred) { + db.run("ROLLBACK", () => { + reject(errorOccurred); db.close(); - return; - } - - const stmt = db.prepare( - "INSERT INTO system_message (message) VALUES (?)" - ); - let completed = 0; - let errorOccurred = null; - - messages.forEach(message => { - stmt.run(message, function (err) { - if (err && !errorOccurred) { - errorOccurred = err; - } - - completed++; - - // 所有消息都处理完毕 - if (completed === messages.length) { - stmt.finalize(); - - if (errorOccurred) { - db.run("ROLLBACK", () => { - reject(errorOccurred); - db.close(); - }); - } else { - db.run("COMMIT", err => { - if (err) { - reject(err); - } else { - resolve({ - success: true, - count: messages.length - }); - } - db.close(); - }); - } - } - }); }); - }); + } else { + db.run("COMMIT", err => { + if (err) { + reject(err); + } else { + resolve({ + success: true, + count: messages.length + }); + } + db.close(); + }); + } } - } - ); + }); + }); }); }); } catch (error) { @@ -155,8 +162,132 @@ const bulkInsertSystemMessages = messages => { } }); }; +// ϵͳϢ +const clearSystemMessages = () => { + return new Promise((resolve, reject) => { + const db = new sqlite3.Database(getDatabasePath(), err => { + if (err) { + reject(err); + return; + } + + // ʹTRUNCATE-likeձͬʱID + db.run("DELETE FROM system_message", err => { + if (err) { + reject(err); + db.close(); + return; + } + + // SQLiteض + db.run( + "DELETE FROM sqlite_sequence WHERE name = 'system_message'", + err => { + if (err) { + reject(err); + } else { + resolve({ success: true }); + } + db.close(); + } + ); + }); + }); + }); +}; +function getProcessExePath(fileName, exeName) { + let exePath; + let exeFolder; + // жǷΪ + if (process.env.NODE_ENV === "development") { + // process.cwd() ָͨĿĿ¼ + const projectRoot = process.cwd(); + const parentDir = path.dirname(projectRoot); + exePath = path.join(parentDir, fileName, exeName); + exeFolder = path.join(parentDir, fileName); + } else { + // : win-unpackedͬĿ¼µLiveTalkingļ + exePath = app.getPath("exe"); + // ȡwin-unpackedļ· + const winUnpackedDir = path.dirname(exePath); + // ȡwin-unpackedϼĿ¼ + const parentDir = path.dirname(winUnpackedDir); + exePath = path.join(parentDir, fileName, exeName); + exeFolder = path.join(parentDir, fileName); + } + console.log("exePath", exePath); + console.log("exeFolder", exeFolder); + // ׼·ʽ + return { exePath, exeFolder }; +} + +/** + * LiveTalking.exe + */ +async function startProcess(fileName, exeName) { + return new Promise(async (resolve, reject) => { + const processKey = `${fileName}Process`; + if (processes[processKey]) { + reject(`${fileName} is already running`); + return; + } + + // ȡ· + const obj = getProcessExePath(fileName, exeName); + try { + // ʱͨwmicȡϸϢWindows + const newProcess = spawn("cmd.exe", ["/c", obj.exePath], { + // ֱbatʹstart + cwd: obj.exeFolder, + windowsVerbatimArguments: true, + windowsHide: false, + detached: false // 룬ڸӽ + }); + + // ¼IDؼʵPID + processes[processKey] = { + process: newProcess, + pid: newProcess.pid // PIDںֹ + }; + newProcess.on("error", err => { + processes[processKey] = null; + reject(`ʧ: ${err.message}`); + }); + console.log(`spawned with PID ${newProcess.pid}`); + resolve(`${fileName} ɹ (PID: ${newProcess.pid})`); + } catch (err) { + reject(`쳣: ${err.message}`); + } + }); +} +// ֹͣн +async function stopAllProcesses() { + try { + // ԣɿն + for (const key in processes) { + if (processes[key]) { + delete processes[key]; + } + } + const projectRoot = process.cwd(); + const parentDir = path.dirname(projectRoot); + const exPath = path.join(parentDir, "kill-live.bat"); + const child = spawn("cmd.exe", ["/c", "start", '""', `"${exPath}"`], { + cwd: parentDir, + windowsVerbatimArguments: true, + windowsHide: false, + detached: true + }); + child.unref(); + } catch (err) { + console.error(err); + } +} module.exports = { - updateConfigValue, + updateConfig, getConfigValue, - bulkInsertSystemMessages + bulkInsertSystemMessages, + clearSystemMessages, + startProcess, + stopAllProcesses }; diff --git a/electron/main.js b/electron/main.js index 0bfd83b..40fd3ab 100644 --- a/electron/main.js +++ b/electron/main.js @@ -1,54 +1,30 @@ const { app, BrowserWindow } = require("electron"); const { ipcMain } = require("electron"); const path = require("path"); -const http = require("http"); -const httpProxy = require("http-proxy"); // 需要安装:npm install http-proxy const { - updateConfigValue, + updateConfig, getConfigValue, - bulkInsertSystemMessages + bulkInsertSystemMessages, + stopProcess, + startProcess, + stopAllProcesses } = require("./dbHandler"); -// 创建代理服务器 -const proxyServer = httpProxy.createProxyServer({}); - -// 定义目标服务 -const proxyTargets = { - "/live-digital-avatar-manage": - "http://192.168.10.25:9909/live-digital-avatar-manage" -}; - -// 创建本地 HTTP 服务器 -const server = http.createServer((req, res) => { - // 根据请求路径匹配目标服务 - for (const pathPrefix in proxyTargets) { - if (req.url.startsWith(pathPrefix)) { - const target = proxyTargets[pathPrefix]; - // 重写路径(移除前缀) - req.url = req.url.replace(pathPrefix, ""); - // 转发请求 - proxyServer.web(req, res, { target }); - return; - } - } - res.statusCode = 404; - res.end("Not Found"); -}); // 注册IPC通信处理 function registerIpcHandlers() { // 更新backend_token - ipcMain.handle("update-config", async (event, key, token) => { + ipcMain.handle("update-config", async (event, tableName, key, token) => { try { - return await updateConfigValue(key, token); + return await updateConfig(tableName, key, token); } catch (error) { console.error("更新backend_token失败:", error); throw error; } }); - ipcMain.handle("get-config", async (event, key) => { + ipcMain.handle("get-config", async (event, tableName, key) => { try { - return await getConfigValue(key); + return await getConfigValue(tableName, key); } catch (error) { console.error("获取失败:", error); throw error; @@ -62,12 +38,31 @@ function registerIpcHandlers() { throw error; } }); + ipcMain.handle("start-process", async (event, fileName, exeName) => { + try { + return await startProcess(fileName, exeName); + } catch (error) { + console.error("启动失败:", error); + throw error; + } + }); + ipcMain.handle("stop-process", async (event, fileName, exeName) => { + try { + return await stopProcess(fileName, exeName); + } catch (error) { + console.error("停止失败:", error); + throw error; + } + }); + ipcMain.handle("stop-all-process", async () => { + try { + return await stopAllProcesses(); + } catch (error) { + console.error("停止失败:", error); + throw error; + } + }); } -// 启动服务器 -server.listen(3000, () => { - console.log("Proxy server running on port 3000"); -}); - function createWindow() { const win = new BrowserWindow({ width: 1920, @@ -83,16 +78,17 @@ function createWindow() { win.webContents.on("did-fail-load", (event, errorCode, errorDescription) => { console.error("Preload 加载失败:", errorDescription); }); - win.webContents.openDevTools(); + // 加载应用 + console.log(process.env.NODE_ENV); + if (process.env.NODE_ENV === "development") { win.loadURL("http://localhost:8848/#/login"); win.webContents.openDevTools(); } else { + win.webContents.openDevTools(); win.loadFile("dist/index.html"); } - // win.loadURL("http://localhost:8848"); - // win.webContents.openDevTools(); } app.whenReady().then(() => { diff --git a/electron/preload.js b/electron/preload.js index 6bb3cee..630d432 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -3,13 +3,18 @@ const { contextBridge, ipcRenderer } = require("electron"); // 安全暴露数据库操作方法 contextBridge.exposeInMainWorld("electronAPI", { - updateConfig: async (key, value) => { - return await ipcRenderer.invoke("update-config", key, value); + updateConfig: async (tableName, key, value) => { + return await ipcRenderer.invoke("update-config", tableName, key, value); }, - getConfig: async (key, value) => { - return await ipcRenderer.invoke("get-config", key, value); + getConfig: async (tableName, key) => { + return await ipcRenderer.invoke("get-config", tableName, key); }, bulkInsertSystemMessages: async messages => { return await ipcRenderer.invoke("bulk-insert-system-messages", messages); - } + }, + startProcess: (fileName, exeName) => + ipcRenderer.invoke("start-process", fileName, exeName), + stopProcess: (fileName, exeName) => + ipcRenderer.invoke("stop-process", fileName, exeName), + stopAllProcesses: () => ipcRenderer.invoke("stop-all-process") }); diff --git a/package.json b/package.json index 5d3be11..a281224 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "electron/main.js", "private": true, "scripts": { - "dev": "NODE_OPTIONS=--max-old-space-size=4096 vite", + "dev": "NODE_ENV=development vite", "serve": "pnpm dev", "build": "vite build", "build:staging": "rimraf dist && vite build --mode staging", @@ -24,7 +24,7 @@ "lint": "pnpm lint:eslint && pnpm lint:prettier && pnpm lint:stylelint", "prepare": "husky install", "preinstall": "npx only-allow pnpm", - "electron:serve": "concurrently -k \"vite\" \"wait-on http://192.168.10.25:8080/live-digital-avatar-manage && electron .\"", + "electron:serve": "NODE_ENV=development electron .", "electron:build": "vite build && electron-builder" }, "build": { @@ -38,9 +38,14 @@ { "from": "resources/", "to": "resources/", - "filter": ["!*.asar"] + "filter": [ + "!*.asar" + ] } ], + "extraMetadata": { + "NODE_ENV": "production" + }, "files": [ "dist/**/*", "electron/**/*", @@ -105,6 +110,7 @@ "vue": "^3.3.4", "vue-router": "^4.2.2", "vue-types": "^5.1.0", + "vue-webrtc": "^3.0.1", "vue3-seamless-scroll": "^2.0.1", "wangeditor": "^4.7.15" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 028381e..7b44d8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,6 +110,9 @@ importers: vue-types: specifier: ^5.1.0 version: 5.1.3(vue@3.5.16(typescript@5.0.4)) + vue-webrtc: + specifier: ^3.0.1 + version: 3.0.1(typescript@5.0.4) vue3-seamless-scroll: specifier: ^2.0.1 version: 2.0.1 @@ -287,7 +290,7 @@ importers: version: 3.3.2 tailwindcss: specifier: ^3.3.2 - version: 3.4.17(ts-node@10.9.2(@types/node@20.19.0)(typescript@5.0.4)) + version: 3.4.17(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.8.3)) terser: specifier: ^5.18.1 version: 5.42.0 @@ -1076,6 +1079,9 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@sxzz/popperjs-es@2.11.7': resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} @@ -1734,6 +1740,12 @@ packages: axios@1.9.0: resolution: {integrity: sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==} + babel-polyfill@6.26.0: + resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} + + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1784,6 +1796,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bufferutil@4.0.9: + resolution: {integrity: sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw==} + engines: {node: '>=6.14.2'} + builder-util-runtime@9.3.1: resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} engines: {node: '>=12.0.0'} @@ -2052,6 +2068,10 @@ packages: core-js-pure@3.43.0: resolution: {integrity: sha512-i/AgxU2+A+BbJdMxh3v7/vxi2SbFqxiFmg6VsDwYB4jkucrd1BZNA9a9gphC0fYMG5IBSgQcbQnk865VCLe7xA==} + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + core-js@3.43.0: resolution: {integrity: sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA==} @@ -2185,6 +2205,10 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + cuid@2.1.8: + resolution: {integrity: sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==} + deprecated: Cuid and other k-sortable and non-cryptographic ids (Ulid, ObjectId, KSUID, all UUIDs) are all insecure. Use @paralleldrive/cuid2 instead. + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} @@ -2429,6 +2453,13 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + enhanced-resolve@5.18.2: resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} engines: {node: '>=10.13.0'} @@ -2447,6 +2478,9 @@ packages: err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + err-code@3.0.1: + resolution: {integrity: sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2786,6 +2820,9 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-browser-rtc@1.1.0: + resolution: {integrity: sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==} + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3663,6 +3700,12 @@ packages: namespace-emitter@2.0.1: resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + nanoassert@1.1.0: + resolution: {integrity: sha512-C40jQ3NzfkP53NsO8kEOFd79p4b9kDXQMwgiY1z8ZwrDZgUyom0AHwGegF4Dm99L+YoYhuaB0ceerUcXmqr1rQ==} + + nanobus@4.5.0: + resolution: {integrity: sha512-7sBZo9wthqNJ7QXnfVXZL7fkKJLN55GLOdX+RyZT34UOvxxnFtJe/c7K0ZRLAKOvaY1xJThFFn0Usw2H9R6Frg==} + nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3671,6 +3714,12 @@ packages: nanopop@2.4.2: resolution: {integrity: sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==} + nanoscheduler@1.0.3: + resolution: {integrity: sha512-jBbrF3qdU9321r8n9X7yu18DjP31Do2ItJm3mWrt90wJTrnDO+HXpoV7ftaUglAtjgj9s+OaCxGufbvx6pvbEQ==} + + nanotiming@7.3.1: + resolution: {integrity: sha512-l3lC7v/PfOuRWQa8vV29Jo6TG10wHtnthLElFXs4Te4Aas57Fo4n1Q8LH9n+NDh9riOzTVvb2QNBhTS4JUKNjw==} + napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} @@ -3715,6 +3764,10 @@ packages: encoding: optional: true + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} @@ -4507,6 +4560,15 @@ packages: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} engines: {node: '>=12'} + regenerator-runtime@0.10.5: + resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} + + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + remove-array-items@1.1.1: + resolution: {integrity: sha512-MXW/jtHyl5F1PZI7NbpS8SOtympdLuF20aoWJT5lELR1p/HJDd5nqW8Eu9uLh/hCRY3FgvrIT5AwDCgBODklcA==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4738,6 +4800,12 @@ packages: simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-peer@9.11.1: + resolution: {integrity: sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==} + + simple-signal-client@3.0.0: + resolution: {integrity: sha512-eiqR8S+2i1squkIVKx4IgEyGe7do/soMb2Lt06gJov281sLl3USyIn1fKAg/hzcIvevOpuH1BmzFZ6BSugFZsQ==} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -4777,6 +4845,14 @@ packages: resolution: {integrity: sha512-ig5qOnCDbugFntKi6c7Xlib8bA6xiJVk8O+WdFrV3wxbMqeHO0hXFQC4nAhPVWfZfi8255lcZkNhtIBINCc4+Q==} engines: {node: '>=12.17.0'} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} @@ -5327,6 +5403,10 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} @@ -5453,6 +5533,10 @@ packages: vue: optional: true + vue-webrtc@3.0.1: + resolution: {integrity: sha512-Wm5QAyuPhQVYHU8RLhGnD6ocaQVxatfYqoIUHF9Fq/Cer19dA7fSiZO+q4Q+XwvN40M4f8STaZRhF1A/rKfeVg==} + engines: {node: '>=12'} + vue3-seamless-scroll@2.0.1: resolution: {integrity: sha512-mI3BaDU3pjcPUhVSw3/xNKdfPBDABTi/OdZaZqKysx4cSdNfGRbVvGNDzzptBbJ5S7imv5T55l6x/SqgnxKreg==} @@ -5543,6 +5627,18 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -5551,6 +5647,10 @@ packages: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -6456,6 +6556,8 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@socket.io/component-emitter@3.1.2': {} + '@sxzz/popperjs-es@2.11.7': {} '@szmarczak/http-timer@4.0.6': @@ -7310,6 +7412,17 @@ snapshots: transitivePeerDependencies: - debug + babel-polyfill@6.26.0: + dependencies: + babel-runtime: 6.26.0 + core-js: 2.6.12 + regenerator-runtime: 0.10.5 + + babel-runtime@6.26.0: + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + balanced-match@1.0.2: {} balanced-match@2.0.0: {} @@ -7362,6 +7475,10 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + bufferutil@4.0.9: + dependencies: + node-gyp-build: 4.8.4 + builder-util-runtime@9.3.1: dependencies: debug: 4.4.1 @@ -7693,6 +7810,8 @@ snapshots: core-js-pure@3.43.0: {} + core-js@2.6.12: {} + core-js@3.43.0: {} core-util-is@1.0.2: @@ -7890,6 +8009,8 @@ snapshots: csstype@3.1.3: {} + cuid@2.1.8: {} + d@1.0.2: dependencies: es5-ext: 0.10.64 @@ -8183,6 +8304,20 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + engine.io-parser: 5.2.3 + ws: 8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 @@ -8196,6 +8331,8 @@ snapshots: err-code@2.0.3: {} + err-code@3.0.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -8635,6 +8772,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-browser-rtc@1.1.0: {} + get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -9523,10 +9662,27 @@ snapshots: namespace-emitter@2.0.1: {} + nanoassert@1.1.0: {} + + nanobus@4.5.0: + dependencies: + nanoassert: 1.1.0 + nanotiming: 7.3.1 + remove-array-items: 1.1.1 + nanoid@3.3.11: {} nanopop@2.4.2: {} + nanoscheduler@1.0.3: + dependencies: + nanoassert: 1.1.0 + + nanotiming@7.3.1: + dependencies: + nanoassert: 1.1.0 + nanoscheduler: 1.0.3 + napi-build-utils@2.0.0: {} natural-compare-lite@1.4.0: {} @@ -9561,6 +9717,8 @@ snapshots: optionalDependencies: encoding: 0.1.13 + node-gyp-build@4.8.4: {} + node-gyp@8.4.1: dependencies: env-paths: 2.2.1 @@ -9913,7 +10071,7 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.5 - postcss-load-config@4.0.2(postcss@8.5.5)(ts-node@10.9.2(@types/node@20.19.0)(typescript@5.0.4)): + postcss-load-config@4.0.2(postcss@8.5.5)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.0 @@ -10332,6 +10490,12 @@ snapshots: indent-string: 5.0.0 strip-indent: 4.0.0 + regenerator-runtime@0.10.5: {} + + regenerator-runtime@0.11.1: {} + + remove-array-items@1.1.1: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -10547,6 +10711,28 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 + simple-peer@9.11.1: + dependencies: + buffer: 6.0.3 + debug: 4.4.1 + err-code: 3.0.1 + get-browser-rtc: 1.1.0 + queue-microtask: 1.2.3 + randombytes: 2.1.0 + readable-stream: 3.6.2 + transitivePeerDependencies: + - supports-color + + simple-signal-client@3.0.0: + dependencies: + babel-polyfill: 6.26.0 + cuid: 2.1.8 + inherits: 2.0.4 + nanobus: 4.5.0 + simple-peer: 9.11.1 + transitivePeerDependencies: + - supports-color + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -10590,6 +10776,24 @@ snapshots: snabbdom@3.6.2: {} + socket.io-client@4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + engine.io-client: 6.6.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 @@ -10938,7 +11142,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.19.0)(typescript@5.0.4)): + tailwindcss@3.4.17(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -10957,7 +11161,7 @@ snapshots: postcss: 8.5.5 postcss-import: 15.1.0(postcss@8.5.5) postcss-js: 4.0.1(postcss@8.5.5) - postcss-load-config: 4.0.2(postcss@8.5.5)(ts-node@10.9.2(@types/node@20.19.0)(typescript@5.0.4)) + postcss-load-config: 4.0.2(postcss@8.5.5)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.5) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -11236,6 +11440,10 @@ snapshots: dependencies: punycode: 2.3.1 + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.4 + utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} @@ -11359,6 +11567,18 @@ snapshots: optionalDependencies: vue: 3.5.16(typescript@5.0.4) + vue-webrtc@3.0.1(typescript@5.0.4): + dependencies: + bufferutil: 4.0.9 + core-js: 3.43.0 + simple-signal-client: 3.0.0 + socket.io-client: 4.8.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) + utf-8-validate: 5.0.10 + vue: 3.5.16(typescript@5.0.4) + transitivePeerDependencies: + - supports-color + - typescript + vue3-seamless-scroll@2.0.1: dependencies: throttle-debounce: 5.0.0 @@ -11483,10 +11703,17 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + ws@8.17.1(bufferutil@4.0.9)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + xml-name-validator@4.0.0: {} xmlbuilder@15.1.1: {} + xmlhttprequest-ssl@2.1.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} diff --git a/src/App.vue b/src/App.vue index 314a84d..05aeb5a 100644 --- a/src/App.vue +++ b/src/App.vue @@ -37,7 +37,7 @@ export default defineComponent({ const route = useRoute(); // 判断需要显示菜单 const isLoginPage = computed(() => - ["/login", "/live"].includes(route.path) + ["/login", "/Live"].includes(route.path) ); return { currentLocale: zhCn, isLoginPage }; } diff --git a/src/api/chat.ts b/src/api/chat.ts index 4ea8609..0a02631 100644 --- a/src/api/chat.ts +++ b/src/api/chat.ts @@ -1,9 +1,9 @@ import { http } from "@/utils/http"; - +import config from "@/utils/httpProxy"; export const getSalespitch = (data?: object) => { return http.request( "post", - "/live-digital-avatar-manage/liveDigital/generate/salespitch", + `${config.services.liveDigital}/generate/salespitch`, { data } ); }; diff --git a/src/api/user.ts b/src/api/user.ts index 1fa24c6..d13976e 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -1,4 +1,5 @@ import { http } from "@/utils/http"; +import config from "@/utils/httpProxy"; export type UserResult = { success: boolean; @@ -26,7 +27,7 @@ export type RefreshTokenResult = { export const getLogin = (data?: object) => { return http.request( "post", - "/live-digital-avatar-manage/auth/login", + `${config.services.liveDigital}/auth/login`, { data } diff --git a/src/assets/live/loading.png b/src/assets/live/loading.png new file mode 100644 index 0000000000000000000000000000000000000000..3932476b3d0e9630c9f144d0a3353ff9aed6f70c GIT binary patch literal 2595 zcmV+;3f%RHP)Px;-AP12RCr$PT>*B}I1rT*;5{B`OHQzGf^AR0a)RBSV9N=Xo&b7+mJ9WbDy6pR^-L-C zn^Fqz_?};O?}th$yw2(UJAFP=N}Xw~@mu4XZc2|x;D0HlUMQvhAYsSsUIK(t>dW-} zpS9Kis`geZ03`H1rPQA!bXTLH#Vj~zFg_=m?rJoh3zorFf_J=NMF7=ppOsP{>jtA1 z0E{uv@HdXoA=qzIft`?0Ana(3t_d*M%ItIFnjf{+co%JA09e}ok3}ym^dl0w2v1XA zpag7vEOgM)f!6wi6bd2$7-L?O#)BfzaHBB)qq?1=F$Ofn7KzW?KM^1*1%S-{y`}MR zfN!<3C9TMNNM!jmP;9X5f0Rof+i-;aMMF+qb^Ear4Vs&u( zJFWHG#;JQihaBpx#6Ls>fE*jl7krNfy4kBjYXW2!?Js1_P#`E48k7sx5G7!U0swXL z6LBXxh7O{mE7MY};bjcvS{eXj3}R~t9}y1BG)l*sh@7KnxYu2+^-|-Nr2rtl=a?CT z7&zJ}rrAUQ&?ll=M0Oa^p@C)*QkQC_0U(n^q=N>^xtET%l+D>n(tbS143asDg*#I+^=n=oh-U?K-ekbn1cauB7oLwevTy|2muH| zqvjw0$n!(#e+JPiPG?H>#V&$1PEA~P}asS2T^@-NWH3ggbyt&bP zDR@D90tbb`^J~umptuz%p}|>*nCa!!wUHDAU2C|x@uV+#T}o&|zM$AXJ7XIFRD~hu zb2`mu^L%IJeXI!pwYl-cn+J=1^J&i527rgonCTa*5^fm)>|^INlmOt+&)hs>Ye3rh zS_S~vGc5(+mT{~qH`MWS zX}OpoTwMHotviNG97V2cwAtV4^=hl$o<^OwK6gq%=m-|hi92AH_Taz&o^{9OlbX#U zRoApWAFIi3zt>x;qIua4E-3x9+Kux+q60AZCICWbG&$C@U?6%!wc4nwcl(bYi=iVs|tvZeZgi+?*)<#d9Ub8xHm3W>30B8jEVGv8e`J@`t zFVxNVY4>Vn9?k*4ZAcVQO6L<^tlyXR3k~7>3;+;Ng zG?ROi0pQLT@e57k`;`CyHxc3&n#lJn0|0Jh@Z-mJS9Ol>j29Zr_aOi@(g~+^d@vYn zce;;`wVvGK*B!0iB-Infe9_uq(~sfA zbPknD_8(H?iP`UO)t6!@002h(n3zezP)-aLTH6$Qu^9imxcYghRkG!cN^`Qdlh(={ zZEW;WRsL__@csB9=-&h6v-kaHyC1}mx8G{3Nr09^=)v=*%vvxQlN?}I^@P4+a-FL3rDnUb8v z(eqHWmPlwJz7OR4P!O8t7hJ}vy)0!JzAplTJ=s&|c)@bO3uP%>n6*&38+wDw{EsK) zC6Z{iU#O!tl-MSDK0k$U;Ql&I4I{MX(iA?h9t=;|Xu;vW$X<9y=UA=&9`9_} zlsVn&+p>(eVH6!5uL2;}B8=Sa-h2Sq+iumifaAUaVx^qD+xdGJ<*oOQD+Yfk_3&A} z08kvul@sfYTXXPmb{Gy?a~BGLy(8>;>*5R$D%-l4tibjMC<{C&W}K`2@99K4CjaqJ z2QTm2k_fT@E1|@zyz$i<1QLuTe0)==u%QqDPGV^d!mOf%H6QXQT;5q204HJBY7iXZ zmkQHM0k8()j^>vVKIB*$fD}4v>tn16(@tq8oEFE>qGO~i5G56g0Pb5{l=8$tr0bX3 z_FyRsu%aUffBh)K5*if+0HPxd)({6{;}5jT9syh8K1&}$T94f%c`LVf6oN;Yy^98b zWexU2k?-|`Jt@jTP9MsJdx5i!x|w-&0LU6ZN%kXPD|r@gX|?tonDQiW1Q-y0^qp2J z0U*N~@O7hsAi-l`#dL%IR{A9HN&)ZzF}+bt^hDRHB9=iJO!zHOCvO-fMx7!6SvP8PFRB7G4Bzybm#A<#H?5*`n_Ih{U@4(ruY zA9~{xZr1NKUV+eYO -import { onMounted, ref } from "vue"; +import { onMounted, ref, watch } from "vue"; import userImg from "@/assets/home/user.png"; import actUserImg from "@/assets/home/act_user.png"; import liveImg from "@/assets/home/live.png"; import actLiveImg from "@/assets/home/act_live.png"; import settingImg from "@/assets/home/setting.png"; import actSettingImg from "@/assets/home/act_setting.png"; -import { useRouter } from "vue-router"; -const activedName = ref("user"); +import { useRoute, useRouter } from "vue-router"; + +const route = useRoute(); const router = useRouter(); +const activedName = ref((route.name as string) || "DigitalHuman"); +watch( + () => route.name, + newName => { + activedName.value = newName as string; + } +); + function handleSidebarClick(name: string, path: string) { activedName.value = name; router.push(path); @@ -20,28 +29,28 @@ onMounted(() => {});