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