Browse Source

Merge remote-tracking branch 'origin/v3' into v3

wukai 1 year ago
parent
commit
515e086e21

+ 71 - 30
src/components/LeftList/LeftList.vue

@@ -5,12 +5,20 @@
       :data="treeData"
       :props="defaultProps"
       :accordion="false"
+      ref="folderTreeRef"
+      :highlight-current="true"
+      :current-node-key="curNode"
+      :filter-node-method="filterNode"
       node-key="id"
       :default-expand-all="false"
       :default-expanded-keys="curArr"
     >
       <template #default="{ node, data }">
-        <span class="custom-tree-node" @click="checkoutNode(node, data)">
+        <span
+          class="custom-tree-node"
+          @click="checkoutNode(node, data)"
+          @click.right="rightFn(node, data, $event)"
+        >
           <img :src="setImg(data.remark)" alt="" />
           <span class="node_title">{{ node.label }}</span>
           <span class="fileNum">{{
@@ -38,6 +46,7 @@ import { ElMessage } from "element-plus";
 import documents from "@/api/document/document";
 import { getDir } from "@/api/biz/dir.js";
 import { setListImg } from "@/utils/index.js";
+const { proxy } = getCurrentInstance();
 const props = defineProps({
   spaceType: {
     type: Number,
@@ -47,11 +56,18 @@ const props = defineProps({
     type: Array,
     default: () => [],
   },
+  searchFolderTree: {
+    type: String,
+    default: "",
+  },
 });
-const emit = defineEmits(["listfolderClick"]);
+const emit = defineEmits(["listfolderClick",'treeRClick']);
 const treeData = ref();
 console.log("treeData", treeData.value);
 const curArr = ref([]); //默认展开一级目录
+const folderTreeRef = ref();
+const curNode = ref()
+const topId = ref()//顶层的id
 const defaultProps = ref({
   label: "label",
   value: "id",
@@ -82,7 +98,9 @@ function getFileTree() {
 }
 const checkoutNode = async (node, data) => {
   // console.log("treeData", treeData.value);
-  console.log("node", node);
+  // console.log("node", node);
+  curNode.value = node.data.id
+  // console.log("curNode.value", curNode.value);
   // console.log("data", data);
   let thisNode;
   function getLevel2(nodes) {
@@ -117,39 +135,62 @@ const getTopDir = async () => {
   const res = await documents.getTop(3);
   console.log("topres", res);
   curArr.value.push(res.dirId);
+  topId.value = res.dirId
   return;
-  // let userMe;
-  // userMe = [res];
-  // documents
-  //   .getALLdocumentByType(
-  //     {
-  //       parentId: userMe[0].dirId - 0,
-  //       spaceId: userMe[0].spaceId,
-  //       isAsc: "asc",
-  //       orderByColumn: "createTime",
-  //       pageNum: 1,
-  //       pageSize: 999,
-  //     },
-  //     3
-  //   )
-  //   .then((res) => {
-  //     const folderArr = res.rows;
-  //   curArr.value = folderArr.map((item) => {
-  //       const obj = {
-  //         label: item.dirName,
-  //         value: item.dirId,
-  //         remark: "",
-  //         disable: false,
-  //       };
-  //       return obj
-  //     });
-  //     console.log("curArr.value", curArr.value);
-  //   });
+};
+const rightFn =async (node, data, e) => {
+  console.log("node", node);
+  console.log("data", data);
+  console.log("e", e);
+  const res = await getDir(data.id);
+  emit('treeRClick',res.data,null,e)
+};
+/** 通过条件过滤节点  */
+const filterNode = (value, data) => {
+  if (!value) return true;
+  return data.label.indexOf(value) !== -1;
 };
 watch(
   () => props.ListtreeData,
   (newValue, oldValue) => {
     treeData.value = newValue;
+    // 记录当前展开的节点
+    let nodesMap = folderTreeRef.value?.store.nodesMap;
+    // console.log("nodesMap", nodesMap);
+    // console.log("curNode.value", curNode.value);
+    let expandedNodes = [];
+    if (nodesMap) {
+      expandedNodes = Object.keys(nodesMap).filter(
+        (key) => nodesMap[key].expanded
+      );
+    }else{
+      expandedNodes.push(topId.value)
+    }
+    console.log("expandedNodes", expandedNodes);
+    // 把这当从服务器拉取数据
+    treeData.value = JSON.parse(JSON.stringify(newValue));
+    // 更新数据后, 有过滤条件的执行过滤, 没有的还原之前的展开状态
+    setTimeout(() => {
+      if (props.searchFolderTree!== "") {
+        folderTreeRef.value?.filter(props.searchFolderTree);
+      } else {
+        expandedNodes.forEach((key) => (nodesMap[key].expanded = true));
+      }
+      folderTreeRef.value?.setCurrentKey(curNode.value)
+    }, 0);
+  },
+  {
+    immediate: true,
+    deep: true,
+  }
+);
+/** 根据名称筛选部门树 */
+watch(
+  () => props.searchFolderTree,
+  (newValue, oldValue) => {
+    // console.log("watch", newValue);
+    folderTreeRef.value?.filter(newValue);
+    // proxy.$refs["folderTreeRef"].filter(newValue);
   },
   {
     immediate: true,

+ 26 - 5
src/components/ListShow/ListShow.vue

@@ -5,6 +5,7 @@
         <el-input
           v-model="searchFire"
           @keyup.enter="fileBlur"
+          @input="fileBlur"
           class="searchFire"
           size="large"
           placeholder="搜索文件"
@@ -37,9 +38,23 @@
         ref="container"
         @row-contextmenu="rightClick"
       >
-        <el-table-column label="名称">
+        <el-table-column label="名称" :show-overflow-tooltip="true">
           <template #default="scope">
             <div class="flie_name">
+              <el-icon
+                v-if="scope.row.isFavorite == 'N'"
+                @click.stop="collect(scope.row, false)"
+                style="margin-right: 7px"
+              >
+                <Star />
+              </el-icon>
+              <img
+                v-else
+                @click.stop="dCollect(scope.row, false)"
+                src="../../assets/images/yellowstar.png"
+                alt=""
+                style="margin-right: 5px"
+              />
               <img
                 class="table_icon"
                 :src="setIcon(scope.row.fileType)"
@@ -88,7 +103,7 @@ const props = defineProps({
     default: () => [],
   },
 });
-const emit = defineEmits(["handleRowClick"]);
+const emit = defineEmits(["handleRowClick",'delCollect','collectByStar']);
 // 切换搜索分类
 const changeSearchType = (name) => {
   let baseDataObj = props.fileList;
@@ -109,7 +124,7 @@ const changeSearchType = (name) => {
 };
 //搜索框模糊搜索事件
 const fileBlur = () => {
-  const arr = typeData.value;
+  const arr = typeData.value || props.fileList;
   tableData.value = arr.filter((item) => {
     if (item.fileName.includes(searchFire.value)) {
       return item;
@@ -117,8 +132,14 @@ const fileBlur = () => {
   });
 };
 
-const rightClick = (row, col, e)=>{
-  emit('handleRowClick',row,null,e)
+const rightClick = (row, col, e) => {
+  emit("handleRowClick", row, null, e);
+};
+const collect = (row, bool)=>{
+  emit('collectByStar',row,bool)
+}
+const dCollect = (row, bool)=>{
+  emit('delCollect',row,bool)
 }
 
 //工具函数

+ 169 - 152
src/components/Pdf2Word/Pdf2Word.vue

@@ -38,6 +38,7 @@
           <el-upload
             class="avatar-uploader"
             :http-request="test"
+            accept=".pdf, .PDF"
             :show-file-list="false"
             :before-upload="beforeUp"
           >
@@ -117,174 +118,190 @@
     :fileUserTreeData="treeData"
     @fileChangeMsg="fileChangeMsg"
   ></PicTree>
-  <div v-loading.fullscreen="loadingPreview" v-if="loadingPreview" class="lodingBox"></div>
+  <div
+    v-loading.fullscreen="loadingPreview"
+    v-if="loadingPreview"
+    class="lodingBox"
+  ></div>
 </template>
 
 <script setup>
-import { onMounted, ref, toRaw, watch, inject } from 'vue'
-import { ElMessage } from 'element-plus'
-import Clipboard from 'clipboard'
-import Loading from '@/components/Loading/Loading.vue'
-import PicTree from '@/components/PicTree/PicTree.vue' //选择文件发送的列表
-import { picTree, pdfTree } from '@/api/search/search.js'
-import { ocrRemark, preview } from '@/api/common/common.js'
-import { getInfo } from '@/api/biz/info.js'
-import Cookies from 'js-cookie'
-import axios from 'axios'
-const textData = ref('') //解析出来的文字
-const showImg = ref() //上传的图片
-const isOpen = ref(props.openFile)
-const thisStep = ref('start') //解析进度 start,loading,end,
-const openFile = ref(false) //控制tree显示
-const treeData = ref() //树节点数据
-const actionUrl = ref(`${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/biz/info/pdf2word`)
+import { onMounted, ref, toRaw, watch, inject } from "vue";
+import { ElMessage } from "element-plus";
+import Clipboard from "clipboard";
+import Loading from "@/components/Loading/Loading.vue";
+import PicTree from "@/components/PicTree/PicTree.vue"; //选择文件发送的列表
+import { picTree, pdfTree } from "@/api/search/search.js";
+import { ocrRemark, preview } from "@/api/common/common.js";
+import { getInfo } from "@/api/biz/info.js";
+import Cookies from "js-cookie";
+import axios from "axios";
+const textData = ref(""); //解析出来的文字
+const showImg = ref(); //上传的图片
+const isOpen = ref(props.openFile);
+const thisStep = ref("start"); //解析进度 start,loading,end,
+const openFile = ref(false); //控制tree显示
+const treeData = ref(); //树节点数据
+const actionUrl = ref(
+  `${window.location.origin}${
+    import.meta.env.VITE_APP_BASE_API
+  }/biz/info/pdf2word`
+);
 const headersObj = ref({
-  Authorization: Cookies.get('Admin-Token')
-})
+  Authorization: Cookies.get("Admin-Token"),
+});
 // const actionUrl = ref(`${window.location.origin}/upload`);
-const loadingPreview = ref(false)
-const addFolderAdd = inject('addFolderAdd')
+const loadingPreview = ref(false);
+const addFolderAdd = inject("addFolderAdd");
 
 const props = defineProps({
   openFile: {
     type: Boolean,
-    default: false
-  }
-})
+    default: false,
+  },
+});
 watch(
   () => props.openFile,
   (newValue) => {
     // console.log(111);
-    isOpen.value = newValue
+    isOpen.value = newValue;
   }
-)
+);
 
-const test=function(file){
-  console.log('file',file);
-	const url=`${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/biz/info/pdf2word`;
-	 return axios({
-	        method:'post',
-	        url:url,
-	        responseType:'blob',
-          data:file,
-          headers:{
-            "Authorization":Cookies.get('Admin-Token'),
-            'Content-Type': 'multipart/form-data'
-          }
-	    }).then(function(res){
-        console.log('testres',res);
-	        // if(res.headers['content-disposition'] !== undefined){
-	            let blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })
-	            let fileName = decodeURI(res.headers['content-disposition']) 
-	          if (fileName) { 
-	            // fileName = fileName.substring(fileName.indexOf('=') + 1)
-	            // fileName = fileName.substring(0,fileName.lastIndexOf('.'))
-				// alert(fileName)
-	          }
-	          const elink = document.createElement('a') 
-            console.log('fileName',fileName);
-	          elink.download = fileName.replace(new RegExp('"', 'g'), '')+'.docx'
-	          elink.style.display = 'none'
-	          elink.href = URL.createObjectURL(blob) 
-	          document.body.appendChild(elink) 
-	          elink.click() 
-	          URL.revokeObjectURL(elink.href) 
-	          document.body.removeChild(elink) 
-            loadingPreview.value = false
-	        // }
-	    })
-}
-const fileId2Word=function(fileId){
-  console.log('fileId',fileId);
-	const url=`${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/biz/info/pdf2word/${fileId}`;
-	 return axios({
-	        method:'get',
-	        url:url,
-	        responseType:'blob',
-          headers:{
-            "Authorization":Cookies.get('Admin-Token'),
-            'Content-Type': 'multipart/form-data'
-          }
-	    }).then(function(res){
-        console.log('testres',res);
-	        // if(res.headers['content-disposition'] !== undefined){
-	            let blob = new Blob([res.data], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })
-	            let fileName = decodeURI(res.headers['content-disposition']) 
-	          if (fileName) { 
-	            // fileName = fileName.substring(fileName.indexOf('=') + 1)
-	            // fileName = fileName.substring(0,fileName.lastIndexOf('.'))
-				// alert(fileName)
-	          }
-	          const elink = document.createElement('a') 
-            console.log('fileName',fileName);
-	          elink.download = fileName.replace(new RegExp('"', 'g'), '')+'.docx'
-	          elink.style.display = 'none'
-	          elink.href = URL.createObjectURL(blob) 
-	          document.body.appendChild(elink) 
-	          elink.click() 
-	          URL.revokeObjectURL(elink.href) 
-	          document.body.removeChild(elink) 
-            loadingPreview.value = false
-	        // }
-	    })
-}
+const test = function (file) {
+  console.log("file", file);
+  const url = `${window.location.origin}${
+    import.meta.env.VITE_APP_BASE_API
+  }/biz/info/pdf2word`;
+  return axios({
+    method: "post",
+    url: url,
+    responseType: "blob",
+    data: file,
+    headers: {
+      Authorization: Cookies.get("Admin-Token"),
+      "Content-Type": "multipart/form-data",
+    },
+  }).then(function (res) {
+    console.log("testres", res);
+    if (res.headers["content-disposition"] !== undefined) {
+      let blob = new Blob([res.data], {
+        type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+      });
+      let fileName = decodeURI(res.headers["content-disposition"]);
+      if (fileName) {
+        fileName = fileName.substring(fileName.indexOf("=") + 1);
+        fileName = fileName.substring(0, fileName.lastIndexOf("."));
+        // alert(fileName)
+      }
+      const elink = document.createElement("a");
+      console.log("fileName", fileName);
+      elink.download = fileName.replace(new RegExp('"', "g"), "") + ".docx";
+      elink.style.display = "none";
+      elink.href = URL.createObjectURL(blob);
+      document.body.appendChild(elink);
+      elink.click();
+      URL.revokeObjectURL(elink.href);
+      document.body.removeChild(elink);
+      loadingPreview.value = false;
+    }
+  });
+};
+const fileId2Word = function (fileId) {
+  console.log("fileId", fileId);
+  const url = `${window.location.origin}${
+    import.meta.env.VITE_APP_BASE_API
+  }/biz/info/pdf2word/${fileId}`;
+  return axios({
+    method: "get",
+    url: url,
+    responseType: "blob",
+    headers: {
+      Authorization: Cookies.get("Admin-Token"),
+      "Content-Type": "multipart/form-data",
+    },
+  }).then(function (res) {
+    console.log("testres", res);
+    if (res.headers["content-disposition"] !== undefined) {
+      let blob = new Blob([res.data], {
+        type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+      });
+      let fileName = decodeURI(res.headers["content-disposition"]);
+      if (fileName) {
+        fileName = fileName.substring(fileName.indexOf("=") + 1);
+        fileName = fileName.substring(0, fileName.lastIndexOf("."));
+        // alert(fileName)
+      }
+      const elink = document.createElement("a");
+      console.log("fileName", fileName);
+      elink.download = fileName.replace(new RegExp('"', "g"), "") + ".docx";
+      elink.style.display = "none";
+      elink.href = URL.createObjectURL(blob);
+      document.body.appendChild(elink);
+      elink.click();
+      URL.revokeObjectURL(elink.href);
+      document.body.removeChild(elink);
+      loadingPreview.value = false;
+    }
+  });
+};
 
-onMounted(async () => {})
+onMounted(async () => {});
 
 const handleAvatarSuccess = (msg, file) => {
   // console.log('re', msg)
-  const flieData = toRaw(file)
+  const flieData = toRaw(file);
   // console.log('file', flieData)
   // setTimeout(() => {
   //   downLoadfile(flieData.raw,file);
   // }, 500);
-  const blob = new Blob([msg]) //excel,pdf等
-  const href = URL.createObjectURL(blob) //创建新的URL表示指定的blob对象
-  const a = document.createElement('a') //创建a标签
-  a.style.display = 'none'
-  a.href = href // 指定下载链接
-  a.download = file.name + '.docx' //指定下载文件名
-  a.click() //触发下载
-  URL.revokeObjectURL(a.href) //释放URL对象
-  ElMessage({ message: '转换成功,已下载到本地', type: 'success' })
-  loadingPreview.value = false
-}
+  const blob = new Blob([msg]); //excel,pdf等
+  const href = URL.createObjectURL(blob); //创建新的URL表示指定的blob对象
+  const a = document.createElement("a"); //创建a标签
+  a.style.display = "none";
+  a.href = href; // 指定下载链接
+  a.download = file.name + ".docx"; //指定下载文件名
+  a.click(); //触发下载
+  URL.revokeObjectURL(a.href); //释放URL对象
+  ElMessage({ message: "转换成功,已下载到本地", type: "success" });
+  loadingPreview.value = false;
+};
 //文件上传前的钩子
 const beforeUp = (raw) => {
   // console.log('raw',raw);
   // showImg.value = URL.createObjectURL(raw);
-  loadingPreview.value = true
+  loadingPreview.value = true;
   // thisStep.value = "loading";
-}
+};
 // 复制功能调用的方法
 const copyQbUrl = () => {
-  let clipboard = new Clipboard('.copy-qb', {
+  let clipboard = new Clipboard(".copy-qb", {
     text: () => {
-      return textData.value
-    }
-  })
-  clipboard.on('success', () => {
+      return textData.value;
+    },
+  });
+  clipboard.on("success", () => {
     // console.log('success');
-    ElMessage({ message: '复制成功', type: 'success' })
-    clipboard.destroy()
-  })
-  clipboard.on('error', () => {
+    ElMessage({ message: "复制成功", type: "success" });
+    clipboard.destroy();
+  });
+  clipboard.on("error", () => {
     // console.log('err');
-    clipboard.destroy()
-  })
-}
+    clipboard.destroy();
+  });
+};
 // 选取文库图片
 const addlibraryImg = async () => {
-  const res = await pdfTree()
-  console.log('res', res)
-  treeData.value = res
-  openFile.value = true
-}
+  const res = await pdfTree();
+  console.log("res", res);
+  treeData.value = res;
+  openFile.value = true;
+};
 //确定选中图片
 const fileChangeMsg = async (val) => {
-  console.log('val', toRaw(val))
-  loadingPreview.value = true
-  fileId2Word(val.remark)
+  console.log("val", toRaw(val));
+  loadingPreview.value = true;
+  fileId2Word(val.remark);
   // const res = await getInfo(val.id)
   // const data = toRaw(val)
   // const imgRes = await preview(data.id)
@@ -295,40 +312,40 @@ const fileChangeMsg = async (val) => {
   // textData.value = res.msg
   // console.log("res", res);
   // console.log("imgRes", imgRes);
-}
+};
 const reClick = () => {
-  thisStep.value = 'start'
-  textData.value = null
-  showImg.value = null
-}
+  thisStep.value = "start";
+  textData.value = null;
+  showImg.value = null;
+};
 // 文件下载
 const downLoadfile = (res, file) => {
   // console.log('downLoadfileres',res);
-  var reader = new FileReader()
+  var reader = new FileReader();
   reader.onloadend = function (event) {
     //event 就是你要的返回内容
     //因为返回的报错格式是字符串,手动转换成对象,转换成功表示请求失败
     //转换失败就意味着你拿到的result是文件流,那么直接手动下载就好
     try {
-      let data = JSON.parse(event.target.result)
+      let data = JSON.parse(event.target.result);
     } catch (err) {
-      const time = Date.now()
+      const time = Date.now();
       // console.log('time',time);
-      const link = document.createElement('a') // 创建a标签
-      let blob = new Blob([res])
-      link.style.display = 'none'
-      link.href = URL.createObjectURL(blob) // 创建下载的链接
+      const link = document.createElement("a"); // 创建a标签
+      let blob = new Blob([res]);
+      link.style.display = "none";
+      link.href = URL.createObjectURL(blob); // 创建下载的链接
       // link.setAttribute("download", clickRow.value.fileName); // 给下载后的文件命名
-      link.setAttribute('download', file.name + '.docx') // 给下载后的文件命名
-      document.body.appendChild(link)
-      link.click() // 点击下载
-      document.body.removeChild(link) //  完成移除元素
-      window.URL.revokeObjectURL(link.href) // 释放blob对象
+      link.setAttribute("download", file.name + ".docx"); // 给下载后的文件命名
+      document.body.appendChild(link);
+      link.click(); // 点击下载
+      document.body.removeChild(link); //  完成移除元素
+      window.URL.revokeObjectURL(link.href); // 释放blob对象
     }
-  }
+  };
   // console.log('downLoadfileres',res);
