user.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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('/modifypwd', methods=['POST'])
  70. def modify_pwd():
  71. form, error = JsonParser('password', 'newpassword').parse()
  72. if error is None:
  73. if g.user.verify_password(form.password):
  74. g.user.password = form.newpassword
  75. g.user.save()
  76. return json_response()
  77. else:
  78. return json_response(message='原密码错误')
  79. return json_response(message=error)
  80. @blueprint.route('/<int:u_id>', methods=['GET'])
  81. def get_person(u_id):
  82. if u_id:
  83. u_info = User.query.get_or_404(u_id)
  84. return json_response(u_info)
  85. return json_response(message='user_id不能为空')
  86. @blueprint.route('/login/', methods=['POST'])
  87. def login():
  88. form, error = JsonParser('username', 'password').parse()
  89. if error is None:
  90. user = User.query.filter_by(username=form.username).first()
  91. if user:
  92. if user.is_active:
  93. if user.verify_password(form.password):
  94. token = uuid.uuid4().hex
  95. user.access_token = token
  96. user.token_expired = time.time() + 8 * 60 * 60
  97. user.save()
  98. user_data = user.to_json()
  99. user_data.update({'token': token, 'permissions': list(user.permissions)})
  100. return json_response(user_data)
  101. else:
  102. login_limit[form.username] += 1
  103. if login_limit[form.username] >= 3:
  104. user.update(is_active=False)
  105. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  106. else:
  107. return json_response(message='用户已被禁用,请联系管理员')
  108. elif login_limit[form.username] >= 3:
  109. return json_response(message='用户已被禁用,请联系管理员')
  110. else:
  111. login_limit[form.username] += 1
  112. return json_response(message='用户名或密码错误,连续3次错误将会被禁用')
  113. else:
  114. return json_response(message='请输入用户名和密码')
  115. @blueprint.route('/logout/')
  116. def logout():
  117. if g.user:
  118. g.user.access_token = ''
  119. g.user.save()
  120. return json_response('success')