文章目录
- 一、 需求分析
- 二、 概念结构设计
- 三、逻辑结构设计
- 1. 用户表 (users)
- 2. 客户端本地文件信息表 (upload_files)
- 3. 备份记录表 (backup_records)
- 4. 服务端备份文件信息表 (backup_files)
- 四、 开发工具
- 五、具体实现
- (一) 客户端程序运行演示
一、 需求分析
-
意义:
1.1提供数据安全性:通过远程存储,减少因设备损坏、失窃或自然灾害导致的数据丢失风险。
1.2高可用性:确保用户可以随时随地访问备份数据,提高业务连续性。
1.3成本效益:相较于传统备份方式,云备份降低了硬件投资和维护成本。
1.4自动化管理:简化备份过程,减少人为错误,提高操作效率。 -
设计任务
2.1 用户身份验证:确保只有注册用户能够上传和访问备份数据,多用户只能查看自己的数据。
2.2 客户端任务:支持用户选择指定文件夹,对该文件夹下文件自动备份。
2.3 服务端任务:备份客户端上传的文件,支持用户查看,下载文件。
2.4 多版本备份:支持多个备份版本的存储,以便在数据损坏或误删除时快速恢复。
2.5易用性与用户界面:设计友好的用户界面,使用户能够方便地进行备份和恢复操作。 -
功能模块划分
3.1 支持多用户上传,查看云数据。
3.2 客户端自动检测指定文件夹,支持将本地文件上传到云端。
3.3 服务端接收客户端文件,对非热点文件压缩存储,支持用户查看,支持断点续传。
3.4 提供前端页面,用户提供网页浏览/下载云端文件。
3.5 使用数据库,存储用户信息,客户端本地文件信息,服务端已备份文件属性信息,备份记录信息。 -
预期目标
多用户可以通过客户端程序选择指定文件夹,客户端程序监测该文件夹下文件,将需要上传的文件上传到云端。服务端接收并保存文件,对非热点文件进行压缩存储,提供前端页面支持用户查看云端数据。
二、 概念结构设计
三、逻辑结构设计
1. 用户表 (users)
属性名 | 含义 | 类型 | 说明 |
---|---|---|---|
user_id | 用户唯一标识符 | INT | 主键,自增 |
user_name | 用户名 | VARCHAR(255) | 唯一,不允许为空 |
phone_number | 电话号码 | VARCHAR(15) | 唯一,不允许为空 |
password | 密码 | VARCHAR(255) | 不允许为空 |
register_date | 注册日期 | TIMESTAMP | 默认当前时间 |
last_login | 最后登录时间 | TIMESTAMP |
2. 客户端本地文件信息表 (upload_files)
属性名 | 含义 | 类型 | 说明 |
---|---|---|---|
upload_id | 上传文件唯一标识符 | INT | 主键,自增 |
user_id | 用户唯一标识符 | INT | 外键,引用用户表的user_id |
file_path | 文件路径 | VARCHAR(255) | 不允许为空 |
file_etag | 文件ETag值 | VARCHAR(255) | 唯一,格式为’usrID-fName-fSize-FMtime’ |
复合唯一索引:ukey_user_file(user_id, file_path) |
3. 备份记录表 (backup_records)
属性名 | 含义 | 类型 | 说明 |
---|---|---|---|
file_id | 备份记录唯一标识符 | INT | 主键,自增 |
user_id | 用户唯一标识符 | INT | 外键,引用用户表的user_id |
upload_time | 文件上传时间 | TIMESTAMP | 默认当前时间,不允许为空 |
file_etag | 文件ETag值 | VARCHAR(255) | 唯一,格式为’usrID-fName-fSize-FMtime’ |
file_status | 文件状态 | ENUM | 取值范围:‘uploaded’, ‘modified’, ‘deleted’,默认为’uploaded’ |
在file_status列上建立索引 |
4. 服务端备份文件信息表 (backup_files)
属性名 | 含义 | 类型 | 说明 |
---|---|---|---|
backup_id | 服务端备份文件唯一标识符 | INT | 主键,自增 |
file_id | 备份记录唯一标识符 | INT | 外键,引用备份记录表的file_id |
user_id | 用户唯一标识符 | INT | 外键,引用用户表的user_id |
zip_path | 压缩文件路径 | VARCHAR(255) | |
backup_path | 备份文件路径 | VARCHAR(255) | 不允许为空 |
req_download_path | 请求下载文件的路径 | VARCHAR(255) | 不允许为空 |
file_size | 文件大小 | BIGINT | 不允许为空 |
is_zipped | 是否为压缩文件 | INT | 默认为0 |
fileAtime | 文件访问时间 | TIMESTAMP | 不允许为空 |
fileCtime | 文件创建时间 | TIMESTAMP | 不允许为空 |
fileMtime | 文件修改时间 | TIMESTAMP | 不允许为空 |
created_at | 创建时间 | TIMESTAMP | 默认当前时间 |
四、 开发工具
- 开发环境
软件名称 | 类型 | 版本号 |
---|---|---|
Qt Creator | 开发工具 | 4.11.1 |
Visual Studio Code | 开发工具 | 1.93.0 |
Navicat | 数据库客户端 | 16.3.7 |
- 运行支撑环境
环境 | 描述 | 版本 |
---|---|---|
Linux (Ubuntu) | 用于部署和运行服务端 | 20.04.6 LTS |
MySQL | 数据存储与管理 | 8.0.39-0ubuntu0.20.04.1 |
Windows | 部署和运行云备份客户端 | 22631.4112 |
五、具体实现
(一) 客户端程序运行演示
- 程序运行前 读取数据库信息到内存
- 用户输入账号 判断是否存在
- 新用户需要注册,注册后添加新记录。
通过控制用户输入数据的合法性来保证向数据库插入合法的数据。
注册成功后添加新记录。
- 用户登录,登录后更新登录时间。
- 进入主界面后 选择备份文件夹
- 监视指定文件夹
当有新文件新增,客户端调试信息:
服务端调试信息:30s后该文件未被用户下载则压缩存储
客户端文件列表显示:
前端页面文件新增:
当检测到文件更新,更新数据库记录:
文件被修改后的数据库操作:
客户端已上传文件表
服务端备份文件表
备份记录表
-
对“修改后的文件”是否需要上传做的处理:文件被修改后且3s内未被再次修改被认定为需要上传,避免持续修改的文件多次频繁上传消耗资源。
-
客户端搭建http客户端上传文件
(二) 服务端程序运行演示
- 配置文件单例类
读取JSON格式数据
- 数据库单例类 统一向外提供数据库接口
-
程序运行前将数据库数据读至内存
-
调用业务处理模块 处理客户端的上传/查看/下载http请求
-
将客户端发来的文件保存在本地 并将文件属性信息插入备份文件表
-
处理客户端的查看云端文件请求
根据用户名和密码为该客户显示指定的文件,即每个用户只能看到自己上传的文件。
- 对非热点文件的管理
当一个文件3s内未被下载,则被认定为非热点文件,需要进行压缩存储。
同时,更新数据库中压缩标志位
六、 总结与思考
待优化的问题:
- 当新增文件过大,服务端压缩存储耗时较多,改为多线程压缩非热点文件更好。
- 用户密码在数据库中使用明文存储,应该加密后存储,使得不能直接从数据库中看到用户密码,保护用户隐私。
- 客户端使用QT的信号槽机制监测文件状态变化,使用多线程多连接访问数据库。
优点:
- 此项目实现了类似“云盘”的备份系统,提供可视化客户端使得普通用户即可使用。
- 提供前端页面供用户查看云端文件,且只有用户名和密码匹配才可查看,使得该用户只能查看自己的文件。
- 用户信息,文件备份信息等在数据库中持久化存储,在内存中使用哈希表管理,访问速度快。
- 使用较多的知识点:HTTP协议,JSON序列与反序列,压缩文件,热点管理,断点续传,线程