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')
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})
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='发送失败')
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())
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())