flask爱家租房项目开发(十一)

本文对应的代码文档下载地址: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,同时存在,订单中查找冲突的房子

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值