zoukankan      html  css  js  c++  java
  • 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就行

  • 相关阅读:
    Vue GET xxxx/sockjs-node/info?t=1573626343344 net::ERR_CONNECTION
    NavigationDuplicated Navigating to current location (“/XXX”) is not allowed
    node-sass报错(Node Sass could not find a binding for your current environment)
    DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead
    VSCODE 中.art文件识别为html文件
    gulp4.0构建任务
    gulp报错The following tasks did not complete
    setTimeout()
    格式化日期
    作业1.3
  • 原文地址:https://www.cnblogs.com/spidermansam/p/8378309.html
Copyright © 2011-2022 走看看