# 基于云存储的个人文件管理系统 **Repository Path**: admin6-23/Cloud-DMS ## Basic Information - **Project Name**: 基于云存储的个人文件管理系统 - **Description**: 基于云存储的个人文件管理系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-06-24 - **Last Updated**: 2026-01-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, SpringBoot ## README # 小组成员 + 成员A(组长) + 成员B(组员) + 成员C(组员) # 小组课题(Cloud-DMS 云存储数据管理系统 ) _(基于题目十:基于云存储的个人文件管理系统的设计与实现)_
云存储指的是一种在线数据存储解决方案,它允许用户通过网络(通常是互联网)将数据存储在远程服务器上,而不是在本地计算机或物理存储设备上。云存储服务通常由第三方提供商提供,用户可以通过Web界面、应用程序或API来访问和管理存储在云端的数据。 ## 项目背景与意义 ### 应用背景 在当今数字化时代,云存储已成为各类应用程序的核心功能模块。无论是: + **聊天软件**:如微信、QQ中的文档分享、图片视频传输 + **游戏平台**:Steam、Epic等平台的玩家账户云存档同步 + **办公协作**:腾讯文档、飞书等办公应用的多人协作编辑 + **网盘服务**:百度网盘、阿里云盘的文件存储与分享 + **开发平台**:GitHub、GitLab的代码仓库管理 这些应用都依赖于成熟的云存储技术架构,为用户提供安全、高效的数据管理服务。 ### 技术学习价值 本项目选择云存储系统作为课程设计题目,具有重要的技术学习价值: **核心技术栈覆盖**: + **用户认证与鉴权**:Spring Security + JWT,学习现代Web应用的安全机制 + **文件传输优化**:HTTP分块传输、断点续传、压缩传输等网络优化技术 + **数据安全保护**:加密算法、文件完整性校验等安全技术 + **存储架构设计**:文件系统组织、元数据管理、备份策略等存储技术 + **系统架构实践**:微服务思想、模块化设计、接口标准化等工程实践 **项目复杂度特点**: 虽然每个单独的功能模块(如文件上传、用户登录)实现难度不高,但**系统整体复杂度较大**: + 模块间依赖关系复杂,需要统一的接口设计 + 数据一致性要求高,需要完善的错误处理机制 + 性能优化涉及多个层面,需要全局考虑 + 安全性要求贯穿整个系统,需要端到端的安全设计 这要求小组成员**紧密协调配合**,通过良好的项目管理和技术沟通,才能高质量完成课程设计。 # 用例图 ## 普通用户用例图 ![](https://cdn.nlark.com/yuque/0/2025/png/57950981/1751255329008-b0a2d7e5-a301-4646-9b4c-8cd1d2efdefe.png) ## 管理员用例图 ![](https://cdn.nlark.com/yuque/0/2025/png/57982122/1751251846484-a1342694-9435-4384-a989-3d0b10667af2.png) # 系统功能层次图 ![](https://cdn.nlark.com/yuque/0/2025/png/57982122/1751352473942-98ecf745-a050-4554-96cb-54d8e04571ec.png) # 系统设计 ## 功能模块划分与描述 | 系统详细设计 | 负责人 | | --- | --- | | 用户认证模块 | 成员C | | 权限管理模块 | 成员C | | 安全加密模块 | 成员A | | 网络传输模块 | 成员A | | 储存管理模块 | 成员B | | 备份恢复模块 | 成员B | | 文件生命周期模块 | 成员B | | 数据恢复模块 | 成员B | | 数据库设计 | 成员C,成员B,成员A | ## 模块架构 ![画板](https://cdn.nlark.com/yuque/0/2025/jpeg/38606676/1751214363081-41e3b34e-46ff-4946-a1ff-5f2a6c988eea.jpeg) ## 模块依赖图谱 ![画板](https://cdn.nlark.com/yuque/0/2025/jpeg/38606676/1750691398992-b710b136-248b-4243-869d-cecedbc72f13.jpeg) ## 分工计划 ### 成员A(组长)- 安全加密 & 网络管理模块 **负责模块**: + **安全加密服务**:文件AES加密/解密、MD5完整性校验 + **网络传输服务**:文件上传/下载、断点续传、分块传输 **核心工作内容**: 1. **加密服务实现** - AES加密算法集成 - 通过比较文件的MD5码作为校验机制 - 加密配置管理 2. **网络传输优化** - HTTP分块上传实现 - 断点续传机制 - 传输进度监控 3. **接口设计** - 错误处理机制 - 日志记录规范 **技术难点**: + 大文件传输的内存优化 + 加密性能与安全性平衡 + 网络异常的恢复机制 ### 成员C(组员) - 用户认证 & 权限管理模块 **负责模块**: + **用户认证服务**:注册、登录、JWT令牌管理 + **权限管理服务**:角色控制、资源授权、访问控制 **核心工作内容**: 1. **用户管理系统** - 用户注册/登录功能 - JWT令牌生成与验证 - 密码加密存储 2. **权限控制系统** - 角色权限模型 - 资源访问控制 - 权限拦截器实现 **技术难点**: + Spring Security配置 + JWT安全性保证 + 细粒度权限控制 ### 成员B(组员) - 存储管理 & 数据保护模块 **负责模块**: + **存储管理服务**:文件系统组织、元数据管理 + **备份恢复服务**:定时备份、数据恢复 + **生命周期管理**:文件定期清理 **核心工作内容**: 1. **文件存储架构** - 文件系统设计 - 元数据管理 - 存储空间优化 2. **数据保护机制** - 自动备份策略 - 数据恢复流程 - 文件生命周期管理 **技术难点**: + 大规模文件组织 + 备份策略优化 + 数据一致性保证 # 系统程序流程图 ## 普通用户操作流程 ```plantuml @startuml start :用户访问系统; if (是否已登录?) then (否) :跳转登录页面; while (认证循环) is (继续) :输入用户名密码; if (认证是否成功?) then (否) :显示错误信息; else (是) :生成JWT Token; break endif endwhile (认证成功) else (是) endif :进入主界面; :文件管理界面; while (系统操作) is (继续使用) switch (选择操作) case (上传文件) while (文件上传) is (继续选择) :选择本地文件; if (文件类型检查) then (通过) :开始上传; if (是否需要加密?) then (是) :AES加密处理; :直接存储; else (否) :直接存储; endif :更新文件元数据; :上传完成通知; break else (不通过) :提示文件类型错误; endif endwhile (上传完成) case (下载文件) :选择要下载的文件; if (权限检查) then (无权限) :提示权限不足; else (有权限) if (文件是否加密?) then (是) :解密文件; :直接下载; else (否) :直接下载; endif :下载完成; endif case (删除文件) :选择要删除的文件; if (确认删除?) then (否) :取消删除; else (是) :软删除文件; :移至回收站; :更新文件状态; endif case (查看文件列表) :获取用户文件列表; :按权限过滤; :显示文件信息; case (退出登录) :清除JWT Token; :跳转登录页面; stop endswitch endwhile (退出系统) stop @enduml ``` ## 系统管理员操作流程 ```plantuml @startuml start :管理员访问系统; if (管理员身份验证) then (失败) :拒绝访问; stop else (成功) :进入管理控制台; endif while (管理操作) is (继续) switch (选择管理功能) case (用户管理) :用户管理界面; while (用户管理) is (继续操作) switch (用户操作) case (查看用户列表) :获取所有用户信息; :显示用户状态; case (禁用用户) :选择目标用户; :更新用户状态为禁用; :发送通知; case (重置密码) :生成临时密码; :发送重置邮件; endswitch endwhile (返回主菜单) case (系统监控) :系统监控界面; while (系统监控) is (继续监控) switch (监控内容) case (服务状态) :检查各模块状态; :显示服务健康度; case (存储使用情况) :统计存储空间; :生成存储报告; case (用户活跃度) :分析用户行为数据; :生成活跃度报告; endswitch endwhile (返回主菜单) case (文件管理) :全局文件管理; while (文件管理) is (继续管理) switch (文件操作) case (查看所有文件) :获取系统全部文件; :按用户/时间分类显示; case (批量操作) :选择文件范围; switch (批量操作类型) case (批量删除) :确认删除操作; :执行批量删除; case (批量备份) :创建备份任务; :执行备份流程; case (批量迁移) :选择目标位置; :执行文件迁移; endswitch endswitch endwhile (返回主菜单) case (安全审计) :安全审计界面; while (安全审计) is (继续审计) switch (审计内容) case (登录日志) :查看用户登录记录; :分析异常登录; case (操作日志) :查看文件操作记录; :检测可疑操作; case (系统日志) :查看系统运行日志; :分析系统异常; endswitch endwhile (返回主菜单) case (备份管理) :备份管理界面; while (备份管理) is (继续备份操作) switch (备份操作) case (创建备份) :选择备份范围; :执行备份任务; :验证备份完整性; case (恢复数据) :选择恢复点; :确认恢复操作; :执行数据恢复; case (备份设置) :配置备份策略; :更新备份计划; endswitch endwhile (返回主菜单) case (系统配置) :系统配置界面; while (系统配置) is (继续配置) switch (配置项目) case (存储配置) :修改存储参数; :重启相关服务; case (安全配置) :更新安全策略; :应用新安全规则; case (性能配置) :调整性能参数; :优化系统性能; endswitch endwhile (返回主菜单) endswitch endwhile (退出系统) stop @enduml ``` ## 系统核心业务流程 ### 文件上传 ```plantuml @startuml !theme plain start :文件上传请求; note right #lightblue : 开始上传流程 :JWT Token验证; if (验证结果) then (验证失败) :返回401未授权; note right #lightcoral : 认证失败 stop else (验证成功) :检查用户权限; if (权限检查) then (权限不足) :返回403禁止访问; note right #lightcoral : 权限不足 stop else (权限通过) :文件格式校验; if (格式校验) then (格式不支持) :返回文件类型错误; note right #lightcoral : 格式错误 stop else (格式支持) :检查存储空间; if (存储空间检查) then (空间不足) :返回存储空间不足; note right #lightcoral : 空间不足 stop else (空间充足) :开始文件上传; endif endif endif endif if (文件大小判断) then (小文件) :直接上传; else (大文件) :分块上传; :断点续传支持; :分块组装; endif if (需要加密?) then (是) :AES加密处理; :计算MD5校验; else (否) :直接存储; :计算MD5校验; endif :保存到文件系统; :更新数据库元数据; :生成访问URL; :返回上传成功响应; note right #lightgreen : 上传成功 :触发备份任务; :记录操作日志; :发送通知消息; stop @enduml ``` ### 文件下载 ```plantuml @startuml !theme plain start :文件下载请求; note right #lightblue : 开始下载流程 :JWT Token验证; if (验证结果) then (验证失败) :返回401未授权; note right #lightcoral : 认证失败 stop else (验证成功) :解析请求参数; :查询文件元数据; if (文件是否存在) then (文件不存在) :返回404文件未找到; note right #lightcoral : 文件不存在 stop else (文件存在) :检查用户权限; if (权限检查) then (无权限) :返回403禁止访问; note right #lightcoral : 权限不足 stop else (有权限) :检查文件状态; switch (文件状态) case (文件已删除) :返回410文件已删除; note right #lightcoral : 文件已删除 stop case (文件损坏) :返回500文件损坏; note right #lightcoral : 文件损坏 stop case (文件正常) :检查Range请求头; endswitch endif endif endif if (Range头检查) then (无Range头) :完整文件下载; if (文件是否加密?) then (是) :AES解密处理; :完整性MD5校验; else (否) :直接读取文件; :完整性MD5校验; endif if (校验结果) then (校验失败) :返回500文件损坏; note right #lightcoral : 文件损坏 stop else (校验成功) :设置响应头; :Content-Type设置; :Content-Length设置; :Content-Disposition设置; endif else (有Range头) :断点续传下载; :解析Range范围; :验证Range有效性; if (Range有效性) then (Range无效) :返回416范围无效; note right #lightcoral : 范围无效 stop else (Range有效) if (文件是否加密?) then (是) :部分解密处理; :片段完整性校验; else (否) :读取文件片段; :片段完整性校验; endif if (校验结果) then (校验失败) :返回500文件损坏; note right #lightcoral : 文件损坏 stop else (校验成功) :设置206部分内容响应头; :Content-Range设置; :Accept-Ranges设置; :Content-Disposition设置; endif endif endif :开始流式传输; while (传输循环) is (继续传输) if (传输是否完成?) then (否) :继续传输数据块; if (客户端是否断开?) then (是) :记录传输中断; note right #lightyellow : 传输中断 :清理临时资源; :记录中断原因; stop else (否) endif else (是) :传输完成; break endif endwhile (传输完成) :更新下载统计; :记录访问日志; :更新最后访问时间; :返回下载成功; note right #lightgreen : 下载成功 stop @enduml ``` # 数据库设计 ## CDM图 ![](https://cdn.nlark.com/yuque/0/2025/png/57982122/1751349754239-ad64b7bf-881d-4e44-bb38-16e0347e15ee.png) ## PDM图 ![](https://cdn.nlark.com/yuque/0/2025/png/57982122/1751349761482-58afd1ad-03c2-43e9-abbd-f36a29540bd4.png) ## 数据库表设计 | 用户表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | id | integer | AUTO_INCREMENT | 否 | 用户ID,主键 | | username | VARCHAR(50) | 无 | 否 | 用户名,唯一 | | user_password_hash | VARCHAR(255) | 无 | 否 | 密码哈希值 | | email | VARCHAR(100) | 无 | 是 | 用户邮箱 | | user_created_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 创建时间,默认为当前时间戳 | | user_updated_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 更新时间,默认为当前时间戳,更新时自动更新 | | user_is_active | BOOLEAN | TRUE | 否 | 是否激活,默认为TRUE | | 文件信息表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | file_id | integer | AUTO_INCREMENT | 否 | 文件ID,主键 | | id | integer | 无 | 否 | 用户ID,外键,关联users表 | | status_id | integer | 无 | 否 | 状态序列,外键关联status表 | | type_id | integer | 无 | 否 | 类型序列外键关联type表 | | orginal_name | VARCHAR(255) | 无 | 否 | 原始文件名 | | stored_name | VARCHAR(255) | 无 | 否 | 存储文件名(UUID) | | physical_path | VARCHAR(1024) | 无 | 否 | 文件实际存储路径 | | virtual_path | varchar(1024) | 无 | 是 | 用户存储路径 | | file_size | BIGINT | 无 | 否 | 文件大小(字节) | | file_hash | VARCHAR(64) | 无 | 是 | MD5哈希值 | | file_status | ENUM('UPLOADING', 'COMPLETED', 'DELETED', 'CORRUPTED') | 'UPLOADING' | 否 | 文件状态,默认为'UPLOADING' | | file_created_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 创建时间,默认为当前时间戳 | | file_updated_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 更新时间,默认为当前时间戳,更新时自动更新 | | file_last_accessed_at | TIMESTAMP | NULL | 是 | 最后访问时间 ,使用当前时间戳 | | 备份表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | backup_id | integer | AUTO_INCREMENT | 否 | 备份ID,主键 | | file_id | integer | 无 | 否 | 文件ID,外键,关联file_info表 | | backup_path | VARCHAR(1024) | 无 | 否 | 备份文件路径 | | backup_type | ENUM('AUTO', 'MANUAL') | 'AUTO' | 否 | 备份类型,默认为'AUTO' | | backup_size | integer | 无 | 否 | 备份文件大小 | | backup_hash | VARCHAR(64) | 无 | 是 | 备份文件哈希 | | backup_created_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 创建时间,默认为当前时间戳 | | 分享文件表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | shared_id | integer | AUTO_INCREMENT | 否 | 分享ID,主键 | | file_id | integer | 无 | 否 | 文件ID,外键,关联file_info表 | | shared_by | integer | 无 | 否 | 分享者ID,外键,关联users表 | | share_token | VARCHAR(64) | 无 | 否 | 分享令牌,唯一 | | share_access_type | ENUM('READ', 'DOWNLOAD') | 'READ' | 否 | 访问类型,默认为'READ' | | share_password_hash | VARCHAR(255) | 无 | 是 | 访问密码 | | expire_at | TIMESTAMP | NULL | 是 | 过期时间 | | download_count | INT | 0 | 否 | 下载次数,默认为0 | | max_downloads | INT | NULL | 是 | 最大下载次数 | | share_created_at | TIMESTAMP | CURRENT_TIMESTAMP | 否 | 创建时间,默认为当前时间戳 | | share_is_active | BOOLEAN | TRUE | 否 | 是否激活,默认为TRUE | | 密钥表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | key_id | integer | AUTO_INCREMENT | 否 | 密钥序列,主键 | | id | integer | 无 | 否 | 用户id,关联users表 | | key_type | ENUM('USER_KEY', 'SYSTEM_KEY', 'SHARED_KEY') | 'USER_KEY' | 否 | 密钥类型 | | encrypted_key | VBIN512 | 无 | 否 | 加密后密钥 | | key_salt | VBIN32 | 无 | 否 | 密钥盐值 | | key_version | integer | 1 | 否 | 密钥版本,默认为1 | | key_status | ENUM('ACTIVE', 'INACTIVE', 'REVOKED') | ACTIVE' | 否 | 密钥状态默认为'ACTIVE' | | key_created_at | timestamp | CURRENT_TIMESTAMP | 否 | 密钥创建时间,默认为当前时间戳 | | key_expires_at | timestamp | 无 | 否 | 密钥过期时间 | | 文件操作表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | file_action_id | integer | AUTO_INCREMENT | 否 | 文件操作序列 | | file_id | integer | 无 | 否 | 文件id,外键关联file_info表 | | action_type | varchar(100) | 无 | 否 | 文件操作类型 | | file_action_at | timestamp | 无 | 否 | 文件操作时间,使用当前时间戳 | | 文件加密表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | encryption_id | integer | AUTO_INCREMENT | 否 | 文件加密序列,主键 | | file_id | integer | 无 | 否 | 文件ID,外键,关联file_info表 | | encryption_algorithm | varchar(32) | 无 | 否 | 加密算法 | | encryption_key_id | varchar(64) | 无 | 否 | 密钥标识符 | | encryption_iv | VBIN16 | 无 | 否 | 初始化向量 | | encryption_salt | VBIN32 | 无 | 否 | 盐值 | | key_derivation_method | varchar(32) | 无 | 否 | 密钥派生方法 | | encryption_status | ENUM('ENCRYPTED', 'DECRYPTED', 'PENDING') | ENCRYPTED' | 否 | 加密状态,默认为'ENCRYPTED' | | encryption_created_at | timestamp | CURRENT_TIMESTAMP | 否 | 创建时间,默认为当前时间戳 | | encryption_updated_at | timestamp | 无 | 否 | 更新时间,使用当前时间戳 | | 文件类型表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | type_id | integer | AUTO_INCREMENT | 否 | 类型序列,主键 | | file_extension | varchar(10) | 无 | 否 | 拓展名 | | file_type | varchar(50) | 无 | 否 | 文件类型 | | file_content_type | varchar(100) | 无 | 否 | MIME类型 | | 文件状态表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | status_id | integer | AUTO_INCREMENT | 否 | 状态序列,主键 | | is_encrypted | BOOLEAN | 无 | 否 | 是否加密 | | file_is_deleted | BOOLEAN | 无 | 否 | 是否被删除 | | file_deleted_at | timestamp | 无 | 是 | 删除时间,使用当前时间戳 | | 管理员表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | admin_id | integer | AUTO_INCREMENT | 否 | 管理员ID,主键 | | admin_name | varchar(50) | 无 | 否 | 管理员名 | | admin_password_hash | VARCHAR(255) | 无 | 否 | 管理员密码 | | admin_email | VARCHAR(100) | 无 | 是 | 管理员邮箱 | | admin_created_at | timestamp | CURRENT_TIMESTAMP | 否 | 管理员注册时间,默认当前时间戳 | | admin_accessed_at | timestamp | 无 | 是 | 管理员最后登陆时间,使用当前时间戳 | | 用户操作表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | useraction_id | integer | AUTO_INCREMENT | 否 | 操作序列,主键 | | id | integer | 无 | 否 | 用户id | | action_name | varchar(255) | 无 | 否 | 操作 | | action_at | timestamp | 无 | 否 | 操作时间 | | 重置申请表 | | | | | | :---: | --- | --- | --- | --- | | 列名 | 数据类型 | 默认值 | 允许空 | 说明 | | apply_id | integer | AUTO_INCREMENT | 否 | 申请序列,主键 | | id | integer | 无 | 否 | 用户id | | apply_at | timestamp | CURRENT_TIMESTAMP | 否 | 申请时间,默认当前时间戳 | | accept_by | integer | 无 | 否 | 处理人 | | is_viewed | BOOLEAN | FALSE | 否 | 是否已被管理员查看该申请 | | is_accept | BOOLEAN | 无 | 是 | 是否通过 | # 服务机的文件存储路径组织 ``` /uploads/ ├── userA-id/ │ ├── abc123def456/ # 文件hash或UUID │ ├── 789ghi012jkl/ │ └── ... /backups/ ├── userA_id/ │ ├── abc123def456/ # 文件hash或UUID │ ├── 789ghi012jkl/ └── userB_id/ ```