浏览代码

右键菜单安全控制

liuQiang 2 年之前
父节点
当前提交
67f6cac16a

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

@@ -5,4 +5,10 @@ export function getLevel() {
     url: '/biz/level/list',
     method: 'get',
   })
+}
+export function getLeveldetail(data) {
+  return request({
+    url: `/biz/level/${data}`,
+    method: 'get',
+  })
 }

+ 24 - 0
src/utils/index.js

@@ -29,6 +29,30 @@ export const canPreviewFile = (fileType)=>{
 }
 
 /**
+ * 判断该文件是否可以预览
+ * @param {Object} role
+ * @param {Array} arr
+ */
+export const rightMenuRole = (role,arr)=>{
+  console.log('role',role);
+  console.log('arr',arr);
+  const roles = role.roles
+  if(!roles.l0100){
+    arr = arr.filter(item => item.name !== "预览")
+  }
+  if(!roles.l0200){
+    arr = arr.filter(item => item.name !== "下载")
+  }
+  if(!roles.l1000){
+    arr = arr.filter(item => item.name !== "删除")
+  }
+  if(!roles.l1200){
+    arr = arr.filter(item => item.name !== "移动到..." && item.name !== "复制到...")
+  }
+  return arr
+}
+
+/**
  * 根据传入的文件类型返回图标
  * @param {string} fileType
  */

+ 96 - 7
src/views/myfile/MyFile.vue

@@ -55,8 +55,8 @@
             <!-- 右侧大盒子 -->
             <div class="mesBox">
                 <!-- 功能盒子  -->
-                <div class="useBox">
                     <!-- table切换 -->
+                <!-- <div class="useBox">
                     <div style="width: 100%;height: 24px;background-color: #7084B4;line-height: 20px;">
                         <template v-for="(item, index) in menuList">
                             <span @click="tableChange(item, index)"
@@ -69,7 +69,7 @@
                         </template>
                     </div>
 
-                </div>
+                </div> -->
                 <!-- 展示文件夹盒子 -->
                 <!-- 文件夹 -->
                 <div v-if="editOnline">
@@ -187,10 +187,10 @@
                         <!-- 右键唤出的菜单 -->
                         <div class="right_menu" v-if="folderVisible"
                             :style="{ left: folderleft + 'px', top: foldertop + 'px' }">
-                            <div class="menu_item" @click="folderClick(null, null)">
+                            <!-- <div class="menu_item" @click="folderClick(null, null)">
                                 <img src="@/assets/images/trash.png" alt="" />
                                 <span>打开</span>
-                            </div>
+                            </div> -->
                             <div class="menu_item" @click="restName(null, null)">
                                 <img src="@/assets/images/textbox.png" alt="" />
                                 <span>重命名</span>
@@ -282,7 +282,7 @@
             <!-- 新增文件夹弹窗 -->
             <div>
                 <CreateFloder v-if="folderCase" :folderCase="folderCase" @getChildrenC="getChildrenC" :oneOrTwo="oneOrTwo"
-                    :impDirId="impDirId" :impSpaceId="impSpaceId" :newDirId="newDirId" :newSpaceId="newSpaceId"
+                    :impDirId="impDirId" :impSpaceId="impSpaceId" :newDirId="newDirId" :newSpaceId="newSpaceId" :thisFolderRole="thisFolderRole"
                     :getAllTop="getAllTop">
                 </CreateFloder>
             </div>
@@ -353,6 +353,8 @@
         :historyTotal="historyTotal">
     </historyList>
     <!-- 历史版本 -->
+    <!-- 二次密码验证 -->
+    <inputPassword v-if="showInputPassword" @surePass="surePass" @closeIptPass="closeIptPass" :showInputPassword="showInputPassword"></inputPassword>
 </template>
 
 <script>
@@ -385,11 +387,15 @@ import { ElMessage } from 'element-plus'
 import ImgPreview from '@/components/ImgPreview/ImgPreview.vue'
 import { preview } from "@/api/common/common.js";
 import historyList from "@/components/historyList/index.vue"; //选择文件发送的列表,历史版本
+import inputPassword from "./components/inputPassword.vue"; //选择文件发送的列表,历史版本
 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 { canPreviewFile,rightMenuRole } from "@/utils/index.js"
 import fileSpace from '../../api/filespace/fileSpace';
