diff --git a/electron.vite.config.1762408912589.mjs b/electron.vite.config.1762408912589.mjs new file mode 100644 index 0000000..3edbcb9 --- /dev/null +++ b/electron.vite.config.1762408912589.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: 8848, + proxy: { + '/api': { + target: localStorage.getItem('ip') || 'http://127.0.0.1:8848', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + }*/ + } +}); +export { + electron_vite_config_default as default +}; diff --git a/electron.vite.config.1762408928311.mjs b/electron.vite.config.1762408928311.mjs new file mode 100644 index 0000000..3edbcb9 --- /dev/null +++ b/electron.vite.config.1762408928311.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: 8848, + proxy: { + '/api': { + target: localStorage.getItem('ip') || 'http://127.0.0.1:8848', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } + } + }*/ + } +}); +export { + electron_vite_config_default as default +}; diff --git a/src/main/index.ts b/src/main/index.ts index 1fcc74d..e6ce29d 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -14,6 +14,10 @@ const yaml = require("js-yaml"); let Store = require('electron-store') Store.initRenderer(); +process.on('unhandledRejection', (reason) => { + console.error('主进程异步异常:', reason); +}); + // 开发环境路径处理 - 确保添加正确的file协议 const devSplashPath = path.resolve( @@ -272,6 +276,25 @@ function createWindow(): void { mainWindow.on('leave-full-screen', () => { mainWindow.webContents.send('fullscreen-status-changed', false) }); + mainWindow.on("close", (e) => { + e.preventDefault(); + dialog + .showMessageBox(mainWindow, { + type: "warning", + title: "提示", + message: "是否确认退出系统?", + buttons: ["cancel", "ok"], + }) + .then((res) => { + if (res.response) { + setTimeout(() => { + mainWindow.destroy() + mainWindow = null; + }, 200); + windowAllClosed(); + } + }); + }); let recorder; ipcMain.on("startRecoder", () => { @@ -494,8 +517,10 @@ function forceQuit() { app.relaunch(); } console.log('------退出-------'); - app.exit(); - app.quit(); + setTimeout(() => { + app.exit(); + app.quit(); + }, 500); } else { // 其他系统 process.exit(0); @@ -514,14 +539,12 @@ function closeAllWindows() { }); } -const gotTheLock = app.requestSingleInstanceLock(); +const gotTheLock = app.requestSingleInstanceLock(); if (!gotTheLock) { app.quit(); } else { - if (app.isReady()) { - } - + app.on("ready", createWindow); app.whenReady().then(() => { // alert(devSplashURL) // alert(prodSplashURL) @@ -545,26 +568,18 @@ if (!gotTheLock) { }); // Set app user model id for windows electronApp.setAppUserModelId('com.electron') - + // Default open or close DevTools by F12 in development // and ignore CommandOrControl + R in production. // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils app.on('browser-window-created', (_, window) => { optimizer.watchWindowShortcuts(window) }) - + // IPC test ipcMain.on('ping', () => console.log('pong')) - - createWindow() - - app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) }) - + // 退出时注销所有快捷键 app.on('will-quit', () => { globalShortcut.unregisterAll() @@ -582,7 +597,7 @@ if (!gotTheLock) { } }); - + // testNapi() global.sharedObject = { hasService: false, diff --git a/src/renderer/src/api/ts/index.ts b/src/renderer/src/api/ts/index.ts index 578969c..7592f87 100644 --- a/src/renderer/src/api/ts/index.ts +++ b/src/renderer/src/api/ts/index.ts @@ -53,4 +53,17 @@ export const TsApi = { data }) }, +// /tsEvent/update + updateTsEvent: async (data: any) => { + return await request.post({ + url: '/tsEvent/update', + data + }) + }, + delEvent: async (data: any) => { + return await request.post({ + url: '/tsEvent/delete', + data + }) + } } diff --git a/src/renderer/src/views/TS/cabin.vue b/src/renderer/src/views/TS/cabin.vue index 87a9101..a28bd0e 100644 --- a/src/renderer/src/views/TS/cabin.vue +++ b/src/renderer/src/views/TS/cabin.vue @@ -49,7 +49,7 @@ const initTreeCallBack = () => { console.log('queryTsSource', res) if (res.code == 200) { for (let i = res.data.length - 1; i >= 0; i--) { - res.data[i].icon = await cusNodeIcon(res.data[i]); + res.data[i].svg = await cusNodeIcon(res.data[i]); } zNodes.value = res.data console.log("data", zNodes.value) @@ -96,7 +96,7 @@ const initTreeCallBack = () => { layers.sort((obj1, obj2) => { return obj1.detail.layerIndex - obj2.detail.layerIndex; }); - if (window.earth_ts) { + if ((window as any).earth_ts) { for (let i = 0; i < layers.length; i++) { // initMapData(layers[i].sourceType, layers[i].detail, null) } diff --git a/src/renderer/src/views/TS/components/chart.vue b/src/renderer/src/views/TS/components/chart.vue index b1251bc..3ccf71a 100644 --- a/src/renderer/src/views/TS/components/chart.vue +++ b/src/renderer/src/views/TS/components/chart.vue @@ -24,10 +24,14 @@ const selectedEventId = ref(null) const eventBus: any = inject('bus') const props = defineProps(['eventList', 'hr', 'originHrOffset', 'scrollLeft']) let clickEventBar = (event) => { - console.log("点击事件块") + console.log("点击事件块", selectedEventId.value, event.id) selectedEventId.value = (selectedEventId.value == null || selectedEventId.value != event.id) ? event.id : null - eventBus.emit('click-event-show-plane', event) + eventBus.emit('click-event-show-plane', selectedEventId.value ? event : null) } +// 点击事件属性编辑面板的取消按钮,取消选中时间块 +eventBus.on("click-cancel-hide-plane", () => { + selectedEventId.value = null +}) // 1. 定义响应式变量,用于强制更新 const refreshKey = ref(0) @@ -85,7 +89,7 @@ let getWidth = (durationTime) => { // 6. 让 progressStyle 间接依赖 refreshKey(通过 getWidth) let progressStyle = (task) => { let taskLeft = task.startTime - window['tsObj']._Store._startTimestamp; - let style = { + let style:any = { width: getWidth(task.duration_time) * 1000 + "px", left: getWidth(taskLeft) + "px", }; diff --git a/src/renderer/src/views/TS/components/eventParams.vue b/src/renderer/src/views/TS/components/eventParams.vue index 27e5950..b9e2aa4 100644 --- a/src/renderer/src/views/TS/components/eventParams.vue +++ b/src/renderer/src/views/TS/components/eventParams.vue @@ -1,8 +1,26 @@