爱家(租房系统)---- 订单
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('已拒单');
}
});
});
。。。
其实吧!现在这块逻辑算是半成品,后续关于个人接到已被租住接单或拒单的相应逻辑尚未完成。鉴于时间问题。。。以后再说吧!