【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

56 阅读1分钟

教程总体简介:2.用户认证、Json Web Token(JWT)、3.书架、4.分类、5.搜索、6.小说、7.浏览记录、8.配置、9.部署、10.补充

juejin.cn/post/751044…

juejin.cn/post/752099…


全套教程部分目录:

4.分类

  • 分类书本列表
  • 分类列表大类,男生、女生

4.2分类书本列表

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

1-1 分类书本列表接口设计
  • 接口名称:分类-书本列表-筛选
  • 接口路径:/categoryies/filters
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
pageTrueintquery当前页数
pagesizeTrueintquery每页数据大小,默认10条
category_idTrueintquery分类id
wordsTrueintquery字数类型id,0 所有 ,1表示50万字以下,2表示50~100万字,3表示100万字以上
orderTrueintquery排序条件,1表示书籍的热度,2表示书籍的收藏数量
  • 返回数据:
{
    "counts": 11,
    "items": [
        ...
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 9,
            "imgURL": "
            "introduction": "腹黑总裁..",
            "state": 1,
            "title": "腹黑总裁,宠溺娇妻"
        },
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 10,
            "imgURL": "
            "introduction": "不要再纠缠爱我...",
            "state": 1,
            "title": "不要再纠缠爱我"
        }
    ],
    "page": 1,
    "pages": 2,
    "pagesize": 10
}
1-2 分类书本列表的基本业务:
  • 获取参数

  • 根据分类id,查询书籍大分类

  • 根据查询结果,使用关系引用,获取分类信息,使用set存储分类数据

  • 根据分类信息,查询书籍表,获取分类范围内的书籍的查询对象

  • 根据参数words判断查询条件,使用查询对象,进一步按书籍字数进行过滤查询

  • 根据参数order判断查询条件,使用查询对象,按照书籍的热度或是收藏数量排序查询

  • 对查询结果进行分页处理

  • 定义临时列表,遍历查询结果,添加数据

  • 返回结果

1-3 代码实现

1、创建蓝图

from flask import Blueprint

category_bp = Blueprint('category', __name__)

2、定义视图

  
  
# 定义路由,分类书籍列表
  
  
@category_bp.route('/filters')
def category_book_list():
    # 1.获取参数:page/pagesize/category_id/words/order
    page = request.args.get('page',1,int)
    pagesize = request.args.get('pagesize',10,int)
    category_id = request.args.get('category_id',0,int)
    # 字数类型说明:0表示所有,1表示50万字以下,2表示50~100万字,3表示100万字以上
    words = request.args.get('words',-1,int)
    # 排序条件说明:1表示按热度,2表示按收藏
    order = request.args.get('order',1,int)
    # 参数判断
    if not category_id:
        return jsonify(msg='缺少分类id'),400
    # 2.根据分类条件category_id,查询数据,查询书籍大分类数据
    categories = BookBigCategory.query.get(category_id)
    # 3.判断查询结果,根据大分类数据,使用关系引用,获取二级分类数据
    # 使用列表推导式,使用set集合
    seconds_id = set([i.cate_id for i in categories.second_cates])
    # 4.根据分类数据,查询书籍表,获取分类范围内的书籍数据
    # -----过滤查询:保存的是查询结果对象,因为,后续需要对数据进行再次查询的操作
    query = Book.query.filter(Book.cate_id.in_(seconds_id))
    # 5.根据字数条件words查询书籍数据
    # -----1表示50万字以下,2表示50~100万字,3表示100万字以上
    if words == 1:
        query = query.filter(Book.word_count < 500000)
    elif words == 2:
        query = query.filter(Book.word_count.between(500000,1000000))
    elif words == 3:
        query = query.filter(Book.word_count > 1000000)

    # 6.根据排序条件order,按照最热、收藏数量进行排序查询
    # -----1表示按热度,2表示按收藏
    if order == 1:
        query = query.order_by(Book.heat.desc())
    elif order == 2:
        query = query.order_by(Book.collect_count.desc())
    else:
        return jsonify(msg='错误的排序选项'),400
    # 7.对查询结果进行分页处理,paginate
    # -----paginate函数表示分页:返回结果为分页的对象
    # 第一个参数表示页数,第二个参数表示每页的条目数,第三个参数False表示分页异常不报错
    paginate = query.paginate(page,pagesize,False)
    # items表示获取分页后的数据、page表示当前页数、
    # pages表示每页数据条目数total表示分页的总页数
    books_list = paginate.items
    items = []
    # 8.遍历分页数据,获取每页数据、总页数
    for item in books_list:
        items.append({
            'id':item.book_id,
            'title':item.book_name,
            'introduction':item.intro,
            'author':item.author_name,
            'state':item.status,
            'category_id':item.cate_id,
            'category_name':item.cate_name,
            'imgURL':'
        })
    # 9.转成json,返回数据
    data = {
        'counts':paginate.total,
        'pagesize':pagesize,
        'pages':paginate.pages,
        'page':paginate.page,
        'items':items
    }
    return jsonify(data)

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

4.分类

  • 分类书本列表
  • 分类列表大类,男生、女生

5.1搜索热门搜索词

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

1-1 热门搜索词接口设计
  • 接口名称:搜索-热门搜索词
  • 接口路径:/search/tags
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
key_wordTruequery关键词
  • 返回数据:
{
    'title':'搜索词',
      'isHot':'是否热门'
}
1-2 热门搜索词的基本业务:
  • 获取参数

  • 根据关键词参数,搜索关键词表进行过滤包含关键词查询

  • 返回结果

1-3 代码实现
  • 1.创建蓝图
  
  
# 导入蓝图
  
  
from flask import Blueprint

  
  
# 创建蓝图对象
  
  
search_bp = Blueprint('search',__name__,url_prefix='/search')
  • 2.定义视图
  
  
# 定义路由,关键词热门搜索
  
  
@search_bp.route("/tags")
def tag_list():
    # 1.获取参数,用户搜索的关键词key_word
    key_word = request.args.get("key_word")
    # 校验参数
    if not key_word:
        return jsonify([])
    # 2.根据参数,查询数据库,搜索关键词表进行过滤查询、过滤关键词
    # 热门搜索词,默认提供10条数据
    search_list = SearchKeyWord.query.filter(SearchKeyWord.keyword.contains(key_word)).limit(10)
    # 3.返回查询结果
    data = [{
        'title':index.keyword,
        'isHot':index.is_hot,
    }for index in search_list]
    # 转成json返回
    return jsonify(data)
  • 因为数据库search_key_word表里目前没有数据,可以在搜索-精准高匹配推荐功能完成后,再进行功能测试。

5.2搜索书本列表

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

1-1 搜索书本列表接口设计
  • 接口名称:搜索-书本列表-模糊
  • 接口路径:/search/books
  • 请求方法:GET
  • 请求参数:
参数名称是否必须参数类型参数位置备注
pageTrueintquery当前页数
pagesizeTrueintquery页大小,默认10条
key_wordTruestringquery关键词
  • 返回数据:
{
    "counts": 11,
    "items": [
        ...
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 9,
            "imgURL": "
            "introduction": "腹黑总裁..",
            "state": 1,
            "title": "腹黑总裁,宠溺娇妻"
        },
        {
            "author": "",
            "categoryID": 1,
            "categoryName": null,
            "id": 10,
            "imgURL": "
            "introduction": "不要再纠缠爱我...",
            "state": 1,
            "title": "不要再纠缠爱我"
        }
    ],
    "page": 1,
    "pages": 2,
    "pagesize": 10
}
1-2 搜索书本列表的基本业务:
  • 获取参数
  • 判断查询关键词是否存在
  • 如果存