This commit is contained in:
zh
2025-10-20 17:01:17 +08:00
parent d18a1abf5e
commit a79911b3d9
8 changed files with 144 additions and 69 deletions

View File

@ -11,7 +11,8 @@ spring:
active: sqlite active: sqlite
mysql: mysql:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.110.65:6975/yjearth?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: >-
jdbc:mysql://192.168.110.65:6975/yjearth?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: yjearth username: yjearth
password: kNGxrsSSYMexZ2t4 password: kNGxrsSSYMexZ2t4
servlet: servlet:
@ -38,8 +39,8 @@ file:
graphhopper: graphhopper:
graphLocation: ./target/graphhopper graphLocation: ./target/graphhopper
profiles: profiles:
- car - car
- bike - bike
- foot - foot
sync: sync:
folder: E:\\地理资源 folder: E:\\地理资源

View File

@ -20096,8 +20096,8 @@
var testing = var testing =
'<div class="compass" title="拖动外圈:旋转视图,' + '<div class="compass" title="拖动外圈:旋转视图,' +
'拖动内陀螺仪:自由轨道,' + '拖动内陀螺仪:自由轨道,' +
'双击:重置视图' + '双击:重置视图' +
'提示您还可以按住CTRL键并拖动地图来释放轨道." data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' + '" data-bind="visible: showCompass, event: { mousedown: handleMouseDown, dblclick: handleDoubleClick }">' +
'<div class="compass-outer-ring-background"></div>' + '<div class="compass-outer-ring-background"></div>' +
" <div class=\"compass-rotation-marker\" data-bind=\"visible: isOrbiting, style: { transform: 'rotate(-' + orbitCursorAngle + 'rad)', '-webkit-transform': 'rotate(-' + orbitCursorAngle + 'rad)', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }\"></div>" + " <div class=\"compass-rotation-marker\" data-bind=\"visible: isOrbiting, style: { transform: 'rotate(-' + orbitCursorAngle + 'rad)', '-webkit-transform': 'rotate(-' + orbitCursorAngle + 'rad)', opacity: orbitCursorOpacity }, cesiumSvgPath: { path: svgCompassRotationMarker, width: 145, height: 145 }\"></div>" +
" <div class=\"compass-outer-ring\" title=\"单击并拖动以旋转相机\" data-bind=\"style: { transform: 'rotate(-' + heading + 'rad)', '-webkit-transform': 'rotate(-' + heading + 'rad)' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }\"></div>" + " <div class=\"compass-outer-ring\" title=\"单击并拖动以旋转相机\" data-bind=\"style: { transform: 'rotate(-' + heading + 'rad)', '-webkit-transform': 'rotate(-' + heading + 'rad)' }, cesiumSvgPath: { path: svgCompassOuterRing, width: 145, height: 145 }\"></div>" +

View File

@ -29,6 +29,14 @@
--color-background-mute: var(--ev-c-black-mute); --color-background-mute: var(--ev-c-black-mute);
--color-text: var(--ev-c-text-1); --color-text: var(--ev-c-text-1);
--color-border1: rgba(0, 194, 142, 1);
--color-border2: rgba(0, 255, 200, 1);
--color-border3: rgba(42, 200, 251, 1);
--color-border4: rgba(229, 93, 93, 1);
--color-border5: rgba(255, 165, 92, 1);
} }
*, *,

View File

