예제 #1
0
def save_order_comment(order_id):
    """
    保存订单评论信息
    前端传递参数:comment 格式json
    :param order_id:订单id
    :return: json
    """

    # 获取用户id
    user_id = g.user_id

    # 接收参数
    resp_dict = request.get_json()
    comment = resp_dict.get("comment")

    # 校验参数
    if not comment:
        return jsonify(errnum=RET.PARAMERR, errmsg=u"参数错误")

    # 判断订单id是有效
    try:
        # 判断订单的id是否是接收的订单id, 该订单是否是待评价状态, 该订单是否是当前用户的订单
        order = Order.query.filter(Order.id == order_id,
                                   Order.status == "WAIT_COMMENT",
                                   Order.user_id == user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errnum=RET.DBERR, errmsg=u"获取订单信息失败")

    if order is None:
        return jsonify(errnum=RET.NODATA, errmsg=u"订单信息不存在")

    # 业务处理
    # 把订单状态改为已完成
    order.status = "COMPLETE"
    # 把订单的评价改为用户输入的评价
    order.comment = comment
    # 获取该订单的房屋
    house = order.house
    # 把房屋下的订单数量+1
    house.order_count += 1

    # 保存订单信息
    try:
        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(errnum=RET.DBERR, errmsg=u"保存数据失败")

    # 为了方房屋详情页面的评价信息同步, 删除redis缓存
    try:
        redis_store.delete("house_info_%s" % user_id)
    except Exception as e:
        current_app.logger.error(e)

    # 返回应答
    return jsonify(errnum=RET.OK, errmsg=u"ok")
