Exemple #1
0
def my_address_ops():
    addr_id = utils.get_int(request.form, "id", 0)
    action = request.form.get("action", "")

    addr_info = MemberAddress.query.filter_by(id=addr_id).first()
    if not addr_info:
        return json_error_response("地址更改操作错误(1)")

    if action == "set_default":
        member_id = g.current_member.id
        current_time = utils.get_current_time()
        MemberAddress.query.filter_by(member_id=member_id) \
            .update({"is_default": 0, "updated_time": current_time})

        addr_info.is_default = 1
        addr_info.updated_time = utils.get_current_time()
        db.session.add(addr_info)
        db.session.commit()

        return json_response()
    elif action == "delete":
        addr_info.status = 0
        addr_info.updated_time = utils.get_current_time()
        db.session.add(addr_info)
        db.session.commit()

        latest_addr = MemberAddress.query.filter_by(status=1).order_by(MemberAddress.updated_time.desc()).first()
        if latest_addr:
            latest_addr.is_default = 1
            db.session.add(latest_addr)
            db.session.commit()

        return json_response()
    else:
        return json_error_response("地址更改操作错误(2)")
Exemple #2
0
def close_order(pay_order_id):
    pay_order_info = PayOrder.query.filter_by(id=pay_order_id,
                                              status=-8).first()
    if not pay_order_info:
        return False

    # revert stock for items in this order
    pay_order_items = PayOrderItem.query.filter_by(
        pay_order_id=pay_order_id).all()
    if pay_order_items:
        for item in pay_order_items:
            food_info = Food.query.filter_by(id=item.food_id).first()
            if food_info:
                set_food_stock_change_log(item.food_id,
                                          food_info.stock,
                                          item.quantity,
                                          note="取消订单,归还库存")
                food_info.stock += item.quantity
                food_info.updated_time = get_current_time()
                db.session.add(food_info)
                db.session.commit()

    pay_order_info.status = 0
    pay_order_info.updated_time = get_current_time()
    db.session.add(pay_order_info)
    db.session.commit()
    return True
Exemple #3
0
def my_address_set():
    member_id = g.current_member.id

    addr_id = utils.get_int(request.form, "id", 0)
    contact_name = request.form.get("contact_name", "")
    mobile = request.form.get("mobile", "")
    address = request.form.get("address", "")

    province_id = utils.get_int(request.form, "province_id", 0)
    city_id = utils.get_int(request.form, "city_id", 0)
    district_id = utils.get_int(request.form, "district_id", 0)

    province_str = request.form.get("province_str", "")
    city_str = request.form.get("city_str", "")
    district_str = request.form.get("district_str", "")

    empty_items = []
    for var, item in zip([contact_name, mobile, address, province_str, city_str, province_id, city_id],
                         ["联系人姓名", "手机号码", "详细地址", "省份名称", "城市名称", "省份代码", "城市代码"]):
        if not var:
            empty_items.append(item)
    if len(empty_items) > 0:
        return json_error_response("设置地址时以下内容不能为空:" + "、".join(empty_items))



    # check if addr_info already exists
    addr_info = MemberAddress.query.filter_by(id=addr_id).first()

    if addr_info:
        if addr_info.member_id != member_id:
            return json_error_response("修改地址时出现错误(1)")
    if not addr_info:
        default_addr_cnt = MemberAddress.query.filter_by(is_default=1,
                                                         member_id=member_id,
                                                         status=1).count()
        addr_info = MemberAddress()
        addr_info.member_id = member_id
        addr_info.is_default = 1 if default_addr_cnt == 0 else 0
        addr_info.created_time = utils.get_current_time()

    addr_info.contact_name = contact_name
    addr_info.mobile = mobile
    addr_info.province_id = province_id
    addr_info.province_str = province_str
    addr_info.city_id = city_id
    addr_info.city_str = city_str
    addr_info.district_id = district_id
    addr_info.district_str = district_str
    addr_info.address = address
    addr_info.updated_time = utils.get_current_time()

    db.session.add(addr_info)
    db.session.commit()

    return json_response("操作成功")
