blog实战 -part01,概念篇

开发前注意事项
    应该在开发不同的业务时,对不同的业务进行隔离,每个业务应该有自己独有的环境

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就行

posted on 2018-01-29 17:05  pythonerLau  阅读(131)  评论(0编辑  收藏  举报

导航