From 0ae255185f422781f8a5cc4c52ad56ee0d3a1e6e Mon Sep 17 00:00:00 2001
From: 陶杰 <1378534974@qq.com>
Date: 星期五, 29 十一月 2024 19:07:15 +0800
Subject: [PATCH] 1.首页可拖拽 2.没有名字去掉悬浮层 3.增加了背景
---
src/views/screen1/itm-map-plant-board.vue | 360 +++++++++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 272 insertions(+), 88 deletions(-)
diff --git a/src/views/screen1/itm-map-plant-board.vue b/src/views/screen1/itm-map-plant-board.vue
index 702b3a5..9ea7eaf 100644
--- a/src/views/screen1/itm-map-plant-board.vue
+++ b/src/views/screen1/itm-map-plant-board.vue
@@ -1,12 +1,22 @@
<template>
- <div style="position: relative;" class="itm-map-vr" @contextmenu="showMenu($event)"
- :style="{
- background: plantBoardFlag ? 'linear-gradient(-90deg, rgba(0, 0, 0, 0.1) 1px, transparent 1px) 0% 0% / 20px 20px, linear-gradient(rgba(0, 0, 0, 0.1) 1px, transparent 1px) 0% 0% / 20px 20px' : ''
+ <div style="position: relative;" class="itm-map-vr" @contextmenu="showMenu($event)" ref="targetDiv"
+ @mousedown="handleMouseDown"
+ :style="{
+ // background: plantBoardFlag ? 'linear-gradient(-90deg, rgba(0, 0, 0, 0.1) 1px, transparent 1px) 0% 0% / 20px 20px, linear-gradient(rgba(0, 0, 0, 0.1) 1px, transparent 1px) 0% 0% / 20px 20px' : '',
+
+ backgroundImage: `url(${screenSrc})`,
+ backgroundSize:'cover',
+ backgroundPosition:'center',
+ backgroundRepeat: 'no-repeat',
+
+ top: `${position.top}px`,
+ left: `${position.left}px`,
+
}"
>
<!-- v-for="(item, index) in itmmapdatas" -->
<!-- backgroundSize: 'cover', -->
- <vdr :grid=[20,20] :min-width="minWidth" :min-height="minHeight" :resizable="plantBoardFlag"
+ <vdr :grid=[1,1] :min-width="minWidth" :min-height="minHeight" :resizable="plantBoardFlag"
:draggable="plantBoardFlag" v-for="(item, index) in items" :w="item.w" :h="item.h" :x="item.x" :y="item.y"
@dragging="onDrag" z-index="0" @resizing="onResize" :parent="true" @dragstop="onDragStop(item)"
@resizestop="onResizeStop(item)" @activated="onActivated(item)" @deactivated="onDeactivated(item)"
@@ -14,7 +24,7 @@
:scale-ratio="0.7"
:style="{
- backgroundImage: `url(${imgSrc})`,
+ backgroundImage: `url(${item.imgSrc})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
@@ -25,7 +35,7 @@
item?.s ? '' : 'd',
item?.n == 'r' ? 'error r' : '',
item?.n == 'y' ? 'error y' : '',
- item?.areacode ? 'areacode' : '',
+ item?.areacode && item?.t ? 'areacode' : '',
]" :key="index">
<div style="width:100%;height:100%;" @click="toAreaDetail(item)" @contextmenu="showElementMenu($event,item)" @mouseenter="onMouseEnter(item,$event)" @mouseleave="onMouseLeave" >
<div v-if="item.t" class="t" v-html="item.t" :class="[item.t_c_1, item.stand, item.t_c, item.tl]"></div>
@@ -87,15 +97,25 @@
<li @click="handleDel()">删除</li>
</ul>
+ <div>
+ <add-area-item ref="addAreaItem" :menuPositionx ="this.menuPosition.x" :menu-positiony="this.menuPosition.y" @update-area-list="getAreaItemList"></add-area-item>
+ </div>
+
</div>
</template>
<script>
import A27 from '@/assets/screen/screen5/svgs3d/A27.svg'
+import ScreenPlace from '@/assets/screen/screen1/screen-place.png'
+
+
+import AddAreaItem from "@/components/add-area-item";
import { itmmapdata } from "./itm-map.js";
+import {addAreaItemInfo, deleteAreaModuleItem, getAreaItemData, updateAreaModuleItem} from "@/api/addareaitem";
export default {
+ components: {AddAreaItem},
props: {
no: {
type: Number,
@@ -112,71 +132,73 @@
x: 0,
y: 0,
imgSrc: A27,
+ screenSrc:ScreenPlace,
vLine: [],
hLine: [],
items:[
- {
- x:300,
- y:300,
- w:200,
- h:200,
- t:'',
- s:'',
- n:'',
- areacode:'',
- t_c:'',
- t_c_1:'',
- tl:'',
- stand:'',
- imgSrc:A27,
- },
- {
- x:0,
- y:0,
- w:200,
- h:200,
- t:'测试一区',
- s:'',
- n:'',
- areacode:'01',
- t_c:'',
- t_c_1:'',
- tl:'',
- stand:'',
- imgSrc:A27,
- },
- {
- x:0,
- y:0,
- w:200,
- h:200,
- t:'测试一区',
- s:'',
- n:'',
- areacode:'01',
- t_c:'',
- t_c_1:'',
- tl:'',
- stand:'',
- imgSrc:A27,
- },
- {
- x:120,
- y:120,
- w:200,
- h:200,
- t:'测试二区',
- s:'',
- n:'',
- areacode:'02',
- t_c:'',
- t_c_1:'',
- tl:'',
- stand:'',
- imgSrc:A27,
- },
+ // {
+ // x:300,
+ // y:300,
+ // w:200,
+ // h:200,
+ // t:'',
+ // s:'',
+ // n:'',
+ // areacode:'',
+ // t_c:'',
+ // t_c_1:'',
+ // tl:'',
+ // stand:'',
+ // imgSrc:A27,
+ // },
+ // {
+ // x:0,
+ // y:0,
+ // w:200,
+ // h:200,
+ // t:'测试一区',
+ // s:'',
+ // n:'',
+ // areacode:'01',
+ // t_c:'',
+ // t_c_1:'',
+ // tl:'',
+ // stand:'',
+ // imgSrc:A27,
+ // },
+ // {
+ // x:0,
+ // y:0,
+ // w:200,
+ // h:200,
+ // t:'测试一区',
+ // s:'',
+ // n:'',
+ // areacode:'01',
+ // t_c:'',
+ // t_c_1:'',
+ // tl:'',
+ // stand:'',
+ // imgSrc:A27,
+ // },
+ // {
+ // x:120,
+ // y:120,
+ // w:200,
+ // h:200,
+ // t:'测试二区',
+ // s:'',
+ // n:'',
+ // areacode:'02',
+ // t_c:'',
+ // t_c_1:'',
+ // tl:'',
+ // stand:'',
+ // imgSrc:A27,
+ // },
],
+ adjustedItem: [],
isElementMenuVisible: false, // 控制菜单显示
elementMenuPosition: { x: 0, y: 0 }, // 菜单位置
@@ -190,23 +212,69 @@
plantBoardFlag:false, // 是否画布局
hoveredItem:{},
+ deleteItem:{},
+ editItem:{},
areaVisible:false,
areaPosition: { x: 0, y: 0 },
+ mouseX:0,
+ mouseY:0,
+
+ offsetX: 0, // 鼠标点击时相对元素的 X 偏移量
+ offsetY: 0, // 鼠标点击时相对元素的 Y 偏移量
+ position: {
+ top: 100, // 元素初始位置
+ left: 100, // 元素初始位置
+ },
};
},
mounted() {
document.addEventListener("click", this.hideMenu);
+ this.getAreaItemList();
+ // document.addEventListener("mousemove", (event) => {
+ // this.mouseX = event.offsetX;
+ // this.mouseY = event.offsetY;
+ // console.log(`Mouse Position: X=${this.mouseX}, Y=${this.mouseY}`);
+ // });
},
beforeUnmount() {
document.removeEventListener("click", this.hideMenu);
},
methods: {
+
+
+ // 鼠标按下事件
+ handleMouseDown(event) {
+ 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;
+ }
+ },
+ // 鼠标松开事件
+ handleMouseUp() {
+ if (this.isDragging) {
+ this.isDragging = false;
+ document.removeEventListener('mousemove', this.handleMouseMove);
+ document.removeEventListener('mouseup', this.handleMouseUp);
+ document.body.style.cursor = 'grab'; // 改变光标为抓取状态
+ }
+ },
+
// 判断当前悬停项
onMouseEnter(item,event) {
+ this.isDragging = false;
this.hoveredItem = item;
this.areaVisible=true;
this.areaPosition = { x: item.x+item.w/2, y: item.y+item.h/2 };
@@ -214,6 +282,7 @@
},
// 清除悬停项
onMouseLeave() {
+ this.isDragging = false;
this.hoveredItem = null;
this.areaVisible=false;
},
@@ -227,6 +296,7 @@
},
onResize: function (x, y, width, height) {
+ this.isDragging = false;
console.log("onResize")
this.x = x
this.y = y
@@ -235,23 +305,36 @@
console.log(`x:${this.x},y:${this.y},w:${this.width},h:${this.height}`)
},
onDrag: function (x, y) {
+ this.isDragging = false;
console.log("onDrag")
this.x = x
this.y = y
console.log(`x:${this.x},y:${this.y}`)
},
- onDragStop: function (itemParam) {
+ onDragStop: async function (itemParam) {
+ this.isDragging = false;
console.log("停止拖拽")
console.log(`x:${this.x},y:${this.y}`)
- console.log(itemParam)
- itemParam.x = this.x
- itemParam.y = this.y
-
- // TODO 需要更新元素操作
+ console.log("itemParam", itemParam)
+ if(this.x !=itemParam.x && this.y !=itemParam.y && this.w !=itemParam.w && this.h !=itemParam.h){
+ itemParam.x = this.x
+ itemParam.y = this.y
+ var dto = {
+ areacode : itemParam.areacode,
+ xVal: itemParam.x,
+ yVal: itemParam.y,
+ id: itemParam.id
+ };
+ //更新元素操作
+ const re = await updateAreaModuleItem(dto);
+ if (re.isSuccess) {
+ this.$message.success("更新成功");
+ }
+ }
},
- onResizeStop: function (itemParam) {
-
+ onResizeStop: async function (itemParam) {
+ this.isDragging = false;
console.log("停止resize")
console.log(`x:${this.x},y:${this.y},width:${this.width},height:${this.height}`)
console.log(itemParam)
@@ -259,13 +342,21 @@
// itemParam.y=this.y
itemParam.w = this.width
itemParam.h = this.height
-
- // TODO 需要更新元素操作
-
-
+ var dto = {
+ areacode : itemParam.areacode,
+ wVal: itemParam.w,
+ hVal: itemParam.h,
+ id: itemParam.id
+ };
+ //更新元素操作
+ const re = await updateAreaModuleItem(dto);
+ if (re.isSuccess) {
+ this.$message.success("更新成功");
+ this.open = false;
+ }
},
onActivated: function (itemParam) {
-
+ this.isDragging = false;
console.log('元素被激活')
console.log(itemParam)
// 元素初始化
@@ -277,6 +368,7 @@
},
onDeactivated: function (itemParam) {
+ this.isDragging = false;
console.log('元素失活')
console.log(itemParam)
@@ -288,6 +380,8 @@
},
showMenu(event) {
event.preventDefault();
+ // this.menuPosition = { x: this.mouseX, y: this.mouseY};
+ // this.menuPosition = { x: event.offsetX, y: event.offsetY};
this.menuPosition = { x: event.clientX, y: event.clientY };
this.menuVisible = true;
this.hideElementMenu()
@@ -296,10 +390,14 @@
// 显示组件右键菜单
showElementMenu(event, item) {
+ this.isDragging = false;
event.preventDefault(); // 禁用默认右键菜单
event.stopPropagation(); // 阻止冒泡
this.elementMenuPosition = { x: item.x + item.w, y: item.y };
this.isElementMenuVisible = true;
+ console.log("item",item);
+ this.deleteItem = item;
+ this.editItem = item;
// 点击其他地方时隐藏菜单
document.addEventListener("click", this.hideElementMenu);
@@ -307,29 +405,116 @@
},
// 隐藏右键菜单
hideElementMenu() {
+ this.isDragging = false;
this.isElementMenuVisible = false;
document.removeEventListener("click", this.hideElementMenu);
},
// 更新操作
handleUpdate() {
- // TODO
- alert(`You selected:handleUpdate`);
+ this.isDragging = false;
+ //编辑操作
this.hideElementMenu();
+ console.log("this.editItem",this.editItem);
+ this.$refs.addAreaItem && this.$refs.addAreaItem.editConfig(this.editItem);
+ this.hideMenu();
},
// 删除操作
- handleDel() {
- // TODO
- alert(`You selected:handleDel`);
+ async handleDel() {
+ this.isDragging = false;
+ // 删除
+ console.log("this.deleteItem",this.deleteItem);
+ const re = await deleteAreaModuleItem(this.deleteItem.id);
+ if (re.isSuccess) {
+ this.$message.success("删除成功");
+ this.getAreaItemList();
+ }
this.hideElementMenu();
},
// 新增操作
handleAdd() {
- // TODO
- alert(`You selected:handleAdd`);
- // this.hideElementMenu();
+ this.isDragging = false;
+ this.$refs.addAreaItem && this.$refs.addAreaItem.openConfig();
this.hideMenu();
},
+ // async getAreaItemList(){
+ // debugger;
+ // const result = await getAreaItemData(); // 假设这是一个返回Promise的函数
+ // this.adjustedItem = result.data; // 将解决后的数据赋值给itemData
+ // console.log(" adjustedItem", this.adjustedItem)
+ // let items = [];
+ //
+ // Object.keys(this.adjustedItem).forEach(key => {
+ // switch (key) {
+ // case 'xVal':
+ // items.x = this.adjustedItem[key];
+ // break;
+ // case 'yVal':
+ // items.y = this.adjustedItem[key];
+ // break;
+ // case 'areacode':
+ // items.areacode = this.adjustedItem[key];
+ // break;
+ // case 'uRL':
+ // items.imgSrc = this.adjustedItem[key];
+ // break;
+ // // 添加其他需要转换的键值对
+ // default:
+ // // 如果不需要转换,直接赋值
+ // // items[key] = this.adjustedItem[key];
+ // }
+ // });
+ // this.items = items;
+ // console.log(" this.items", this.items)
+ // },
+ async getAreaItemList() {
+ const result = await getAreaItemData(); // 假设这是一个返回Promise的函数
+ this.adjustedItem = result.data; // 将解决后的数据赋值给itemData
+ console.log(" adjustedItem", this.adjustedItem);
+ let items = [];
+ this.adjustedItem.forEach((item, index) => {
+ let newItem = {};
+ if (item.xVal !== undefined) {
+ newItem.x = parseInt(item.xVal, 10);
+ }
+ if (item.yVal !== undefined) {
+ newItem.y = parseInt(item.yVal, 10);
+ }
+ if (item.areacode !== undefined) {
+ newItem.areacode = item.areacode;
+ }
+ if (item.url !== undefined) {
+ newItem.imgSrc = item.url;
+ }
+ if (item.id !== undefined) {
+ newItem.id = item.id;
+ }
+ if (item.wVal !== undefined) {
+ newItem.w = parseInt(item.wVal, 10);
+ }
+ if (item.hVal !== undefined) {
+ newItem.h = parseInt(item.hVal, 10);
+ }
+ if (item.tVal !== undefined) {
+ newItem.t = item.tVal;
+ }
+ newItem.areaBackGroudURL = item.areaBackGroudURL;
+ newItem.areaConfigNum = item.areaConfigNum;
+ newItem.moduleName = item.moduleName;
+ newItem.areaBackGroudName = item.areaBackGroudName;
+ newItem.s = '';
+ newItem.n = '';
+ newItem.t_c = '';
+ newItem.t_c_1 = '';
+ newItem.tl = '';
+ newItem.stand = '';
+ items.push(newItem);
+ });
+
+ this.items = items;
+ console.log(" this.items", this.items);
+ },
+
evalA(string) {
@@ -546,7 +731,6 @@
right: 0;
top: 0;
bottom: 0;
-
content: "";
background-color: #059ce293;
--
Gitblit v1.9.3