订单生成业务流程图
用戶進入房屋信息頁面,點擊“即刻預定的按鈕”,那么client將會發送get請求booking.html?hid=HID ;后臺接受到請求,返回booking.html靜態頁面,并且加載所有相關靜態文件,包括booking.js。
// TODO: 判斷用戶是否登錄$.get('/api/v1.0/session',function(resp){if(resp.errno=='0'){if(!(resp.data.user_id && resp.data.name)){location.href='login.html'}}}); @api.route('/session') def check_login():user_id = session.get("user_id")name = session.get("name")return jsonify(errno=RET.OK, errmsg="OK", data={"user_id": user_id, "name": name})client通過book.js文件發送ajax請求/api/v1.0/session,server接受到請求,會去請求上下文session中獲取用戶的名字和id,并返回name和id,沒有登陸返回none。如果返回的結果是none,那么將會跳轉到登陸頁面;
function decodeQuery(){var search = decodeURI(document.location.search);return search.replace(/(^\?)/,'').split('&').reduce(function(result, item){values = item.split('=');result[values[0]] = values[1];return result;}, {});}var queryData = decodeQuery();var houseId = queryData["hid"];// TODO: 獲取房屋的基本信息$.get("/api/v1.0/houses/" + houseId, function (resp) {if (resp.errno == "0") {$(".house-info>img").attr("src", resp.data.house.img_urls[0]);$(".house-text>h3").html(resp.data.house.title);$(".house-text>p>span").html((resp.data.house.price / 100).toFixed(0))}}); @api.route("/houses/<int:house_id>") def get_house_detail(house_id):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.NODATA, errmsg="房屋不存在")house_dict = house.to_full_dict()return jsonify(errno=RET.OK, errmsg="OK", data={"user_id": user_id, "house": house_dict})client通過book.js文件,首先獲取url中的房屋id,然后發送ajax get請求/api/v1.0/houses/” + houseId,后臺通過請求參數中的houseid,去數據庫中查詢房屋的信息,返回給前端,前端通過js渲染頁面。
// TODO: 訂單提交$(".submit-btn").on("click", function () {var startDate = $("#start-date").val();var endDate = $("#end-date").val();if (!(startDate && endDate)) {return}var params = {"start_date": startDate,"end_date": endDate,"house_id": houseId};$.ajax({url: "/api/v1.0/orders",type: "post",headers: {"X-CSRFToken": getCookie('csrf_token')},data: JSON.stringify(params),contentType: "application/json",success: function (resp) {if (resp.errno == "0"){location.href = "/orders.html"}else if (resp.errno == "4101") {location.href = "/login.html"}else {alert(resp.errmsg)}}})}) @api.route("/orders", methods=["POST"]) @login_required def add_order():# 1. 獲取參數user_id = g.user_iddata_json = request.jsonhouse_id = data_json.get("house_id")start_date_str = data_json.get("start_date")end_date_str = data_json.get("end_date")# 2. 校驗參數if not all([house_id, start_date_str, end_date_str]):return jsonify(errno=RET.PARAMERR, errmsg="參數錯誤")try:# 將日期字符串轉成 datetime 對象start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d")end_date = datetime.datetime.strptime(end_date_str, "%Y-%m-%d")# 判斷開始時間與結束時間的大小assert start_date < end_date, Exception("結束時間必須大于開始時間")except Exception as e:current_app.logger.error(e)return jsonify(errno=RET.PARAMERR, errmsg="參數錯誤")# 3. 判斷房屋是否存在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.NODATA, errmsg="房屋不存在")# 判斷是否是房主去預訂if user_id == house.user_id:return jsonify(errno=RET.ROLEERR, errmsg="房東不能預訂")# 4. 判斷該房屋指定時間段內是否有沖突的訂單try:filters = [Order.house_id == house_id, Order.begin_date < end_date, Order.end_date > start_date]# 取到沖突訂單的數量order_count = Order.query.filter(*filters).count()except Exception as e:current_app.logger.error(e)return jsonify(errno=RET.DBERR, errmsg="查詢數據錯誤")# 如果沖突訂單的數量大于0,代表該房屋已被預訂if order_count > 0:return jsonify(errno=RET.DATAERR, errmsg="房屋已被預訂")# 5. 生成訂單模型order = Order()# 設置屬性值days = (end_date - start_date).daysorder.user_id = user_idorder.house_id = house_idorder.begin_date = start_dateorder.end_date = end_dateorder.days = daysorder.house_price = house.priceorder.amount = days * house.price# 將房屋的訂單數量加1house.order_count += 1try: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")當用戶點擊提交按鈕, client將發送ajax post請求/api/v1.0/orders,post推送的數據有,租住的開始時間,結束時間,和房屋id。后臺首先獲取參數,包括從g變量中獲取user_id,從前端發過來的數據中獲取houseid,start_date,end_date,判斷參數是否完整,如果不完整,按照接口文檔返回參數錯誤,如果參數完整,判斷日期的結束時間是否大于開始時間,如果時間格式,或者結束時間小于開始時間,返回參數錯誤。否則判斷房屋是否存在,如果不存在,返回房屋不存在信息,提醒用戶。否則繼續判斷是否是房東自己預定自己的房子,如果是,則返回錯誤信息房東不能預定。否則判斷下單房子在時間上是否沖突,如果沖突的話提示用戶房屋已經被預定了,否則就可以將用戶ip,房屋id,開始時間,結束時間,總天數,總價錢寫入數據庫。
總結
- 上一篇: 圣诞树代码
- 下一篇: Ubuntu下C语言程序的编写