From 02b07aa1314da966a8a07ff0257fc6b240dfeb1a Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Thu, 30 Oct 2025 09:21:28 +0800
Subject: [PATCH] feat:文件夹
---
src/views/layerManagement/components/rightEdit.vue | 4
src/views/layerManagement/components/folderFile.vue | 237 +++++++++++++++++++++++++++++++++++++++
src/views/layerManagement/components/leftList.vue | 24 +++
src/views/layerManagement/index.vue | 7 +
src/styles/element-ui.scss | 53 ++++++++
5 files changed, 320 insertions(+), 5 deletions(-)
diff --git a/src/styles/element-ui.scss b/src/styles/element-ui.scss
index b81aa2c..98b16ef 100644
--- a/src/styles/element-ui.scss
+++ b/src/styles/element-ui.scss
@@ -182,6 +182,7 @@
color: #fff !important;
}
.ztzf-layer-search {
+ color: #fff !important;
background-color: transparent !important;
.el-select__wrapper {
background-color: transparent !important;
@@ -192,6 +193,58 @@
.el-popper.is-light {
background-color: transparent !important;
}
+ // .el-select__placeholder {
+ // color: #fff !important;}
+
+}
+.ztzf-select-popper.el-select__popper {
+ border:#2D2D2D !important;
+
+ .el-select-dropdown {
+ overflow-x: hidden !important;
+
+ .el-scrollbar {
+ .el-select-dropdown__wrap {
+ background: linear-gradient(180deg, rgba(13, 53, 86, 0.85) 0%, rgba(1, 35, 80, 0.85) 100%);
+ border-radius: 0px 0px 8px 8px;
+ border: 1px solid;
+ border-image: linear-gradient(180deg, #fff, #fff) 1 1;
+ overflow-x: hidden !important;
+ margin-right: 0 !important;
+
+ .el-select-dropdown__list {
+ padding: 0 !important;
+
+ .el-select-dropdown__item {
+ background: #2D2D2D !important;
+ color: white;
+
+ &.hover {
+ background-color: #2D2D2D !important;
+ color: white;
+ }
+
+ &.selected {
+ color: #fff !important;
+ font-weight: 700;
+ }
+ }
+ }
+ }
+ }
+
+ .el-select-dropdown__empty {
+ background: #2D2D2D;
+ border-radius: 0px 0px 8px 8px;
+ border: 1px solid;
+ border-image: linear-gradient(180deg, #fff, #fff) 1 1;
+ }
+ }
+
+ .el-popper__arrow::before {
+ background: #2D2D2D !important;
+ border: 1px solid #fff !important;
+ }
}
//======以下针对表格功能 增删查改样式和弹窗=========
diff --git a/src/views/layerManagement/components/folderFile.vue b/src/views/layerManagement/components/folderFile.vue
new file mode 100644
index 0000000..612bd77
--- /dev/null
+++ b/src/views/layerManagement/components/folderFile.vue
@@ -0,0 +1,237 @@
+<template>
+ <div class="rightContainer">
+ <div class="contenttitle">文件夹信息</div>
+ <div class="centerBox">
+
+ <div class="itemRow">
+ <div class="label">文件夹名称</div>
+ <div>
+ <el-input class="ztzf-input inputName" v-model="formData.name" placeholder="请输入" />
+ </div>
+ </div>
+ <div class="itemRow">
+ <div class="label">关联算法</div>
+ <div>
+ <el-select
+ class="ztzf-layer-search filter-item"
+ popper-class="ztzf-select-popper"
+ @change="handleTypeChange"
+ v-model="formData.type"
+ placeholder="请选择"
+ >
+ <el-option
+ v-for="item in types"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ <el-select
+ v-model="formData.algorithm"
+ popper-class="ztzf-select-popper"
+ class="ztzf-layer-search"
+ placeholder="请选择"
+
+ :disabled="!formData.type"
+ >
+ <el-option
+ v-for="item in algorithms"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </div>
+ </div>
+ </div>
+ <div class="detailInfo">
+ <div class="infpItem">
+ <div class="itemData">
+ <div class="title">围栏总数量</div>
+ <div class="num"><span>{{totalCount}}</span>个</div>
+ </div>
+ <div class="itemData">
+ <div class="title">围栏总面积</div>
+ <div class="num"><span>{{totalArea}}</span>m²</div>
+ </div>
+ </div>
+ <div class="infpItem">
+ <div class="itemData">
+ <div class="title">创建时间</div>
+ <div class="num"><span>{{formData?.create_time}}</span></div>
+ </div>
+ <div class="itemData">
+ <div class="title">创建人</div>
+ <div class="num"><span>{{formData?.create_name}}</span></div>
+ </div>
+ </div>
+ </div>
+ <div class="btnGroups">
+ <img src="/src/assets/images/layerManagement/savebtn.svg" alt="" @click="submitHandle" />
+ <img src="/src/assets/images/layerManagement/cancelbtn.svg" @click="cancelHandel" alt="" />
+ </div>
+ </div>
+</template>
+
+<script setup>
+import { deitFenceApi } from '@/api/layer/index';
+import {
+ getTicketInfo,
+} from '@/api/tickets/ticket';
+const layerParams = inject('layerParams');
+const types = ref([]) //工单类型
+const allAlgorithms = ref([])
+const algorithms = ref([])
+
+const formData = ref({
+ folder_id: '',
+ name: '',
+ description: '',
+ is_enabled: false,
+ area: '',
+ altitude: '',
+ control_start_time: '',
+ control_end_time: '',
+ geo_data: '',
+ algorithm:'',
+ type: '',
+});
+const detailData = ref(null)
+const totalArea = ref(null)
+const totalCount = ref(null)
+detailData.value = layerParams.value.editDetailData
+totalArea.value = layerParams.value.total_area
+totalCount.value = layerParams.value.total_count
+
+const getTicketInfoData = async () => {
+ const response = await getTicketInfo()
+ const { dept_data, event_type, ai_type, info } = response.data.data
+ allAlgorithms.value = info
+ types.value = Object.entries(event_type).map(([key, value]) => ({
+ label: value,
+ value: key,
+ }))
+
+}
+const handleTypeChange=(typeValue)=>{
+
+ const matchedCategory = allAlgorithms.value.find(category => category.dict_key === typeValue)
+ if (!matchedCategory || !matchedCategory.algorithms || matchedCategory.algorithms.length === 0) {
+ // 无匹配的算法时清空
+ algorithms.value = []
+ return
+ }
+ algorithms.value = matchedCategory.algorithms.map(algo => ({
+ label: algo.dict_value,
+ value: algo.dict_key,
+ dict_key: algo.dict_key,
+ dict_value: algo.dict_value,
+ }))
+ console.log(' algorithms.value ', algorithms.value );
+}
+const clearAllData = () => {
+ detailData.value = {}
+ // 清空回显相关数据
+ detailData.value = {};
+ totalArea.value = null;
+ totalCount.value = null;
+ // 重置判断状态(可选,根据业务需求是否需要)
+ layerParams.value.decideWhetherToAddOrEdit = 1;
+ // 重置面板状态和缓存数据
+ layerParams.value.addFolder = false;
+ layerParams.value.editFolder = false;
+ layerParams.value.editDetailData = null;
+ layerParams.value.polygonPosition = null;
+};
+const cancelHandel = () => {
+ clearAllData()
+
+};
+const submitHandle = () => {
+
+ clearAllData()
+
+};
+onMounted(() => {
+ getTicketInfoData()
+});
+</script>
+
+<style scoped lang="scss">
+.rightContainer {
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 95%;
+ z-index: 99;
+ width: 324px;
+
+ overflow: hidden;
+ background: rgba(0, 0, 0, 0.8);
+ border-radius: 8px 8px 8px 8px;
+ padding: 16px 12px;
+
+ :deep(.el-textarea__inner) {
+ background: transparent !important;
+ color: #ffffff !important;
+ }
+ .contenttitle {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 16px;
+ color: #ffffff;
+ margin-bottom: 20px;
+ }
+ .centerBox {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #ffffff;
+ .itemRow {
+ margin-bottom: 35px;
+ }
+ .label {
+ margin-bottom: 5px;
+ }
+ }
+ .detailInfo {
+ .infpItem {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: 400;
+ font-size: 14px;
+ color: #ffffff;
+ margin-bottom: 23px;
+ .num {
+ span {
+ font-family: Source Han Sans CN, Source Han Sans CN;
+ font-weight: bold;
+ font-size: 20px;
+ color: #ffffff;
+ }
+ }
+ .itemData {
+ width: 50%;
+ }
+ }
+ }
+ .btnGroups {
+ display: flex;
+ justify-content: center;
+ position: absolute;
+ bottom: 59px;
+ left: 0;
+ right: 0;
+ img {
+ width: 125px;
+ height: 39px;
+ cursor: pointer;
+ }
+ }
+}
+.filter-item {
+ margin-bottom: 12px;
+}
+</style>
diff --git a/src/views/layerManagement/components/leftList.vue b/src/views/layerManagement/components/leftList.vue
index 0a884ca..d33b40e 100644
--- a/src/views/layerManagement/components/leftList.vue
+++ b/src/views/layerManagement/components/leftList.vue
@@ -159,12 +159,14 @@
layerParams.value.addNest = true;
layerParams.value.decideWhetherToAddOrEdit = 1
emit('newFencesMethods');
-
console.log('layerParams.value',layerParams.value);
};
// 新增文件夹
-const addFolder = () => {};
+const addFolder = () => {
+ layerParams.value.addFolder = true
+ layerParams.value.addAnEditingFolder =1
+};
onMounted(() => {
gettreeDataApi();
});
@@ -233,11 +235,29 @@
display: flex;
}
.tableListBox {
+ //:deep(.el-tree-node__content) {
+ // // 奇数行背景色
+ // &:nth-child(odd) {
+ // background-color: rgba(13, 43, 56, 0.5) !important;
+ // }
+ // // 偶数行背景色
+ // &:nth-child(even) {
+ // background-color: rgba(30, 45, 81, 0.5) !important;
+ // }
+ //}
+
+
+ :deep(){
+ .el-checkbox{
+ --el-checkbox-bg-color: transparent !important;
+ }
+ }
.tree-node {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
+
}
.tree-node-actions {
diff --git a/src/views/layerManagement/components/rightEdit.vue b/src/views/layerManagement/components/rightEdit.vue
index d8ab6ae..622e0c1 100644
--- a/src/views/layerManagement/components/rightEdit.vue
+++ b/src/views/layerManagement/components/rightEdit.vue
@@ -5,7 +5,7 @@
<div class="itemRow">
<div class="label">文件夹名称</div>
<div>
- <el-select class="ztzf-layer-search" v-model="formData.area" placeholder="Select">
+ <el-select class="ztzf-layer-search" popper-class="ztzf-select-popper" v-model="formData.area" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
@@ -18,7 +18,7 @@
<div class="itemRow">
<div class="label">围栏名称</div>
<div>
- <el-input class="ztzf-input inputName" v-model="formData.name" placeholder="围栏名称" />
+ <el-input class="ztzf-input inputName" v-model="formData.name" placeholder="请输入" />
</div>
</div>
<div class="itemRow">
diff --git a/src/views/layerManagement/index.vue b/src/views/layerManagement/index.vue
index b7d6140..6a4d83e 100644
--- a/src/views/layerManagement/index.vue
+++ b/src/views/layerManagement/index.vue
@@ -11,7 +11,7 @@
<div class="mapContainer">
<div id="layMap" class="ztzf-cesium"></div>
<leftList
- v-if="!layerParams.addNest && !layerParams.editNest && activeType !== '2'"
+ v-if="!layerParams.addNest && !layerParams.editNest&& !layerParams.addFolder && activeType !== '2'"
@update:coverData="handleCoverDataUpdate"
@update:deitData="handleEdit"
:activeName="activeName"
@@ -21,6 +21,7 @@
v-if="layerParams.addNest || layerParams.editNest && activeType !== '2'"
@callParentMethod="parentMethod"
></rightEdit>
+ <folderFile v-if="layerParams.addFolder || layerParams.editFolder && activeType !== '2'"></folderFile>
<nationalSpatialPlanning v-if="activeType === '2'" />
</div>
</div>
@@ -28,6 +29,7 @@
</template>
<script setup>
+import folderFile from '@/views/layerManagement/components/folderFile.vue'
import { parseGeoDataToPositions } from '@/utils/geoParseUtil';
import { flyVisual } from '@/utils/cesium/mapUtil';
import rightEdit from '@/views/layerManagement/components/rightEdit.vue';
@@ -65,6 +67,9 @@
total_area: 0,
polygonPosition:null,
decideWhetherToAddOrEdit:null,//新增or编辑围栏
+ addAnEditingFolder:null,//新增or编辑文件夹
+ addFolder:false,
+ editFolder:false,
});
provide('layerParams', layerParams);
const handleClick = tab => {
--
Gitblit v1.9.3