Просмотр исходного кода

完善了下载模板功能,新增文件功能新添加了部门名称手动添加

Lijiahao 3 недель назад
Родитель
Сommit
862cd5755c

+ 52 - 35
xzl-admin/src/main/java/com/xzl/web/controller/KnowledgeFileController.java

@@ -1,11 +1,12 @@
 package com.xzl.web.controller;
 
-import java.io.IOException;
+
 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.entity.SysFileFolder;
+import com.xzl.common.core.domain.model.LoginUser;
+import com.xzl.web.service.ISysFileFolderService;
 import com.xzl.web.service.KnowledgeFileService;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -22,22 +23,23 @@ import org.springframework.web.multipart.MultipartFile;
  * 文件Controller
  *
  * @author xzl
- * @date 2025-06-17
+ * @date  2025-06-17
  */
 @RestController
 @RequestMapping("/system/file")
-public class KnowledgeFileController extends BaseController
-{
+public class KnowledgeFileController extends BaseController {
     @Autowired
     private KnowledgeFileService knowledgeFileService;
 
+    @Autowired
+    private ISysFileFolderService sysFileService;
+
     /**
      * 查询文件列表
      */
-    @PreAuthorize("@ss.hasPermi('system:file:list')")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
-    public TableDataInfo list(KnowledgeFile Knowledge)
-    {
+    public TableDataInfo list(KnowledgeFile Knowledge) {
         startPage();
         List<KnowledgeFile> list = knowledgeFileService.selectSysFileList(Knowledge);
         return getDataTable(list);
@@ -46,37 +48,35 @@ public class KnowledgeFileController extends BaseController
     /**
      * 导出文件列表
      */
-    @PreAuthorize("@ss.hasPermi('system:file:export')")
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
     @Log(title = "文件", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
-    public void export(HttpServletResponse response, KnowledgeFile Knowledge)
-    {
+    public void export(HttpServletResponse response, KnowledgeFile Knowledge) {
         List<KnowledgeFile> list = knowledgeFileService.selectSysFileList(Knowledge);
-        ExcelUtil<KnowledgeFile> util = new ExcelUtil<KnowledgeFile>(KnowledgeFile.class);
+        ExcelUtil<KnowledgeFile> util = new ExcelUtil<>(KnowledgeFile.class);
         util.exportExcel(response, list, "文件数据");
     }
 
     /**
      * 获取文件详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:file:query')")
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping(value = "/{fileId}")
-    public AjaxResult getInfo(@PathVariable("fileId") Long fileId)
-    {
+    public AjaxResult getInfo(@PathVariable("fileId") Long fileId) {
         return success(knowledgeFileService.selectSysFileByFileId(fileId));
     }
 
     /**
      * 上传文件
      */
-    @PreAuthorize("@ss.hasPermi('system:file:add')")
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "文件", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestParam("file") MultipartFile file,
-                          @RequestParam("updateSupport") boolean updateSupport,
-                          @RequestParam("folderId") Long folderId ){
+                          @RequestParam("folderId") Long folderId) {
+        LoginUser loginUser = getLoginUser();
         try {
-            int result = knowledgeFileService.insertSysFileWithUpload(file, updateSupport, folderId);
+            int result = knowledgeFileService.insertSysFileWithUpload(file,folderId, loginUser.getUsername());
             return toAjax(result);
         } catch (Exception e) {
             return AjaxResult.error("文件上传失败: " + e.getMessage());
@@ -86,45 +86,62 @@ public class KnowledgeFileController extends BaseController
     /**
      * 修改文件
      */
-    @PreAuthorize("@ss.hasPermi('system:file:edit')")
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "文件", businessType = BusinessType.UPDATE)
     @PutMapping
-    public AjaxResult edit(@RequestBody KnowledgeFile Knowledge)
-    {
-        return toAjax(knowledgeFileService.updateSysFile(Knowledge));
+    public AjaxResult edit(@RequestBody KnowledgeFile Knowledge) {
+        LoginUser loginUser = getLoginUser();
+        if (loginUser.getUserId().equals(1L)) {
+            return toAjax(knowledgeFileService.updateSysFile(Knowledge));
+        }
+        return AjaxResult.error("只有管理员可以修改文件");
     }
 
     /**
      * 删除文件
      */
-    @PreAuthorize("@ss.hasPermi('system:file:remove')")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "文件", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{fileIds}")
-    public AjaxResult remove(@PathVariable Long[] fileIds)
-    {
-        return toAjax(knowledgeFileService.deleteSysFileByFileIds(fileIds));
+    @DeleteMapping("/{fileIds}")
+    public AjaxResult remove(@PathVariable Long[] fileIds) {
+        LoginUser loginUser = getLoginUser();
+        if (loginUser.getUserId().equals(1L)) {
+            return toAjax(knowledgeFileService.deleteSysFileByFileIds(fileIds));
+        }
+        return AjaxResult.error("只有管理员可以删除文件");
     }
-
     /**
      * 修改文件状态
      */
-    @PreAuthorize("@ss.hasPermi('system:file:edit')")
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "文件", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
     public AjaxResult changeStatus(@RequestBody KnowledgeFile knowledgeFile) {
-        if (knowledgeFile.getFileId() == null || knowledgeFile.getStatus() == null) {
-            return AjaxResult.error("fileId 和 status 不能为空");
+        LoginUser loginUser = getLoginUser();
+        if (loginUser.getUserId().equals(1L) || Objects.equals(loginUser.getDeptId(), sysFileService.selectSysFileFolderByFolderId(knowledgeFile.getFolderId()).getDeptId())) {
+            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()));
+       return AjaxResult.error("只有管理员或文件所在部门的用户可以修改文件状态");
     }
 
     /**
      * 下载文件
      */
-    @PreAuthorize("@ss.hasPermi('system:file:export')")
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
     @Log(title = "文件", businessType = BusinessType.EXPORT)
     @GetMapping("/download/{fileId}")
     public void download(@PathVariable("fileId") Long fileId, HttpServletResponse response) {
         knowledgeFileService.download(fileId, response);
     }
+
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
+    @Log(title = "文件", businessType = BusinessType.EXPORT)
+    @GetMapping("/template/download")
+    public void downloadTemplate(HttpServletResponse response) {
+        knowledgeFileService.downloadTemplate(response);
+    }
+
 }

+ 31 - 14
xzl-admin/src/main/java/com/xzl/web/controller/SysFileFolderController.java

@@ -1,9 +1,14 @@
 package com.xzl.web.controller;
 
+
+
+
+
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
-
 import com.xzl.common.core.domain.entity.SysFileFolder;
+import com.xzl.common.core.domain.model.LoginUser;
+import com.xzl.common.utils.SecurityUtils;
 import com.xzl.web.service.ISysFileFolderService;
 import lombok.Getter;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -38,7 +43,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 查询文件文件夹(麻城知识库四级结构)列表
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:list')")
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
     @GetMapping("/list")
     public TableDataInfo list(SysFileFolder sysFileFolder) {
         startPage();
@@ -49,7 +54,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 导出文件文件夹(麻城知识库四级结构)列表
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:export')")
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
     @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(HttpServletResponse response, SysFileFolder sysFileFolder) {
@@ -61,7 +66,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 获取文件文件夹(麻城知识库四级结构)详细信息
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:query')")
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping(value = "/{folderId}")
     public AjaxResult getInfo(@PathVariable("folderId") Long folderId) {
         return success(sysFileFolderService.selectSysFileFolderByFolderId(folderId));
@@ -70,7 +75,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 新增文件文件夹(麻城知识库四级结构)
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:add')")
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
     @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@RequestBody SysFileFolder sysFileFolder) {
@@ -80,7 +85,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 修改文件文件夹(麻城知识库四级结构)
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:edit')")
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
     @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@RequestBody SysFileFolder sysFileFolder) {
@@ -90,7 +95,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 删除文件文件夹(麻城知识库四级结构)
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:remove')")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "文件文件夹(麻城知识库四级结构)", businessType = BusinessType.DELETE)
     @DeleteMapping("/batchRemove/{folderIds}")
     public AjaxResult remove(@PathVariable Long[] folderIds) {
@@ -101,7 +106,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 获取部门树列表
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:query')")
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
     @GetMapping("/folderTree")
     public AjaxResult folderTree(SysFileFolder sysFileFolder) {
         logger.info("返回的文件夹树数据: {}", sysFileFolderService.selectSysFileFolderTree(sysFileFolder).toString());
@@ -112,7 +117,7 @@ public class SysFileFolderController extends BaseController {
     /**
      * 检查文件文件夹是否可以删除(是否包含子文件夹或文件)
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:remove')")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @GetMapping("/checkDeletable/{folderId}")
     public AjaxResult checkDeletable(@PathVariable Long folderId) {
         // 判断是否包含子文件夹或文件
@@ -140,17 +145,29 @@ public class SysFileFolderController extends BaseController {
     /**
      * 删除指定文件夹下的所有文件(软删除)
      */
-    @PreAuthorize("@ss.hasPermi('system:folder:remove')")
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
     @Log(title = "文件操作", businessType = BusinessType.DELETE)
     @DeleteMapping("/{folderId}")
     public AjaxResult deleteFilesByFolderId(@PathVariable Long folderId) {
         return success(sysFileFolderService.deleteFilesByFolderId(folderId));
     }
 
-    @PreAuthorize("@ss.hasPermi('system:folder:query')")
-    @GetMapping("/folderTreeSelectByDeptId/{deptId}")
-    public AjaxResult folderTreeSelectByDeptId(@PathVariable Long deptId ,SysFileFolder sysFileFolder) {
-        return success(sysFileFolderService.selectSysFileFolderTreeByDeptId(deptId,sysFileFolder));
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
+    @GetMapping()
+    public AjaxResult folderTreeSelectByDeptId(SysFileFolder sysFileFolder) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (loginUser.getUserId().equals(1L)) {
+            return success(sysFileFolderService.selectSysFileFolderTree(sysFileFolder));
+        }
+        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;
     }
 }
 

+ 27 - 16
xzl-admin/src/main/java/com/xzl/web/mapper/KnowledgeFileMapper.java

@@ -1,4 +1,5 @@
 package com.xzl.web.mapper;
+
 import com.xzl.common.core.domain.entity.KnowledgeFile;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -9,18 +10,17 @@ import java.util.List;
  * 文件Mapper接口
  *
  * @author xzl
- * @date 2025-06-17
+ * &#064;date  2025-06-17
  */
 @Mapper
-public interface KnowledgeFileMapper
-{
+public interface KnowledgeFileMapper {
     /**
      * 查询文件
      *
      * @param fileId 文件主键
      * @return 文件
      */
-    public KnowledgeFile selectSysFileByFileId(Long fileId);
+    KnowledgeFile selectSysFileByFileId(Long fileId);
 
     /**
      * 查询文件列表
@@ -28,15 +28,15 @@ public interface KnowledgeFileMapper
      * @param Knowledge 文件
      * @return 文件集合
      */
-    public List<KnowledgeFile> selectSysFileList(KnowledgeFile Knowledge);
+    List<KnowledgeFile> selectSysFileList(KnowledgeFile Knowledge);
 
     /**
      * 新增文件
      *
-     * @param Knowledge 文件
+     * @param knowledgeFile 文件
      * @return 结果
      */
-    public int insertSysFile(KnowledgeFile Knowledge);
+    int insertSysFile(KnowledgeFile knowledgeFile);
 
     /**
      * 修改文件
@@ -44,15 +44,8 @@ public interface KnowledgeFileMapper
      * @param Knowledge 文件
      * @return 结果
      */
-    public int updateSysFile(KnowledgeFile Knowledge);
+    int updateSysFile(KnowledgeFile Knowledge);
 
-    /**
-     * 删除文件
-     *
-     * @param fileId 文件主键
-     * @return 结果
-     */
-    public int deleteSysFileByFileId(Long fileId);
 
     /**
      * 批量删除文件
@@ -60,7 +53,7 @@ public interface KnowledgeFileMapper
      * @param fileIds 需要删除的数据主键集合
      * @return 结果
      */
-    public int deleteSysFileByFileIds(Long[] fileIds);
+    int deleteSysFileByFileIds(Long[] fileIds);
 
     /**
      * 更新文件夹状态
@@ -71,4 +64,22 @@ public interface KnowledgeFileMapper
      */
     int updateSysFileStatus(@Param("fileId") Long fileId, @Param("status") String status
     );
+
+    /**
+     * 根据文件名查询文件
+     *
+     * @param fileName 文件名
+     * @param folderId 文件夹ID
+     * @return 文件列表
+     */
+    List<KnowledgeFile> selectByFileName(@Param("fileName") String fileName, @Param("folderId") Long folderId);
+
+    /**
+     * 根据文件ID列表查询文件列表
+     *
+     * @param fileIds 文件ID列表
+     * @return 文件列表
+     */
+    List<KnowledgeFile> selectSysFileListByIds(Long[] fileIds);
+
 }

+ 8 - 26
xzl-admin/src/main/java/com/xzl/web/mapper/SysFileFolderMapper.java

@@ -13,15 +13,14 @@ import org.apache.ibatis.annotations.Param;
  * &#064;date  2025-06-17
  */
 @Mapper
-public interface SysFileFolderMapper
-{
+public interface SysFileFolderMapper {
     /**
      * 查询文件文件夹(麻城知识库四级结构)
      *
      * @param folderId 文件文件夹(麻城知识库四级结构)主键
      * @return 文件文件夹(麻城知识库四级结构)
      */
-    public SysFileFolder selectSysFileFolderByFolderId(Long folderId);
+    SysFileFolder selectSysFileFolderByFolderId(Long folderId);
 
     /**
      * 查询文件文件夹(麻城知识库四级结构)列表
@@ -29,7 +28,7 @@ public interface SysFileFolderMapper
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 文件文件夹(麻城知识库四级结构)集合
      */
-    public List<SysFileFolder> selectSysFileFolderList(SysFileFolder knowledgeFileFolder);
+    List<SysFileFolder> selectSysFileFolderList(SysFileFolder knowledgeFileFolder);
 
     /**
      * 新增文件文件夹(麻城知识库四级结构)
@@ -37,15 +36,7 @@ public interface SysFileFolderMapper
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 结果
      */
-    public int insertSysFileFolder(SysFileFolder knowledgeFileFolder);
-
-    /**
-     * 插入文件到文件夹
-     * @param folderId 文件夹ID
-     * @param fileIds 文件ID列表
-     * @return 操作结果
-     */
-    int insertFilesIntoFolder(@Param("folderId") Long folderId, @Param("fileIds") List<Long> fileIds);
+    int insertSysFileFolder(SysFileFolder knowledgeFileFolder);
 
     /**
      * 修改文件文件夹(麻城知识库四级结构)
@@ -53,14 +44,14 @@ public interface SysFileFolderMapper
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 结果
      */
-    public int updateSysFileFolder(SysFileFolder knowledgeFileFolder);
+    int updateSysFileFolder(SysFileFolder knowledgeFileFolder);
 
     /**
      * 删除文件文件夹(麻城知识库四级结构)
      *
      * @param folderId 文件文件夹(麻城知识库四级结构)主键
      */
-    public void deleteSysFileFolderByFolderId(Long folderId);
+    void deleteSysFileFolderByFolderId(Long folderId);
 
     /**
      * 批量删除文件文件夹(麻城知识库四级结构)
@@ -68,17 +59,7 @@ public interface SysFileFolderMapper
      * @param folderIds 需要删除的数据主键集合
      * @return 结果
      */
-    public int deleteSysFileFolderByFolderIds(Long[] folderIds);
-
-    /**
-     * 修改文件文件夹(麻城知识库四级结构)状态
-     *
-     * @param folderId 文件文件夹(麻城知识库四级结构)主键
-     * @param status 状态
-     * @return 结果
-     */
-    int updateSysFileFolderStatus(Long folderId, String status);
-
+    int deleteSysFileFolderByFolderIds(Long[] folderIds);
 
     /**
      * 根据父级ID查询文件文件夹(麻城知识库四级结构)
@@ -111,4 +92,5 @@ public interface SysFileFolderMapper
      */
     List<SysFileFolder> selectSysFileFolderListByDeptId(@Param("deptId") Long deptId);
 
+    int selectDeptIdByFolderId(Long folderId);
 }

+ 17 - 18
xzl-admin/src/main/java/com/xzl/web/service/ISysFileFolderService.java

@@ -9,17 +9,16 @@ import com.xzl.common.core.domain.entity.SysFileFolder;
  * 文件文件夹(麻城知识库四级结构)Service接口
  *
  * @author xzl
- * @date 2025-06-17
+ * &#064;date  2025-06-17
  */
-public interface ISysFileFolderService
-{
+public interface ISysFileFolderService {
     /**
      * 查询文件文件夹(麻城知识库四级结构)
      *
      * @param folderId 文件文件夹(麻城知识库四级结构)主键
      * @return 文件文件夹(麻城知识库四级结构)
      */
-    public SysFileFolder selectSysFileFolderByFolderId(Long folderId);
+    SysFileFolder selectSysFileFolderByFolderId(Long folderId);
 
     /**
      * 查询文件文件夹(麻城知识库四级结构)列表
@@ -27,7 +26,7 @@ public interface ISysFileFolderService
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 文件文件夹(麻城知识库四级结构)集合
      */
-    public List<SysFileFolder> selectSysFileFolderList(SysFileFolder knowledgeFileFolder);
+    List<SysFileFolder> selectSysFileFolderList(SysFileFolder knowledgeFileFolder);
 
     /**
      * 新增文件文件夹(麻城知识库四级结构)
@@ -35,15 +34,8 @@ public interface ISysFileFolderService
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 结果
      */
-    public int insertSysFileFolder(SysFileFolder knowledgeFileFolder);
+    int insertSysFileFolder(SysFileFolder knowledgeFileFolder);
 
-    /**
-     * 新增文件夹并关联文件
-     * @param sysFileFolder 文件夹对象
-     * @param fileIds 文件ID列表
-     * @return 操作结果
-     */
-    int insertSysFileFolderAndFiles(SysFileFolder sysFileFolder, List<Long> fileIds);
 
     /**
      * 修改文件文件夹(麻城知识库四级结构)
@@ -51,7 +43,7 @@ public interface ISysFileFolderService
      * @param knowledgeFileFolder 文件文件夹(麻城知识库四级结构)
      * @return 结果
      */
-    public int updateSysFileFolder(SysFileFolder knowledgeFileFolder);
+    int updateSysFileFolder(SysFileFolder knowledgeFileFolder);
 
     /**
      * 批量删除文件文件夹(麻城知识库四级结构)
@@ -59,17 +51,18 @@ public interface ISysFileFolderService
      * @param folderIds 需要删除的文件文件夹(麻城知识库四级结构)主键集合
      * @return 结果
      */
-    public int deleteSysFileFolderByFolderIds(Long[] folderIds);
+    int deleteSysFileFolderByFolderIds(Long[] folderIds);
 
     /**
      * 删除文件文件夹(麻城知识库四级结构)信息
      *
      * @param folderId 文件文件夹(麻城知识库四级结构)主键
      */
-     void deleteSysFileFolderByFolderId(Long folderId);
+    void deleteSysFileFolderByFolderId(Long folderId);
 
     /**
      * 获取系统文件夹树结构
+     *
      * @param knowledgeFileFolder 文件夹实体
      * @return TreeSelect类型的列表,表示文件夹树结构
      */
@@ -77,6 +70,7 @@ public interface ISysFileFolderService
 
     /**
      * 判断文件夹是否有子文件夹
+     *
      * @param folderId 文件夹ID
      * @return boolean类型,存在子文件夹返回true,否则返回false
      */
@@ -84,6 +78,7 @@ public interface ISysFileFolderService
 
     /**
      * 获取文件夹下的文件数量
+     *
      * @param folderId 文件夹ID
      * @return int类型,返回文件夹下的文件数量
      */
@@ -95,7 +90,11 @@ public interface ISysFileFolderService
      * @param folderId 文件夹ID
      * @return int类型,返回删除的文件数量
      */
-     int deleteFilesByFolderId(Long folderId);
+    int deleteFilesByFolderId(Long folderId);
+
+    List<TreeSelect> selectSysFileFolderTreeByDeptId(Long deptId, SysFileFolder sysFileFolder);
+
+    List<SysFileFolder> selectSysFileFolderListByParentId(Long folderId);
 
-   List<TreeSelect> selectSysFileFolderTreeByDeptId(Long deptId, SysFileFolder sysFileFolder);
+    int selectDeptIdByFolderId(Long folderId);
 }

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

@@ -5,24 +5,22 @@ import com.xzl.common.core.domain.entity.KnowledgeFile;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.InputStream;
 import java.util.List;
 
 /**
  * 文件Service接口
  *
  * @author xzl
- * @date 2025-06-17
+ * &#064;date  2025-06-17
  */
-public interface KnowledgeFileService
-{
+public interface KnowledgeFileService {
     /**
      * 查询文件
      *
      * @param fileId 文件主键
      * @return 文件
      */
-    public KnowledgeFile selectSysFileByFileId(Long fileId);
+    KnowledgeFile selectSysFileByFileId(Long fileId);
 
     /**
      * 查询文件列表
@@ -30,15 +28,7 @@ public interface KnowledgeFileService
      * @param Knowledge 文件
      * @return 文件集合
      */
-    public List<KnowledgeFile> selectSysFileList(KnowledgeFile Knowledge);
-
-    /**
-     * 新增文件
-     *
-     * @param Knowledge 文件
-     * @return 结果
-     */
-    public int insertSysFile(KnowledgeFile Knowledge);
+    List<KnowledgeFile> selectSysFileList(KnowledgeFile Knowledge);
 
     /**
      * 修改文件
@@ -46,7 +36,7 @@ public interface KnowledgeFileService
      * @param Knowledge 文件
      * @return 结果
      */
-    public int updateSysFile(KnowledgeFile Knowledge);
+    int updateSysFile(KnowledgeFile Knowledge);
 
     /**
      * 批量删除文件
@@ -54,15 +44,7 @@ public interface KnowledgeFileService
      * @param fileIds 需要删除的文件主键集合
      * @return 结果
      */
-    public int deleteSysFileByFileIds(Long[] fileIds);
-
-    /**
-     * 删除文件信息
-     *
-     * @param fileId 文件主键
-     * @return 结果
-     */
-    public int deleteSysFileByFileId(Long fileId);
+    int deleteSysFileByFileIds(Long[] fileIds);
 
     /**
      * 更新文件夹状态
@@ -71,9 +53,31 @@ public interface KnowledgeFileService
      * @param status 新状态
      * @return 影响行数
      */
-    public int updateSysFileStatus(Long fileId, String status);
+    int updateSysFileStatus(Long fileId, String status);
 
-    int insertSysFileWithUpload(MultipartFile file, boolean updateSupport, Long folderId);
+    /**
+     * 文件上传
+     *
+     * @param file 文件
+     * @param folderId 文件夹ID
+     * @param createBy 创建人
+     * @return 影响行数
+     */
+    int insertSysFileWithUpload(MultipartFile file, Long folderId, String createBy);
 
+    /**
+     * 文件下载
+     *
+     * @param fileId 文件ID
+     * @param response 响应
+     */
     void download(Long fileId, HttpServletResponse response);
+
+
+    /**
+     * 文件上传模板下载
+     *
+     * @param response 响应
+     */
+    void downloadTemplate(HttpServletResponse response);
 }

+ 115 - 69
xzl-admin/src/main/java/com/xzl/web/service/impl/KnowledgeFileServiceImpl.java

@@ -2,19 +2,22 @@ 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;
 
 import com.xzl.common.core.domain.entity.KnowledgeFile;
 import com.xzl.common.core.domain.entity.SysFileFolder;
+import com.xzl.common.core.domain.model.LoginUser;
 import com.xzl.common.utils.DateUtils;
 import com.xzl.common.utils.MinioUtil;
+import com.xzl.common.utils.SecurityUtils;
 import com.xzl.web.mapper.KnowledgeFileMapper;
 import com.xzl.web.service.ISysFileFolderService;
 import com.xzl.web.service.KnowledgeFileService;
 import io.minio.*;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
@@ -29,20 +32,22 @@ import static com.xzl.web.core.config.MinIOConfig.getMinioClient;
  * 文件Service业务层处理
  *
  * @author xzl
- * @date 2025-06-17
+ * &#064;date  2025-06-17
  */
 @Service
 public class KnowledgeFileServiceImpl implements KnowledgeFileService {
-    @Autowired
-    private KnowledgeFileMapper knowledgeFileMapper;
-    @Autowired
-    private ISysFileFolderService sysFileFolderService;
-    @Autowired
-    private MinioUtil minioUtil;
+    private final KnowledgeFileMapper knowledgeFileMapper;
+    private final ISysFileFolderService sysFileFolderService;
+    private final MinioUtil minioUtil;
+
+    public KnowledgeFileServiceImpl(KnowledgeFileMapper knowledgeFileMapper, ISysFileFolderService sysFileFolderService, MinioUtil minioUtil) {
+        this.knowledgeFileMapper = knowledgeFileMapper;
+        this.sysFileFolderService = sysFileFolderService;
+        this.minioUtil = minioUtil;
+    }
 
     private static final String BUCKET_NAME = "your-bucket-name";
 
-
     /**
      * 查询文件
      *
@@ -65,17 +70,6 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
         return knowledgeFileMapper.selectSysFileList(KnowledgeFile);
     }
 
-    /**
-     * 新增文件
-     *
-     * @param KnowledgeFile 文件
-     * @return 结果
-     */
-    @Override
-    public int insertSysFile(KnowledgeFile KnowledgeFile) {
-        KnowledgeFile.setCreateTime(DateUtils.getNowDate());
-        return knowledgeFileMapper.insertSysFile(KnowledgeFile);
-    }
 
     /**
      * 修改文件
@@ -97,18 +91,24 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
      */
     @Override
     public int deleteSysFileByFileIds(Long[] fileIds) {
-        return knowledgeFileMapper.deleteSysFileByFileIds(fileIds);
-    }
+        // 先查询文件信息,获取文件存储路径
+        List<KnowledgeFile> files = knowledgeFileMapper.selectSysFileListByIds(fileIds);
+
+        // 删除MinIO存储桶中的文件
+        for (KnowledgeFile file : files) {
+            try {
+                MinioClient minioClient = getMinioClient();
+                minioClient.removeObject(RemoveObjectArgs.builder()
+                        .bucket(BUCKET_NAME)
+                        .object(file.getFilePath())
+                        .build());
+            } catch (Exception e) {
+                System.err.println("删除MinIO文件失败: " + file.getFilePath() + ", 错误信息: " + e.getMessage());
+            }
+        }
 
-    /**
-     * 删除文件信息
-     *
-     * @param fileId 文件主键
-     * @return 结果
-     */
-    @Override
-    public int deleteSysFileByFileId(Long fileId) {
-        return knowledgeFileMapper.deleteSysFileByFileId(fileId);
+        // 调用Mapper方法删除数据库中的文件记录
+        return knowledgeFileMapper.deleteSysFileByFileIds(fileIds);
     }
 
     /**
@@ -124,18 +124,43 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
     }
 
     @Override
-    public int insertSysFileWithUpload(MultipartFile file, boolean updateSupport, Long folderId) {
+    public int insertSysFileWithUpload(MultipartFile file, Long folderId, String createBy) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        String originalFileName = file.getOriginalFilename();
+
+        // 获取原始文件名和扩展名
+        String fileName = originalFileName;
+        String ext = "";
+        assert originalFileName != null;
+        int dotIndex = originalFileName.lastIndexOf(".");
+        if (dotIndex > 0) {
+            fileName = originalFileName.substring(0, dotIndex);
+            ext = originalFileName.substring(dotIndex);
+        }
+
+        // 查询是否存在同名文件(相同文件夹下)
+        List<KnowledgeFile> existingFiles = knowledgeFileMapper.selectByFileName(fileName + ext, folderId);
+        KnowledgeFile existingFile = !existingFiles.isEmpty() ? existingFiles.get(0) : null;
+        if (existingFile != null) {
+            int counter = 1;
+            String newFileName;
+            do {
+                // 生成新文件名
+                newFileName = fileName + "(" + counter + ")" + ext;
+                existingFiles = knowledgeFileMapper.selectByFileName(newFileName, folderId);
+                counter++;
+            } while (!existingFiles.isEmpty());
+            originalFileName = newFileName;
+        }
+
         KnowledgeFile knowledgeFile = new KnowledgeFile();
         knowledgeFile.setCreateTime(DateUtils.getNowDate());
-        // 从文件获取文件名
-        String originalFileName = file.getOriginalFilename();
         knowledgeFile.setFileName(originalFileName);
+
         // 从文件名获取文件类型
-        if (originalFileName != null) {
-            int dotIndex = originalFileName.lastIndexOf('.');
-            if (dotIndex != -1) {
-                knowledgeFile.setFileType(originalFileName.substring(dotIndex + 1));
-            }
+        dotIndex = originalFileName.lastIndexOf('.');
+        if (dotIndex != -1) {
+            knowledgeFile.setFileType(originalFileName.substring(dotIndex + 1));
         }
         // 获取所有父级文件夹的拼音形式
         String parentFolderPinyin = getAllParentFolderPinyin(folderId);
@@ -145,15 +170,16 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
         knowledgeFile.setFilePath(objectName);
         knowledgeFile.setFileSize(file.getSize());
         knowledgeFile.setDownloadCount(0L);
+        knowledgeFile.setCreateBy(loginUser.getUsername());
         knowledgeFile.setStatus("0");
         knowledgeFile.setDelFlag("0");
-
         // 上传文件到 MinIO
         uploadFile(BUCKET_NAME, objectName, file);
 
         return knowledgeFileMapper.insertSysFile(knowledgeFile);
     }
 
+
     private String getAllParentFolderPinyin(Long folderId) {
         StringBuilder path = new StringBuilder();
         while (folderId != null && folderId != 0) {
@@ -176,11 +202,11 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
     /**
      * 下载文件
      *
-     * @param fileId 文件ID
+     * @param fileId   文件ID
      * @param response 响应对象
      */
     @Override
-    public void download(Long fileId,HttpServletResponse response) {
+    public void download(Long fileId, HttpServletResponse response) {
         // 从数据库查询文件信息
         KnowledgeFile knowledgeFile = knowledgeFileMapper.selectSysFileByFileId(fileId);
         if (knowledgeFile == null) {
@@ -199,37 +225,14 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
             while ((bytesRead = inputStream.read(buffer)) != -1) {
                 outputStream.write(buffer, 0, bytesRead);
             }
+            outputStream.flush();
+            knowledgeFile.setDownloadCount(knowledgeFile.getDownloadCount() + 1);
+            knowledgeFileMapper.updateSysFile(knowledgeFile);
         } catch (Exception e) {
             throw new RuntimeException("文件下载失败: " + e.getMessage(), e);
         }
     }
 
-    /**
-     * 设置响应头
-     * @param response 响应对象
-     * @param knowledgeFile 文件信息
-     */
-    private void setResponseHeaders(HttpServletResponse response, KnowledgeFile knowledgeFile) throws Exception {
-        response.setContentType("application/octet-stream");
-        response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(knowledgeFile.getFileName(), "UTF-8"));
-        response.setContentLengthLong(knowledgeFile.getFileSize());
-    }
-
-    /**
-     * 复制输入流到输出流
-     * @param inputStream 输入流
-     * @param outputStream 输出流
-     */
-    private void copyStream(InputStream inputStream, OutputStream outputStream) throws Exception {
-        byte[] buffer = new byte[4096];
-        int bytesRead;
-        while ((bytesRead = inputStream.read(buffer)) != -1) {
-            outputStream.write(buffer, 0, bytesRead);
-        }
-        outputStream.flush();
-    }
-
-
     public void uploadFile(String bucketName, String objectName, MultipartFile file) {
         try {
             MinioClient minioClient = getMinioClient();
@@ -250,7 +253,7 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
                     PutObjectArgs.builder()
                             .bucket(bucketName)
                             .object(objectName)
-                            .stream(file.getInputStream(),file.getSize() -1, 10485760) // 10MB part size
+                            .stream(file.getInputStream(), file.getSize() - 1, 10485760) // 10MB part size
                             .build());
 
             System.out.println("文件上传成功: " + objectName);
@@ -258,6 +261,49 @@ public class KnowledgeFileServiceImpl implements KnowledgeFileService {
             System.err.println("上传失败: " + e.getMessage());
         }
     }
+    @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);
+        }
+    }
 }
 
 

+ 20 - 32
xzl-admin/src/main/java/com/xzl/web/service/impl/SysFileFolderServiceImpl.java

@@ -1,7 +1,7 @@
 package com.xzl.web.service.impl;
 
 import java.util.ArrayList;
-import java.util.Iterator;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -23,8 +23,12 @@ import com.xzl.web.mapper.SysFileFolderMapper;
  */
 @Service
 public class SysFileFolderServiceImpl implements ISysFileFolderService {
+    private final SysFileFolderMapper sysFileFolderMapper;
+
     @Autowired
-    private SysFileFolderMapper sysFileFolderMapper;
+    public SysFileFolderServiceImpl(SysFileFolderMapper sysFileFolderMapper) {
+        this.sysFileFolderMapper = sysFileFolderMapper;
+    }
 
     /**
      * 查询文件文件夹(麻城知识库四级结构)
@@ -57,6 +61,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
     @Override
     public int insertSysFileFolder(SysFileFolder sysFileFolder) {
         SysFileFolder folder = sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId());
+        sysFileFolder.setDeptId(sysFileFolder.getDeptId());
         sysFileFolder.setFullPath(folder.getFullPath() + "/" + sysFileFolder.getFolderName());
         sysFileFolder.setAncestors(sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId()).getAncestors() + "," + sysFileFolder.getParentId());
         sysFileFolder.setOrderNum(sysFileFolderMapper.selectSysFileFolderByFolderId(sysFileFolder.getParentId()).getOrderNum() + 1);
@@ -65,31 +70,6 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
         return sysFileFolderMapper.insertSysFileFolder(sysFileFolder);
     }
 
-    /**
-     * 新增文件夹并关联文件
-     * @param sysFileFolder 文件夹对象
-     * @param fileIds 文件ID列表
-     * @return 操作结果
-     */
-    @Override
-    public int insertSysFileFolderAndFiles(SysFileFolder sysFileFolder, List<Long> fileIds) {
-        int result = insertSysFileFolder(sysFileFolder);
-        if (result > 0 && fileIds != null && !fileIds.isEmpty()) {
-            sysFileFolderMapper.insertFilesIntoFolder(sysFileFolder.getFolderId(), fileIds);
-        }
-        return result;
-    }
-
-    /**
-     * 插入文件到文件夹
-     * @param folderId 文件夹ID
-     * @param fileIds 文件ID列表
-     * @return 操作结果
-     */
-    public int insertFilesIntoFolder(Long folderId, List<Long> fileIds) {
-        // 实现插入文件到文件夹的逻辑
-        return sysFileFolderMapper.insertFilesIntoFolder(folderId, fileIds);
-    }
 
     /**
      * 修改文件文件夹(麻城知识库四级结构)
@@ -125,10 +105,8 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
     }
 
     private List<SysFileFolder> getChildList(List<SysFileFolder> list, SysFileFolder t) {
-        List<SysFileFolder> tlist = new ArrayList<SysFileFolder>();
-        Iterator<SysFileFolder> it = list.iterator();
-        while (it.hasNext()) {
-            SysFileFolder n = (SysFileFolder) it.next();
+        List<SysFileFolder> tlist = new ArrayList<>();
+        for (SysFileFolder n : list) {
             if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getFolderId().longValue()) {
                 tlist.add(n);
             }
@@ -152,7 +130,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
     }
 
     public List<SysFileFolder> buildFolderTree(List<SysFileFolder> folders) {
-        List<SysFileFolder> returnList = new ArrayList<SysFileFolder>();
+        List<SysFileFolder> returnList = new ArrayList<>();
         List<Long> tempList = folders.stream().map(SysFileFolder::getFolderId).collect(Collectors.toList());
         for (SysFileFolder folder : folders) {
             // 如果是顶级节点, 遍历该父节点的所有子节点
@@ -187,6 +165,7 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
 
     /**
      * 检查指定文件夹是否有子文件夹
+     *
      * @param folderId 文件夹ID
      * @return 如果存在子文件夹返回true,否则返回false
      */
@@ -224,5 +203,14 @@ public class SysFileFolderServiceImpl implements ISysFileFolderService {
         return buildSysFileFolderTreeSelect(folders);
     }
 
+    @Override
+    public List<SysFileFolder> selectSysFileFolderListByParentId(Long folderId) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public int selectDeptIdByFolderId(Long folderId) {
+        return sysFileFolderMapper.selectDeptIdByFolderId(folderId);
+    }
 
 }

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

@@ -116,4 +116,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE file_id = #{fileId}
     </update>
 
+    <select id="selectByFileName" resultMap="SysFileResult">
+        SELECT * FROM sys_file
+        WHERE file_name = #{fileName}
+          AND folder_id = #{folderId}
+    </select>
+
+    <select id="selectSysFileListByIds" parameterType="Long[]" resultMap="SysFileResult">
+        <include refid="selectSysFileVo"/>
+        WHERE file_id IN
+        <foreach item="fileId" collection="array" open="(" separator="," close=")">
+            #{fileId}
+        </foreach>
+    </select>
+
 </mapper>

+ 13 - 0
xzl-admin/src/main/resources/mapper/SysFileFolderMapper.xml

@@ -121,4 +121,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         DELETE FROM sys_file WHERE folder_id = #{folderId}
     </delete>
 
+    <select id="selectSysFileFolderListByDeptId" parameterType="Long" resultMap="SysFileFolderResult">
+        <include refid="selectSysFileFolderVo"/>
+        <where>
+            <if test="deptId != null">
+                dept_id = #{deptId}
+            </if>
+        </where>
+    </select>
+
+    <select id="selectDeptIdByFolderId" parameterType="Long" resultType="Long">
+            SELECT dept_id FROM sys_file_folder WHERE folder_id = #{folderId}
+    </select>
+
 </mapper>

+ 9 - 0
xzl-ui/src/api/system/file.js

@@ -65,4 +65,13 @@ export function download(fileId) {
   })
 }
 
+// 下载模板文件
+export function downloadTemplate() {
+  return request({
+    url: '/system/file/template/download',
+    method: 'get',
+    responseType: 'blob'
+  })
+}
+
 

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

@@ -59,9 +59,9 @@ export function checkFolderDeletable(folderId) {
   })
 }
 
-export function folderTreeSelectByDeptId(deptId) {
+export function folderTreeSelectByDeptId() {
   return request({
-    url: '/system/folder/' + deptId,
+    url: '/system/folder/',
     method: 'get'
   })
 }

+ 6 - 1
xzl-ui/src/store/modules/user.js

@@ -9,7 +9,8 @@ const user = {
     avatar: '',
     roles: [],
     permissions: [],
-    NLPAuthData: getNLPAuthData()
+    NLPAuthData: getNLPAuthData(),
+    deptId: '',
   },
 
   mutations: {
@@ -34,6 +35,9 @@ const user = {
     SET_NLPAUTHDATA: (state, authData) => {
       state.NLPAuthData = authData
     },
+    SET_DEPTID: (state, deptId) => {
+      state.deptId = deptId
+    }
   },
 
   actions: {
@@ -85,6 +89,7 @@ const user = {
           commit('SET_ID', user.userId)
           commit('SET_NAME', user.userName)
           commit('SET_AVATAR', avatar)
+          commit('SET_DEPTID', user.deptId)
           resolve(res)
         }).catch(error => {
           reject(error)

+ 147 - 204
xzl-ui/src/views/fileTree/folder/index.vue

@@ -1,4 +1,4 @@
-<template>
+<template xmlns="http://www.w3.org/1999/html">
   <div class="app-container">
     <el-row :gutter="20">
       <!--文件夹数据-->
@@ -25,8 +25,9 @@
             highlight-current
             @node-click="handleNodeClick"
           >
-            <template #default="{ node, data }">
-  <span class="custom-tree-node" style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
+            <template #default="{data }">
+  <span class="custom-tree-node"
+        style="display: flex; justify-content: space-between; align-items: center; width: 100%;">
     <span style="display: flex; align-items: center;">
       <!-- 文件夹图标 -->
       <svg x="1750230337349" class="icon" viewBox="0 0 1024 1024"
@@ -43,12 +44,12 @@
       </svg>
 
       <!-- 文件夹名称 -->
-       <span style="margin-left: 6px;">{{ data.label}}</span>
+       <span style="margin-left: 6px;">{{ data.label }}</span>
     </span>
 
-      <!-- 文件操作 -->
+    <!-- 文件操作 -->
      <span class="tree-node-actions" @click.stop="">
-  <el-dropdown placement="bottom-end" trigger="click"  @visible-change="(visible) => { if (visible) getLevel(data.id); }"
+  <el-dropdown placement="bottom-end" trigger="click" @visible-change="(visible) => { if (visible) getLevel(data.id); }"
   >
     <el-button size="small" type="text" icon="el-icon-setting" style="margin-left: auto;"></el-button>
     <template #dropdown>
@@ -64,6 +65,7 @@
     新增
   </el-button>
 
+
       <!-- 修改按钮始终显示 -->
   <el-button
     size="mini"
@@ -84,6 +86,7 @@
     删除
   </el-button>
 </el-dropdown-menu>
+
       </template>
   </el-dropdown>
 </span>
@@ -146,7 +149,6 @@
               icon="el-icon-upload2"
               size="mini"
               @click="handleImport"
-              v-hasPermi="['system:file:import']"
             >上传文件
             </el-button>
           </el-col>
@@ -157,46 +159,33 @@
               icon="el-icon-download"
               size="mini"
               @click="handleExport"
-              v-hasPermi="['system:file:export']"
             >导出文件
             </el-button>
           </el-col>
           <el-col :span="1.5">
             <el-button
-              type="primary"
+              type="warning"
               plain
               icon="el-icon-delete"
               size="mini"
               @click="handleDelete"
-              v-hasPermi="['system:file:remove']"
             >删除文件
             </el-button>
           </el-col>
           <el-col :span="1.5">
-            <el-button
-              type="info"
-              plain
-              icon="el-icon-download"
-              size="mini"
-              @click="importTemplate"
-            >下载模板
-            </el-button>
-          </el-col>
-          <!-- 超级用户上传模板按钮 -->
-          <el-col :span="1.5">
-            <el-button
-              type="success"
-              plain
-              icon="el-icon-upload2"
-              size="mini"
-              @click="handleUploadTemplate"
-            >上传模板
-            </el-button>
+              <el-button
+                type="success"
+                plain
+                icon="el-icon-upload2"
+                size="mini"
+                @click="handleTemplateDownload"
+              >下载模板
+              </el-button>
           </el-col>
           <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
         </el-row>
 
-<!-- 文件列表 --->
+        <!-- 文件列表 --->
         <el-table v-loading="loading" :data="fileList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="50" align="center"/>
           <el-table-column label="文件编号" type="index" width="50" :index="indexMethod" align="center" key="filelId"
@@ -211,17 +200,17 @@
                            width="120"/>
           <el-table-column label="状态" align="center" key="status" v-if="columns[5].visible">
             <template #default="{ row }">
-  <el-switch
-    v-model="row.status"
-    :active-value="'0'"
-    :inactive-value="'1'"
-    @change="handleStatusChange(row)"
-    active-text="正常"
-    inactive-text="停用"
-    active-color="#13ce66"
-    inactive-color="#ff4949"
-  />
-</template>
+              <el-switch
+                v-model="row.status"
+                :active-value="'0'"
+                :inactive-value="'1'"
+                @change="handleStatusChange(row)"
+                active-text="正常"
+                inactive-text="停用"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+              />
+            </template>
           </el-table-column>
           <el-table-column label="创建时间" align="center" prop="createTime" v-if="columns[6].visible" width="160">
             <template v-slot="scope">
@@ -240,7 +229,6 @@
                 type="text"
                 icon="el-icon-download"
                 @click="handleDownload(scope.row)"
-                v-hasPermi="['system:file:remove']"
               >下载
               </el-button>
             </template>
@@ -256,70 +244,33 @@
         />
       </el-col>
     </el-row>
-
-    <!-- 添加或修改文件配置对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="文件名称" prop="fileName">
-              <el-input v-model="form.fileName" placeholder="请输入文件名称" maxlength="30"/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="创建者" prop="createBy">
-              <el-input v-model="form.createBy" placeholder="请输入创建者" maxlength="20"/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="归属文件夹" prop="folderId">
-              <treeselect v-model="form.folderId" :options="fileOptions" :show-count="true"
-                          placeholder="请选择归属文件夹"/>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="文件类型" prop="fileType">
-              <el-select v-model="form.fileType" placeholder="请选择文件类型" clearable>
-                <el-option label="PDF文档" value="pdf"/>
-                <el-option label="Word文档" value="docx"/>
-                <el-option label="Excel表格" value="xlsx"/>
-                <el-option label="旧版Excel" value="xls"/>
-              </el-select>
-            </el-form-item>
-          </el-col>
-
-          <el-table-column label="状态" prop="status" v-if="columns[4].visible">
-            <template v-slot="{row}">
-              <el-switch
-                v-model="row.status"
-                :active-value="'0'"
-                :inactive-value="'1'"
-                @change="handleStatusChange(row)"
-                active-text="正常"
-                inactive-text="停用"
-                active-color="#13ce66"
-                inactive-color="#ff4949"
-              />
-            </template>
-          </el-table-column>
-        </el-row>
-        <el-row>
-          <el-col :span="24">
-            <el-form-item label="备注">
-              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-
+    <!-- 新增文件夹对话框 -->
+    <el-dialog
+      :title="isAddFolder ? '新增文件夹' : '修改文件夹名称'"
+      :visible.sync="folderDialogVisible"
+      width="500px"
+    >
+      <el-form :model="folderForm" :rules="folderRules" ref="folderForm" label-width="100px">
+        <el-form-item label="文件夹名称" prop="folderName">
+          <el-input v-model="folderForm.folderName" placeholder="请输入文件夹名称" />
+        </el-form-item>
+        <el-form-item label="部门名称" prop="deptId">
+          <el-select v-model="folderForm.deptId" placeholder="请选择部门" clearable>
+            <el-option
+              v-for="dept in deptOptions"
+              :key="dept.deptId"
+              :label="dept.deptName"
+              :value="dept.deptId"
+            />
+          </el-select>
+        </el-form-item>
       </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
+      <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="folderDialogVisible = false">取消</el-button>
+        <el-button type="primary" @click="submitFolderForm">确定</el-button>
+      </span>
+      </template>
     </el-dialog>
 
     <!-- 文件导入对话框 -->
@@ -329,7 +280,7 @@
         :limit="1"
         accept="allowedFileTypes.join(',')"
         :headers="upload.headers"
-        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :action="upload.url "
         :disabled="upload.isUploading"
         :on-progress="handleFileUploadProgress"
         :on-success="handleFileSuccess"
@@ -340,10 +291,6 @@
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
         <div class="el-upload__tip text-center" slot="tip">
-          <div class="el-upload__tip" slot="tip">
-            <el-checkbox v-model="upload.updateSupport"/>
-            是否更新已经存在的文件数据
-          </div>
           <span>仅允许导入{{ allowedFileTypes.join('、') }}格式文件。</span>
         </div>
       </el-upload>
@@ -362,17 +309,17 @@ import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import {
   addFolder,
   delFolder,
-  folderTreeSelect,
   getFolder,
   updateFolder,
   checkFolderDeletable,
   folderTreeSelectByDeptId
 } from "@/api/system/folder";
-import {addFile, delFile, download, listFile, updateFile} from "@/api/system/file";
+import {addFile, delFile, download, downloadTemplate, listFile, updateFile} from "@/api/system/file";
 import dict from "@/utils/dict";
 import {parseTime} from "@/utils/xzl";
 import {updateFileStatus} from "@/api/system/file";
-import {saveAs} from "file-saver";
+import {listDept} from "@/api/system/dept";
+
 
 export default {
   name: "File",
@@ -414,6 +361,29 @@ export default {
       selectedFolderId: null,
       // 文件上传参数
       allowedFileTypes: ['.xlsx', '.xls', '.pdf', '.docx'],
+      // 判断当前用户是否是 deptId == 1
+      isDeptAdmin: false,
+      // 部门数据
+      deptOptions: [],
+      // 新增/修改文件夹对话框是否显示
+      folderDialogVisible: false,
+      // 新增/修改文件夹表单数据
+      folderForm: {
+        parentId: null,
+        folderName: '',
+        deptId: null
+      },
+      // 新增/修改文件夹表单校验规则
+      folderRules: {
+        folderName: [
+          { required: true, message: '文件夹名称不能为空', trigger: 'blur' }
+        ],
+        deptId: [
+          { required: true, message: '请选择部门', trigger: 'change' }
+        ]
+      },
+      // 是否为新增文件夹操作
+      isAddFolder: true,
       // 表单参数
       form: {
         fileId: null,
@@ -440,8 +410,6 @@ export default {
         title: "",
         // 是否禁用上传
         isUploading: false,
-        // 是否更新已经存在的文件数据
-        updateSupport: 0,
         // 设置上传的请求头部
         headers: {Authorization: "Bearer " + getToken()},
         // 上传的地址
@@ -479,7 +447,7 @@ export default {
         fileType: [
           {required: true, message: "文件类型不能为空", trigger: "change"},
           {
-            validator: (rule, value, callback) => {
+            validator: (value, callback) => {
               const allowed = ['pdf', 'docx', 'xlsx', 'xls'];
               if (!value || !allowed.includes(value)) {
                 callback(new Error('请选择合法的文件类型'));
@@ -506,6 +474,7 @@ export default {
   created() {
     this.getList();
     this.getFileTree();
+    this.getDeptList();
     this.getConfigKey("sys.user.initPassword").then(response => {
       this.initPassword = response.msg;
     });
@@ -523,16 +492,8 @@ export default {
         }
       );
     },
-    /** 查询文件夹下拉树结构 */
-    // getFileTree() {
-    //   folderTreeSelect().then(response => {
-    //     this.fileOptions = response.data;
-    //     console.log(this.fileOptions)
-    //   });
-    // },
-
-    getFileTree(deptId){
-      folderTreeSelectByDeptId(deptId).then(response => {
+    getFileTree() {
+      folderTreeSelectByDeptId().then(response => {
         this.fileOptions = response.data;
       })
     },
@@ -579,7 +540,8 @@ export default {
         createBy: null,
         createTime: null,
         updateBy: null,
-        updateTime: null
+        updateTime: null,
+        deptId: null
       };
       this.resetForm("form");
     },
@@ -602,19 +564,6 @@ export default {
       this.single = selection.length !== 1;
       this.multiple = !selection.length;
     },
-    // 更多操作触发
-    handleCommand(command, row) {
-      switch (command) {
-        case "handleResetPwd":
-          this.handleResetPwd(row);
-          break;
-        case "handleAuthRole":
-          this.handleAuthRole(row);
-          break;
-        default:
-          break;
-      }
-    },
     /** 提交按钮 */
     submitForm() {
       this.$refs['form'].validate(valid => {
@@ -662,7 +611,6 @@ export default {
       const file = fileList[0];
       const formData = new FormData();
       formData.append('file', file.raw);
-      formData.append('updateSupport', this.upload.updateSupport);
       formData.append('folderId', this.selectedFolderId);
       this.upload.isUploading = true;
       try {
@@ -674,16 +622,27 @@ export default {
         this.upload.isUploading = false;
       }
     },
-    /** 下载模板操作 */
-    importTemplate() {
-      this.download('system/folder/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
+    /** 模板下载 */
+    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);
+      });
     },
     // 文件上传中处理
-    handleFileUploadProgress(event, file, fileList) {
+    handleFileUploadProgress() {
       this.upload.isUploading = true;
     },
     // 文件上传成功处理
-    handleFileSuccess(response, file, fileList) {
+    handleFileSuccess(response) {
       this.upload.open = false;
       this.$refs.upload.clearFiles();
       if (response.code === 200) {
@@ -693,10 +652,10 @@ export default {
         this.$message.error(response.msg || '文件导入失败');
       }
     },
-    handleFileError(error, file, fileList) {
+    handleFileError() {
       this.$message.error('文件上传失败,请重试');
     },
-    getFolderName(row, column, cellValue, index) {
+    getFolderName(row) {
       return row.folderName
     },
     indexMethod(index) {
@@ -704,27 +663,48 @@ export default {
       return (this.queryParams.pageNum - 1) * this.queryParams.pageSize + index + 1;
     },
 
+    async getDeptList() {
+      try {
+        const response = await listDept();
+        console.log(response);
+        this.deptOptions = response.data;
+        console.log(this.deptOptions);
+      } catch (error) {
+        this.$message.error('获取部门列表失败');
+      }
+    },
+
     // 新增文件夹
     handleAddFolder(data) {
-      this.$prompt('请输入新文件夹名称', '新增文件夹', {
-        confirmButtonText: '确定',
-        cancelButtonText: '取消',
-        inputPattern: /.+/,
-        inputErrorMessage: '文件夹名称不能为空'
-      }).then(({value}) => {
-        const newFolder = {
-          parentId: data.id,
-          folderName: value
-        };
-        addFolder(newFolder).then(() => {
-          this.$modal.msgSuccess("新增成功");
-          this.getFileTree(); // 刷新树
-        });
-      }).catch(() => {
-        this.$message.info("已取消新增");
+      this.isAddFolder = true;
+      this.folderForm = {
+        parentId: data.id,
+        folderName: '',
+        deptId: null
+      };
+      this.folderDialogVisible = true;
+    },
+    // 提交文件夹表单
+    submitFolderForm() {
+      this.$refs.folderForm.validate(valid => {
+        if (valid) {
+          if (this.isAddFolder) {
+            addFolder(this.folderForm).then(() => {
+              this.$modal.msgSuccess('新增成功');
+              this.folderDialogVisible = false;
+              this.getFileTree(); // 刷新树
+            });
+          } else {
+            // 修改文件夹名称逻辑,可根据实际需求完善
+            updateFolder(this.folderForm).then(() => {
+              this.$modal.msgSuccess('修改成功');
+              this.folderDialogVisible = false;
+              this.getFileTree(); // 刷新树
+            });
+          }
+        }
       });
     },
-
     // 获取文件夹层级
     getLevel(folderId) {
       if (this.levels[folderId] !== undefined) {
@@ -798,50 +778,13 @@ export default {
         this.getList(); // 刷新文件列表
       });
     },
-    //  handleDownload(row) {
-    //   // if (!row || !row.fileId) {
-    //   //   this.$message.error('文件 ID 无效,无法下载')
-    //   //   return
-    //   // }
-    //   try {
-    //     // this.loading = true
-    //     const response =  download(row.fileId)
-    //     console.log(response)
-    //     this.parseBlob(response, row.fileId)
-    //     // if (response.status === 200) {
-    //     //   this.parseBlob(response, '文件名.pdf')
-    //     //   // const blob = new Blob([response.data], {type: 'application/octet-stream'})
-    //     //   // saveAs(blob, row.fileName)
-    //     //   this.$message.success('文件下载成功')
-    //     // } else {
-    //     //   this.$message.error('文件下载失败,响应状态码异常')
-    //     // }
-    //   } catch (error) {
-    //     console.error('文件下载出错:', error)
-    //     this.$message.error('文件下载失败,请重试')
-    //   }
-    // },
     async handleDownload(row) {
       try {
         // 等待Promise解析,获取响应对象
         const response = await download(row.fileId) // fileId替换为实际的文件标识
         console.log(response)
-        // 使用若依封装的download方法(推荐,自动处理下载)
-        // const fileName = response.headers['content-disposition']
-        //   ? decodeURIComponent(response.headers['content-disposition'].split('filename=')[1])
-        //   : 'defaultFileName'
         this.parseBlob(response, row.fileName)
 
-        // 或者手动处理(了解原理)
-        /* const blob = response.data
-        const url = window.URL.createObjectURL(blob)
-        const link = document.createElement('a')
-        link.href = url
-        link.download = fileName
-        document.body.appendChild(link)
-        link.click()
-        document.body.removeChild(link)
-        window.URL.revokeObjectURL(url) */
       } catch (error) {
         this.$modal.msgError('下载失败:' + error.message)
       }
@@ -856,6 +799,6 @@ export default {
       document.body.removeChild(link)
       window.URL.revokeObjectURL(url) // 释放内存
     }
-  }
-};
+  },
+}
 </script>