From bbfcba8c21dadac21e1aaea809073771b10b5cc5 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期一, 25 十一月 2024 22:10:49 +0800 Subject: [PATCH] 1 --- src/views/area/main-container.vue | 1421 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 704 insertions(+), 717 deletions(-) diff --git a/src/views/area/main-container.vue b/src/views/area/main-container.vue index 0bcef3c..9310efa 100644 --- a/src/views/area/main-container.vue +++ b/src/views/area/main-container.vue @@ -6,83 +6,82 @@ // width:'100%', // height:'calc(100vh - 10rem)' }"> - <!-- @mousemove="handleMouseMove" - @mouseup="handleMouseUp" - @mousedown="handleMouseDown" - @mouseleave="handleMouseLeave" --> - <div id="content" class="equipments-container area-map" :class="['area-map-' + code]" v-show="hideServe" - @mousemove="handleMouseMove" @mouseup="handleMouseUp" @mousedown="handleMouseDown" - @mouseleave="handleMouseLeave" - :style="{ + + <div id="content" class="equipments-container area-map" v-show="hideServe" + @mousedown="handleMouseDown" + :style="{ transform: `scale(${scale_container})`, width: screen_width + 'rem', height: screen_height + 'rem', - // container_offset_x:'' - // container_offset_x:'' - 'margin-left': `${container_offset_left}rem`, 'margin-top': `${container_offset_top}rem`, + + backgroundImage: `url(${areaUrl})`, + backgroundSize: 'cover', + backgroundPosition: 'center', + backgroundRepeat: 'no-repeat', + top: `${position.top}px`, + left: `${position.left}px`, }"> - <!-- <div - class="equipment-item itm-svg-a" - draggable="true" - style="width: 10rem; height: 10rem; position: absolute" - @dragstart="dragstart($event)" - @dragend="dragend($event)" - @click.prevent.stop="showServe" - :style="{ left: tleft + 'rem' }" --> - <!-- <div - class="equipment-item itm-svg-a" - :class="[item.typeclass]" - :id="item.id" - draggable="true" - v-for="item in device_list" - :key="item.id" - @dragstart="dragstart($event)" - @dragend="dragend($event)" - @click.prevent.stop="showServe" - :style="{ left: item.currentX + 'rem', top: item.currentY + 'rem' }" - ></div> --> - <div class="bridge-group" v-for="group in bridge_infos" :key="group.code" :code="group.code"> - <!-- {{ group.pad }} --> - <!-- @showServeInfo="showServeInfo" --> - <!-- <bridge v-for="(item, index) of group.cells" :key="item.cell" :code="group.code" :areacode="code" - @update_map="update_map" @update_status_indrag="update_status_indrag" - @click_item="click_item" @click_item_add="click_item_add" @toSwitchInfo="toSwitchInfo" @delPort="delPort" - @statusPort="statusPort" :current_drag_index="current_drag_index" :status_indrag="status_indrag" - :grouplevel="item.cell" :devicelist="device_list" :current_show_id="current_show_id" - :width="item.width || group.width" :datamap="item.datamap" :left="group.left || 0" :right="group.right || 0" --> - <!-- :grouplevel="item.cell" --> - <!-- @showServeInfo="showServeInfo" --> - <!-- :key="item.cell" --> - <bridge v-for="(item, index) of group.cells" :key="item.cell" :code="group.code" :areacode="code" - @update_map="update_map" @update_status_indrag="update_status_indrag" @click_item="click_item" - @click_item_add="click_item_add" @toSwitchInfo="toSwitchInfo" @delPort="delPort" - @statusPort="statusPort" - :current_drag_index="current_drag_index" :status_indrag="status_indrag" :grouplevel="item.cell" - :devicelist="device_list" :current_show_id="current_show_id" :width="item.width || group.width" - :datamap="item.datamap" :left="group.left || 0" :right="group.right || 0" - :top="group.top ? group.top + index * (group.pad || 3) : 0" - :bottom="group.bottom ? group.bottom - index * (group.pad || 3) : 0"></bridge> + <div v-for="(item, index) in elements" :key="index" class="grid-item bridge-items" :style="{ + width: elementWidth + 'rem', + height: elementHeight + 'rem', + top: `${item.row * elementHeight}rem`, + left: `${item.cell * elementWidth}rem` + }"> + <!-- 每个元素的内容可以放在这里 --> + + <div v-if="item.isPlaceholder" class="bridge-item" @dblclick="handleItemClickCancel(item)" + @click="handleClickToAddItem(index,item)" + + :class="[item?.deviceInfo ? 'space-in' : '',!item?.deviceInfo || !item?.deviceInfo?.id?'space-text-gray': '', + status_indrag && + (!item?.deviceInfo || !item?.deviceInfo?.id)? 'space-drag': '', + ]" + > + <div + class="space-text" + :class="[ + item?.deviceInfo?.statusInt == 2 || + item?.deviceInfo?.statusInt == 3 || + item?.deviceInfo?.statusInt == 4? 'space-text-red' : '', + item?.deviceInfo?.statusInt == 1 ? 'space-text-yellow' : '', + ]" + @dragstart="dragstart($event, index)" @dragend="dragend($event, index)" + @drop="handleDrop($event, index)" @dragover="handleDragOver($event)" draggable="true" + @click="showDeviceInfo(index,item,$event)" + > + {{ item.deviceInfo?.networkPort }} + <device-info v-show="selectedIndex === index " :show_info="show_device_info" + :device_info="cur_device_info" @toSwitchInfo="toSwitchInfo" @statusPort="statusPort" + @delPort="delPort" + ></device-info> + </div> + </div> + <div v-else @click="handleItemClick(item)" class="bridge-item-none hover-shadow"> + <div :style="{ + width: elementWidth + 'rem', + height: elementHeight / 2 + 'rem' + }"></div> + </div> + </div> + </div> <!-- 需要渲染一个canvas,然后基于数据,和滚动坐标,缩放坐标,位置中点吧 --> <tj-container v-if="true && code" :code="code" :key="code" @closeself="closeself" - :chartclose="chartclose"></tj-container> + :chartclose="chartclose"></tj-container> <!-- 显示图标的开关 --> <div v-if="true && code && chartclose" class="chart-open" @click="chartclose = false"> <div class="img-button"></div> </div> <equ-add-form ref="equAddForm" :code="code" :areas="areas" :init_device_list="device_list" - @update="update_map"></equ-add-form> - <server-info v-if="!hideServe" - :serve_info="serve_info" - :serve_select="serve_select" - :code="code"></server-info> + @update="update_device_info" :cur_item="cur_item"></equ-add-form> + <server-info v-if="!hideServe" :serve_info="serve_info" :serve_select="serve_select" :code="code"></server-info> <div class="back-button-left-bottom" @click="backToTop">返回</div> - + </div> </template> <script> @@ -90,6 +89,9 @@ import bridge from "@/components/bridge"; import serverInfo from "./server-info"; import equAddForm from "@/components/equ-add-form.vue"; +import deviceInfo from "@/components/device-info"; + +import A27 from '@/assets/screen/screen5/svgs3d/A27.svg' import { getAreaServeInfo, @@ -99,14 +101,15 @@ getBridgeInfos, delport, statusPort, + getAreaModuleBycode, } from "@/api/area"; -import {getAreaTjData} from "@/api/area"; +import { getAreaTjData } from "@/api/area"; -import {mapdata} from "./map-data.js"; +import { mapdata } from "./map-data.js"; import Bridge from "@/components/bridge.vue"; export default { - components: {tjContainer, bridge, equAddForm, Bridge,serverInfo}, + components: { tjContainer, bridge, equAddForm, Bridge, serverInfo, deviceInfo }, props: { item_show: false, code: "", @@ -136,9 +139,9 @@ scale_container: 0.9, //设备数据,实际便宜多少米+实际的宽高大小 equipmentdata: [ - {t: "a", x: 20, y: 30, w: 1, h: 2}, - {t: "a", x: 40, y: 30, w: 2, h: 2}, - {t: "a", x: 60, y: 35, w: 2, h: 1}, + { t: "a", x: 20, y: 30, w: 1, h: 2 }, + { t: "a", x: 40, y: 30, w: 2, h: 2 }, + { t: "a", x: 60, y: 35, w: 2, h: 1 }, ], //实际的像素比,单位rem @@ -176,17 +179,7 @@ // time: "1-10", // desc: "Host: SZHMESVMA544<br/>Line: SMT26<br/>Critical", // status: "red", - // }, - // { - // time: "11-20", - // desc: "Host: SZHMESVMA557<br/>Line: IB2 FA2<br/>Overall Execution Time 2103", - // status: "yellow", - // }, - // { - // time: "31-40", - // desc: "Host: SZHMESVMA320<br/>Line: DBC8<br/>Overall Execution Time 3120", - // status: "yellow", - // }, + // } ], //图标的 chartclose: false, @@ -194,14 +187,48 @@ //新增的 areas: [], activateSwitchPorts: {}, - switchAllDetialInfos:[], + switchAllDetialInfos: [], dialog_activateSwitchPorts: false, - first_query_ip:true, + first_query_ip: true, + + totalElements: 1000, // 元素总数 + areaUrl: A27, // 区域背景图 + elements: [], // 初始化 elements 数据为空数组 + isDragging: false, + dragSource: null, // 当前被拖拽的元素 + + show_device_info: false, // 展示设备信息 + selectedIndex: null, + cur_device_info: null, // 当前的设备信息 + cur_item:null,// 当前的element + + offsetX: 0, // 鼠标点击时相对元素的 X 偏移量 + offsetY: 0, // 鼠标点击时相对元素的 Y 偏移量 + position: { + top: 100, // 元素初始位置 + left: 100, // 元素初始位置 + }, }; + }, + computed: { + // 计算行数和列数 + gridDimensions() { + const columns = Math.ceil(Math.sqrt(this.totalElements * (this.screen_width / this.screen_height))); + const rows = Math.ceil(this.totalElements / columns); + return { columns, rows }; + }, + // 每个元素的宽度 + elementWidth() { + return this.screen_width / this.gridDimensions.columns; + }, + // 每个元素的高度 + elementHeight() { + return this.screen_height / this.gridDimensions.rows; + }, }, created() { var zoom = this.$route.query.zoom; - console.log(this.$route, this.$router); + // console.log(this.$route, this.$router); if (zoom) { this.zoom_main = parseFloat(zoom); } @@ -211,23 +238,28 @@ this.screen_height = parseFloat(this.screen_height) * this.zoom; }, async mounted() { - console.log("main-container1,mounted"); + // console.log("main-container1,mounted"); const content = document.getElementById("content"); content.addEventListener("wheel", this.handleWheel); //获取到此区域的全部信息 this.device_list = []; if (this.code) { - // var re = await getDeviceList(this.code); - // console.log("re", re); - // this.device_list = re.switchDetialInfos || []; - // await this.init_data(); - this.update_map(); + // this.update_map(); } getAreaTjData().then((res) => { - // console.log('areas',res.switchAreaInfo || []) this.areas = res.switchAreaInfo || []; }); + if(this.code){ + // 获取当前页面的背景图和数量 + this.initArea(); + // 根据屏幕初始化格子 + this.initializeElements(); // 在组件加载时初始化 elements + // 初始化设备信息 + this.handleBindElementsItems() + } + + // this.handleBindElementsItemsTest() }, destroyed() { const content = document.getElementById("content"); @@ -235,7 +267,221 @@ this.stopScrolling(); }, methods: { + + // 获取区域的背景图和数量 + async initArea(){ + const areaInfo = await getAreaModuleBycode(this.code) + if(areaInfo&&areaInfo.areaModuleItems){ + let areaModuleItems=areaInfo.areaModuleItems + if(areaModuleItems.areaConfigNum){ + this.totalElements = areaModuleItems.areaConfigNum; + } + + this.areaUrl =areaModuleItems.url + } + + }, + + initializeElements() { + const elements = []; + for (let i = 0; i < this.totalElements; i++) { + const cell = i % this.gridDimensions.columns; + const row = Math.floor(i / this.gridDimensions.columns); + const isPlaceholder = false + const name = row + "-" + cell + // 绑定设备信息 + const deviceInfo = {} + elements.push({ row, cell, isPlaceholder, name, deviceInfo }); + } + + // 判断最后一行是否需要补齐 + const remainder = this.totalElements % this.gridDimensions.columns; + if (remainder !== 0) { + const placeholdersNeeded = this.gridDimensions.columns - remainder; + for (let i = 0; i < placeholdersNeeded; i++) { + const cell = remainder + i; + const row = Math.floor(this.totalElements / this.gridDimensions.columns); + const isPlaceholder = false + const name = row + "-" + cell + // 绑定设备信息 + const deviceInfo = {} + elements.push({ row, cell, isPlaceholder, name, deviceInfo }); + } + } + + // TODO 遍历elements给每个elements复制index,为当前的遍历的索引 + // 遍历 elements 添加 index 属性 + elements.forEach((element, index) => { + element.index = index; + }); + this.elements = elements; // 赋值给 data 中的 elements + }, + + + async handleBindElementsItems() { + let deviceInfoList = await getDeviceList(this.code); + + // 获取 switchDetialInfos + let switchDetialInfos = deviceInfoList.switchDetialInfos; + console.log("所有的数量:"+this.totalElements) + console.log("switchDetialInfos") + console.log(switchDetialInfos) + + // 用于存放无效的设备信息 + let invalidSwitchDetails = []; + + // 用于存放重复 key 的设备信息 + let duplicateSwitchDetails = []; + + // 用于存放 areaRow 或 areaCell 为 -1 的设备信息 + let filteredSwitchDetails = []; + + // 创建一个 Map 来存储有效的设备信息 + let switchDetailInfosMap = new Map(); + + // 遍历 switchDetialInfos + switchDetialInfos.forEach((info) => { + let { areaRow, areaCell } = info; + + // 检查是否为无效值:""(空字符串)、undefined、null、-1 + if ([null, undefined, "", -1].includes(areaRow) || [null, undefined, "", -1].includes(areaCell)) { + invalidSwitchDetails.push(info); + return; // 跳过后续逻辑 + } + + // 检查是否包含 -1,记录到 filteredSwitchDetails + if (areaRow == -1 || areaCell == -1) { + filteredSwitchDetails.push(info); + return; // 跳过后续逻辑 + } + + // 构造唯一 key + let key = `${areaRow}-${areaCell}`; + console.log(key) + // 检查 key 是否已经存在 + if (switchDetailInfosMap.has(key)) { + // 如果存在,将当前 info 添加到重复数组中 + duplicateSwitchDetails.push(info); + } else { + // 如果不存在,将 info 存入 Map + switchDetailInfosMap.set(key, info); + + } + }); + + console.log("总数量:",switchDetialInfos.length) + console.log("无效的设备信息:", invalidSwitchDetails); + console.log("包含 -1 的设备信息:", filteredSwitchDetails); + console.log("重复的设备信息:", duplicateSwitchDetails); + console.log("设备信息转换后的 Map:", switchDetailInfosMap); + + // Step 1: 将 this.elements 转换为 Map,方便快速查找 + // let elementsMap = new Map( + // this.elements.map((element) => [`${element.row}-${element.cell}`, element]) + // ); + + // // Step 2: 遍历 switchDetailInfosMap,直接匹配 elementsMap 中的 key + // switchDetailInfosMap.forEach((info, key) => { + // // 在 elementsMap 中查找匹配的元素 + // let element = elementsMap.get(key); + // if (element) { + // // 如果找到匹配的元素,更新其信息 + // element.deviceInfo = info; + // element.isPlaceholder = true; + // } + // }); + + + // 遍历 elements,将匹配的设备信息绑定到对应的元素 + this.elements.forEach((element) => { + let key = `${element.row}-${element.cell}`; // 使用元素的 row 和 cell 构造 key + let deviceInfo = switchDetailInfosMap.get(key); // 从 Map 中查找设备信息 + if (deviceInfo) { + // 如果找到设备信息,存放到 element 的 deviceInfo 属性 + element.deviceInfo = deviceInfo; + element.isPlaceholder = true; + } else { + // 如果未找到,则清空或设置默认值 + element.deviceInfo = null; + element.isPlaceholder = false; + } + }); + + // 合并无效和重复的设备信息数组,并倒序 filteredSwitchDetails + let allDeviceDetails = [...invalidSwitchDetails, ...duplicateSwitchDetails,...filteredSwitchDetails]; + console.log("allDeviceDetails:", allDeviceDetails); + + // 遍历 elements,并查找 deviceInfo 为空的元素 + let emptyDeviceInfoElements = []; + + // 创建 elements 的浅拷贝,并倒序遍历 + const reversedElements = [...this.elements].reverse(); + + // 遍历 reversedElements,并查找 deviceInfo 为空的元素 + reversedElements.forEach((element) => { + if (!element.deviceInfo) { + // 记录所有 deviceInfo 为空的元素 + emptyDeviceInfoElements.push(element); + } + }); + + // 确保空的 deviceInfo 元素数组的长度与 allDeviceDetails 数组的长度一致 + let totalDevices = Math.min(emptyDeviceInfoElements.length, allDeviceDetails.length); + + // 动态为这些元素赋值设备信息 + for (let i = 0; i < totalDevices; i++) { + const device = allDeviceDetails[i] || {}; // 防止越界 + const element = emptyDeviceInfoElements[i]; + device.areaRow = element.row; + device.areaCell = element.cell; + element.deviceInfo = device; + element.isPlaceholder = true; // 设置占位符 + + // 根据索引更新原数组的元素 + const originalIndex = this.elements.findIndex((el) => el.row === element.row && el.cell === element.cell); + if (originalIndex !== -1) { + this.elements[originalIndex] = element; + } + } + }, + + async handleBindElementsItemsTest() { + const deviceInfoList = await getDeviceList(this.code) + const switchDetialInfos = deviceInfoList.switchDetialInfos + + // const evenIndexes = this.elements.filter((_, index) => index % 2 === 0); + const evenIndexes = this.elements.filter(element => element.cell % 2 == 0); + evenIndexes.forEach((element, index) => { + element.deviceInfo = switchDetialInfos[index] || null; + // element.isPlaceholder = !!switchDetialInfos[index]; + element.isPlaceholder=true; + }); + + console.log("所有布局元素") + console.log(this.elements) + + }, + + handleItemClick(item) { + this.isDragging = false; + item.deviceInfo = null; + this.$set(item, 'isPlaceholder', true) + }, + handleItemClickCancel(item) { + this.isDragging = false; + // 这里的取消操作需要判断当前的元素是不是空的 + if(item?.deviceInfo?.id){ + // this.$message('空设备才可双击删除!'); + }else{ + this.$set(item, 'isPlaceholder', false) + this.$message('空设备删除成功!'); + } + + }, + + toSwitchInfo(info) { + this.isDragging = false; this.showServe(info); }, async statusPort(info) { @@ -253,12 +499,15 @@ this.$modal.closeLoading(); - this.update_map(); + + // 根据屏幕初始化格子 + this.initializeElements(); // 在组件加载时初始化 elements + // 初始化设备信息 + this.handleBindElementsItems() + // this.update_map(); }, async delPort(info) { - //删除接口,传什么呢?? - console.log("delPort", info); - // return + var json = { id: info.id, operateType: 4, @@ -270,52 +519,54 @@ this.$modal.closeLoading(); - this.update_map(); + // 根据屏幕初始化格子 + this.initializeElements(); // 在组件加载时初始化 elements + // 初始化设备信息 + this.handleBindElementsItems() }, backToTop() { if (!this.hideServe) { this.hideServe = !this.hideServe; return; } - this.$router.push({path: "/area-all"}); + this.$router.push({ path: "/area-all" }); }, + + async update_device_info() { + // 根据屏幕初始化格子 + this.initializeElements(); // 在组件加载时初始化 elements + // 初始化设备信息 + this.handleBindElementsItems() + }, + async update_map() { this.$modal.loading("加载中"); var re = await getDeviceList(this.code); this.device_list = re.switchDetialInfos || []; await this.init_data(); this.$modal.closeLoading(); - if(this.query_networkPort&&this.bridge_infos&&this.first_query_ip){ + if (this.query_networkPort && this.bridge_infos && this.first_query_ip) { this.first_query_ip = false - //查询并调用,展示? - // this.bridge_infos[item.areaIndex] = { - // left: 0, - // top: 0, - // bottom: 0, - // right: 0, - // ...(mapdata["common"] || {}), - // ...(currentareaconfig[item.areaIndex] || ""), - // cells: item.areaCellRow || [], - // code: item.areaIndex, - // }; - console.log('this.bridge_infos',this.bridge_infos,this.query_networkPort) - for(var key of Object.keys(this.bridge_infos)){ - var allcells = this.bridge_infos[key] - for(var cell of allcells.cells){ - var datamaps = cell.datamap || {} - console.log('datamaps',datamaps) - for(var itemkey of Object.keys(datamaps)){ - if(datamaps[itemkey].name === this.query_networkPort){ - //默认打开 - // id itemcode@3_3_14 ud itemtext@3_3_14 - var dom = document.getElementById('itemtext@'+key+'_'+(cell.cell)+'_'+itemkey) - // console.log('datamaps get',datamaps[itemkey],dom,datamaps,this.bridge_infos,) - if(dom){ - dom.click() - } + console.log('this.bridge_infos', this.bridge_infos, this.query_networkPort) + + for (var key of Object.keys(this.bridge_infos)) { + var allcells = this.bridge_infos[key] + for (var cell of allcells.cells) { + var datamaps = cell.datamap || {} + console.log('datamaps', datamaps) + for (var itemkey of Object.keys(datamaps)) { + if (datamaps[itemkey].name === this.query_networkPort) { + //默认打开 + // id itemcode@3_3_14 ud itemtext@3_3_14 + var dom = document.getElementById('itemtext@' + key + '_' + (cell.cell) + '_' + itemkey) + + // console.log('datamaps get',datamaps[itemkey],dom,datamaps,this.bridge_infos,) + if (dom) { + dom.click() } } + } } } } @@ -327,198 +578,49 @@ console.log("this.$refs.equAddForm", this.$refs.equAddForm); this.$refs.equAddForm && this.$refs.equAddForm.openform(locInfo); }, - async showServeInfo(info) { - debugger; - //展示交换机全部端口 - console.log("showServeInfo", info); - //弹出框展示全部端口,并且每个端口的情况 - //获取一下信息 - this.$modal.loading("加载中"); - const res = await getDeviceList(this.code, info.cabinetName); - this.$modal.closeLoading(); - console.log("serveinfo", res); - // this.activateSwitchPorts = res.switchDetialInfos || []; - this.activateSwitchPorts = {}; - //分两行,每行24个 - this.switchAllDetialInfos = res.switchAllDetialInfos || [] - var activaePorts = {}; - if (res.switchDetialInfos) { - for (var item of res.switchDetialInfos) { - if (item.port) activaePorts[item.port] = item; - } - } - console.log("activaePorts", activaePorts); - for (var i = 0; i <= 47; i++) { - var level = "" + parseInt(i / 24); - if (!this.activateSwitchPorts["" + level]) { - this.activateSwitchPorts["" + level] = []; - } - this.activateSwitchPorts["" + level].push({ - index: "" + (i + 1), - name: "", - info: activaePorts["" + (i + 1)] || undefined, - }); - } - // console.log("this.activateSwitchPorts", this.activateSwitchPorts); - this.dialog_activateSwitchPorts = true; - }, + + closeself() { console.log("closeself parent"); this.chartclose = true; }, - update_status_indrag(result, currentid) { - this.status_indrag = result; - this.current_drag_index = currentid; - }, - refresh_canvas() { - //根据缩放比,视觉角度,来做渲染?,或者说,最简单的,直接都展示出来,缩放下面的?然后超出的不展示即可? - }, - handleMouseMove(event) { - if (this.mouse_click) { - // console.log("handleMouseMove", event); - //记录坐标,支持实时的? - if (this.mouse_offset_last) { - // this.tleft += 20 - this.mouse_offset_last.offsetX - var offsetx = event.clientX - this.mouse_offset_last.clientX; - var offsety = event.clientY - this.mouse_offset_last.clientY; - // console.log("offset0", offsetx, offsety); - var soffsetx = offsetx > 0 ? offsetx : -offsetx; - var soffsety = offsety > 0 ? offsety : -offsety; - if (soffsety >= soffsetx) { - offsetx = 0; - } else { - offsety = 0; - } - - // console.log("offsetx", offsetx, offsety); - // this.tleft += offset * 0.1; - // this.cal_offset_x += offset; - // console.log('offset', event.offsetX - this.mouse_offset_last.offsetX) - if (event.target.id == "content") { - //让看板内部有偏移量 - if (offsetx != 0) { - if (offsetx > 0) { - this.container_offset_left += - this.base_move_offset * this.scale_container; - } else { - this.container_offset_left -= - this.base_move_offset * this.scale_container; - } - } - if (offsety != 0) { - if (offsety > 0) { - console.log("plus container_offset_top"); - this.container_offset_top += - this.base_move_offset * this.scale_container; - } else { - console.log("mul container_offset_top"); - - this.container_offset_top -= - this.base_move_offset * this.scale_container; - } - } - // if (this.container_offset_x < -90 / this.scale_container) { - // this.container_offset_x = -90 / this.scale_container; - // } else if (this.container_offset_x > 90 / this.scale_container) { - // this.container_offset_x = 90 / this.scale_container; - // } - // if (this.container_offset_y < -90 / this.scale_container) { - // this.container_offset_y = -90 / this.scale_container; - // } else if (this.container_offset_y > 90 / this.scale_container) { - // this.container_offset_y = 90 / this.scale_container; - // } - } - } - this.mouse_offset_last = event; - } - }, - handleMouseUp(event) { - // console.log("handleMouseUp", event); - if (this.mouse_click) { - if (this.mouse_click.className == "equipment-item") { - //说明是转移视角的 - //可能就是设备的 - //直接修改坐标就行了 - //计算鼠标偏移量,然后转换为屏幕坐标,再转换为显示单位坐标,同时弹出提示?是否要更改吧,更改就调用接口 - if ( - this.mouse_offset_last && - (this.cal_offset_x || this.cal_offset_y) - ) { - console.log("update?", this.tleft); - alert("是否要修改设备坐标"); - } - } else { - } - } - - this.mouse_click = undefined; - this.mouse_offset_last = undefined; - }, - + + // 鼠标按下事件 handleMouseDown(event) { - // console.log("handleMouseDown", event, event.target.className); - if (event.target.className.indexOf("equipment-item") >= 0) { - // console.log("handleMouseDown2", event, event.target.id); - // this.mouse_click = event.target; - } else if (event.target.id == "content") { - this.mouse_click = event.target; + this.isDragging = true; + this.offsetX = event.clientX - this.position.left; + this.offsetY = event.clientY - this.position.top; + document.addEventListener('mousemove', this.handleMouseMove); + document.addEventListener('mouseup', this.handleMouseUp); + document.body.style.cursor = 'grabbing'; // 改变光标为抓取状态 + }, + // 鼠标移动事件 + handleMouseMove(event) { + if (this.isDragging) { + this.position.left = event.clientX - this.offsetX; + this.position.top = event.clientY - this.offsetY; } }, - handleMouseLeave(event) { - // console.log("handleMouseLeave", event); - //直接取消 - // if (this.mouse_click) { - // // console.log("handleMouseMove", event); - // //记录坐标,支持实时的? - // if (this.mouse_offset_last) { - // // this.tleft += 20 - this.mouse_offset_last.offsetX - // var offsetx = event.offsetX - this.mouse_offset_last.offsetX; - // var offsety = event.offsetY - this.mouse_offset_last.offsetY; - // if (offsety >= offsetx) { - // offsetx = 0; - // } else { - // offsety = 0; - // } - // console.log("offsetx", offsetx, offsety); - - // if (event.target.id == "content") { - // //让看板内部有偏移量 - // if (offsetx != 0) { - // this.container_offset_x += - // 2 * this.scale_container * (offsetx > 0 ? 1 : -1); - // } - // if (offsety != 0) { - // var a = 2 * this.scale_container * (offsety > 0 ? 1 : -1); - - // console.log( - // "change this.container_offset_y1", - // this.container_offset_y, - // a - // ); - // this.container_offset_y += a; - // console.log( - // "change this.container_offset_y2", - // this.container_offset_y, - // a - // ); - // } - // } - // } - // this.mouse_offset_last = event; - // } - this.mouse_click = undefined; - this.mouse_offset_last = undefined; + // 鼠标松开事件 + handleMouseUp() { + if (this.isDragging) { + this.isDragging = false; + document.removeEventListener('mousemove', this.handleMouseMove); + document.removeEventListener('mouseup', this.handleMouseUp); + document.body.style.cursor = 'grab'; // 改变光标为抓取状态 + } }, + handleWheel(event) { event.preventDefault(); const delta = event.deltaY < 0 ? 0.2 : -0.2; this.container_offset_left = - this.container_offset_left / - (this.scale_container / (delta + this.scale_container)); + this.container_offset_left / + (this.scale_container / (delta + this.scale_container)); this.container_offset_top = - this.container_offset_top / - (this.scale_container / (delta + this.scale_container)); + this.container_offset_top / + (this.scale_container / (delta + this.scale_container)); this.scale_container += delta; if (this.scale_container < 0.2) { @@ -528,109 +630,157 @@ this.container_offset_left = 0; this.container_offset_top = 0; } + console.log("滚轮的缩放比") + + console.log(this.scale_container) }, - dragstart(e) { + dragstart(e, index) { + this.isDragging = false; console.log(e); - this.startclientX = e.clientX; // 记录拖拽元素初始位置 - this.startclientY = e.clientY; + this.dragSource = index; // 记录拖拽的源元素 console.log("start", e); + console.log("拖拽事件开始", index) + console.log(this.elements[index]) }, // 拖拽完成事件 - async dragend(e) { + async dragend(e, index) { + this.isDragging = false; //确定是否需要更新 let that = this; - var dto = this.device_list_map[e.target.id]; - that.$modal - .confirm( - "是否确定修改坐标,设备名:" + dto.switchName + "/" + dto.networkPort - ) - .then(async (res) => { - that.$modal.loading(); - console.log("end", e); - console.log(e); - that.cal_offset_x = e.clientX - that.startclientX; // 计算偏移量 - that.cal_offset_y = e.clientY - that.startclientY; - // console.log( - // "end drag", - // this.startclientX, - // e.clientX, - // this.cal_offset_x, - // this.device_list_map[e.target.id], - // this.device_list_map[e.target.id].currentX, - // parseFloat(this.device_list_map[e.target.id].currentX), - // parseFloat(this.device_list_map[e.target.id].currentX) + - // parseFloat( - // (this.cal_offset_x / this.html_base) * (1 / this.scale_container) - // ).toFixed(2) - // ); - var rawx = that.device_list_map[e.target.id].currentX; - var rawy = that.device_list_map[e.target.id].currentY; - that.device_list_map[e.target.id].currentX = - parseFloat(that.device_list_map[e.target.id].currentX) + - parseFloat( - (that.cal_offset_x / that.html_base) * (1 / that.scale_container) - ); // 实现拖拽元素随偏移量移动 - that.device_list_map[e.target.id].currentY = - parseFloat(that.device_list_map[e.target.id].currentY) + - parseFloat( - (that.cal_offset_y / that.html_base) * (1 / that.scale_container) - ); - // this.elTop += this.cal_offset_y; - console.log("end drag2", that.device_list_map[e.target.id].currentX); - //更新坐标信息,并保存 - var json = { - id: dto.id.replace("content_", ""), - operateType: 1, - operateTime: new Date(), - moveBeforeX: rawx, - moveBeforeY: rawy, - currentX: that.device_list_map[e.target.id].currentX, - currentY: that.device_list_map[e.target.id].currentY, - }; - const data = await updateDevicePosition(json); - - that.$modal.closeLoading(); - console.log("updateDevicePosition", data); - }) - .catch((e) => { - }) - .finally(() => { - }); + console.log("拖拽事件完成", index) + console.log("拖拽目标Id:", e.target.id) }, - // async init_data() { - // this.$modal.loading(); - // const data = await getDeviceList(this.code); - // this.$modal.closeLoading(); - // var arr = (data && data.switchDetialInfos) || []; - // this.device_list = []; - // var index = -1; - // for (var item of arr) { - // index++; - // if (item.baseX) { - // var dto = { - // ...item, - // id: "content_" + item.id, - // //todo 需要根据类型来模拟设备 - // typeclass: "equ-" + (index % 7), - // currentX: parseFloat(item.currentX || item.baseX), - // currentY: parseFloat(item.currentY || item.baseY), - // }; - // this.device_list.push(dto); - // this.device_list_map[dto.id] = dto; - // } - // } - // console.log("this.device_list", this.device_list); - // }, + /**两个元素交换位置 */ + handleDrop(e, targetIndex) { + this.isDragging = false; + console.log("handleDrop") + console.log(targetIndex) + + let that = this; + let sourceIndex = this.dragSource; + // 实现逻辑,例如交换两个元素的位置 + if (sourceIndex !== targetIndex && (this.elements[sourceIndex].deviceInfo || this.elements[targetIndex].deviceInfo)) { + const sourceDeviceInfo = this.elements[sourceIndex].deviceInfo; + const targetDeviceInfo = this.elements[targetIndex].deviceInfo; + const sourceElement=this.elements[sourceIndex] + const targetElement=this.elements[targetIndex] + let sourceNetworkPort = "指定位置" + if (sourceDeviceInfo?.networkPort) { + sourceNetworkPort = sourceDeviceInfo?.networkPort + } + let targetNetworkPort = "指定位置" + if (targetDeviceInfo?.networkPort) { + targetNetworkPort = targetDeviceInfo?.networkPort + } + let type = false; + if (sourceDeviceInfo?.networkPort && targetDeviceInfo?.networkPort) { + type = true; + } + that.$modal + .confirm( + `是否确定${type ? "交换" : "移动"}位置:从${sourceNetworkPort + }到${targetNetworkPort}上` + ) + .then(async (res) => { + + // this.elements[sourceIndex].deviceInfo = targetDeviceInfo + // this.elements[targetIndex].deviceInfo = sourceDeviceInfo + + if (this.elements[sourceIndex].deviceInfo == null) { + this.elements[sourceIndex].isPlaceholder = false; + } + + if (this.elements[targetIndex].deviceInfo == null) { + this.elements[targetIndex].isPlaceholder = false; + } + + that.$modal.loading(); + let json; + console.log() + if (type) { + + // 交换 + json = { + id: sourceDeviceInfo.id, + operateType: 3, + operateTime: new Date(), + networkPort: sourceDeviceInfo.networkPort, + changeId:targetDeviceInfo?.id, + changeAreaRow: targetElement.row, + changeAreaCell: targetElement.cell, + deviceInfo: { + areaRow: sourceElement.row, + areaCell:sourceElement.cell, + areaCode:this.code + }, + }; + + } else { + // 移动 + + const { id, networkPort } = sourceDeviceInfo ? sourceDeviceInfo : targetDeviceInfo; + const { row, cell } = sourceDeviceInfo ? targetElement : sourceElement; + + json = { + id: id, + operateType: 1, + operateTime: new Date(), + networkPort: networkPort, + deviceInfo: { + areaRow: row, + areaCell: cell, + areaCode:this.code + }, + }; + + } + + const data = await updateDevicePosition(json); + that.$modal.closeLoading(); + if (data) { + this.$message.success(`${type ? "交换" : "移动"}成功`); + } + + // 根据屏幕初始化格子 + this.initializeElements(); // 在组件加载时初始化 elements + // 初始化设备信息 + this.handleBindElementsItems() + + }) + .catch((e) => { + console.log(e); + }) + .finally(() => { }); + + } + + }, + + handleDragOver(e) { + this.isDragging = false; + e.preventDefault(); + }, + + + // 点击增加 + handleClickToAddItem(index,item){ + + this.cur_item=item + // 如果存在设备的话则直接返回 + if(item?.deviceInfo?.id) return; + this.$refs.equAddForm && this.$refs.equAddForm.openform(); + }, + async init_data() { this.$modal.loading(); - var {data} = await getBridgeInfos(this.code); + var { data } = await getBridgeInfos(this.code); this.$modal.closeLoading(); var arr = (data && data) || []; - console.log("arr", arr); var currentareaconfig = mapdata[this.code] || {}; this.bridge_infos = {}; + // var name2ip = {} // for(var item of this.device_list){ // name2ip[item.networkPort] = item.ip @@ -683,23 +833,23 @@ cells: item.areaCellRow || [], code: item.areaIndex, }; - console.log("bridge_infos", this.bridge_infos); - console.log( - "currentareaconfig", - currentareaconfig[item.areaIndex], - currentareaconfig["pad"] - ); + // console.log("bridge_infos", this.bridge_infos); + // console.log( + // "currentareaconfig", + // currentareaconfig[item.areaIndex], + // currentareaconfig["pad"] + // ); if (currentareaconfig["pad"]) { this.bridge_infos[item.areaIndex]["pad"] = currentareaconfig["pad"]; } if ( - currentareaconfig[item.areaIndex] && - currentareaconfig[item.areaIndex]["pad"] + currentareaconfig[item.areaIndex] && + currentareaconfig[item.areaIndex]["pad"] ) { this.bridge_infos[item.areaIndex]["pad"] = - currentareaconfig[item.areaIndex]["pad"]; + currentareaconfig[item.areaIndex]["pad"]; } - // console.log('currentareaconfig',item.areaCode,currentareaconfig[item.areaCode],arr,currentareaconfig) + } }, @@ -726,6 +876,7 @@ this.serve_timer && clearInterval(this.serve_timer); }, async showServe(info) { + if (!this.hideServe) { this.hideServe = !this.hideServe; return; @@ -734,49 +885,37 @@ this.serve_info = {}; this.serve_select = info; console.log("serve_select", this.serve_select); - const {switchCabinet} = await getAreaServeInfo(this.code, info); + const { switchCabinet } = await getAreaServeInfo(this.code, info); console.log("switchCabinet", switchCabinet); if (switchCabinet && switchCabinet.length > 0) { this.serve_info = switchCabinet[0]; - - // const data = await getFaultInfo(this.code); - // this.data_service_list = []; - // if (data && data.faultInfo) { - // // this.data_service_list = []; - // // time: "1-10", - // // desc: "Host: SZHMESVMA557<br/>Line: IB2 FA2<br/>Overall Execution Time 2103", - // // status: "red", - // var index = 0; - // for (var item of data.faultInfo) { - // //需要根据名字过滤 - // // console.log('item.ip == info.ip',info.ip) - // // if (item.ip == info.ip) - // { - // this.data_service_list.push({ - // status: item.node == "异常" ? "red" : "green", - // time: ++index, - // desc: `${item.areaCode}/${item.portMessage}<br/>${item.cabineName}/${item.switchDeviceName}/${item.switchPort}`, - // }); - // } - // } - // setTimeout(() => { - // this.startScrolling(); - // }, 1000); - // } - // console.log("data_service_list", this.data_service_list); } this.hideServe = false; - // console.log("showServe", this.hideServe); this.$modal.closeLoading(); + }, + showDeviceInfo(index, item,event) { + this.isDragging = false; + event.stopPropagation(); // 阻止事件冒泡 + if(item.deviceInfo){ + // 如果点击的是同一个元素,则切换显示状态 + if (this.selectedIndex === index) { + this.show_device_info = !this.show_device_info; + } else { + // 切换到新元素,自动关闭之前的 + this.selectedIndex = index; + this.show_device_info = true; + this.cur_device_info = item.deviceInfo; + } + } }, }, }; </script> <style lang="scss" scoped> -@import "../../common/itm_svg.scss"; -@import "../../common/area-bg.scss"; +@import "@/common/itm_svg.scss"; +@import "@/common/area-bg.scss"; $width-screen1: 174.17rem; @@ -788,7 +927,6 @@ left: 0; right: 0; */ /* background-color: rgba(209, 227, 247, 1); */ - // overflow: hidden; margin: 0 auto; margin-bottom: 5rem; @@ -811,290 +949,12 @@ } } - .serve-item { - margin: 0 auto; - display: flex; - width: fit-content; - cursor: pointer; - - .serve-img { - margin-right: 2rem; - background-image: url("../../assets/equipment/serve.svg"); - background-image: url("../../assets/equipment/serve_v2.png"); - background-size: 100% 100%; - width: 30.3rem; - height: 62.3rem; - - /* padding-left: 1rem; */ - .each-item-container { - margin-top: 21rem; - margin-left: 3rem; - - .each-item { - background-image: url("../../assets/equipment/serve_item.png"); - width: 18.9rem; - height: 4.8rem; - background-size: 100% 100%; - margin-bottom: 0.9rem; - color: #265696; - position: relative; - - .desc { - text-align: left; - padding-left: 1rem; - padding-top: 0.5rem; - - .title { - font-weight: 600; - margin-bottom: 0.8rem; - /* */ - } - - .value { - } - } - } - - .each-item:hover::before { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - - content: ""; - background-color: #059ce293; - } - - .each-item-default::before { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - - content: ""; - background-color: #4bb6e854; - } - - .tip-msg { - display: none; - position: absolute; - left: calc(50% + 5rem); //起始是在body中,横向距左50%的位置 - top: 55%; //起始是在body中,纵向距上50%的位置,这个点相当于body的中心点,div的左上角的定位 - min-width: 21rem; - height: 13.6rem; - background: #f1f9ff; - box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(56, 92, 131, 0.77); - border-radius: 0.6rem; - z-index: 2; - padding: 1.3rem; - - .title { - font-size: 2.5rem; - font-family: PingFangSC-Semibold, PingFang SC; - font-weight: 600; - color: #012b5e; - line-height: 3.6rem; - text-align: left; - margin-bottom: 1rem; - text-overflow: ellipsis; - /* width: 10rem; */ - overflow: hidden; - word-break: break-all; - white-space: nowrap; - - .dot { - width: 1.6rem; - height: 1.6rem; - min-width: 1.6rem; - min-height: 1.6rem; - /* background: #e20505; */ - border-radius: 50%; - margin-top: 1rem; - margin-right: 0.5rem; - } - } - - .desc { - font-size: 1.8rem; - font-family: PingFangSC-Regular, PingFang SC; - font-weight: 400; - color: #666666; - line-height: 2rem; - text-align: left; - /* margin-left: 2.1rem; */ - margin-top: 0.5rem; - - .f-n { - color: #0dbe79; - font-weight: 600; - } - - .f-r { - color: #e10808; - font-weight: 600; - } - - .f-y { - color: #ffc310; - font-weight: 600; - } - } - } - - .each-item:hover .tip-msg { - display: unset; - } - } - } - - .tj-item { - margin-left: 2rem; - width: 33.5rem; - min-height: 47.5rem; - min-height: 17.5rem; - height: fit-content; - background: #f2f8fd; - box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(198, 212, 228, 0.38), - inset 0rem 0.2rem 0.3rem 0rem rgba(255, 255, 255, 0.5); - border-radius: 1rem; - - .tj-nums { - padding: 1.8rem; - - .title { - font-size: 2.5rem; - font-family: PingFangSC-Semibold, PingFang SC; - font-weight: 600; - color: #265696; - line-height: 3.6rem; - text-align: left; - margin-bottom: 1.8rem; - } - - .equ-num-item { - margin: 0 auto; - text-align: center; - - .desc2 { - font-size: 1.6rem; - font-family: PingFangSC-Medium, PingFang SC; - font-weight: 500; - color: #235884; - line-height: 2.2rem; - } - - .num { - font-size: 2.4rem; - font-family: Impact; - line-height: 2.9rem; - } - - .num.g { - color: #0dbe79; - } - - .num.y { - color: #ffc310; - } - - .num.r { - color: #e10808; - } - } - - .equ-num-item.a { - margin-left: 0; - margin-right: auto; - } - - .equ-num-item.c { - margin-right: 0; - margin-left: auto; - } - } - - .tj-list { - padding: 2.2rem; - padding-top: 1.4rem; - - .service-list-arr { - background-color: #f2f8fd; - overflow: hidden; - height: 30.3rem; - - .service-list-arr-item { - width: 100%; - min-height: 3rem; - /* margin-top: 2.2rem; */ - display: flex; - flex-direction: row; - align-items: center; - height: fit-content; - - .time { - font-size: 1.2rem; - font-family: PingFangSC-Medium, PingFang SC; - font-weight: 500; - color: #a1b6c8; - line-height: 1.7rem; - margin-right: 1rem; - } - - .service-list-arr-item_content { - font-family: PingFangSC-Medium, PingFang SC; - color: #235884; - line-height: 1.17rem; - text-align: left; - margin-left: 0.4rem; - margin-right: 1.5rem; - padding-top: 1rem; - - font-size: 1.4rem; - font-weight: 500; - line-height: 1.4rem; - } - - .dot { - width: 0.58rem; - height: 0.58rem; - border-radius: 50%; - margin-top: 0.8rem; - margin-left: auto; - margin-right: 10px; - } - - .dot.red { - background: #c10b0b; - } - - .dot.yellow { - background: #fda928; - } - - .dot.green { - background: #17a537; - } - } - } - } - - .tj-line { - width: 30.1rem; - height: 0.1rem; - border: 0.1rem solid #ccdeec; - margin: 0 auto; - } - } - } - .chart-open { width: 6.1rem; height: 7.5rem; background: #e9f4fd; box-shadow: 0.6rem 0.4rem 2.4rem 0rem rgba(198, 212, 228, 0.83), - inset 0rem 0.2rem 0.3rem 0rem rgba(255, 255, 255, 0.5); + inset 0rem 0.2rem 0.3rem 0rem rgba(255, 255, 255, 0.5); border-radius: 1rem; position: fixed; right: 3rem; @@ -1104,7 +964,7 @@ .img-button { background-size: 100% 100%; - background-image: url("../../assets/area/chart-open.svg"); + background-image: url("@/assets/area/chart-open.svg"); width: 2.6rem; height: 2.6rem; transform: translate(-50%, -50%); @@ -1118,43 +978,43 @@ <style scoped lang="scss"> //7个设备 .equ-0 { - background-image: url("../../assets/equipment/arm.svg"); + background-image: url("@/assets/equipment/arm.svg"); width: 9.6rem; height: 9.6rem; } .equ-1 { - background-image: url("../../assets/equipment/pda.svg"); + background-image: url("@/assets/equipment/pda.svg"); width: 4.1rem; height: 6.1rem; } .equ-2 { - background-image: url("../../assets/equipment/pc.svg"); + background-image: url("@/assets/equipment/pc.svg"); width: 15rem; height: 12.6rem; } .equ-3 { - background-image: url("../../assets/equipment/print.svg"); + background-image: url("@/assets/equipment/print.svg"); width: 8.2rem; height: 8.1rem; } .equ-4 { - background-image: url("../../assets/equipment/screen.svg"); + background-image: url("@/assets/equipment/screen.svg"); width: 15.9rem; height: 13.1rem; } .equ-5 { - background-image: url("../../assets/equipment/setting.svg"); + background-image: url("@/assets/equipment/setting.svg"); width: 7.8rem; height: 7.5rem; } .equ-6 { - background-image: url("../../assets/equipment/video.svg"); + background-image: url("@/assets/equipment/video.svg"); width: 12.7rem; height: 9.4rem; } @@ -1198,7 +1058,7 @@ height: 1.6rem; // background: #fff; // box-shadow: 0rem -2rem 2.1rem 0rem #fff; - background-image: url("../../assets/area/space.svg"); + background-image: url("@/assets/area/space.svg"); background-size: 100% 100%; position: relative; @@ -1218,10 +1078,10 @@ } .space-text { - background-image: url("../../assets/area/space-text.svg"); - background-size: 100% 100%; - min-width: 6rem; - min-height: 2.5rem; + background-image: url("@/assets/area/space-text.svg"); + // background-size: 100% 100%; + // min-width: 6rem; + // min-height: 2.5rem; transform: translate(-50%, 0%); left: 50%; padding-top: 0.5rem; @@ -1261,4 +1121,131 @@ .port-items:nth-child(2n) { margin-bottom: 8rem; } +</style> + +<style scoped> +.grid-item { + position: absolute; + box-sizing: border-box; + /* border: 1px solid #ccc; 可选样式,便于查看布局 */ + border: 1px solid #ccc; + display: flex; + justify-content: center; + align-items: center; + border: none; +} +</style> + + +<style lang="scss" scoped> +.bridge-items { + //width: 102.8rem; + // height: 1.5rem; + // background: #a6c6e5; + // box-shadow: 0rem -2rem 2.1rem 0rem #89a2bd; + display: flex; + position: absolute; + /* flex-wrap: wrap; */ + + .bridge-item { + background: #A6C7E3; + flex: 1; + margin: 0 auto; + // min-width: 7.5rem; + /* max-width: 6rem; */ + height: 1.3rem; + + // background: #fff; + // box-shadow: 0rem -2rem 2.1rem 0rem #fff; + + background-image: url("@/assets/area/space.svg"); + background-size: 100% 100%; + position: relative; + + + .bridge-item-element { + margin: 1 auto; + background-image: url("@/assets/area/space.svg"); + background-repeat: no-repeat; + /* 不重复显示图片 */ + background-position: center; + /* 图片居中显示 */ + background-size: contain; + /* 调整图片大小以适应容器 */ + cursor: grabbing; + cursor: move; + } + + .space-text { + background-image: url("@/assets/area/space-text.svg"); + background-size: 100% 100%; + min-width: 7.5rem; + min-height: 2.5rem; + transform: translate(-50%, 0%); + left: 50%; + padding-top: 0.5rem; + top: -2.5rem; + position: absolute; + cursor: grabbing; + cursor: move; + /* line-height: 100%; */ + /* font-size: 12px; */ + /* span { */ + word-break: break-all; + word-wrap: break-word; + /*但在有些场景中,还需要加上下面这行代码*/ + white-space: normal; + overflow-wrap: anywhere; + /* } */ + + font-size: 1rem; + font-family: PingFangSC-Semibold, PingFang SC; + font-weight: 600; + color: #3299ff; + z-index: 20; + } + + .space-text-yellow { + color: #e8be19; + } + + .space-text-red { + color: #e20909; + } + } + + + .bridge-item-none { + transition: box-shadow 0.3s ease; + /* 平滑的阴影过渡效果 */ + } + + .hover-shadow:hover { + // box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3); /* 鼠标悬停时的阴影效果 */ + box-shadow: 0 6px 15px rgba(0, 0, 0, 0.5); + /* 加深的阴影效果 */ + // box-shadow: 0 6px 15px rgba(162, 194, 221, 0.5); /* 加深的阴影效果 */ + + } + + .space-drag { + filter: unset !important; + background-color: rgb(243, 15, 15); + + .space-text-gray { + z-index: -1; + } + } + + .space-drag-start { + background-color: rgb(243, 15, 15); + } +} + +.space-text-gray { + .space-text { + color: #818181 !important; + background-image: url("@/assets/area/space-text-gray.svg") !important; + } +} </style> \ No newline at end of file -- Gitblit v1.9.3