• 图床项目之后台框架设计


    0、后台数据处理框架

    new_dfs

    一、注册功能

    Server
    Client
    post 请求
    json格式回复
    分析数据,提取数据(decodeRegisterJson)
    处理API (apiRegisterUser)
    如果不存在则保存到数据库,registerUser
    封装返回信息(encodeRegisterJson)
    成功:{“code”:0},失败:{“code”:1},
    用户已存在:{“code”:2}
    HTTP
    post:{
    “Email”: “......”
    “firstPwd”: “......”
    “nickName”: “......”
    “phone”: “......”
    “userName”: “......”
    }
    根据状态码进行相关处理

    MD5 即 Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有 MD5 实现。

    理论上 MD5 是不可逆的,而且 MD5 本来也不是作加密使用,而是用来校验数据的完整性,只是因为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。

    二、登陆功能

    Server
    Client
    post 请求
    json格式回复
    分析数据,提取数据(decodeLoginJson)
    处理API (ApiRegisterUser)
    musql验证用户名密码,verifyUserPassword
    生成和设置token,并保存到redis。
    setToken
    封装返回信息(encodeRegisterJson)
    成功:{“code”:0,“token”:......},
    失败:{“code”:1}
    HTTP
    post:{
    “pwd”:“......”
    “user”: “......”
    }
    根据状态码进行相关处理

    Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡。
    Token 是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token 的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是 Token 就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方。

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

    1. 客户端使用用户名跟密码请求登录。
    2. 服务端收到请求,去验证用户名与密码。
    3. 验证成功后,服务端生成一个 Token,这个 Token 可以存储在内存、磁盘、或者数据库里,再把这个 Token 发送给客户端。
    4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 。
    5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token。
    6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。

    三、用户文件列表

    3.1、文件数量

    Server
    Client
    post 请求
    json格式回复
    解析command参数(QueryParseKeyValue)
    处理API (ApiMyFiles)
    提取用户和token数据,decodeCountJson
    校验用户名和token,VerifyToken
    获取文件总数量,handleUserFilesCount
    encodeCountJson
    { “total”:......,“code”:0 }
    异常code:1,正常code:0
    HTTP
    post:{
    “token”:“......”,
    “user”:“......”
    }
    根据状态码进行相关处理

    3.2、文件列表

    Server
    Client
    post 请求
    json格式回复
    解析command参数,
    QueryParseKeyValue
    处理API ,
    ApiMyFiles
    解析Json数据,
    decodeFilesListJson
    校验用户名和token,
    VerifyToken
    从mysql读取文件信息,
    getUserFileList
    根据参数按普通、升序、降序排序
    获取文件数量,
    getUserFilesCount
    请求参数从mysql读取文件列表信息
    异常{code:1},
    正常 {code:0,文件列表}
    HTTP (normal/pvasc升序/pvdesc降序)
    post:{
    “count”: 2,
    “start”: 0,
    “token”:“...”,
    “user”: “...”
    }
    根据状态码进行相关处理

    升序(order by pv asc)和 cmd=normal 逻辑一致,只是稍微改了 sql 语句的查询方式。
    降序(order by pv desc)和 cmd=normal 逻辑一致,只是稍微改了 sql 语句的查询方式。

    四、上传文件之秒传机制

    请求对比数据库文件信息的md5。

    每个文件都有一个唯一的 MD5 值(比如 2bf8170b42cc7124b04a8886c83a9c6f),就好比每个人的指纹都是唯一的一样,效验 MD5 就是用来确保文件在传输过程中未被修改过。

    1. 客户端在上传文件之前将文件的 MD5 码上传到服务器
    2. 服务器端判断是否已存在此 MD5 码,如果存在,说明该文件已存在,则此文件无需再上传,在此文件的计数器加 1,说明此文件多了一个用户共用。
    3. 如果服务器没有此 MD5 码,说明上传的文件是新文件,则真正上传此文件。
    Server
    Client
    post请求
    json格式回复
    json格式回复
    失败
    成功
    秒传失败
    文件已存在
    文件不存在
    秒传成功
    分析数据,提取数据
    decodeMd5Json
    处理API,ApiMd5
    校验token,
    VerifyToken
    token验证失败,
    {“code”:4}
    秒传后台数据处理,
    handledealMd5
    检测file_info是否存在该md5记录,
    如果有并获取count引用计数
    秒传失败:{“code”:1}
    秒传失败:{“code”:0}
    文件已存在:{“code”:2}
    没有md5
    检测个人文件
    user_file_list
    是否有文件名和md5记录
    有md5
    多一个记录引用file_info
    文件引用计数+1
    user_file_list
    更新用户文件信息
    user_file_count
    更新用户文件数量
    {
    “fileName”: “...”,
    “md5”: “......”,
    “token”: “.......”,
    “user”: “...”
    }
    根据状态码进行相应处理

    五、上传文件

    Server
    nginx
    Client
    post 请求
    中转
    json格式回复
    解析文件类型,file_content_type
    解析文件名,file_name
    解析文件md5,file_md5
    解析文件路径,file_path
    解析文件大小,file_size
    解析用户名,user
    根据文件后缀名对临时文件做重命名,rename
    将文件上传到fastdfs并获取fileid,
    upload FileToFastDfs
    根据fileid获取王者下载的url,
    getFullurlByFileid
    保存文件信息到数据库,storeFileinfo
    删除临时文件,unlink
    成功:{“code”:0}
    失败:{“code”:1}
    nginx-upload-module文件上传模块
    HTTP
    post: 用户信息和文件内容
    根据状态码进行相关处理

    六、获取共享文件或下载榜

    获取共享文件个数,获取共享文件列表,获取共享文件下载排行榜。

    6.1、获取共享文件数量

    处理逻辑:

    Server
    Client
    post 请求
    json格式回复
    解析command参数(QueryParseKeyValue)
    处理API (apiShareFiles)
    获取共享文件数量(handleGetShareFilesCount)
    封装返回信息(encodeShareCountJson)
    HTTP
    根据状态码进行相关处理

    6.2、获取共享文件列表

    处理逻辑:

    Server
    Client
    post 请求
    json格式回复
    normal
    pvdesc 下载量降序
    解析command参数,
    QueryParseKeyValue
    处理API (apiShareFiles)
    读取要解析的内容,fread()
    解析json内容,
    get_filelist_json_info
    获取共享文件列表,
    handleGetShareFileList
    获取下载榜,
    handleGetRankingFileList
    封装返回信息
    HTTP
    根据状态码进行相关处理

    6.3 获取下载榜

    score
    member
    value
    fileid
    key
    下载量pv
    下载量pv
    下载量pv
    ......
    文件md5+文件名
    文件md5+文件名
    文件md5+文件名
    ......
    文件名
    文件名
    文件名
    ......
    文件md5+文件名
    文件md5+文件名
    文件md5+文件名
    ......
    FILE_NAME_HASH
    hash结构key
    FILE_NAME_HASH
    zset结构key

    七、分享/删除文件以及更新下载计数

    7.1、分享文件

    处理逻辑:

    Server
    Client
    post 请求
    json格式回复
    json格式回复
    校验失败
    存在
    不存在
    有记录
    没有记录
    解析command参数,
    QueryParseKeyValue
    处理API,
    apiDealFiles
    分析数据,提取数据,
    decodeDealFileJson
    {“code”:4}
    校验token,
    VerifyToken
    处理分享文件,
    handleShareFile
    检查是否已经分享,
    FILE_PUBLIC_ZSET
    encodeDealFileJson,
    成功:{“code”:0}
    失败:{“code”:1}
    已经分享:{“code”:3}
    已经分享,
    share_state=ShareHad
    继续检测MySQL,
    share_file_list
    增加到排行榜,
    FILE_PUBLIC_ZSET
    位置文件分享状态,
    user_file_list shared_st
    添加分享文件记录,
    share_file_count
    更新共享文件计数,
    user_file_count
    添加到redis,
    FILE_PUBLIC_ZSET,
    FILE_NAME_HASH
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “token”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理

    7.2、删除文件

    处理逻辑:

    Server
    Client
    post 请求
    json格式回复
    json格式回复
    校验失败
    校验成功
    不存在
    1
    0
    存在
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiShareFiles
    分析数据,提取数据,
    decodeDealFileJson
    校验用户名和token,
    VerifyToken
    encodeDealFileJson,
    token错误{“code”:4}
    删除文件,
    handleDeleteFile
    先检查文件是否被分享,
    FILE_PUBLIC_ZSET
    继续检测user_file_list里
    该文件的分享状态,
    shared_status
    从共享文件列表删除,
    share_file_list
    is_shared=1
    更新用户文件计数,
    user_file_count
    is_shared=0
    is_shared=1
    redis_has_record=1
    更新共享文件计数,
    user_file_count
    如果redis有记录,
    删除zset、hash对应记录
    删除用户文件信息,
    user_file_list
    文件引用计数减一,
    file_info_count
    如果文件引入计数为0,
    从fastdfs删除文件
    encodeDealFileJson,
    成功:{“code”:0}
    失败:{“code”:1}
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “token”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理
    1. 先判断此文件是否已经分享;
    2. 判断集合有没有这个文件,如果有,说明别人已经分享此文件(redis 操作) ;
    3. 如果集合没有此元素,可能因为 redis 中没有记录,再从 mysql 中查询,如果 mysql 也没有,说明真没有(mysql 操作);
    4. 如果 mysql 有记录,而 redis 没有记录,那么分享文件处理只需要处理 mysql (mysql 操作) ;
    5. 如果 redis 有记录,mysql 和 redis 都需要处理,删除相关记录。

    注意:

    1. 如果删除文件,则也将其从共享列表删除,其他人如果想要保存共享文件则可以转存到个人文件列表。
    2. 共享文件和我的文件 指向的是同一个文件。
    3. 一个人共享了一个文件,删除文件的时候也会删除共享文件;两个人同时删除文件则才会删除共享文件。
    4. 本质上而言,删除自己的文件时是否该删除共享文件,是业务的问题,确定了业务根据业务做代码实现即可。

    7.3、更新文件下载计数

    处理逻辑:

    Server
    Client
    get方式下载
    post请求
    json格式回复
    校验成功
    校验失败
    FastDFS+nginx自动处理
    解析command参数,
    QueryParseKeyValue
    处理API,
    apiDealFile
    分析数据,提取数据,
    decodeDealFileJson
    校验用户名和token,
    VerifyToken
    更新文件下载次数,
    handlePvFile
    encodeDealFileJson,
    token错误{“code”:4}
    encodeDealFileJson,
    成功:{“code”:0}
    失败:{“code”:1}
    文件url地址
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “token”:“......”
    “user”:“......”
    }
    下载完成
    根据状态码进行相关处理

    八、取消分享/转存/更新下载计数

    8.1、取消分享

    Server
    Client
    post请求
    json格式返回
    中间有些步骤错误则返回
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiDealShareFile
    提取数据,
    decodeDealShareFileJson
    暂时不做token认证
    把share_status置为0,
    user_file_list
    获取共享文件数量,
    user_file_count
    共享文件计数减一,
    user_file_count
    删除共享文件记录,
    share_file_list
    从redis中删除
    FILE_PUBLIC_ZSET和FILE_NAME_HASH
    对应数据
    取消共享文件
    handleCancelShareFile
    成功:{“code”:0}
    失败:{“code”:1}
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理

    8.2、转存文件

    Server
    Client
    post请求
    json格式返回
    json格式返回
    已存在
    不存在
    中间有些步骤错误则返回
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiDealShareFile
    提取数据,
    decodeDealShareFileJson
    暂时不做token认证
    转存文件,
    handleSaveFile
    检测用户是否已经存在该文件,
    user_file_list
    {“code”:5}
    用户文件数量+1,
    user_file_count
    获取文件引用计数,
    file_info
    添加文件引用计数,
    file_info
    用户文件列表添加记录,
    user_file_list
    获取用户文件数量,
    user_file_count
    成功:{“code”:0}
    失败:{“code”:1}
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理

    8.3、更新共享文件下载计数

    Server
    Client
    post请求
    json格式返回
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiDealShareFile
    提取数据,
    decodeDealShareFileJson
    暂时不做token认证
    共享文件pv值加一,
    share_file_list
    查询该共享文件pv值,
    share_file_list
    更新文件下载次数,
    handlePvFile
    成功:{“code”:0}
    失败:{“code”:1}
    如果在FILE_PUBLIC_ZSET则+1,
    如果不在则添加到FILE_PUBLIC_ZSET和
    FILE_NAME_HASH
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理

    九、分享图片

    9.1、请求图片分享

    Server
    Client
    post请求
    json格式返回
    添加图片分享记录,
    share_picture_list (filemd5、urlmd5等)
    生成图片记录唯一的值,
    urlmd5
    请求分享图片,
    handleSharePicture
    解析json数据,
    decodeSharePictureJson
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiSharePicture
    成功:{“code”:0,“urlmd5”:“......”}
    失败:{“code”:1}
    共享图片数量加1,
    user_file_count
    获取共享图片数量,
    user_file_count
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “user”:“......”
    }
    根据状态码进行相关处理

    9.2、请求浏览图片

    Server
    Client
    get方式
    返回网页
    post请求
    json格式返回
    nginx web
    封装返回结果,
    encodeBrowseIPictureJson
    更新浏览次数,
    share_picture_list
    根据文件md5从
    file_info获取完整url
    根据urlmd5查询分享信息,
    share_picture_list
    根据urlmd5查找完整url,
    handleBrowsePicture
    解析json数据,
    decodeBrowseIPictureJson
    解析command参数,
    QueryParseKeyValue
    处理API ,
    apiSharePicture
    访问网址
    HTTP
    post:{
    “filename”:“......”
    “md5”:“......”
    “user”:“......”
    }
    加载网页
    根据状态码进行相关处理

    9.3、我的图片分享

    Server
    Client
    post请求
    json格式返回
    查询share_picture_list和file_info
    获取文件列表
    获取图片列表,
    handleGetSharePicturesList
    解析json数据,
    decodePictureListJson
    解析command参数,
    QueryParseKeyValue
    HTTP
    post:{
    “token”:“......”
    “user”:“......”
    “count”:...
    “start”:...
    }
    处理API ,
    apiSharePicture
    a2
    成功:{“code”:0,文件列表}
    失败:{“code”:1}
  • 相关阅读:
    Tapdata 杨哲轩:如何在零售行业实施主数据治理?
    数据可视化大屏模板 | 保姆级使用教程
    作为硬件大厂,戴尔为什么要谈零信任?
    1. Nginx 基本功能配置
    驱动开发:内核无痕隐藏自身分析
    DataFrame在指定位置插入行和列
    Python逆向爬虫之pyquery,非常详细
    vivado 3D RAM Inference
    多模块和分布式项目
    阿里SpringCloudAlibaba实战小抄(第五版)GitHub独家首发开源
  • 原文地址:https://blog.csdn.net/Long_xu/article/details/127733361