Files
4.0/src/renderer/components/Tree/index.vue

993 lines
31 KiB
Vue
Raw Normal View History

2025-07-03 17:39:09 +08:00
<template>
<div class="TreeIndex">
<div class="arrowTree" @click="isShowTree">
<img :src="arrowTree" alt="" />
</div>
<svg-icon icon-class="LayerBorder" :class-name="['absolute', 'zIndex-1']"></svg-icon>
<div class="box1" v-on:mouseleave="treeMouseOver">
<div class="title">
<svg-icon icon-class="layerTitleBg" :class-name="['absolute', 'layerTitleBg']"></svg-icon>
<div>
<span></span>
{{ $t("tree.title") }}
</div>
<div class="border"></div>
</div>
<div class="ztreeBox custom_scroll_bar">
<ul id="treeDemo" class="ztree" :setting="setting" @click="cancel"></ul>
</div>
<div class="search" id="search">
<div class="searchUp">
<el-select v-model="select" @change="selectChange" style="width: 24%;" size="small">
<el-option value="tree" :label="$t('tree.layer')"></el-option>
<el-option value="poi" :label="$t('tree.location')"></el-option>
</el-select>
<input v-bind="searchKey" style="width: 50px;" id="keyword" type="text"
:placeholder="$t('btn.treePlaceholder')" @input="clearResult" @change="searchPlace" />
<el-button type="primary" plain id="queryButton" size="small" @click="searchPlace" :loading="loading">{{
$t("btn.search") }}
</el-button>
</div>
<div id="selectorBox">
<el-select ref="select1" @change="locationChange" v-model="value" size="small"
:placeholder="$t('btn.selectPlaceholder')" :no-data-text="$t('btn.selectNoText')">
<el-option v-for="(item, index) in poiOptions" :key="item.search_key + index" :label="item.search_key"
:value="item.address">
</el-option>
</el-select>
</div>
</div>
<rightMenu ref="rightMenu" class="absolute zIndex99"></rightMenu>
</div>
<el-dialog title="提示" :append-to-body="true" :visible.sync="dialogVisible" width="30%" :before-close="closeDialog">
<!-- 选择全景还是图片 -->
<span>请选择全景还是图片</span>
<el-radio-group v-model="radio" size="small">
<el-radio-button label="全景"></el-radio-button>
<el-radio-button label="图片"></el-radio-button>
</el-radio-group>
<span slot="footer" class="dialog-footer">
<el-button @click="closeDialog"> </el-button>
<el-button type="primary" @click="confirmType"> </el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { ipcRenderer } from "electron";
import arrowTree from "@/assets/images/arrowTree.png";
import { debounce } from "../../utils";
import tree from "./treeSetting";
import rightMenu from "./components/rightMenu.vue";
import AMapLoader from "@amap/amap-jsapi-loader";
import rightMenuOption from "../Tree/components/rightMenuOption";
2025-08-22 10:33:34 +08:00
import { findParentId } from "@/components/Tree/treeNode";
import { renderTextBox } from "./renderNode";
2025-07-03 17:39:09 +08:00
import {
get_source_list,
queryPOI,
addSource,
updateLayerIndex,
addPicture,
addPanorama
} from "@/api/gisAPI";
import {
getKeyOfSelectedNode,
cusAddNodes,
getNodeData,
} from "./treeNode";
import {
renderBim,
renderCzml,
renderGeojson,
renderLayer,
renderShp,
renderXLSX,
renderTerrain,
renderPicture
} from "./renderNode";
import { getNamefromPath2 } from "../../utils/index";
import * as path from "path";
import { GetHomeDir } from "../../../main/back/config";
import {
shpTotal
} from "./entityClick"
export default {
name: "index",
components: {
rightMenu,
},
mixins: [tree, rightMenuOption],
data() {
return {
input3: "",
select: "poi",
value: "",
searchKey: "",
poiOptions: [],
left: 0,
arrowTree,
isShow: true,
mapModule: null,
key:
(localStorage.getItem("AMapKey") &&
localStorage.getItem("AMapKey").split("|")[0]) ||
"d88fcc689d1aa99866b2d0d83fd36677",
isOnline: false,
loading: false,
dialogVisible: false,
radio: '全景',
picturePaths: [],
otherPaths: [],
};
},
mounted() {
this.$recvChanel("renderNode", () => {
this.getList();
});
$("#search").bind("keydown", function (e) {
// 兼容FF和IE和Opera
let theEvent = e || window.event;
let code = theEvent.keyCode || theEvent.which || theEvent.charCode;
if (code == 13) {
//回车执行查询
$("#queryButton").click();
}
});
if (window.isStandAlone) {
ipcRenderer.on("DroppedFiles", (event, filePaths) => {
// filePaths数组中包含图片类型(区分大小写)和其他类型区分开
this.picturePaths = [];
this.otherPaths = [];
// filePaths.forEach((item) => {
// if (item.endsWith(".png") || item.endsWith(".jpg") || item.endsWith(".jpeg") || item.endsWith(".PNG") || item.endsWith(".JPG") || item.endsWith(".JPEG")) {
// this.picturePaths.push(item);
// } else if (item.endsWith(".kml") || item.endsWith(".kmz") || item.endsWith(".czml") || item.endsWith(".geojson") || item.endsWith(".shp") || item.endsWith(".tab") || item.endsWith(".csv") || item.endsWith(".mif") || item.endsWith(".clt") || item.endsWith(".pak") || item.endsWith(".jct") || item.endsWith(".terrain") || item.endsWith(".bim") || item.endsWith(".json")) {
// this.otherPaths.push(item);
// } else {
// this.$message.error("不支持的文件类型!");
// }
// });
2025-07-03 17:39:09 +08:00
filePaths.forEach((item) => {
item = item.replace(/\\/g, "/");
// 使用正则表达式进行不区分大小写的匹配
if (/\.(png|jpg|jpeg)$/i.test(item)) {
2025-07-03 17:39:09 +08:00
this.picturePaths.push(item);
} else if (/\.(kml|kmz|czml|geojson|shp|tab|csv|mif|clt|pak|jct|terrain|bim|json|mbtiles)$/i.test(item)) {
2025-07-03 17:39:09 +08:00
this.otherPaths.push(item);
} else {
this.$message.error("不支持的文件类型!");
}
});
if (this.picturePaths.length > 0) {
this.dialogVisible = true;
}
if (this.otherPaths.length > 0) {
this.addResource(this.otherPaths);
}
});
}
},
methods: {
//
cancel() {
YJ.Global.splitScreen.setActiveId([]);
},
// 关闭dialog
closeDialog() {
this.dialogVisible = false;
},
// 确认选择
confirmType() {
this.dialogVisible = false;
if (this.radio == '全景') {
this.panoramaFun(this.picturePaths);
} else {
this.addPictureFun(this.picturePaths);
}
},
// 全景定位
panoramaFun(paths) {
let p_id = getKeyOfSelectedNode(this.$parent.treeObj, "source_id");
let source_id = this.$md5(new Date().getTime() + "全景图片");
const billboard = {
image: `http://localhost:${window.staticPort}/GEMarker/vr.png`,
defaultImage: "2",
show: true,
scale: 1,
};
let DbOption = {
source_id,
source_name: "全景图片",
source_type: "vr",
p_id,
};
addPanorama(
{ list: paths, p_id: DbOption.p_id, billboard: billboard },
(res) => {
if (res.whout_list.length > 0) {
let msg = "";
let arr = [];
if (res.whout_list.length > 5) {
arr = res.whout_list.slice(0, 5);
} else {
arr = res.whout_list;
}
arr.forEach((item) => {
msg = msg + item + " ";
});
this.$message.warning(msg + "照片已存在或者坐标信息异常!");
} else {
this.$message.success("导入成功!");
}
res.list.forEach((item) => {
let entity = renderPicture(item);
entity.flyTo();
cusAddNodes(this.$parent.treeObj, DbOption.p_id, [item]);
});
}
);
},
// 图片定位
addPictureFun(paths) {
let p_id = getKeyOfSelectedNode(this.$parent.treeObj, "source_id");
// if (selectedNode) {
let source_id = this.$md5(new Date().getTime() + "图片定位");
let DbOption = {
source_id,
source_name: "图片定位",
source_type: "picture",
p_id,
};
const billboard = {
image: `http://localhost:${window.staticPort}/GEMarker/picture.png`,
defaultImage: "1",
show: true,
scale: 1,
};
console.log("图片定位", billboard.image);
addPicture(
{ list: paths, p_id: DbOption.p_id, billboard: billboard },
(res) => {
console.log("res.list", res);
if (res.whout_list.length > 0) {
let msg = "";
let arr = [];
if (res.whout_list.length > 5) {
arr = res.whout_list.slice(0, 5);
} else {
arr = res.whout_list;
}
arr.forEach((item) => {
msg = msg + item + " ";
});
this.$message.warning(msg + "照片已存在或者坐标信息异常!");
} else {
this.$message.success("导入成功!");
}
console.log("res.list", res.list);
res.list.forEach((item) => {
let entity = renderPicture(item);
entity.flyTo();
cusAddNodes(this.$parent.treeObj, DbOption.p_id, [item]);
});
}
)
// .catch((err) => {
// this.$message.error("导入失败!", err);
// });
},
getLastPathComponent(path, extensionsToRemove = []) {
// 处理路径分隔符
const normalizedPath = path.replace(/\\/g, '/');
const lastComponent = normalizedPath.split('/').pop();
// 如果没有提供需要移除的后缀列表,直接返回原始名称
if (extensionsToRemove.length === 0) return lastComponent;
// 检查是否匹配任何需要移除的后缀
for (const ext of extensionsToRemove) {
const extWithDot = ext.startsWith('.') ? ext : `.${ext}`;
if (lastComponent.endsWith(extWithDot)) {
return lastComponent.slice(0, -extWithDot.length);
}
}
return lastComponent;
2025-07-03 17:39:09 +08:00
},
2025-07-03 17:39:09 +08:00
// 添加资源
addResource(filePaths) {
let p_id = getKeyOfSelectedNode(this.$parent.treeObj, "source_id");
filePaths.forEach((item) => {
console.log('item', item);
let name = this.getLastPathComponent(item, ['clt', 'json', 'pak', 'kml', 'kmz', 'shp', 'geojson', 'geoJson', 'czml', 'jct', 'mif', 'tab', 'csv', 'mbtiles']);
2025-07-03 17:39:09 +08:00
console.log("name", name);
let source_type = "layer";
if (item.endsWith(".clt") || item.endsWith(".json")) {
source_type = "tileset";
} else if (item.endsWith(".pak")) {
source_type = "Terrain";
} else if (item.endsWith(".kml") || item.endsWith(".kmz")) {
source_type = "kml";
} else if (item.endsWith(".shp")) {
source_type = "shp";
} else if (item.endsWith(".geojson") || item.endsWith(".geoJson")) {
source_type = "geojson";
} else if (item.endsWith(".czml")) {
source_type = "czml";
} else if (item.endsWith(".jct")) {
source_type = "bim";
} else if (item.endsWith(".mif")) {
source_type = "shp";
} else if (item.endsWith(".tab")) {
source_type = "shp";
} else if (item.endsWith(".csv")) {
source_type = "csv";
}
let params = {
source_name: name,
source_type,
source_id: this.$md5(item),
source_path: item,
p_id,
};
console.log("params1", params);
let node = getNodeData(params, {});
console.log("node", node);
if (source_type == "bim") {
this.addBIM(item);
return;
}
if (["shp", "tab", "mif", "kml", "kmz"].includes(source_type)) {
if (typeof node.detail == "string")
node.detail = JSON.parse(node.detail);
node.detail.richText = {};
}
let callback = (source_id, tileset) => {
window._entityMap.set(source_id, tileset);
tileset.flyTo();
};
console.log("addSource", node);
addSource(node).then(
(res) => {
console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", res);
/* if (item.endsWith(".pak") && res.data.tms.url) {
node.source_type = "layer"
}*/
let key = "";
if (!["geojson"].includes(node.source_type) && res.data.type) {
node.source_type = res.data.type;
switch (res.data.type) {
case "layer":
key = "tms";
break;
case "tileset":
key = "tile_set";
break;
case "terrain":
key = "terrain";
break;
default:
break;
}
}
// if(node.source_type =='Terrain'&&)
// if (!["shp", "csv", 'kml', 'tab', 'mif', 'geojson', 'pak', "Terrain"].includes(node.source_type)) {
// }
if (key) {
node.source_path = res.data[key].url;
}
source_type = node.source_type;
cusAddNodes(this.$parent.treeObj, p_id, [node]);
if (source_type == "shp") {
renderShp(node);
} else if (source_type == "mif") {
renderShp(node);
} else if (source_type == "csv") {
renderShp(node);
} else if (source_type == "tab") {
renderShp(node);
} else if (source_type == "geojson") {
renderGeojson(node);
} else if (source_type == "czml") {
renderCzml(node);
} else if (source_type == "kml") {
renderShp(node);
} else if (source_type == "layer") {
renderLayer(node, true);
} else if (source_type == "tileset" || source_type == "json") {
renderBim(node, true);
} else if (source_type == "xlsx") {
node.detail = res.data.xlsx;
renderXLSX(node);
} else {
renderTerrain(node);
}
},
(err) => {
console.log(err);
if (err.code == 50) {
let source_id = err.message.split(":")[1];
let node = this.$parent.treeObj.getNodeByParam(
"source_id",
source_id,
null
);
this.$parent.treeObj.selectNode(node);
}
}
);
});
},
// 切换清空input值使用获取当前input节点然后清空值
selectChange(val) {
let input = document.getElementById('keyword');
treeSearchCb('');
if (val == "poi") {
this.searchKey = '';
input.value = '';
} else {
this.searchKey = '';
this.poiOptions = [];
this.value = '';
input.value = '';
}
if (window.searchPlaceEntity) {
window.searchPlaceEntity.remove();
}
},
//
//鼠标移出关闭二级菜单
treeMouseOver() {
this.$changeComponentShow(".rightMenu", false);
},
locationChange() {
let item = this.poiOptions.find((item) => item.address == this.value);
let id = new YJ.Tools().randomString();
this.$nextTick(() => {
this.$refs.select1.blur();
});
if (window.searchPlaceMap === undefined) {
window.searchPlaceMap = new Map();
}
if (window.searchPlaceMap.size) {
window.searchPlaceMap.forEach((item) => {
item.remove();
});
window.searchPlaceMap.clear();
}
let textLenght = item.search_key.length;
if (textLenght > 17) {
item.search_key = item.search_key.match(/.{1,17}/g).join('\n');
}
// let sg84 = YJ.Global.CoordTransform.GCJ02ToWGS84(item.lng, item.lat);
let params = {
id,
positions: { lng: item.lng, lat: item.lat, alt: item.alt ? item.alt : 0 },
billboard: {
show: true,
image:
"http://localhost:" +
window.staticPort +
"/" +
"GEMarker1/A-ablu-blank.png",
width: 320,
height: 360,
},
show: true,
label: {
show: true,
text: item.search_key,
fontSize: 80,
color: "#FFF200FF",
scale: 3,
},
};
let entity = new YJ.Obj.BillboardObject(window.Earth1, params);
entity.labelFontSize = 75;
entity.billboardScale = 9;
entity.far = 42000000;
entity.entity.billboard.heightReference = 1;
entity.entity.label.heightReference = 1;
window.searchPlaceEntity = entity
entity.picking = false
// 获取entity
console.log("entity", entity);
// entity.entity.label.eyeOffset = new Cesium.Cartesian3(0, 0, -1000);
// entity.entity.billboard.eyeOffset = new Cesium.Cartesian3(0, 0, -1000)
window.Earth1.viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(
Number(params.positions.lng),
Number(params.positions.lat),
14000
),
duration: 3,
orientation: {
heading: 0,
pitch: (-85 * Math.PI) / 180,
roll: 0,
},
});
window.searchPlaceMap.set(id, entity);
},
clearResult() {
let string = $("#keyword")
.val()
.trim();
if (string == "") {
let arr = [];
if (window.searchPlaceMap) {
arr = Array.from(window.searchPlaceMap);
}
if (arr.length) {
window.searchPlaceMap.get(arr[0][0]).remove();
window.searchPlaceMap.clear();
}
this.poiOptions = [];
this.value = "";
window.treeSearchCb();
}
},
searchPlace: debounce(function () {
if (this.select == "poi") {
this.poiOptions = [];
this.value = "";
let way = localStorage.getItem("searchWay");
if (way == "net") {
2025-07-31 09:31:31 +08:00
// treeSearchCb("");
2025-07-03 17:39:09 +08:00
this.loading = true;
const doSearch = () => {
this.mapModule.plugin(
["AMap.PlaceSearch", "AMap.AutoComplete"],
() => {
this.placeSearch = new AMap.PlaceSearch();
try {
this.placeSearch.search(
$("#keyword").val().trim(),
(status, result) => {
if (result.info && result.info === "OK") {
let arr = [];
result.poiList.pois.forEach((item) => {
const location = YJ.CoordTransform.GCJ02ToWGS84(
item.location.lng,
item.location.lat
);
arr.push({
address: item.name,
search_key: item.name,
search_type: item.id,
lat: location[1],
lng: location[0],
2025-07-03 17:39:09 +08:00
});
});
this.poiOptions = arr;
if (this.poiOptions.length) {
2025-07-03 17:39:09 +08:00
this.loading = false;
this.$refs.select1.toggleMenu();
2025-07-03 17:39:09 +08:00
}
} else if (status == "error" || result === 'INVALID_PARAMS') {
this.$message.error("请填写正确的搜索关键字");
this.loading = false;
} else if (status == "error") {
this.$message.error("网络异常");
this.loading = false;
} else {
this.$message.warning("没有搜索结果");
this.loading = false;
2025-07-03 17:39:09 +08:00
}
}
);
} catch (e) {
this.loading = false;
2025-07-03 17:39:09 +08:00
}
}
);
};
if (!this.mapModule) {
this.loadAmp((err) => {
if (err) {
this.$message.error("无网络连接,请检查网络");
this.loading = false;
} else {
doSearch();
}
});
} else {
doSearch();
}
2025-07-03 17:39:09 +08:00
} else if (way == "poi") {
let string = $("#keyword").val().trim();
2025-07-03 17:39:09 +08:00
if (string)
queryPOI({ key: string }, (res) => {
this.poiOptions = res.list;
if (this.poiOptions.length) {
this.$refs.select1.toggleMenu();
}
this.loading = false;
});
else this.$message.warning("请输入搜索关键字");
}
} else {
this.poiOptions = [];
this.value = "";
treeSearchCb();
}
}, 500),
2025-07-03 17:39:09 +08:00
loadAmp(cb = () => { }) {
// console.log("loadAmp", AMapLoader);
AMapLoader.reset();
AMapLoader.load({
key: this.key, // 申请好的Web端开发者Key首次调用 load 时必填
version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
plugins: [],
})
.then((AMap) => {
// console.log("AMap", AMap);
this.mapModule = AMap;
this.isOnline = true;
cb();
})
.catch((err) => {
// console.log("amp:err", err);
this.loading = false;
this.isOnline = false;
cb(err ? "err" : "");
});
},
/**
* 获取树型节点数组
* @returns {Promise}
*/
getList() {
let keycode = localStorage.getItem("AMapKey");
window._AMapSecurityConfig = {
securityJsCode:
(keycode && keycode.split("|")[1]) ||
"d88fcc689d1aa99866b2d0d83fd36677",
};
// console.log("获取图层指挥舱数据");
//初始化高德地图
let arr = [
"ArcgisWXImagery",
"ArcgisBLUEImagery",
"ArcgisLWImagery",
"GDLWImagery",
"GDWXImagery",
"GDSLImagery",
"layer",
];
let that = this;
return new Promise((resolve, reject) => {
get_source_list()
.then((response) => {
if ([0, 200].includes(response.code)) {
let data = JSON.parse(JSON.stringify(response.data.list || []));
let layer = [];
window.treeSource = data.length;
data.sort(this.keysort("tree_index"));
//将模型压平
window.pressModelMap = new Map();
data.forEach((node) => {
if (node.source_type == "pressModel") {
// console.log("pressModel", node);
let obj = JSON.parse(JSON.stringify(node.detail));
if (typeof node.detail == "string") {
obj = JSON.parse(node.detail);
}
console.log('pressModelMap', obj);
pressModelMap.set(node.source_id + "_" + obj.model_id, node);
}
});
//给node设置树形如icon是否允许添加子节点以及右键菜单
data.forEach((node) => {
if (arr.includes(node.source_type)) {
layer.push(node);
return;
}
if (node.detail) node.detail = JSON.parse(node.detail);
//设置树上图标,并渲染到地球上
this.setOptions(node);
});
// layer排序
layer.sort((a, b) => {
return a.layer_index - b.layer_index;
});
layer.forEach(async (node) => {
if (node.detail) node.detail = JSON.parse(node.detail);
//设置树上图标,并渲染到地球上
await this.setOptions(node);
});
console.log('datatree', layer);
// this.$removeChanel("renderNode")
this.treeObj = $.fn.zTree.init(
$(`#treeDemo`),
this.setting,
data
);
window.treeObj = this.treeObj;
window.AllNodes = this.treeObj.getNodes()
2025-08-22 10:33:34 +08:00
console.log('window.AllNodes', window.AllNodes);
2025-07-03 17:39:09 +08:00
window.newFuzzySearch(
`treeDemo`,
"#keyword",
["sonShp", "gdbShp"],
2025-07-03 17:39:09 +08:00
true,
"#queryButton"
); /**/
this.$sendChanel("getTreeObj", this.treeObj);
//更新二维图层的层级
// console.log("this.setting", this.setting);
// this.treeObj
if (window.Earth1) {
YJ.Global.MouseRightMenu(
window.Earth1,
true,
(text, object) => {
switch (text) {
2025-08-22 10:33:34 +08:00
case "textBox":
this.addTextBox(object.position);
break;
2025-07-03 17:39:09 +08:00
case "rotateAround":
YJ.Global.rotateAround(window.Earth1, object.position);
break;
case "attribute":
if (object.parentId) {
// that.showAttr(object.id)
shpTotal(null, object.id)
} else {
that.getNode(object.id);
}
break;
}
}
);
}
resolve();
}
})
.catch((error) => {
reject(error);
});
});
},
2025-08-22 10:33:34 +08:00
// 添加文本框
addTextBox(position) {
2025-09-02 10:01:05 +08:00
// this.$sendChanel("textTetlie", "标注");
// this.$changeComponentShow(".textModelBox", true);
// this.$recvChanel("textModelContent", (data) => {
// console.log(data.text);
2025-08-22 10:33:34 +08:00
let that = this;
let source_id = that.$md5(new Date().getTime() + "文本框");
let textBox = {
id: source_id,
position: position,
2025-09-02 10:01:05 +08:00
text: '',
2025-08-22 10:33:34 +08:00
show: true,
};
let DbOption = {
source_id,
2025-09-02 10:01:05 +08:00
source_name: '文本框',
2025-08-22 10:33:34 +08:00
source_type: "textBox",
p_id: findParentId(that.treeObj),
};
let detailOption = JSON.parse(JSON.stringify(textBox));
let node = getNodeData(DbOption, detailOption);
renderTextBox(node);
addSource(node).then((res) => {
if ([0, 200].includes(res.code)) {
cusAddNodes(that.$parent.treeObj, DbOption.p_id, [node]);
}
});
2025-09-02 10:01:05 +08:00
// })
2025-08-22 10:33:34 +08:00
},
2025-07-03 17:39:09 +08:00
// 获取当前得node
getNode(source_id) {
if (!source_id) {
return
}
// console.log("source_id", source_id);
let node = this.treeObj.getNodeByParam("source_id", source_id, null);
console.log('node', node);
this.rightMenus.edit.callback(node);
},
isShowTree: debounce(function () {
if (this.isShow) {
this.hideen();
} else {
this.show();
}
}),
hideen() {
const TreeIndex = $(".TreeIndex")[0];
const animate = () => {
if (this.left <= -18) {
const img = $(".arrowTree img")[0];
img.classList.add("rotate");
this.isShow = false;
return;
}
TreeIndex.style.right = this.left - 1 + "%";
this.left = this.left - 1;
requestAnimationFrame(animate);
};
animate();
},
show() {
const TreeIndex = $(".TreeIndex")[0];
const animate = () => {
if (this.left >= 0) {
const img = $(".arrowTree img")[0];
img.classList.remove("rotate");
this.isShow = true;
return;
}
TreeIndex.style.right = this.left + 1 + "%";
this.left = this.left + 1;
requestAnimationFrame(animate);
};
animate();
},
},
2025-08-22 10:33:34 +08:00
2025-07-03 17:39:09 +08:00
};
</script>
<style lang="scss" scoped>
.rotate {
transform: rotateY(180deg);
transform-style: preserve-3d;
}
// .ztree li a .curSelectedNode {
// background-color: transparent !important;
// border: none !important;
// padding-top: 0;
// opacity: 1;
// }
.TreeIndex {
color: #ffffff;
right: 0;
top: 50%;
transform: translateY(-50%);
//width: 18vw; //400
//height: 65vh; //660
//width: 355px;
//height: 648px;
width: 18vw;
height: 33vw;
svg {
width: 100%;
height: 100%;
}
.arrowTree {
position: absolute;
top: 40%;
left: -70px;
img {
height: 50px;
width: 50px;
transition: transform 0.5s ease-in-out;
}
}
.box1 {
width: 90%;
margin: 0 auto;
box-sizing: border-box;
padding-top: 2.2em;
padding-bottom: 4.4em;
//position: relative;
display: flex;
flex-direction: column;
height: 100%;
.title {
width: 10vw; //400
height: 4vh;
position: relative;
//border: 1px solid red;
display: flex;
flex-direction: column;
justify-content: flex-end;
font-size: 1.2em;
padding-bottom: 0.1em;
.border {
align-self: flex-end;
width: 85%;
border: 1px solid;
border-color: var(--svg-baseLineColor);
}
span {
width: 4vh !important;
display: inline-block;
}
}
.ztreeBox {
//min-height: 43vh;
min-height: 22vw;
overflow-y: auto;
overflow-x: hidden;
#treeDemo {
height: 100%;
}
}
.search {
//border: 1px solid #007bff;
flex: auto;
padding: 0 1vw 0 0.5vw;
display: flex;
flex-direction: column;
justify-content: space-around;
.searchUp {
display: flex;
margin-bottom: 0.5vh;
input {
font-size: 14px;
flex: auto;
border-radius: 0;
-webkit-appearance: none;
background-color: #fff;
background-image: none;
//border-radius: 4px;
box-sizing: border-box;
color: #606266;
display: inline-block;
height: 32px;
line-height: 32px;
outline: 0;
padding: 0 15px;
//margin-right: 0.5vw;
border: none;
}
input:first-child {
border-radius: 17px 0 0 22px;
}
}
.el-select {
width: 100%;
}
}
}
}
.el-dialog__header {
padding: 10px !important;
}
.el-dialog__body {
padding: 10px 20px !important;
}
.el-dialog__footer {
padding: 10px !important;
}
</style>