当前位置: 首页 > article >正文

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

教程总体简介: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 Blueprintcategory_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/orderpage = 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.itemsitems = []# 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_wordkey_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 Blueprintsearch_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/pagesizekey_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/pagespaginate = 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对接口进行测试:

相关文章:

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

教程总体简介&#xff1a;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项目…...

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

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

基于 Q - learning 算法的迷宫导航

这段 Python 代码实现了一个基于 Q - learning 算法的迷宫导航系统。代码通过定义迷宫环境、实现 Q - learning 算法来训练智能体&#xff0c;使其能够在迷宫中找到从起点到终点的最优路径&#xff0c;同时利用训练好的 Q 表来测试智能体的导航能力。 在这个代码实现的迷宫环境…...

解决: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;并估算其营养成分&…...

作为一名java技术博主如何突围

作为一位Java开发和技术博主&#xff0c;想要在抖音上快速提升粉丝数量和视频播放量&#xff0c;可以结合以下策略进行优化&#xff1a; 1. 明确目标受众与技术方向 细分领域&#xff1a;技术领域广泛&#xff0c;可以专注于Java开发、算法、框架解析&#xff08;如Spring Boo…...

【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、支持输入身份证号---设…...

VLM-R1GRPO微调,强化学习训练, 实战训练教程(2)

https://www.dong-blog.fun/post/2013 VLM-R1GRPO微调&#xff0c; 实战训练教程&#xff08;1&#xff09;&#xff1a; https://www.dong-blog.fun/post/1961 本博客这次使用多图进行GRPO。 官方git项目&#xff1a;https://github.com/om-ai-lab/VLM-R1?tabreadme-ov-f…...

系统弹出消息功能,且保证用户只能获取弹出一次消息

要实现系统弹出消息功能&#xff0c;且保证用户只能获取弹出一次消息&#xff0c;你可以借助 Redis 来达成。基本思路是&#xff1a;把消息存于 Redis 的列表中&#xff0c;同时用 Redis 的集合记录用户是否已接收过该消息。下面是一个示例工具类&#xff0c;其中包含推送消息和…...

Python代码解释

文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下&#xff1a; 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...

GPIO_ReadInputData和GPIO_ReadInputDataBit区别

目录 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 总结 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是两个函数&#xff0c;通常用于读取微控制器GPIO&#xff08;通用输入输出&#xff09;引脚的输入状态&#xff0c;特别是在STM32系列微控制器中。它们之间的主要…...

MySQL数据库编程总结

MySQL数据库编程总结 一、数据库概述 数据库定义 • 数据库是管理数据的软件系统&#xff0c;用于高效存储、管理和检索数据&#xff0c;减少冗余。 • 核心功能&#xff1a;通过SQL语言定义、操作数据&#xff0c;维护完整性和安全性。 常见数据库 • MySQL、Oracle、SQL Ser…...

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;所以我只能自己压缩了。编…...

ecovadis评分要求,如何提高ecovadis分数,未来展望

EcoVadis评分要求、提升方法及未来展望 1. EcoVadis评分概述 EcoVadis是全球领先的企业可持续发展评级平台&#xff0c;评估企业在环境&#xff08;E&#xff09;、劳工与人权&#xff08;L&#xff09;、商业道德&#xff08;B&#xff09;、可持续采购&#xff08;S&#x…...

程序加壳脱壳原理和实现

理论 一个可运行的执行文件&#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种主要的免疫…...

tree-sitter的grammar.js解惑

❓问题1&#xff1a;grammar.js 不是用正则表达式 /.../ 吗&#xff1f;为什么有 print 这样的字符串&#xff1f; ✅ 回答&#xff1a; grammar.js 分成两类“终结符”表示法&#xff1a; 表达方式含义xxx直接匹配该字符串字面量/regex/匹配符合正则的文本 &#x1f4a1; …...

三极管以及mos管

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

第十七天 - Jenkins API集成 - 流水线自动化 - 练习:CI/CD流程优化

前言 在DevOps实践中&#xff0c;持续集成与持续交付&#xff08;CI/CD&#xff09;是现代软件工程的核心支柱。作为业界使用最广泛的自动化服务器&#xff0c;Jenkins凭借其强大的插件生态和灵活的流水线配置能力&#xff0c;成为企业级CI/CD落地的首选工具。本文将深入解析J…...

PPT模板之--个人简历

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

【远程工具】1.1 时间处理设计与实现(datetime库lib.rs)

一、设计原理与决策 时间单位选择 采用**秒&#xff08;s&#xff09;**作为基准单位&#xff0c;基于以下考虑&#xff1a; 国际单位制&#xff08;SI&#xff09;基本时间单位 整数秒&#xff08;i64&#xff09;方案优势&#xff1a; 精确无误差&#xff08;相比浮点数&am…...

Nginx常用工具

Nginx常用工具 Nginx常用工具vscode配置Nginx插件在线生成Nginx配置文件Nginx可视化配置工具 Nginx常用工具 编写Nginx配置时,使用VSCodeNginx插件,能实现自动补全格式化配置. vscode配置Nginx插件 Nginx代码高亮插件&#xff1a; nginx-formatter Nginx代码格式化插件&#…...

应用安全系列之四十五:日志伪造(Log_Forging)之三

1、简介 针对Java的日志系统有多种&#xff0c;本文主要描述如何通过修改配置文件来解决logback和log4j的日志伪造问题。 2、logback 2.1、系统提供的解决方案 在logback.xml中配置编码器自动转义特殊字符&#xff1a; 复制 <configuration><appender name"C…...

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;而是一种将现有的标准组合在一起使用的新方…...