views.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import random
  2. import re
  3. from datetime import datetime
  4. from flask import request, session
  5. from app.lib.yuntongxun.cpp import CCP
  6. from app.models import User
  7. from app.utils.response_code import RET
  8. from . import passport_bp
  9. from app.utils.captcha.captcha import captcha
  10. from app import redis_store, constants, db
  11. from flask import current_app, make_response, jsonify
  12. @passport_bp.route('/image_code')
  13. def get_image_code():
  14. """
  15. 获取图片验证码
  16. :return:
  17. """
  18. # 1.获取当前的图片编号id
  19. code_id = request.args.get('code_id')
  20. # 2.生成验证码
  21. name, text, image, = captcha.generate_captcha()
  22. try:
  23. # 保存当前生成的图片验证码内容
  24. redis_store.setex('ImageCode_' + code_id, constants.IMAGE_CODE_REDIS_EXPIRES, text)
  25. except Exception as e:
  26. current_app.logger.error(e)
  27. return make_response(jsonify(errno=RET.DATAERR, errmsg='保存图片验证码失败'))
  28. # 返回相应内容
  29. resp = make_response(image)
  30. # 设置内容类型
  31. resp.headers['Content-Type'] = 'image/jpg'
  32. return resp
  33. @passport_bp.route('/smscode', methods=['POST'])
  34. def send_sms():
  35. """
  36. 1. 接收参数并判断是否有值
  37. 2. 校验手机号是正确
  38. 3. 通过传入的图片编码去redis中查询真实的图片验证码内容
  39. 4. 进行验证码内容的比对
  40. 5. 生成发送短信的内容并发送短信
  41. 6. redis中保存短信验证码内容
  42. 7. 返回发送成功的响应
  43. :return:
  44. """
  45. # 1.获取参数,并判断参数是否有值
  46. param_dict = request.json
  47. mobile = param_dict.get("mobile")
  48. image_code = param_dict.get('image_code')
  49. image_code_id = param_dict.get("image_code_id")
  50. # 判断参数是否齐全
  51. if not all([mobile, image_code, image_code_id]):
  52. return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
  53. # 2.校验手机号是否正确
  54. print(mobile)
  55. # 2. 校验手机号是正确
  56. if not re.match("^1[3578][0-9]{9}$", mobile):
  57. # 提示手机号不正确
  58. return jsonify(errno=RET.DATAERR, errmsg="手机号不正确")
  59. # 3.通过传入的图片编码去redis中查询真实的图片验证码内容
  60. try:
  61. real_image_code = redis_store.get("ImageCode_" + image_code_id)
  62. except Exception as e:
  63. current_app.looger.error(e)
  64. # 获取图片验证码失败
  65. return jsonify(errno=RET.DBERR, errmsg="获取图片验证码失败")
  66. # 3.1判断验证码是否存在,已过期
  67. if not real_image_code:
  68. # 验证码已过期
  69. return jsonify(errno=RET.NODATA, errmsg="验证码已过期")
  70. # 4.进行验证码内容的比对
  71. if image_code.lower() != real_image_code.lower():
  72. # 验证码输入错误
  73. return jsonify(errno=RET.DATAERR, errmsg="验证码输入错误")
  74. # 4.1校验该手机是否已经注册
  75. try:
  76. user = User.query.filter(User.mobile == mobile).first()
  77. except Exception as e:
  78. current_app.logger.error(e)
  79. return jsonify(errno=RET.DBERR, errmsg="数据库查询失败")
  80. if user:
  81. # 该手机已被注册
  82. return jsonify(errno=RET.DATAEXIST, errmsg="该手机已被注册")
  83. # 5. 生成发送短信的内容并发送短信
  84. result = random.randint(0, 999999)
  85. sms_code = "%06d" % result
  86. current_app.logger.debug("短信验证码的内容:%s" % sms_code)
  87. ccp = CCP()
  88. result = ccp.send_template_sms(mobile,
  89. {sms_code, "5"}, "1")
  90. if result != 0:
  91. # 发送短信失败
  92. return jsonify(errno=RET.THIRDERR, errmsg="发送短信失败")
  93. # 6.redis中保存短信验证码内容
  94. try:
  95. redis_store.set("SMS_" + mobile, sms_code, constants.SMS_CODE_REDIS_EXPIRES)
  96. except Exception as e:
  97. current_app.logger.error(e)
  98. return jsonify(errno=RET.DBERR, errmsg="保存短信验证码失败")
  99. # 7.返回发送成功的响应
  100. return jsonify(errno=RET.OK, errmsg="发送成功")
  101. @passport_bp.route('/register', methods=['POST'])
  102. def register():
  103. """
  104. 1.获取参数和判断是否有值
  105. 2.从redis中获取指定手机号对应的短信验证码的
  106. 3.校验验证码
  107. 4.初始化user模型, 并设置数据并添加到数据库
  108. 5.保存当前用户的状态
  109. 6.返回注册的结果
  110. :return:
  111. """
  112. # 1.获取参数和判断是否有值
  113. param_data = request.json
  114. mobile = param_data.get("mobile")
  115. sms_code = param_data.get("smscode")
  116. password = param_data.get("password")
  117. if not all([mobile, sms_code, password]):
  118. # 参数不全
  119. return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
  120. # 2.从redis中获取指定手机号对应的短信验证码的
  121. try:
  122. real_sms_code = redis_store.get("SMS_" + mobile)
  123. except Exception as e:
  124. current_app.logger.error(e)
  125. return jsonify(errno=RET.DBERR, errmsg="获取本地校验码失败")
  126. if not real_sms_code:
  127. # 短信验证码过期
  128. return jsonify(errno=RET.NODATA, errmsg="短信验证码过期")
  129. # 3.校验验证码
  130. if sms_code != real_sms_code:
  131. return jsonify(errno=RET.DATAERR, errmsg="短信验证码错误")
  132. # 删除短信验证码
  133. try:
  134. redis_store.delete("SMS_" + mobile)
  135. except Exception as e:
  136. current_app.logger.error(e)
  137. # 4.初始化user原型,并设置数据并添加到数据库
  138. user = User()
  139. user.nick_name = mobile
  140. user.mobile = mobile
  141. # 对密码进行处理
  142. user.password = password
  143. try:
  144. db.session.add(user)
  145. db.session.commit()
  146. except Exception as e:
  147. db.session.rollback()
  148. current_app.logger.error(e)
  149. # 数据保存错误
  150. return jsonify(errno=RET.DATAERR, errmsg="数据保存错误")
  151. # 5.保存用户登录状态
  152. session["user_id"] = user.id
  153. session["nick_name"] = user.nick_name
  154. session["mobile"] = user.mobile
  155. if user.is_admin:
  156. session["is_admin"] = True
  157. # 6.返回注册结果
  158. return jsonify(errno=RET.OK, errmsg="OK")
  159. @passport_bp.route('/login', methods=['POST'])
  160. def login():
  161. """
  162. 1.获取参数和判断是否有值
  163. 2.从数据库查询出指定的用户
  164. 3.校验密码
  165. 4.保存用户登录状态
  166. 5.返回结果
  167. :return:
  168. """
  169. # 1.获取参数和判断是否有值
  170. param_data = request.json
  171. mobile = param_data.get('mobile')
  172. password = param_data.get("password")
  173. if not all([mobile, password]):
  174. # 参数不全
  175. return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
  176. # 2.从数据库查询出指定的用户
  177. try:
  178. user = User.query.filter(User.mobile == mobile).first()
  179. except Exception as e:
  180. current_app.logger.error(e)
  181. return jsonify(errno=RET.DBERR, errmsg="查询数据错误")
  182. if not user:
  183. return jsonify(errno=RET.USERERR, errmsg="用户不存在")
  184. # 3.校验密码
  185. if not user.check_passowrd(password):
  186. return jsonify(errno=RET.PWDERR, errmsg="密码错误")
  187. # 4.保存用户登录状态
  188. session["user_id"] = user.id
  189. session["nick_name"] = user.nick_name
  190. session["mobile"] = user.mobile
  191. if user.is_admin:
  192. session["is_admin"] = True
  193. # 记录用户最后一次登录时间
  194. user.last_login = datetime.now()
  195. try:
  196. db.session.commit()
  197. except Exception as e:
  198. current_app.logger.error(e)
  199. # 5.登录成功
  200. return jsonify(errno=RET.OK, errmsg="OK")
  201. @passport_bp.route('/logout', methods=["POST"])
  202. def logout():
  203. """
  204. 清除session中的对应登录之后保存的信息
  205. :return:
  206. """
  207. session.pop('user_id', None)
  208. session.pop('nick_name', None)
  209. session.pop('mobile', None)
  210. session.pop('is_admin', None)
  211. # 返回结果
  212. return jsonify(errno=RET.OK, errmsg="OK")