-  reader.readAsText(res)
-}
+  reader.readAsText(res);
+};
 </script>
 
 <style lang="scss" scoped>
@@ -472,7 +489,7 @@ const downLoadfile = (res, file) => {
     .light_box {
       width: 500px;
       height: 500px;
-      background-image: url('@/assets/images/light_boder.png');
+      background-image: url("@/assets/images/light_boder.png");
       background-repeat: no-repeat;
       background-size: contain;
       position: relative;

+ 86 - 0
src/components/TreeMenu/TreeMenu.vue

@@ -0,0 +1,86 @@
+<template>
+  <div
+    class="right_menu"
+    :style="{ left: props.xz + 'px', top: props.yz + 'px' }"
+  >
+    <div class="menu_item" @click="reNameFn">
+      <!-- <img src="@/assets/images/textbox.png" alt="" /> -->
+      <span class="shouzhi">重命名</span>
+    </div>
+    <div class="menu_item" @click="openFn">
+      <!-- <img src="@/assets/images/textbox.png" alt="" /> -->
+      <span class="shouzhi">编辑</span>
+    </div>
+    <div class="menu_item" @click="delFn">
+      <!-- <img src="@/assets/images/trash.png" alt="" /> -->
+      <span class="shouzhi">删除</span>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  computed,
+  reactive,
+  defineComponent,
+  watch,
+  toRaw,
+  onMounted,
+  defineExpose,
+  onDeactivated,
+} from "vue";
+import { ElMessage } from "element-plus";
+const props = defineProps({
+  xz: {
+    type: Number,
+    default: 0,
+  },
+  yz: {
+    type: Number,
+    default: 0,
+  },
+});
+const emit = defineEmits(["restName",'delName']);
+const reNameFn = ()=>{
+    console.log(1);
+    emit('restName')
+}
+const delFn = ()=>{
+    emit('delName')
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/styles/my-common.scss";
+.right_menu {
+  width: 120px !important;
+  position: absolute;
+  padding: 8px;
+  box-shadow: 0px 2px 10px 1px rgba(199, 203, 216);
+  border-radius: 4px 4px 4px 4px;
+//   border: 1px solid gray;
+  background-color: #fff;
+  z-index: 10000;
+  text-align: center !important;
+
+  .menu_item {
+    width: 100%;
+    height: 30px;
+    border-radius: 4px 4px 4px 4px;
+    line-height: 30px;
+    display: flex;
+    margin: 5px auto;
+    align-items: center;
+    font-size: 13px;
+
+    &:hover {
+      background-color: #f5f7f9;
+    }
+
+    span {
+      margin-left: 4px;
+    }
+  }
+}
+</style>

+ 1 - 1
src/views/HomePage/HomePage.vue

@@ -15,7 +15,7 @@
           </div>
         </div>
         <div class="ORC_box" @click="toidentifyFont">
-          <span class="text">ORC工具</span>
+          <span class="text">OCR工具</span>
         </div>
         <div class="sacn_box" @click="scannerFile">
           <span class="text">扫描工具</span>

+ 62 - 11
src/views/myfile/MyFile.vue

@@ -16,11 +16,20 @@
                 <!-- 方块点击盒子 -->
                 <div style="height: 75vh;overflow-y: auto;">
                     <div class="searchBox">
-                        <el-input v-model="searchFire" @keyup.enter="fileBlur" class="searchFire" size="large"
-                            placeholder="搜索文件" />
-                        <el-icon class="SearchIcon" @click="fileBlur">
-                            <Search />
-                        </el-icon>
+                        <div v-if="leftShowList == 1" style="width:100%">
+                            <el-input v-model="searchFire" @keyup.enter="fileBlur" class="searchFire" size="large"
+                                placeholder="搜索文件夹" />
+                            <el-icon class="SearchIcon" @click="fileBlur">
+                                <Search />
+                            </el-icon>
+                        </div>
+                         <div v-else style="width:100%">
+                            <el-input v-model="searchFolderTree" @keyup.enter="folderBlur" class="searchFire" size="large"
+                                placeholder="搜索文件" />
+                            <el-icon class="SearchIcon" @click="folderBlur">
+                                <Search />
+                            </el-icon>
+                        </div>
                         <div class="left_changeShow">
                             <img v-if="leftShowList == 1" src="@/assets/images/squre.png" @click="changeLeftShow" alt="">
                             <img v-else src="@/assets/images/Frame_187.png" @click="changeLeftShow" alt="">
@@ -62,7 +71,7 @@
                             </div>
                         </template>
                     </div>
-                    <LeftList v-else :spaceType="3" :ListtreeData="ListtreeData" @listfolderClick="listfolderClick"></LeftList>
+                    <LeftList v-else :spaceType="3" @treeRClick="treeRClick" :searchFolderTree="searchFolderTree" :ListtreeData="ListtreeData" @listfolderClick="listfolderClick"></LeftList>
                 </div>
                 <div class="expansion">
                     <div class="top_box">
@@ -373,7 +382,7 @@
                             </div>
                         </div>
                     </div>
-                    <ListShow v-show="leftShowList == 0" :fileList="fileList" @handleRowClick="handleRowClick"></ListShow>
+                    <ListShow v-show="leftShowList == 0" :fileList="fileList" @delCollect="delCollect" @collectByStar="collectByStar" @handleRowClick="handleRowClick"></ListShow>
 
                 </div>
             </div>
@@ -504,6 +513,7 @@
     </div>
     <!-- 扫描文件移动到 -->
     <MoveTo v-if="openScanMove" :spaceType='3' :scanFileArr="scanFileArr" :thisFolder="thisFolder" :openScanMove="openScanMove" @closeOpenScanMove='closeOpenScanMove'></MoveTo>
+    <TreeMenu v-show="showTreeMenu" @restName="restName" @delName="delName" :xz="xz" :yz="yz"></TreeMenu>
 </template>
 
 <script>
@@ -559,6 +569,7 @@ import elTableInfiniteScroll from 'el-table-infinite-scroll'
 import { getLevel } from '@/api/level/level.js';
 import { listInfo,selectInfo ,getFileByScanerId} from '@/api/scanner/info.js';
 import { getConfigKey } from "@/api/system/config.js"
+import TreeMenu from '@/components/TreeMenu/TreeMenu.vue'
 
 export default {
     directives: {
@@ -781,6 +792,8 @@ export default {
         const leftShowList = ref(localStorage.getItem('leftShowList') ||1)
         const thisFirst = ref()
         const ListtreeData = ref()
+        const searchFolderTree = ref()
+        const showTreeMenu = ref(false)
         const changeSort = async () => {
             isAsc.value == "asc" ? (isAsc.value = "desc") : (isAsc.value = "asc");
             refreshFile()
@@ -1036,6 +1049,18 @@ export default {
                 });
             }
         }
+        function folderBlur() {
+            console.log('searchFolderTree',searchFolderTree.value);
+            // if (searchFire.value == '') {
+            //     getAllTop()
+            // } else {
+            //     const searchTerm = searchFire.value.trim().toLowerCase(); // 转换为小写字母并去除首尾空格
+            //     fileMenu.value = fileMenu.value.filter(item => {
+            //         const dirName = item.dirName.trim();
+            //         return dirName.includes(searchTerm);
+            //     });
+            // }
+        }
         // 文件名表格每一行点击事件
         function handleRowClick(row, col, e) {
             console.log('row', row);
@@ -1060,6 +1085,18 @@ export default {
                 cliCC.value = true
             }
         }
+        // 树节点右键事件
+        function treeRClick(row, col, e) {
+            console.log('row', row);
+            // isFolder.value = "N"
+            clickRow.value = row
+            e.preventDefault();
+            e.stopPropagation();
+            xz.value = e.pageX
+            yz.value = e.pageY
+            showTreeMenu.value = true
+          
+        }
         // 申请扩容
         async function askApply() {
             const res = await fileSpace.querySpace(impSpaceId.value)
@@ -1479,9 +1516,11 @@ export default {
             }
         }
         function delName(row, num) {
+            row = row ? row : clickRow.value
             documents.delDocument(row.dirId).then(res => {
                 if (res.code === 200) {
                     getAllTop()
+                    getSpaceList()
                     ElMessage({
                         message: "删除成功",
                         type: "success"
@@ -1804,6 +1843,11 @@ export default {
             // console.log("close");
             folderVisible.value = false;
         };
+         // 关闭tree右键菜单
+        const closeTreeRMenu = () => {
+            // console.log("close");
+            showTreeMenu.value = false;
+        };
         // 文件夹收藏事件
         const collectFolder = () => {
             // console.log('clickRow',clickRow.value);
@@ -2282,6 +2326,7 @@ export default {
             changePageSizeFn()
             window.addEventListener("click", closeRMenu, true);
             window.addEventListener("click", mouseClick, true);
+            window.addEventListener("click", closeTreeRMenu, true);
             console.log('leftShowList',leftShowList.value);
             console.log('onMounted');
         })
@@ -2570,7 +2615,12 @@ export default {
             listfolderClick,
             clickPath,
             ListtreeData,
-            getFileTree
+            getFileTree,
+            folderBlur,
+            searchFolderTree,
+            treeRClick,
+            showTreeMenu,
+            closeTreeRMenu
         }
     },
     watch: {
@@ -2594,7 +2644,8 @@ export default {
         ScanFile,
         MoveTo,
         LeftList,
-        ListShow
+        ListShow,
+        TreeMenu
     },
 }
 
@@ -2857,7 +2908,7 @@ p {
     background-color: white;
     border: 1px solid gray;
     border-radius: 4px;
-    z-index: 3;
+    z-index: 3000;
     overflow-y: auto;
     // font-size: 16px;
 }
@@ -2869,7 +2920,7 @@ p {
     background-color: white;
     border: 1px solid gray;
     border-radius: 4px;
-    z-index: 100;
+    z-index: 1000;
     overflow-y: auto;
 }