0 、效果展示
detail.html
booking.html
1、思路总结
1)用户打开房屋详情页detail.html之后,后端detail.js会判断此访问用户是否为房东,若不是房东,则在详情页的最下方展示“即刻预定”按钮,用户点击后,页面会根据js文件指定的路径,转到/booking.html页面;
2)接下来页面/booking.html开始加载,booking.js会对:用户是否已经登录、选定开始结束日期的前后关系、是否完整等进行逻辑判断,同时通过定义函数,截取url中的house_id,通过house_id获得房屋的基本信息,加载到前端页面;
3)用户填写相关信息,点击“提交订单按钮”,向后端路径/api/v1.0/orders发送ajax请求;
4)接下来,后端相应接口save_order()进行逻辑处理,
保存订单信息,提交数据库,并向前端返回order.id。
2、后端代码
orders.py
@api.route("/orders", methods=["POST"])
@login_required
def save_order():
"""保存订单"""
user_id = g.user_id
# 获取参数
order_data = request.get_json()
if not order_data:
return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
house_id = order_data.get("house_id") # 预订的房屋编号
start_date_str = order_data.get("start_date") # 预订的起始时间
end_date_str = order_data.get("end_date") # 预订的结束时间
# 参数检查
if not all((house_id, start_date_str, end_date_str)):
return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
# 日期格式检查
try:
# 将请求的时间参数字符串转换为datetime类型
start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")
end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d")
assert start_date <= end_date
# 计算预订的天数
days = (end_date - start_date).days + 1 # datetime.timedelta
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.PARAMERR, errmsg="日期格式错误")
# 查询房屋是否存在
try:
house = House.query.get(house_id)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="获取房屋信息失败")
if not house:
return jsonify(errno=RET.NODATA, errmsg="房屋不存在")
# 预订的房屋是否是房东自己的
if user_id == house.user_id:
return jsonify(errno=RET.ROLEERR, errmsg="不能预订自己的房屋")
# 2,房屋没有被别人下单
try:
# 查询时间冲突的订单数
count = Order.query.filter(Order.house_id == house_id, Order.begin_date <= end_date,
Order.end_date >= start_date