예제 #2
0
def get_sms_code(mobile):
    """获取短信"""
    image_code = request.args.get("image_code")
    image_code_id = request.args.get("image_code_id")
    if not all([image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
    # 取出code校验
    try:
        real_image_code = redis_store.get("image_code_%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="redis error")
    if real_image_code is None:
        return jsonify(errno=RET.NODATA, errmsg="code older")
    # remove verification code
    try:
        redis_store.delete("image_code_%s" % 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="code error")
    # 判断是否发送过
    try:
        send_flag = redis_store.get("send_sms_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if send_flag is not None:
            return jsonify(errno=RET.REQERR, errmsg="time not achieve")
    # 判断手机号是否存在
    try:
        user = User.query.filter_by(mobile=mobile).firs()
    except Exception as e:
        current_app.logger.error(e)
    else:
        if user is not None:
            return jsonify(errno=RET.DATAEXIST, errmsg="mobile exist")
    # 生成短信验证码
    sms_code = "%06d" % random.randint(0, 999999)
    try:
        redis_store.setex("sms_code_%s" % mobile,
                          constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        #
        redis_store.setex("send_sms_%s" % mobile,
                          constants.SEND_SMS_CODE_INTERVAL, 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="save sms code error")
    # 发送短信西
    try:
        # ccp = CCP()
        # result = ccp.send_template_sms(mobile, [sms_code, int(constants.SMS_CODE_REDIS_EXPIRES / 60)], 1)
        send_sms.delay(
            mobile,
            [sms_code, int(constants.SMS_CODE_REDIS_EXPIRES / 60)], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="send error")

    return jsonify(errno=RET.OK, errmsg="ok")
예제 #3
0
def save_order_comment(order_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
        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="操作失败")
    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")
예제 #4
0
def get_verify_code():
    # 获取UUID
    uuid = request.args.get('uuid')

    if not uuid:
        abort(403)

    # 获取验证码信息
    name, text, image = captcha.generate_captcha()

    try:
        if old_uuid:
            # 删除之前的验证信息
            redis_store.delete('Img_code:%s' % old_uuid)
        redis_store.set('Img_code:%s' % uuid, text, constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify({'errcode': RET.DATAERR, 'errmsg': error_map[RET.DATAERR]})
    global old_uuid
    old_uuid = uuid

    response = make_response(image)

    response.headers['Content-Type'] = 'image/jpg'
    current_app.logger.debug(text)

    return response
예제 #5
0
def login():
    """登录模块"""
    #获取参数,用户的手机号码,密码
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    #校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    #判断手机号码的格式是否正确
    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号码格式不正确")

    # 判断用户的登录次数防止用户暴力破解密码
    #从redis 中获取错误次数
    user_ip = request.remote_addr
    try:
        access_counts = redis_store.get("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        #如果有错误次数纪录,并且超过最大次数,直接返回
        if access_counts is not None and int(
                access_counts) >= 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.DATAERR, errmsg="用户信息查询失败")
    if user is None or not user.check_password(password):
        #出现错误,开始累加错误次数
        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.LOGINERR, errmsg="用户名或者密码错误")

    #登陆成功,设置session
    #清除用户的登录错误次数
    try:
        redis_store.delete("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)

    #保存用户的登录状态
    session["user_id"] = user.id
    session["user_name"] = user.name
    session["mobile"] = user.mobile

    return jsonify(errno=RET.OK, errmsg="用户登录成功")
예제 #6
0
파일: veryfy.py 프로젝트: IamDauncle/Ihome
def get_image_code():
    # 获取图片验证码  get请求

    # 1.获取uuid作为存储验证码的key  "image:uuid" : image_code
    uuid = request.args.get('uuid')
    last_uuid = request.args.get('last_uuid')
    if not uuid:
        return jsonify(errno=RET.PARAMERR, errmsg=u'缺少参数')

    # 2.生成图片验证码
    name,text,image = captcha.generate_captcha()

    # 3.redis存储图片验证码
    # 拼接redis存储的key

    redis_key = 'image:%s' %uuid
    try:
        if last_uuid: # 如果存在上一个的uuid
            redis_store.delete(last_uuid)  # 删除多余的uuid
                        # key      lavue     过期时间
        redis_store.set(redis_key,text,constants.IMAGE_CODE_REDIS_EXPIRES)  # 设置redis缓存
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR , errmsg=u'验证码保存失败')


    # 4.返回图片验证码
    response = make_response(image)
    response.headers['Content-Type'] = 'image/jpg'
    return response
예제 #7
0
def sms_code(mobile):
    """获取短信验证码"""
    # 接收数据
    image_code = request.args.get('image_code')
    image_code_id = request.args.get('image_code_id')

    # 校验数据
    # 验证码数据是否存在
    if not all([image_code, image_code_id]):
        return jsonify(errcode=RET.DATAERR, errmsg='验证码信息不全')

    try:
        redis_code = redis_store.get('image_code_%s' % image_code_id)
        redis_store.delete('image_code_%s' % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errcode=RET.DBERR, errmag='数据库信息错误')

    if redis_code is None:
        return jsonify(errcode=RET.NODATA, errmsg='验证码过期')
    elif image_code.lower() != redis_code.lower():
        return jsonify(errcode=RET.DATAERR, errmag='验证码错误')

    # 业务逻辑处理
    # 查询用户手机是否存在
    try:
        if User.query.filter_by(mobile=mobile).first():
            return jsonify(errcode=RET.DATAEXIST, errmsg='手机号已被注册')
    except Exception as e:
        current_app.logger.error(e)

    # 短信验证码
    sms_codes = '%06d' % random.randint(0, 999999)

    # 将短信验证码存入redis
    try:
        if redis_store.get('mobile_%s' % mobile) is None:
            redis_store.setex('sms_code_%s' % mobile,
                              constants.SMS_CODE_REDIS_EXPIRES, sms_codes)
            redis_store.setex('mobile_%s' % mobile, constants.SMS_SEND_TIME, 1)
        else:
            return jsonify(errcode=RET.DATAEXIST, errmsg='请求过于频繁,稍后再尝试')
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errcode=RET.DBERR, errmag='数据库信息错误')

    # 发送信息
    try:
        # 发送短信
        sms_sender = CCP()
        resp = sms_sender.sendTemplateSMS(mobile, [sms_codes, 5], 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errcode=RET.THIRDERR, errmsg='第三方系统错误')

    # 返回
    if resp:
        return jsonify(errcode=RET.OK, errmsg='发送成功')
    else:
        return jsonify(errcode=RET.THIRDERR, errmsg='第三方系统错误')
예제 #8
0
def generate_image_code():
    # 获取到之前的id和当前的id
    pre_image_id = request.args.get('pre_id')
    cur_image_id = request.args.get('cur_id')
    # 生成验证码
    name, text, image = captcha.generate_captcha()
    current_app.logger.debug(text)
    try:
        # 删除之前的
        redis_store.delete('ImageCode_' + pre_image_id)
        # print "删除之前的验证码"
        # 保存当前的
        redis_store.set('ImageCode_' + cur_image_id, text,
                        constants.IMAGE_CODE_REDIS_EXPIRES)
        # print "保存当前的验证码"
    except Exception as e:
        current_app.logger.debug(e)
        # 返回响应内容
        # print '保存图片验证码失败'  # for test
        return make_response(jsonify(errno=RET.DATAERR, errmsg='保存图片验证码失败'))
    else:
        resp = make_response(image)
        # 设置内容类型
        resp.headers['Content-Type'] = 'image/jpg'
        return resp
예제 #9
0
def get_image_code():
    """
    1. 取到图片编码
    2. 生成图片验证码
    3. 存储到redis中(key是图片编码,值是验证码的文字内容)
    4. 返回图片
    """
    # 1. 取到图片编码
    args = request.args
    cur = args.get("cur")
    pre = args.get("pre")
    # 如果用户没有传图片id的话,直接抛错
    if not cur:
        abort(403)

    # 2. 生成图片验证码
    _, text, image = captcha.generate_captcha()
    # 为了测试输入到控制台中
    current_app.logger.debug(text)

    # 3. 存储到redis中(key是图片编码,值是验证码的文字内容)
    try:
        if pre:
            redis_store.delete("ImageCode_" + pre)
        redis_store.set("ImageCode_" + cur, text,
                        constants.IMAGE_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")

    # 4. 返回验证码图片
    respnose = make_response(image)
    # 设置contentType
    respnose.headers["Content-type"] = "image/jpg"
    return respnose
예제 #10
0
def get_sms_code():
    json_data = request.data
    dict_data = json.loads(json_data)
    mobile = dict_data.get("mobile")
    image_code = dict_data.get("image_code")
    image_code_id = dict_data.get("image_code_id")

    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.DATAERR, errmsg="手机号格式不正确")

    try:
        redis_image_code = redis_store.get("image_code:%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="图片验证码获取失败")
    try:
        redis_store.delete("imge_code:%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
    if image_code != redis_image_code:
        return jsonify(errno=RET.DATAERR, errmsg="图片验证码填写错误")
    sms_code = "%06d" % random.randint(0, 999999)

    current_app.logger.debug("短信验证码是:%s" % sms_code)

    try:
        redis_store.set("sms_code:%s" % mobile, sms_code,
                        constants.SMS_CODE_REDIS_EXPIRES)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="短信验证码保存失败")
    return jsonify(errno=RET.OK, errmsg="发送成功")
예제 #11
0
def login():
    """
    用户注册
    参数:手机号  密码
    格式:json
    :return:
    """
    # 获取参数
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    # 校验参数
    # 参数完整的校验
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 手机号的格式
    if not re.match(r"1[345678]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式错误")

    # 判断错误次数是否超过限制,如果超过限制,则限制后续操作时间
    # redis记录:"acess_num_"请求的IP: 次数
    user_ip = request.remote_addr   # 用户的IP地址

    try:
        access_nums = redis_store.get("access_nums_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if access_nums is not None and int(access_nums) >= constants.LOGIN_ERROR_MAX_TIMES:
            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):
        # 如果验证失败,记录错误次数,反回信息
        try:
            redis_store.incr("access_nums_%s" % user_ip)
            redis_store.expire("access_nums_%s" % user_ip, constants.LOGIN_ERROR_FORBID_TIME)
        except Exception as e:
            current_app.logger.error(e)

        return jsonify(errno=RET.DATAERR, errmsg="用户名或密码错误")

    # 如果验证相同成功,保存登录状态,在session中
    session["name"] = user.name
    session["mobile"] = user.mobile
    session["user_id"] = user.id

    # 登录成功删除redis登录错误次数记录
    redis_store.delete("access_nums_%s" % user_ip)

    return jsonify(errno=RET.OK, errmsg="登录成功")
예제 #12
0
def register():
    resp_json = request.get_json
    mobile = resp_json.get('mobile')
    sms_code = resp_json.get('sms_code')
    password = resp_json.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:
        real_sms_code = redis_store.get('sms_code_' + mobile)
    except Exception as e:
        current_app.loger.error(e)
        return jsonify({'errno': RET.DBERR, 'errmsg': '访问数据库异常'})

    if real_sms_code is None:
        return jsonify({'errno': RET.NODATA, 'errmsg': '短信验证已过期'})

    if sms_code != real_sms_code:
        return jsonify({'errno': RET.DATAERR, 'errmsg': '短信验证码输入错误'})

    try:
        redis_store.delete('sms_code_' + mobile)
    except Exception as e:
        logging.error(e)

    user = User(name=mobile, mobile=mobile)
    user.password = password
예제 #13
0
def register():
    """注册"""

    # 获取参数
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    sms_code = req_dict.get("sms_code")
    password = req_dict.get("password")
    password2 = req_dict.get("password2")

    # 校验参数
    # 1. 参数完整性
    if not all([mobile, sms_code, password, password2]):
        return jsonify(errno=RET.PARAMERR, errmsg=u"参数不完整")
    # 2. 手机号
    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg=u"手机号格式错误")
    # 3. 密码
    if password != password2:
        return jsonify(errno=RET.PARAMERR, errmsg=u"两次密码不一致")
    # 4. 短信验证码
    try:
        real_sms_code = redis_store.get("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=u"读取短信验证码异常")
    if real_sms_code is None:
        return jsonify(errno=RET.NODATA, errmsg=u"短信验证码失效")
    try:
        # 删除redis中的短信验证码,防止重复使用校验
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
    if real_sms_code != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg=u"短信验证码错误")

    # 业务处理
    # 1. 保存用户的注册数据到数据库中
    user = User(name=mobile, mobile=mobile)
    user.password = password  # 设置属性,调用模型类中password.setter装饰方法
    try:
        db.session.add(user)
        db.session.commit()
    except IntegrityError as e:
        # 模型类中设置mobile为unique,因此手机号若存在会在保存时抛出异常
        db.session.rollback()  # 回滚到异常commit提交前的状态
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAEXIST, errmsg=u"手机号已存在")
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg=u"查询数据库异常")
    # 2. 保存登录状态到session中
    session["name"] = mobile
    session["mobile"] = mobile
    session["user_id"] = user.id

    # 返回结果
    return jsonify(errno=RET.OK, errmsg=u"注册成功")
예제 #14
0
def register():
    try:
        req_data = request.get_json()
    except Exception as e:
        return jsonify(errno=RET.PARAMERR, errmsg='请传入json数据')
    if not req_data:
        return jsonify(errno=RET.PARAMERR, errmsg='请传入json数据')
    mobile = req_data.get('mobile')
    sms_code = req_data.get('sms_code')
    password = req_data.get('password')
    password2 = req_data.get('password2')
    if not all([mobile, sms_code, password, password2]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    elif not re.match('1\d{10}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')
    elif password != password2:
        return jsonify(errno=RET.PARAMERR, errmsg='两次输入密码不相等')

    try:
        real_sms_code = redis_store.get('sms_code_%s' % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='redis数据库错误')
    else:
        if not real_sms_code:
            return jsonify(errno=RET.NODATA, errmsg='短信验证码已过期')
        elif real_sms_code != sms_code:
            return jsonify(errno=RET.PARAMERR, errmsg='短信验证码错误')
    # 删除redis中的短信验证码,防止重复使用校验
    try:
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)

        # 保存用户的注册数据到数据库中
    user = User(name=mobile, mobile=mobile)
    # user.generate_password_hash(password)

    user.password = password  # 设置属性

    try:
        db.session.add(user)
        db.session.commit()
    except IntegrityError as e:
        # 数据库操作错误后的回滚
        db.session.rollback()
        # 表示手机号出现了重复值,即手机号已注册过
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAEXIST, errmsg="手机号已存在")
    except Exception as e:
        db.session.rollback()
        # 表示手机号出现了重复值,即手机号已注册过
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据库异常")

    session['name'] = user.name
    session['mobile'] = user.mobile
    session['user_id'] = user.id
    return jsonify(errno=RET.OK, errmsg='注册用户成功')
예제 #15
0
def register():
    """用户注册"""
    # 从json中获取参数
    user_data = request.get_json()
    if not user_data:
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    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="手机号格式不正确")

    # 检查短信验证码
    # 从redis中读取真实的短信验证码
    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="短信验证码过期")

    # 判断用户输入的验证码的正确性
    if real_sms_code != str(sms_code):
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码无效")

    # 已经进行过短信验证码的对比校验,所以删除redis中的smscode
    try:
        redis_store.delete("SMSCode_" + mobile)
    except Exception as e:
        current_app.logger.error(e)

    # 保存用户信息
    user = User(name=mobile, mobile=mobile)
    # 通过设置user模型的password属性,实际调用了设置密码的方法,对密码进行了加密
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DATAEXIST, errmsg="手机号已存在")

    # 保存用户的session数据
    session["user_id"] = user.id
    session["name"] = mobile
    session["mobile"] = mobile

    return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())