Exemple #4
0
def login():
    """Complete login process:
    1. mina/pages/index/index.js: Page.login() --> request with login_code --> this server
    3. this function --> request with appid, appSecretKey, login_code --> wechat official api
    4. wechat official api --> session_key, openid --> this server
    """
    values = request.values
    login_code = values.get("login_code", "")
    if len(login_code) < 1:
        return json_error_response("需要login_code")

    # complete login process using login_code
    openid = get_wechat_openid(login_code)
    if openid is None:
        return json_error_response("调用微信登录信息出错")

    # check if user has registered
    bind_info = OauthMemberBind.query.filter_by(
        openid=openid, type=1).first()  # type=1 corresponds to wechat
    if bind_info:
        # member exists
        member_info = Member.query.filter_by(id=bind_info.member_id).first()
        if not member_info:
            return json_error_response("查询不到后台用户信息")
        return json_response("已经绑定成功",
                             data={"token": generate_token(member_info)})
    else:
        # register new member
        new_member = Member()
        new_member.nickname = values.get("nickName", "")
        new_member.sex = values.get("gender", 0)
        new_member.avatar = values.get("avatarUrl", "")
        new_member.salt = generate_salt()
        new_member.updated_time = new_member.created_time = get_current_time()
        db.session.add(new_member)
        db.session.commit()

        # bind new member with new OathMemberBind entry
        new_bind = OauthMemberBind()
        new_bind.member_id = new_member.id
        new_bind.type = 1
        new_bind.openid = openid
        new_bind.extra = ""
        new_bind.updated_time = new_bind.created_time = get_current_time()
        db.session.add(new_bind)
        db.session.commit()
        return json_response("新用户注册成功",
                             data={"token": generate_token(new_member)})
Exemple #5
0
def get_access_token():
    token_info = OauthAccessToken.query.filter(
        OauthAccessToken.expired_time > get_current_time()).first()
    if token_info:
        return token_info.access_token

    appid = app.config["MINA_APP_ID"]
    appsecret = app.config["MINA_APP_SECRET"]
    url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" \
        % (appid, appsecret)

    r = requests.get(url=url)

    if r.status_code != 200 or not r.text:
        app.logger.error("获取access_token失败!")
        return None

    data = json.loads(r.text)
    now = datetime.datetime.now()
    expired_date = now + datetime.timedelta(seconds=data["expires_in"])
    token_info = OauthAccessToken()
    token_info.access_token = data["access_token"]
    token_info.expired_time = expired_date.strftime("%Y-%m-%d %H:%M:%S")
    token_info.created_time = now.strftime("%Y-%m-%d %H:%M:%S")

    db.session.add(token_info)
    db.session.commit()

    return data
Exemple #6
0
def ops():
    values = request.values
    if "act" not in values or "uid" not in values:
        return json_error_response("无效的账号编辑操作")

    user_info = User.query.filter_by(uid=values["uid"]).first()

    if not user_info:
        return json_error_response("无效的账号编辑操作")

    if values["act"] == "remove":
        user_info.status = 0
        success_msg = "成功移除 %s 的账户 (登录名 %s)" % (user_info.nickname,
                                                user_info.login_name)
    elif values["act"] == "recover":
        success_msg = "成功恢复 %s 的账户 (登录名 %s)" % (user_info.nickname,
                                                user_info.login_name)
        user_info.status = 1
    else:
        return json_error_response("无效的账号编辑操作")

    user_info.update_time = get_current_time()

    db.session.add(user_info)
    db.session.commit()

    return json_response(success_msg)
Exemple #7
0
def get_release_version():
    ver = get_current_time("%Y%m%d%H%M%S")
    # release_path = app.config.get('RELEASE_PATH')
    # if release_path and os.path.exists(release_path):
    #     with open(release_path, 'r') as f:
    #         ver = f.readline()
    return app.config.get("RELEASE_VERSION", ver)
Exemple #8
0
def ops():
    id = get_int(request.form, "id", 0)
    act = request.form.get("act", None)
    if "act" is None or "id" == 0:
        return json_error_response("无效的菜品项目编辑操作")

    food_info = Food.query.filter_by(id=id).first()

    if not food_info:
        return json_error_response("无效的菜品项目编辑操作")

    if act == "remove":
        food_info.status = 0
        success_msg = "成功移除菜品项目 %s" % (food_info.name)
    elif act == "recover":
        success_msg = "成功恢复菜品项目 %s" % (food_info.name)
        food_info.status = 1
    else:
        return json_error_response("无效的账号编辑操作")

    food_info.update_time = get_current_time()

    db.session.add(food_info)
    db.session.commit()

    return json_response(success_msg)
