Exemplo n.º 1
0
def cart_index():
    if g.current_member is None:
        return json_error_response("您需要登录才能使用购物车!")
    if g.current_member.status != 1:
        return json_error_response("该账户已被注销,无法使用购物车")
    member_id = g.current_member.id

    cart_info_list = MemberCart.query.filter_by(member_id=member_id).all()
    if cart_info_list is None:
        data = {"list": None}
        return json_response(data=data)

    # this is different from what the imooc course does
    cart_food_info_list = db.session.query(MemberCart, Food)\
        .filter(MemberCart.food_id == Food.id).all()

    cart_list = [{
        "id": cart_info.id,
        "food_id": food_info.id,
        "pic_url": build_image_url(food_info.main_image),
        "name": food_info.name,
        "price": str(food_info.price),
        "quantity": cart_info.quantity,
        "active": True
    } for cart_info, food_info in cart_food_info_list]

    app.logger.info("length of list %d" % len(cart_list))
    total_price = sum(float(item["price"]) for item in cart_list)

    data = {
        "list": cart_list,
        "totalPrice": str(Decimal(total_price).quantize(Decimal("0.00"))),
    }

    return json_response(data=data)
Exemplo n.º 2
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)")
Exemplo n.º 3
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)")
Exemplo n.º 4
0
def cart_set():
    member_id = g.current_member.id

    food_id = get_int(request.form, "food_id", 0)
    food_info = Food.query.filter_by(id=food_id).first()
    if food_id < 1 or food_info is None:
        return json_error_response("该菜品不存在")

    quantity = get_int(request.form, "quantity", None)
    if quantity is None or quantity < 0:
        return json_error_response("请提供正确的菜品数量")

    if food_info.stock < quantity:
        return json_error_response("该菜品库存不足")

    if quantity > 0:
        cart_info = set_cart_info(member_id, food_id, quantity)
        if cart_info is None:
            return json_error_response("添加至购物车失败")
        else:
            return json_response("成功添加菜品至购物车")
    else:
        if delete_cart_info(member_id, food_id):
            return json_error_response("删除菜品失败")
        else:
            return json_response("成功从购物车删除菜品")
Exemplo n.º 5
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)})
Exemplo n.º 6
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("修改会员信息成功!")
Exemplo n.º 7
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)
Exemplo n.º 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)
Exemplo n.º 9
0
def food_info():
    values = request.values
    food_id = get_int(values, "id", 0)
    if food_id == 0:
        return json_error_response("该菜品不存在!")

    food_info = Food.query.filter_by(id=food_id).first()
    if food_info is None:
        return json_error_response("该菜品不存在!")
    if food_info.status != 1:
        return json_error_response("该菜品已下架!")

    member_info = g.current_member
    member_id = member_info.id if member_info else 0
    main_image_url = build_image_url(food_info.main_image)
    info = {
                "id": food_id,
                "name": food_info.name,
                "summary": food_info.summary,
                "total_count": food_info.total_count,
                "comment_count": food_info.comment_count,
                "stock": food_info.stock,
                "price": str(food_info.price),
                "main_image": main_image_url,
                "pics": [main_image_url],
                "cart_quantity": get_cart_quantity(member_id, food_id)
            }
    return json_response(data={"info": info})
Exemplo n.º 10
0
def food_search():
    values = request.values
    cat_id = get_int(values, "cat_id", 0)
    mix_kw = values.get("mix_kw", "")
    current_page = get_int(values, "p", 1)

    food_info_query = Food.query.filter_by(status=1)
    if len(mix_kw) > 0:
        pattern = "%%%s%%" % values["mix_kw"]
        rule = or_(Food.name.ilike(pattern), Food.tags.ilike(pattern))
        food_info_query = food_info_query.filter(rule)
    if cat_id > 0:
        food_info_query = food_info_query.filter_by(cat_id=cat_id)

    num_items = food_info_query.count()
    items_per_page = app.config["APP_FOOD_INDEX_ITEMS_PER_PAGE"]
    offset = (current_page - 1) * items_per_page
    food_info_query = food_info_query.order_by(Food.total_count.desc(), Food.id.desc())
    food_info_list = food_info_query.offset(offset).limit(items_per_page).all()

    food_list = []
    if food_info_list:
        food_list = [{"id": food.id, "name": food.name, "price": str(food.price),
                      "min_price": str(food.price), "pic_url": build_image_url(food.main_image)
                      } for food in food_info_list]

    data = {"list": food_list,
            "has_next_page": math.ceil(num_items / items_per_page) > current_page}
    return json_response(data=data)
