文件分享功能 - MVC架构详细流程图

📱 前端层(MVC → View层:视图展示与用户交互)
双角色视图组件(分享者+访问者)
【角色1:网盘分享者视图】
  • 操作入口:网盘文件列表中“分享”按钮(绑定目标文件/文件夹ID)
  • 分享配置项:
    • 提取码设置:自定义输入框(可选)、“系统自动生成”单选框(默认)
    • 时效设置:下拉选择(1小时/1天/7天/30天/永久有效),默认7天
  • 交互项:“生成分享”按钮、“取消分享”按钮、“复制链接/提取码”按钮
  • 展示项:生成成功提示、分享链接展示框、提取码展示框、分享有效期提示
  • 前端逻辑:校验自定义提取码格式(如4-6位数字/字母)、封装分享请求参数
【角色2:链接访问者视图】
  • 链接访问页:接收URL路径参数(分享唯一标识)
  • 状态展示:
    • 失效提示:分享不存在/已过期/已被删除(红色提示文案)
    • 有效场景:提取码输入表单(输入框+“确认提取”按钮)
  • 文件列表页:提取码验证通过后展示分享的文件/文件夹列表(文件名、大小、格式、下载按钮)
  • 前端逻辑:页面加载时自动携带路径参数请求后端校验分享有效性、提取码提交与结果反馈
🎯 后端Controller层(MVC → Controller层:请求分发与响应封装)
文件分享Controller(四大核心接口)
接口1:/api/share/generate(生成分享链接/提取码)
  • 接收参数:用户ID、文件/文件夹ID、自定义提取码(可选)、时效类型、时效时长
  • 核心职责:校验用户登录状态、封装参数传递给Service、接收分享结果(链接/提取码/失败信息),封装JSON响应返回给前端
接口2:/api/share/validate(分享链接有效性校验)
  • 接收参数:分享唯一标识(从URL路径中获取)
  • 核心职责:传递标识给Service,接收“分享有效/无效(原因)”结果,封装响应返回前端
接口3:/api/share/verify-code(提取码验证)
  • 接收参数:分享唯一标识、用户输入的提取码
  • 核心职责:传递参数给Service,接收“提取码正确/错误”结果,封装响应返回前端
接口4:/api/share/file-list(获取分享文件列表)
  • 接收参数:分享唯一标识
  • 核心职责:传递标识给Service,接收文件列表数据,封装响应返回前端

核心特性:无业务逻辑,仅负责请求路由、参数过滤、响应标准化,解耦前端与业务层

🔧 后端Model层(MVC → Model层:业务逻辑+数据访问)
1. 文件分享Service(业务逻辑层:核心业务处理)
【业务1:生成分享链接/提取码】
  • 步骤1:权限校验
    • 校验当前用户是否为目标文件/文件夹的所有者,无权限则返回“无法分享他人文件”结果
  • 步骤2:提取码处理
    • 自定义提取码:校验格式合法性(4-6位数字/字母组合),合法则直接使用
    • 系统生成:生成随机4位数字提取码(如8369、A2B5),确保唯一性
  • 步骤3:分享信息封装
    • 生成分享唯一标识(如UUID/雪花算法ID,作为链接路径参数)
    • 计算过期时间:根据时效设置(如选择7天,则当前时间+7*24小时)
    • 封装分享记录(标识、用户ID、文件ID、提取码、过期时间、创建时间、状态(有效))
  • 步骤4:生成分享链接
    • 拼接基础域名+分享标识(如https://pan.example.com/share/xxxx-xxxx-xxxx)
  • 步骤5:数据存储与结果返回
    • 调用DAO层存入分享记录
    • 返回分享结果(链接、提取码、有效期)给Controller
【业务2:分享链接有效性校验】
  • 步骤1:查询分享记录
    • 根据分享唯一标识,调用DAO层查询分享记录
  • 步骤2:有效性判断(多维度校验)
    • 校验1:分享记录是否存在(不存在则返回“该分享链接不存在”)
    • 校验2:分享状态是否为有效(已删除则返回“该分享已被取消”)
    • 校验3:是否已过期(当前时间>过期时间则返回“该分享已过期”)
    • 校验通过:返回“分享有效”结果,携带分享基础信息
【业务3:提取码验证】
  • 步骤1:根据分享标识查询提取码
  • 步骤2:对比用户输入的提取码与存储的提取码是否一致
    • 一致:返回“提取码正确”结果,允许获取文件列表
    • 不一致:返回“提取码错误,请重新输入”结果
【业务4:获取分享文件列表】
  • 步骤1:根据分享标识查询关联的文件/文件夹ID
  • 步骤2:调用文件DAO层查询文件详情(文件名、大小、格式、存储路径等)
  • 步骤3:封装文件列表数据,返回给Controller

输出:返回各类业务处理结果(权限不足/分享成功/链接无效/提取码错误/文件列表数据等)

2. DAO层(数据访问层:数据库交互)
1. 分享信息DAO
  • 核心职责:仅负责分享记录的数据库交互,无业务逻辑
  • 核心接口:
    • insertShareRecord(ShareRecord shareRecord):插入分享记录到数据库
    • findShareByUniqueId(String uniqueId):根据分享唯一标识查询分享记录
    • updateShareStatus(String uniqueId, Integer status):更新分享状态(有效/已删除)
  • 实现方式:通过MyBatis/JPA执行SQL,操作MySQL等关系型数据库
2. 文件信息DAO
  • 核心职责:仅负责文件信息的数据库交互,无业务逻辑
  • 核心接口:
    • findFileInfoByFileId(Long fileId, Long userId):根据文件ID+用户ID查询文件详情
    • findFileListByFolderId(Long folderId, Long userId):根据文件夹ID查询文件列表
    • findShareFileList(String uniqueId):根据分享标识查询关联的所有文件/文件夹详情
  • 实现方式:通过MyBatis/JPA执行SQL,关联用户文件表、文件夹表查询数据
3. 数据存储层 + 辅助功能组件
  • 1. 数据存储模块
    • 关系型数据库(如MySQL):
      • 分享信息表:存储分享唯一标识、用户ID、文件/文件夹ID、提取码、过期时间、创建时间、状态
      • 用户文件表:存储用户文件基础信息(文件ID、用户ID、文件名、大小、格式、存储路径、文件夹ID)
      • 文件夹表:存储文件夹基础信息(文件夹ID、用户ID、文件夹名、创建时间)
    • 缓存(可选,如Redis):缓存热门分享记录(高频访问的分享链接有效性信息),提升校验性能
  • 2. 辅助工具组件
    • 唯一标识生成工具:生成UUID/雪花算法ID(作为分享链接的唯一路径参数)
    • 提取码生成工具:生成随机4-6位数字/字母组合(系统自动生成提取码时使用)
    • 时间计算工具:根据时效设置计算分享过期时间(如当前时间+指定时长)