AdDepartmentController.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from collections import defaultdict
  2. from django.http import JsonResponse
  3. from django.views import View
  4. from Model.models import Device_User, Device_Info
  5. from Object.HMACValidatorObject import HMACValidatorObject
  6. class AdDepartmentView(View):
  7. def get(self, request, *args, **kwargs):
  8. request.encoding = 'utf-8'
  9. operation = kwargs.get('operation')
  10. request_dict = request.GET
  11. return self.validation(request, request_dict, operation)
  12. def post(self, request, *args, **kwargs):
  13. request.encoding = 'utf-8'
  14. operation = kwargs.get('operation')
  15. request_dict = request.POST
  16. return self.validation(request, request_dict, operation)
  17. def validation(self, request, request_dict, operation):
  18. if operation == 'getUserList':
  19. return self.get_user_list(request_dict)
  20. else:
  21. return JsonResponse({'code': 400, 'msg': 'operation not found'})
  22. @staticmethod
  23. def get_user_list(request_dict):
  24. # 手机号或者邮箱查询
  25. phone = request_dict.get('phone', '')
  26. email = request_dict.get('email', '')
  27. provided_signature = request_dict.get('signature', '')
  28. pageNo = int(request_dict.get('pageNo', 1)) # 默认第一页
  29. pageSize = int(request_dict.get('pageSize', 10)) # 默认每页10条
  30. timestamp = request_dict.get('timestamp', None)
  31. # 判断时间戳是否存在
  32. if not all([provided_signature, timestamp]):
  33. return JsonResponse(status=400, data={"error": "缺少关键参数"})
  34. # 生成用于签名的数据
  35. data = f"phone={phone}&email={email}&timestamp={timestamp}"
  36. # 创建HMAC验证器对象
  37. validator = HMACValidatorObject()
  38. # 验证签名是否正确
  39. is_signature_valid = validator.verify(data, provided_signature)
  40. # 验证时间戳是否在有效范围内,防止重放攻击
  41. is_timestamp_valid = validator.validate_timestamp(timestamp)
  42. # 如果签名和时间戳均有效
  43. if is_signature_valid and is_timestamp_valid:
  44. # 获取所有用户查询集
  45. device_user_qs = Device_User.objects.all()
  46. # 条件查询:手机号
  47. if phone:
  48. device_user_qs = device_user_qs.filter(phone__icontains=phone)
  49. # 条件查询:邮箱
  50. if email:
  51. device_user_qs = device_user_qs.filter(userEmail__icontains=email)
  52. total = device_user_qs.count()
  53. if int(pageSize) > 200:
  54. pageSize = 200
  55. # 分页处理
  56. start_index = (pageNo - 1) * pageSize
  57. end_index = start_index + pageSize
  58. paginated_users = device_user_qs[start_index:end_index]
  59. # 使用 prefetch_related 预加载设备信息,避免 N+1 查询
  60. paginated_users = paginated_users.prefetch_related('device_info_set')
  61. # 构造返回的用户信息列表
  62. user_info_list = []
  63. for user in paginated_users:
  64. device_list = []
  65. for device in user.device_info_set.all():
  66. device_list.append({
  67. "uid": device.UID,
  68. "serialNumber": device.serial_number,
  69. "addTime": device.data_joined,
  70. "isShared": device.isShare,
  71. "isPrimaryUser": user.userID == device.vodPrimaryUserID or user.userID == device.primaryUserID,
  72. })
  73. user_info_list.append({
  74. "username": user.username,
  75. "email": user.userEmail,
  76. "phone": user.phone,
  77. "registrationTime": user.data_joined,
  78. "devices": device_list
  79. })
  80. # 构造最终的返回数据
  81. user_info = {
  82. "total": total, # 总数
  83. "pageNo": pageNo,
  84. "pageSize": pageSize,
  85. "users": user_info_list
  86. }
  87. return JsonResponse(status=200, data=user_info)
  88. # 如果签名或时间戳验证失败
  89. return JsonResponse(status=400, data={"error": "认证失败"})