From 0390f5ab4b062a9146cd7d92bdd91954a052e13d Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期五, 22 十一月 2024 14:58:09 +0800
Subject: [PATCH] add: 区域配置
---
src/api/addareaitem.js | 39 +++
src/views/screen1/itm-map-plant-board.vue | 275 ++++++++++++++++------
src/components/add-area-item.vue | 300 +++++++++++++++++++++++++
src/components/device-info.vue | 67 ++++
4 files changed, 592 insertions(+), 89 deletions(-)
diff --git a/src/api/addareaitem.js b/src/api/addareaitem.js
new file mode 100644
index 0000000..6c1c639
--- /dev/null
+++ b/src/api/addareaitem.js
@@ -0,0 +1,39 @@
+import request from '@/utils/request-api'
+
+export function addAreaItemInfo(dto) {
+ return request({
+ url: '/api/services/app/SwitchDevice/AddAreaModuleItem',
+ method: 'post',
+ data: {
+ ...dto
+ }
+ })
+}
+
+export function getAreaItemData() {
+ return request({
+ url: '/api/services/app/SwitchDevice/GetAllAreaModuleItems',
+ method: 'get',
+ params: {
+
+ }
+ })
+}
+
+export function updateAreaModuleItem(dto) {
+ return request({
+ url: '/api/services/app/SwitchDevice/UpdateAreaModuleItem',
+ method: 'put',
+ data: {
+ ...dto
+ }
+ })
+}
+
+export function deleteAreaModuleItem(id) {
+ return request({
+ url: '/api/services/app/SwitchDevice/DeleteAreaModuleItem',
+ method: 'delete',
+ params: { id }
+ })
+}
diff --git a/src/components/add-area-item.vue b/src/components/add-area-item.vue
new file mode 100644
index 0000000..e579647
--- /dev/null
+++ b/src/components/add-area-item.vue
@@ -0,0 +1,300 @@
+<template>
+ <el-dialog append-to-body
+ :visible.sync="open"
+ class="equ-add-form-dialog"
+ :close-on-click-modal="true"
+ >
+ <div class="equ-form equ-form-add">
+ <div class="equ-form-container">
+
+ <div class="flex m-t-2rem">
+ <div class="label require">区域编号:</div>
+ <el-input v-model="areacode"></el-input>
+ </div>
+ <div class="flex m-t-2rem">
+ <div class="label require">区域名称:</div>
+ <el-input v-model="areaName"></el-input>
+ </div>
+ <div class="flex m-t-2rem">
+ <div class="label require">布局数量:</div>
+ <el-input v-model="areaConfigNum"></el-input>
+ </div>
+ <div class="flex m-t-2rem">
+ <div class="label require">首页背景:</div>
+ <el-upload
+ class="upload-demo"
+ action="http://localhost:44311/home/UploadFile"
+ :before-upload="beforeUpload"
+ :on-preview="handlePreview"
+ :on-remove="handleRemove"
+ :before-remove="beforeRemove"
+ :on-success="handleSuccess"
+ :on-error="handleError"
+ multiple
+ :limit="1"
+ :on-exceed="handleExceed"
+ :file-list="fileList">
+ <el-button size="small" type="primary" class="button-container">点击上传</el-button>
+ </el-upload>
+ </div>
+ <div class="flex m-t-2rem">
+ <div class="label require">区域背景:</div>
+ <el-upload
+ class="upload-demo"
+ action="http://localhost:44311/home/UploadFile"
+ :before-upload="beforeUpload"
+ :on-preview="handlePreview"
+ :on-remove="handleRemove"
+ :before-remove="beforeRemove"
+ :on-success="handleSuccess2"
+ :on-error="handleError"
+ multiple
+ :limit="1"
+ :on-exceed="handleExceed"
+ :file-list="fileList2">
+ <el-button size="small" type="primary" class="button-container">点击上传</el-button>
+ </el-upload>
+ </div>
+ <div class="m-t-2rem flex">
+ <div style="text-align: center;" class="flex">
+ <div class="equ-form-add-button-confirm" @click="submit">确认</div>
+ <div class="equ-form-add-button-cancel" @click="open = false">取消</div>
+ </div>
+
+ </div>
+ </div>
+ </div>
+ </el-dialog>
+</template>
+
+<script>
+import {addAreaItemInfo} from "@/api/addareaitem";
+
+export default {
+ props: {
+ menuPositionx:'',
+ menuPositiony:'',
+ },
+ data() {
+ return {
+ open: false,
+ fileList: [],
+ fileList2: [],
+ uploadUrl: '',
+ areaBackGroudURL: '',
+ areacode: '',
+ areaConfigNum: '',
+ areaName: '',
+ num: 1,
+ editItemId: '',
+ filename1: '',
+ filename2: '',
+ };
+ },
+ mounted() {
+ },
+ methods: {
+ async submit() {
+
+ if (!this.uploadUrl || !this.areaBackGroudURL || !this.areacode || !this.areaConfigNum || !this.areacode) {
+ this.$message.warning("数据未填写完整");
+ return;
+ }
+ await this.$modal.confirm("确定新增区域吗?");
+ var dto = {
+ xVal: this.menuPositionx,
+ yVal: this.menuPositiony,
+ uRL: this.uploadUrl,
+ areaBackGroudURL: this.areaBackGroudURL,
+ areaConfigNum : this.areaConfigNum,
+ areacode: this.areacode,
+ tVal: this.areaName,
+ moduleName : this.filename1,
+ areaBackGroudName : this.filename2,
+ };
+ const re = await addAreaItemInfo(dto);
+ if (re.isSuccess) {
+ this.$emit('update-area-list'); // 触发自定义事件
+ this.$message.success("创建成功");
+ this.open = false;
+ }
+ },
+ openConfig() {
+ this.open = !this.open;
+ },
+ editConfig(editItem) {
+ this.open = !this.open;
+ console.log("editItem",editItem)
+ this.editItemId = editItem.id;
+ this.areacode = editItem.areacode;
+ this.areaName = editItem.t;
+ this.areaConfigNum = editItem.areaConfigNum;
+ var fileInfo1 = {
+ name : editItem.moduleName,
+ }
+ var fileInfo2 = {
+ name : editItem.areaBackGroudName,
+ }
+ this.fileList[0] = fileInfo1;
+ this.fileList2[0].name = fileInfo2;
+
+ console.log( " this.fileList",this.fileList)
+ },
+ handleRemove(file, fileList) {
+ console.log(file, fileList);
+ //删除文件
+ },
+ handlePreview(file) {
+ console.log(file);
+ },
+ handleExceed(files, fileList) {
+ this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
+ },
+ beforeRemove(file, fileList) {
+ return this.$confirm(`确定移除 ${file.name}?`);
+ },
+ handleChange(value) {
+ console.log(value);
+ },
+ async beforeUpload(file) {
+ return true;
+ },
+ handleSuccess(response, file, fileList) {
+ // 在这里处理文件上传成功的逻辑,例如保存响应数据到组件的状态中。
+ this.$message.success('文件上传成功');
+ console.log('文件上传成功', response);
+ this.uploadUrl = response.result;
+ this.filename1 = file.name;
+ console.log('文件上传成功地址', this.uploadUrl);
+ },
+ handleError(err, file, fileList) {
+ // 在这里处理文件上传失败的逻辑,例如显示错误消息。
+ this.$message.error('文件上传失败');
+ console.error('文件上传失败', err);
+ },
+ handleSuccess2(response, file, fileList) {
+ // 在这里处理文件上传成功的逻辑,例如保存响应数据到组件的状态中。
+ this.$message.success('文件上传成功');
+ console.log('文件上传成功', response);
+ this.areaBackGroudURL = response.result;
+ this.filename2 = file.name;
+ console.log('文件上传成功地址', this.uploadUrl);
+ },
+ },
+ watch: {},
+};
+</script>
+<style lang="scss">
+.equ-add-form-dialog .el-dialog {
+ background: none !important;
+ box-shadow: none !important;
+}
+</style>
+
+<style lang="scss" scoped>
+.equ-form-add-button {
+ width: 4.1rem;
+ height: 4.1rem;
+ background-size: 100% 100%;
+ background-image: url("../assets/area/equ-form-add-button.svg");
+ cursor: pointer;
+}
+
+.equ-form-add {
+ display: flex;
+ margin: 0 auto;
+ width: fit-content;
+ margin-bottom: 80px;
+ margin-top: 60px;
+}
+
+.equ-form-container {
+ //靠右
+ margin-left: 1rem;
+ width: 37.6rem;
+ background: #ffffff;
+ box-shadow: 0rem 0.2rem 3.4rem 0rem #bccbdd;
+ border-radius: 1rem;
+ padding: 2.2rem;
+ padding-bottom: 1.5rem;
+
+ .label {
+ width: 12rem;
+ font-size: 1.6rem;
+ font-family: SourceHanSansCN-Bold, SourceHanSansCN;
+ font-weight: bold;
+ color: #333333;
+ line-height: 2em;
+ margin-right: 1rem;
+ text-align: left;
+ }
+
+ .require::before {
+ content: "*";
+ color: red;
+ }
+
+ .value.input {
+ width: 25rem;
+ max-width: 25rem;
+ height: 3.2rem;
+ border-radius: 0.2rem;
+ border: 0.1rem solid #6c99be !important;
+ padding-left: 0.8rem;
+ }
+
+ .value.input::placeholder,
+ .value.select::placeholder {
+ font-family: SourceHanSansCN-Regular, SourceHanSansCN;
+ font-weight: 400;
+ color: #6c99be;
+ }
+
+ .value.select {
+ width: 26.1rem;
+
+ height: 3.2rem;
+ border-radius: 0.2rem;
+ border: 0.1rem solid #6c99be;
+ padding-left: 0.5rem;
+ color: #6c99be;
+ }
+
+ .equ-form-add-button-confirm {
+ width: 10.5rem;
+ height: 3.6rem;
+ background: #278afa;
+ border-radius: 0.4rem;
+
+ font-size: 1.6rem;
+ font-family: SourceHanSansCN-Regular, SourceHanSansCN;
+ font-weight: 400;
+ color: #ffffff;
+ line-height: 3.2rem;
+ margin-left: auto;
+ margin-right: 0;
+ cursor: pointer;
+ }
+
+ .equ-form-add-button-cancel {
+ width: 10.5rem;
+ height: 3.6rem;
+ border: 1px solid #278afa;
+ border-radius: 0.4rem;
+
+ font-size: 1.6rem;
+ font-family: SourceHanSansCN-Regular, SourceHanSansCN;
+ font-weight: 400;
+ color: #333;
+ line-height: 3.2rem;
+ margin-left: 16.7rem;
+ margin-right: 0;
+ cursor: pointer;
+ }
+
+ .button-container {
+ width: 18rem;
+ height: 40px;
+ }
+}
+</style>
\ No newline at end of file
diff --git a/src/components/device-info.vue b/src/components/device-info.vue
index 68cb85c..07c9b5c 100644
--- a/src/components/device-info.vue
+++ b/src/components/device-info.vue
@@ -1,11 +1,52 @@
<template>
-
+
<div
v-if="local_show_info"
class="device-info"
@click="local_show_info = false"
>
- <div class="title">接口</div>
+ <div class="info-container">
+ <div class="info-block">
+ <div class="title">上一次信息</div>
+ <div class="each">
+ <div class="label">网络连接性:</div>
+ <div class="value">{{ current_show_info.status }}</div>
+ </div>
+ <div class="each">
+ <div class="label">IP地址:</div>
+ <div class="value">{{ current_show_info.ip || "" }}</div>
+ </div>
+ <div class="each">
+ <div class="label">Mac:</div>
+ <div class="value">{{ current_show_info.mac }}</div>
+ </div>
+ <div class="each">
+ <div class="label">桥架端口:</div>
+ <div class="value">{{ current_show_info.networkPort }}</div>
+ </div>
+ <div class="each">
+ <div class="label">交换机名字:</div>
+ <div class="value">{{ current_show_info.switchName }}</div>
+ </div>
+ <div class="each">
+ <div class="label">交换机端口:</div>
+ <div class="value">{{ current_show_info.port }}</div>
+ </div>
+ <div class="each">
+ <div class="label">名称:</div>
+ <div class="value">{{ current_show_info.clhwName }}</div>
+ </div>
+ <div class="each">
+ <div class="label">类型:</div>
+ <div class="value">{{ current_show_info.clhwTier }}</div>
+ </div>
+ <div class="each">
+ <div class="label">操作系统:</div>
+ <div class="value">{{ current_show_info.clhwOperating_System }}</div>
+ </div>
+ </div>
+ <div class="info-block">
+ <div class="title">当前信息</div>
<div class="each">
<div class="label">网络连接性:</div>
<div class="value">{{ device_info.status }}</div>
@@ -42,6 +83,8 @@
<div class="label">操作系统:</div>
<div class="value">{{ device_info.clhwOperating_System }}</div>
</div>
+ </div>
+ </div>
<div class="button-to-switch" @click="toSwitchInfo()">交换机</div>
<div class="button-del-port" @click="delPort()">删除</div>
<div
@@ -52,7 +95,7 @@
device_info?.status==3 ||
device_info?.status==4
"
-
+
@click="statusPort(index)"
>
确认
@@ -104,7 +147,7 @@
return 4;
},
},
-
+
code: "",
areacode: "",
current_show_id: "",
@@ -173,12 +216,12 @@
background-image: url("../assets/area/device-info-bg.svg");
/* background-color: #a6c6e5; */
background-size: 100% 100%;
- height: 24.4rem;
- width: 29rem;
+ height: 39.4rem;
+ width: 49rem;
position: absolute;
// top: -31.5rem;
- top: -28.7rem;
- transform: translate(-50%, 0%);
+ top: -46.5rem;
+ transform: translate(-48%, 0%);
left: 50%;
z-index: 120;
padding: 3.1rem;
@@ -284,4 +327,12 @@
background-color: rgb(243, 15, 15);
}
}
+.info-container {
+ display: flex;
+ justify-content: space-between;
+}
+
+.info-block {
+ width: 45%; /* Adjust the width as needed */
+}
</style>
\ No newline at end of file
diff --git a/src/views/screen1/itm-map-plant-board.vue b/src/views/screen1/itm-map-plant-board.vue
index 702b3a5..b02feee 100644
--- a/src/views/screen1/itm-map-plant-board.vue
+++ b/src/views/screen1/itm-map-plant-board.vue
@@ -14,7 +14,7 @@
:scale-ratio="0.7"
:style="{
- backgroundImage: `url(${imgSrc})`,
+ backgroundImage: `url(${item.imgSrc})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
backgroundRepeat: 'no-repeat',
@@ -87,15 +87,22 @@
<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 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,
@@ -116,67 +123,68 @@
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,6 +198,8 @@
plantBoardFlag:false, // 是否画布局
hoveredItem:{},
+ deleteItem:{},
+ editItem:{},
areaVisible:false,
areaPosition: { x: 0, y: 0 },
@@ -199,6 +209,7 @@
mounted() {
document.addEventListener("click", this.hideMenu);
+ this.getAreaItemList();
},
beforeUnmount() {
document.removeEventListener("click", this.hideMenu);
@@ -240,18 +251,27 @@
this.y = y
console.log(`x:${this.x},y:${this.y}`)
},
- onDragStop: function (itemParam) {
+ onDragStop: async function (itemParam) {
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 = {
+ 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) {
console.log("停止resize")
console.log(`x:${this.x},y:${this.y},width:${this.width},height:${this.height}`)
console.log(itemParam)
@@ -259,10 +279,17 @@
// itemParam.y=this.y
itemParam.w = this.width
itemParam.h = this.height
-
- // TODO 需要更新元素操作
-
-
+ var dto = {
+ 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) {
@@ -300,6 +327,9 @@
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);
@@ -313,23 +343,106 @@
// 更新操作
handleUpdate() {
- // TODO
- alert(`You selected:handleUpdate`);
+ //编辑操作
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() {
+ // 删除
+ 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.$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) {
--
Gitblit v1.9.3