头图

教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目部署uWSGI 配置 启动 9.部署 10.1异常和日志 10.补充 10.2 flask-restful 1.项目目录实现 3.数据库迁移: 1.JWT:json web token 2.jwt工具的封装 4.用户权限校验 5.登录验证装饰器 1.书架列表 2.书架管理 3.最后阅读 2.分类书籍列表 3.热门搜索 7.3小说-详情 2.小说目录 2.阅读偏好 3.阅读设置

完整笔记资料代码:https://gitee.com/yinuo112/Backend/tree/master/Flask/嘿马文学...

感兴趣的小伙伴可以自取哦~


全套教程部分目录:


部分文件图片:

5.搜索

  • 搜索-热门搜索词
  • 搜索-书本列表-模糊
  • 搜索-精准&高匹配&推荐

5.3搜索-精准&高匹配&推荐

  • 在applet_app/search.py文件中实现业务。
1-1 搜索-精准&高匹配&推荐接口设计
  • 接口名称:搜索-精准&高匹配&推荐
  • 接口路径:/search/recommendeds
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
key_wordTrue query关键词
  • 返回数据:

    • 精准返回1条
    • 匹配返回2条
    • 推荐返回4条
{
    "accurate": {},
    "match": [
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 5,
            "imgURL": "
            "introduction": "再见,已是陌路人  ",
            "state": 1,
            "title": "再见,已是陌路人"
        }
    ],
    "recommends": [
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 1,
            "imgURL": "
            "introduction": "大燕仙朝在都市",
            "state": 1,
            "title": "大燕仙朝在都市"
        },
    ]
}
1-2 搜索-精准&高匹配&推荐的基本业务:
  • 获取参数关键词
  • 根据关键词,查询关键字表
  • 判断查询结果,如果不存在,保存该关键词
  • 如果存在该关键词,让其次数加1,如果该关键词次数大于10,标记该关键词为热门
  • 定义列表,用来存储书本的id,进行过滤查询的条件判断。
  • 1条精确查询:根据关键词,查询书籍表,根据书籍名称匹配,保存数据
  • 2条高匹配:查询书名包含关键词,并且该书不是1条精确查询的数据,提取2条,保存数据
  • 4条推荐:直接从书籍表过滤查询,不在列表范围内的书籍,取出4条作为推荐阅读。
  • 返回结果,1条精确匹配、2条高匹配、4条推荐。
1-3 代码实现

1、使用search蓝图

from flask import Blueprint

search_bp = Blueprint('search', __name__)

2、定义视图

  
  
# 定义路由,搜索--精准匹配--高匹配--推荐
  
  
@search_bp.route("/recommends")
def recommends():
    # 1.获取参数搜索关键词,key_word
    key_word = request.args.get('key_word')
    # 2.根据关键词,搜索SearchKeyWord表
    skw = SearchKeyWord.query.filter(SearchKeyWord.keyword==key_word).first()
    # 3.判断查询结果,判断关键词是否存在
    # 4.如果不存在,保存关键词
    if skw is None:
        skw = SearchKeyWord(keyword=key_word,count=0)
    # 5.如果存在关键词,count计数加1,如果count大于10,标记为热门关键词
    skw.count += 1
    if skw.count >= 10:
        skw.is_hot = True
    db.session.add(skw)
    db.session.commit()
    # 6.定义列表容器,用来存储7条书籍数据的id,进行书籍数据重复的判断
    book_list = []
    # 7.精准匹配1条:根据关键词查询书籍表,用书籍名称进行匹配,保存数据;
    accurate_data = Book.query.filter_by(book_name=key_word).first()
    # 定义精准匹配到的字典容器,用来存储匹配到的的书籍数据
    accurate = {}
    # 如果有数据
    if accurate_data:
        accurate = {
            'id':accurate_data.book_id,
            'title':accurate_data.book_name,
            'intro':accurate_data.intro,
            'state':accurate_data.status,
            'category_id':accurate_data.cate_id,
            'category_name':accurate_data.cate_name,
            'imgURL':'
        }
        book_list.append(accurate_data.book_id)
    # 8.高匹配2条:根据书名包含查询关键词,并且,该书不是精确查询的数据,默认提取2条,保存数据;
    query = Book.query.filter(Book.book_name.contains(key_word),not_(Book.book_id.in_(book_list)))
    match_data = query.limit(2)
    match = []
    for book in match_data:
        match.append({
            'id':book.book_id,
            'title':book.book_name,
            'intro':book.intro,
            'state':book.status,
            'category_id':book.cate_id,
            'category_name':book.cate_name,
            'imgURL':'
        })
        book_list.append(book.book_id)
    # 9.推荐4条:根据书籍表过滤查询,不在之前查询到数据范围内的书籍,取出4条作为推荐阅读。
    recommends_data = Book.query.filter(not_(Book.book_id.in_(book_list))).limit(4)
    recommends_list = []
    # 遍历书籍数据
    for book in recommends_data:
        recommends_list.append({
            'id': book.book_id,
            'title': book.book_name,
            'intro': book.intro,
            'state': book.status,
            'category_id': book.cate_id,
            'category_name': book.cate_name,
            'imgURL': ' book.cover)
        })
    # 10.返回结果,精准匹配1条、高匹配2条、推荐4条,共7条书籍数据。
    data = {
        'accurate':accurate,
        'match':match,
        'recommends_list':recommends_list
    }
    return jsonify(data)

