C++云盘项目2--云盘架构分析

云盘项目框架结构

注册、登录、...、上传文件在程序启动之初会分别为它们创建一个进程进行业务处理。

数据库设计

        数据库用来存放文件信息和用户信息,含有下面几个表:

file_info 表

        该表保存一个文件的存储信息,下面是file_info表的详细内容:

CREATE TABLE `file_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '文件序号,自动递增,主键',
  `md5` varchar(256) NOT NULL COMMENT '文件md5',
  `file_id` varchar(256) NOT NULL COMMENT '文件id:/group1/M00/00/00/xxx.png',
  `url` varchar(512) NOT NULL COMMENT '文件url 192.168.52.139:80/group1/M00/00/00/xxx.png',
  `size` bigint(20) DEFAULT '0' COMMENT '文件大小, 以字节为单位',
  `type` varchar(32) DEFAULT '' COMMENT '文件类型: png, zip, mp4……',
  `count` int(11) DEFAULT '0' COMMENT '文件引用计数,默认为1。每增加一个用户拥有此文件,此计数器+1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COMMENT='文件信息表';
  • md5:文件的 md5 值,文件上传先可以先匹对数据库是否存在相同的 md5 值,如果存在意 味着是同一文件。
  • file_id:文件 id,对应 fastdfs 的文件路径
  • url:文件的完整存储路径,比如 192.168.52.139:80/group1/M00/00/00/xxx.png
  • count:文件引用计数,每增加一个用户拥有此文件,此计数器+1

share_file_list 表

        该表保存一个文件的共享信息,下面是share_file_info表的详细内容:

CREATE TABLE `share_file_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `user` varchar(32) NOT NULL COMMENT '文件所属用户',
  `md5` varchar(256) NOT NULL COMMENT '文件md5',
  `file_name` varchar(128) DEFAULT NULL COMMENT '文件名字',
  `pv` int(11) DEFAULT '1' COMMENT '文件下载量,默认值为1,下载一次加1',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件共享时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='共享文件列表';
  • user:文件所属用户
  • md5:文件对应的 md5 值
  • file_name:文件名
  • pv:文件下载量

user_file_count 表

        该表记录每个用户拥有的文件数量,下面是user_file_info表的详细内容:

