123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- from collections import defaultdict
- from django.http import JsonResponse
- from django.views import View
- from Model.models import Device_User, Device_Info
- from Object.HMACValidatorObject import HMACValidatorObject
- class AdDepartmentView(View):
- def get(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- request_dict = request.GET
- return self.validation(request, request_dict, operation)
- def post(self, request, *args, **kwargs):
- request.encoding = 'utf-8'
- operation = kwargs.get('operation')
- request_dict = request.POST
- return self.validation(request, request_dict, operation)
- def validation(self, request, request_dict, operation):
- if operation == 'getUserList':
- return self.get_user_list(request_dict)
- else:
- return JsonResponse({'code': 400, 'msg': 'operation not found'})
- @staticmethod
- def get_user_list(request_dict):
- # 手机号或者邮箱查询
- phone = request_dict.get('phone', '')
- email = request_dict.get('email', '')
- provided_signature = request_dict.get('signature', '')
- pageNo = int(request_dict.get('pageNo', 1)) # 默认第一页
- pageSize = int(request_dict.get('pageSize', 10)) # 默认每页10条
- timestamp = request_dict.get('timestamp', None)
- # 判断时间戳是否存在
- if not all([provided_signature, timestamp]):
- return JsonResponse(status=400, data={"error": "缺少关键参数"})
- # 生成用于签名的数据
- data = f"phone={phone}&email={email}×tamp={timestamp}"
- # 创建HMAC验证器对象
- validator = HMACValidatorObject()
- # 验证签名是否正确
- is_signature_valid = validator.verify(data, provided_signature)
- # 验证时间戳是否在有效范围内,防止重放攻击
- is_timestamp_valid = validator.validate_timestamp(timestamp)
- # 如果签名和时间戳均有效
- if is_signature_valid and is_timestamp_valid:
- # 获取所有用户查询集
- device_user_qs = Device_User.objects.all()
- # 条件查询:手机号
- if phone:
- device_user_qs = device_user_qs.filter(phone__icontains=phone)
- # 条件查询:邮箱
- if email:
- device_user_qs = device_user_qs.filter(userEmail__icontains=email)
- total = device_user_qs.count()
- if int(pageSize) > 200:
- pageSize = 200
- # 分页处理
- start_index = (pageNo - 1) * pageSize
- end_index = start_index + pageSize
- paginated_users = device_user_qs[start_index:end_index]
- # 使用 prefetch_related 预加载设备信息,避免 N+1 查询
- paginated_users = paginated_users.prefetch_related('device_info_set')
- # 构造返回的用户信息列表
- user_info_list = []
- for user in paginated_users:
- device_list = []
- for device in user.device_info_set.all():
- device_list.append({
- "uid": device.UID,
- "serialNumber": device.serial_number,
- "addTime": device.data_joined,
- "isShared": device.isShare,
- "isPrimaryUser": user.userID == device.vodPrimaryUserID or user.userID == device.primaryUserID,
- })
- user_info_list.append({
- "username": user.username,
- "email": user.userEmail,
- "phone": user.phone,
- "registrationTime": user.data_joined,
- "devices": device_list
- })
- # 构造最终的返回数据
- user_info = {
- "total": total, # 总数
- "pageNo": pageNo,
- "pageSize": pageSize,
- "users": user_info_list
- }
- return JsonResponse(status=200, data=user_info)
- # 如果签名或时间戳验证失败
- return JsonResponse(status=400, data={"error": "认证失败"})
|