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

news2025/5/17 16:52:39

教程总体简介: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/嘿马文学web完整flask项目/note.md

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


全套教程部分目录:


部分文件图片:

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表示书籍的收藏数量
  • 返回数据:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    "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、创建蓝图

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Blueprint

category_bp = Blueprint('category', __name__)

2、定义视图

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义路由,分类书籍列表


@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关键词
  • 返回数据:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    'title':'搜索词',
      'isHot':'是否热门'
}
1-2 热门搜索词的基本业务:
  • 获取参数
  • 根据关键词参数,搜索关键词表进行过滤包含关键词查询
  • 返回结果
1-3 代码实现
  • 1.创建蓝图
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 导入蓝图


from flask import Blueprint



# 创建蓝图对象


search_bp = Blueprint('search',__name__,url_prefix='/search')
  • 2.定义视图
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义路由,关键词热门搜索


@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关键词
  • 返回数据:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
    "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 搜索书本列表的基本业务:
  • 获取参数
  • 判断查询关键词是否存在
  • 如果存在关键词,按照书籍名称进行包含关键词过滤查询
  • 对查询结果进行分页处理
  • 遍历分页结果,添加数据
  • 返回数据
1-3 代码实现

1、创建蓝图

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import Blueprint

search_bp = Blueprint('search', __name__,url_prefix='/search')

2、定义视图

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 定义路由,搜索书本列表


@search_bp.route('/books')
def search_books():
    # 1.获取参数,key_word/page/pagesize
    key_word = request.args.get("key_word")
    page = request.args.get('page',1,int)
    pagesize = request.args.get("pagesize",10,int)
    # 2.检查关键词参数
    if not key_word:
        return jsonify(msg='参数错误'),400
    # 3.根据关键词参数,对书籍数据库进行过滤查询,包含
    query = Book.query.filter(Book.book_name.contains(key_word))
    # 4.判断查询结果
    # 5.对查询结果进行分页处理,items/page/pages
    paginate = query.paginate(page,pagesize,False)
    # 获取分页后的书本数据
    book_list = paginate.items
    # 6.遍历分页后的数据,获取每本书籍的数据
    items = []
    for book in book_list:
        items.append({
            'id':book.book_id,
            'title':book.book_name,
            'intro':book.intro,
            'author':book.author_name,
            'state':book.status,
            'category_id':book.cate_id,
            'category_name':book.cate_name,
            'imgURL':'
        })
    # 7.返回结果
    data = {
        'counts':paginate.total,
        'pages':paginate.pages,
        'page':paginate.page,
        'items':items
    }
    return jsonify(data)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2333069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…

解决:AttributeError: module ‘cv2‘ has no attribute ‘COLOR_BGR2RGB‘

opencv AttributeError: module ‘cv2’ has no attribute ‘warpFrame’ 或者 opencv 没有 rgbd 解决上述问题的方法是&#xff1a; 卸载重装。 但是一定要卸载干净&#xff0c;仅仅卸载opencv-python是不行的。无限重复都报这个错。 使用pip list | grep opencv查看相关的…

NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统

NutriJarvis&#xff1a;AI慧眼识餐&#xff0c;精准营养触手可及&#xff01;—— 基于深度学习的菜品识别与营养计算系统 NutriJarvis 是一个基于深度学习的菜品识别与营养计算系统&#xff0c;旨在通过计算机视觉技术自动识别餐盘中的食物&#xff0c;并估算其营养成分&…

【LaTeX】

基本使用 \documentclass 类型&#xff1a;文章&#xff08;article&#xff09;、报告&#xff08;report&#xff09;、书&#xff08;book&#xff09; 中文的文章是ctexart&#xff0c;中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思&#xf…

细说STM32单片机FreeRTOS任务管理相关函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理相关函数 1、FreeRTOS函数 2、FreeRTOS宏函数 3、主要函数功能说明 &#xff08;1&#xff09;创建任务osThreadNew() &#xff08;2&#xff09;删除任务vTaskDelete() &#xff08;3&#xff09;挂起任务vTaskSuspend() &#xff08;4&…

uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)

一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字&#xff08;含小数点&#xff09;---设置specifyTypedecimal&#xff0c;可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…

leetcode-419.棋盘上的战舰

