【Flask开发】嘿马文学web完整flask项目第5篇:定义路由,小说详情,5.搜索,5.搜索【附代码文档】

举报
程序员一诺python 发表于 2025/07/30 16:14:55 2025/07/30
【摘要】 课程简介 1. 课程内容 2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 2.用户认证 2.1微信平台 Json Web Token(JWT) 定义路由,书架管理--添加书籍 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目部署uWSG

教程总体简介:课程简介、2.用户认证、Json Web Token(JWT)、定义路由、书架管理--添加书籍、书架管理--最后阅读、3.书架、4.分类、5.搜索、6.小说、7.浏览记录、8.配置、9.部署、10.补充

项目完整code和文档,小伙伴们---->git仓库


全套教程部分目录:

5.搜索

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

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

  • 在applet_app/search.py文件中实现业务。

1-1 搜索-精准&高匹配&推荐接口设计

  • 接口名称:搜索-精准&高匹配&推荐
  • 接口路径:/search/recommendeds
  • 请求方法:GET
  • 请求参数:
参数名称 是否必须 参数类型 参数位置 备注
key_word True 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_id True int URL路径参数 书籍id
page True int query 当前页数
pagesize True int query 每页数量,默认10条
order True int query 排序条件,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_id True int URL路径参数 书籍id
Content-Type True application/json Headers 参数类型
chapter_id False int query 章节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、定义视图 ```python

定义路由,小说阅读

@book_bp.route("/reader/") 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.如果数据存在,查询书籍内容表 content = BookChapterContent.query.filter_by(book_id=book_id,chapter_id=chapter_id).first() # 6.如果用户登录,查询用户阅读进度表; progress = None # 需要在middlewares.py文件中补充代码:g.user_id = None if g.user_id: progress

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。