Explorar el Código

完善文件夹和文件操作权限

Lijiahao hace 3 días
padre
commit
cd7b278150

+ 13 - 6
xzl-admin/src/main/java/com/xzl/web/controller/KnowledgeFileController.java

@@ -2,7 +2,6 @@ package com.xzl.web.controller;
 
 
 import java.util.List;
-import java.util.Objects;
 import javax.servlet.http.HttpServletResponse;
 import com.xzl.common.core.domain.entity.KnowledgeFile;
 import com.xzl.common.core.domain.model.LoginUser;
@@ -76,7 +75,7 @@ public class KnowledgeFileController extends BaseController {
                           @RequestParam("folderId") Long folderId) {
         LoginUser loginUser = getLoginUser();
         try {
-            int result = knowledgeFileService.insertSysFileWithUpload(file,folderId, loginUser.getUsername());
+            int result = knowledgeFileService.insertSysFileWithUpload(file,folderId, loginUser.getUser().getNickName());
             return toAjax(result);
         } catch (Exception e) {
             return AjaxResult.error("文件上传失败: " + e.getMessage());
@@ -105,10 +104,12 @@ public class KnowledgeFileController extends BaseController {
     @DeleteMapping("/{fileIds}")
     public AjaxResult remove(@PathVariable Long[] fileIds) {
         LoginUser loginUser = getLoginUser();
-        if (loginUser.getUserId().equals(1L)) {
+        if (loginUser.getUserId().equals(1L) || loginUser.getDeptId()
+                .equals(sysFileService.selectDeptIdByFolderId
+                        (knowledgeFileService.selectSysFileByFileId(fileIds[0]).getFolderId()))) {
             return toAjax(knowledgeFileService.deleteSysFileByFileIds(fileIds));
         }
-        return AjaxResult.error("只有管理员可以删除文件");
+        return AjaxResult.error("只有管理员或文件所在部门的用户可以删除文件");
     }
     /**
      * 修改文件状态
@@ -118,11 +119,14 @@ public class KnowledgeFileController extends BaseController {
     @PutMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody KnowledgeFile knowledgeFile) {
         LoginUser loginUser = getLoginUser();
-        if (loginUser.getUserId().equals(1L) || Objects.equals(loginUser.getDeptId(), sysFileService.selectSysFileFolderByFolderId(knowledgeFile.getFolderId()).getDeptId())) {
+        if (loginUser.getUserId().equals(1L) || loginUser.getDeptId()
+                .equals(sysFileService.selectDeptIdByFolderId
+                        (knowledgeFileService.selectSysFileByFileId(knowledgeFile.getFileId()).getFolderId()))) {
             if (knowledgeFile.getFileId() == null || knowledgeFile.getStatus() == null) {
                 return AjaxResult.error("fileId 和 status 不能为空");
             }
-            return toAjax(knowledgeFileService.updateSysFileStatus(knowledgeFile.getFileId(), knowledgeFile.getStatus()));
+            return toAjax(knowledgeFileService.updateSysFileStatus(knowledgeFile.getFileId(),
+                    knowledgeFile.getStatus(),loginUser.getUser().getNickName()));
         }
        return AjaxResult.error("只有管理员或文件所在部门的用户可以修改文件状态");
     }
@@ -137,6 +141,9 @@ public class KnowledgeFileController extends BaseController {
         knowledgeFileService.download(fileId, response);
     }
 
+    /**
+     * 下载模板
+     */
     @PreAuthorize("@ss.hasPermi('system:user:export')")
     @Log(title = "文件", businessType = BusinessType.EXPORT)
     @GetMapping("/template/download")

+ 18 - 12
xzl-admin/src/main/java/com/xzl/web/controller/SysFileFolderController.java

@@ -87,9 +87,15 @@ public class SysFileFolderController extends BaseController {
      */
     @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.UPDATE)
-    @PutMapping
+    @PutMapping("/update")
     public AjaxResult edit(@RequestBody SysFileFolder sysFileFolder) {
-        return toAjax(sysFileFolderService.updateSysFileFolder(sysFileFolder));
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        // 检查 sysFileFolder.getDeptId() 是否为 null
+        if (loginUser.getUserId().equals(1L) ||
+                (sysFileFolder.getDeptId() != null && sysFileFolder.getDeptId().equals(loginUser.getDeptId()))) {
+            return toAjax(sysFileFolderService.updateSysFileFolder(sysFileFolder));
+        }
+        return error("只有超级管理员或部门管理员可以修改");
     }
 
     /**
@@ -120,11 +126,16 @@ public class SysFileFolderController extends BaseController {
     @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @GetMapping("/checkDeletable/{folderId}")
     public AjaxResult checkDeletable(@PathVariable Long folderId) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
         // 判断是否包含子文件夹或文件
         boolean hasChildren = sysFileFolderService.hasChildren(folderId);
         int fileCount = sysFileFolderService.getFileCountByFolderId(folderId);
-
-        return success(new CheckResult(hasChildren, fileCount));
+        if (loginUser.getUserId().equals(1L)
+                || loginUser.getUser().getNickName()
+                .equals(sysFileFolderService.selectSysFileFolderByFolderId(folderId).getCreateBy())) {
+            return success(new CheckResult(hasChildren, fileCount));
+        }
+        return error("只有超级管理员或创建者可以删除");
     }
 
     // 内部类用于封装返回结果
@@ -152,6 +163,9 @@ public class SysFileFolderController extends BaseController {
         return success(sysFileFolderService.deleteFilesByFolderId(folderId));
     }
 
+    /**
+     * 获取部门树列表(部门管理员)
+     */
     @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping()
     public AjaxResult folderTreeSelectByDeptId(SysFileFolder sysFileFolder) {
@@ -161,13 +175,5 @@ public class SysFileFolderController extends BaseController {
         }
         return success(sysFileFolderService.selectSysFileFolderTreeByDeptId(loginUser.getDeptId(), sysFileFolder));
     }
-
-    @PreAuthorize("@ss.hasPermi('system:user:add')")
-    @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.INSERT)
-    @PostMapping("/addFolderWithDeptId")
-    public AjaxResult addFolderWithDeptID(){
-
-        return null;
-    }
 }
 

+ 1 - 2
xzl-admin/src/main/java/com/xzl/web/mapper/KnowledgeFileMapper.java

@@ -62,8 +62,7 @@ public interface KnowledgeFileMapper {
      * @param status 新状态
      * @return 影响行数
      */
-    int updateSysFileStatus(@Param("fileId") Long fileId, @Param("status") String status
-    );
+    int updateSysFileStatus(@Param("fileId") Long fileId, @Param("status") String status, @Param("updateBy") String updateBy);
 
     /**
      * 根据文件名查询文件

+ 7 - 1
xzl-admin/src/main/java/com/xzl/web/mapper/SysFileFolderMapper.java

@@ -92,5 +92,11 @@ public interface SysFileFolderMapper {
      */
     List<SysFileFolder> selectSysFileFolderListByDeptId(@Param("deptId") Long deptId);
 
-    int selectDeptIdByFolderId(Long folderId);
+    /**
+     * 根据文件夹ID查询部门ID
+     *
+     * @param folderId 文件夹ID
+     * @return 部门ID
+     */
+    Long selectDeptIdByFolderId(Long folderId);
 }

+ 20 - 1
xzl-admin/src/main/java/com/xzl/web/service/ISysFileFolderService.java

@@ -92,9 +92,28 @@ public interface ISysFileFolderService {
      */
     int deleteFilesByFolderId(Long folderId);
 
+    /**
+     * 根据部门ID获取部门下的文件夹树结构
+     *
+     * @param deptId 部门ID
+     * @param sysFileFolder 文件夹实体
+     * @return TreeSelect类型的列表,表示部门下的文件夹树结构
+     */
     List<TreeSelect> selectSysFileFolderTreeByDeptId(Long deptId, SysFileFolder sysFileFolder);
 
+    /**
+     * 根据父文件夹ID获取子文件夹列表
+     *
+     * @param folderId 父文件夹ID
+     * @return 子文件夹列表
+     */
     List<SysFileFolder> selectSysFileFolderListByParentId(Long folderId);
 
-    int selectDeptIdByFolderId(Long folderId);
+    /**
+     * 根据文件夹ID获取部门ID
+     *
+     * @param folderId 文件夹ID
+     * @return 部门ID
+     */
+    Long selectDeptIdByFolderId(Long folderId);
 }

+ 1 - 1
xzl-admin/src/main/java/com/xzl/web/service/KnowledgeFileService.java

@@ -53,7 +53,7 @@ public interface KnowledgeFileService {
      * @param status 新状态
      * @return 影响行数
      */
-    int updateSysFileStatus(Long fileId, String status);
+    int updateSysFileStatus(Long fileId, String status,String updateBy);
 
     /**
      * 文件上传

+ 29 - 46
xzl-admin/src/main/java/com/xzl/web/service/impl/KnowledgeFileServiceImpl.java

@@ -2,8 +2,6 @@ package com.xzl.web.service.impl;
 
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
 import java.net.URLEncoder;
 import java.util.List;
 
@@ -119,10 +117,18 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
      * @return 影响行数
      */
     @Override
-    public int updateSysFileStatus(Long fileId, String status) {
-        return knowledgeFileMapper.updateSysFileStatus(fileId, status);
+    public int updateSysFileStatus(Long fileId, String status, String updateBy) {
+        return knowledgeFileMapper.updateSysFileStatus(fileId, status, updateBy);
     }
 
+    /**
+     * 上传文件并插入数据库
+     *
+     * @param file       文件对象
+     * @param folderId   文件夹ID
+     * @param createBy   创建人
+     * @return 插入结果
+     */
     @Override
     public int insertSysFileWithUpload(MultipartFile file, Long folderId, String createBy) {
         LoginUser loginUser = SecurityUtils.getLoginUser();
@@ -179,7 +185,12 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
         return knowledgeFileMapper.insertSysFile(knowledgeFile);
     }
 
-
+/**
+     * 获取所有父级文件夹的拼音形式
+     *
+     * @param folderId 文件夹ID
+     * @return 拼音形式
+     */
     private String getAllParentFolderPinyin(Long folderId) {
         StringBuilder path = new StringBuilder();
         while (folderId != null && folderId != 0) {
@@ -233,6 +244,13 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
         }
     }
 
+    /**
+     * 上传文件
+     *
+     * @param bucketName 存储桶名称
+     * @param objectName 文件对象名称
+     * @param file       文件对象
+     */
     public void uploadFile(String bucketName, String objectName, MultipartFile file) {
         try {
             MinioClient minioClient = getMinioClient();
@@ -261,49 +279,14 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
             System.err.println("上传失败: " + e.getMessage());
         }
     }
+
+    /**
+     * 下载模板
+     *
+     * @param response 响应对象
+     */
     @Override
     public void downloadTemplate(HttpServletResponse response) {
-//        String fileUrl = "http://127.0.0.1:52883/browser/mbb/%E6%A8%A1%E6%9D%BF.doc";
-//        try {
-//            URL url = new URL(fileUrl);
-//            HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
-//            int responseCode = httpConn.getResponseCode();
-//
-//            // 检查响应码是否为HTTP_OK
-//            if (responseCode == HttpURLConnection.HTTP_OK) {
-//                InputStream inputStream = httpConn.getInputStream();
-//                String disposition = httpConn.getHeaderField("Content-Disposition");
-//                String fileName = "模板.doc"; // 默认文件名
-//
-//                if (disposition != null) {
-//                    int index = disposition.indexOf("filename=");
-//                    if (index > 0) {
-//                        fileName = disposition.substring(index + 9);
-//                    }
-//                }
-//
-//                // 设置响应头
-//                response.setContentType("application/octet-stream");
-//                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
-//
-//                OutputStream outputStream = response.getOutputStream();
-//
-//                byte[] buffer = new byte[4096];
-//                int bytesRead;
-//                while ((bytesRead = inputStream.read(buffer)) != -1) {
-//                    outputStream.write(buffer, 0, bytesRead);
-//                }
-//
-//                outputStream.flush();
-//                inputStream.close();
-//                outputStream.close();
-//            } else {
-//                throw new RuntimeException("文件下载失败,服务器响应代码: " + responseCode);
-//            }
-//        } catch (Exception e) {
-//            throw new RuntimeException("文件下载过程中发生错误: " + e.getMessage(), e);
-//        }
-
         try (InputStream inputStream = minioUtil.downLoad("mbb", "/模板.doc");
              OutputStream outputStream = response.getOutputStream()) {
 

+ 41 - 1
xzl-admin/src/main/java/com/xzl/web/service/impl/SysFileFolderServiceImpl.java

@@ -8,6 +8,7 @@ import java.util.stream.Collectors;
 import com.xzl.common.core.domain.TreeSelect;
 import com.xzl.common.core.domain.entity.SysFileFolder;
 import com.xzl.common.utils.DateUtils;
+import com.xzl.common.utils.SecurityUtils;
 import com.xzl.common.utils.StringUtils;
 import com.xzl.web.service.ISysFileFolderService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +63,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
     public int insertSysFileFolder(SysFileFolder sysFileFolder) {
         SysFileFolder folder = sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId());
         sysFileFolder.setDeptId(sysFileFolder.getDeptId());
+        sysFileFolder.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
         sysFileFolder.setFullPath(folder.getFullPath() + "/" + sysFileFolder.getFolderName());
         sysFileFolder.setAncestors(sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId()).getAncestors() + "," + sysFileFolder.getParentId());
         sysFileFolder.setOrderNum(sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId()).getOrderNum() + 1);
@@ -80,6 +82,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
     @Override
     public int updateSysFileFolder(SysFileFolder sysFileFolder) {
         sysFileFolder.setUpdateTime(DateUtils.getNowDate());
+        sysFileFolder.setUpdateBy(SecurityUtils.getLoginUser().getUser().getNickName());
         return sysFileFolderMapper.updateSysFileFolder(sysFileFolder);
     }
 
@@ -157,6 +160,13 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
         return sysFileFolderTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
     }
 
+    /**
+     * 查询文件夹树结构
+     * 
+     * @param sysFileFolder 查询条件对象,包含文件夹相关筛选条件
+     * @return 返回构建好的树形结构选择组件列表
+     *         每个元素包含节点ID、标签和子节点列表
+     */
     @Override
     public List<TreeSelect> selectSysFileFolderTree(SysFileFolder sysFileFolder) {
         List<SysFileFolder> sysFileFolders = this.selectSysFileFolderList(sysFileFolder);
@@ -175,11 +185,22 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
         return children != null && !children.isEmpty();
     }
 
+    /**
+     * 根据文件夹ID获取文件数量
+     *
+     * @param folderId 文件夹ID
+     * @return 文件数量
+     */
     @Override
     public int getFileCountByFolderId(Long folderId) {
         return sysFileFolderMapper.countFilesByFolderId(folderId);
     }
 
+    /**
+     * 根据文件夹ID删除文件
+     *
+     * @param folderId 文件夹ID
+     */
     @Override
     public int deleteFilesByFolderId(Long folderId) {
         // 删除当前文件夹下的所有文件
@@ -197,19 +218,38 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
         return 0;
     }
 
+    /**
+     * 根据部门ID获取文件夹树结构
+     *
+     * @param deptId 部门ID
+     * @param sysFileFolder 查询条件对象,包含文件夹相关筛选条件
+     * @return 构建好的树形结构选择组件列表
+     */
     @Override
     public List<TreeSelect> selectSysFileFolderTreeByDeptId(Long deptId, SysFileFolder sysFileFolder) {
         List<SysFileFolder> folders = sysFileFolderMapper.selectSysFileFolderListByDeptId(deptId);
         return buildSysFileFolderTreeSelect(folders);
     }
 
+    /**
+     * 根据父文件夹ID获取子文件夹列表
+     *
+     * @param folderId 父文件夹ID
+     * @return 子文件夹列表
+     */
     @Override
     public List<SysFileFolder> selectSysFileFolderListByParentId(Long folderId) {
         return Collections.emptyList();
     }
 
+    /**
+     * 根据文件夹ID获取部门ID
+     *
+     * @param folderId 文件夹ID
+     * @return 部门ID
+     */
     @Override
-    public int selectDeptIdByFolderId(Long folderId) {
+    public Long selectDeptIdByFolderId(Long folderId) {
         return sysFileFolderMapper.selectDeptIdByFolderId(folderId);
     }
 

+ 1 - 1
xzl-admin/src/main/resources/mapper/KnowledgeFileMapper.xml

@@ -112,7 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <update id="updateSysFileStatus">
         UPDATE sys_file
-        SET status = #{status}, update_time = now()
+        SET status = #{status}, update_time = now(), update_by = #{updateBy}
         WHERE file_id = #{fileId}
     </update>
 

+ 1 - 1
xzl-ui/src/api/system/folder.js

@@ -29,7 +29,7 @@ export function addFolder(data) {
 // 修改文件文件夹(麻城知识库四级结构)
 export function updateFolder(data) {
   return request({
-    url: '/system/folder',
+    url: '/system/folder/update',
     method: 'put',
     data: data
   })

+ 21 - 22
xzl-ui/src/views/fileTree/folder/index.vue

@@ -266,10 +266,10 @@
         </el-form-item>
       </el-form>
       <template #footer>
-      <span class="dialog-footer">
-        <el-button @click="folderDialogVisible = false">取消</el-button>
-        <el-button type="primary" @click="submitFolderForm">确定</el-button>
-      </span>
+        <span class="dialog-footer">
+          <el-button @click="folderDialogVisible = false">取消</el-button>
+          <el-button type="primary" @click="submitFolderForm">确定</el-button>
+        </span>
       </template>
     </el-dialog>
 
@@ -319,6 +319,8 @@ import dict from "@/utils/dict";
 import {parseTime} from "@/utils/xzl";
 import {updateFileStatus} from "@/api/system/file";
 import {listDept} from "@/api/system/dept";
+import {getUser, getUserProfile} from "@/api/system/user";
+import dept from "@/views/system/dept/index.vue";
 
 
 export default {
@@ -384,6 +386,8 @@ export default {
       },
       // 是否为新增文件夹操作
       isAddFolder: true,
+      // 当前用户部门ID
+      userDeptId: null,
       // 表单参数
       form: {
         fileId: null,
@@ -475,6 +479,7 @@ export default {
     this.getList();
     this.getFileTree();
     this.getDeptList();
+    this.getUserInfo();
     this.getConfigKey("sys.user.initPassword").then(response => {
       this.initPassword = response.msg;
     });
@@ -495,6 +500,7 @@ export default {
     getFileTree() {
       folderTreeSelectByDeptId().then(response => {
         this.fileOptions = response.data;
+        console.log("获取到的文件夹树:", this.fileOptions);
       })
     },
     // 筛选节点
@@ -508,6 +514,11 @@ export default {
       this.selectedFolderId = data.id;
       this.handleQuery();
     },
+   getUserInfo() {
+       getUserProfile().then(response => {
+        this.userDeptId = response.data.deptId;
+      });
+    },
     // 文件状态修改
     handleStatusChange(row) {
       const text = row.status === "0" ? "启用" : "停用";
@@ -612,6 +623,7 @@ export default {
       const formData = new FormData();
       formData.append('file', file.raw);
       formData.append('folderId', this.selectedFolderId);
+      formData.append('deptId', this.userDeptId);
       this.upload.isUploading = true;
       try {
         const response = await addFile(formData);
@@ -626,15 +638,6 @@ export default {
     handleTemplateDownload() {
       downloadTemplate().then(blob => {
         this.parseBlob(blob,'模板.doc');
-        console.log(blob)
-        // const url = window.URL.createObjectURL(new Blob([blob]));
-        // const link = document.createElement('a');
-        // link.href = url;
-        // link.setAttribute('download', '模板.doc'); // 下载的文件名
-        // document.body.appendChild(link);
-        // link.click();
-        // link.remove();
-        // window.URL.revokeObjectURL(url);
       });
     },
     // 文件上传中处理
@@ -666,9 +669,7 @@ export default {
     async getDeptList() {
       try {
         const response = await listDept();
-        console.log(response);
         this.deptOptions = response.data;
-        console.log(this.deptOptions);
       } catch (error) {
         this.$message.error('获取部门列表失败');
       }
@@ -680,7 +681,7 @@ export default {
       this.folderForm = {
         parentId: data.id,
         folderName: '',
-        deptId: null
+        deptId: this.userDeptId
       };
       this.folderDialogVisible = true;
     },
@@ -727,13 +728,15 @@ export default {
         inputPattern: /.+/,
         inputErrorMessage: '文件夹名称不能为空'
       }).then(({value}) => {
-        updateFolder({folderId: data.id, folderName: value}).then(() => {
+        getFolder(data.id).then(res => {
+          const deptId = res.data.deptId;
+        updateFolder({folderId: data.id, folderName: value, deptId: deptId}).then(() => {
           this.$modal.msgSuccess("修改成功");
           this.getFileTree(); // 刷新树
         });
       });
+    });
     },
-
     // 删除文件夹
     handleDeleteFolder(data) {
       this.$confirm(`是否确认删除文件夹 “${data.label}”?`, '提示', {
@@ -761,11 +764,7 @@ export default {
               this.getList(); // 刷新文件列表
             });
           }
-        }).catch(() => {
-          this.$message.info("已取消删除");
         });
-      }).catch(() => {
-        this.$message.info("操作已取消");
       });
     },
     handleDelete() {