本节代码下载:https://download.csdn.net/download/geek_xiong/11620560
订单评论
用户订单完成支付后,会显示“发表评论”按钮,这也是本节要完成的内容。
具体如下图所示:已经评价完成的订单,表示该订单已结束,将无法进行任何操作了(根据项目来说,删除等操作暂时不考虑),并将订单状态改为“已完成”,同时显示评价的内容。
如果还没有评价,则显示评价按钮,订单状态为“待评价”,不显示“评价”
前端代码编写
当用户点击“发表评论”按钮时,页面会弹出一个弹层,输入内容后,点击提交按钮,立即向后端发起请求,根据后端返回的结果做出相应的页面效果。
$(".modal-comment").on("click", function () {
var orderId = $(this).attr("order-id");
var comment = $("#comment").val();
if (!comment) return;
var data = {
order_id: orderId,
comment: comment
};
// 处理评论
$.ajax({
url: "/api/v1.0/orders/" + orderId + "/comment",
type: "PUT",
data: JSON.stringify(data),
contentType: 'application/json',
dataType: "json",
headers: {
"X-CSRFToken": getCookie("csrf_token")
},
success: function (resp) {
if ("4101" == resp.errno){
location.href = "/login.html"
}else if("0" == resp.errno){
$(".orders-list>li[order-id="+ orderId +"]>div.order-content>div.order-text>ul li:eq(4)>span").html("已完成");
$("ul.orders-list>li[order-id="+ orderId +"]>div.order-title>div.order-operate").hide();
$("#comment-modal").modal("hide");
}
}
});
});
后端代码编写
后端接收前端发送的请求,如订单编号,评价内容,并根据session中的用户编号以及订单编号、订单状态判断是否可进行评论(防止作假),通过的话,将评价信息保存到数据库中,并更新订单状态为“已完成”,因为redis中可能会存在该房子的信息,由于作出了修改,所以进行删除,下次再浏览该房子时,重新保存到redis中即可
URL:127.0.0.1:5000/api/v1.0/orders/orderId/comment
请求方式:PUT
URL参数:orderId
请求数据:comment
数据格式:json
# PUT 127.0.0.1:5000/api/v1.0/orders/orderId/comment
@api.route("/orders/<int:order_id>/comment", methods=['PUT'])
@login_required
def save_order_comment(order_id):
"""保存评论信息
参数:订单编号
"""
# 获取用户 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.session.commit()
except Exception as e:
current_app.logger.error(e)
db.session.rollback()
return jsonify(errno=RET.DBERR, errmsg='操作失败')
# 因为房屋详情中有订单的评价信息,为了让最新的评价信息展示在房屋详情中,所以删除redis中关于本订单房屋的详情缓存
try:
redis_store.delete("house_info_%s" % order.house.id)
except Exception as e:
current_app.logger.error(e)
return jsonify(errno=RET.OK, errmsg='OK')
评价测试
启动项目