下载地址:https://download.csdn.net/download/geek_xiong/11585216

预定房间功能

在房间详情页提供预定功能,点击进入预定页面,提交预定后页面跳转到我的订单中

房东可在客户订单中查看

后端代码编写

后端需要接收前端传递过来的参数,经过处理与验证后将数据保存到数据库中。

URL:127.0.0.1:5000/api/v1.0/orders/house_id

请求方式:POST

大致流程:

  • 获取用户id
  • 获取订单信息,房子id,入住时间,结束时间
  • 转换时间格式,计算入住的天数
  • 判断房子是否存在
  • 判断预定用户是否是房东
  • 判断这个时间段内,该房子是否被别人下单
  • 计算总额
  • 保存数据
# POST 127.0.0.1:5000/orders@api.route("/orders", methods=['POST'])
@login_required
def save_order():"""保存订单需要的参数:用户id,房子id,入住与结束的日期参数要求:json 格式"""# 获取用户的 iduser_id = g.user_id# 获取参数order_data = request.get_json()if 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:# 将接受的日期字符串转换成日期格式start_date = datetime.strptime(start_date_str, "%Y-%m%d")end_date = datetime.strptime(end_date_str, "%y-%m-%d")assert start_date <= end_date# 计算预定的天数days = (end_date - start_date).days + 1  # datetime.timedeltaexcept 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.DBERR, errmsg='房子不存在')# 预定的房屋是否是房东自己if user_id == house.user_id:return jsonify(errno=RET.ROLEERR, errmsg='不能预定自己的房屋')# 确保用户预定的时间内,房屋没有被别人下单try:# 查询时间冲突的订单数count = Order.query.filter(Order.house_id == house_id,Order.begin_date <= end_date,Order.end_date >= start_date).count()except Exception as e:current_app.logger.error(e)return jsonify(errno=RET.DBERR, errmsg='检查出错,请稍后重试')if count > 0:return jsonify(errno=RET.DATAERR, errmsg="房屋已被预定")# 预定总额amount = days * house.price# 保存订单数据order = Order(house_id=house_id,user_id=user_id,begin_date=start_date,end_date=end_date,days=days,house_price=house.price,amount=amount)try:db.session.add(order)db.session.commit()except Exception as e:current_app.logger.error(e)db.session.rollback()return jsonify(errno=RET.DBERR, errmsg='保存订单失败')return jsonify(errno=RET.OK, errmsg='OK', data={"order_id": order.id})

我的订单

提交订单后,跳转到“我的订单”页面,倒叙显示提交的订单,状态为“待结单”,如果房东接单,则显示“待支付”

后端代码编写

URL:127.0.0.1:5000/api/v1.0/user/orders?role=xxx

role:custom(房客)、landlord(房东)

请求方式:GET

大致流程:

  • 获取用户id
  • 获取用户点击的是“我的订单”还是“客户订单”参数
  • 如果是房东(客户订单)
    • 先在房子表中获取所有属于自己的房子
    • 在订单表中获取自己的房子中被下订单的所有的订单
  • 如果是房客(我的订单)
    • 查询自己预定的订单
  • 将数据转换为字典
  • 返回结果
# GET 127.0.0.1:5000/api/v1.0/user/orders?role=custom   role=landlord@api.route("/user/orders", methods=["GET"])
@login_required
def get_user_orders():"""查询用户的订单信息"""# 获取用户的 iduser_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})

接单、拒单

接单和拒单是房东的权限,即在“客户订单”页面,如果有客户预定了该房东的房子,会显示在该页面,并显示接单和拒单的按钮。

后端代码编写

URL:127.0.0.1:5000/api/v1.0/orders/orderId/status

请求方式:PUT

大致流程:

  • 获取用户id
  • 获取请求方式(接单、拒单)
  • 根据订单号查询该订单(要求待结单状态)
  • 判断用户是否是该房子的房东
  • 根据请求方式各自处理
    • 如果是接单,将订单状态改为“待支付”
    • 如果是拒单,获取拒单原因,将订单状态改为“已拒绝”
  • 提交,更新数据库表
# PUT 127.0.0.1:5000/api/v1.0/orders/orderId/status@api.route("/orders/<int:order_id>/status", methods=['PUT'])
@login_required
def accept_reject_order(order_id):"""接单、拒单:param order_id: 订单 id:return:"""# 获取用户iduser_id = g.user_id# 获取参数req_data = request.get_json()if not req_data:return jsonify(errno=RET.PARAMERR, errmsg='参数错误')# action参数表明客户端请求的是接单还是拒单的行为action = req_data.get("action")if action not in ("accept", "reject"):return jsonify(errno=RET.PARAMERR, errmsg="参数错误")try:# 根据订单号查询订单,并且要求订单处于等待接单状态order = Order.query.filter(Order.id==order_id, Order.status=="WAIT_ACCEPT").first()house = order.houseexcept Exception as e:current_app.logger.error(e)return jsonify(errno=RET.DBERR, errmsg='无法获取订单数据')# 确保房东只能修改属于自己房子的订单if not order or house.user_id != user_id:return jsonify(errno=RET.REQERR, errmsg='操作无效')if action == 'accept':# 接单,将订单状态设置为等待支付order.status = "WAIT_PAYMENT"elif action == 'reject':# 拒单,要求用户传递拒单原因reason = req_data.get("reason")if not reason:return jsonify(errno=RET.PARAMERR, errmsg='参数错误')order.status = "REJECTED"order.comment = reasontry:db.session.add(order)db.session.commit()except Exception as e:current_app.logger.error(e)db.session.rollback()return jsonify(errno=RET.DBERR, errmsg='操作失败')return jsonify(errno=RET.OK, errmsg='OK')