Exemplo n.º 11
0
def reset_pwd():
    if request.method == "GET":
        return render_template_with_global_vars("user/reset_pwd.html")
    elif request.method == "POST":
        old_pwd = request.form["old_pwd"] if "old_pwd" in request.form else ""
        new_pwd = request.form["new_pwd"] if "new_pwd" in request.form else ""

        if len(old_pwd) < 1 or len(new_pwd) < 1:
            return json_error_response("您输入的密码不能为空!")

        if len(new_pwd) < 6:
            return json_error_response("您的密码不能短于6个字符!")

        if "current_user" not in g or g.current_user is None:
            return json_error_response("您还没有登录,不能更改个人信息!")

        # check old password
        user_info = g.current_user
        if generate_salted_pwd(old_pwd, user_info.login_salt) != user_info.login_pwd:
            return json_error_response("您输入的旧密码不正确!")

        user_info.login_pwd = generate_salted_pwd(new_pwd, user_info.login_salt)
        db.session.add(user_info)
        db.session.commit()

        response = json_response(msg="修改密码成功!")
        response.set_cookie(app.config["AUTH_COOKIE_NAME"], generate_cookie(user_info), 60*60*24*30)
        return response
Exemplo n.º 12
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)
Exemplo n.º 13
0
def my_index():
    data = {"user_info": {
        "avatar_url": g.current_member.avatar,
        "nickname": g.current_member.nickname,
        "mobile": g.current_member.mobile
    }}
    return json_response(data=data)
Exemplo n.º 14
0
def order_info():
    member_id = g.current_member.id

    purchase_list = request.form.get("purchaseList", None)
    if purchase_list is None:
        return json_error_response("订单内容不能为空!")

    purchase_list = json.loads(purchase_list)
    if len(purchase_list) < 1:
        return json_error_response("订单内容不能为空!")

    food_id_to_quantity = {
        item["food_id"]: item["quantity"]
        for item in purchase_list
    }
    food_ids = food_id_to_quantity.keys()
    food_info_list = Food.query.filter(Food.id.in_(food_ids)).all()
    if len(food_info_list) < 1:
        return json_error_response("无法查询到订单中的菜品!")

    deliver_price = Decimal(5000.00)
    order_list = [{
        "food_id": food.id,
        "name": food.name,
        "price": str(food.price),
        "pic_url": build_image_url(food.main_image),
        "quantity": food_id_to_quantity[food.id],
    } for food in food_info_list]
    pay_price = Decimal(
        sum(food.price * food_id_to_quantity[food.id]
            for food in food_info_list))

    default_address = {}
    default_addr_info = MemberAddress.query.filter_by(
        status=1, is_default=1, member_id=member_id).first()
    if default_addr_info:
        default_address = {
            "id":
            default_addr_info.id,
            "name":
            default_addr_info.contact_name,
            "mobile":
            default_addr_info.mobile,
            "address":
            "%s%s%s%s" %
            (default_addr_info.province_str, default_addr_info.city_str,
             default_addr_info.district_str, default_addr_info.address)
        }

    data = {
        "order_list": order_list,
        "deliver_price": str(deliver_price),
        "pay_price": str(pay_price),
        "total_price": str(pay_price + deliver_price),
        "default_address": default_address
    }
    return json_response(data=data)
Exemplo n.º 15
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("操作成功")
Exemplo n.º 16
0
def login():
    if request.method == "GET":
        return render_template("user/login.html")
    else:
        error_response, user_info = check_login(request)
        if error_response:
            return error_response
        response = json_response(msg="You've logged in successfully!")
        response.set_cookie(app.config["AUTH_COOKIE_NAME"], generate_cookie(user_info), 60*60*24*30)
        return response
