教程总体简介: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/嘿马文学...
感兴趣的小伙伴可以自取哦~
全套教程部分目录:
部分文件图片:
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、定义视图
# 定义路由,小说阅读
@book_bp.route("/reader/<int:book_id>")
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.如果数据存在,查询书籍内容表
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。