user.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. from flask import Blueprint, request, g
  2. from apps.account.models import User
  3. from libs.tools import json_response, JsonParser, Argument, human_diff_time
  4. from libs.decorators import require_permission
  5. from collections import defaultdict
  6. from datetime import datetime
  7. import uuid
  8. import time
  9. blueprint = Blueprint('account_page', __name__)
  10. login_limit = defaultdict(int)
  11. @blueprint.route('/', methods=['GET'])
  12. @require_permission('account_user_view')
  13. def get():
  14. form, error = JsonParser(
  15. Argument('page', type=int, default=1, required=False),
  16. Argument('pagesize', type=int, default=10, required=False),
  17. Argument('name', type=str, required=False),).parse(request.args)
  18. if error is None:
  19. user = User.query.filter_by(is_supper=False)
  20. if form.name:
  21. user = user.filter(User.nickname.like('%{}%'.format(form.name)))
  22. total = user.count()
  23. users = []
  24. now_time = datetime.now()
  25. for item in user.limit(form.pagesize).offset((form.page - 1) * form.pagesize).all():
  26. item = item.to_json()
  27. if item['token_expired']:
  28. item['last_login'] = human_diff_time(now_time, datetime.fromtimestamp(item['token_expired'] - 8 * 60 * 60)) + '前'
  29. else:
  30. item['last_login'] = '从未登录'
  31. users.append(item)
  32. return json_response({'data': users, 'total': total})
  33. return json_response(message=error)
  34. @blueprint.route('/', methods=['POST'])
  35. @require_permission('account_user_add')
  36. def post():
  37. form, error = JsonParser('nickname', 'username', 'password',
  38. Argument('role_id', type=int, help='请选择角色'),
  39. Argument('email', nullable=True),
  40. Argument('mobile', nullable=True)).parse()
  41. if error is None:
  42. username_is_exist = User.query.filter_by(username=form.username).first()
  43. if username_is_exist:
  44. return json_response(message="用户名已存在")
  45. User(**form).save()
  46. return json_response()
  47. return json_response(message=error)
  48. @blueprint.route('/<int:u_id>', methods=['DELETE'])
  49. @require_permission('account_user_del')
  50. def delete(u_id):
  51. User.query.get_or_404(u_id).delete()
  52. return json_response(), 204
  53. @blueprint.route('/<int:u_id>', methods=['PUT'])
  54. @require_permission('account_user_edit | account_user_disable')
  55. def put(u_id):
  56. form, error = JsonParser('nickname', 'is_active',
  57. Argument('role_id', type=int, required=False, help='请选择角色'),
  58. Argument('email', nullable=True),
  59. Argument('password', nullable=False, required=False),
  60. Argument('mobile', nullable=True)).parse()
  61. if error is None:
  62. u_info = User.query.get_or_404(u_id)
  63. if form.password:
  64. u_info.password = form.password
  65. if not u_info.update(**form) and form.password:
  66. u_info.save()
  67. return json_response(u_info)
  68. return json_response(message=error)
  69. @blueprint.route('/setting/password', methods=['POST'])
  70. def setting_password():
  71. form, error = JsonParser(
  72. Argument('password', help='请输入原密码'),
  73. Argument('newpassword', help='请输入心密码')
  74. ).parse()
  75. if error is None:
  76. if g.user.verify_password(form.password):
  77. g.user.password = form.newpassword
  78. g.user.save()
  79. else:
  80. return json_response(message='原密码错误')
  81. return json_response(message=error)
  82. @blueprint.route('/setting/info', methods=['POST'])
  83. def setting_info():
  84. form, error = JsonParser(
  85. Argument('nickname', help='请输入昵称'),
  86. Argument('mobile', help='请输入手机号码'),
  87. Argument('email', help='请输入电子邮件地址'),
  88. ).parse()
  89. if error is None:
  90. g.user.update(**form)
  91. return json_response(message=error)
  92. @blueprint.route('/self', methods=['GET'])
  93. def get_self():
  94. return json_response({
  95. 'username': g.user.username,
  96. 'nickname': g.user.nickname,
  97. 'mobile': g.user.mobile,
  98. 'email': g.user.email,
  99. })
  100. @blueprint.route('/login/', methods=['POST'])
  101. def login():
  102. form, error = JsonParser('username', 'password').parse()
  103. if error is None:
  104. user = User.query.filter_by(username=form.username).first()
  105. if user:
  106. if user.is_active:
  107. if user.verify_password(form.password):
  108. token = uuid.uuid4().hex
  109. user.access_token = token
  110. user.token_expired = time.time() + 8 * 60 * 60
  111. user.save()
  112. return json_response({
  113. 'token': token,
  114. 'is_supper': user.is_supper,
  115. 'nickname': user.nickname,
  116. 'permissions': list(user.permissions)
  117. })
  118. else:
  119. login_limit[form.username] += 1
  120. if login_limit[form.username] >= 3:
  121. user.update(is_active=False)
  122. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  123. else:
  124. return json_response(message='用户已被禁用,请联系管理员')
  125. elif login_limit[form.username] >= 3:
  126. return json_response(message='用户已被禁用,请联系管理员')
  127. else:
  128. login_limit[form.username] += 1
  129. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  130. else:
  131. return json_response(message='请输入用户名和密码')
  132. @blueprint.route('/logout/')
  133. def logout():
  134. if g.user:
  135. g.user.access_token = ''
  136. g.user.save()
  137. return json_response('success')