@ -0,0 +1,32 @@
let theme = {
"yingguangse": new Map(),
"gonganlan": new Map(),
"hong": new Map(),
}
theme.yingguangse.set("--svg-headColor1", "rgba(11, 37, 40, 0.6)")
theme.yingguangse.set("--svg-headColor2", "rgba(11, 37, 40, 0.8)")
theme.yingguangse.set("--svg-headColor3", "#0ff")
theme.yingguangse.set("--svg-headColorbg", "rgba(0,255,255,0.1)")
// theme.yingguangse.set("--svg-headColor3", "#0ff")
theme.yingguangse.set("--svg-baseLineColor", "#0ff")
theme.yingguangse.set("--svg-divBgColor", "rgba(0, 0, 0, .5)")
theme.gonganlan.set("--svg-headColor1", "rgba(11, 37, 40, 0.6)")
theme.gonganlan.set("--svg-headColor2", "rgba(17, 19, 69, 0.8)")
theme.gonganlan.set("--svg-headColor3", "#2ac8fb")
theme.gonganlan.set("--svg-headColorbg", "rgba(34,39,142,0.1)")
theme.gonganlan.set("--svg-headLineColor", "#22278e")
theme.gonganlan.set("--svg-baseLineColor", "#2ac8fb")
// theme.gonganlan.set("--svg-baseLineColor", "#fb2a2a")
theme.gonganlan.set("--svg-divBgColor", "rgba(0, 0, 0, .5)")
theme.hong.set("--svg-headColor1", "rgba(11, 37, 40, 0.6)")
theme.hong.set("--svg-headColor2", "rgba(17, 19, 69, 0.8)")
theme.hong.set("--svg-headColor3", "#bb1a29")
theme.hong.set("--svg-headColorbg", "rgba(187,26,41,0.1)")
theme.hong.set("--svg-headLineColor", "#bb1a29")
theme.hong.set("--svg-baseLineColor", "#bb1a29")
// theme.gonganlan.set("--svg-baseLineColor", "#fb2a2a")
theme.hong.set("--svg-divBgColor", "rgba(0, 0, 0, .5)")
export default theme;

View File