예제 #16
0
def login():
    '''登陆'''
    # 获取参数,用户手机号,密码
    req_dict = request.get_json()
    mobile = req_dict.get('mobile')
    password = req_dict.get('password')

    # 校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    # 判读手机号格式
    if not re.match(r'1[34578]\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式不正确')

    # 判断用户的错误次数,从redis中获取错误次数
    user_ip = request.remote_addr
    print(user_ip)
    try:
        access_counts = redis_store.get('access_%s' % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        # 如果有错误次数记录,并且超过最大次数,直接返回
        if access_counts is not None and int(
                access_counts) > 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):
        # 出现错误,累加错误次数
        try:
            redis_store.incr('access_%s' % user_ip)
            redis_store.expire('access_%s' % user_ip,
                               constants.IMAGE_CODE_REDIS_EXPIRES)
        except Exception as e:
            current_app.logger.error(e)

        return jsonify(errno=RET.LOGINERR, errmsg='用户名或密码错误')

    # 登陆成功,清除用户的登陆错误次数
    try:
        redis_store.delete('access_%s' % user_ip)
    except Exception as e:
        current_app.logger.error(e)

    # 保存用户的登陆状态
    session['user_id'] = user.id
    session['user_name'] = user.name
    session['mobile'] = user.mobile

    return jsonify(errno=RET.OK, errmsg='用户登陆成功')
