Пример #1
0
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')
Пример #2
0
def login():
    """
    登录:获取参数/检验参数/查询数据/返回结果
    1. 获取post请求的参数,grt_json()
    2. 检验参数存在
    3. 进一步获取详细的参数信息,mobile,password
    4. 对手机号格式进行检验
    5. 查询数据库,确定用户存在
    6. 检查查询结果,对密码正确性进行检验user.check_password_has(password)
    7. 缓存用户信息,session['user_id']= user.id
    8. 返回结果
    :return: 
    """
    # 获取post请求的参数
    user_data = request.get_json()
    if not user_data:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 进一步获取详细的参数信息
    mobile = user_data.get('mobile')
    password = user_data.get('password')
    # 验证参数的完整性
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    # 校验手机号格式
    if not re.match(r'1[3455678]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
    # 判断用户的错误次数,从redis获取错误次数 remote_addr取出ip地址信息
    user_ip = request.remote_addr
    try:
        access_count = redis_store.get("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        # 如果错误记录超过最大次数,则直接返回
        if access_count is not None and int(access_count) >= constants.LOGIN_ERROR_MAX_NUM:
            return jsonify(errno=RET.REQERR, errmsg="登录太过频繁,请稍后在登录")
    # 查询数据库,确认用户信息
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询用户信息异常')
    # 校验查询结果,校验密码,如果用户不存在或者密码错误
    if user is None or not user.check_password(password):
        # 出现错误则累加错误次数,incr
        try:
            redis_store.incr("access_%s" % user_ip)
            redis_store.expire("access_%s" % user_ip, constants.LOGIN_ERROR_FORBID_TIME)
        except Exception as e:
            current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='用户名或密码错误')
    # 登录成功,则清除用户登录错误次数
    try:
        redis_store.delete("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    # 缓存用户信息
    session['user_id'] = user.id
    session['name'] = user.name
    session['mobile'] = mobile
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK', data={'user_id': user.id})
Пример #3
0
def send_sms_code(mobile):
    """
    发送短信:获取参数/校验参数/查询数据/返回结果
    1. 获取参数,查询字符串的参数获取,mobile, text, id, request.args.get('text')
    2. 校验参数,首先校验参数存在
    3. 校验手机号,正则表达式,re.match(r'^1[]$',mobile)
    4. 校验图片验证码:获取本地存储的真实图片验证码
    5. 判断获取结果,如果图片验证码过期结束程序
    6. 删除图片验证码
    7. 比较图片验证码:统一转成小写比较图片验证码内容是否一致
    8. 生成短信码: 使用random 模块随机数
    9. 在本地保存短信验证码内容,判断用户是否已注册
    10. 调用云通讯发送信息: 使用异常进行处理
    11. 保存云通讯的发送结果,判断是否发送成功
    12. 返回前端结果

    :param modile: 
    :return: 
    """
    # 获取参数, mobile, text, id
    image_code = request.args.get('text')
    image_code_id = request.args.get('id')
    # 校验参数存在
    # any, all 方法判断所有参数全部存在
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    # 检验手机号,使用正则模块
    if not re.match(r'1[345789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
    # 校验图片验证码,获取本地存储的真实图片验证码
    try:
        real_image_code = redis_store.get('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询图片验证码异常')
    # 判断获取结果
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg='图片验证码过期')
    # 图片验证码只能获取一次,无论是否获取到,都必须删除图片验证码
    try:
        redis_store.delete('ImageCode_' + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    # 比较图片验证码内容是否一致
    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')
    # 生成短信随机码,使用随机数模块,生成六位数
    sms_code = '%06d' % random.randint(1, 999999)
    # 保存短信验证码
    try:
        redis_store.setex('SMSCode_' + mobile,
                          constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存短信验证码失败')
    # 写注册的时候在使用
    # # 判断用户是否已注册
    # try:
    #     user = User.query.filter_by(mobile=mobile).first()
    # except Exception as e:
    #     current_app.logger.error(e)
    #     return jsonify(errno=RET.DBERR,errmsg='查询用户信息异常')
    # else:
    #     # 判断查询结果,用户是否注册
    #     if user is not None:
    #         return jsonify(errno=RET.DATAEXIST, errmsg='手机号已注册')

    # 发送短信,调用云通讯接口
    try:
        # 实例化对象
        ccp = sms.CCP()
        # 调用云通讯发送短信方法
        result = ccp.send_template_sms(
            mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='发送短信异常')
    # 判断发送结果
    # if result ==0:
    # 表达式判断,变量写在后面
    if 0 == result:
        return jsonify(errno=RET.OK, errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送失败')
Пример #4
0
def register():
    """
    注册
    1. 获取参数,获取post请求的参数,get_json()
    2. 校验参数存在
    3. 进一步获取详细的参数信息
    4. 校验参数的完整性
    5. 校验手机号格式
    6. 校验短信验证码,获取本地存储的真实的短信验证码
    7. 判断查询结果
    8. 如果有数据,比较短信验证码
    9. 删除已经验证过的短信验证码
    10. 判断用户是否注册过
    11. 保存用户信息,User(name=mobile, mobile=mobile), user.password = password
    12. 提交数据到数据库中,需要进行回滚
    13. 缓存用户信息,user.id, name, mobile
    14. 返回结果,user.to_dict()
    
    :return: 
    """

    # 获取post 请求的参数
    user_data = request.get_json()
    # 判断数据存在
    if not user_data:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 进一步获取详细的参数,mobile, sms_code, password
    # user_data['mobile']
    mobile = user_data.get('mobile')
    sms_code = user_data.get('sms_code')
    password = user_data.get('password')
    # 验证参数的完整性
    if not all([mobile, sms_code, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    # 验证手机号
    if not re.match(r'^1[34578]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')

    # 判断用户是否已注册
    try:
        user = User.query.filter_by(mobile=mobile).first()

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询手机信息异常')
    else:
        if user:
            return jsonify(errno=RET.DATAERR, errmsg='手机号已注册')

    # 校验短信验证码
    try:
        real_sms_code = redis_store.get('SMSCode_' + mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取短信验证码异常')

    # 判断查询结果
    if not real_sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码过期')

    # 比较短信验证码,前端的短信验证码转为str
    if real_sms_code != str(sms_code):
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')

    # 删除短信验证码
    try:
        redis_store.delete('SMSCode_' + mobile)
    except Exception as e:
        current_app.logger.error(e)

        # 保存用户信息, name/mobile/password
        user = User(name=mobile, mobile=mobile)
        # 调用模型类中的加密方法
        user.password = password
        # 提交数据到数据库中
        try:
            db.seesion.add(user)
            db.session.commit()
        except Exception as e:
            current_app.logger.error(e)
            # 写入数据如果发生错误,需要进行回滚
            db.session.rollback()
            return jsonify(errno=RET.DBERR, errmsg='保存用户信息异常')
        # 缓存用户信息
        session['user_id'] = user.id
        session['name'] = mobile
        session['mobile'] = mobile

        # 返回结果
        return jsonify(errno=RET.OK, errmsg='OK', data=user.to_dict())
Пример #5
0
def register():
    """
    注册
    1. 获取参数,获取post请求的参数,get_json()
    2. 校验参数存在
    3. 进一步获取详细的参数信息
    4. 校验参数的完整性
    5. 校验手机号格式
    6. 校验短信验证码(或者图片验证码),获取本地存储的真实的短信验证码(或者图片验证码)
    7. 判断查询结果
    8. 如果有数据,比较短信验证码(或者图片验证码)
    9. 删除已经验证过的短信验证码(或者图片验证码)
    10. 判断用户是否注册过
    11. 保存用户信息,User(name=mobile, mobile=mobile), user.password = password
    12. 提交数据到数据库中,需要进行回滚
    13. 缓存用户信息,user.id, name, mobile
    14. 返回结果,user.to_dict()
    
    :return: 
    """

    # 获取post 请求的参数
    user_data = request.get_json()
    # 判断数据存在
    if not user_data:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 进一步获取详细的参数,mobile, sms_code, password
    # user_data['mobile']
    mobile = user_data.get('mobile')
    # sms_code = user_data.get('sms_code')
    captcha_code = user_data.get('captcha_code')  # 验证码
    captcha_id = user_data.get('captcha_id')  # 验证码编号
    password = user_data.get('password')
    # 验证参数的完整性
    if not all([mobile, captcha_code, captcha_id, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')
    # 验证手机号
    if not re.match(r'^1[34578]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')

    # 判断用户是否已注册
    try:
        user = User.query.filter_by(mobile=mobile).first()

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询手机信息异常')
    else:
        if user:
            return jsonify(errno=RET.DATAERR, errmsg='手机号已注册')

    # # 校验短信验证码
    # try:
    #     real_sms_code = redis_store.get('SMSCode_' + mobile)
    # except Exception as e:
    #     current_app.logger.error(e)
    #     return jsonify(errno=RET.DBERR, errmsg='获取短信验证码异常')
    #
    # # 判断查询结果
    # if not real_sms_code:
    #     return jsonify(errno=RET.DATAERR, errmsg='短信验证码过期')
    #
    # # 比较短信验证码,前端的短信验证码转为str
    # if real_sms_code != str(sms_code):
    #     return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')

    # # 删除短信验证码
    # try:
    #     redis_store.delete('SMSCode_' + mobile)
    # except Exception as e:
    #     current_app.logger.error(e)

    # 校验图片验证码,获取本地存储的真实图片验证码
    try:
        real_image_code = redis_store.get('ImageCode_' + captcha_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询图片验证码异常')
    # 判断获取结果
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg='图片验证码过期')

    # 比较图片验证码内容是否一致
    # 注意:在redis中取出的数据是二进制,需要decode,否则匹配不成功
    if real_image_code.lower().decode(
            encoding='utf-8') != captcha_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误')

    # 删除图片验证码
    try:
        redis_store.delete('ImageCode_' + captcha_id)
    except Exception as e:
        current_app.logger.error(e)

    # 保存用户信息
    user = User(name=mobile, mobile=mobile)
    # 调用模型类中的加密方法
    user.password = password
    # 提交数据到数据库中
    try:
        user.add_update()
    except Exception as e:
        current_app.logger.error(e)
        # 写入数据如果发生错误,需要进行回滚
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存用户信息异常')
    # 缓存用户信息
    session['user_id'] = user.id
    session['name'] = mobile
    session['mobile'] = mobile

    # 返回结果
    return jsonify(errno=RET.OK, errmsg='OK', data=user.to_dict())