Exemple #9
0
def set():
    if request.method == "GET":
        id = int(request.args.get("id", "0"))
        redir_response = make_response(redirect(build_url("/member/index")))
        if id == 0:
            return redir_response
        member_info = Member.query.filter_by(id=id).first()
        if member_info is None:
            return redir_response
        return render_template_with_global_vars(
            "member/set.html", context={"member": member_info})

    elif request.method == "POST":
        id = int(request.form.get("id", "0"))
        if id == 0:
            return json_error_response("该用户不存在,请确认用户id!")
        member_info = Member.query.filter_by(id=id).first()
        if member_info is None:
            return json_error_response("该用户不存在,请确认用户id!")

        new_nickname = request.form.get("nickname", "")
        if len(new_nickname) < 1:
            return json_error_response("会员名称不能为空!")

        member_info.nickname = new_nickname
        member_info.update_time = get_current_time()
        db.session.add(member_info)
        db.session.commit()
        return json_response("修改会员信息成功!")
Exemple #10
0
def ops():
    values = request.form
    if "act" not in values or "id" not in values:
        return json_error_response("无效的账号编辑操作")

    member_info = Member.query.filter_by(id=values["id"]).first()

    if not member_info:
        return json_error_response("无效的账号编辑操作")

    if values["act"] == "remove":
        member_info.status = 0
        success_msg = "成功移除 %s 的账户" % (member_info.nickname)
    elif values["act"] == "recover":
        success_msg = "成功恢复 %s 的账户" % (member_info.nickname)
        member_info.status = 1
    else:
        return json_error_response("无效的账号编辑操作")

    member_info.update_time = get_current_time()

    db.session.add(member_info)
    db.session.commit()

    return json_response(success_msg)
Exemple #11
0
def order_ops():
    member_info = g.current_member

    order_sn = request.form.get("order_sn", None)
    if order_sn is None:
        return json_error_response("订单操作失败(1)")

    action = request.form.get("action", None)
    if action is None:
        return json_error_response("订单操作失败(2)")

    pay_order_info = PayOrder.query.filter_by(order_sn=order_sn).first()
    if pay_order_info is None:
        return json_error_response("订单操作失败(3)")

    if action == "cancel":
        if pay_utils.close_order(pay_order_id=pay_order_info.id):
            return json_response("取消订单成功")
        else:
            return json_error_response("订单操作失败(4)")

    elif action == "confirm":
        pay_order_info.deliver_status = 1
        pay_order_info.updated_time = get_current_time()
        db.session.add(pay_order_info)
        db.session.commit()
        return json_response("确认收货成功")
    elif action == "comment":
        pass
    else:
        return json_response("订单操作失败(5)")
Exemple #12
0
def add_error_log(msg, request):
    entry = AppErrorLog()
    entry.target_url = request.url
    entry.referer_url = request.referrer
    entry.query_params = json.dumps(request.values.to_dict())
    entry.content = msg
    entry.created_time = get_current_time()
    db.session.add(entry)
    db.session.commit()
    return True
Exemple #13
0
def push(queue_name, data=None):
    new_queue_info = QueueList()
    new_queue_info.queue_name = queue_name
    if data:
        new_queue_info.data = json.dumps(data)
    new_queue_info.created_time = new_queue_info.updated_time = get_current_time(
    )

    db.session.add(new_queue_info)
    db.session.commit()
Exemple #14
0
    def run(self, params):
        queue_list = QueueList.query.filter_by(status=-1).order_by(QueueList.id.asc()).limit(3).all()
        for item in queue_list:
            if item.queue_name == "pay":
                self.handle_pay(item)
            item.status = 1
            item.updated_time = get_current_time()
            db.session.add(item)

        db.session.commit()
Exemple #15
0
def order_success(pay_order_id=0, pay_sn=""):
    # pessimistic concurrent handling:
    try:
        pay_order_info = PayOrder.query.filter_by(id=pay_order_id).first()
        if pay_order_info is None or pay_order_info.status not in [-8, -7]:
            return True

        pay_order_info.pay_sn = pay_sn
        pay_order_info.status = 1
        pay_order_info.deliver_status = -7
        pay_order_info.pay_time = get_current_time()
        pay_order_info.updated_time = get_current_time()
        db.session.add(pay_order_info)
        db.session.commit()

        # update FoodSaleChangeLog
        pay_order_items = PayOrderItem.query.filter_by(
            pay_order_id=pay_order_id).all()
        for order_item in pay_order_items:
            sale_log = FoodSaleChangeLog()
            sale_log.food_id = order_item.food_id
            sale_log.quantity = order_item.quantity
            sale_log.price = order_item.price
            sale_log.member_id = order_item.member_id
            sale_log.created_time = get_current_time()
            db.session.add(sale_log)
        db.session.commit()

    except Exception as e:
        app.logger.error("%s" % e)
        db.session.rollback()
        return False

    # add item to queue to notify that the payment has succeeded
    if pay_order_info.subscribed:
        queue_utils.push(
            "pay", {
                "member_id": pay_order_info.member_id,
                "pay_order_id": pay_order_info.id
            })

    return True
