Browse Source

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

wukai 2 years ago
parent
commit
808d5de23d

+ 19 - 0
src/api/fileActor/fileActor.js

@@ -0,0 +1,19 @@
+import request from '../../utils/request'
+// 获取已协作的人员
+function getActorPeople(data) {
+    return request({
+        url: `/biz/actor/${data}`,
+        method: 'get',
+    })
+}
+// 新增协作人员
+function addActorPeople(data) {
+    return request({
+        url: `/biz/actor/${data}`,
+        method: "post"
+    })
+}
+export default {
+    getActorPeople,
+    addActorPeople,
+}

+ 9 - 1
src/api/filespace/fileSpace.js

@@ -14,6 +14,13 @@ function knowSpace(data){
         method:"post"
     })
 }
+// 查询是否存在扩容申请
+function querySpace(data){
+    return request({
+        url:`/biz/expansion/exists/${data}`,
+        method:"post"
+    })
+}
 // 拒绝扩容
 function refuseSpace(data){
     return request({
@@ -33,5 +40,6 @@ export default {
     getSpaceList,
     knowSpace,
     refuseSpace,
-    addSpace
+    addSpace,
+    querySpace
 }

+ 8 - 0
src/api/level/level.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request'
+
+export function getLevel() {
+  return request({
+    url: '/biz/level/list',
+    method: 'get',
+  })
+}

BIN
src/assets/images/level1.png


BIN
src/assets/images/level2.png


BIN
src/assets/images/level3.png


BIN
src/assets/images/level4.png


+ 5 - 2
src/components/historyList/index.vue

@@ -13,7 +13,7 @@
           v-if="treeData.length>0"
         >
           <div
-            v-for="(item, index) in treeData.value"
+            v-for="(item, index) in treeData"
             :key="index"
             class="list-item list-item-dot"
             :class="{
@@ -105,11 +105,14 @@ watch(
   (newValue) => {
     isOpen.value = newValue;
   }
-);const treeData = reactive([]);
+);
+// const treeData = reactive([]);
+const treeData = ref([]);
 watchEffect(() => {
   if(props.fileUserTreeData.length>0){
     treeData.value = props.fileUserTreeData.reverse();
   toRaw(treeData.value);
+  console.log('treeData',treeData.value);
   }
 
 });

+ 156 - 6
src/layout/indexCommon.vue

@@ -81,7 +81,8 @@
                   v-if="
                     websoctStore.messOne?.fromId &&
                     item.path == '/index' &&
-                    $route.path != item.path&&clickId!==index
+                    $route.path != item.path &&
+                    clickId !== index
                   "
                 ></span>
               </div> </router-link
@@ -89,7 +90,40 @@
           </div>
         </el-aside>
         <el-main class="main">
-          <router-view v-if="isAlive"></router-view>
+          <div class="tab_box">
+            <el-tabs
+              v-model="editableTabsValue"
+              @tab-change="clickTab"
+              addable
+              @tab-add="addTab"
+              type="card"
+              class="demo-tabs"
+            >
+              <el-tab-pane
+                v-for="(item,index) in toRaw(editableTabs)"
+                :key="item.path"
+                :label="item.label"
+                :name="item.path"
+              >
+                <template #label>
+                  <div class="tab_pane">
+                    <div class="tab_text">{{ item.label }}</div>
+                    <img
+                      src="@/assets/images/close.png"
+                      @click="closeTab(item,index,$event)"
+                      alt=""
+                    />
+                  </div>
+                </template>
+              </el-tab-pane>
+            </el-tabs>
+          </div>
+          <router-view v-slot="{ Component }" v-if="isAlive">
+            <!-- TODO文件缓存 点进文件掉createtabs生成tab -->
+            <KeepAlive>
+              <component :is="Component" />
+            </KeepAlive>
+          </router-view>
         </el-main>
       </el-container>
     </el-container>
@@ -127,6 +161,7 @@ import { AppMain, Navbar, Settings, TagsView } from "./components";
 import { flieSearch } from "@/api/search/search.js";
 import { useRouter, useRoute } from "vue-router";
 import useWebsoctStore from "@/store/modules/websocket";
+import { toRaw } from "@vue/reactivity";
 const websoctStore = useWebsoctStore();
 const router = useRouter(); //注册路由
 const route = useRoute();
@@ -135,8 +170,31 @@ const userStore = useUserStore();
 const settingsStore = useSettingsStore();
 const searchText = ref(""); //搜索ipt的值
 const selectValue = ref(1); //文档空间类型
-const wangzhi=import.meta.env.VITE_APP_BASE_API
+const wangzhi = import.meta.env.VITE_APP_BASE_API;
 const isAlive = ref(true);
+//--------tabs-----------------
+let tabIndex = 2;
+const editableTabsValue = ref("/index");
+const editableTabs = ref([{ label: "会话消息", path: "/index" }]);
+
+// const removeTab = (targetName) => {
+//   const tabs = editableTabs.value;
+//   let activeName = editableTabsValue.value;
+//   if (activeName === targetName) {
+//     tabs.forEach((tab, index) => {
+//       if (tab.name === targetName) {
+//         const nextTab = tabs[index + 1] || tabs[index - 1];
+//         if (nextTab) {
+//           activeName = nextTab.name;
+//         }
+//       }
+//     });
+//   }
+
+//   editableTabsValue.value = activeName;
+//   editableTabs.value = tabs.filter((tab) => tab.name !== targetName);
+// };
+//-------------------------
 
 function reload() {
   isAlive.value = false;
@@ -191,8 +249,8 @@ const toSearch = async () => {
     keyword: searchText.value,
     isAsc: "asc",
     orderByColumn: "createTime",
-    pageSize:3,
-    pageNum:1
+    pageSize: 3,
+    pageNum: 1,
   };
   const res = await flieSearch(query);
   // console.log("res", res);
@@ -295,7 +353,59 @@ const menuList = reactive({
   ],
 });
 const clickPath = (index, items) => {
-  clickId.value = index;
+  items = toRaw(items);
+  // console.log("items", items);
+  // editableTabs.value = arr;
+  const arr = toRaw(editableTabs.value);
+  if (!arr.some((item) => item.label == items.label)) {
+    editableTabs.value.push({ label: items.label, path: items.path });
+    //需要jSON去转 否则页面无变化 离谱得很
+    editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
+  } else {
+    clickTab(items.path);
+  }
+  editableTabsValue.value = items.path;
+  // console.log("editableTabs", editableTabs.value);
+};
+const clickTab = (item) => {
+  console.log("item", toRaw(item));
+  let regExp = new RegExp(/^\//);
+  if (!regExp.test(toRaw(item))) {
+    const data = JSON.parse(toRaw(item));
+    console.log("data", data);
+    router.push({
+      path: "/fileEdit",
+      query: {
+        clickRowId: data.docId,
+        copyRow: JSON.stringify(data),
+      },
+    });
+  } else {
+    router.push({
+      path: item,
+    });
+  }
+};
+//创建tab标签事件
+const addTab = (data) => {
+  const arr = toRaw(editableTabs.value);
+  if (!arr.some((item) => item.label == data.fileName)) {
+    editableTabs.value.push({
+      label: data.fileName,
+      path: JSON.stringify(data),
+    });
+    //需要jSON去转 否则页面无变化 离谱得很
+    editableTabs.value = JSON.parse(JSON.stringify(editableTabs.value));
+  }
+};
+provide("addTab", addTab);
+// TODO 删除tab事件
+const closeTab = (item,index, e) => {
+  e.preventDefault();
+  e.stopPropagation();
+  console.log("item", item);
+  console.log("index", index);
+  console.log("e", e);
 };
 </script>
 
@@ -370,6 +480,46 @@ const clickPath = (index, items) => {
 .main {
   background: #c7cbd8;
 }
+// tabs标签
+.tab_box {
+  width: 100%;
+  height: 32px;
+  border-radius: 4px 4px 4px 4px;
+  background-color: #fff;
+  margin-bottom: 8px;
+  .demo-tabs {
+    height: 32px;
+    // display: flex;
+    // align-items: center;
+  }
+  .tab_pane {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    img {
+      margin-left: 8px;
+      width: 10px;
+      height: 10px;
+    }
+  }
+}
+:deep(.demo-tabs .el-tabs__item) {
+  height: 24px !important;
+  padding: 0px 8px !important;
+  margin-top: 4px !important;
+  margin-left: 4px !important;
+  border: 1px solid #c1cce3 !important;
+  color: #505870 !important;
+  font-size: 12px !important;
+  line-height: 24px;
+  font-weight: 400 !important;
+}
+// tag选中颜色
+:deep(.demo-tabs .el-tabs__item.is-active) {
+  color: #fff !important;
+  font-weight: normal;
+  background-color: #6f85b5;
+}
 //侧边栏css
 .acitve-img-style {
   background-color: #f5f7f9;

+ 8 - 0
src/router/index.js

@@ -172,6 +172,14 @@ export const constantRoutes = [{
 					icon: "department"
 				}
 			},{
+				path: "/fileEdit",
+				component: () => import("@/views/myfile/components/FileEdit.vue"),
+				name: "fileEdit",
+				meta: {
+					title: "文件预览",
+					icon: "department"
+				}
+			},{
 				path: "/allback",
 				component: () => import("@/views/highSearch/SupplierAllBack.vue"),
 				name: "allback",

+ 1 - 1
src/utils/index.js

@@ -21,7 +21,7 @@ export function formatDate(cellValue) {
  * @param {string} fileType
  */
 export const canPreviewFile = (fileType)=>{
-    const array = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.pdf', '.rtf', '.txt', '.djvu', '.xps','csv', 'fods', 'ods', 'ots', 'xls', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx','fodp', 'odp', 'otp', 'pot', 'potm', 'potx', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx']
+    const array = ['.doc', ".wps",'.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.pdf', '.rtf', '.txt', '.djvu', '.xps','.csv', '.fods', '.ods', '.ots', '.xls', '.xlsm', '.xlsx', '.xlt', '.xltm', '.xltx','.fodp', '.odp', '.otp', '.pot', '.potm', '.potx', '.pps', '.ppsm', '.ppsx', '.ppt', '.pptm', '.pptx']
     if(array.includes(fileType)){
       return true
     }

+ 3 - 1
src/views/highSearch/HighSearch.vue

@@ -92,7 +92,7 @@
 </template>
 
 <script setup>
-import { onMounted, ref } from "vue";
+import { onMounted, ref, inject } from "vue";
 import { search } from "@/api/search/search.js";
 import FileEdit from "@/views/myfile/components/FileEdit.vue";
 // import IdentifyFont from "@/components/IdentifyFont/IdentifyFont.vue";
@@ -183,8 +183,10 @@ const setScroll = async () => {
     beEnd.value = true;
   }
 };
+const addTab = inject("addTab");
 // 预览事件
 const toPreview = (item) => {
+  addTab(item.content.docInfo);
   console.log("item", item);
   clickRowId.value = item.content.docInfo.docId;
   copyRow.value = item.content.docInfo;

+ 93 - 16
src/views/myfile/MyFile.vue

@@ -20,7 +20,7 @@
                 </div>
                 <!-- 方块点击盒子 -->
                 <div
-                    style="display: flex;justify-content: flex-start;align-items: flex-start;flex-wrap: wrap;height: 80vh;align-content: flex-start;overflow-y: auto;">
+                    style="display: flex;justify-content: flex-start;align-items: flex-start;flex-wrap: wrap;height: 75vh;align-content: flex-start;overflow-y: auto;">
                     <!-- v-for盒子 -->
                     <template v-for="(item, index) in fileMenu">
                         <div class="setBox" @click="changeFile(item, index)">
@@ -35,18 +35,21 @@
                                     </el-dropdown-menu>
                                 </template>
                             </el-dropdown>
-                            <img src="../../assets/images/fileStyle.png" style="width: 72px;height: 72px;">
-                            <p class="ellipsis-text">{{ item.dirName }}</p>
+                          <div class="left_fileBox">
+                              <img src="../../assets/images/fileStyle.png" style="width: 72px;height: 72px;">
+                              <p class="ellipsis-text">{{ item.dirName }}</p>
+                              <img class="levelImg" v-if="item.isEncrypt === 'Y'" :src="getLevelImg(item.encryptLevel)" alt="">
+                          </div>
                         </div>
                     </template>
                 </div>
-                <div>
-                    <p>
-                        <span style="margin-left: 5px;">{{ formatStorage(useSpace) }}/{{ allSpace + "G" }}</span>
-                        <span style="margin-left: 5px;font-size: 12px;color: blue;cursor: pointer;"
+                <div class="expansion">
+                    <div class="top_box">
+                        <span style="margin-left: 5px;font-size: 14px;font-weight: 500;">{{ formatStorage(useSpace) }}/{{ allSpace + "G" }}</span>
+                        <span style="margin-left: 5px;font-size: 14px;color: #2E6BC8;cursor: pointer;"
                             @click="askApply">申请扩容</span>
-                    </p>
-                    <el-progress style="margin-left: 8px;" :percentage="percent()" />
+                    </div>
+                    <el-progress style="margin-left: 8px;" stroke-width="12" color='#2E6BC8' :percentage="percent()" />
                 </div>
             </div>
             <!-- 右侧大盒子 -->
@@ -143,7 +146,7 @@
                                 <el-table-column label="名称" width="180">
                                     <template #default="scope">
                                         <span>
-                                            <el-icon v-if="scope.row.isFavorite == 'N'">
+                                            <el-icon v-if="scope.row.isFavorite == 'N'" @click.stop="collectByStar(scope.row,true)">
                                                 <Star />
                                             </el-icon>
                                             <img v-else @click.stop="delCollect(scope.row,true)" src="../../assets/images/yellowstar.png" alt="">
@@ -154,6 +157,7 @@
                                                     effect="dark"
                                                     :content="scope.row.dirName"
                                                     placement="top"
+                                                    show-after="1000"
                                                 >
                                                    {{ scope.row.dirName }}
                                                 </el-tooltip>
@@ -208,7 +212,7 @@
                                     <el-table-column label="名称" width="200">
                                         <template #default="scope">
                                             <span style="white-space: nowrap;overflow: hidden;text-overflow: ellipsis;">
-                                            <el-icon v-if="scope.row.isFavorite == 'N'">
+                                            <el-icon v-if="scope.row.isFavorite == 'N'" @click.stop="collectByStar(scope.row,false)">
                                                 <Star />
                                             </el-icon>
                                             <img v-else @click.stop="delCollect(scope.row,false)" src="../../assets/images/yellowstar.png" alt="">
@@ -218,6 +222,7 @@
                                                     effect="dark"
                                                     :content="scope.row.fileName"
                                                     placement="top"
+                                                    show-after="1000"
                                                 >
                                                    {{ scope.row.fileName }}
                                                 </el-tooltip>
@@ -380,6 +385,7 @@ import { listVersion } from "@/api/biz/version";
 import useUserStore from "@/store/modules/user";
 import { useRouter, useRoute } from "vue-router";
 import { canPreviewFile } from "@/utils/index.js"
+import fileSpace from '../../api/filespace/fileSpace';
 
 export default {
     setup() {
@@ -706,6 +712,7 @@ export default {
         }
         // 文件名表格每一行点击事件
         function handleRowClick(row, col, e) {
+            console.log('row',row);
             isFolder.value = "N"
             clickRow.value = row
             e.preventDefault();
@@ -728,7 +735,13 @@ export default {
             }
         }
         // 申请扩容
-        function askApply() {
+       async function askApply() {
+            const res =  await fileSpace.querySpace(impSpaceId.value)
+            console.log('res',res);
+            if(res.data){
+                ElMessage({ message: '已存在扩容申请', type: 'error' })
+                return
+            }
             spaces.value = true
         }
         //mouse弹框
@@ -743,6 +756,7 @@ export default {
                 thanks.value = false
             }
             if (row.name == '协作') {
+                workOrEdit.value = num
                 if (anyP.value) {
                     anyP.value = false
                 } else {
@@ -824,6 +838,7 @@ export default {
                 previewData.value = URL.createObjectURL(res)
             } else if (row.name === "历史版本") {
                 const resHistory = await listVersion({ docId: clickRowId.value })
+                console.log('resHistory',resHistory);
                 historyTotal.value = resHistory.total
                 fileUserTreeData.data = resHistory.rows;
                 openForwardFile.value = true
@@ -1135,10 +1150,10 @@ export default {
         }
         //对mouseCli数组进行筛选,实现菜单的区分显示
         const filterMouseCli = () => {
-            const canPreviewArray = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.pdf', '.rtf', '.txt', '.djvu', '.xps', '.csv', '.fods', '.ods', '.ots', '.xls', '.xlsm', '.xlsx', '.xlt', '.xltm', '.xltx', '.fodp', '.odp', '.otp', '.pot', '.potm', '.potx', '.pps', '.ppsm', '.ppsx', '.ppt', '.pptm', '.pptx']
+            const canPreviewArray = ['.doc','.wps', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.pdf', '.rtf', '.txt', '.djvu', '.xps', '.csv', '.fods', '.ods', '.ots', '.xls', '.xlsm', '.xlsx', '.xlt', '.xltm', '.xltx', '.fodp', '.odp', '.otp', '.pot', '.potm', '.potx', '.pps', '.ppsm', '.ppsx', '.ppt', '.pptm', '.pptx']
             const typeArr = ['.png', '.jpg', '.jpeg', '.JPG', '.mp3', '.mp4']
             const imgTypeArr = ['.png', '.jpg', '.jpeg', '.JPG']
-            const canEditArr = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.txt', '.djvu', '.xps', '.csv', '.fods', '.ods', '.ots', '.xls', '.xlsm', '.xlsx', '.xlt', '.xltm', '.xltx', '.fodp', '.odp', '.otp']
+            const canEditArr = ['.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.txt', '.djvu', '.xps', '.csv', '.fods', '.ods', '.ots', '.xls', '.xlsm', '.xlsx', '.xlt', '.xltm', '.xltx', '.fodp', '.odp', '.otp','.doc', '.docm', '.docx', '.dot', '.dotm', '.dotx', '.epub', '.fodt', '.htm', '.html', '.mht', '.odt', '.ott', '.rtf', '.txt', '.djvu', '.xps', '.wps','.pptx']
             let arr = []
             if (!(typeArr.includes(copyFileType.value) || canPreviewArray.includes(copyFileType.value))) {
                 arr = mouseCli.value.filter(item => item.name !== "预览")
@@ -1275,13 +1290,33 @@ export default {
         const refreshFile = ()=>{
             // console.log('ref',toRaw(thisFolder.value));
             if(toRaw(thisFolder.value).isFavorite){//如果点开了文件夹
-            console.log(111);
+            // console.log(111);
                folderClick()
             }else{
-            console.log(222);
+            // console.log(222);
                 getAllTop()
             }
         }
+        //star收藏事件
+        const collectByStar = (row,isfolder)=>{
+            console.log('row',row);
+            if(isfolder){
+                let thisRow = toRaw(row)
+                isFolder.value = 'Y'
+                clickRow.value = thisRow
+                copyFolderName.value = row.dirName
+                copyFileName.value = clickRow.value.dirName
+            }else{
+                isFolder.value = "N"
+                clickRow.value = row
+                copyRow.value = row
+                clickRowId.value = row.docId
+                copyDirId.value = row.dirId
+                copyFileName.value = row.fileName
+            }
+            
+            collects.value = true
+        }
         // 取消文件收藏
         const delCollect = async (row,isfolder)=>{
             const thisRow = toRaw(row)
@@ -1303,6 +1338,25 @@ export default {
             console.log('res',res);
             refreshFile()
         }
+        //获取安全图标
+        const getLevelImg = (level)=>{
+             switch (level) {
+                case "L1":
+                return "src/assets/images/level1.png";
+                break;
+                case "L2":
+                return "src/assets/images/level2.png";
+                break;
+                case "L3":
+                return "src/assets/images/level3.png";
+                break;
+                case "L4":
+                return "src/assets/images/level4.png";
+                break;
+                return "src/assets/images/level1.png";
+                break;
+            }
+        }
         onMounted(() => {
             getAllTop()
             getSpaceList()
@@ -1458,6 +1512,8 @@ export default {
             refreshFile,
             delCollect,
             backFolder,
+            collectByStar,
+            getLevelImg
         }
     },
     watch: {
@@ -1525,6 +1581,16 @@ p {
     margin-left: 5px;
     margin-top: 5px;
     position: relative;
+    .left_fileBox{
+        position: relative;
+        .levelImg{
+            width: 32px;
+            height: 32px;
+            position: absolute;
+            right: 5%;
+            bottom: 20%;
+        }
+    }
 }
 
 .setBox:hover {
@@ -1738,6 +1804,17 @@ p {
         }
     }
 }
+// 扩容盒子
+.expansion{
+    margin:  0 16px;
+    border-top: 1px solid #C1CCE3 ;
+    .top_box{
+        margin-top: 16px;
+        width: 100%;
+        display: flex;
+        justify-content: space-between;
+    }
+}
 
 .isCheck {
     opacity: 1 !important;

+ 123 - 105
src/views/myfile/components/FileEdit.vue

@@ -1,120 +1,138 @@
 <template>
-    <div>
-        <div class='qualityManual-container-office'>
-            <jjtOnlyOffice :option='option' />
-        </div>
+  <div>
+    <div class="qualityManual-container-office">
+      <jjtOnlyOffice :option="option" />
     </div>
+  </div>
 </template>
 
 <script>
-import { ref, onMounted,defineEmits  } from 'vue'
-import jjtOnlyOffice from '@/components/OnlyOffice/index.vue'
-import useUserStore from '@/store/modules/user'
+import { ref, onMounted, defineEmits } from "vue";
+import { useRouter, useRoute } from "vue-router";
+import jjtOnlyOffice from "@/components/OnlyOffice/index.vue";
+import useUserStore from "@/store/modules/user";
 // import ClassicEditor from '@ckeditor/ckeditor5-build-classic';
 import {
-    listInfo,
-    getInfo,
-    delInfo,
-    addInfo,
-    updateInfo
+  listInfo,
+  getInfo,
+  delInfo,
+  addInfo,
+  updateInfo,
 } from "@/api/biz/info";
 export default {
-    props: {
-        docId: {
-            type: Number, // 这里的类型应该匹配你要传递的数据类型
-            required: true, // 如果这个属性是必须的,请添加此项
-        },
-        copyRow: {//点击外层列表的哪项数据
-            type: Object,
-            required: true
-        },
-        historyPrew:{
-            Boolean,
-            default:false
-        },
-        historycopyRow:{//点击历史预览的哪项数据
-            type: Object,
-            default:()=>{}
-        },
-        onlyView:{
-            Boolean,
-            default:false
-        },
+  props: {
+    docId: {
+      type: Number, // 这里的类型应该匹配你要传递的数据类型
+    //   required: true, // 如果这个属性是必须的,请添加此项
     },
-    setup(props) {
-        let docId = props.docId;
-        let copyRow = props.copyRow
-        let option = ref({
-            key: '',
-            url: '', //在线文档地址
-            isEdit: props.onlyView, //是否允许编辑
-            fileType: '', //文件扩展名
-            title: '', //文件标题
-            user: {
-                id: null, //用户ID
-                name: '' //用户姓名
-            },
-            userdata: "",
-            editUrl: '' //回调地址
-        })
-        let show = ref(true)
-        let newObj = ref({})
-        function oo(docId, isEdit) {
-            if(docId&&!props.historyPrew){ 
-                getInfo(docId).then(response => {
-                const obj = response.data;
-                obj.isEdit =isEdit;
-                newObj.value = obj
-                option.value.isEdit = obj.isEdit
-                option.value.url=`${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/api/access/${obj.fileId}`;
-                option.value.title = obj.fileName;
-                option.value.key = obj.fileId;
-                option.value.fileType = obj.fileType.replace(".", "");
-                option.value.editUrl = `${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/only-office/callback/${obj.docId}?name=${useUserStore().uname}`;
-                option.value.user = {
-                    id: useUserStore().uid, //用户ID
-                    name: useUserStore().uname //用户姓名
-                };
-            });
-            }else if(docId&&props.historyPrew){
-                option.value.isEdit=false
-                option.value.url =`${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/api/access/${props.historycopyRow.fileId}`
-                option.value.title =  props.copyRow.fileName
-                option.value.key =props.historycopyRow.fileId;
-                option.value.fileType = props.copyRow.fileType.replace(".", "");
-                option.value.editUrl = `${window.location.origin}${import.meta.env.VITE_APP_BASE_API}/only-office/callback/${props.docId}?name=${useUserStore().uname}`;
-                option.value.user = {
-                    id: useUserStore().uid, //用户ID
-                    name: useUserStore().uname //用户姓名
-                };
-                // const emit = defineEmits(["cancleHistoryPrew"]);
-                // emit("cancleHistoryPrew",false);
-                // console.log(option.value,'option3===');
-            }
-            
-        }
-        /** 修改按钮操作 */
-        function edit() { 
-            oo(docId, true);
-        }
-        onMounted(() => {
-            console.log(docId, 'doc');
-            console.log(copyRow, 'row');
-            edit()
-            // let row = JSON.parse(newObj.value)
-            // console.log(row, '852');
-        })
-        return {
-            option,
-            show,
-            newObj,
-        }
-
+    copyRow: {
+      //点击外层列表的哪项数据
+      type: Object,
+    //   required: true,
+    },
+    historyPrew: {
+      Boolean,
+      default: false,
+    },
+    historycopyRow: {
+      //点击历史预览的哪项数据
+      type: Object,
+      default: () => {},
     },
-    components: {
-        jjtOnlyOffice,
+    onlyView: {
+      Boolean,
+      default: false,
     },
-}
+  },
+  setup(props) {
+    let docId = props.docId || '';
+    let copyRow = props.copyRow || '';
+    const router = useRouter(); //注册路由
+    const route = useRoute();
+    let option = ref({
+      key: "",
+      url: "", //在线文档地址
+      isEdit: props.onlyView, //是否允许编辑
+      fileType: "", //文件扩展名
+      title: "", //文件标题
+      user: {
+        id: null, //用户ID
+        name: "", //用户姓名
+      },
+      userdata: "",
+      editUrl: "", //回调地址
+    });
+    let show = ref(true);
+    let newObj = ref({});
+    function oo(docId, isEdit) {
+      if (docId && !props.historyPrew) {
+        getInfo(docId).then((response) => {
+          const obj = response.data;
+          obj.isEdit = isEdit;
+          newObj.value = obj;
+          option.value.isEdit = obj.isEdit;
+          option.value.url = `${window.location.origin}${
+            import.meta.env.VITE_APP_BASE_API
+          }/api/access/${obj.fileId}`;
+          option.value.title = obj.fileName;
+          option.value.key = obj.fileId;
+          option.value.fileType = obj.fileType.replace(".", "");
+          option.value.editUrl = `${window.location.origin}${
+            import.meta.env.VITE_APP_BASE_API
+          }/only-office/callback/${obj.docId}?name=${useUserStore().uname}`;
+          option.value.user = {
+            id: useUserStore().uid, //用户ID
+            name: useUserStore().uname, //用户姓名
+          };
+        });
+      } else if (docId && props.historyPrew) {
+        option.value.isEdit = false;
+        option.value.url = `${window.location.origin}${
+          import.meta.env.VITE_APP_BASE_API
+        }/api/access/${props.historycopyRow.fileId}`;
+        option.value.title = props.copyRow.fileName;
+        option.value.key = props.historycopyRow.fileId;
+        option.value.fileType = props.copyRow.fileType.replace(".", "");
+        option.value.editUrl = `${window.location.origin}${
+          import.meta.env.VITE_APP_BASE_API
+        }/only-office/callback/${props.docId}?name=${useUserStore().uname}`;
+        option.value.user = {
+          id: useUserStore().uid, //用户ID
+          name: useUserStore().uname, //用户姓名
+        };
+        // const emit = defineEmits(["cancleHistoryPrew"]);
+        // emit("cancleHistoryPrew",false);
+        // console.log(option.value,'option3===');
+      }
+    }
+    /** 修改按钮操作 */
+    function edit() {
+      oo(docId, true);
+    }
+    onMounted(() => {
+      let route = useRoute(); 
+      console.log('route',route.query);
+      if(route.query.clickRowId){
+          docId = route.query.clickRowId
+          copyRow = JSON.parse(route.query.copyRow)
+      }
+      console.log(docId, "doc");
+      console.log(copyRow, "row");
+      edit();
+      // let row = JSON.parse(newObj.value)
+      // console.log(row, '852');
+    });
+    return {
+      option,
+      show,
+      newObj,
+      route
+    };
+  },
+  components: {
+    jjtOnlyOffice,
+  },
+};
 </script>
 
 <style scoped></style>

+ 33 - 0
src/views/myfile/modalComponebts/CreateFloder.vue

@@ -6,6 +6,20 @@
                     <el-form-item label="目录名称">
                         <el-input v-model="boserForm.dirName" />
                     </el-form-item>
+                    <el-form-item label="目录分类">
+                        <el-radio-group v-model="boserForm.dirType">
+                            <el-radio :label="1">公开目录</el-radio>
+                            <el-radio :label="2">组织目录</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item label="是否加密">
+                            <el-switch v-model="boserForm.isEncrypt" active-value="Y" inactive-value="N" />
+                    </el-form-item>
+                    <el-form-item label="加密等级" v-if="boserForm.isEncrypt === 'Y'">
+                        <el-radio-group v-model="boserForm.encryptLevel">
+                            <el-radio :label="item.levelCode" v-for="item in levelList" :key="item">{{item.levelName}}</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
                 </el-form>
                 <template #footer>
                     <span class="dialog-footer">
@@ -23,6 +37,7 @@
 <script>
 import { ref, onMounted, toRef } from 'vue';
 import documents from '../../../api/document/document';
+import { getLevel } from '@/api/level/level.js';
 import { ElMessage } from 'element-plus';
 export default {
     props: {
@@ -63,7 +78,11 @@ export default {
         let addBoser = ref(false)
         let boserForm = ref({
             dirName: "",
+            dirType:1,
+            isEncrypt:"Y",
+            encryptLevel:"L1"
         })
+        const levelList = ref([])
         function inital() {
             console.log(free, 'free');
             addBoser.value = result
@@ -85,6 +104,8 @@ export default {
                             "dirName": boserForm.value.dirName,
                             "parentId": drId - 0,
                             "spaceId": spId - 0,
+                            "isEncrypt":boserForm.value.isEncrypt,
+                            "encryptLevel":boserForm.value.isEncrypt == "Y"?boserForm.value.encryptLevel:null
                         }
                     ).then(res => {
                         if (res.code === 200) {
@@ -103,6 +124,8 @@ export default {
                             "dirName": boserForm.value.dirName,
                             "parentId": newdrid - 0,
                             "spaceId": newspid - 0,
+                            "isEncrypt":boserForm.value.isEncrypt,
+                            "encryptLevel":boserForm.value.isEncrypt == "Y"?boserForm.value.encryptLevel:null
                         }
                     ).then(res => {
                         if (res.code === 200) {
@@ -119,8 +142,16 @@ export default {
             }
 
         }
+        const getLevelList = async ()=>{
+            const res = await getLevel()
+            if(res.rows){
+                levelList.value = res.rows
+            }
+            // console.log(res);
+        }
         onMounted(() => {
             inital()
+            getLevelList()
         })
         return {
             addBoser,
@@ -133,6 +164,8 @@ export default {
             drId,
             newdrid,
             newspid,
+            levelList,
+            getLevelList
         }
     }
 }

+ 2 - 2
src/views/myfile/modalComponebts/SpaceBig.vue

@@ -55,8 +55,8 @@ export default {
             askTo.value = false
             emit("getSpaceC", askTo.value)
         }
-        function addSpace() {
-            fileSpace.addSpace({
+        function  addSpace() {
+         fileSpace.addSpace({
                 spaceId: spid - 0,
                 expandCap: spaceForm.value.newCup - 0,
                 expandReason: spaceForm.value.newTalk

+ 30 - 5
src/views/myfile/modalComponebts/Transfer.vue

@@ -14,15 +14,18 @@
                         </div>
                     </div>
                     <div class="needBag">
-                        <div style="border-bottom: 1px solid gray;">
+                        <div style="border-bottom: 1px solid gray;" class="needBag_top">
                             <span>已选择{{ chooseTagData.length }}人</span>
                             <span style="color: red;font-size: 14px;float: right;">清空</span>
                         </div>
                         <div class="needLog">
-                            <el-tag v-for="(item, index) in chooseTagData" :key="index" class="tagtag"
-                                :closable="lastPeople" @close="handleClose(item)">
-                                {{ item.userName ? item.userName : item.name }}
-                            </el-tag>
+                              <el-scrollbar height="349px">
+                                    <el-tag v-for="(item, index) in chooseTagData" :key="index" class="tagtag"
+                                    :closable="lastPeople" @close="handleClose(item)">
+                                    {{ item.userName ? item.userName : item.name }}
+                                    </el-tag>
+                              </el-scrollbar>
+
                         </div>
                     </div>
                 </div>
@@ -163,6 +166,7 @@ export default {
         }
         // 获取用户树
         function getAllUser() {
+            console.log('feeh',feeh);
             userTree.getUserTree({}).then(res => {
                 console.log('userTree',res);
                 allTreeData.value = [res]
@@ -191,6 +195,17 @@ export default {
                         return item.userId
                     })
                 })
+            }
+            if(feeh === 0){
+                 fileCount.getActor(dees).then(res => {
+                    // 去除数组内部的重复元素
+                    // const uniqueRes = Array.from(new Set(res.map(item => item.userName))).map(id => res.find(item => item.userName === id));
+                    // 现在的 uniqueRes 数组不包含重复元素
+                    chooseTagData.value = res;
+                    backScreen.value = chooseTagData.value.map(item => {
+                        return item.userId
+                    })
+                })
             } else if (!isNewMenus) {
                 fileCount.getActor(dees).then(res => {
                     chooseTagData.value = res
@@ -277,6 +292,16 @@ export default {
     /* border: 1px solid red; */
     overflow-y: auto;
 }
+.needBag_top{
+    padding: 0 10px;
+    height: 30px;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+}
+.needLog{
+    height: 100%;
+}
 
 :deep(.el-tag__content) {
     display: block;

+ 1 - 1
src/views/myjoin/MyJoin.vue

@@ -36,7 +36,7 @@
                         </div>
                     </el-tab-pane>
                     <el-tab-pane label="我参与的" name="second">
-                        <el-table :data="myPack" style="width: 100%">
+                        <el-table :data="myPack" style="width: 100%" @row-click="rowClickFN">
                             <el-table-column type="selection" width="55" />
                             <el-table-column label="名称" width="200">
                                 <template #default="scope">

+ 1 - 1
src/views/search/index.vue

@@ -292,7 +292,7 @@ const setType = (fileType) => {
       return [".mp3"];
       break;
     case "video":
-      return [".mp4"];
+      return [".mp4",'.qlv'];
       break;
     case "zip":
       return [".zip", "rar", ".7z"];