flask爱家租房项目开发(十二)相关推荐

  1. flask爱家租房项目开发(十三)

    本节文档下载地址:https://download.csdn.net/download/geek_xiong/11615541 目录 蚂蚁金服--支付宝的使用 订单支付 前后端代码编写 测试 蚂蚁金服 ...

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

    目录 需求文档 创建工程目录以及flask配置 配置日志信息 数据库设计与迁移 静态文件的配置,使浏览器可以正常访问文件 csrf 防护机制 需求文档 需求功能 1. 主页     1.1 最多5个房 ...

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

    本文代码文档下载地址:https://download.csdn.net/download/geek_xiong/11576968 目录 房屋管理 发布的房屋信息管理 后端代码编写 前端代码编写 我的 ...

  4. Flask爱家租房--订单支付(支付过程)

    文章目录 0.支付流程 1. 重点总结 2.后端代码 3.前端js 4.前端html 0.支付流程 1. 重点总结 1)用户进入"我的订单"页面,点击"去支付" ...

  5. Flask爱家租房--房屋管理(搜索房屋列表)

    文章目录 0.效果展示 1.后端接口 2.前端js 3.前端html 0.效果展示 1.后端接口 house.py部分接口: # GET /api/v1.0/houses?sd=2017-12-01& ...

  6. Flask爱家租房--房屋管理(获取房屋详情)

    文章目录 0.效果展示 1.思路总结 2.后端接口 3.前端js 4.前端html 0.效果展示 1.思路总结 1)房屋详情页面开始加载时,detail.js首先通过定义的函数(重点:document ...

  7. Flask爱家租房--订单(房东接单、拒单)

    文章目录 0.效果展示 1.效果展示 2.后端接口 3.前端js 4.前端html 0.效果展示 1.效果展示 1)当房东点击"客户订单",js向后端接口get_user_orde ...

  8. Flask爱家租房--房屋管理(获取主页幻灯片展示的房屋基本信息)

    文章目录 0.效果展示 1.重点总结 2.后端代码 3.前端js 4.前端html 0.效果展示 1.重点总结 1)当用户访问首页时,开始加载页面信息,此时index.js文件首先调用后端接口chec ...

  9. Flask爱家租房--房屋管理(获取房东发布的房源信息条目)

    文章目录 0.效果展示 1.重点总结 2.后端代码 3.前端html 4.前端js 0.效果展示 1.重点总结 1)用户点击"我的房源",页面开始加载,此时myhouse.js限定 ...

最新文章

  1. B/S和C/S的区别
  2. hessian spring实例整合
  3. Nutshell中的Java 8语言功能-第2部分
  4. USACO-Section1.3 Transformations (矩阵旋转匹配问题)
  5. 安装SQL Server出现在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法...
  6. dp---数字三角形问题
  7. 苹果向开发者发布iOS/iPadOS 14.6的第二个测试版
  8. 「leetcode」90.子集II【回溯算法】详细图解!
  9. python哈姆雷特英文词频统计_MOOC《Python语言程序设计》第6周练习题
  10. 如何学计算机打字,新手学电脑如何快速学会打字
  11. python利用pandas实现excel数据分组汇总
  12. 英特尔神经计算棒二代(NCS2)安装、配置及使用
  13. javaScript学习笔记【尚硅谷】
  14. 修改db_create_file_dest
  15. spring boot + Spring Security 入门
  16. Ouino法国学习系统评价它是如何比其他学习软件
  17. 彗星通行证的积分规则是什么?
  18. (目录)微气候模型ENVI-met模拟的基本使用教程
  19. 自己实现Latex公式识别
  20. 结合黏菌觅食行为的改进多元宇宙算法

热门文章

  1. Leetcode-二分+递归/回溯-1723. 完成所有工作的最短时间
  2. 炉石传说 酒馆战棋 战斗模拟的实现
  3. java中注解 详解
  4. python求斜边上的高是多少厘米_已知一个直角三角形的两条直角边,如何求斜边上的高的长度...
  5. 第四章第6节水管工游戏
  6. php框架laravel win10,composer 安装Laravel (win10)
  7. mac屏幕保护SaveHollywood安装方法
  8. 用Python快速采集ins视频
  9. 大调查:2018中国程序员真实薪资曝光,看看你达到平均水平了吗?
  10. Vue中设置浏览器标签栏图标以及title