Exemple #16
0
def set_cart_info(member_id=0, food_id=0, quantity=0):
    if member_id < 1 or food_id < 1 or quantity < 1:
        return None

    cart_info_query = MemberCart.query.filter_by(member_id=member_id,
                                                 food_id=food_id)

    cart_info = cart_info_query.first()
    if cart_info is None:
        cart_info = MemberCart()
        cart_info.member_id = member_id
        cart_info.food_id = food_id
        cart_info.created_time = get_current_time()
    cart_info.quantity = quantity
    cart_info.updated_time = get_current_time()

    db.session.add(cart_info)
    db.session.commit()

    return cart_info
Exemple #17
0
def cat_set():
    if request.method == "GET":
        id = get_int(request.args, "id", 0)
        if id > 0:
            cat_info = FoodCat.query.filter_by(id=id).first()
            if cat_info is None:
                return make_response(redirect(build_url("/food/cat")))
        else:
            cat_info = None
        return render_template_with_global_vars("food/cat_set.html",
                                                context={"cat": cat_info})

    elif request.method == "POST":
        id = get_int(request.form, "id", 0)
        if id > 0:
            cat_info = FoodCat.query.filter_by(id=id).first()
            if cat_info is None:
                return json_error_response("无效的食品类别编辑操作")
        else:
            cat_info = None

        name = request.form.get("name", "")
        weight = int(request.form.get("weight", "0"))
        if len(name) < 1:
            return json_error_response("食品类别名称不能为空!")
        if weight < 1 or weight > 4:
            return json_error_response("食品类别的权重必须在1-4之间!(含1和4)")

        if cat_info is None:
            cat_info = FoodCat()
            cat_info.created_time = get_current_time()
            cat_info.status = 1

        cat_info.name = name
        cat_info.weight = weight
        cat_info.updated_time = get_current_time()
        db.session.add(cat_info)
        db.session.commit()

        return json_response("修改食品类别信息成功!")
Exemple #18
0
def set_food_stock_change_log(food_id, old_stock, change, note):
    if food_id < 1:
        return False

    stock_change_info = FoodStockChangeLog()
    stock_change_info.food_id = food_id
    stock_change_info.unit = change
    stock_change_info.total_stock = int(old_stock) + int(change)
    stock_change_info.note = note
    stock_change_info.created_time = get_current_time()
    db.session.add(stock_change_info)
    db.session.commit()
    return True
Exemple #19
0
def upload_by_file(f):
    res = {"code": -1, "msg": "", "data": {}}
    filename = secure_filename(f.filename)
    extension = filename.rsplit(".", maxsplit=1)[1]

    # check if ext is in our predefined list of extensions
    img_upload_configs = app.config["IMG_UPLOAD_CONFIGS"]
    if extension not in img_upload_configs["allowed_extensions"]:
        res["msg"] = "不允许的扩展类型文件"
        return res

    # save uploaded file locally, check and create directory for files uploaded each day
    file_dir = get_current_time("%Y%m%d")
    save_dir = os.path.join(app.root_path,
                            img_upload_configs["prefix_path"].strip("/"),
                            file_dir)

    if not os.path.exists(save_dir):
        os.makedirs(save_dir)
        os.chmod(save_dir, stat.S_IRWXU | stat.S_IRGRP | stat.S_IRWXO)  # 747

    # generate unique identifier and save file to server
    file_name = str(uuid.uuid4()).replace("-", "") + "." + extension
    file_key = os.path.join(file_dir, file_name)
    file_path = os.path.join(save_dir, file_name)
    f.save(file_path)
    app.logger.info("Saved uploaded image at %s" % file_path)

    image_info = Image()
    image_info.file_key = file_key
    image_info.created_time = get_current_time()
    db.session.add(image_info)
    db.session.commit()

    res["code"] = 200
    res["msg"] = "上传文件成功"
    res["data"] = {"file_key": file_key}
    return res
