diff --git a/electron/main.js b/electron/main.js new file mode 100644 index 0000000..a5e71eb --- /dev/null +++ b/electron/main.js @@ -0,0 +1,53 @@ +const { app, BrowserWindow } = require("electron"); +const path = require("path"); +const http = require("http"); +const httpProxy = require("http-proxy"); // 需要安装:npm install http-proxy + +// 创建代理服务器 +const proxyServer = httpProxy.createProxyServer({}); + +// 定义目标服务 +const proxyTargets = { + "/live-digital-avatar-manage": "http://192.168.10.25:8080/live-digital-avatar-manage", + "/asr": "http://192.168.10.138:8090", + "/tts": "http://192.168.10.113:9880" +}; + +// 创建本地 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"); +}); + +// 启动服务器 +server.listen(3000, () => { + console.log("Proxy server running on port 3000"); +}); + +function createWindow() { + const win = new BrowserWindow({ + width: 800, + height: 600, + webPreferences: { + preload: path.join(__dirname, "preload.js"), // 使用计算后的 __dirname + nodeIntegration: true, + contextIsolation: false + } + }); + + // 加载应用 + win.loadFile("dist/index.html"); +} + +app.whenReady().then(createWindow); diff --git a/electron/preload.js b/electron/preload.js new file mode 100644 index 0000000..f2b8530 --- /dev/null +++ b/electron/preload.js @@ -0,0 +1,6 @@ +import { contextBridge } from "electron"; + +// 安全地暴露 API 给渲染进程 +contextBridge.exposeInMainWorld("electronAPI", { + // 可以在这里添加需要暴露的 API +}); diff --git a/package-lock.json b/package-lock.json index 682053e..18153c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4029,6 +4029,12 @@ "@iconify/types": "*" } }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true + }, "node_modules/@iconify/vue": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/@iconify/vue/-/vue-4.3.0.tgz", @@ -4044,12 +4050,6 @@ "vue": ">=3" } }, - "node_modules/@iconify/vue/node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "dev": true - }, "node_modules/@isaacs/balanced-match": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", @@ -4154,12 +4154,6 @@ "node": ">=18.12.0" } }, - "node_modules/@nuxt/kit/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "optional": true - }, "node_modules/@nuxt/kit/node_modules/c12": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/c12/-/c12-3.1.0.tgz", @@ -5929,18 +5923,42 @@ "@types/estree": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "devOptional": true + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true + }, "node_modules/@types/js-cookie": { "version": "3.0.6", "resolved": "https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-3.0.6.tgz", "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/mockjs": { "version": "1.0.10", "resolved": "https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.10.tgz", "integrity": "sha512-SXgrhajHG7boLv6oU93CcmdDm0HYRiceuz6b+7z+/2lCJPTWDv0V5YiwFHT2ejE4bQqgSXQiVPQYPWv7LGsK1g==", "dev": true }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, "node_modules/@types/node": { "version": "20.19.9", "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.9.tgz", @@ -6330,12 +6348,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@typescript-eslint/utils/node_modules/@types/semver": { "version": "7.7.0", "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.0.tgz", @@ -21184,13 +21196,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "node_modules/schema-utils/node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", @@ -24279,20 +24284,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "peer": true - }, - "node_modules/webpack/node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 2a87da3..b756684 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -53,6 +53,28 @@ export default [ } ] }, + { + path: "/AiLive", + redirect: "/AiLive", + meta: { + title: "AI直播", + rank: 4 + }, + children: [ + { + path: "/AiLive", + name: "AiLive", + component: () => import("@/views/AiLive/index.vue"), + meta: { + title: "数字人", + showLink: true, + showParent: true, + roles: ["admin", "common"] + }, + children: [] + } + ] + }, { path: "/redirect", component: Layout, diff --git a/src/views/AiLive/index.vue b/src/views/AiLive/index.vue new file mode 100644 index 0000000..9b3cc91 --- /dev/null +++ b/src/views/AiLive/index.vue @@ -0,0 +1,9 @@ + + +