教程总体简介: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/嘿马文学...
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
4.分类
- 分类书本列表
- 分类列表大类,男生、女生
4.2分类书本列表
- 在applet_app/category.py文件中实现业务。
1-1 分类书本列表接口设计
- 接口名称:分类-书本列表-筛选
- 接口路径:/categoryies/filters
- 请求方法:GET
- 请求参数:
参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
---|---|---|---|---|
page | True | int | query | 当前页数 |
pagesize | True | int | query | 每页数据大小,默认10条 |
category_id | True | int | query | 分类id |
words | True | int | query | 字数类型id,0 所有 ,1表示50万字以下,2表示50~100万字,3表示100万字以上 |
order | True | int | query | 排序条件,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_word | True | query | 关键词 |
- 返回数据:
{
'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
- 请求参数:
参数名称 | 是否必须 | 参数类型 | 参数位置 | 备注 |
---|---|---|---|---|
page | True | int | query | 当前页数 |
pagesize | True | int | query | 页大小,默认10条 |
key_word | True | string | query | 关键词 |
- 返回数据:
{
"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、创建蓝图
from flask import Blueprint
search_bp = Blueprint('search', __name__,url_prefix='/search')
2、定义视图
# 定义路由,搜索书本列表
@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
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。