Exemple #20
0
def add_pay_callback_data(pay_order_id=0, type="pay", data=""):
    cb_info = PayOrderCallbackData()
    cb_info.pay_order_id = pay_order_id
    if type == "pay":
        cb_info.pay_data = data
        cb_info.refund_data = ""
    else:
        cb_info.pay_data = ""
        cb_info.refund_data = data

    cb_info.created_time = cb_info.updated_time = get_current_time()
    db.session.add(cb_info)
    db.session.commit()
    return True
Exemple #21
0
def my_comment_add():
    member_id = g.current_member.id

    order_sn = request.form.get("order_sn", None)
    if not order_sn:
        return json_error_response("评价操作失败(1)")

    pay_order_info = PayOrder.query.filter_by(member_id=member_id, order_sn=order_sn).first()
    if not pay_order_info:
        return json_error_response("评价操作失败(2)")

    if pay_order_info.comment_status:
        return json_error_response("已经评价过了,请勿重复评价")

    pay_order_items = PayOrderItem.query.filter_by(pay_order_id=pay_order_info.id).all()
    food_ids = "_".join(str(item.food_id) for item in pay_order_items)

    score = utils.get_int(request.form, "score", 10)
    content = request.form.get("content", "")

    comment_info = MemberComment()
    comment_info.member_id = member_id
    comment_info.food_ids = "_" + food_ids + "_"
    comment_info.pay_order_id = pay_order_info.id
    comment_info.score = score
    comment_info.content = content
    comment_info.created_time = utils.get_current_time()

    db.session.add(comment_info)
    db.session.commit()

    pay_order_info.comment_status = 1
    pay_order_info.updated_time = utils.get_current_time()
    db.session.add(pay_order_info)
    db.session.commit()

    return json_response()
Exemple #22
0
def add_access_log(request, g):
    entry = AppAccessLog()
    entry.target_url = request.url
    entry.referer_url = request.referrer
    entry.ip = request.remote_addr
    entry.query_params = json.dumps(request.values.to_dict())

    if "current_user" in g and g.current_user is not None:
        entry.uid = g.current_user.uid

    entry.ua = request.headers.get("User-Agent")
    entry.created_time = get_current_time()

    db.session.add(entry)
    db.session.commit()
    return True
Exemple #23
0
def order_pay():
    member_info = g.current_member

    order_sn = request.form.get("order_sn", None)
    if order_sn is None:
        return json_error_response("支付失败,请稍后再试(1)")

    pay_order_info = PayOrder.query.filter_by(order_sn=order_sn).first()
    if pay_order_info is None:
        return json_error_response("支付失败,请稍后再试(2)")

    # get openid for member
    oauth_bind_info = OauthMemberBind.query.filter_by(
        member_id=member_info.id).first()
    if oauth_bind_info is None:
        return json_error_response("支付失败,请稍后再试(3)")

    subscribed = request.form.get("subscribed", "False")
    subscribed = subscribed == "true"

    notify_url = build_url("/api/order/callback")
    data = {
        "appid": app.config["MINA_APP_ID"],
        "mch_id": app.config["MCH_ID"],
        "nonce_str": wc_utils.get_nonce_str(),
        "body": "订餐",
        "out_trade_no": pay_order_info.order_sn,
        "total_fee": int(pay_order_info.total_price * 100),  #单位为分
        "notify_url": notify_url,
        "trade_type": "JSAPI",
        "openid": oauth_bind_info.openid
    }
    prepay_info = wc_utils.get_pay_info(data)
    # save prepay_id to database
    pay_order_info.prepay_id = prepay_info["prepay_id"]
    pay_order_info.subscribed = subscribed
    db.session.add(pay_order_info)
    db.session.commit()

    res_data = {"prepay_info": prepay_info}

    if app.config["DEV_MODE"]:
        # prepare callback xml message right here, send to frontend, and then
        # frontend will send it back to backend's /order/callback_dev
        res_data["dev_mode"] = True
        cb_dev_data = {
            "appid": data["appid"],
            "bank_type": "CFT",
            "cash_fee": data["total_fee"],
            "fee_type": "CNY",
            "is_subscribe": "N",
            "mch_id": app.config["MCH_ID"],
            "nonce_str": wc_utils.get_nonce_str(),
            "openid": oauth_bind_info.openid,
            "out_trade_no": pay_order_info.order_sn,
            "result_code": "SUCCESS",
            "return_code": "SUCCESS",
            "time_end": get_current_time("%Y%m%d%H%M%S"),
            "total_fee": data["total_fee"],
            "trade_type": "JSAPI",
            # this is supposed to be automatically generated by WeChat API
            # use our own order_sn temporarily for development purposes
            "transaction_id": pay_order_info.order_sn
        }
        sign = wc_utils.create_sign(cb_dev_data)
        cb_dev_data["sign"] = sign
        xml_data = wc_utils.dict_to_xml(cb_dev_data)
        res_data["cb_dev_data"] = xml_data

    return json_response(data=res_data)
