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