CREATE TABLE `user_file_count` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(128) NOT NULL COMMENT '文件所属用户',
  `count` int(11) DEFAULT NULL COMMENT '拥有文件的数量',
  PRIMARY KEY (`id`),
  UNIQUE KEY `user_UNIQUE` (`user`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='用户文件数量表';
  • user:用户名
  • count:文件数量

user_file_list 表

        该表记录每个人拥有的文件的文件信息,下面是user_file_list表的详细内容:

CREATE TABLE `user_file_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `user` varchar(32) NOT NULL COMMENT '文件所属用户',
  `md5` varchar(256) NOT NULL COMMENT '文件md5',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '文件创建时间',
  `file_name` varchar(128) DEFAULT NULL COMMENT '文件名字',
  `shared_status` int(11) DEFAULT NULL COMMENT '共享状态, 0为没有共享, 1为共享',
  `pv` int(11) DEFAULT NULL COMMENT '文件下载量,默认值为0,下载一次加1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 COMMENT='用户文件列表';
  • md5 值:根据该值去 file_info 进一步查找具体的文件

user_info 表

        该表记录每个人的详细信息,下面是user_info表的详细内容:

CREATE TABLE `user_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户序号,自动递增,主键',
  `user_name` varchar(32) NOT NULL DEFAULT '' COMMENT '用户名称',
  `nick_name` varchar(32) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '用户昵称',
  `password` varchar(32) NOT NULL DEFAULT '' COMMENT '密码',
  `phone` varchar(16) NOT NULL DEFAULT '' COMMENT '手机号码',
  `email` varchar(64) DEFAULT '' COMMENT '邮箱',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_nick_name` (`nick_name`),
  UNIQUE KEY `uq_user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COMMENT='用户信息表';
  • user_name:用户名,唯一
  • password:密码,md5 加密

注册功能

业务流程

        注册是一个简单的 HTTP 接口,根据用户输入的注册信息,创建一个新的用户。整个程序中并没有使用数据库连接池,每次注册都需要重建连接。

请求URL

URLhttp://192.168.52.139/reg
请求方式POST
HTTP 版本1.1
Content-Typeapplication/json

请求参数

参数名含义规则说明是否必须缺省值
email邮箱必须符合 email 规范可选
firstPwd密码md5加密后的值(客户端处理)必填
nickName用户昵称不能超过 32 个字符必填
phone手机号码不能超过 16 个字符可选
userName用户名称不能超过 32 个字符必填

返回结果参数说明

名称含义规则说明
code结果值

002: 成功

003: 该用户已存在

004: 失败

示例

调用接口:

http://192.168.52.139/reg

参数

{
    "email": "472251823@qq.com",
    "firstPwd": "e10adc3949ba59abbe56e057f20f883e",
    "nickName": "milo",
    "phone": "18620823143",
    "userName": "milo"
}

返回结果

{
    "code": "002"
}

MD5

        MD5 即 Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广 泛使用的杂凑算法之一(又译摘要算法、哈希算法),理论上 MD5 是不可逆的,而且 MD5 本来也不是作加密使用,而是用来校验数据的完整性,只是因 为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。但是简单密码来说,破解者完全可以将一定范围内的密码字典全部计算出来之后存为数据库,之后 直接查询进行破解。

        该项目使用MD5加密用户密码。

登录功能

业务流程

生成token后,然后连接redis,将(username,token)放到redis,并设置过期时间为24h,然后返回登录结果报文。

token的生成过程:生成4个随机数,并拼成一个字符串,然后再加密,再生成base64编码,再用md5加密生成指定长度的字符串。

请求url

URL
http://192.168.221.152/login
请求方式POST
HTTP版本1.1
Content-Typeapplication/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
pwd
密码
md5 加密后的值
必填
user
用户名称
不能超过 32 个字符
必填

返回结果参数说明

名称
含义
规则说明
code
结果值
000 : 成功
001 : 失败
toke
令牌
每次登录后,生成的 token 不一样,后续其他接口请求时,需要带上 toke
n

示例

调用接口

        http://192.168.221.152/login
参数
        {
                "pwd": "e10adc3949ba59abbe56e057f20f883e",
                "user": "wei"
        }
返回结果
        {
                "code": "000",
                "token": "ecf3ac6f8863cd17ed1d3909c4386684"
        }

Token 验证

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

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

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

Base64

        用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法 显示和打印的字符。

        当不可见字符在网络上传输时,比如说从 A 计算机传到 B 计算机,往往要经过多个路由设备, 由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不 利于传输的。

        为了解决这个问题,我们可以先对数据进行编码,比如 编码,变成可见字符,也就是 ASCII 码可表示的可见字符,从而确保数据可靠传输。 编码的内容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 组成, 正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。

        所以,如果要让记事本这样的文本处理软件能处理二进制数据,如:使用json保存二进制信息,需要先把数据先做一个Base64编码,统统变成可见字符,再保存。

        在Base64中的可打印字符包括大写英文字母A-Z、小写英文字母a-z、阿拉伯数字0- 9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同,通常用加号(+)和正斜杠( /)。外加“补全符号”,通常用等号(=)。

        Base64是一种用64个字符来表示任意二进制数据的方法,常用于在URL、Cookie、网页中传输少量 二进制数据。Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比 原来的长1/3。

(原文)转换前 11111111, 11111111, 11111111 (二进制)
(Base64 编码)转换后 00111111, 00111111, 00111111, 00111111 (二进制)

上传文件

业务流程

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

  • 客户端在上传文件之前将文件的 MD5 码上传到服务器
  • 服务器端判断是否已存在此 MD5 码,如果存在,说明该文件已存在,则此文件无需再上传, 在此文件的计数器加 1,说明此文件多了一个用户共用。
  • 如果服务器没有此 MD5 码,说明上传的文件是新文件,则真正上传此文件

上传文件的MD5

获取数据,提取数据:获取user, token, md5, fileName

token验证:连接redis,获取user对应的token,跟client上传的token做比对校验。

秒传后台数据处理:查找file_info表,获取此md5值文件的文件的引用计数count;若该文件不存在,则返回失败,若该文件已存在:查找user_file_list表,判断该用户是否已有此文件,如果没有则更新各种表,否则不更新各种表;若上传:修改file_info表中的count字段,+1;往user_file_list表中插入一条数据;更新user_file_count表该用户拥有的文件数量。

返回妙传结果

请求url

URL
http://192.168.221.152/md5
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
令牌
同上
必填
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值005:文件已存在
006: 秒传成功
007: 秒传失败
008: 上传文件成功
009: 上传文件失败
010: 下载文件成功
011: 下载文件失败

示例

调用接口

        http://192.168.221.152/md5

参数       

{
    "filename": "Makefile",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "token": "ecf3ac6f8863cd17ed1d3909c4386684",
    "user": "wei"
}

返回结果      

        {
            "code": "007"
        }

上传文件

        客户端上传文件信息具有一定的格式:

------WebKitFormBoundary88asdgewtgewx\r\n
Content-Disposition: form-data; user = "milo"; filename = "xxx.jpg"; md5 = "xxxx"; size = 1024\r\n
Content-Type: application/octet-stream\r\n
\r\n
真正的文件内容\r\n
------WebKitFormBoundary88asdgewtgewx

保存文件到本地:upload_cgi进程将接收到的文件先保存到程序运行的位置。

本地文件转存到FastDFS:upload_cgi进程创建子进程,执行上传文件的命令:fdfs_upload_file /etc/fdfs/client.conf  Makefile.txt,然后将执行返回的上传文件路径group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt通过管道发给upload_cgi进程。upload_cgi进程读取管道里的文件路径,并删除零时存放的文件。

拼接文件URL:upload_cgi进程创建一个子进程,执行fdfs_file_info /etc/fdfs/client.conf  group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt,显示文件信息,并将信息通过管道发送给父进程,父进程根据信息拼接出文件的URL(http://ip:port/group1/M00/00/00/eBuDxWCeIFCAEFUrAAAAKTIQHvk462.txt)

Mysql保存文件信息:往file_info表(文件实体)中插入该文件的信息;往user_file_list(我的文件)中插入该文件的信息;查询该用户所拥有的文件的总数,然后更新user_file_count表(用户文件数量)中该用户的信息;

返回上传结果:将此次文件上传结果返回给客户端。

请求url

URL
http://192.168.221.152/upload
请求方式
POST
HTTP 版本
1.1
Content-Type
application/octet-stream

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
token
同上
必填

返回结果说明

名称
含义
规则说明
code
结果值
008:上传成功
009:上传失败

示例

调用接口

        http://192.168.221.152/upload

参数       

        ------WebKitFormBoundarynHRBTFoUv<p3Tewg
        Content-Disposition: form-data; user="milo" filename="main.cpp" 
        md5="5f2a390a60cb3d51355469fea61efa0b" size=198
        Content-Type: application/octet-stream
        #include "mainwindow.h"
        #include <QApplication>
        #include "login.h"
        int main(int argc, char *argv[])
        {
                 QApplication a(argc, argv);
                 Login w;
                 w.show();
                 return a.exec();
        }
        ------WebKitFormBoundarynHRBTFoUv<p3Tewg

返回结果      

        {
                "code": "008"
        }

获取用户文件列表

业务流程

"start"和"count"含义:返回从表的第start行开始,count条数据。

文件列表 json 包

{
    "files": [
        {
            "user": "milo",
            "md5": "0afa719eb8a079553d14a2ae68111b82",
            "create_time": "2020-06-30 01:22:46",
            "file_name": "0voice.png",
            "share_status": 0,
            "pv": 0,
            "url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
            "size": 15107,
            "type": "png"
        }
    ]
}
  • user:文件上传者
  • md5: 文件 md5 码
  • time:文件上传的时间
  • filename : 用户名
  • share_status :文件是否已共享,已经共享值为 1,否则值为 0
  • pv :文件当前的下载量,下载一次,pv++
  • url :文件存放在 fastdfs 分布式存储服务器的 url 地址
  • size :文件大小
  • type :文件类型

获取用户文件数量

请求url

URL
http://192.168.221.152/myfiles?cmd=count
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
token
同上
必填
user
用户名称
不能超过 32 个字符
必填

返回结果说明

名称
含义
规则说明
code
结果值
110 :验证成功
111 :验证失败
num
文件数量

示例

调用接口

        http://192.168.221.152/myfiles?cmd=count

参数       

        {
                "token": "ecf3ac6f8863cd17ed1d3909c4386684",
                "user": "milo"
        }

返回结果      

        {
                "num": "1",
                "code": "110"
        }

获取用户文件信息

请求url

URL
http://192.168.221.152/myfiles?cmd=normal
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
token
同上
必填
user
用户名称
不能超过 32 个字符
必填
count
文件个数
文件个数需大于 0
必填
start
开始位置
必填

返回结果说明

名称
含义
规则说明
files
文件结果集
"user": 用户名称,
"md5": md5 值 ,
"create_time": 创建时间,
"file_name": 文件名,
"share_status": 共享状态, 0 为没有共享, 1 为共享
"pv": 文件下载量,下载一次加 1
"url": URL,
"size": 文件大小,
"type": 文件类型

示例

调用接口

        http://192.168.221.152/myfiles?cmd=normal

参数       

        {
                "count": 1,
                "start": 0,
                "token": "ecf3ac6f8863cd17ed1d3909c4386684",
                "user": "wei"
        }

返回结果      

{
    "files": [
        {
            "user": "milo",
            "md5": "0afa719eb8a079553d14a2ae68111b82",
            "create_time": "2020-06-30 01:22:46",
            "file_name": "0voice.png",
            "share_status": 0,
            "pv": 0,
            "url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
            "size": 15107,
            "type": "png"
        }
    ]
}

按下载量升序

请求url

URL
http://192.168.221.152/myfiles?cmd=pvasc
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
token
同上
必填
user
用户名称
不能超过 32 个字符
必填
count
文件个数
文件个数需大于 0
必填
start
开始位置
必填

返回结果说明

名称
含义
规则说明
files
文件结果集
"user": 用户名称,
"md5": md5 值 ,
"create_time": 创建时间,
"file_name": 文件名,
"share_status": 共享状态, 0 为没有共享, 1 为共享
"pv": 文件下载量,下载一次加 1
"url": URL,
"size": 文件大小,
"type": 文件类型

示例

调用接口

        http://192.168.221.152/myfiles?cmd=pvasc

参数       

        {
                "count": 1,
                "start": 0,
                "token": "ecf3ac6f8863cd17ed1d3909c4386684",
                "user": "wei"
        }

返回结果      

{
    "files": [
        {
            "user": "milo",
            "md5": "0afa719eb8a079553d14a2ae68111b82",
            "create_time": "2020-06-30 01:22:46",
            "file_name": "0voice.png",
            "share_status": 0,
            "pv": 0,
            "url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
            "size": 15107,
            "type": "png"
        }
    ]
}

按下载量降序

请求url

URL
http://192.168.221.152/myfiles?cmd=pvesc
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
token
同上
必填
user
用户名称
不能超过 32 个字符
必填
count
文件个数
文件个数需大于 0
必填
start
开始位置
必填

返回结果说明

名称
含义
规则说明
files
文件结果集
"user": 用户名称,
"md5": md5 值 ,
"create_time": 创建时间,
"file_name": 文件名,
"share_status": 共享状态, 0 为没有共享, 1 为共享
"pv": 文件下载量,下载一次加 1
"url": URL,
"size": 文件大小,
"type": 文件类型

示例

调用接口

        http://192.168.221.152/myfiles?cmd=pvesc

参数       

        {
                "count": 1,
                "start": 0,
                "token": "ecf3ac6f8863cd17ed1d3909c4386684",
                "user": "wei"
        }

返回结果      

{
    "files": [
        {
            "user": "milo",
            "md5": "0afa719eb8a079553d14a2ae68111b82",
            "create_time": "2020-06-30 01:22:46",
            "file_name": "0voice.png",
            "share_status": 0,
            "pv": 0,
            "url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
            "size": 15107,
            "type": "png"
        }
    ]
}

分享文件

获取共享文件

        分三个接口:

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

获取共享文件数量

请求url

URL
http://192.168.221.152/sharefiles?cmd=count
请求方式
GET
HTTP 版本
1.1
Content-Type
application/x-www-form-urlencoded

请求参数

返回结果说明

名称
含义
规则说明
count
数量

示例

调用接口

        http://192.168.221.152/sharefiles?cmd=count

参数       

       无

返回结果      

        {
                  "count": "10"
        }

获取共享文件列表

请求url

URL
http://192.168.221.152/sharefiles?cmd=normal
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
count
数量
必填
start
开始位置
必填

返回结果说明

名称
含义
规则说明
files
文件结果集
"user": 用户名称,
"md5": md5 值 ,
"create_time": 创建时间,
"file_name": 文件名,
"share_status": 共享状态, 0 为没有共享, 1 为共享
"pv": 文件下载量,下载一次加 1
"url": URL,
"size": 文件大小,
"type": 文件类型

示例

调用接口

        http://192.168.221.152/sharefiles?cmd=normal

参数              

        {
                "count": 1,
                "start": 0
        }

返回结果      

 {
        "files": [
        {
            "user": "milo",
            "md5": "0afa719eb8a079553d14a2ae68111b82",
            "create_time": "2020-06-30 01:22:46",
            "file_name": "0voice.png",
            "share_status": 0,
            "pv": 0,
            "url": "http://192.168.52.139:80/group1/M00/00/00/wKg0i1769laAUapKAAA7AwV_nec641.png",
            "size": 15107,
            "type": "png"
        }
    ]
}

获取共享文件下载排行榜

请求url

URL
http://192.168.221.152/sharefiles?cmd=pvdesc
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
count
数量
必填
start
开始位置
必填

返回结果说明

名称
含义
规则说明
files
文件结果集
"filename": 文件名,
"pv": 文件下载量,下载一次加 1

示例

调用接口

        http://192.168.221.152/sharefiles?cmd=pvdesc

参数              

        {
                "count": 1,
                "start": 0
        }

返回结果      

 {
        "files": [
        {
                "filename": "ui_buttongroup.h",
                "pv": 0
        }
    ]
}

处理文件

删除文件

  •  先判断此文件是否已经分享
  • 判断集合有没有这个文件,如果有,说明别人已经分享此文件(redis 操作)
  • 如果集合没有此元素,可能因为 redis 中没有记录,再从 mysql 中查询,如果 mysql 也没有, 说明真没有(mysql 操作)
  • 如果 mysql 有记录,而 redis 没有记录,那么分享文件处理只需要处理 mysql (mysql 操作)
  • 如果 redis 有记录,mysql 和 redis 都需要处理,删除相关记录

请求url

URL
http://192.168.221.152/dealfiles?cmd=del
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
令牌
同上
必填
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值

013: token 验证失败

004:失败

示例

调用接口

        http://192.168.221.152/dealfiles?cmd=del

参数       

{
    "filename": "Makefile",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "token": "ecf3ac6f8863cd17ed1d3909c4386684",
    "user": "wei"
}

返回结果      

        {
            "code": "013"
        }

分享文件

    a)先判断此文件是否已经分享,判断集合有没有这个文件,如果有,说明别人已经分享此文件,中断操作(redis操作判断md5+filename是否存在有序集合中)

    b)如果集合没有此元素,可能因为redis中没有记录,再从mysql中查询,如果mysql也没有,说明真没有(mysql操作)

    c)如果mysql有记录,而redis没有记录,说明redis没有保存此文件,redis保存此文件信息后,再中断操作(redis操作)

    d)如果此文件没有被分享,mysql保存一份持久化操作(mysql操作:更新user_file_list表,令对应记录的shared_status=1;在share_file_list表中插入一条记录;更新user_file_count表)

    e)redis集合中增加一个元素(redis操作)

    f)redis对应的hash也需要变化 (redis操作)

