| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 | from collections import defaultdictfrom django.http import JsonResponsefrom django.views import Viewfrom Model.models import Device_User, Device_Infofrom Object.HMACValidatorObject import HMACValidatorObjectclass 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": "认证失败"})
 |