本文对应的代码文档下载地址:https://download.csdn.net/download/geek_xiong/11580295
目录
房屋列表页(搜索)
在首页点击搜索,跳转到房屋列表页
- 在首页
- 直接点击搜索按钮
- 只选择城区,点击搜索按钮
- 只选择入住时间,点击搜索按钮
- 选择入住时间与结束时间,点击搜索按钮
- 选择城区与入住时间,点击搜索按钮
- 选择城区、入住时间与结束时间,点击搜索按钮
- 在列表页
- 只选择入住日期
- 只选择区域
- 只选择排序
- 选择入住结束时间与区域
- 选择入住结束时间与排序
- 选择区域与排序
- 三个都选择
- 下拉加载下一页
URL:127.0.0.1:5000/api/v1.0/houses?aid=1&sd=2019-08-16&ed=2019-08-17&sk=new&p=1
请求方式:GET
后端代码编写
编写的大致流程
- 首先获取前端URL中的参数,并作出处理
- 先从redis缓存中获取数据
- 缓存中有数据,直接返回
- 如果缓存中没有数据,则从mysql数据库中获取数据
- 将数据封装,保存到redis缓存中
- 返回结果
由于是从URL中直接获取参数,所以可以从request.args中拿出
# 获取参数
start_date = request.args.get("sd", "") # 起始时间
end_date =request.args.get("ed", "") # 结束时间
area_id = request.args.get("aid", "") # 区域编号
sort_key = request.args.get("sk", "new") # 排序关键字
page = request.args.get("p") # 页数
前端传递过来的是字符串类型,将其转换为日期格式,
最后的格式为:2019-08-19
if start_date:
start_date = datetime.strptime(start_date, "%Y-%m-%d")
if end_date:
end_date = datetime.strptime(end_date, "%Y-%m-%d")
if start_date and end_date:
raise start_date <= end_date
判断前端的区域id是否在数据库中存在
if area_id:
try:
area = Area.query.get(area_id)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.PARAMERR, errmsg='区域参数有误')
判断页数是否正确,首先转换成int类型,如果转换失败,默认表示第一页
# 处理页数
try:
page = int(page)
except Exception as e:
current_app.logger.error(e)
page = 1
基本的参数校验完成之后,可以从缓存中取出数据了
# 获取缓存数据
redis_key = "house_%s_%s_%s_%s" % (start_date, end_date, area_id, sort_key)
try:
resp_json = redis_store.hget(redis_key, page)
except Exception as e:
current_app.logger.error(e)
else:
if resp_json:
return resp_json, 200, {"Content-Type": "application/json"}
如果缓存中没有,就可以直接查询数据库了
前提是,这些参数因为不固定,有可能只有一个,有可能只有两个,有可能有三个。。。。
所以使用打包与解包的方式查询,如下:
li = []
House.query.filter(*li).all()
只需要将要查询的参数 append 到 li 列表中即可。
优先处理时间问题
用户对选择时间只有两种,要么选择入住时间,要么选择入住和结束时间,
但是URL中却可以有三种,分别是:只有入住时间、只有结束时间、有入住和结束时间,
因此在后端都要进行处理
用户筛选房子是需要用来住的,也就是说如果有的房子已经住满了,就不应该在给用户展示出来了,
我们可以先排除订单表中与用户要找的时间段冲突的所有的房子id,再从房子表中排除这些id对应的房子,
剩下的在用户时间段中房子既是满足需求的房子。
假设用户搜索的时间字段是start_date,与end_date,
订单表中的时间段是degin_date,与end_date
第一种:start_date,与end_date,同时存在,订单中查找冲突的房子