请求url

URL
http://192.168.221.152/dealfiles?cmd=pv
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
令牌
同上
必填
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值010: 成功
011: 失败
012: 别人已经分享此文件
013: token 验证失败

示例

调用接口

        http://192.168.221.152/dealfiles?cmd=pv

参数       

{
    "filename": "Makefile",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "token": "ecf3ac6f8863cd17ed1d3909c4386684",
    "user": "wei"
}

返回结果      

        {
            "code": "016"
        }

更新文件下载计数

url:127.0.0.1:80/dealfile?cmd=pv。更新 user_file_list 对用的 pv 值。

请求url

URL
http://192.168.221.152/dealfile?cmd=pv
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
token
令牌
同上
必填
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值016: 成功

示例

调用接口

        http://192.168.221.152/dealfile?cmd=pv

参数       

{
    "filename": "object_script.0voiceCloudDisk.Debug",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "token": "ecf3ac6f8863cd17ed1d3909c4386684",
    "user": "wei"
}

返回结果      

        {
            "code": "016"
        }

处理分享文件

取消分享

   url:http://ip/dealsharefile?cmd=cancel

  • 更新user_file_list表的shared_status = 0
  • 查询用户文件的数量 user_file_count
  • 如果用户文件数量count为 1 则删除user_file_count对应的行;如果用户文件数量count>1,则更新user_file_count的count-1
  • 将文件从 share_file_list 中删除
  • 将文件从 FILE_PUBLIC_ZSET 排行榜删除;将文件从FILE_NAME_HASH中移除

