BytesCloud-一个基于flask的网络云盘实现

项目简介

一个基于flask的个人网络云盘

数据库设计

在设计数据库时,并不是通过维护一个嵌套的对象,而是将所有的数据都放入到一维数组,父子关系通过parId字段来维护,根目录到当前所在目录通过path_root字段来维护。只考虑相邻的两级关系,不考虑所有的层级关系,优势如下:

  1. 存入数据时,只需要将parent_id设为当前目录的Id,path_root设为根目录到当前目录的路径。而不是通过递归对象将数据放到对应的节点上。
  2. 修改当前文件或者目录名称时,只需要根据当前数据的Id去数据库匹配然后修改。如果修改的是目录名称(假如nameA修改为nameB),会影响该目录下所有子目录和子文件的path_root字段,那么只需要匹配所有满足path_root字段里面包含nameA的数据,然后替换成nameB就可以了。
  3. 移动文件或目录时,所有的子目录或者文件也会跟着变化。修改当前文件或目录的parent_id字段,指向新的目录Id,同样也要修改所有子目录或者子文件的path_root字段,同上。
  4. 删除文件或目录时,根据当前的Id去数据库匹配删除。如果删除的目录里面有子目录或者文件(假如删除的是目录folderA),那么只需要匹配所有满足path_root字段里面包含folderA的数据,然后全部删除。最后记得也要删除磁盘文件,不然内存消耗太大(如果有回收站保留30天,则设置最后保留时间,超时后再去删磁盘文件)。

UserTable

uid 用户ID 默认 0
email 邮箱
password_hash 密码的hash值

FileNode

id 唯一id 主键
filename 文件名
path_root 从根目录到当前目录到路径 ‘/’ 分割
parent_id 父目录id
type_of_node 类型 (dir , .py , .csv ) ‘dir’ 表示是目录
size 大小
upload_time 上传时间
user_id 所属用户 外键,默认0
hdfs_path
hdfs_filename

api设计

资源 URL 实现方法/对应功能
登录 /api/login POST(email,password)
注册 /api/register POST(emil,password)
登出 /api/logout GET
上传文件 /api/file/upload POST(curId=xxx&file=xx)
获取文件信息(目录) /api/file/getInfo?id=xxx GET
下载文件 /api/file/download?id=xxx GET
重命名文件(目录) /api/file/reName POST(id=xxx&newName=xxx)
新建文件夹 /api/file/newFolder POST(curId=xxx&foldername=xxx)
获取当前用户所有文件信息 /api/file/all GET
删除文件(目录) /api/file/delete?id=xxx GET

返回值协议

  • 0-9 :
  • 10-19: 数据库
  • 20-29: 文件
code Message Data 说明
0 成功
10 database error 未知数据库错误
11 node not exist, query fail 当前结点在数据库中不存在
12 node already exist , add fail 目标结点已经存在,插入失败
20 File error 未知文件错误
21 file already exist, save fail 文件已存在,保存失败
22 file not exist 目标文件不存在
23 illegal filename 文件名不合格
24 preview not allowed 文件不支持预览
25 can not access this file 无访问权限
30 user error 用户相关错误
31 user not found 用户不存在
32 already authenticated 用户已经登录
33 login fail 登录失败
34 user add fail
35 get current_user fail
36 user unauthorized,please login 用户未登录
37 token out of date token 过期
38 wront token token 错误

设计规约

  • id = -1 是根目录
  • uid = -1 是管理员账号

遇到的问题

flask-login-用户未登录的情况 flask-model对象转json flask-在flask中连接hdfs flask-常见错误 flask-文件上传 flask-文件下载 flask-用token认证 flask-网盘数据库设计 flask-获取上传文件的size flask-预览图片 flask-部署flask程序 flask-login-权限判定

项目地址

后端

android端


flask   flask-disk      flask

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

flask-部署flask程序 上一篇
flask-获取上传文件的size 下一篇