3、使用postman对接口进行测试:

  • 查看搜索关键词表,是否保存了关键词记录。

5.搜索

  • 搜索-热门搜索词
  • 搜索-书本列表-模糊
  • 搜索-精准&高匹配&推荐

6.1小说-目录

  • 在applet_app/book.py文件中实现业务。
1-1 小说-目录接口设计
  • 接口名称:小说-目录
  • 接口路径:/book/chapters/:bookID
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
book_idTrueintURL路径参数书籍id
pageTrueintquery当前页数
pagesizeTrueintquery每页数量,默认10条
orderTrueintquery排序条件,0升序,1倒序
  • 返回数据:
{
    "author": "",
    "categoryID": 1,
    "categoryName": null,
    "id": 2,
    "imgURL": "
    "introduction": "这是莫离第一次离家...",
    "lastChapter": "第九章 小三登堂入室",
    "state": 1,
    "title": "偏执狂总裁,暗宠娇妻",
    "words": 0
}
1-2 小说-目录的基本业务:
  • 根据书籍id查询数据库书籍表
  • 获取查询字符串参数,page、pagesize、order
  • 查询数据库书籍章节表,按照书籍id进行过滤查询
  • 判断排序条件,如果order值是1,倒序排序,否则升序排序
  • 对查询结果进行分页
  • 遍历分页数据
  • 返回结果
1-3 代码实现

1、定义book蓝图

from flask import Blueprint

book_bp = Blueprint('book', __name__,url_prefix='/book')

2、定义视图

  
  
# 定义路由,小说目录列表
  
  
@book_bp.route('/chapters/<int:book_id>')
def chapter_list(book_id):
    # 1.获取查询字符串参数,page/pagesize/order
    page = request.args.get('page',1,int)
    pagesize = request.args.get('pagesize',10,int)
    order = request.args.get("order",0,int)
    # 2.根据书籍id参数,查询书籍表
    book = Book.query.get(book_id)
    if not book:
        return jsonify(msg='书籍不存在'),404
    # 3.查询书籍章节目录表,按照书籍id进行过滤查询
    query = BookChapters.query.filter(BookChapters.book_id==book_id)
    # 4.根据order参数的排序条件,如果1倒序排序,如果0升序排序
    if order == 1:
        query = query.order_by(BookChapters.chapter_id.desc())
    else:
        query = query.order_by(BookChapters.chapter_id.asc())
    # 5.对排序的结果,进行分页处理
    paginate = query.paginate(page,pagesize,False)
    data_list = paginate.items
    # 6.遍历分页的数据,获取章节信息
    items = []
    for data in data_list:
        items.append({
            'id':data.chapter_id,
            'title':data.chapter_name
        })
    # 构造响应数据
    chapter_data = {
        'counts':paginate.total,
        'pages':paginate.pages,
        'page':paginate.page,
        'items':items
    }
    # 7.转成json格式,返回数据
    return jsonify(chapter_data)

3、使用postman测试接口:

6.2小说-阅读

  • 在applet_app/book.py文件中实现业务。
1-1 小说-阅读接口设计
  • 接口名称:小说-详情
  • 接口路径:/book/reader/:bookID
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
book_idTrueintURL路径参数书籍id
Content-TypeTrueapplication/jsonHeaders参数类型
chapter_idFalseintquery章节id,不传表示用户最后的阅读进度
  • 返回数据:
{
    "article": "",
    "chapter": "第十章 保镖",
    "chapterID": 10,
    "id": 2,
    "progress": 0,
    "title": "偏执狂总裁,暗宠娇妻"
}
1-2 小说-阅读的基本业务:
  • 根据书籍id查询数据库书籍表
  • 获取查询字符串参数章节id
  • 校验参数
  • 根据章节id查询数据库书籍章节表,判断查询结果
  • 如果章节存在,查询数据库书籍内容表
  • 如果用户登录,查询数据库阅读进度表
  • 返回结果
1-3 代码实现

1、定义book蓝图

from flask import Blueprint

book_bp = Blueprint('book',__name__,url_prefix='/book')

2、定义视图

  
  
# 定义路由,小说阅读
  
  
@book_bp.route("/reader/<int:book_id>")
def reader_book(book_id):
    # 1.根据书籍id,查询书籍表,确认书籍的存在
    book = Book.query.get(book_id)
    if not book:
        return jsonify(msg='书籍不存在'),404
    # 2.获取查询字符串参数章节id,校验参数
    chapter_id = request.args.get('chapter_id',-1,int)
    if chapter_id < 1:
        return jsonify(msg='章节id不能小于1'),400
    # 3.根据章节id,查询书籍章节表
    chapter = BookChapters.query.get(chapter_id)
    # 4.判断查询结果
    if not chapter:
        return jsonify(msg='章节不存在'),404
    # 5.如果数据存在,查询书籍内容表

程序员一诺python
16 声望18 粉丝

python技术发烧友 资料收集狂