web服务器

爱家(租房系统)---- 订单

2018-10-26  本文已影响34人  GHope

订单功能是整个租房项目的一个核心,也是相对来说比较复杂的一块,所以也另起一个逻辑业务文件进行管理。在项目app文件夹中创建order.py文件管理房屋租借的业务。大体设计:order负责个人订单,orders负责客户订单,根据用户的不同,客户订单与个人订单是不断发生变化的两个属性。所以,主逻辑通过订单所属不同发起请求指向实现。此处的个人订单指的是自己租的房子,客户订单是他人租的自己的房子。

业务逻辑

创建订单(房屋详情页实现) -- 查看个人订单和客户订单(用户主页实现) -- 修改订单状态(客户订单详情页中实现拒单和接单两种修改形态,之后在个人订单中根据反馈状态(待支付——选择支付,完成订单,之后开启评价功能;已被拒——选择取消,重新下单))
综上共提供六个接口供前端使用,具体详情参见代码注释。

from datetime import datetime

from flask import Blueprint, request, render_template, jsonify, session

from app.models import House, Order
from utils import status_code

order_blueprint = Blueprint('order', __name__)


'''
下单,创建预约单
'''
@order_blueprint.route('/create/', methods=['POST'])
def order():
    # 接收参数
    dict = request.form
    house_id = int(dict.get('house_id'))
    start_date = datetime.strptime(dict.get('start_date'), '%Y-%m-%d')
    end_date = datetime.strptime(dict.get('end_date'), '%Y-%m-%d')
    # 验证有效性
    if not all([house_id, start_date, end_date]):
        return jsonify(status_code.PARAMS_ERROR)
    if start_date > end_date:
        return jsonify(status_code.ORDER_START_END_TIME_ERROR)
    # 查询房屋对象
    try:
        house = House.query.get(house_id)
    except:
        return jsonify(status_code.DATABASE_ERROR)
    # 创建订单对象
    order = Order()
    order.user_id = session['user_id']
    order.house_id = house_id
    order.begin_date = start_date
    order.end_date = end_date
    order.days = (end_date - start_date).days + 1
    order.house_price = house.price
    order.amount = order.days * order.house_price

    try:
        order.add_update()
    except:
        return jsonify(status_code.DATABASE_ERROR)

    # 返回信息
    return jsonify(code=status_code.OK)

'''
个人订单
'''
@order_blueprint.route('/my_order/', methods=['GET'])
def my_order():
    if request.method == 'GET':
        return render_template('order.html')


'''
客户订单
'''
@order_blueprint.route('/orders/', methods=['GET'])
def orders():
    if request.method == 'GET':
        return render_template('orders.html')


'''
所有订单接口
作为租客查询订单
'''
@order_blueprint.route('/all_order/', methods=['GET'])
def all_order():

    uid = session['user_id']
    order_list = Order.query.filter(Order.user_id == uid).order_by(Order.id.desc())
    order_list2 = [order.to_dict() for order in order_list]
    return jsonify(olist=order_list2)


'''
作为房东查询订单
'''
@order_blueprint.route('/fd/',methods=['GET'])
def find_orders():
    uid=session['user_id']
    #查询当前用户的所有房屋编号
    hlist=House.query.filter(House.user_id==uid)
    hid_list=[house.id for house in hlist]
    #根据房屋编号查找订单
    order_list=Order.query.filter(Order.house_id.in_(hid_list)).order_by(Order.id.desc())
    #构造结果
    olist=[order.to_dict() for order in order_list]
    return jsonify(olist=olist)


'''
修改订单状态
'''
@order_blueprint.route('/orders/<int:id>/',methods=['PUT'])
def status(id):
    #接收参数:状态
    status=request.form.get('status')
    #查找订单对象
    order=Order.query.get(id)
    #修改
    order.status=status
    #如果是拒单,需要添加原因
    if status=='REJECTED':
        order.comment=request.form.get('comment')
    #保存
    try:
        order.add_update()
    except:
        return jsonify(status_code.DATABASE_ERROR)

    return jsonify(code=status_code.OK)

创建订单

修改房屋出租状态,访问预留接口,创建租客订单。

 $('.submit-btn').click(function(){
        var search = document.location.search
        h_id = search.split('=')[1]
        //获取入住时间
        var startDate = $("#start-date").val();
        var endDate = $("#end-date").val();
        //发起请求下订单
        $.post('/order/create/',{
            house_id:h_id,
            start_date:startDate,
            end_date:endDate
        },function (data) {
            if(data.code== '200'){
                location.href='/order/my_order/';
            }
        });
    });

个人订单

使用Ajax刷新个人订单信息,得到后台数据渲染到前台即可。

$.get('/order/all_order/',function (data) {
        var order_html=template('orders-list-tmpl',{olist:data.olist});
        $('.orders-list').html(order_html);
});

客户订单

首先遍历当前是否存在客户订单,展示房主功能,根据要求修改订单状态。

$.get('/order/fd/', function (data) {
        var html = template('order_list', {olist: data.olist});
        $('.orders-list').html(html);
        //当页面元素存在后,再绑定接单、拒单事件
        //接单
        $(".order-accept").on("click", function () {
            var orderId = $(this).parents("li").attr("order-id");
            $(".modal-accept").attr("order-id", orderId);
        });
        //拒单
        $(".order-reject").on("click", function () {
            var orderId = $(this).parents("li").attr("order-id");
            $(".modal-reject").attr("order-id", orderId);
        });
    });

    //确定接单
    $('.modal-accept').click(function () {
        var order_id = $(this).attr('order-id');
        $.ajax({
            url: '/order/orders/' + order_id + '/',
            type: 'put',
            data: {'status': 'WAIT_PAYMENT'},
            success: function (data) {
//                $('#accept-modal').modal("hide");
                $('#accept-modal').hide()
                $('.modal-backdrop').css({'display': 'None'})
                $('.order-operate').hide();
                $('#' + order_id).text('待支付');
            }
        });
    });
    //拒单-确定
    $('.modal-reject').click(function () {
        var order_id = $(this).attr('order-id');
        var comment=$('#reject-reason').val();
        $.ajax({
            url: '/order/orders/' + order_id + '/',
            type: 'put',
            data: {'status': 'REJECTED','comment':comment},
            success: function (data) {
                $('.order-operate').hide();
                $('.modal-backdrop').css({'display': 'None'})
                $('#' + order_id).text('已拒单');
            }
        });
    });

。。。
其实吧!现在这块逻辑算是半成品,后续关于个人接到已被租住接单或拒单的相应逻辑尚未完成。鉴于时间问题。。。以后再说吧!

上一篇下一篇

猜你喜欢

热点阅读