leetcode-419.棋盘上的战舰 文章目录 leetcode-419.棋盘上的战舰一.题目描述二.第一次代码提交三.第二次代码提交 一.题目描述 二.第一次代码提交 class Solution { public:int countBattleships(vector<vector<char>>& board) {int m board.size(); //列数i…

使用uglifyjs对静态引入的js文件进行压缩

前言 因为有时候js文件没有npm包&#xff0c;或者需要修改&#xff0c;只能引入静态的js&#xff0c;那么这个时候就可以对js进行压缩了。我其实想通过vite、webpack等插件进行压缩的&#xff0c;可是他都不能定位到public目录下面的文件&#xff0c;所以我只能自己压缩了。编…

程序加壳脱壳原理和实现

理论 一个可运行的执行文件&#xff0c;至少会有一个代码段&#xff0c;程序的入口点指向代码段&#xff0c;程序运行的时候&#xff0c;从入口点开始执行代码段指令 为了将一个正常的程序进行加壳保护&#xff0c;至少要三部分逻辑配合 1、待加壳保护的程序 2、加壳逻辑 3…

【数据分析实战】使用 Matplotlib 绘制折线图

1、简述 在日常的数据分析、科研报告、项目可视化展示中&#xff0c;折线图是一种非常常见且直观的数据可视化方式。本文将带你快速上手 Matplotlib&#xff0c;并通过几个实际例子掌握折线图的绘制方法。 Matplotlib 是 Python 中最常用的数据可视化库之一&#xff0c;它能够…

数据仓库标准库模型架构相关概念浅讲

数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考&#xff1a;数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之&#xff0c;数据库是为捕获数据而设计&#xff0c;数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中&#xff0c;其会有自…

亚洲区域健康人群免疫细胞marker

最近发现一篇文献&#xff0c;作者来自新加坡基因研究所&#xff0c;这篇文章大概是整理了619个亚洲人群的免疫多样性图集&#xff08;AIDA&#xff09;&#xff0c;跨越了7个国家&#xff0c;最终使用了1,265,624个免疫细胞的单细胞数据&#xff0c;并最终确定了8种主要的免疫…

三极管以及mos管

三极管与mos管的高低电平导通判断 &#xff08;1&#xff09;三极管的高低电平导通判断 三极管中有2个PN结&#xff0c;分别称为发射结和集电极结&#xff0c;按材料划分为硅材料三极管&#xff08;硅管&#xff09;&#xff0c;锗材料三极管&#xff08;锗管&#xff09;&am…

PPT模板之--个人简历

还在为制作 PPT 时毫无头绪、对着空白页面抓耳挠腮而烦恼吗&#xff1f;别担心&#xff0c;这里就是你的 PPT 灵感补给站&#xff01;在这个快节奏的信息时代&#xff0c;一份吸睛又高效的 PPT 至关重要&#xff0c;它能在商务汇报中助你赢得先机&#xff0c;在课堂展示时让你脱…

springboot--页面的国际化

今天来实现页面中的国际化 首先&#xff0c;需要创建一个新的spring boot项目&#xff0c;导入前端模板&#xff0c;在我的博客中可以找到&#xff0c;然后将HTML文件放在templates包下&#xff0c;将其他的静态资源放在statics包下&#xff0c;如下图结构 页面的国际化主要在首…

前端学习10—Ajax

1 AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大优势为&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方…

list的常见接口使用

今天&#xff0c;我们来讲解一下C关于STL标准库中的一个容器list的常见接口。 在我们之前c语言数据结构中&#xff0c;我们已经了解过了关于链表的知识点了&#xff0c;那么对于现在理解它也是相对来说比较容易的了。 数据结构--双向循环链表-CSDN博客 1. 定义与包含头文件 …

一维差分数组

2.一维差分 - 蓝桥云课 问题描述 给定一个长度为 n 的序列 a。 再给定 m 组操作&#xff0c;每次操作给定 3 个正整数 l, r, d&#xff0c;表示对 a_{l} 到 a_{r} 中的所有数增加 d。 最终输出操作结束后的序列 a。 ​​Update​​: 由于评测机过快&#xff0c;n, m 于 20…

再次重拾jmeter之踩坑

1.添加“csv数据文件设置”&#xff0c;运行时提示 java.lang.IllegalArgumentException: Filename must not be null or empty检查多次后才发现因为我运行的是整个线程组&#xff0c;所以对应http请求下不能包括空的csv文件 2. 填写ip时不能加/&#xff0c;要在路径里加&…

4-6记录(B树)

找左边右下或者右边左下 转化成了前驱后继的删除 又分好几种情况&#xff1a; 1. 只剩25&#xff0c;小于2&#xff0c;所以把父亲拉到25旁边&#xff0c;兄弟的70顶替父亲 对于25&#xff0c;25的后继就是70&#xff0c;25后继的后继是71&#xff08;中序遍历) 2. 借左子树…