Exemple #24
0
def create_order(member_id, items, params=None):
    res = {"code": -1, "msg": "", "data": {}}
    for item in items:
        item["price"] = Decimal(item["price"])
    food_id_list = [item["food_id"] for item in items if item["price"] >= 0]

    pay_price = Decimal(
        sum(item["price"] * item["quantity"] for item in items
            if item["price"] >= 0))

    if len(food_id_list) <= 0 or pay_price <= 0:
        res["msg"] = "订购商品列表为空,或者所有商品的价格都小于等于0元"
        return res

    shipping_price = Decimal(params.get("shipping_price", 0))
    total_price = pay_price + shipping_price

    notes = params.get("note", "")
    deliver_address_id = params.get("deliver_address_id", 0)
    deliver_info = params.get("deliver_info", {})

    # concurrent handling of orders. We use a pessimistic row-level lock, where
    # a lock is held by a thread/process even when they are just querying the value
    try:
        food_info_list = db.session.query(Food).filter(Food.id.in_(food_id_list)) \
            .with_for_update().all()
        food_id_to_stock_map = {food.id: food.stock for food in food_info_list}

        pay_order = PayOrder()
        pay_order.order_sn = generate_order_sn()
        pay_order.member_id = member_id
        pay_order.total_price = total_price
        pay_order.shipping_price = shipping_price
        pay_order.pay_price = pay_price
        pay_order.note = notes
        pay_order.status = -8
        pay_order.deliver_status = -8
        pay_order.deliver_address_id = deliver_address_id
        pay_order.deliver_info = json.dumps(deliver_info)
        pay_order.updated_time = pay_order.created_time = get_current_time()
        db.session.add(pay_order)

        for item in items:
            food_id = item["food_id"]
            quantity = item["quantity"]
            price = item["price"]
            stock = food_id_to_stock_map[food_id]
            if price < 0:
                continue
            if quantity > stock:
                raise Exception("您购买的菜品数量太火爆了,剩余%d, 您购买了%d" %
                                (stock, quantity))

            update_successful = Food.query.filter_by(id=food_id).update(
                {"stock": stock - quantity})

            if not update_successful:
                raise Exception("下单失败,请重新下单 (1)")
            if not set_food_stock_change_log(food_id, stock, -1 * quantity,
                                             "由用户%d下单购买" % member_id):
                raise Exception("下单失败,请重新下单 (2)")

            pay_order_item = PayOrderItem()
            pay_order_item.pay_order_id = pay_order.id
            pay_order_item.member_id = member_id
            pay_order_item.quantity = quantity
            pay_order_item.price = price
            pay_order_item.food_id = food_id
            pay_order_item.note = notes
            pay_order_item.created_time = pay_order_item.updated_time = get_current_time(
            )

            db.session.add(pay_order_item)

        db.session.commit()
    except Exception as e:
        db.session.rollback()
        app.logger.error(e)
        res["msg"] = str(e)
        return res

    res["code"] = 200
    res["msg"] = "下单成功!"
    res["data"] = {
        "pay_order_id": pay_order.id,
        "order_sn": pay_order.order_sn,
        "total_price": str(pay_order.total_price)
    }
    return res