예제 #17
0
def login():
    """登录"""
    # 获取参数、用户手机号  密码
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    # 检验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 判断手机号格式
    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确")

    # 判断用户的错误次数
    # 从redis中获取错误次数
    user_ip = request.remote_addr
    try:
        access_counts = redis_store.get("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        # 如果有错误次数记录,并且超过最大次数,直接返回
        if access_counts is not None and int(
                access_counts) >= 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):
        # 出现错误,累加错误次数
        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.LOGINERR, errmsg="用户名或密码失败")

    # 登录成功,
    # 清除用户的登录错误次数
    try:
        redis_store.delete("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)

    # 保存用户的登录状态
    session["user_id"] = user.id
    session["user_name"] = user.name
    session["mobile"] = user.mobile

    return jsonify(errno=RET.OK, errmsg="用户登录成功")
예제 #18
0
def login():
    """登录"""
    # 获取参数, 用户名  密码
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    # 校验参数
    if not all([mobile, password]):
        resp = {"error_code": RET.PARAMERR, "errmsg": "参数不完整"}
        return jsonify(resp)

    if not re.match(r"1[34578]\d{9}", mobile):
        resp = {"error_code": RET.PARAMERR, "errmsg": "手机号格式错误"}
        return jsonify(resp)

    # 判断用户的错误次数
    # 从redis中获取错误次数
    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(error_code=RET.REQERR, errmsg="登录过于频繁")

    # 业务处理
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        resp = {"error_code": RET.DBERR, "errmsg": "查询用户信息失败"}
        return jsonify(resp)

    if user is not None and user.check_password(password):
        # 清除用户的登录错误此时
        try:
            redis_store.delete("access_%s" % user_ip)
        except Exception as e:
            current_app.logger.error(e)

        # 记录用户的登录状态
        session["user_id"] = user.id
        session["username"] = user.name
        session["mobile"] = mobile

        resp = {"error_code": RET.OK, "errmsg": "登录成功"}
        return jsonify(resp)
    else:
        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)
        resp = {"error_code": RET.LOGINERR, "errmsg": "用户名或密码错误"}
        return jsonify(resp)