Exemplo n.º 17
0
def my_address_list():
    member_id = g.current_member.id
    address_info = MemberAddress.query.filter_by(member_id=member_id, status=1)
    address_list = [{
        "id": addr.id,
        "isDefault": addr.is_default == 1,
        "name": addr.contact_name,
        "mobile": addr.mobile,
        "address": "%s%s%s%s" % (addr.province_str, addr.city_str,
                                 addr.district_str, addr.address)
    } for addr in address_info]
    data = {"address_list": address_list}
    return json_response(data=data)
Exemplo n.º 18
0
def my_comment_list():
    member_id = g.current_member.id

    comment_order_list = db.session.query(MemberComment, PayOrder)\
        .filter(MemberComment.pay_order_id == PayOrder.id,
                MemberComment.member_id == member_id).all()
    res_list = [{
        "date": str(comment.created_time),
        "order_number": pay_order.order_number,
        "content": comment.content
    } for comment, pay_order in comment_order_list]

    return json_response(data={"list": res_list})
Exemplo n.º 19
0
def comment():
    id = get_int(request.args, "id", 0)
    if id == 0:
        return json_error_response("无法获取评价信息(1)")

    comment_member_list = db.session.query(MemberComment, Member)\
        .filter(MemberComment.member_id == Member.id,
                MemberComment.food_ids.ilike("%_{0}_%".format(id))).all()

    res_list = [{
        "date": str(comment.created_time),
        "user_avatar_url": member.avatar,
        "content": comment.content,
        "score": comment.score_desc
    } for comment, member in comment_member_list]

    return json_response(data={"list":res_list})
Exemplo n.º 20
0
def order_callback_dev():
    """ Dev mode handling """
    if not app.config["DEV_MODE"]:
        return json_error_response("操作有误!")

    xml_data = request.form.get("xml", None)

    callback_data = wc_utils.xml_to_dict(xml_data)

    sign = callback_data.pop("sign")
    check_sign = wc_utils.create_sign(callback_data)
    if sign != check_sign:
        return json_error_response("操作有误(1)")

    order_sn = callback_data["out_trade_no"]
    pay_order_info = PayOrder.query.filter_by(order_sn=order_sn).first()

    if pay_order_info is None:
        return json_error_response("操作有误(2)")

    if int(pay_order_info.total_price * 100) != int(
            callback_data["total_fee"]):
        return json_error_response("操作有误(3)")

    if pay_order_info.status == 1:
        return json_error_response("操作有误(4)")

    # callback succeeded, modify records and states in database
    # tables affected: PayOrder, PayOrderCallbackData, FoodSaleChangeLog
    pay_sn = callback_data["transaction_id"]

    res = pay_utils.order_success(pay_order_id=pay_order_info.id,
                                  pay_sn=pay_sn)
    if not res:
        return json_error_response("操作有误(5)")

    # add record of this successful transaction to database
    pay_utils.add_pay_callback_data(pay_order_id=pay_order_info.id,
                                    data=xml_data)  # pass raw form of data

    return json_response("【开发模式】付款成功,信息已录入数据库")
Exemplo n.º 21
0
def cart_delete():
    if g.current_member is None:
        return json_error_response("请先登录再删除菜品")
    if g.current_member.status != 1:
        return json_error_response("该账户已被注销,无法删除菜品")
    member_id = g.current_member.id

    deleted_list = request.form.get("deleted", None)
    if deleted_list is None:
        return json_error_response("菜品删除操作有误")
    else:
        deleted_list = list(json.loads(deleted_list))

    if deleted_list is None or len(deleted_list) < 1:
        return json_error_response("菜品删除操作有误")

    app.logger.debug("deleted_list %s" % str(deleted_list))
    if not delete_cart_info(member_id, deleted_list):
        return json_error_response("菜品删除操作遇到错误")
    else:
        return json_response("成功从购物车删除%d件菜品" % len(deleted_list))
Exemplo n.º 22
0
def check_reg():
    values = request.values
    login_code = values.get("login_code", "")
    if len(login_code) < 1:
        return json_error_response("需要login_code")

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

    bind_info = OauthMemberBind.query.filter_by(
        openid=openid, type=1).first()  # type=1 corresponds to wechat
    if not bind_info:
        return json_error_response("未绑定")

    member_info = Member.query.filter_by(id=bind_info.member_id).first()
    if not member_info:
        return json_error_response("查询不到对应的用户信息")

    # similar function to cookies, token is saved in front end so we may save login status
    return json_response("登录成功", data={"token": generate_token(member_info)})
