user.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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, 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('/login/', methods=['POST'])
  70. def login():
  71. form, error = JsonParser('username', 'password').parse()
  72. if error is None:
  73. user = User.query.filter_by(username=form.username).first()
  74. if user:
  75. if user.is_active:
  76. if user.verify_password(form.password):
  77. token = uuid.uuid4().hex
  78. user.access_token = token
  79. user.token_expired = time.time() + 8 * 60 * 60
  80. user.save()
  81. return json_response({'token': token, 'is_supper': user.is_supper, 'permissions': list(user.permissions)})
  82. else:
  83. login_limit[form.username] += 1
  84. if login_limit[form.username] >= 3:
  85. user.update(is_active=False)
  86. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  87. else:
  88. return json_response(message='用户已被禁用,请联系管理员')
  89. elif login_limit[form.username] >= 3:
  90. return json_response(message='用户已被禁用,请联系管理员')
  91. else:
  92. login_limit[form.username] += 1
  93. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  94. else:
  95. return json_response(message='请输入用户名和密码')
  96. @blueprint.route('/logout/')
  97. def logout():
  98. if g.user:
  99. g.user.access_token = ''
  100. g.user.save()
  101. return json_response('success')