diff --git a/electron/main/window/create.ts b/electron/main/window/create.ts index e053d3359f209a31eff8bef8a3da909c820badd9..61a8534f6c89d2f3bdc960442834499a3696ebf3 100644 --- a/electron/main/window/create.ts +++ b/electron/main/window/create.ts @@ -25,6 +25,7 @@ export function createWindow( const win = new BrowserWindow({ ...options, webPreferences: { + webSecurity: false, // 禁用安全策略(不推荐) nodeIntegration: true, contextIsolation: false, preload: path.join(__dirname, '../preload/index.js'), diff --git a/electron/main/window/welcome.ts b/electron/main/window/welcome.ts index 9b69caa49072c1ea24a93c23b4c2bbc157b6aae8..fb31606db4ee7ffee4997ea1ef6f37a0e628dda9 100644 --- a/electron/main/window/welcome.ts +++ b/electron/main/window/welcome.ts @@ -49,7 +49,7 @@ export function createWelcomeWindow(): BrowserWindow { }); // 加载欢迎界面的 HTML 文件 - welcomeWindow.loadFile(path.join(__dirname, '../welcome/index.html')); + welcomeWindow.loadFile(path.join(__dirname, '../welcome/welcome.html')); // 开发模式下可以打开开发者工具 if (process.env.NODE_ENV === 'development') { diff --git a/electron/welcome/assets/images/logo-euler-copilot.png b/electron/welcome/assets/images/logo-euler-copilot.png new file mode 100644 index 0000000000000000000000000000000000000000..c9051151e00ffdfec60fa643af8b5cda91cae4d2 Binary files /dev/null and b/electron/welcome/assets/images/logo-euler-copilot.png differ diff --git a/electron/welcome/assets/images/welcome_bg.webp b/electron/welcome/assets/images/welcome_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ead216667ac020839249d296d7986854e4d19bd Binary files /dev/null and b/electron/welcome/assets/images/welcome_bg.webp differ diff --git a/electron/welcome/assets/svgs/close.svg b/electron/welcome/assets/svgs/close.svg new file mode 100644 index 0000000000000000000000000000000000000000..72cfe62bed616d1ad497073041938d97e33b2bdd --- /dev/null +++ b/electron/welcome/assets/svgs/close.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/electron/welcome/assets/svgs/copy_icon.svg b/electron/welcome/assets/svgs/copy_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..6750ed5c6fa94e7032ccd08fae13792cf842c399 --- /dev/null +++ b/electron/welcome/assets/svgs/copy_icon.svg @@ -0,0 +1,16 @@ + + + Created with Pixso. + + + + + + + + + + + + + diff --git a/electron/welcome/assets/svgs/error.svg b/electron/welcome/assets/svgs/error.svg new file mode 100644 index 0000000000000000000000000000000000000000..eff026d9a371ecd397542f213880a651cb1559cf --- /dev/null +++ b/electron/welcome/assets/svgs/error.svg @@ -0,0 +1,8 @@ + + + Created with Pixso. + + + + + diff --git a/electron/welcome/assets/svgs/left_arrow.svg b/electron/welcome/assets/svgs/left_arrow.svg new file mode 100644 index 0000000000000000000000000000000000000000..d776032013b05da0c71aa2487fb50e957e292f38 --- /dev/null +++ b/electron/welcome/assets/svgs/left_arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/electron/welcome/assets/svgs/local_deploy.svg b/electron/welcome/assets/svgs/local_deploy.svg new file mode 100644 index 0000000000000000000000000000000000000000..79f478da6a7d3a6beb00316f09969baab2bcc7ea --- /dev/null +++ b/electron/welcome/assets/svgs/local_deploy.svg @@ -0,0 +1,26 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/electron/welcome/assets/svgs/logo .svg b/electron/welcome/assets/svgs/logo .svg new file mode 100644 index 0000000000000000000000000000000000000000..b97dee1ef763c74ae59e4cf62541132f042da109 --- /dev/null +++ b/electron/welcome/assets/svgs/logo .svg @@ -0,0 +1,60 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/electron/welcome/assets/svgs/online_service.svg b/electron/welcome/assets/svgs/online_service.svg new file mode 100644 index 0000000000000000000000000000000000000000..0c815738869cc00cf2d037482242dc629cdec7ee --- /dev/null +++ b/electron/welcome/assets/svgs/online_service.svg @@ -0,0 +1,13 @@ + + + Created with Pixso. + + + + + + + + + + diff --git a/electron/welcome/assets/svgs/success.svg b/electron/welcome/assets/svgs/success.svg new file mode 100644 index 0000000000000000000000000000000000000000..676e309048dde792cb3988203f3a4e3bda88aa0b --- /dev/null +++ b/electron/welcome/assets/svgs/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/electron/welcome/index.html b/electron/welcome/index.html index 32ac67f06525a6b07c9586297f731880586e5e82..b3e397aec37c9c873eb0747ff9aab9f3e6290887 100644 --- a/electron/welcome/index.html +++ b/electron/welcome/index.html @@ -1,12 +1,86 @@ + 欢迎使用 openEuler Intelligence + -
-

欢迎使用 openEuler Intelligence

-
+
+
+ 欢迎使用 + +
+
+
+ + 后端本地部署 +
+
+ + 后端在线服务 +
+
+
- + + + \ No newline at end of file diff --git a/electron/welcome/index.vue b/electron/welcome/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..be1256640abea738c21c2fe4a8f3e53253e85deb --- /dev/null +++ b/electron/welcome/index.vue @@ -0,0 +1,9 @@ + + + \ No newline at end of file diff --git a/electron/welcome/localDeploy.vue b/electron/welcome/localDeploy.vue new file mode 100644 index 0000000000000000000000000000000000000000..679f983557b35327c7b3cd65dfc58e1d67b46edd --- /dev/null +++ b/electron/welcome/localDeploy.vue @@ -0,0 +1,137 @@ + + + + diff --git a/electron/welcome/main.ts b/electron/welcome/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f4151f629424a99858569fe4578150ae4eeaaf7 --- /dev/null +++ b/electron/welcome/main.ts @@ -0,0 +1,10 @@ +// Welcome 页面 Vue 应用入口 +import type { App } from 'vue'; +import { createApp } from 'vue'; +import WelcomeComponent from './index.vue'; + +// 创建 Vue 应用并挂载 +const app: App = createApp(WelcomeComponent); +app.mount('#app'); + +console.log('Welcome Vue app initialized'); diff --git a/electron/welcome/onlineService.vue b/electron/welcome/onlineService.vue new file mode 100644 index 0000000000000000000000000000000000000000..0adac7ca773ce099da03a42e88ed1e32f910158b --- /dev/null +++ b/electron/welcome/onlineService.vue @@ -0,0 +1,82 @@ + + + + diff --git a/electron/welcome/welcome.html b/electron/welcome/welcome.html new file mode 100644 index 0000000000000000000000000000000000000000..780dcc75956393c8c03440b7c5e68f5593be53dc --- /dev/null +++ b/electron/welcome/welcome.html @@ -0,0 +1,26 @@ + + + + + + + 欢迎使用 openEuler Intelligence + + + +
+ + + + + diff --git a/package.json b/package.json index ccf81cbbf6777e9578361228aba80e8c11e5a1aa..23294e3bd499b34df8132e2b06edfb3496864fe2 100644 --- a/package.json +++ b/package.json @@ -24,12 +24,14 @@ "type-check": "tsc --noEmit", "dev:render": "vite", "dev:preload": "node -r ts-node/register scripts/build-preload --env=development --watch", + "dev:welcome": "node -r ts-node/register scripts/build-welcome --env=development --watch", "dev:main": "node -r ts-node/register scripts/build-main --env=development --watch", - "dev:desktop": "concurrently -n=R,P,M -c=green,yellow,blue \"pnpm run dev:render\" \"pnpm run dev:preload\" \"pnpm run dev:main\"", + "dev:desktop": "concurrently -n=R,P,W,M -c=green,yellow,cyan,blue \"pnpm run dev:render\" \"pnpm run dev:preload\" \"pnpm run dev:welcome\" \"pnpm run dev:main\"", "build:render": "vite build --mode electron-production", "build:preload": "node -r ts-node/register scripts/build-preload --env=production", + "build:welcome": "node -r ts-node/register scripts/build-welcome --env=production", "build:main": "node -r ts-node/register scripts/build-main --env=production", - "build:desktop": "rimraf dist && pnpm run build:render && pnpm run build:preload && pnpm run build:main", + "build:desktop": "rimraf dist && pnpm run build:render && pnpm run build:preload && pnpm run build:welcome && pnpm run build:main", "package:win64": "pnpm run build:desktop && electron-builder --win --x64", "package:mac": "pnpm run build:desktop && electron-builder --mac --universal", "package:linux": "pnpm run build:desktop && electron-builder --linux" @@ -189,4 +191,4 @@ "vite-plugin-qiankun": "1.0.15" }, "packageManager": "pnpm@10.10.0+sha512.d615db246fe70f25dcfea6d8d73dee782ce23e2245e3c4f6f888249fb568149318637dca73c2c5c8ef2a4ca0d5657fb9567188bfab47f566d1ee6ce987815c39" -} +} \ No newline at end of file diff --git a/scripts/build-preload.ts b/scripts/build-preload.ts index 0b05d66ebb5e4c5723badcfad8f80934b3850160..7eb339bd321b0e6c5fde056d2600d813289656ed 100644 --- a/scripts/build-preload.ts +++ b/scripts/build-preload.ts @@ -38,7 +38,10 @@ const preloadEntries: PreloadEntry[] = [ ]; function createRollupConfig(entry: PreloadEntry): RollupOptions { - const compilationInclude = ['electron/**/*.ts']; + const compilationInclude = [ + 'electron/preload/**/*.ts', + 'electron/main/**/*.ts', + ]; const plugins: any[] = [ nodeResolve({ @@ -75,7 +78,6 @@ function createRollupConfig(entry: PreloadEntry): RollupOptions { targets: [ { src: 'build/trayTemplate.png', dest: 'dist' }, { src: 'build/tray.png', dest: 'dist' }, - { src: 'electron/welcome', dest: 'dist' }, // 复制 welcome 文件夹 ], }), ); diff --git a/scripts/build-welcome.ts b/scripts/build-welcome.ts new file mode 100644 index 0000000000000000000000000000000000000000..c1fca4b549d83678424d49adff32061cf0ed438b --- /dev/null +++ b/scripts/build-welcome.ts @@ -0,0 +1,96 @@ +import { build } from 'vite'; +import { resolve } from 'path'; +import vue from '@vitejs/plugin-vue'; +import chalk from 'chalk'; +import ora from 'ora'; +import minimist from 'minimist'; +import { mkdirSync, existsSync, readFileSync, writeFileSync } from 'fs'; + +const argv = minimist(process.argv.slice(2)); +const TAG = '[build-welcome.ts]'; + +const buildWelcome = async (watch = false) => { + const spinner = ora(`${TAG} Building welcome page...`); + + try { + if (!watch) spinner.start(); + + // 构建 Vue 应用 + await build({ + root: resolve(__dirname, '../electron/welcome'), + base: './', // 使用相对路径,解决 Electron 中资源加载问题 + build: { + outDir: resolve(__dirname, '../dist/welcome'), + emptyOutDir: !watch, // 在watch模式下不清空目录 + rollupOptions: { + input: resolve(__dirname, '../electron/welcome/main.ts'), + output: { + entryFileNames: 'welcome-app.js', + chunkFileNames: '[name].js', + assetFileNames: '[name].[ext]', + }, + }, + // 确保资源文件被正确复制 + copyPublicDir: false, + watch: watch ? {} : null, // 启用Vite内置的watch模式 + // 设置资源内联阈值,确保小图片被正确处理 + assetsInlineLimit: 0, // 禁用内联,确保所有资源都作为文件输出 + }, + plugins: [vue()], + resolve: { + alias: { + '@': resolve(__dirname, '../src'), + }, + }, + define: { + 'process.env.NODE_ENV': watch ? '"development"' : '"production"', + }, + }); + + // 复制并更新 HTML 文件 + const distDir = resolve(__dirname, '../dist/welcome'); + if (!existsSync(distDir)) { + mkdirSync(distDir, { recursive: true }); + } + + // 读取原始 HTML 文件 + let htmlContent = readFileSync( + resolve(__dirname, '../electron/welcome/welcome.html'), + 'utf-8', + ); + + // 插入 CSS 链接(在 前) + htmlContent = htmlContent.replace( + '', + ' \n', + ); + + // 写入更新后的 HTML 文件 + writeFileSync(resolve(distDir, 'welcome.html'), htmlContent); + + if (!watch) { + spinner.succeed(`${TAG} Welcome page built successfully`); + } else { + console.log( + `${TAG} ${chalk.green('Welcome page built successfully (watch mode)')}`, + ); + } + } catch (error) { + console.log(`\n${TAG} ${chalk.red('构建欢迎页面报错')}\n`, error, '\n'); + if (!watch) spinner.fail(`${TAG} Welcome page build failed`); + throw error; + } +}; + +if (require.main === module) { + if (argv.watch) { + console.log( + `${TAG} ${chalk.blue('Starting welcome page in watch mode...')}`, + ); + buildWelcome(true).catch(process.exit); + } else { + buildWelcome(false).catch(process.exit); + } +} + +export { buildWelcome }; diff --git a/scripts/rollup.config.ts b/scripts/rollup.config.ts index af0a6c15f43ae794113393e05cd2098c0f023ee6..acca2c6d980acaa28ffb16c7adc0c5ea537618bb 100644 --- a/scripts/rollup.config.ts +++ b/scripts/rollup.config.ts @@ -14,7 +14,10 @@ export interface ConfigOptions { proc: 'main' | 'render' | 'preload'; } -const compilationInclude = ['electron/**/*.ts']; +const compilationInclude = [ + 'electron/main/**/*.ts', + 'electron/preload/**/*.ts', +]; export default function (opts: ConfigOptions) { const sourcemap = opts.proc === 'render'; diff --git a/src/assets/images/welcome_bg.webp b/src/assets/images/welcome_bg.webp new file mode 100644 index 0000000000000000000000000000000000000000..2ead216667ac020839249d296d7986854e4d19bd Binary files /dev/null and b/src/assets/images/welcome_bg.webp differ diff --git a/src/assets/styles/theme.scss b/src/assets/styles/theme.scss index e2b03f5173c8c9c4af9fe74e72dfe150ae0d49a3..3fa6b9c5c5d55058c1993e10126c46443f8eda12 100644 --- a/src/assets/styles/theme.scss +++ b/src/assets/styles/theme.scss @@ -73,6 +73,7 @@ body[theme='dark'] { --expand-fold-active: url('../../assets/svgs/dark_expand_fold_active.svg'); --o-scrollbar-thumb: #d3dce9; --o-apiBox-bg: rgb(253, 254, 255); + --o-bg-welcome: url('../../assets/images/welcome_bg.webp'); } body[theme='light'] { @@ -145,6 +146,7 @@ body[theme='light'] { --o-scrollbar-thumb: #c3cedf; --o-apiBox-bg: rgb(253, 254, 255); --el-drawer-padding-primary: 24px !important; + --o-bg-welcome: url('../../assets/images/welcome_bg.webp'); } body { diff --git a/src/assets/svgs/copy_icon.svg b/src/assets/svgs/copy_icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..6750ed5c6fa94e7032ccd08fae13792cf842c399 --- /dev/null +++ b/src/assets/svgs/copy_icon.svg @@ -0,0 +1,16 @@ + + + Created with Pixso. + + + + + + + + + + + + + diff --git a/src/assets/svgs/local_deploy.svg b/src/assets/svgs/local_deploy.svg new file mode 100644 index 0000000000000000000000000000000000000000..79f478da6a7d3a6beb00316f09969baab2bcc7ea --- /dev/null +++ b/src/assets/svgs/local_deploy.svg @@ -0,0 +1,26 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/logo .svg b/src/assets/svgs/logo .svg new file mode 100644 index 0000000000000000000000000000000000000000..b97dee1ef763c74ae59e4cf62541132f042da109 --- /dev/null +++ b/src/assets/svgs/logo .svg @@ -0,0 +1,60 @@ + + + Created with Pixso. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/svgs/online_service.svg b/src/assets/svgs/online_service.svg new file mode 100644 index 0000000000000000000000000000000000000000..0c815738869cc00cf2d037482242dc629cdec7ee --- /dev/null +++ b/src/assets/svgs/online_service.svg @@ -0,0 +1,13 @@ + + + Created with Pixso. + + + + + + + + + + diff --git a/src/views/dialogue/components/TitleBar.vue b/src/views/dialogue/components/TitleBar.vue index 4ce5d02546ae98419d8ee33a91826d52f9dd5a96..fe93b68b5b467ec13c0096fe1ba8cb785aeeaa35 100644 --- a/src/views/dialogue/components/TitleBar.vue +++ b/src/views/dialogue/components/TitleBar.vue @@ -23,9 +23,10 @@ onMounted(async () => { const baseUrl = await getBaseUrl(); const origin = window.location.origin; const isElectron = window.navigator.userAgent.includes('Electron'); - iframeTarget.value = isElectron - ? `${baseUrl}/witchaind` - : `${origin}/witchaind`; + iframeTarget.value = 'http://localhost:3002/witchaind/' + // isElectron + // ? `${baseUrl}/witchaind` + // : `${origin}/witchaind`; }); const changeLanguagefun = (lang: 'zh_cn' | 'en') => { diff --git a/src/views/dialogue/dialogueView.vue b/src/views/dialogue/dialogueView.vue index b968bf51c4abef644a98f18c3eca06ebd7630a82..d971c0052526a1be5cdb5cb778f80ba57a3bebdb 100644 --- a/src/views/dialogue/dialogueView.vue +++ b/src/views/dialogue/dialogueView.vue @@ -188,7 +188,7 @@ onMounted(async () => { const iframe = document.getElementById('my-iframe') as HTMLIFrameElement; if (iframe) { - iframe.src = iframeTarget; + iframe.src = 'http://localhost:3002/witchaind/'; } }); diff --git a/src/views/tools/index.vue b/src/views/tools/index.vue index 7f5fe2c874f3229730e3f617a165d68f299b47c3..4c593ebf3e90641a220b46673d72a629b296f3cd 100644 --- a/src/views/tools/index.vue +++ b/src/views/tools/index.vue @@ -8,7 +8,7 @@ sandbox="allow-scripts allow-popups allow-same-origin allow-downloads" height="100%" width="100%" - :src="iframeTarget" + src="http://localhost:3002/witchaind/" @load="handleIframeLoad" @error="handleIframeError" > @@ -103,7 +103,8 @@ watch( // 添加错误处理 onMounted(async () => { - iframeTarget.value = await getIframeTarget(); + // iframeTarget.value = await getIframeTarget(); + iframeTarget.value = 'http://localhost:3002/witchaind/'; const iframe = iframeRef.value; if (iframe) { iframe.onerror = (error) => {