Exemplo n.º 23
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("修改食品类别信息成功!")
Exemplo n.º 24
0
def my_address_get():
    address_id = utils.get_int(request.values, "id", 0)
    address_info = MemberAddress.query.filter_by(id=address_id).first()
    if not address_info:
        return json_error_response("无法获取地址信息")

    prov_idx, city_idx, distr_idx = \
        utils.get_addr_idxs(address_info.province_id, address_info.city_id,
                            address_info.district_id)

    data = {
        "contact_name": address_info.contact_name,
        "mobile": address_info.mobile,
        "province_name": address_info.province_str,
        "city_name": address_info.city_str,
        "district_name": address_info.district_str,
        "province_idx": prov_idx,
        "city_idx": city_idx,
        "distr_idx": distr_idx,
        "address": address_info.address
    }
    return json_response(data=data)
Exemplo n.º 25
0
def edit():
    if request.method == "GET":
        return render_template_with_global_vars("user/edit.html")
    elif request.method == "POST":
        nickname = request.form["nickname"] if "nickname" in request.form else ""
        email = request.form["email"] if "email" in request.form else ""

        if "current_user" not in g or g.current_user is None:
            return json_error_response("您还没有登录,不能更改个人信息!")

        if len(nickname) < 1 or len(email) < 1:
            return json_error_response("您的姓名或邮箱不能为空!")

        user_info = g.current_user
        user_info.nickname = nickname
        user_info.email = email
        db.session.add(user_info)
        db.session.commit()

        res_data = {"nickname": nickname, "email": email}

        return json_response(msg="账号个人信息编辑成功!", data=res_data)
Exemplo n.º 26
0
def my_order_info():
    order_sn = request.values.get("order_sn", "")
    if not order_sn:
        return json_error_response("查询订单信息错误,请稍后再试(1)")

    pay_order_info = PayOrder.query.filter_by(order_sn=order_sn).first()
    if not pay_order_info:
        return json_error_response("查询订单信息错误,请稍后再试(2)")

    pay_wait_time = app.config["PAY_WAIT_TIME"]
    deadline = pay_order_info.created_time + datetime.timedelta(minutes=pay_wait_time)
    address_info = json.loads(pay_order_info.deliver_info)
    data = {
        "order_sn": pay_order_info.order_sn,
        "status": pay_order_info.pay_status,
        "status_desc": pay_order_info.pay_status_desc,
        "deadline": deadline.strftime("%Y-%m-%d %H:%M"),
        "address": address_info,
        "base_price": str(pay_order_info.base_price),
        "shipping_price": str(pay_order_info.shipping_price),
        "total_price": str(pay_order_info.total_price),
    }

    # "poi" short for "PayOrderItem"
    poi_and_food_list = db.session.query(PayOrderItem, Food).filter(
        PayOrderItem.pay_order_id == pay_order_info.id,
        PayOrderItem.food_id == Food.id
    )

    goods = [{
        "pic_url": build_image_url(food.main_image),
        "name": food.name,
        "price": str(poi.price),
        "unit": poi.quantity
    } for poi, food in poi_and_food_list]

    data["goods"] = goods

    return json_response(data=data)
Exemplo n.º 27
0
def food_index():
    # get food info from database
    food_cat_info_list = FoodCat.query.filter_by(status=1).order_by(FoodCat.weight.desc()).all()
    food_cat_list = [{"id": 0, "name": "全部"}]
    if food_cat_info_list:
        food_cat_list = food_cat_list + [{"id": cat.id, "name": cat.name}
                                         for cat in food_cat_info_list]
    else:
        food_cat_list = None

    food_info_list = Food.query.filter_by(status=1).order_by(Food.total_count.desc(), Food.id).limit(3).all()
    if food_info_list:
        food_list = [{"id": food.id, "name": food.name, "pic_url": build_image_url(food.main_image)}
                     for food in food_info_list]
    else:
        food_list = None

    data = {
        "bannerList": food_list,
        "catList": food_cat_list
    }

    return json_response(data=data)
Exemplo n.º 28
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()
Exemplo n.º 29
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)
Exemplo n.º 30
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={})