diff --git a/hb-file/src/main/java/com/ruoyi/file/controller/FileController.java b/hb-file/src/main/java/com/ruoyi/file/controller/FileController.java index 6dafadf..69fca28 100644 --- a/hb-file/src/main/java/com/ruoyi/file/controller/FileController.java +++ b/hb-file/src/main/java/com/ruoyi/file/controller/FileController.java @@ -298,7 +298,7 @@ public class FileController { IPage fileList = userFileService.userFileList(null, filePath, currentPage, pageCount); return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal()); } else { - IPage fileList = userFileService.getFileByFileType(Integer.valueOf(fileType), currentPage, pageCount, SecurityUtils.getLoginUser().getUserId()); + IPage fileList = userFileService.getFileByFileType(Integer.valueOf(fileType), currentPage, pageCount, SecurityUtils.getUserId()); return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal()); } } @@ -567,4 +567,21 @@ public class FileController { return RestResult.success().message("修改文件访问范围成功"); } + @ApiOperation(value = "5.6 根据用户角色获取文件列表") + @ApiOperationSupport(order = 6) + @RequestMapping(value = "/getfilelistbyrole", method = RequestMethod.GET) + @ResponseBody + public RestResult getFileListByRole( + @Parameter(description = "文件类型", required = true) String fileType, + @Parameter(description = "文件路径", required = false) String filePath, + @Parameter(description = "当前页", required = true) long currentPage, + @Parameter(description = "页面数量", required = true) long pageCount){ + if ("0".equals(fileType)) { + IPage fileList = userFileService.userFileListByRole(SecurityUtils.getUserId(), filePath, currentPage, pageCount); + return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal()); + } else { + IPage fileList = userFileService.getFileByFileTypeAndRole(Integer.valueOf(fileType), currentPage, pageCount, SecurityUtils.getUserId()); + return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal()); + } + } } diff --git a/hb-file/src/main/java/com/ruoyi/file/domain/UserFile.java b/hb-file/src/main/java/com/ruoyi/file/domain/UserFile.java index e67968b..77ebf2d 100644 --- a/hb-file/src/main/java/com/ruoyi/file/domain/UserFile.java +++ b/hb-file/src/main/java/com/ruoyi/file/domain/UserFile.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.qiwenshare.common.util.DateUtil; +import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.file.io.QiwenFile; import lombok.Data; diff --git a/hb-file/src/main/java/com/ruoyi/file/mapper/UserFileMapper.java b/hb-file/src/main/java/com/ruoyi/file/mapper/UserFileMapper.java index e116050..5ce14f0 100644 --- a/hb-file/src/main/java/com/ruoyi/file/mapper/UserFileMapper.java +++ b/hb-file/src/main/java/com/ruoyi/file/mapper/UserFileMapper.java @@ -14,6 +14,9 @@ public interface UserFileMapper extends BaseMapper { List selectUserFileByLikeRightFilePath(@Param("filePath") String filePath, @Param("userId") Long userId); IPage selectPageVo(Page page, @Param("userFile") UserFile userFile, @Param("fileTypeId") Integer fileTypeId); + + IPage selectPageVoByRole(Page page, @Param("userFile") UserFile userFile, @Param("fileTypeId") Integer fileTypeId, @Param("scopeParamSql") String scopeParamSql); + Long selectStorageSizeByUserId(@Param("userId") Long userId); List selectByUserFileId(String userFileId); diff --git a/hb-file/src/main/java/com/ruoyi/file/service/IUserFileService.java b/hb-file/src/main/java/com/ruoyi/file/service/IUserFileService.java index 4ecafd0..574a0a3 100644 --- a/hb-file/src/main/java/com/ruoyi/file/service/IUserFileService.java +++ b/hb-file/src/main/java/com/ruoyi/file/service/IUserFileService.java @@ -14,10 +14,13 @@ public interface IUserFileService extends IService { List selectSameUserFile(String fileName, String filePath, String extendName, Long userId); IPage userFileList(Long userId, String filePath, Long beginCount, Long pageCount); + + IPage userFileListByRole(Long userId, String filePath, Long beginCount, Long pageCount); void updateFilepathByUserFileId(String userFileId, String newfilePath, Long userId); void userFileCopy(Long userId, String userFileId, String newfilePath); IPage getFileByFileType(Integer fileTypeId, Long currentPage, Long pageCount, Long userId); + IPage getFileByFileTypeAndRole(Integer fileTypeId, Long currentPage, Long pageCount, Long userId); List selectUserFileListByPath(String filePath, Long userId); List selectFilePathTreeByUserId(Long userId); void deleteUserFile(String userFileId, Long sessionUserId); diff --git a/hb-file/src/main/java/com/ruoyi/file/service/impl/UserFileServiceImpl.java b/hb-file/src/main/java/com/ruoyi/file/service/impl/UserFileServiceImpl.java index 8436c2c..e4a0e64 100644 --- a/hb-file/src/main/java/com/ruoyi/file/service/impl/UserFileServiceImpl.java +++ b/hb-file/src/main/java/com/ruoyi/file/service/impl/UserFileServiceImpl.java @@ -10,6 +10,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qiwenshare.common.constant.FileConstant; import com.qiwenshare.common.util.DateUtil; +import com.ruoyi.common.core.domain.entity.SysRole; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.file.dto.file.UserFileDTO; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; @@ -23,8 +27,10 @@ import com.ruoyi.file.mapper.UserFileMapper; import com.ruoyi.file.service.IUserFileService; import com.ruoyi.file.util.FileTreeSelect; import com.ruoyi.file.vo.file.FileListVO; +import com.ruoyi.system.mapper.SysUserMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -39,6 +45,27 @@ import java.util.stream.Collectors; @Service @Transactional(rollbackFor = Exception.class) public class UserFileServiceImpl extends ServiceImpl implements IUserFileService { + + /** + * 全部文件权限 + */ + public static final String FILE_SCOPE_ALL = "1"; + + /** + * 自定义文件权限 + */ + public static final String FILE_SCOPE_CUSTOM = "2"; + + /** + * 仅公开文件权限 + */ + public static final String FILE_SCOPE_PUBLIC = "3"; + + /** + * 仅本人文件权限 + */ + public static final String FILE_SCOPE_SELF = "4"; + @Resource UserFileMapper userFileMapper; @Resource @@ -47,7 +74,8 @@ public class UserFileServiceImpl extends ServiceImpl i FileDealComp fileDealComp; @Resource SysRoleUserFileMapper roleUserFileMapper; - + @Autowired + SysUserMapper userMapper; public static Executor executor = Executors.newFixedThreadPool(20); @@ -90,6 +118,22 @@ public class UserFileServiceImpl extends ServiceImpl i return userFileMapper.selectPageVo(page, userFile, null); } + @Override + public IPage userFileListByRole(Long userId, String filePath, Long currentPage, Long pageCount) { + Page page = new Page<>(currentPage, pageCount); + UserFile userFile = new UserFile(); + LoginUser sessionUserBean = SecurityUtils.getLoginUser(); + if (userId == null) { + userFile.setUserId(sessionUserBean.getUserId()); + } else { + userFile.setUserId(userId); + } + + userFile.setFilePath(URLDecoder.decodeForPath(filePath, StandardCharsets.UTF_8)); + + return userFileMapper.selectPageVoByRole(page, userFile, null, buildScopeParamSql(userId, "a")); + } + @Override public void updateFilepathByUserFileId(String userFileId, String newfilePath, Long userId) { UserFile userFile = userFileMapper.selectById(userFileId); @@ -183,6 +227,15 @@ public class UserFileServiceImpl extends ServiceImpl i return userFileMapper.selectPageVo(page, userFile, fileTypeId); } + @Override + public IPage getFileByFileTypeAndRole(Integer fileTypeId, Long currentPage, Long pageCount, Long userId) { + Page page = new Page<>(currentPage, pageCount); + + UserFile userFile = new UserFile(); + userFile.setUserId(userId); + return userFileMapper.selectPageVoByRole(page, userFile, fileTypeId, buildScopeParamSql(userId, "a")); + } + @Override public List selectUserFileListByPath(String filePath, Long userId) { LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); @@ -359,4 +412,48 @@ public class UserFileServiceImpl extends ServiceImpl i return null; } + /** + * 构造文件范围查询参数sql + * + * @param userId 用户id + * @param userFileAlias 用户文件表别名 + * @return + */ + private String buildScopeParamSql(Long userId, String userFileAlias) { + if (userId == null) { + throw new ServiceException("用户未登录"); + } + SysUser user = userMapper.selectUserById(userId); + if (user.isAdmin()) { + return ""; + } + StringBuilder sqlString = new StringBuilder(); + List conditions = new ArrayList(); + + for (SysRole role : user.getRoles()) { + String fileScope = role.getFileScope(); + if (!FILE_SCOPE_CUSTOM.equals(fileScope) && conditions.contains(fileScope)) { + continue; + } + if (FILE_SCOPE_ALL.equals(fileScope)) { + return ""; + } else if (FILE_SCOPE_CUSTOM.equals(fileScope)) { + sqlString.append(StringUtils.format( + " OR {}.userFileId IN ( SELECT userFileId FROM sys_role_userfile WHERE role_id = {} ) ", userFileAlias, + role.getRoleId())); + } else if (FILE_SCOPE_PUBLIC.equals(fileScope)) { + sqlString.append(StringUtils.format(" OR {}.isPublic = 1", userFileAlias)); + } else if (FILE_SCOPE_SELF.equals(fileScope)) { + sqlString.append(StringUtils.format(" OR {}.userId = {} ", userFileAlias, user.getUserId())); + } + conditions.add(fileScope); + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + return " AND (" + sqlString.substring(4) + ")"; + } else { + return " AND " + StringUtils.format("{}.userId = {} ", userFileAlias, user.getUserId()); + } + } + } diff --git a/hb-file/src/main/resources/mapper/UserFileMapper.xml b/hb-file/src/main/resources/mapper/UserFileMapper.xml index a3cce22..82b5aec 100644 --- a/hb-file/src/main/resources/mapper/UserFileMapper.xml +++ b/hb-file/src/main/resources/mapper/UserFileMapper.xml @@ -86,6 +86,44 @@ ORDER BY isDir desc + +