请求url

URL
http://192.168.221.152/dealsharefile?cmd=cancel
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值

018: 成功

019:失败

示例

调用接口

        http://192.168.221.152/dealsharefile?cmd=cancel

参数       

{
    "filename": "object_script.0voiceCloudDisk.Debug",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "user": "wei"
}

返回结果      

        {
            "code": "018"
        }

转存文件

   url:http://ip/dealsharefile?cmd=save

   将共享文件列表中的某个文件添加到个人文件列表中。

  • 先查询是个人文件列表是否已经存在该文件。
  • 增加 file_info 表的 count 计数,表示多一个人保存了该文件。
  •  个人的 user_file_list 增加一条文件记录
  •  更新个人的 user_file_count

请求url

URL
http://192.168.221.152/dealsharefile?cmd=save
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值

020: 成功

021:文件已存在

022:失败

示例

调用接口

        http://192.168.221.152/dealsharefile?cmd=save

参数       

{
    "filename": "object_script.0voiceCloudDisk.Debug",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "user": "wei"
}

返回结果      

        {
            "code": "020"
        }

共享文件下载计数更新

   url:http://ip/dealsharefile?cmd=pv

  • 更新 share_file_list 的 pv 值(为pv+1)
  • 判断filename+MD5是否存在redis的集合(FILE_PUBLIC_ZSET)中,如果存在,则filename+MD5对应的值+1;如果不存在,则从mysql导入数据并将(pv+1,filename+MD5)加入redis有序集合FILE_PUBLIC_ZSET,且redis对应的FILE_NAME_HASH集合加入(filename+MD5, filename).

