SpringBoot+Vue3 企业云盘系统设计:文件上传+共享权限+收藏分类+5GB空间控制——从“网盘孤岛”到“企业知识底座”

📅 2026/7/21 10:02:15
SpringBoot+Vue3 企业云盘系统设计:文件上传+共享权限+收藏分类+5GB空间控制——从“网盘孤岛”到“企业知识底座”
SpringBootVue3 企业云盘系统设计文件上传共享权限收藏分类5GB空间控制——从“网盘孤岛”到“企业知识底座”文档地址http://ruoyioffice.com | 源码1·GitHubruoyi-office | 源码2·GitCoderuoyi-office | 源码3·Giteeruoyi-office | 微信17156169080备注「RuoYi Office」很多企业都有文件管理需求但真正用起来时最常见的状态却是制度文档在网盘、会议纪要在群文件、模板在个人桌面、部门资料在共享盘、审批附件在流程系统。文件明明都“在线化”了知识却依然是碎片化的。RuoYi Office 的企业云盘不是单纯提供一个上传下载页面而是通过“文件主数据 分享权限 收藏视图 存储统计”把文件管理变成了企业协同办公的底层能力。▲ 企业云盘架构全景前台以我的文件、共享文件、我的收藏为入口后台由文件主表、权限表、收藏表和统一存储服务协同支撑兼顾个人管理与团队共享引言企业云盘到底难在哪“上传个文件还不简单吗”如果只是个人网盘这句话没错但一旦进入企业场景问题马上变得复杂。文件不只是“存进去”就完了企业需要知道文件属于谁、归属哪个部门、是不是共享过、能不能收藏、谁有管理权限。共享不是简单发链接有些文件只允许查看有些允许协作者管理有些共享的是单个文件有些共享的是文件夹还要决定子目录是否继承权限。空间和权限要可控如果没有存储配额控制企业云盘很快就会变成“员工私人影视库”如果没有所有者约束任何人都能分享别人文件安全边界会瞬间失守。视图不是只有“我的文件”员工还会关心“别人共享给我的文件”“我收藏过的高频文档”如果系统只有目录树没有多视图切换使用体验会很差。文件系统必须和 OA 场景打通制度、模板、公文附件、会议纪要、审批材料最终都应该在企业统一平台里沉淀而不是继续散落在多个系统。典型问题传统做法后果文件散落在多个系统群文件、个人盘、共享目录混用找不到最新版知识碎片化权限过粗只有“能看/不能看”协作效率低安全边界也不清晰共享无法继承文件夹下子文件都要手动配权限运维成本极高无空间控制文件随便传存储失控系统越跑越重收藏能力缺失靠路径记忆常用文档高频资料反复找不到本文就从 RuoYi Office 的企业云盘模块出发拆解一套真正适合企业协作的文件管理设计。一、业务设计云盘不是网盘而是协同底座1.1 企业云盘的三类核心视图RuoYi Office 没把云盘只做成一个目录页而是抽象成三种视图视图作用我的文件管理自己拥有的文件和文件夹共享文件查看别人共享给我的内容我的收藏快速访问高频使用文件这三个视图解决的是三种完全不同的场景管理自己的资料协同处理别人共享的资料快速复用常用资料1.2 共享权限为什么必须独立建模企业云盘最核心的不是文件本身而是“谁能以什么方式接触到文件”。RuoYi Office 专门设计了oa_file_permission来表达共享关系字段维度含义分享对象按人员 / 按组织权限级别仅查看 / 可管理继承策略是否向子文件夹继承路径信息共享路径、根分享 ID这样共享就从“发一个文件链接”升级成了“有治理能力的协同授权”。1.3 文件主数据和二进制内容为什么分离系统里真正的“文件”其实有两部分二进制内容真正的 PDF、Word、图片、视频。元数据名称、大小、后缀、类别、所有者、所属部门、共享状态等。RuoYi Office 通过FileApi把内容写入统一文件存储再把元数据写入oa_file_info。这种做法让云盘既能复用已有存储能力又能在业务层实现权限和统计。二、系统设计三张表如何协同支撑企业云盘2.1 模块组成企业云盘位于OA → 企业云盘目录下核心由三部分组成模块功能定位面向角色文件主表描述文件/文件夹元数据全体员工共享权限表描述分享对象和权限文件所有者 / 协作者收藏表记录个人收藏关系全体员工2.2 核心设计决策决策点方案理由文件建模文件和文件夹共用一张表目录树结构统一前端查询简单fileType0文件夹, 1文件便于区分目录节点与叶子节点存储内容交给基础设施FileApi避免业务模块重复造存储轮子空间限制单文件 100MB、总空间 5GB保证企业盘可控不滥用分享模型独立权限表便于支持多对象、多权限级别收藏逻辑独立表 物理删除避免唯一索引冲突2.3 数据结构关系表名职责关键字段oa_file_info文件/文件夹元数据parent_id,file_type,file_name,file_url,owner_id,is_sharedoa_file_permission文件共享权限file_id,share_type,target_id,permission,inherit_permission,share_path,root_share_idoa_file_favorite个人收藏file_id,user_id三、客户端功能实现PC 主控台 移动端随身取用企业云盘的「治理能力」上传配额、批量整理、分享给组织/人员、文件夹继承等主要体现在 PC 端的Vue3 / Vben管理中台移动端则沿用同一套 OA 文件接口把工作场景延伸到通勤、外出审批、现场确认等碎片化时间——一端治理、多端消费避免再在微信群、个人盘里复制一份附件。下方先覆盖 PC再单独说明移动端能力边界与交互差异。3.1 企业云盘主页面PC▲ 企业云盘主页面左侧展示存储空间、文件视图和按分类筛选右侧是当前文件列表与操作区同时具备“个人盘”和“团队协作空间”的双重属性这个页面非常像大家熟悉的网盘产品但它多了典型的企业属性左侧不只是目录树还有空间统计、共享文件、我的收藏、分类筛选。右侧不只是上传下载还有打开、重命名、收藏、分享、删除等协作操作。文件所有者、是否共享、创建时间等元数据都直接可见。3.2 文件分享弹窗▲ 文件分享弹窗支持按人员或按组织分享权限可设为仅查看或可管理并可选择是否向子文件夹继承权限这才是真正适合企业协作的共享模型从这个弹窗就能看出它不是“发个链接”那么简单分享对象可以是员工也可以是组织。权限分为“仅查看”和“可管理”。文件夹共享可以选择是否把权限继承到子节点。支持备注方便说明分享背景。3.3 为什么这一页比普通网盘更像企业系统因为普通网盘关注的是“你自己怎么存”企业云盘更关注的是“团队如何在安全边界内协作”。3.4 移动端企业云盘UniApp移动端实现位于ruoyi-office-uniapp页面pages-oa/file调用与 PC 一致的后端能力/oa/file/...列表、共享树根、共享子路径、收藏列表等。数据模型与安全策略与上文三张表完全一致只是把界面压缩成适合做「单手操作」的流程。▲ 移动端企业云盘顶部我的文件 / 共享文件 / 我的收藏与 PC 三类视图对齐列表区展示图标、文件名、所有者与大小文件夹进入下级文件可走下载或系统预览链路移动端当前重点能力与交互要点能力说明三视图 Tab与 PC「我的文件、共享文件、我的收藏」一一对应切换 Tab 会重置导航栈并回到各视图根级避免路径串台。面包屑进入子文件夹后展示可横向滚动的层级面包屑点击某一节可快速回到上层与共享目录下的rootShareId/parentId状态联动。共享目录语义与 PC 相同根级拉共享清单进入文件夹后调用「共享子文件」接口沿继承路径下钻保证员工在手机上看到的树与桌面端同源。收藏视图根级列出收藏条目若收藏的是文件夹进入子层时退回「我的文件」侧查询接口罗列子节点兼顾收藏入口与目录浏览。下拉刷新列表支持scroll-view下拉刷新弱网下也便于让用户主动重试加载。文件取用文件夹点击进层级文件点击在无地址时提示「暂不支持预览」。有fileUrl时H5可走新窗口打开直链与 PCwindow.open思路一致小程序 / App走downloadFileopenDocument由系统预览器接管常见 Office / PDF具体格式支持取决于运行平台。图标与可读性按后缀区分 PDF、Office、图片、压缩包等与文件夹样式在长列表里快速扫一眼即可定位类型。深链 Tab实现细节页面onLoad支持 ?tabmy与 PC有意区分的定位可自行截屏配文说明上传新建、分享弹窗按人员/组织、查看/管理、继承子目录、重命名删除、左侧空间环形统计与分类筛选等「管理类」交互仍以 PC 为主移动端不写第二套表单可避免小屏校验与权限控件维护成本翻倍。若产品后续要在 App 内补齐「拍照上传」「转发到会话」等能力仍可复用同一套uploadFile配额校验与FileApi存储只要把入口收到独立页或浮动按钮即可。▲ 共享视图下钻或面包屑导航与 PC「共享路径」语义同源便于在手机上核对他人共享的资料结构四、后端核心实现4.1 上传文件先校验配额再交给统一存储服务FileInfoServiceImpl.uploadFile()的开头几步非常关键publicLonguploadFile(MultipartFilefile,LongparentId)throwsException{longmaxSize100*1024*1024;// 100MBif(file.getSize()maxSize){thrownewIllegalArgumentException(上传文件不能超过100M请压缩后上传);}LonguserIdSecurityFrameworkUtils.getLoginUserId();longmaxStorageSize5L*1024*1024*1024;// 5GBLongtenantIdTenantContextHolder.getTenantId();LongusedSizefileInfoMapper.selectTotalFileSizeByOwnerId(userId,tenantId);if(usedSizefile.getSize()maxStorageSize){thrownewIllegalArgumentException(存储空间不足);}byte[]contentIoUtil.readBytes(file.getInputStream());StringfileUrlfileApi.createFile(content,file.getOriginalFilename(),oa/cloud,file.getContentType());}这里体现了三个企业级设计点单文件限制防止大文件滥用。用户级总空间限制防止整体存储失控。二进制内容交给统一存储服务不在业务库里硬塞大对象。4.2 文件元数据建模目录树、分类、所有者都在一张表里上传完内容后系统继续写入元数据FileInfoDOfileInfonewFileInfoDO();fileInfo.setParentId(parentId);fileInfo.setFileType(1);// 1表示文件0表示文件夹fileInfo.setFileName(originalFilename);fileInfo.setFileExtension(fileExtension);fileInfo.setFileSuffix(fileSuffix);fileInfo.setFileCategory(fileCategory);fileInfo.setFileSize(file.getSize());fileInfo.setFileUrl(fileUrl);fileInfo.setOwnerId(userId);fileInfo.setOwnerName(systemService.getUserNickname(userId));fileInfoMapper.insert(fileInfo);这说明云盘的关键不是“存了个 URL”而是把企业管理真正关心的元信息一起结构化存下来。4.3 分享文件只有所有者才能分享FileShareServiceImpl.shareFile()的第一步不是插入权限而是先做所有权校验publicIntegershareFile(FileShareReqVOshareReqVO){FileInfoDOfileInfofileInfoMapper.selectById(shareReqVO.getFileId());if(fileInfonull){throwServiceExceptionUtil.exception(FILE_INFO_NOT_EXISTS);}LongcurrentUserIdSecurityFrameworkUtils.getLoginUserId();if(!fileInfo.getOwnerId().equals(currentUserId)){throwServiceExceptionUtil.exception(FILE_SHARE_NOT_OWNER);}// ...}这条规则非常重要。企业协作可以灵活但权限边界不能模糊。4.4 分享记录不仅保存权限还要计算共享路径这段逻辑决定了共享视图能不能正确展示目录层级if(existingPermission!null){existingPermission.setPermission(target.getPermission());existingPermission.setInheritPermission(shareReqVO.getInheritPermission());filePermissionMapper.updateById(existingPermission);}else{FilePermissionDOpermissionnewFilePermissionDO();permission.setFileId(shareReqVO.getFileId());permission.setShareType(target.getShareType());permission.setTargetId(target.getTargetId());permission.setPermission(target.getPermission());permission.setInheritPermission(shareReqVO.getInheritPermission());calculateSharePath(permission,fileInfo);filePermissionMapper.insert(permission);}这不是简单的“授权一条记录”而是在为后续共享目录浏览、继承权限和根共享节点定位打基础。4.5 共享路径计算支持“共享文件夹里的子文件”正确定位calculateSharePath()体现了共享目录语义privatevoidcalculateSharePath(FilePermissionDOpermission,FileInfoDOfileInfo){ListStringpathPartsnewArrayList();FileInfoDOcurrentfileInfo;while(current!nullcurrent.getParentId()!0){pathParts.add(0,current.getFileName());FilePermissionDOparentSharefilePermissionMapper.selectByFileIdAndTarget(current.getId(),permission.getShareType(),permission.getTargetId());if(parentShare!nullparentShare.getRootShareId()null){permission.setRootShareId(current.getId());break;}currentfileInfoMapper.selectById(current.getParentId());}}这意味着员工点开“共享文件”时不会只看到一堆散乱文件而能沿着共享路径继续下钻。4.6 收藏逻辑物理删除比逻辑删除更稳收藏取消时代码选择了物理删除publicvoidunfavoriteFile(LongfileId,LonguserId){LongtenantIdTenantContextHolder.getTenantId();fileFavoriteMapper.physicalDeleteByFileIdAndUserId(fileId,userId,tenantId);}为什么这么做因为收藏关系通常带唯一索引如果只是逻辑删除后面再次收藏时很容易撞唯一约束。这个细节非常工程化。五、前端交互实现企业云盘为什么更好用5.1 三种视图共用一个页面状态机前端通过viewMode区分list / shared / favoriteconstviewModereffavorite|list|shared(list);constcurrentParentIdrefnumber(0);constpathStackrefArray{id:number;name:string}([{id:0,name:我的文件},]);constsharedFileStateref({rootShareId:0,parentId:0,});这让“我的文件”“共享文件”“我的收藏”三种完全不同的业务视图可以在一个统一页面里自然切换。5.2 下载逻辑很克制文件直接打开文件夹禁止下载functionhandleDownload(row:FileApi.FileInfo){if(row.fileType0){message.warning(文件夹不支持下载);return;}if(row.fileUrl){window.open(row.fileUrl,_blank);}}这段逻辑很朴素但非常符合用户心智文件夹不是下载对象文件才是。5.3 存储统计让云盘更像“可治理资源”页面里直接展示了已用空间总空间文件数量共享文件数量这种设计会让员工天然意识到“企业云盘不是无限资源”从产品层面就完成了一次轻量治理。六、RuoYi Office 的创新设计6.1 把“个人盘”和“团队协作盘”做在同一页面不强迫用户在多个入口间切换是企业级产品体验非常重要的一点。6.2 分享权限不是布尔值而是完整权限模型按人员、按组织、仅查看、可管理、是否继承这让云盘真正具备团队协作能力。6.3 文件元数据天然带组织属性所有者、部门、共享状态、分类都在元数据层显式保存为后续统计、治理、审计和 AI 知识化打下基础。6.4 云盘能力天生适合与 OA / AI 结合一旦企业云盘建好后续制度库、审批附件、知识库、AI 文档摘要、在线预览等能力都更容易叠加。七、数据结构7.1oa_file_info字段含义设计要点parent_id父节点ID目录树基础file_type文件/文件夹0文件夹, 1文件file_name文件名展示与检索核心字段file_category文件分类支撑按文档、图片、视频等筛选file_url文件地址指向统一存储服务owner_id所有者权限与统计基础is_shared是否共享快速标记共享状态7.2oa_file_permission字段含义设计要点share_type分享类型按人员 / 按组织target_id目标对象用户或部门标识permission权限级别仅查看 / 可管理inherit_permission是否继承文件夹共享关键字段share_path共享路径共享视图导航基础root_share_id根共享节点共享目录树定位7.3oa_file_favorite字段含义设计要点file_id文件ID指向被收藏文件user_id用户ID个人收藏关系八、技术亮点总结设计要点实现方式价值存储与业务解耦FileApi 元数据表易扩展、易治理共享权限建模oa_file_permission真正支持团队协作文件夹权限继承inheritPermission 路径计算降低授权维护成本用户空间限制100MB 单文件 5GB 总空间防止滥用收藏独立建模oa_file_favorite高频资料快速访问多视图统一页面我的文件 / 共享文件 / 我的收藏用户体验更自然移动端轻量化入口UniApppages-oa/file复用 OA 接口 Tab/面包屑/refreshPC 治理、掌上查阅避免多端重复建模九、快速体验9.1 操作路径PC 企业云盘OA → 企业云盘移动端UniApp工作台或 OA 菜单进入企业云盘具体入口以各端菜单配置为准页面路径pages-oa/file9.2 推荐体验流程PC上传一个测试文档到“我的文件”。新建一个文件夹并整理资料目录。对某个文件发起分享分别尝试“按人员分享”和“按组织分享”。在分享弹窗里切换“仅查看/可管理”权限。收藏一个常用文件切换到“我的收藏”视图查看。查看左侧空间统计和分类筛选效果。9.3 源码仓库类型路径前端ruoyi-office-vben/apps/web-antd/src/views/oa/file后端ruoyi-office/****-module-oa/.../service/file移动端ruoyi-office-uniapp/src/pages-oa/file9.4 移动端UniApp体验建议编译运行ruoyi-office-uniapp从菜单进入企业云盘页。在「我的文件 / 共享文件 / 我的收藏」三个 Tab 间切换确认列表与 PC 同源。在「共享文件」中进入被共享的文件夹用面包屑返回上级核对与 PC「共享视图」是否一致。点击 PDF 或 WordH5观察新窗口或直链打开微信小程序观察是否可调起系统文档预览。下拉刷新列表确认可手动重载。结语企业云盘真正的价值从来不是“能存文件”而是把文件变成企业知识、协作和流程的底层载体。RuoYi Office 这套设计之所以值得借鉴不在于页面像不像某个成熟网盘而在于它把企业真正关心的东西都做进去了所有权、共享权限、继承策略、配额治理、多视图访问、跨端协同。也正因为如此它才能继续往知识库、AI 助手、在线文档预览、审批附件联动这些更高层能力演进。想要体验 RuoYi Office 的强大功能在线演示http://ruoyioffice.com/web/账号 admin / admin123技术咨询添加17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下