@ -410,6 +410,7 @@ import { ElMessage } from 'element-plus'
import { inject, onMounted } from 'vue' import { inject, onMounted } from 'vue'
import { TreeApi } from '@/api/tree' import { TreeApi } from '@/api/tree'
import { $sendElectronChanel } from '@/utils/communication' import { $sendElectronChanel } from '@/utils/communication'
import theme from "@/utils/theme";
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
@ -523,7 +524,7 @@ const sysChange = async () => {
let coor = systemSetting.value.coordinate ? systemSetting.value.coordinate : 'EPSG:4326' let coor = systemSetting.value.coordinate ? systemSetting.value.coordinate : 'EPSG:4326'
YJ.Global.setCoordinateSystem(window.earth, coor) YJ.Global.setCoordinateSystem(window.earth, coor)
//设置坐标格式 //设置坐标格式
YJ.Global.setDMS(window.earth, systemSetting.value.positionType) // YJ.Global.setDMS(window.earth, systemSetting.value.positionType)
//比例尺 //比例尺
await YJ.Global.SheetIndexStatusSwitch(window.earth, systemSetting.value.sheetIndexStatusSwitch) await YJ.Global.SheetIndexStatusSwitch(window.earth, systemSetting.value.sheetIndexStatusSwitch)
@ -535,6 +536,13 @@ const sysChange = async () => {
} else { } else {
YJ.Global.MapX.close(window.earth) YJ.Global.MapX.close(window.earth)
} }
let skin = systemSetting.value.skinInfo ? systemSetting.value.skinInfo : "yingguangse";
let colorVariable = Array.from(theme[skin].keys());
colorVariable.forEach((key:any) => {
console.log('key', key)
document.documentElement.style.setProperty(key, theme[skin].get(key));
});
} }
const searchWayChange = (val) => { const searchWayChange = (val) => {
localStorage.setItem('searchWay', val) localStorage.setItem('searchWay', val)

View File

@ -2,19 +2,52 @@
<div class="leftBox"> <div class="leftBox">
<div class="left animate__animated"> <div class="left animate__animated">
<div class="menus"> <div class="menus">
<div <div class="menus_itemBox" v-for="(item, index) in menuList" :title="t(`firstMenu.${item.name}`)">
class="menus_itemBox" <div class="item_icon" @click="(e) => {
v-for="(item, index) in menuList" handleClick(item, e)
:title="t(`firstMenu.${item.name}`)" }
> ">
<div <!-- <svg class="item_icon_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
class="item_icon" width="162" height="44" viewBox="0 0 162 44" fill="none" preserveAspectRatio="none">
@click=" <path fill="#000000" fill-opacity="0.5" d="M0 44L136.639 44L162 18L162 0L0 0L0 44Z" />
(e) => { <path fill-rule="evenodd" fill="rgba(42, 200, 251, 1)"
handleClick(item, e) d="M136.006 42.5L1.5 42.5L1.5 1.5L160.5 1.5L160.5 17.3896L136.006 42.5ZM136.639 44L0 44L0 0L162 0L162 18L136.639 44Z" />
} <path d="M0 0L15.0533 0L49.1742 41L98.4484 41.2681L102 44L0 44L0 0Z" fill="#45AEF7" fill-opacity="0.2" />
" <path d="M3 34L3 41L10 41L3 34Z" stroke="rgba(198, 248, 255, 1)" stroke-width="0.5"
> stroke-linejoin="round" />
<path d="M159 10L159 3L152 3L159 10Z" stroke="rgba(198, 248, 255, 1)" stroke-width="0.5"
stroke-linejoin="round" />
</svg> -->
<svg class="item_icon_bg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="162" height="44" viewBox="0 0 162 44" fill="none" preserveAspectRatio="none">
<path fill="#000000" fill-opacity="0.5" d="M0 44L136.639 44L162 18L162 0L0 0L0 44Z" />
<path fill-rule="evenodd" fill="url(#linear_border_2218_109_0)"
d="M136.006 42.5L1.5 42.5L1.5 1.5L160.5 1.5L160.5 17.3896L136.006 42.5ZM136.639 44L0 44L0 0L162 0L162 18L136.639 44Z" />
<path d="M0 0L15.0533 0L49.1742 41L98.4484 41.2681L102 44L0 44L0 0Z" fill="#00FFFF" fill-opacity="0.2" />
<path d="M3 34L3 41L10 41L3 34Z" stroke="rgba(0, 255, 255, 1)" stroke-width="0.5"
stroke-linejoin="round" />
<path d="M159 10L159 3L152 3L159 10Z" stroke="rgba(0, 255, 255, 1)" stroke-width="0.5"
stroke-linejoin="round" />
<defs>
<linearGradient id="linear_border_2218_109_0" x1="0" y1="-1.7520751953125" x2="140.2142333984375"
y2="40.473846435546875" gradientUnits="userSpaceOnUse">
<stop offset="0.0625" stop-color="#00FFFF" />
<stop offset="1" stop-color="#00C8FF" />
</linearGradient>
</defs>
</svg>
<svg class="item_icon_bg item_icon_bg_hover" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="163" height="45"
viewBox="0 0 163 45" fill="none" preserveAspectRatio="none">
<path fill="url(#linear_fill_2218_82_1)"
d="M0.5 44.5L137.139 44.5L162.5 18.5L162.5 0.5L0.5 0.5L0.5 44.5Z" />
<defs>
<linearGradient id="linear_fill_2218_82_1" x1="84.9554443359375" y1="44.49997329711914"
x2="84.95498657226562" y2="0.5" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#00FFFF" stop-opacity="0.6" />
<stop offset="1" stop-color="#00FFFF" stop-opacity="0" />
</linearGradient>
</defs>
</svg>
<!-- <svg-icon :class-name="['absolute', 'zIndex-1', 'left_item_bg']" icon-class="bg2"></svg-icon> --> <!-- <svg-icon :class-name="['absolute', 'zIndex-1', 'left_item_bg']" icon-class="bg2"></svg-icon> -->
<svg-icon :name="item.svg" :size="16" color="rgba(0, 255, 255, 1)"></svg-icon> <svg-icon :name="item.svg" :size="16" color="rgba(0, 255, 255, 1)"></svg-icon>
<div class="item_text"> <div class="item_text">
@ -22,10 +55,7 @@
</div> </div>
</div> </div>
</div> </div>
<leftSideSecond <leftSideSecond class="absolute zIndex99 leftSideSecond" ref="leftSideSecondRef"></leftSideSecond>
class="absolute zIndex99 leftSideSecond"
ref="leftSideSecondRef"
></leftSideSecond>
</div> </div>
</div> </div>
<div class="left_bottom" @click="fold"></div> <div class="left_bottom" @click="fold"></div>
@ -33,16 +63,16 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import {useI18n} from 'vue-i18n' import { useI18n } from 'vue-i18n'
import {useRouter} from 'vue-router' import { useRouter } from 'vue-router'
import {bus} from '@/utils/bus' import { bus } from '@/utils/bus'
import leftSideSecond from '@/views/components/leftSide/leftSideSecond.vue' import leftSideSecond from '@/views/components/leftSide/leftSideSecond.vue'
import {ElMessage, ElLoading} from 'element-plus' import { ElMessage, ElLoading } from 'element-plus'
const {ipcRenderer} = require('electron') const { ipcRenderer } = require('electron')
const router = useRouter() // 路由实例 const router = useRouter() // 路由实例
const {t} = useI18n() const { t } = useI18n()
const eventBus: any = inject('bus') const eventBus: any = inject('bus')
const menuList: any = ref([ const menuList: any = ref([
// 方案推演 // 方案推演
@ -202,7 +232,7 @@ const handleClick = (item: any, e) => {
if ((window as any).checkAuthIsValid) { if ((window as any).checkAuthIsValid) {
console.log('打开态势推演') console.log('打开态势推演')
ipcRenderer.send('toggle-fullscreen', true) ipcRenderer.send('toggle-fullscreen', true)
router.push({path: '/ts'}) router.push({ path: '/ts' })
} else { } else {
ElMessage({ ElMessage({
@ -368,20 +398,27 @@ const clickMenu = (item: any) => {
.item_icon { .item_icon {
width: 100%; width: 100%;
height: 4.2vh; height: 4.2vh;
background: url('../../../assets/images/hongse/left.png') no-repeat; // background: url('../../../assets/images/hongse/left.png') no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
} position: relative;
.item_icon:hover .item_text { >.item_icon_bg {
color: rgba(0, 255, 255, 1); width: 100%;
height: 100%;
position: absolute;
z-index: -1;
}
} }
.item_icon:hover { .item_icon:hover {
background: url('../../../assets/images/hongse/left1.png') no-repeat; // background: url('../../../assets/images/hongse/left1.png') no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
>.item_icon_bg_hover {
display: block;
}
} }
.item_text { .item_text {

View File

@ -85,7 +85,7 @@
<div class="table-body" v-if="cameraList && cameraList.length > 0"> <div class="table-body" v-if="cameraList && cameraList.length > 0">
<div class="tr" v-for="(item, index) in cameraList"> <div class="tr" v-for="(item, index) in cameraList">
<div class="td"> <div class="td">
<input type="checkbox" :value="item.deviceId" v-model="item.checked" <input type="checkbox" :value="item.id" v-model="item.checked"
@change="changeAttributeCamera(item)" /> @change="changeAttributeCamera(item)" />
<span>绑定</span> <span>绑定</span>
</div> </div>
@ -228,6 +228,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue' import { ref } from 'vue'
import { inject } from 'vue' import { inject } from 'vue'
import { deviceApi } from '@/api/deviceManage'
let ipcRenderer; let ipcRenderer;
if (window && window.process && window.process.type === 'renderer') { if (window && window.process && window.process.type === 'renderer') {
@ -244,7 +245,7 @@ const cameraParams = ref({
page: 1, page: 1,
total: 0 total: 0
}) })
const cameraList = ref() const cameraList:any = ref([])
const props = defineProps({ const props = defineProps({
entityOptions: { entityOptions: {
@ -349,40 +350,27 @@ const cameraSelect = ({ page, limit }) => {
let url = "" let url = ""
const params:any = { const params:any = {
cameraName: cameraParams.value.keyWord, cameraName: cameraParams.value.keyWord,
page: cameraParams.value.page, pageNum: cameraParams.value.page,
pageSize: cameraParams.value.pageSize pageSize: cameraParams.value.pageSize
}; };
const queryString = new URLSearchParams(params).toString(); deviceApi.deviceList(params).then((res) => {
url = `http://localhost:8891/yjearth4.0/api/v1/cameraData/list?${queryString}` if (res.code === 0 || res.code === 200) {
fetch(url, { if (res.data) {
method: 'get', cameraParams.value.total = res.data.total
headers: { if (res.data.records && res.data.records.length > 0) {
'Content-Type': 'application/json', cameraList.value = res.data.records
"token": 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzYwOTQyMzU2fQ.TKwa0hMzsSl9bD4-iItoay2VDTQZf2zt0Lu0qgiRaUM', for (let i = 0; i < cameraList.value.length; i++) {
"Authorization": "Bearer " + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzYwOTQyMzU2fQ.TKwa0hMzsSl9bD4-iItoay2VDTQZf2zt0Lu0qgiRaUM', cameraList.value[i].checked = false
} for (let j = 0; j < props.entityOptions.attributeCamera.length; j++) {
}).then((response) => { if (cameraList.value[i].id == props.entityOptions.attributeCamera[j].id) {
if (response.status === 200) { cameraList.value[i].checked = true
response.json().then((data) => {
if (data.code === 200 || data.code === 0) {
if (data.data) {
cameraParams.value.total = data.data.total
if (data.data.list && data.data.list.length > 0) {
cameraList.value = data.data.list
for (let i = 0; i < cameraList.value.length; i++) {
cameraList.value[i].checked = false
for (let j = 0; j < props.entityOptions.attributeCamera.length; j++) {
if (cameraList.value[i].deviceId == props.entityOptions.attributeCamera[j].deviceId) {
cameraList.value[i].checked = true
}
}
} }
} }
} }
} else {
console.error(data.message)
} }
}) }
} else {
console.error(res.message)
} }
}) })
} }
@ -636,7 +624,7 @@ const changeAttributeCamera = (e) => {
console.log(e) console.log(e)
props.entityOptions.attributeCamera = [{ ...e }] props.entityOptions.attributeCamera = [{ ...e }]
for (let i = 0; i < cameraList.value.length; i++) { for (let i = 0; i < cameraList.value.length; i++) {
if (cameraList.value[i].deviceId !== e.deviceId) { if (cameraList.value[i].id !== e.id) {
cameraList.value[i].checked = false cameraList.value[i].checked = false
} }
} }

View File

@ -101,11 +101,12 @@ function leftClick(options) {
info.camera.forEach((item) => { info.camera.forEach((item) => {
index++; index++;
ipcRenderer.send("openFFPlay", { ipcRenderer.send("openFFPlay", {
url: item.rtspUrl, // // url: 'rtsp://admin:admin123456@192.168.110.32:554/cam/realmonitor?channel=1&subtype=0', //
url: `rtsp://${item.username}:${item.password}@${item.ip}:${item.port}/cam/realmonitor?channel=${item.channel}&subtype=0`, //
cameraName: item.cameraName, // cameraName: item.cameraName, //
ip: item.ip, // ip: item.ip, //
name: node.sourceName, name: node.sourceName,
deviceId: item.deviceId, // deviceId: item.id, //
}); });
ipcRenderer.once( ipcRenderer.once(
"openFFPlayOut", "openFFPlayOut",