0.页面效果
1.思路总结
1)用户点击“我的订单”,js向后端获取数据,并加载在前端的模板中;
2)用户点击相应订单的“去支付”按钮,js向引导用户跳转到支付宝链接;
3)用户交易完成之后,点击评论的“确定”按钮,js将评论数据传送给后端接口;
4)后端接口接收评论数据,并进行逻辑处理,比如修改订单状态、订单数加1、提交数据库等,并将redis中关于房屋详情页的缓存删除,以保证下次获取个人详情页时,能够重新生成最新的评论。
2.后端代码
orders.py中部分接口
获取用户订单:
# /api/v1.0/user/orders?role=custom role=landlord
@api.route("/user/orders", methods=["GET"])
@login_required
def get_user_orders():
"""查询用户的订单信息"""
user_id = g.user_id
# 用户的身份,用户想要查询作为房客预订别人房子的订单,还是想要作为房东查询别人预订自己房子的订单
role = request.args.get("role", "")
# 查询订单数据
try:
if "landlord" == role:
# 以房东的身份查询订单
# 先查询属于自己的房子有哪些
houses = House.query.filter(House.user_id == user_id).all()
houses_ids = [house.id for house in houses]
# 再查询预订了自己房子的订单
orders = Order.query.filter(Order.house_id.in_(houses_ids)).order_by(Order.create_time.desc()).all()
else:
# 以房客的身份查询订单, 查询自己预订的订单
orders = Order.query.filter(Order.user_id == user_id).order_by(Order.create_time.desc()).all()
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="查询订单信息失败")
# 将订单对象转换为字典数据
orders_dict_list = []
if orders:
for order in orders:
orders_dict_list.append(order.to_dict())
return jsonify(errno=RET.OK, errmsg="OK", data={
"orders": orders_dict_list})
用户评论:
@api.route("/orders/<int:order_id>/comment", methods=["PUT"])
@login_required
def save_order_comment(order_id):
"""保存订单评论信息"""
user_id = g.user_id
# 获取参数
req_data = request.get_json()
comment = req_data.get("comment") # 评价信息
# 检查参数
if not comment:
return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
try:
# 需要确保只能评论自己下的订单,而且订单处于待评价状态才可以
order = Order.query.filter(Order.id == order_id, Order.user_id == user_id,
Order.status == "WAIT_COMMENT").first()
house = order.house
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.DBERR, errmsg="无法获取订单数据")
if not order:
return jsonify(errno=RET.REQERR, errmsg="操作无效")
try:
# 将订单的状态设置为已完成
order.status = "COMPLETE"
# 保存订单的评价信息
order.comment = comment
# 将房屋的完成订单数增加1
house.order_count += 1
db.session.add(order)
db.session.add(house)
db.sessi