开发前注意事项
应该在开发不同的业务时,对不同的业务进行隔离,每个业务应该有自己独有的环境
ECHARTS
使用echarts对数据进行数据可视化的展现
aiohttp
后端使用 aiohttp响应请求
多人博客开发
----用户管理----
1、 用户注册
建表注意事项:
字符集继承数据库,或者自定义表字符集 China默认utf8mb4
假删
出现多对多关系,考虑新建表
博文字段类型、长度
博文中的图片使用url链接
使用JWT对数据进行加密
encode 加密
decode 解密
明文传输
使用base64 解码即可查看
建议传输非敏感信息
防篡改,任意改动一个字符都会影响整个签名
数据的安全
登录
使用数据 + 随机盐 保证数据的安全性
~~~~~~~~~~~~~~~
用户注册流程
01、创建数据库,保存用户的账户信息
02、构建一个后端服务器接口,接受用户的提交信息
03、模拟用户注册,通过POSTMAN提交注册信息(json格式)
04、对用户post上来的数据进行判断,判断输入的信息是否符合注册条件
05、若用户输入的数据符合注册条件,则传向后端服务器的数据库,进行永久存储
bolg开发第一个
登录
使用邮箱加密方式登录
邮箱要求唯一
密码的加密
早期使用MD5加密
现在使用 随机加盐,即hash->(password + salt),提高了数据被破解的难度
防止密码被暴力破解,例如-->穷举
采用慢hash算法,增加cpu计算时间,增加暴力破解的长度
bcrypt
使用bcrypt.gensalt() 拿到一个新的盐
每一次都会拿到不同的盐
计算生成的密文也不一样
$ 分隔符
$2b$. 加密算法
12. 表示2^12 key expansion rounds
盐salt b'96H867jyLCs0boBSfaAtL',22个字符,Base 64
密文 'Knc35flPjWCOe0Ygtq4Cb14tfeKbVc2' 31个字符 Base 64
建立工具模块
1、建立一个json序列化模块,until
2、构建config 配置文件(ip,port等等)
3、创建user模块
提供路由配置
提供用户登录处理
验证当前登录状态
提供用户注册处理
检验输入数据的合法性(唯一性)
对用户输入的敏感数据进行加密(jwt加密)
提取用户在post中body的数据(注册信息)将注册的数据传入后端数据库予以保存
4、考虑博客安全
在用户访问网页时,使用拦截器,拦截用户的请求,对其进行权限的验证
5、字段的类型考虑!!!
blog 的内容长度不太好容易设置限制,因为这些数据来自用户的输入,博客文可长可短
考虑使用TEXT类型
大小:
text的长度是65535,而LONGTEXT的长度是2的32-1次幂的长度,这个长度,足够使用了
6、考虑图片的储存
图片的存储可以考虑存储一个url链接
可以考虑使用 外链,引入外部链接,但是需要考虑 盗链的问题
使用本站的图片存储,得考虑水印,图片清理,在线压缩,图片存储等等问题
7、字段的考虑
content拆分字段,将访问较为频繁的字段放在一张表中,访问量较小的存储到另一张表中
开发前应该考虑项目的分层:
Model层,实现ORM的映射
后期调用这个模块就可以直接将数据操作如数据库中
Model层中,使用Sqlalchemy模块,建立起一个数据库的连接对象
这个模块中,应该实现定义时的用户表,博文表,POST表
当关系映射的模块完成之后,就要考虑接受用户数据了
用户使用POST方法,数据信息在请求的body中,可以提取出来,经过判断后,传入后方数据库
但是用户输入的信息应该分析,清洗
例如密码,为了保护用户的安全,应该是单向的加密后传入数据库
例如账号,保证用户的账户唯一性,数据库中应该设置用户账号的唯一键
例如邮箱,也应该是保证唯一的
建立工具模块
提供序列化数据的功能
配置文件应该单另生成一个配置文件(json,ini,crv等等),后期直接加载,
reg接口实现
接受用户通过post提交的json数据
检查eamil是否存在,存在返回错误,不存在则 存入数据库
数据提交到数据库的流程应该为
先访问service层-->由serevice层调用数据访问层的方法-->将数据写入数据库
密码使用bcypt加密后存储
注册成功后,可以要求用户重新登录,也可以返回json信息,包含一个token给用户,用户直接就访问网站
提取request.body数据-->填充user对象-->持久化-->返回token
token 生成
需要一个密码,密码应该写在config.py中,
应该定义过期时长,token中包含用户的id等信息,使用jwt加密
login接口
用户登录,需要提交邮箱与密码
使用email查询,不存在,返回异常;
存在,返回User对象,验证密码,验证成功,返回token和用户信息
用户的密码不能返回给客户端,加密的也不可以
执行流程 request --> 比对eamil-->比对密码-->返回用户信息与token
认证接口
如何获取浏览器中的token信息?
1、
使用Header中的Authorization
通过这个header增加token信息
通过header发送数据,所有方法可以是Post、Get
2、
自定义header
JWT来发送token
认证
很多业务都需要认证用户的信息
这里使用时间戳来进行比较,过期返回401,客户端收到跳转登录页面
如果没有提交user id,直接重新登录,若查到用户,填充user对象
request -->时间戳比较 -->user id 比较 -->return request
博文的接口实现
发布(增加)
post 路径是/
看文章(查询)
get 路径是/{id:int}
列表(分页)
get 路径是/
pub接口的实现
用户从浏览器中提交json数据,里面应该包含title,content数据
提交的header要包含jwt,且要验证通过
get接口的实现
根据post_id ==/post/12345 查询博文并返回
这里不需要认证,及headers里面不要带上jwt
request.GET --> get post By id --> return post+cotent
list接口的实现
发起get请求,通过查询字符串 http://url/post/?page=2 查询第二页数据
request: GET -->get all(page=1) -->return post list
分页完善:
分页信息,一般有:
当前页/总页数
当前页page
总页数 pages = count / size
行限制数: size 每页最多多少行
记录总数 count 从select * from table中得来
blog的功能增强
分类和标签
分类:
即文章不同的类型
标签:
即附加的属性
例如 文章类型属于python类,内容是 网络与多线程,则标签为 多线程 与 网络
转发
转发到朋友圈,微博,空间,都需要知道对方的系统开发的API
搜索
搜索是一个比较实用的功能,简单的实现,就是使用like语句查询数据库
可以考虑独立出,单独开发一个搜索引擎
点击量设计
增加post表中的字段,增加一个hits字段,类型为bigint 增加为索引字段
将hits作为索引,因为经常使用点击量排行
成功打开一次文章,记录一次
踩和赞设计
增加一个 dig表,记录不同博文的点赞数等
避免重复点赞,每个用户只允许点一次
点赞和踩应该互斥,即 二者只能选一
记录用户的id,避免重复点赞
表的生产 --> sqlalchemy中生成
CREATE TABLE dig
(
id INTEGER NOT NULL AUTO_INCREMENT,
user_id INTEGER NOT NULL,
post_id BIGINT NOT NULL,
state INTEGER NOT NULL,
pubdate DATETIME NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY(user_id) REFERENCES user (id),
FOREIGN KEY(post_id) REFERENCES post (id)
)
Dig实体类的实现
添加约束,例如外键,唯一键等等,可以指定数据库引擎,属性必须是一个元组或者字典
__table_args_ = (UniqueConstraint('user_id','post_id',name='unq_user_post'),)
表的关联
user = relationship('User')
在详情页中
增加点赞数,踩的数目
显示最后点赞,踩用户列表 Top 10
总结
点击值,赞踩值都是经常要查的数据,是统计出的数据
这些数据不要求精确
查询时也应该少量的查询
空间换时间 为了性能违反了范式
可以将数据放在redis中,第一次查询,存入redis中,以后从redis中查询即可
接口
开发应该先设计接口,然后出文档,多人开发时,遵守开发的约定
接口参数,返回值都要规范,后端开发时,就可以单独的开发好接口
前端开发这,按照接口设计,用时直接调用接口API就行