+import { getLeveldetail } from '../../api/level/level';
+import { encrypt, decrypt } from "@/utils/jsencrypt";
+import Cookies from "js-cookie";
 
 export default {
     setup() {
@@ -577,6 +583,10 @@ export default {
         const isFolder = ref('N') //是否为文件夹
         const clickRow = ref()//当前右键的行数据
         const backFolder = ref()//上一级的文件夹
+        const thisFolderRole = ref()//文件夹权限
+        const showInputPassword = ref(false)
+        const chooseRow = ref()
+        const chooseNum = ref()
         // 获取文件夹,中栏,文件
         function getAllTop() {
             documents.getTop(3).then(res => {
@@ -624,6 +634,10 @@ export default {
             })
         }
         function changeFile(row, num) {
+            console.log('row2',row);
+            if(row.isEncrypt === "Y"){
+                getLeveldetailFn(row.encryptLevel)
+            }
             copyParentId.value = row.parentId
             newDirId.value = row.dirId
             newSpaceId.value = row.spaceId
@@ -750,6 +764,20 @@ export default {
         }
         //mouse弹框
         async function chooseSet(row, index, num) {
+            // 权限控制
+            if(thisFolderRole.value.roles){
+                if(thisFolderRole.value.roles.l0600){
+                    const passArr = localStorage.getItem('passArr');
+                    const passArrObj = JSON.parse(passArr)
+                    if((!passArrObj) || !passArrObj.some(item=>item === clickRow.value.docId)){
+                        chooseRow.value = row
+                        chooseNum.value = num
+                        showInputPassword.value = true
+                        return
+                    }
+                    // console.log('needc');
+                }
+            }
             if (row.name == '在线编辑' || row.name == '协作') {
                 cliCC.value = true
             }
@@ -1030,6 +1058,9 @@ export default {
             }else{
                 row =thisFolder.value
             }
+            if(row.isEncrypt === "Y"){
+                getLeveldetailFn(row.encryptLevel)
+            }
             console.log('row1', toRaw(row));
             topPath.value = row.dirPath
             // console.log('topPath',toRaw(topPath.value));
@@ -1170,6 +1201,10 @@ export default {
             if (!imgTypeArr.includes(copyFileType.value)) {
                 arr = arr.filter(item => item.name !== "文字识别")
             }
+            // console.log('arr',arr);
+            if(thisFolderRole.value){
+                arr = rightMenuRole(toRaw(thisFolderRole.value),arr)
+            }
             return arr
         }
         function mouseClick() {
@@ -1361,6 +1396,52 @@ export default {
                 break;
             }
         }
+        //获取权限详情
+        const getLeveldetailFn =async (data)=>{
+            const res = await getLeveldetail(data)
+            // console.log('getLeveldetailFn',res);
+            if(res.code === 200){
+                thisFolderRole.value = res.data
+            }
+            // console.log('thisFolderRole',thisFolderRole.value);
+        } 
+        const closeIptPass = ()=>{
+            showInputPassword.value = false
+        }
+        //输入验证密码后
+        const surePass = (pass)=>{
+            const passwordCookies = Cookies.get("password");
+            const oldPass = decrypt(passwordCookies)
+            // console.log('pass',pass);
+            // console.log('oldPass',oldPass);
+            // console.log('clickRow',clickRow);
+            showInputPassword.value = false
+            if(pass === oldPass){
+                const passArr = localStorage.getItem('passArr');
+                // console.log('passArr',passArr);
+                if(!passArr){
+                    const newArr = []
+                    newArr.push(clickRow.value.docId)
+                    localStorage.setItem('passArr',JSON.stringify(newArr))
+                }else{
+                    const passArrObj = JSON.parse(passArr)
+                    passArrObj.push(clickRow.value.docId)
+                    localStorage.setItem('passArr',JSON.stringify(passArrObj))
+                }
+                // 设置销毁
+                 setTimeout(()=>{
+                    const passArr = localStorage.getItem('passArr');
+                    const passArrObj = JSON.parse(passArr)
+                    console.log('```passArrObj',passArrObj);
+                    const newArr = passArrObj.filter(item=>item != clickRow.value.docId)
+                    console.log('```newArr',newArr);
+                    localStorage.setItem('passArr',JSON.stringify(newArr))
+                },1000*30)
+                chooseSet(chooseRow.value,null,chooseNum.value) 
+            }else{
+                ElMessage({ message: "验证失败", type: "error" })
+            }
+        }
         onMounted(() => {
             getAllTop()
             getSpaceList()
@@ -1521,7 +1602,14 @@ export default {
             level1,
             level2,
             level3,
-            level4
+            level4,
+            getLeveldetailFn,
+            thisFolderRole,
+            showInputPassword,
+            closeIptPass,
+            surePass,
+            chooseRow,
+            chooseNum
         }
     },
     watch: {
@@ -1539,6 +1627,7 @@ export default {
         SpaceBig,
         PlaceGridFolder,
         PalaceGridFile,
+        inputPassword
     },
 }
 

+ 47 - 0
src/views/myfile/components/inputPassword.vue

@@ -0,0 +1,47 @@
+<template>
+  <div>
+    <div>
+      <el-dialog v-model="isOpen" title="请输入登录密码" width="30%">
+        <el-input v-model="password" type="password"></el-input>
+        <template #footer>
+          <span class="dialog-footer">
+            <el-button @click="close">取消</el-button>
+            <el-button type="primary" @click="sure">确认</el-button>
+          </span>
+        </template>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, onMounted, toRef, watch } from "vue";
+const props = defineProps({
+  showInputPassword: {
+    type: Boolean,
+    default: false,
+  },
+});
+const emit = defineEmits(["closeIptPass", "surePass"]);
+watch(
+  () => props.showInputPassword,
+  (newValue) => {
+    // console.log(111);
+    isOpen.value = newValue;
+  }
+);
+
+const password = ref();
+const isOpen = ref(props.showInputPassword);
+const close = () => {
+  password.value = "";
+  emit("closeIptPass");
+};
+const sure = () => {
+  emit("surePass", password.value);
+  password.value = "";
+};
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 23 - 9
src/views/myfile/modalComponebts/CreateFloder.vue

@@ -6,16 +6,16 @@
                     <el-form-item label="目录名称">
                         <el-input v-model="boserForm.dirName" />
                     </el-form-item>
-                    <el-form-item label="目录分类">
+                    <!-- <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-form-item> -->
+                    <el-form-item label="是否加密" v-if="!FolderRole">
                             <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-form-item label="加密等级" v-if="boserForm.isEncrypt === 'Y' && !FolderRole">
                         <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>
@@ -65,6 +65,11 @@ export default {
             type: Number,
             required: true
         },
+        thisFolderRole: {
+            type: Object,
+            required: true,
+            default: ()=>{},
+        },
         getAllTop: Function,
     },
     setup(props, { emit }) {
@@ -75,6 +80,8 @@ export default {
         let drId = props.impDirId
         let newspid = props.newSpaceId
         let newdrid = props.newDirId
+        const FolderRole = props.thisFolderRole
+        console.log("FolderRole",props);
         let addBoser = ref(false)
         let boserForm = ref({
             dirName: "",
@@ -119,14 +126,20 @@ export default {
                         props.getAllTop()
                     })
                 } else {
-                    documents.addDocument(
-                        {
+                    let query = {}
+                    if(FolderRole){
+                        query={
                             "dirName": boserForm.value.dirName,
                             "parentId": newdrid - 0,
                             "spaceId": newspid - 0,
-                            "isEncrypt":boserForm.value.isEncrypt,
-                            "encryptLevel":boserForm.value.isEncrypt == "Y"?boserForm.value.encryptLevel:null
+                            "isEncrypt":"Y",
+                            "encryptLevel":FolderRole.levelCode
                         }
+                        console.log('query',query);
+                        console.log('FolderRole',FolderRole);
+                    }
+                    documents.addDocument(
+                      query
                     ).then(res => {
                         if (res.code === 200) {
                             ElMessage({
@@ -165,7 +178,8 @@ export default {
             newdrid,
             newspid,
             levelList,
-            getLevelList
+            getLevelList,
+            FolderRole
         }
     }
 }

+ 22 - 11
src/views/search/index.vue

@@ -140,6 +140,17 @@ import { search } from "@/api/search/search.js";
 import { flieSearch } from "@/api/search/search.js";
 import { useRoute, useRouter } from "vue-router";
 import Pagination from "@/components/Pagination/index.vue";
+//---------------导入图片--------------------------
+import file_DOC from "@/assets/images/file_DOC.png";
+import file_pdf from "@/assets/images/file_pdf.png";
+import file_PPT from "@/assets/images/file_PPT.png";
+import file_TXT from "@/assets/images/file_TXT.png";
+import file_XLSX from "@/assets/images/file_XLSX.png";
+import file_pic from "@/assets/images/file_pic.png";
+import file_audio from "@/assets/images/file_audio.png";
+import file_video from "@/assets/images/file_video.png";
+import file_zip from "@/assets/images/file_zip.png";
+//----------------------------------------
 const searchFor = ref("1"); //搜索范围
 const searchType = ref("doc"); //搜索对象
 const checkState = ref(false); //勾选框状态
@@ -244,37 +255,37 @@ const pagination = async (obj) => {
 const setIcon = (fileType) => {
   switch (fileType) {
     case ".docx":
-      return "src/assets/images/fileType/file_DOC.png";
+      return file_DOC;
       break;
     case ".pdf":
-      return "src/assets/images/fileType/file_pdf.png";
+      return file_pdf;
       break;
     case ".ppt":
-      return "src/assets/images/fileType/file_PPT.png";
+      return file_PPT;
       break;
     case ".txt":
-      return "src/assets/images/fileType/file_TXT.png";
+      return file_TXT;
       break;
     case ".xlsx":
-      return "src/assets/images/fileType/file_XLSX.png";
+      return file_XLSX;
       break;
     case ".csv":
-      return "src/assets/images/fileType/file_XLSX.png";
+      return file_XLSX;
       break;
     case ".png":
-      return "src/assets/images/fileType/file_pic.png";
+      return file_pic;
       break;
     case ".mp3":
-      return "src/assets/images/fileType/file_audio.png";
+      return file_audio;
       break;
     case ".mp4":
-      return "src/assets/images/fileType/file_video.png";
+      return file_video;
       break;
     case ".zip":
-      return "src/assets/images/fileType/file_zip.png";
+      return file_zip;
       break;
     default:
-      return "src/assets/images/fileType/file_DOC.png";
+      return file_DOC;
       break;
   }
 };