Merge branch 'zyl' of http://xny.yj-3d.com:3000/zhouyulong/electron-4 into zyl
This commit is contained in:
60
electron.vite.config.1762408912589.mjs
Normal file
60
electron.vite.config.1762408912589.mjs
Normal file
@ -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
|
||||||
|
};
|
||||||
60
electron.vite.config.1762408928311.mjs
Normal file
60
electron.vite.config.1762408928311.mjs
Normal file
@ -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
|
||||||
|
};
|
||||||
@ -14,6 +14,10 @@ const yaml = require("js-yaml");
|
|||||||
let Store = require('electron-store')
|
let Store = require('electron-store')
|
||||||
Store.initRenderer();
|
Store.initRenderer();
|
||||||
|
|
||||||
|
process.on('unhandledRejection', (reason) => {
|
||||||
|
console.error('主进程异步异常:', reason);
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
// 开发环境路径处理 - 确保添加正确的file协议
|
// 开发环境路径处理 - 确保添加正确的file协议
|
||||||
const devSplashPath = path.resolve(
|
const devSplashPath = path.resolve(
|
||||||
@ -272,6 +276,25 @@ function createWindow(): void {
|
|||||||
mainWindow.on('leave-full-screen', () => {
|
mainWindow.on('leave-full-screen', () => {
|
||||||
mainWindow.webContents.send('fullscreen-status-changed', false)
|
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;
|
let recorder;
|
||||||
ipcMain.on("startRecoder", () => {
|
ipcMain.on("startRecoder", () => {
|
||||||
@ -494,8 +517,10 @@ function forceQuit() {
|
|||||||
app.relaunch();
|
app.relaunch();
|
||||||
}
|
}
|
||||||
console.log('------退出-------');
|
console.log('------退出-------');
|
||||||
app.exit();
|
setTimeout(() => {
|
||||||
app.quit();
|
app.exit();
|
||||||
|
app.quit();
|
||||||
|
}, 500);
|
||||||
} else {
|
} else {
|
||||||
// 其他系统
|
// 其他系统
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
@ -514,14 +539,12 @@ function closeAllWindows() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const gotTheLock = app.requestSingleInstanceLock();
|
|
||||||
|
|
||||||
|
const gotTheLock = app.requestSingleInstanceLock();
|
||||||
if (!gotTheLock) {
|
if (!gotTheLock) {
|
||||||
app.quit();
|
app.quit();
|
||||||
} else {
|
} else {
|
||||||
if (app.isReady()) {
|
app.on("ready", createWindow);
|
||||||
}
|
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
// alert(devSplashURL)
|
// alert(devSplashURL)
|
||||||
// alert(prodSplashURL)
|
// alert(prodSplashURL)
|
||||||
@ -545,26 +568,18 @@ if (!gotTheLock) {
|
|||||||
});
|
});
|
||||||
// Set app user model id for windows
|
// Set app user model id for windows
|
||||||
electronApp.setAppUserModelId('com.electron')
|
electronApp.setAppUserModelId('com.electron')
|
||||||
|
|
||||||
// Default open or close DevTools by F12 in development
|
// Default open or close DevTools by F12 in development
|
||||||
// and ignore CommandOrControl + R in production.
|
// and ignore CommandOrControl + R in production.
|
||||||
// see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
// see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils
|
||||||
app.on('browser-window-created', (_, window) => {
|
app.on('browser-window-created', (_, window) => {
|
||||||
optimizer.watchWindowShortcuts(window)
|
optimizer.watchWindowShortcuts(window)
|
||||||
})
|
})
|
||||||
|
|
||||||
// IPC test
|
// IPC test
|
||||||
ipcMain.on('ping', () => console.log('pong'))
|
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', () => {
|
app.on('will-quit', () => {
|
||||||
globalShortcut.unregisterAll()
|
globalShortcut.unregisterAll()
|
||||||
@ -582,7 +597,7 @@ if (!gotTheLock) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
// testNapi()
|
// testNapi()
|
||||||
global.sharedObject = {
|
global.sharedObject = {
|
||||||
hasService: false,
|
hasService: false,
|
||||||
|
|||||||
@ -53,4 +53,17 @@ export const TsApi = {
|
|||||||
data
|
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
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -49,7 +49,7 @@ const initTreeCallBack = () => {
|
|||||||
console.log('queryTsSource', res)
|
console.log('queryTsSource', res)
|
||||||
if (res.code == 200) {
|
if (res.code == 200) {
|
||||||
for (let i = res.data.length - 1; i >= 0; i--) {
|
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
|
zNodes.value = res.data
|
||||||
console.log("data", zNodes.value)
|
console.log("data", zNodes.value)
|
||||||
@ -96,7 +96,7 @@ const initTreeCallBack = () => {
|
|||||||
layers.sort((obj1, obj2) => {
|
layers.sort((obj1, obj2) => {
|
||||||
return obj1.detail.layerIndex - obj2.detail.layerIndex;
|
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++) {
|
for (let i = 0; i < layers.length; i++) {
|
||||||
// initMapData(layers[i].sourceType, layers[i].detail, null)
|
// initMapData(layers[i].sourceType, layers[i].detail, null)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,10 +24,14 @@ const selectedEventId = ref(null)
|
|||||||
const eventBus: any = inject('bus')
|
const eventBus: any = inject('bus')
|
||||||
const props = defineProps(['eventList', 'hr', 'originHrOffset', 'scrollLeft'])
|
const props = defineProps(['eventList', 'hr', 'originHrOffset', 'scrollLeft'])
|
||||||
let clickEventBar = (event) => {
|
let clickEventBar = (event) => {
|
||||||
console.log("点击事件块")
|
console.log("点击事件块", selectedEventId.value, event.id)
|
||||||
selectedEventId.value = (selectedEventId.value == null || selectedEventId.value != event.id) ? event.id : null
|
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. 定义响应式变量,用于强制更新
|
// 1. 定义响应式变量,用于强制更新
|
||||||
const refreshKey = ref(0)
|
const refreshKey = ref(0)
|
||||||
|
|
||||||
@ -85,7 +89,7 @@ let getWidth = (durationTime) => {
|
|||||||
// 6. 让 progressStyle 间接依赖 refreshKey(通过 getWidth)
|
// 6. 让 progressStyle 间接依赖 refreshKey(通过 getWidth)
|
||||||
let progressStyle = (task) => {
|
let progressStyle = (task) => {
|
||||||
let taskLeft = task.startTime - window['tsObj']._Store._startTimestamp;
|
let taskLeft = task.startTime - window['tsObj']._Store._startTimestamp;
|
||||||
let style = {
|
let style:any = {
|
||||||
width: getWidth(task.duration_time) * 1000 + "px",
|
width: getWidth(task.duration_time) * 1000 + "px",
|
||||||
left: getWidth(taskLeft) + "px",
|
left: getWidth(taskLeft) + "px",
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,8 +1,26 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="eventParams">
|
<div class="eventParams">
|
||||||
<template v-if="eventObj">
|
<template v-if="eventObj">
|
||||||
<div>
|
<div class="eventPanel">
|
||||||
<span>{{ eventObj.name }}</span>
|
<span class="title">{{ eventObj.name }}</span>
|
||||||
|
<div class="eventDetail">
|
||||||
|
<template v-if="eventObj.callback&&eventObj.callback=='flicker'">
|
||||||
|
<div>
|
||||||
|
闪烁间隔
|
||||||
|
<el-input v-model="detail.times" style="width: 50%" placeholder="Please input"/>
|
||||||
|
秒
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
闪烁次数
|
||||||
|
<el-input v-model="detail.numbers" style="width: 50%" placeholder="Please input"/>
|
||||||
|
次
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
<div class="optBtn">
|
||||||
|
<el-button @click="updateEvent">确定</el-button>
|
||||||
|
<el-button @click="cancel">取消</el-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
@ -16,19 +34,67 @@
|
|||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import {inject, ref} from 'vue'
|
import {inject, ref} from 'vue'
|
||||||
|
import {TsApi} from "../../../api/ts";
|
||||||
|
|
||||||
|
const times = ref(0)
|
||||||
|
const numbers = ref(0)
|
||||||
|
|
||||||
|
const detail = ref({})
|
||||||
|
|
||||||
const eventBus: any = inject('bus')
|
const eventBus: any = inject('bus')
|
||||||
let eventObj = ref(null)
|
let eventObj:any = ref(null)
|
||||||
eventBus.on('click-event-show-plane', (params) => {
|
eventBus.on('click-event-show-plane', (params) => {
|
||||||
console.log('兄弟 B 的方法被触发了!', params)
|
console.log('兄弟 B 的方法被触发了!', params)
|
||||||
eventObj.value = (eventObj.value == null ? params : null)
|
eventObj.value = (params ? params : null)
|
||||||
|
if (eventObj.value) {
|
||||||
|
let details = JSON.parse(eventObj.value.detail)
|
||||||
|
switch (params.callback) {
|
||||||
|
case 'flicker':
|
||||||
|
// times.value = detail.times
|
||||||
|
// numbers.value = detail.numbers
|
||||||
|
detail.value = details
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
let isNoEvent = ref(true)
|
const updateEvent = () => {
|
||||||
|
// console.log(detail.value)
|
||||||
|
let obj = eventObj.value
|
||||||
|
obj.detail = JSON.stringify(detail.value)
|
||||||
|
console.log(obj)
|
||||||
|
delete obj.createdAt
|
||||||
|
delete obj.updatedAt
|
||||||
|
delete obj.duration_time
|
||||||
|
TsApi.updateTsEvent(obj).then(res => {
|
||||||
|
console.log(res)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const cancel = () => {
|
||||||
|
eventObj.value = null
|
||||||
|
detail.value = {}
|
||||||
|
eventBus.emit('click-cancel-hide-plane',)
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.eventParams {
|
.eventParams {
|
||||||
width: 20%;
|
width: 20%;
|
||||||
|
padding: 0 10px;
|
||||||
|
|
||||||
|
.eventPanel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
line-height: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.eventDetail {
|
||||||
|
overflow-y: auto;
|
||||||
|
height: calc(100% - 62px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.tourBox {
|
.tourBox {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -44,4 +110,11 @@ let isNoEvent = ref(true)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-input__wrapper), :deep(.el-input__inner ) {
|
||||||
|
background: transparent;
|
||||||
|
--el-input-placeholder-color: #fff;
|
||||||
|
color: #fff;
|
||||||
|
//border: 1px solid #0ff;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -1,10 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="grid">
|
<div class="grid" @click="hideRightMenu">
|
||||||
<div class="grid-header row">
|
<div class="grid-header row">
|
||||||
<div v-for="item in columns" :style="item.style">{{ item.name }}</div>
|
<div v-for="item in columns" :style="item.style">{{ item.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="grid-body">
|
<div class="grid-body">
|
||||||
<div class="row" :style="getStyle" v-for="(event) in eventList">
|
<div :class="['row',(eventObj&&event.id==eventObj.id)?'selectedRow':'']" :style="getStyle"
|
||||||
|
v-for="(event) in eventList" @click.right="(e)=>{rightClick(e,event)}">
|
||||||
<span v-for="item in columns" :class="item.key" :style="item.style">{{
|
<span v-for="item in columns" :class="item.key" :style="item.style">{{
|
||||||
format(item.key, event[item.key])
|
format(item.key, event[item.key])
|
||||||
}}</span>
|
}}</span>
|
||||||
@ -14,15 +15,75 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
<div class="gridRightMenu" v-if="rightClickEvent">
|
||||||
|
<template v-for="item in menus">
|
||||||
|
<template v-if="item.name=='删除'">
|
||||||
|
<el-popconfirm
|
||||||
|
width="220"
|
||||||
|
icon-color="#626AEF"
|
||||||
|
title="确定要删除吗?"
|
||||||
|
@cancel="onCancel"
|
||||||
|
>
|
||||||
|
<template #reference>
|
||||||
|
<span @click="">删除</span>
|
||||||
|
</template>
|
||||||
|
<template #actions="{ confirm, cancel }">
|
||||||
|
<el-button size="small" @click="cancel">取消</el-button>
|
||||||
|
<el-button
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
@click="()=>{item.fun(); confirm()}"
|
||||||
|
>
|
||||||
|
确定
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-popconfirm>
|
||||||
|
</template>
|
||||||
|
<span v-else @click="item.fun()">
|
||||||
|
{{ item.name }}
|
||||||
|
</span>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
//@ts-nocheck
|
//@ts-nocheck
|
||||||
import {computed, onMounted, ref} from "vue"
|
import {computed, onMounted, ref, nextTick} from "vue"
|
||||||
|
import {TsApi} from "../../../api/ts";
|
||||||
|
import {ElMessage} from "element-plus";
|
||||||
|
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
const props = defineProps(['eventList',])
|
const props = defineProps(['eventList',])
|
||||||
|
const menus = ref([
|
||||||
|
{
|
||||||
|
name: "删除",
|
||||||
|
fun: () => {
|
||||||
|
let param = new FormData
|
||||||
|
param.append("id", rightClickEvent.value.id)
|
||||||
|
TsApi.delEvent(param).then(res => {
|
||||||
|
if (res.code == 200) {
|
||||||
|
eventBus.emit('delete-event', rightClickEvent.value.id)
|
||||||
|
ElMessage({message: "操作成功", type: "success"})
|
||||||
|
rightClickEvent.value = null
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}, {
|
||||||
|
name: '定位', fun: () => {
|
||||||
|
let entity = window['earth_ts'].entityMap.get(rightClickEvent.value.sourceId)
|
||||||
|
entity && entity.flyTo()
|
||||||
|
}
|
||||||
|
},])
|
||||||
|
const clicked = ref(false)
|
||||||
|
|
||||||
|
function onCancel() {
|
||||||
|
clicked.value = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
let eventObj = ref(null)
|
||||||
|
let rightClickEvent = ref(null)
|
||||||
let columns = ref([{name: '事件名称', key: "name", style: "flex:auto"},
|
let columns = ref([{name: '事件名称', key: "name", style: "flex:auto"},
|
||||||
{name: '开始时间', key: "startTime", style: "width:120px"},
|
{name: '开始时间', key: "startTime", style: "width:120px"},
|
||||||
{name: '持续时间', key: "duration_time", style: "width:70px"}])
|
{name: '持续时间', key: "duration_time", style: "width:70px"}])
|
||||||
@ -37,7 +98,28 @@ let format = (key, val) => {
|
|||||||
return val
|
return val
|
||||||
}
|
}
|
||||||
let getStyle = computed(() => {
|
let getStyle = computed(() => {
|
||||||
return "height:" + window['tsObj']._Store._scales.cellHeight + "px"
|
let style = "height:" + window['tsObj']._Store._scales.cellHeight + "px"
|
||||||
|
return style
|
||||||
|
})
|
||||||
|
const rightClick = (e, eventObj) => {
|
||||||
|
console.log("右键点击", e)
|
||||||
|
rightClickEvent.value = eventObj
|
||||||
|
nextTick(() => {
|
||||||
|
$(".gridRightMenu")[0].style.top = e.layerY + "px"
|
||||||
|
$(".gridRightMenu")[0].style.left = e.layerX + "px"
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
const hideRightMenu = (e) => {
|
||||||
|
console.log("hideRightMenu", e)
|
||||||
|
if (e.target.innerHTML != "删除")
|
||||||
|
rightClickEvent.value = null
|
||||||
|
}
|
||||||
|
eventBus.on('click-event-show-plane', (params) => {
|
||||||
|
eventObj.value = (params ? params : null)
|
||||||
|
})
|
||||||
|
eventBus.on("click-cancel-hide-plane", () => {
|
||||||
|
eventObj.value = null
|
||||||
})
|
})
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
/* let doms = document.getElementsByClassName("start_time")
|
/* let doms = document.getElementsByClassName("start_time")
|
||||||
@ -89,6 +171,30 @@ onMounted(() => {
|
|||||||
position: relative;
|
position: relative;
|
||||||
overflow-y: inherit;
|
overflow-y: inherit;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
|
.selectedRow {
|
||||||
|
background-color: rgba(0, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.gridRightMenu {
|
||||||
|
position: absolute;
|
||||||
|
z-index: 99;
|
||||||
|
background: rgba(0, 0, 0, 0.8);
|
||||||
|
transform: translateY(50%);
|
||||||
|
width: 80px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border: 1.5px solid;
|
||||||
|
border-image: linear-gradient(137.95deg, rgba(var(--color-base1), 1) 6.25%, var(--color-border1) 100%) 1.5;
|
||||||
|
|
||||||
|
span {
|
||||||
|
padding: 5px 0;
|
||||||
|
cursor: pointer;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -130,7 +130,7 @@ let eventCallback = () => {
|
|||||||
let timeId = Math.round(props.TSOBJ._Store._currentTimestamp / 1000);
|
let timeId = Math.round(props.TSOBJ._Store._currentTimestamp / 1000);
|
||||||
timeId *= 1000;
|
timeId *= 1000;
|
||||||
// console.log(timeId)
|
// console.log(timeId)
|
||||||
let taskIds = [];
|
let taskIds:any = [];
|
||||||
let dataMap = props.TSOBJ._Store.dealData("startTime");
|
let dataMap = props.TSOBJ._Store.dealData("startTime");
|
||||||
console.log(dataMap)
|
console.log(dataMap)
|
||||||
|
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
//@ts-nocheck
|
||||||
import {ref, reactive, onMounted, nextTick} from "vue";
|
import {ref, reactive, onMounted, nextTick} from "vue";
|
||||||
import {useRouter, useRoute} from "vue-router";
|
import {useRouter, useRoute} from "vue-router";
|
||||||
import Cabin from "./cabin.vue"
|
import Cabin from "./cabin.vue"
|
||||||
@ -28,7 +29,7 @@ let cabin = ref()
|
|||||||
let tsOBJ = ref({})
|
let tsOBJ = ref({})
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
let params:any = {}
|
let params: any = {}
|
||||||
// 将由列表页面传递过来的参数,数字化
|
// 将由列表页面传递过来的参数,数字化
|
||||||
for (const routeQueryKey in route.query) {
|
for (const routeQueryKey in route.query) {
|
||||||
params[routeQueryKey] = route.query[routeQueryKey]
|
params[routeQueryKey] = route.query[routeQueryKey]
|
||||||
@ -38,10 +39,11 @@ for (const routeQueryKey in route.query) {
|
|||||||
}
|
}
|
||||||
console.log("params", params)
|
console.log("params", params)
|
||||||
window.planId = params.id
|
window.planId = params.id
|
||||||
|
const eventBus: any = inject('bus')
|
||||||
|
|
||||||
// 通过planID获取方案包含的所有事件
|
// 通过planID获取方案包含的所有事件
|
||||||
let getEventList = () => {
|
let getEventList = () => {
|
||||||
let events:any = []
|
let events: any = []
|
||||||
for (let i = 0; i < 1; i++) {
|
for (let i = 0; i < 1; i++) {
|
||||||
events.push({
|
events.push({
|
||||||
id: "task" + i,
|
id: "task" + i,
|
||||||
@ -64,6 +66,10 @@ let getEventList = () => {
|
|||||||
})
|
})
|
||||||
newTS(params, events)
|
newTS(params, events)
|
||||||
}
|
}
|
||||||
|
eventBus.on('delete-event', (id) => {
|
||||||
|
console.log(id)
|
||||||
|
tsOBJ.value._Store._tasks = tsOBJ.value._Store._tasks.filter(item => item.id != id)
|
||||||
|
})
|
||||||
// 新建态势推演对象
|
// 新建态势推演对象
|
||||||
let newTS = (params, events) => {
|
let newTS = (params, events) => {
|
||||||
|
|
||||||
|
|||||||
@ -35,7 +35,6 @@
|
|||||||
v-model="form.datetime"
|
v-model="form.datetime"
|
||||||
type="datetime"
|
type="datetime"
|
||||||
placeholder="选择触发时间"
|
placeholder="选择触发时间"
|
||||||
value-format="x"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="持续时间">
|
<el-form-item label="持续时间">
|
||||||
@ -98,6 +97,7 @@
|
|||||||
import {ref, reactive} from "vue";
|
import {ref, reactive} from "vue";
|
||||||
import type {RenderContentContext, TreeInstance} from 'element-plus'
|
import type {RenderContentContext, TreeInstance} from 'element-plus'
|
||||||
import {TsApi} from "../../api/ts";
|
import {TsApi} from "../../api/ts";
|
||||||
|
import {ElMessage} from "element-plus";
|
||||||
|
|
||||||
const treeRef = ref<TreeInstance>()
|
const treeRef = ref<TreeInstance>()
|
||||||
// 存储当前需要高亮的节点 key(初始为空)
|
// 存储当前需要高亮的节点 key(初始为空)
|
||||||
@ -108,7 +108,7 @@ interface Tree {
|
|||||||
children?: Tree[]
|
children?: Tree[]
|
||||||
}
|
}
|
||||||
|
|
||||||
const form = reactive({
|
let form = reactive({
|
||||||
name: '闪烁-',
|
name: '闪烁-',
|
||||||
// datetime: '',
|
// datetime: '',
|
||||||
})
|
})
|
||||||
@ -121,7 +121,7 @@ const numbers = ref(0)//闪烁次数
|
|||||||
const isContainModelPosition = ref(true)
|
const isContainModelPosition = ref(true)
|
||||||
const eventBus: any = inject('bus')
|
const eventBus: any = inject('bus')
|
||||||
|
|
||||||
form['datetime'] = new Date(2025, 10, 5, 18, 8, 43)
|
form['datetime'] = new Date(window['tsObj']._Store._currentTimestamp)
|
||||||
const isShowPup = ref(false)
|
const isShowPup = ref(false)
|
||||||
const eventTree: { children: ({ label: string } | { label: string })[]; id: string; label: string }[] = [
|
const eventTree: { children: ({ label: string } | { label: string })[]; id: string; label: string }[] = [
|
||||||
{
|
{
|
||||||
@ -172,10 +172,32 @@ const addEvent = () => {
|
|||||||
"detail": JSON.stringify(obj)
|
"detail": JSON.stringify(obj)
|
||||||
}
|
}
|
||||||
TsApi.addTsEvent(dbParams).then(res => {
|
TsApi.addTsEvent(dbParams).then(res => {
|
||||||
|
if (res.code == 200) {
|
||||||
|
ElMessage({
|
||||||
|
message: "操作成功",
|
||||||
|
type: "success"
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
isShowPup.value = false
|
||||||
|
|
||||||
|
reset()
|
||||||
})
|
})
|
||||||
console.log(dbParams)
|
console.log(dbParams)
|
||||||
}
|
}
|
||||||
|
const reset = () => {
|
||||||
|
hour.value = 0
|
||||||
|
minute.value = 0
|
||||||
|
second.value = 0
|
||||||
|
numbers.value = 0
|
||||||
|
times.value = 0
|
||||||
|
form = {
|
||||||
|
name: '闪烁-',
|
||||||
|
// datetime: '',
|
||||||
|
}
|
||||||
|
currentKey.value = "flicker"
|
||||||
|
|
||||||
|
}
|
||||||
eventBus.on('openAddEvent', (data, cb, type) => {
|
eventBus.on('openAddEvent', (data, cb, type) => {
|
||||||
console.log("openAddEvent", data)
|
console.log("openAddEvent", data)
|
||||||
// selectCallback = cb
|
// selectCallback = cb
|
||||||
|
|||||||
@ -163,6 +163,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
//@ts-nocheck
|
||||||
import { reactive, onMounted, onBeforeUnmount, watch } from 'vue'
|
import { reactive, onMounted, onBeforeUnmount, watch } from 'vue'
|
||||||
import { Decimal } from 'decimal.js'
|
import { Decimal } from 'decimal.js'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
|
|||||||
@ -3,12 +3,7 @@
|
|||||||
<div class="head_box">
|
<div class="head_box">
|
||||||
<!-- <span class="head_title">实景三维电子沙盘系统</span> -->
|
<!-- <span class="head_title">实景三维电子沙盘系统</span> -->
|
||||||
<!-- <headSvg style="width: 100%;height: 100%;"></headSvg> -->
|
<!-- <headSvg style="width: 100%;height: 100%;"></headSvg> -->
|
||||||
<img
|
<img width="100%" height="100%" :src="headImg" alt="" />
|
||||||
width="100%"
|
|
||||||
height="100%"
|
|
||||||
:src="`../../../src/assets/images/theme/${skinInfo}/head.png`"
|
|
||||||
alt=""
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dateTime">
|
<div class="dateTime">
|
||||||
<span>{{ date.hms }}</span>
|
<span>{{ date.hms }}</span>
|
||||||
@ -17,12 +12,7 @@
|
|||||||
<span>{{ t(`week.4`) }}</span>
|
<span>{{ t(`week.4`) }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="weather">
|
<div class="weather">
|
||||||
<svg-icon
|
<svg-icon name="weather" :size="40" @click="clickFun"></svg-icon>
|
||||||
name="weatherBase"
|
|
||||||
:class="weatherClick ? 'weatherIcon' : ''"
|
|
||||||
:size="40"
|
|
||||||
@click="clickFun"
|
|
||||||
></svg-icon>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<setTool ref="setToolRef"></setTool>
|
<setTool ref="setToolRef"></setTool>
|
||||||
@ -63,7 +53,8 @@ const headImg = computed(() => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const skinInfo = ref(JSON.parse(localStorage.getItem('systemSetting') || '{}').skinInfo || 'color1')
|
|
||||||
|
const skinInfo = ref(JSON.parse(localStorage.getItem("systemSetting") || '{}').skinInfo || 'color1')
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const date = ref({
|
const date = ref({
|
||||||
@ -71,25 +62,26 @@ const date = ref({
|
|||||||
hms: '',
|
hms: '',
|
||||||
week: 0
|
week: 0
|
||||||
})
|
})
|
||||||
window.addEventListener('setItemEvent', (e: any) => {
|
window.addEventListener("setItemEvent", (e: any) => {
|
||||||
console.log('e', e)
|
console.log('e', e)
|
||||||
if (e.key == 'systemSetting') {
|
if (e.key == "systemSetting") {
|
||||||
let obj = JSON.parse(e.newValue)
|
let obj = JSON.parse(e.newValue);
|
||||||
skinInfo.value = obj.skinInfo
|
skinInfo.value = obj.skinInfo;
|
||||||
|
|
||||||
let setting = JSON.parse(e.newValue)
|
let setting = JSON.parse(e.newValue)
|
||||||
let dialogElm: any = document.getElementsByClassName('YJ-custom-base-dialog')
|
let dialogElm: any = document.getElementsByClassName('YJ-custom-base-dialog')
|
||||||
if (setting.language === 'zh-EN') {
|
if (setting.language === 'zh-EN') {
|
||||||
for (let i = 0; i < dialogElm.length; i++) {
|
for (let i = 0; i < dialogElm.length; i++) {
|
||||||
dialogElm[i].classList.add('dialog-en')
|
dialogElm[i].classList.add('dialog-en');
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
for (let i = 0; i < dialogElm.length; i++) {
|
for (let i = 0; i < dialogElm.length; i++) {
|
||||||
dialogElm[i].classList.remove('dialog-en')
|
dialogElm[i].classList.remove('dialog-en');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
var weatherClick = ref(false)
|
var weatherClick = ref(false)
|
||||||
const setTime = () => {
|
const setTime = () => {
|
||||||
let date1 = new Date()
|
let date1 = new Date()
|
||||||
@ -140,7 +132,7 @@ var clickFun = () => {
|
|||||||
z-index: 999;
|
z-index: 999;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
> * {
|
>* {
|
||||||
pointer-events: all;
|
pointer-events: all;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -185,7 +177,7 @@ var clickFun = () => {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
font-family: 'alimamashuheiti';
|
font-family: 'alimamashuheiti';
|
||||||
|
|
||||||
& > span:first-child {
|
&>span:first-child {
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
font-size: 2rem;
|
font-size: 2rem;
|
||||||
font-family: 'alimamashuheiti';
|
font-family: 'alimamashuheiti';
|
||||||
@ -197,23 +189,20 @@ var clickFun = () => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
& > span:first-child {
|
&>span:first-child {
|
||||||
font-size: 0.9rem;
|
font-size: 0.9rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
& > span:last-child {
|
&>span:last-child {
|
||||||
font-size: 0.8rem;
|
font-size: 0.8rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.weather {
|
.weather {
|
||||||
margin-left: 15px;
|
margin-left: 15px;
|
||||||
.weatherIcon {
|
|
||||||
fill: rgba(var(--color-base1), 1) !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
svg {
|
||||||
// fill: rgba(var(--color-base1), 1) !important;
|
fill: rgba(var(--color-base1), 1) !important;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
//@ts-nocheck
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
import { $changeComponentShow } from '@/utils/communication'
|
import { $changeComponentShow } from '@/utils/communication'
|
||||||
import { useRightOperate } from './hooks/rightOperate'
|
import { useRightOperate } from './hooks/rightOperate'
|
||||||
|
|||||||
@ -607,7 +607,7 @@ export const useTree = () => {
|
|||||||
brightness: 1
|
brightness: 1
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
res.data.list[i].icon = await cusNodeIcon(res.data.list[i]);
|
res.data.list[i].svg = await cusNodeIcon(res.data.list[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
zNodes.value = res.data.list
|
zNodes.value = res.data.list
|
||||||
|
|||||||
@ -193,28 +193,29 @@ onMounted(() => {
|
|||||||
|
|
||||||
.content {
|
.content {
|
||||||
.el-input__wrapper {
|
.el-input__wrapper {
|
||||||
background-color: transparent;
|
// background-color: transparent;
|
||||||
border: 0.2px solid rgba(var(--color-base1), 1);
|
border: 0.2px solid rgba(var(--color-base1), 1);
|
||||||
box-shadow: 0 0 0 0.2px rgba(var(--color-base1), 1) inset !important;
|
box-shadow: 0 0 0 0.2px rgba(var(--color-base1), 1) inset !important;
|
||||||
/* 新增此行 */
|
border-radius: 0;
|
||||||
|
padding: 3px 11px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-input__inner {
|
.el-input__inner {
|
||||||
color: #fff;
|
color: rgb(0, 66, 66);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 新增图标颜色控制 */
|
/* 新增图标颜色控制 */
|
||||||
.el-input__prefix,
|
.el-input__prefix,
|
||||||
.el-input__suffix {
|
.el-input__suffix {
|
||||||
.el-icon {
|
.el-icon {
|
||||||
color: rgba(var(--color-base1), 1);
|
color: rgb(0, 66, 66);
|
||||||
/* 将#00ffff替换为你想用的颜色 */
|
/* 将#00ffff替换为你想用的颜色 */
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
/* 可选:调整图标大小 */
|
/* 可选:调整图标大小 */
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover .el-icon {
|
&:hover .el-icon {
|
||||||
color: rgba(var(--color-base1), 1);
|
color: rgb(0, 66, 66);
|
||||||
/* 悬停颜色保持一致 */
|
/* 悬停颜色保持一致 */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,13 +301,13 @@ onMounted(() => {
|
|||||||
color: #eee;
|
color: #eee;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
text-shadow: 0px 0px 4px rgba(80, 227, 230, 0.2);
|
text-shadow: 0px 0px 4px rgba(80, 227, 230, 0.2);
|
||||||
font-style: italic;
|
// font-style: italic;
|
||||||
letter-spacing: 5px;
|
letter-spacing: 5px;
|
||||||
margin-bottom: 6px;
|
margin-bottom: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title2 {
|
.title2 {
|
||||||
font-size: 3rem;
|
font-size: 2rem;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
color: #eee;
|
color: #eee;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -337,7 +338,7 @@ onMounted(() => {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
margin-bottom: 1.5vw;
|
margin-bottom: 1.5vw;
|
||||||
padding: 0.6vw 0;
|
padding: 19px 0;
|
||||||
letter-spacing: 0.2vw;
|
letter-spacing: 0.2vw;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: rgba(0, 66, 66, 1);
|
color: rgba(0, 66, 66, 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user