Exemple #25
0
def set():
    if request.method == "GET":
        cat_list = FoodCat.query.all()
        id = get_int(request.args, "id", 0)
        food_info = Food.query.filter_by(id=id).first()
        if (id > 0 and food_info is None) or (food_info is not None
                                              and food_info.status != 1):
            return redirect(build_url("/food/index"))

        ctx = {"food": food_info, "cat_list": cat_list}
        return render_template_with_global_vars("food/set.html", context=ctx)
    elif request.method == "POST":
        id = get_int(request.form, "id", 0)
        cat_id = get_int(request.form, "cat_id", 0)
        name = request.form.get("name", "")
        price = request.form.get("price", "")
        title_pic = request.form.get("title_pic", "")
        summary = request.form.get("summary", "")
        stock = get_int(request.form, "stock", 0)
        tags = request.form.get("tags", "")

        # form content verification
        if cat_id == 0:
            return json_error_response("请选择类别")
        empty_items = []
        for var, item in zip([name, price, title_pic, summary, tags],
                             ["菜品名称", "菜品价格", "封面图", "描述", "标签"]):
            if len(var) < 1:
                empty_items.append(item)
        if len(empty_items) > 0:
            return json_error_response("以下内容不能为空:" + "、".join(empty_items))

        price = Decimal(price).quantize(Decimal("0.00"))
        if price <= 0:
            return json_error_response("售卖价格不能小于或者等于0")

        # create new entry in Food table
        food_info = Food.query.filter_by(id=id).first()
        before_stock = 0
        if food_info:
            before_stock = food_info.stock
        else:
            food_info = Food()
            food_info.status = 1
            food_info.created_time = get_current_time()

        food_info.cat_id = cat_id
        food_info.name = name
        food_info.price = price
        food_info.main_image = title_pic
        food_info.summary = summary
        food_info.stock = stock
        food_info.tags = tags
        food_info.updated_time = get_current_time()

        db.session.add(food_info)
        db.session.commit()

        # add entry into food stock change log
        if not set_food_stock_change_log(food_info.id, int(before_stock),
                                         int(stock) - int(before_stock),
                                         "后台直接更改"):
            return json_error_response("登记库存变更信息出现错误")

        return json_response("成功添加菜品 %s" % name)
Exemple #26
0
def set():
    default_pwd = "******"
    if request.method == "GET":
        # pass user info into template to fill in values of html form
        uid = request.args["uid"] if "uid" in request.args else None
        user_info = User.query.filter_by(uid=uid).first() if uid else None
        ctx = {"user": user_info, "default_pwd": default_pwd}
        return render_template_with_global_vars("account/set.html",
                                                context=ctx)

    elif request.method == "POST":
        # obtain info from form
        uid = int(request.form["uid"]) if "uid" in request.form else 0
        username = request.form[
            "login_name"] if "login_name" in request.form else ""
        pwd = request.form["login_pwd"] if "login_pwd" in request.form else ""
        nickname = request.form[
            "nickname"] if "nickname" in request.form else ""
        mobile = request.form["mobile"] if "mobile" in request.form else ""
        email = request.form["email"] if "email" in request.form else ""
        app.logger.debug("setting info for uid %d, new username %s, pwd %s" %
                         (uid, username, pwd))

        # validate form elements
        if len(nickname) < 1 or len(email) < 1 or len(mobile) < 1:
            empty_items = []
            if len(nickname) < 1:
                empty_items.append("姓名")
            if len(mobile) < 1:
                empty_items.append("手机")
            if len(email) < 1:
                empty_items.append("邮箱")
            if len(username) < 1:
                empty_items.append("登录名")
            if len(pwd) < 1:
                empty_items.append("登录密码")
            msg = "以下内容不能为空:" + "、".join(empty_items)
            return json_error_response(msg)
        if len(pwd) < 6 and uid == 0:
            return json_error_response("您的密码不能短于6个字符!")

        user_info = User.query.filter(User.login_name == username,
                                      User.uid != uid).first()
        if user_info:
            return json_error_response("该用户名已被使用,请使用别的用户名!")

        user_info = User.query.filter_by(uid=uid).first()
        app.logger.debug("uid %d user_info %s" % (uid, user_info))
        new_user = False
        if user_info is None:
            new_user = True
            user_info = User()
            user_info.login_salt = generate_salt()
            user_info.created_time = get_current_time()

        user_info.login_name = username
        user_info.nickname = nickname
        user_info.mobile = mobile
        user_info.email = email
        user_info.updated_time = get_current_time()

        # edit password when it is not default value "*****" (see set.html)
        if pwd != default_pwd:
            user_info.login_pwd = generate_salted_pwd(pwd,
                                                      user_info.login_salt)

        db.session.add(user_info)
        db.session.commit()

        return json_response("账号个人信息编辑成功!", data={})