请求url

URL
http://192.168.221.152/dealsharefile?cmd=pv
请求方式
POST
HTTP 版本
1.1
Content-Type
application/json

请求参数

参数名
含义
规则说明
是否必须
缺省值
user
用户名称
不能超过 32 个字符
必填
MD5
MD5值
md5 加密后的值
必填
filename
文件名称
不能超过 128 个字符
必填

返回结果说明

名称
含义
规则说明
code结果值

017: 成功

示例

调用接口

        http://192.168.221.152/dealsharefile?cmd=pv

参数       

{
    "filename": "object_script.0voiceCloudDisk.Debug",
    "md5": "602fdf30db2aacf517badf4565124f51",
    "user": "wei"
}

返回结果      

        {
            "code": "017"
        }

下载文件

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
文件内包含 Apache C++ 、Standard Library、ASL、Boost、BDE、Cinder、Cxxomfort:轻量级的,只包含头文件的库,将C++ 11的一些新特性移植到C++03中。 Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。 EASTL :EA-STL公共部分。 ffead-cpp :企业应用程序开发框架。 Folly:由Facebook开发和使用的开源C++库。 JUCE :包罗万象的C++类库,用于开发跨平台软件。 libPhenom:用于构建高性能和高度可扩展性系统的事件框架。 LibSourcey :用于实时的视频流和高性能网络应用程序的C++11 evented IO。 LibU : C语言写的多平台工具库。 Loki :C++库的设计,包括常见的设计模式和习语的实现。 MiLi :只含头文件的小型C++库。 openFrameworks :开发C++工具包,用于创意性编码。 Qt :跨平台的应用程序和用户界面框架。 Reason :跨平台的框架,使开发者能够更容易地使用Java,.Net和Python,同时也满足了他们对C++性能和优势的需求。 ROOT :具备所有功能的一系列面向对象的框架,能够非常高效地处理和分析大量的数据,为欧洲原子能研究机构所用。 STLport:是STL具有代表性的版本。 STXXL:用于额外的大型数据集的标准模板库。 Ultimate++ :C++跨平台快速应用程序开发框架。 Windows Template Library:用于开发Windows应用程序和UI组件的C++库。 Yomm11 :C++11的开放multi-methods。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值