From 1253aa1cebf1097ca791a1342169e0b0fd4f7702 Mon Sep 17 00:00:00 2001 From: zyl <731870902@qq.com> Date: Wed, 15 Oct 2025 14:06:08 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=80=81=E5=8A=BF=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 5 + .idea/electron-4.iml | 12 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + electron.vite.config.1760428378950.mjs | 60 +++ package-lock.json | 7 + src/main/index.ts | 33 +- src/renderer/components.d.ts | 3 + src/renderer/src/auto-imports.d.ts | 1 - src/renderer/src/main.ts | 16 +- src/renderer/src/router/index.ts | 14 +- src/renderer/src/views/TS/cabin.vue | 113 ++++++ src/renderer/src/views/TS/edit.vue | 49 +++ src/renderer/src/views/TS/element.vue | 261 +++++++++++++ src/renderer/src/views/TS/index.vue | 367 ++++++++++++++++++ .../components/leftSide/leftSideFirst.vue | 24 +- yarn.lock | 5 + 17 files changed, 953 insertions(+), 31 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/electron-4.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 electron.vite.config.1760428378950.mjs create mode 100644 src/renderer/src/views/TS/cabin.vue create mode 100644 src/renderer/src/views/TS/edit.vue create mode 100644 src/renderer/src/views/TS/element.vue create mode 100644 src/renderer/src/views/TS/index.vue diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/electron-4.iml b/.idea/electron-4.iml new file mode 100644 index 0000000..0c8867d --- /dev/null +++ b/.idea/electron-4.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5e314af --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/electron.vite.config.1760428378950.mjs b/electron.vite.config.1760428378950.mjs new file mode 100644 index 0000000..0d8db36 --- /dev/null +++ b/electron.vite.config.1760428378950.mjs @@ -0,0 +1,60 @@ +// electron.vite.config.ts +import { resolve } from "path"; +import { defineConfig, externalizeDepsPlugin } from "electron-vite"; +import vue from "@vitejs/plugin-vue"; +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; +import { createSvgIconsPlugin } from "vite-plugin-svg-icons"; +import path from "path"; +var electron_vite_config_default = defineConfig({ + main: { + plugins: [externalizeDepsPlugin()] + }, + preload: { + plugins: [externalizeDepsPlugin()] + }, + renderer: { + resolve: { + alias: { + "@renderer": resolve("src/renderer/src"), + "@": resolve("src/renderer/src") + } + }, + plugins: [ + vue(), + AutoImport({ + imports: ["vue"], + dts: "src/auto-imports.d.ts", + // 自动生成类型声明文件 + resolvers: [ElementPlusResolver()] + }), + Components({ + resolvers: [ElementPlusResolver()] + }), + // SVG图标插件配置 + // 配置SVG图标插件 + createSvgIconsPlugin({ + iconDirs: [path.resolve(process.cwd(), "src/renderer/src/icons/svg")], + symbolId: "icon-[name]", + // 自动清除 SVG 中的 fill 和 stroke 属性 + svgoOptions: { + plugins: [{ name: "removeAttrs", params: { attrs: ["fill", "stroke", "stroke-width"] } }] + } + }) + ] + // server: { + // port: 8808, + // proxy: { + // '/api': { + // target: localStorage.getItem('ip') || 'http://127.0.0.1:8808', + // changeOrigin: true, + // rewrite: (path) => path.replace(/^\/api/, '') + // } + // } + // } + } +}); +export { + electron_vite_config_default as default +}; diff --git a/package-lock.json b/package-lock.json index defaba5..c18ada6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "pinia": "^3.0.3", "pinia-plugin-persistedstate": "^4.4.1", "scss": "^0.2.4", + "three": "^0.180.0", "verror": "^1.10.1", "vue-clipboard3": "^2.0.0", "vue-i18n": "^9.14.5", @@ -12775,6 +12776,12 @@ "node": ">= 10.0.0" } }, + "node_modules/three": { + "version": "0.180.0", + "resolved": "https://registry.npmmirror.com/three/-/three-0.180.0.tgz", + "integrity": "sha512-o+qycAMZrh+TsE01GqWUxUIKR1AL0S8pq7zDkYOQw8GqfX8b8VoCKYUoHbhiX5j+7hr8XsuHDVU6+gkQJQKg9w==", + "license": "MIT" + }, "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", diff --git a/src/main/index.ts b/src/main/index.ts index 9d1ac06..ac2e0a8 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -1,13 +1,13 @@ -import { app, shell, BrowserWindow, ipcMain, globalShortcut, dialog } from 'electron' -import path, { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' +import {app, shell, BrowserWindow, ipcMain, globalShortcut, dialog} from 'electron' +import path, {join} from 'path' +import {electronApp, optimizer, is} from '@electron-toolkit/utils' import icon from '../../resources/earth.png?asset' -import { Recorder } from "../preload/recorder"; +import {Recorder} from "../preload/recorder"; import fs from 'fs' -import { exec } from 'child_process' +import {exec} from 'child_process' import dayjs from 'dayjs' -import { GetHomeDir } from './config' -import { start, getServer } from "./app"; +import {GetHomeDir} from './config' +import {start, getServer} from "./app"; // 开发环境路径处理 - 确保添加正确的file协议 @@ -67,6 +67,7 @@ stopBatPath = process.platform === 'win32' ? stopBatPath.replace(/^(\w:)/, '/$1' // ? `${join(app.getAppPath(), 'src/renderer/public/startUp/startUp.html')}` // : `file://${join(app.getAppPath(), 'resources/app.asar/out/renderer/startUp/startUp.html')}` let isRestart = false + function createWindow(): void { // Create the browser window. @@ -102,7 +103,7 @@ function createWindow(): void { useContentSize: true, // 窗口尺寸包含内容区域而非边框 simpleFullscreen: true, // 使用简单全屏模式(仅macOS有效) backgroundColor: '#00000000', // 添加这行设置透明背景 - ...(process.platform === 'linux' ? { icon } : {}), + ...(process.platform === 'linux' ? {icon} : {}), webPreferences: { preload: join(__dirname, '../preload/index.js'), sandbox: false, @@ -116,7 +117,7 @@ function createWindow(): void { ipcMain.on("restart", () => { // app.relaunch(); // app.quit(); - // cleanupProcess.kill(); + // cleanupProcess.kill(); // app.relaunch(); isRestart = true windowAllClosed() @@ -162,7 +163,7 @@ function createWindow(): void { event.sender.send("selectedItem", arr); }); }); - ipcMain.on("saveFile", (event, { title, filename, filters }) => { + ipcMain.on("saveFile", (event, {title, filename, filters}) => { dialog .showSaveDialog({ title, @@ -180,9 +181,13 @@ function createWindow(): void { ipcMain.handle('getIsFullScreen', () => { return mainWindow.isFullScreen() }); - ipcMain.on('toggle-fullscreen', (event) => { + ipcMain.on('toggle-fullscreen', (event, flag = null) => { const win = BrowserWindow.fromWebContents(event.sender); - win!.setFullScreen(!win!.isFullScreen()); + let full = !win!.isFullScreen() + if (flag != null) { + full = flag + } + win!.setFullScreen(full); }); mainWindow.on('enter-full-screen', () => { mainWindow.webContents.send('fullscreen-status-changed', true) @@ -209,7 +214,7 @@ function createWindow(): void { let path = dialog.showSaveDialogSync({ title: "保存视频文件", defaultPath: dayjs().format("YYYYMMDDHHmmss") + "视频录制.mp4", - filters: [{ name: "文件类型", extensions: ["mp4"] }], + filters: [{name: "文件类型", extensions: ["mp4"]}], }); if (path != undefined) { recorder.move(path, () => { @@ -292,7 +297,7 @@ function createWindow(): void { // 设置窗口标题和图标 mainWindow.webContents.setWindowOpenHandler((details) => { shell.openExternal(details.url) - return { action: 'deny' } + return {action: 'deny'} }) // 注册 F5 快捷键刷新 globalShortcut.register('CommandOrControl+F5', () => { diff --git a/src/renderer/components.d.ts b/src/renderer/components.d.ts index cefa92b..653534f 100644 --- a/src/renderer/components.d.ts +++ b/src/renderer/components.d.ts @@ -11,11 +11,13 @@ declare module 'vue' { BaseDialog: typeof import('./src/components/dialog/baseDialog.vue')['default'] Directory: typeof import('./src/components/dialog/directory.vue')['default'] DirectoryEdit: typeof import('./src/components/dialog/directoryEdit.vue')['default'] + ElAutoResizer: typeof import('element-plus/es')['ElAutoResizer'] ElButton: typeof import('element-plus/es')['ElButton'] ElCard: typeof import('element-plus/es')['ElCard'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] ElCol: typeof import('element-plus/es')['ElCol'] + ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDialog: typeof import('element-plus/es')['ElDialog'] ElForm: typeof import('element-plus/es')['ElForm'] ElFormItem: typeof import('element-plus/es')['ElFormItem'] @@ -29,6 +31,7 @@ declare module 'vue' { ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTableV2: typeof import('element-plus/es')['ElTableV2'] ElTabPane: typeof import('element-plus/es')['ElTabPane'] ElTabs: typeof import('element-plus/es')['ElTabs'] ElTree: typeof import('element-plus/es')['ElTree'] diff --git a/src/renderer/src/auto-imports.d.ts b/src/renderer/src/auto-imports.d.ts index f06b3ba..72bc97c 100644 --- a/src/renderer/src/auto-imports.d.ts +++ b/src/renderer/src/auto-imports.d.ts @@ -8,7 +8,6 @@ export {} declare global { const EffectScope: typeof import('vue')['EffectScope'] const ElMessage: typeof import('element-plus/es')['ElMessage'] - const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] const computed: typeof import('vue')['computed'] const createApp: typeof import('vue')['createApp'] const customRef: typeof import('vue')['customRef'] diff --git a/src/renderer/src/main.ts b/src/renderer/src/main.ts index 9671205..45491ca 100644 --- a/src/renderer/src/main.ts +++ b/src/renderer/src/main.ts @@ -1,17 +1,19 @@ import './assets/main.css' -import { createApp } from 'vue' +import {createApp} from 'vue' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' +// 引入中文语言包 +import zhCn from 'element-plus/dist/locale/zh-cn.mjs' import App from './App.vue' import router from './router' -import { createI18n } from 'vue-i18n' -import { setupStore } from './store' +import {createI18n} from 'vue-i18n' +import {setupStore} from './store' import zhCN from './I18n/zh-CN' import zhTW from './I18n/zh-TW' import zhEN from './I18n/zh-EN' import 'virtual:svg-icons-register' -import { setupSvgIcon } from './icons' -import { EventBusPlugin } from './utils/bus' +import {setupSvgIcon} from './icons' +import {EventBusPlugin} from './utils/bus' import './assets/styles/font.css' import './assets/iconfont/font_4587902_y4fhjyq8fxn' // import './assets/styles/dhtmlxgantt.css' @@ -51,6 +53,8 @@ setupStore(setApp) setupSvgIcon(setApp) setApp.use(EventBusPlugin) setApp.use(router) -setApp.use(ElementPlus) +setApp.use(ElementPlus, { + locale: zhCn +}) setApp.use(i18n) setApp.mount('#app') diff --git a/src/renderer/src/router/index.ts b/src/renderer/src/router/index.ts index bf7a99e..d754f55 100644 --- a/src/renderer/src/router/index.ts +++ b/src/renderer/src/router/index.ts @@ -1,4 +1,4 @@ -import { createRouter, createWebHashHistory } from 'vue-router' +import {createRouter, createWebHashHistory} from 'vue-router' import homeIndex from '@/views/home/index.vue' const routes = [ @@ -7,7 +7,9 @@ const routes = [ component: () => import('@/views/login/index.vue'), hidden: true }, - { path: '/404', component: () => import('@/views/404.vue'), hidden: true }, + {path: '/ts', component: () => import('@/views/TS/index.vue'), hidden: true}, + {path: '/tsEdit', component: () => import('@/views/TS/edit.vue'), hidden: true}, + {path: '/404', component: () => import('@/views/404.vue'), hidden: true}, { path: '/home', @@ -16,7 +18,7 @@ const routes = [ hidden: true }, - { path: '/:pathMatch(.*)*', redirect: '/404', hidden: true } + {path: '/:pathMatch(.*)*', redirect: '/404', hidden: true} ] const router = createRouter({ @@ -28,10 +30,10 @@ router.beforeEach((to, from, next) => { if (to.path === '/') { next() } else { - if(localStorage.getItem('Authorization')) { + if (localStorage.getItem('Authorization')) { next() - }else - next("/") + } else + next("/") } }) diff --git a/src/renderer/src/views/TS/cabin.vue b/src/renderer/src/views/TS/cabin.vue new file mode 100644 index 0000000..9c45a5b --- /dev/null +++ b/src/renderer/src/views/TS/cabin.vue @@ -0,0 +1,113 @@ + + + + 仿真演练图层指挥舱 + + + + + + + + + + + + + diff --git a/src/renderer/src/views/TS/edit.vue b/src/renderer/src/views/TS/edit.vue new file mode 100644 index 0000000..90014fe --- /dev/null +++ b/src/renderer/src/views/TS/edit.vue @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + diff --git a/src/renderer/src/views/TS/element.vue b/src/renderer/src/views/TS/element.vue new file mode 100644 index 0000000..ee73bc5 --- /dev/null +++ b/src/renderer/src/views/TS/element.vue @@ -0,0 +1,261 @@ + + + + 元素库 + + + + + + {{ item.name }} + + + + + + + + + + {{ item.name }} + + + + + + + + + + + + + + + diff --git a/src/renderer/src/views/TS/index.vue b/src/renderer/src/views/TS/index.vue new file mode 100644 index 0000000..02d1e84 --- /dev/null +++ b/src/renderer/src/views/TS/index.vue @@ -0,0 +1,367 @@ + + + + 实景三维态势推演系统 + + + + + + + + + 历史推演 + + + + + + 推演名称 + 创建人 + 创建时间 + 搜索 + 重置 + + + 新建推演 + 导入 + 导出 + + + + + + + + + + 编辑 + 删除 + + + + + + + + + + + + + diff --git a/src/renderer/src/views/components/leftSide/leftSideFirst.vue b/src/renderer/src/views/components/leftSide/leftSideFirst.vue index 3043c9f..987fe9a 100644 --- a/src/renderer/src/views/components/leftSide/leftSideFirst.vue +++ b/src/renderer/src/views/components/leftSide/leftSideFirst.vue @@ -33,13 +33,16 @@