예제 #19
0
def send_sms_code(mobile):
    #获取参数,除了传递的mobile外,还有图片验证码(内容数据)text,图片验证码id(模板id)--id
    image_code = request.args.get('text')
    image_code_id = request.args.get('id')
    #校验是否缺少参数,mobile,text,id
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    #校验mobile手机号格式
    if not re.match(r'1[3456789]\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机格式错误')
    #获取本地存储redis中存储的真实图片验证码
    try:
        real_image_code = redis_store.get('ImageCode_' + image_code_id)
    #判断获取结果,放在try中,图片验证码是否过期
    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='图片验证码错误')
    #查询数据库,看手机号是否已经注册,也就是是否存在这个手机的用户
    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.DATAEXIST, errmsg='手机号已注册')
    #构造短信随机码并保存
    sms_code = '%06d' % random.randint(0, 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:
        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 0 == result:
        return jsonify(errno=RET.OK, errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送失败')
예제 #20
0
def get_sms_code(mobile):
    """
    发送手机验证码
    :param mobile:
    :return:
    """
    image_code = request.args.get("image_code")
    image_code_id = request.args.get("image_code_id")

    if not all([image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    try:
        redis_image_code = redis_store.get("image_code_%s" % image_code_id)
        redis_store.delete("image_code_%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库异常")

    if redis_image_code is None:
        return jsonify(errno=RET.NODATA, errmsg="验证码过期")

    if redis_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR, errmsg="验证码错误")

    try:
        # 判断在60秒内用户有没有发送过验证码,如果有表示用户请求频繁,拒绝处理
        send_flg = redis_store.get("send_sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if send_flg is not None:
            # 60秒内发送过验证码
            return jsonify(errno=RET.REQERR, errmsg="请求过于平凡,请60秒后再试")

    # 生成手机验证码信息
    sms_code = "%06d" % random.randint(0, 999999)

    try:
        redis_store.setex("sms_code_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
        redis_store.setex("send_sms_code_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="保存验证码异常")

    try:
        ccp = CCP()
        result = ccp.send_template_sms(mobile, [sms_code, int(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:
        return jsonify(errno=RET.OK, errmsg="发送成功")
    else:
        return jsonify(errno=RET.THIRDERR, errmsg="发送失败")
예제 #21
0
def save_order_comment(order_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="参数错误")

    # 三. 业务逻辑处理
    # 3.1 查询订单状态为待评价
    try:
        # 根据订单id/订单所属用户/订单状态为待评价状态
        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="操作无效")

    # 3.2 保存评价信息
    try:
        # 将订单的状态设置为已完成
        order.status = "COMPLETE"
        # 保存订单的评价信息
        order.comment = comment
        # 将房屋的完成订单数增加1,如果订单已评价,让房屋成交量加1
        house.order_count += 1
        # add_all可以一次提交多条数据db.session.add_all([order,house])
        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="操作失败")

    # 3.3 缓存中存储的房屋信息,因为订单成交,导致缓存中的数据已经过期,所以,需要删除过期数据
    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")
예제 #22
0
def login():
    """用户登录"""
    # 获取参数
    req_data = request.get_json()
    if not req_data:
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    mobile = req_data.get("mobile")
    password = req_data.get("password")

    # 检查参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 手机号格式校验
    if not re.match(r"^1[34578]\d{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式错误")

    # 判断访问次数是否超过限制
    try:
        access_count = redis_store.get("access_%s" % request.remote_addr)
    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="数据库异常")
    # 调用user模型中实现的检验用户密码的方法
    if user is None or not user.check_password(password):
        try:
            redis_store.incr("access_%s" % request.remote_addr)
            redis_store.expire("access_%s" % request.remote_addr,
                               constants.LOGIN_ERROR_LOCKED_TIME)
        except Exception as e:
            current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="手机号或密码错误")

    # 删除访问次数记录
    try:
        redis_store.delete("access_%s" % request.remote_addr)
    except Exception as e:
        current_app.logger.error(e)

    # 用户验证成功,保存用户的session数据
    session["user_id"] = user.id
    session["name"] = user.name
    session["mobile"] = user.mobile

    return jsonify(errno=RET.OK, errmsg="登录成功", data={"user_id": user.id})
예제 #23
0
def login():
    """登录"""
    # 获取参数,手机号,密码
    # 使用request.get_json 或 json.loads(request.data)将json数据转化为字典类型
    req_dict = request.get_json()
    # 获取手机号
    mobile = req_dict.get("mobile")
    # 获取密码
    password = req_dict.get("password")
    # 校验参数
    # 判断数据是否完整
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="数据不完整")
    # 判断手机格式是否正确
    if not re.match(r"1[34578]\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="登录太过频繁,请稍后在登录")
    # 用户的user用户名是否存在,密码是否一致
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户信息异常")
    # 判断用户的user用户名是否存在,密码是否正确
    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.LOGINERR, errmsg="用户登录失败")
    # 登录成功,则清除用户登录错误次数
    try:
        redis_store.delete("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    # 记住用户当前的登录状态
    session["user_name"] = user.name
    session["user_id"] = user.id
    session["mobile"] = user.mobile
    # 返回数据 登录成功
    return jsonify(errno=RET.OK, errmsg="登录成功")
예제 #24
0
def login():
    #1.获取参数(手机号,密码)
    req_json = request.data
    req_dict = json.loads(req_json)
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    #2.校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

    #验证手机号的格式
    if not re.match(r"1[356789]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式有误")

    #记录用户的登录次数
    try:
        ip = request.remote_addr  #获取用户的ip
        account = redis_store.get("access_%s" % ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if account is not None and int(account) >= constants.LOGIN_ERROR_COUNT:
            return jsonify(errno=RET.DBERR, errmsg="登录次数用完,请十分钟再试")

    #3.根据手机号取出用户对象
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询异常")

    #4.判断用户名,密码
    if user is None or not user.check_password(password):
        try:
            redis_store.incr("access_%s" % ip)
            redis_store.expire("access_%s" % ip, constants.LOGIN_ERROR_TIME)
        except Exception as e:
            current_app.logger.error(e)

        return jsonify(errno=RET.DATAERR, errmsg="用户名或者密码错误")

    #登录成功,清除redis中的登录错误次数
    try:
        redis_store.delete("access_%s" % ip)
    except Exception as e:
        current_app.logger.error(e)

    #5.记录用户的登录状态
    session["user_id"] = user.id
    session["user_name"] = user.name
    session["mobile"] = user.mobile

    #6.响应
    return jsonify(errno=RET.OK, errmsg="登录成功")
예제 #25
0
def login():
    # 获取参数
    resp_json = request.get_json()
    mobile = resp_json.get('mobile')
    password = resp_json.get('password')
    # 参数校验
    # 1 数据完整性
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='数据不完整')
    # 2 手机号格式
    if not re.match(r"1[345678]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式不正确')
    # 业务处理
    # 用户ip
    user_ip = request.remote_addr
    try:
        real_count = redis_store.get('access_' + user_ip)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询Redis失败')
    # Redis存储错误次数 不大于5次
    if real_count and int(real_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:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='用户查询失败')
    # 用户是否存在或者密码是否正确
    if user is None or not user.check_password(password):
        # 错误一次加一 设置过期时间
        try:
            redis_store.incr('access_' + user_ip)
            redis_store.expire('access_' + user_ip, constants.LOGIN_ERROR_FORBID_TIME)
        except Exception as e:
            logging.error(e)
            return jsonify(errno=RET.DBERR, errmsg='Redis操作失败')
        return jsonify(errno=RET.LOGINERR, errmsg='用户名或密码输入错误')
    # 如果输入正确 错误次数清零
    try:
        redis_store.delete('access_' + user_ip)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='删除Redis数据失败')
    # 保存登录状态
    try:
        session['id'] = user.id
        session['name'] = user.mobile
        session['mobile'] = user.mobile
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='用户登录失败')
    # 返回数据
    return jsonify(errno=RET.OK, errmsg='用户登录成功')
예제 #26
0
def register():
    """register

    :return:
    """
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    sms_code = req_dict.get("sms_code")
    pwd = req_dict.get("password")
    pwd2 = req_dict.get("password2")
    # 数据是否完整
    if not all([mobile, sms_code, pwd]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
    # 判断手机格式
    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机格式错误")
    if pwd != pwd2:
        return jsonify(errno=RET.PARAMERR, errmsg="两次密码不一致")
    # 判断短信验证码是否正确
    try:
        real_sms_code = redis_store.get("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="读取短信验证码异常")
    if real_sms_code is None:
        return jsonify(errno=RET.NODATA, errmsg="短信验证码失效")
    try:
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
    # 验证码是否正确
    if real_sms_code != sms_code:
        return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")
    # 保存用户信息

    user = User(name=mobile, mobile=mobile)
    user.password = pwd
    try:
        db.session.add(user)
        db.session.commit()
    except IntegrityError as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="手机号存在")
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库异常")
    # 保存登录数据
    session["name"] = mobile
    session["mobile"] = mobile
    session["user_id"] = user.id
    # return
    return jsonify(errno=RET.OK, errmsg="ok")
예제 #27
0
def login():
    '''登陆'''

    # 获取参数
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")
    # 校验参数
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")

    # 判断手机号格式
    if not re.match(r"1[34578]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确")
    # 业务逻辑
    user_ip = request.remote_addr

    try:
        # 获取登陆失败的次数
        access_count = redis_store.get("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    print access_count
    if access_count is not None and int(access_count) >= constants.ACCESS_LOGIN_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.chek_password(password):
        try:
            # 账号密码错误时,自增1
            redis_store.incr("access_%s" % user_ip)
            # 设置过期时间
            redis_store.expire("access_%s" % user_ip, constants.ACCESS_LOGIN_TIME)
        except Exception as e:
            current_app.logger.error(e)

        return jsonify(errno=RET.PARAMERR, errmsg="用户名或密码错误")
    try:
        # 清除redis错误时登陆次数
        redis_store.delete("access_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    # 登陆成功
    # 记录用户会话消息
    session["user_id"] = user.id
    session["user_name"] = user.name
    session["user_mobile"] = user.mobile
    # 返回
    return jsonify(errno=RET.OK, errmsg="登陆成功")
예제 #28
0
def generate_image_code(image_code_id):
    """
    生成图片验证码:
    1/调用captcha扩展包,生成图片验证码,name,text,image
    2/本地存储图片验证码,使用redis数据库
    3/返回图片本身,设置响应的content-type
    4/调用make_response
    :param image_code_id:
    :return:
    """
    # 调用captcha扩展包

    name, text, image = captcha.generate_captcha()
    # 调用redis数据库实例,存储图片验证码

    # 删除上一个保持在redis数据库中的图片验证码
    try:
        code_image = request.cookies.get('image_code')

    except Exception as e:
        current_app.logger.error(e)
    else:
        if code_image:
            try:
                redis_store.delete('ImageCode_'+str(code_image))  # code_image没有类型要转成字符串
            except Exception as e:
                current_app.logger.error(e)

    try:
        # 调用redis数据库实例,存储图片验证码
        # setex存储数据的类型及格式
        # setex存储数据的类型是string 基本格式setex('key','timeout(过期时间)','values(值)')
        redis_store.setex('ImageCode_'+ image_code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
    except Exception as e:
        # 调用应用上下文,记录项目错误日志信息
        current_app.logger.error(e)
        # 以application/json的形式返回错误状态码,错误信息
        return jsonify(errno=RET.DBERR,errmsg='保存图片验证失败')
    # 如果未发生异常,返回图片本身
    else:
        # 使用响应对象,用来返回图片
        response = make_response(image)
        # 设置响应报文的Content-Type = 'image/jpg'
        response.headers['Content-Type'] = 'image/jpg'
        # response对象删除上一个保持在浏览器cookie中的图片验证码
        try:
            response.delete_cookie('image_code')
        except Exception as e:
            pass
        # 新的验证码存入cookie
        response.set_cookie('image_code', image_code_id)
        # 返回响应response
        return response
예제 #29
0
def register():
    """
    注册
    请求参数  手机号 验证码 秘密 确认密码
    请求方式 json
    :return:
    """
    req_data = request.get_json()
    mobile = req_data.get("mobile")
    sms_code = req_data.get("sms_code")
    password = req_data.get("password")
    password2 = req_data.get("password2")

    if not all([mobile, sms_code, password, password2]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不完整")
    if password != password2:
        return jsonify(errno=RET.PARAMERR, errmsg="两次秘密不一样")
    if not re.match(r'1[34678]\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不对")
    try:
        redis_sms_code = redis_store.get("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取手机验证码错误")
    if redis_sms_code is None:
        return jsonify(errno=RET.NODATA, errmsg="手机验证码失效")
    try:
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)

    if sms_code != redis_sms_code:
        return jsonify(errno=RET.DATAERR, errmsg="验证码不对")

    user = User(name=mobile, mobile=mobile)
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except IntegrityError as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAEXIST, errmsg="手机号已经存在")
    except Exception as e:
        db.session.rollback()
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库查询异常")

    session["name"] = mobile
    session["mobile"] = mobile
    session["user_id"] = user.id

    return jsonify(errno=RET.OK, errmsg="注册成功")
예제 #30
0
def login():
    """"登陆参数:手机号,密码"""
    # 1. 获取参数
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    # 2. 校验参数
    # 2.1   参数完整性
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='请输入用户名和密码')
    # 2.2   手机号格式是否正确,re.match成功返回字符串,失败返回None
    if not re.match(r'1[34578]\d{9}', mobile):
        return jsonify(errno=RET.DATAERR, errmsg='手机号格式错误')
    # 2.3   判断用户操作是否超过限制
    # redis记录:"access_nums_%s" % user_ip: nums
    user_ip = request.remote_addr  # 获取用户的IP地址
    try:
        access_nums = redis_store.get("access_nums_%s" % user_ip)
    except Exception as e:
        current_app.logger.error(e)
    else:
        if access_nums is not None and int(access_nums) >= LOGIN_ERROR_TIMES:
            return jsonify(errno=RET.REQERR, errmsg='登陆次数过多,请稍后重试')

    # 3. 业务处理
    # 3.1   获取用户对象
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="用户名或密码错误")
    # 3.2   如果获取的为空 / 密码校验错误
    if user is None or not user.check_password(password):
        # 记录错误次数
        try:
            redis_store.incr("access_nums_%s" % user_ip)
            redis_store.expire("access_nums_%s" %
                               LOGIN_ERROR_FORBIN_TIME)  # 设置数据有效期
        except Exception as e:
            current_app.logger.error(e)

        return jsonify(errno=RET.PARAMERR, errmsg='用户名或密码错误')

    # 4. 返回应答
    # 4.1   保存登录状态
    session['name'] = user.name
    session['mobile'] = user.mobile
    session['user_id'] = user.id
    # 4.2 消除错误登陆次数
    redis_store.delete("access_nums_%s" % user_ip)
    # 4.3   返回应答
    return jsonify(errno=RET.OK, errmsg='登陆成功')
예제 #31
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 == 'COMPLETE').first()
        house = order.house
        print(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')
예제 #32
0
def save_order_comment(order_id):
    """保存订单评论信息"""
    user_id = g.user_id
    # 获取参数
    req_data = request.get_json()
    comment = req_data.get("comment")  # 评价信息

    # 检查参数
    if not comment:
        return jsonify(error_code=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(error_code=RET.DBERR, errmsg="无法获取订单数据")

    if not order:
        return jsonify(error_code=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(error_code=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(error_code=RET.OK, errmsg="OK")
예제 #33
0
def register():
    """
    注册
    1/获取参数,使用user_data = request.get_json()
    2/校验参数的存在
    3/进一步获取详细的参数信息,mobile,smscode,password
    4/校验参数的完整性
    5/进一步校验详细的参数信息,mobile
    6/校验短信验证码,获取本地存储的短信验证码
    7/判断短信验证码是否过期
    8/比较短信验证码是否正确
    9/删除短信验证码
    10/判断用户是否已注册
    11/保存用户信息,
    user = User(mobile=mobile,name=mobile)
    user.password = password
    12/缓存用户信息:flask_session扩展包的作用:指定用户的缓存信息存放位置,加密签名,指定有效期;
    我们需要使用请求上下文对象session来从redis中获取或设置用户信息;
    session.get('user_id')
    session[user_id] = user_id
    13/返回结果
    :return:
    """
    # 获取参数
    user_data = request.get_json()
    # 判断获取结果
    if not user_data:
        return jsonify(errno=RET.PARAMERR, errmsg='参数缺失')

    # 进一步获取详细的参数信息
    mobile = user_data.get('mobile')
    smscode = user_data.get('sms_code')
    password = user_data.get('password')
    # 校验参数的完整性
    if not all([mobile, smscode, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')

    # 校验手机号格式是否符合要求
    if not re.match(r'1[3456789]\d{9}$', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式错误')

    # 校验短信验证码,从redis中获取真实的短信验证码
    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.NODATA, errmsg='短信验证码过期')
    # 比较短信验证码
    if real_sms_code != str(smscode):
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码错误')

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

    # 判断用户是否已注册
    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='手机号已注册')



    # 调用模型类对象,保存用户信息
    user = User(mobile=mobile, name=mobile)
    # 对密码存储,这里调用了模型类generate_password_hash方法,对密码进行加密存储
    user.password = password

    # 提交数据到数据库中
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        # 存入数据如果发生异常,需要进行回滚
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='保存用户信息失败')

    # 缓存用户的信息,使用请求上下文对象session
    session['user_id'] = user.id
    session['name'] = mobile
    session['mobile'] = mobile

    # 返回结果,data 为附属消息
    return jsonify(errno=RET.OK, errmsg='OK', data=user.to_dict())
예제 #34
0
def send_sms_code(mobile):
    """发送短信验证码"""
    # 获取参数
    image_code_id = request.args.get("image_code_id")
    image_code = request.args.get("image_code")

    # 校验参数
    if not all([image_code_id, image_code]):
        resp = {
            "error_code": RET.PARAMERR,
            "errmsg": "参数不完整"
        }
        return jsonify(resp)

    # 业务处理
    # 取出真实的图片验证码
    try:
        real_image_code = redis_store.get("image_code_%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        resp = {
            "error_code": RET.DBERR,
            "errmsg": "获取图片验证码失败"
        }
        return jsonify(resp)

    # 判断验证码的有效期
    if real_image_code is None:
        resp = {
            "error_code": RET.NODATA,
            "errmsg": "图片验证码过期"
        }
        return jsonify(resp)

    # 删除redis中的图片验证码,防止用户多次尝试同一个图片验证码
    try:
        redis_store.delete("image_code_%s" % image_code_id)
    except Exception as e:
        current_app.logger.error(e)

    # 判断用户填写的验证码与真实验证码
    if real_image_code.lower() != image_code.lower():
        # 表示用户填写错误
        resp = {
            "error_code": RET.DATAERR,
            "errmsg": "图片验证码有误"
        }
        return jsonify(resp)

    # 判断用户手机号是否注册过
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
    else:
        if user is not None:
            resp = {
                "error_code": RET.DATAEXIST,
                "errmsg": "手机号已注册过"
            }
            return jsonify(resp)

    # 创建短信验证码
    sms_code = "%06d" % random.randint(0, 999999)

    # 保存短信验证码
    try:
        redis_store.setex("sms_code_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
    except Exception as e:
        current_app.logger.error(e)
        resp = {
            "error_code": RET.DBERR,
            "errmsg": "保存短信验证码异常"
        }
        return jsonify(resp)

    # 发送验证码短信
    # 通过celery发送
    # task_sms.send_template_sms.delay(mobile, [sms_code, str(constants.SMS_CODE_REDIS_EXPIRES/60)], 1)
    # result返回异步结果对象, 通过对象能够获取最终执行结果
    result = tasks.send_template_sms.delay(mobile, [sms_code, str(constants.SMS_CODE_REDIS_EXPIRES/60)], 1)
    # 通过get方法能返回执行结果
    # get()默认是阻塞的, 会等到worker执行完成有了结果的时候才返回
    # get()通过timeout超时时间,可以在超过超时时间后立即返回
    ret = result.get()
    print ret

    return jsonify(error_code=RET.OK, errmsg="ok")
예제 #35
0
def get_sms_codes(mobile):
    # 获取参数
    code = request.args.get('code')
    codeId = request.args.get('codeId')

    # 参数校验
    if not all([code, codeId]):
        resp = {
            'errno': RET.DATAERR,
            'errmsg': '数据不完整'
        }
        return jsonify(resp)
    # 业务处理

    # 2 获取图片验证码
    image_code_id = 'image_code_' + codeId
    try:
        new_code = redis_store.get(image_code_id)
    except Exception as e:
        logging.error(e)
        resp = {
            'errno': RET.DBERR,
            'errmsg': '获取图片验证码失败'
        }
        return jsonify(resp)
    # 图片验证码是否有效
    if new_code is None:
        resp_dict = {
            'errno': RET.NODATA,
            'errmsg': '图片验证码过期/失效'
        }
        return jsonify(resp_dict)

    # 删除原来的验证码
    try:
        redis_store.delete(image_code_id)
    except Exception as e:
        logging.error(e)
        resp = {
            'errno': RET.DBERR,
            'errmsg': '删除图片验证码失败'
        }
        return jsonify(resp)

    # 3 对比是否一致
    if new_code.lower() != code.lower():
        # 不一致
        resp = {
            'errno': RET.PARAMERR,
            'errmsg': '图片二维码填写错误,请点击刷新后重新输入'
        }
        return jsonify(resp)

    # 1 用户名是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
        resp = {
            'errno': RET.DBERR,
            'errmsg': '查找用户信息失败'
        }
        return jsonify(resp)
    if user:
        # 用户存在
        resp = {
            'errno': RET.DATAEXIST,
            'errmsg': '该用户已存在'
        }
        return jsonify(resp)
    # 创建6位验证码
    sms_code = '%06d' % random.randint(0, 999999)
    # 将短信验证码存储到Redis中  点击注册时进行对比
    try:
        redis_store.setex('sms_code_%s' % mobile, constants.SMS_CODE_REDIS_EXPIRE, sms_code)
    except Exception as e:
        logging.error(e)
        resp = {
            'errno': RET.DBERR,
            'errmsg': '保存短信验证码失败'
        }
        return jsonify(resp)
    # 发送验证码
    ccp = CCP()
    status_code = ccp.send_template_sms('18204681825', [sms_code, constants.SMS_CODE_TIME_EXPIRE], 1)
    # 返回数据
    if status_code == '000000':
        resp = {
            'errno': RET.OK,
            'errmsg': '发送短信验证码成功'
        }
        return jsonify(resp)
    else:
        resp = {
            'errno': RET.THIRDERR,
            'errmsg': '发送短信验证码失败'
        }
        return jsonify(resp)
예제 #36
0
def login():
    """登录"""
    # 获取参数, 用户名  密码
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    password = req_dict.get("password")

    # 校验参数
    if not all([mobile, password]):
        resp = {
            "error_code": RET.PARAMERR,
            "errmsg": "参数不完整"
        }
        return jsonify(resp)

    if not re.match(r"1[34578]\d{9}", mobile):
        resp = {
            "error_code": RET.PARAMERR,
            "errmsg": "手机号格式错误"
        }
        return jsonify(resp)

    # 判断用户的错误次数
    # 从redis中获取错误次数
    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(error_code=RET.REQERR, errmsg="登录过于频繁")

    # 业务处理
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        resp = {
            "error_code": RET.DBERR,
            "errmsg": "查询用户信息失败"
        }
        return jsonify(resp)

    if user is not None and user.check_password(password):
        # 清除用户的登录错误此时
        try:
            redis_store.delete("access_%s" % user_ip)
        except Exception as e:
            current_app.logger.error(e)

        # 记录用户的登录状态
        session["user_id"] = user.id
        session["username"] = user.name
        session["mobile"] = mobile

        resp = {
            "error_code": RET.OK,
            "errmsg": "登录成功"
        }
        return jsonify(resp)
    else:
        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)
        resp = {
            "error_code": RET.LOGINERR,
            "errmsg": "用户名或密码错误"
        }
        return jsonify(resp)
예제 #37
0
def register():
    """用户注册"""
    # 接收参数,手机号 短信验证码 密码
    req_dict = request.get_json()
    mobile = req_dict.get("mobile")
    sms_code = req_dict.get("sms_code")
    password = req_dict.get("password")

    # 校验参数
    if not all([mobile, sms_code, password]):
        resp = {
            "error_code": RET.PARAMERR,
            "errmsg": "参数不完整"
        }
        return jsonify(resp)

    if not re.match(r"1[34578]\d{9}", mobile):
        resp = {
            "error_code": RET.DATAERR,
            "errmsg": "手机号格式错误"
        }
        return jsonify(resp)

    # 业务处理
    # 获取真实的短信验证码
    try:
        real_sms_code = redis_store.get("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)
        resp = {
            "error_code": RET.DBERR,
            "errmsg": "查询短信验证码错误"
        }
        return jsonify(resp)

    # 判断短信验证码是否过期
    if real_sms_code is None:
        resp = {
            "error_code": RET.NODATA,
            "errmsg": "短信验证码已过期"
        }
        return jsonify(resp)

    # 判断用户输入的短信验证码是否正确
    if real_sms_code != sms_code:
        resp = {
            "error_code": RET.DATAERR,
            "errmsg": "短信验证码错误"
        }
        return jsonify(resp)

    # 删除短信验证码
    try:
        redis_store.delete("sms_code_%s" % mobile)
    except Exception as e:
        current_app.logger.error(e)

    # 判断手机号是否已经注册
    # try:
    #     user = User.query.filter_by(mobile=mobile).first()
    # except Exception as e:
    #     current_app.logger.error(e)
    #     resp = {
    #         "error_code": RET.DBERR,
    #         "errmsg": "数据库异常"
    #     }
    #     return jsonify(resp)
    #
    # if user is not None:
    #     resp = {
    #         "error_code": RET.DATAEXIST,
    #         "errmsg": "手机号已经注册"
    #     }
    #     return jsonify(resp)

    # 保存用户的数据到数据库中
    user = User(name=mobile, mobile=mobile)
    # 对于password属性的设置,会调用属性方法
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        resp = {
                "error_code": RET.DATAEXIST,
                "errmsg": "手机号已经注册"
            }
        return jsonify(resp)

    # 记录用户的登录状态
    session["user_id"] = user.id
    session["username"] = mobile
    session["mobile"] = mobile

    # 返回响应
    resp = {
        "error_code": RET.OK,
        "errmsg": "注册成功"
    }
    return jsonify(resp)
예제 #38
0
def register():
    # 获取参数
    resp_json = request.get_json()
    mobile = resp_json.get('mobile')
    sms_code = resp_json.get('sms_code')
    password = resp_json.get('password')
    # 参数校验
    # 1 数据完整性
    if not all([mobile, sms_code, password]):
        return jsonify(errno=RET.PARAMERR, errmsg='数据不完整')
    # 2 手机号格式
    if not re.match(r"1[345678]\d{9}", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号格式不正确')

    # 业务处理
    # Redis中取出短信验证码
    try:
        real_sms_code = redis_store.get('sms_code_' + mobile)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='获取Redis数据错误')
    # 短信验证码是否失效
    if not real_sms_code:
        return jsonify(errno=RET.DATAERR, errmsg='短信验证码过期或不存在')
    # 对比短信验证码是否一致
    if real_sms_code != sms_code:
        return jsonify(errno=RET.PARAMERR, errmsg='短信验证码输入错误,请重新输入')
    # 删除短信Redis--》可以修改后重新输入
    try:
        redis_store.delete('sms_code_' + mobile)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='删除Redis数据错误')
    # 查询用户是否存在
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='用户表查询失败')
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg='该用户已注册,请去登录')
    # 将用户信息保存到数据库中
    user = User(name=mobile, mobile=mobile)
    # 密码需要加密
    user.password = password
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        logging.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='添加用户失败')
    # 保存用户登录状态并跳转到登录页
    try:
        session['id'] = user.id
        session['name'] = user.mobile
        session['mobile'] = user.mobile
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='session存储错误')

    # 返回数据
    return jsonify(errno=RET.OK, errmsg='用户注册成功')
예제 #39
0
def send_sms_code(mobile):
    """
    1/获取参数,mobile,text,id,request.args.get('text')
    2/校验参数的完整性
    3/校验手机号,正则表达式校验手机号格式
    4/校验图片验证码,操作redis数据库,获取本地存储的真实图片验证码
    5/校验获取结果,判断真实的图片验证码是否存在
    6/删除redis中的图片验证码
    7/比较图片验证码是否一致
    8/生成短信验证码,'%06d' % random.randint(1,999999)生成随机数
    9/在本地存储短信验证码,存redis中
    10/判断手机号是否已注册
    11调用云通讯接口,发送短信,send_template_sms(mobile,sms_coce,time,tempID)
    12/保存发送结果,判断发送是否成功
    13/返回结果
    :param mobile:
    :return:
    """
    # 获取参数
    image_code = request.args.get('text')
    image_code_id = request.args.get('id')
    # 校验参数的完整性
    if not all([mobile, image_code_id, image_code]):
        return jsonify(errno=RET.PARAMERR, errmsg='参数不完整')
    # 校验手机号码的格式
    if not re.match(r'1[3456789]\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg='手机号码格式不正确')
    # 校验图片验证码,从redis中获取
    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.PARAMERR, errmsg='图片验证码错误')

    # 开始准备发送短信验证码
    sms_code = '%06d'% random.randint(1, 999999)
    # 把验证码保存到redis中
    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.DATAEXIS,errmsg='用户已经存在')

    # 调用云通讯接口发送短信
    try:
        cpp = sms.CCP()
        # 发送短信的模板方法会有返回值,0 表示发送成功
        result = cpp.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 0 == result:
        return jsonify(errno=RET.OK, errmsg='发送成功')
    else:
        return jsonify(errno=RET.THIRDERR, errmsg='发送失败')