|
@@ -0,0 +1,115 @@
|
|
|
+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 = [
|
|
|
+ {
|
|
|
+ "uid": device.UID,
|
|
|
+ "serialNumber": device.serial_number,
|
|
|
+ "addTime": device.data_joined,
|
|
|
+ "isShared": device.isShare,
|
|
|
+ "isPrimaryUser": user.userID == device.primaryUserID,
|
|
|
+ }
|
|
|
+ for device in user.device_info_set.all() # 使用预加载的设备信息
|
|
|
+ ]
|
|
|
+
|
|
|
+ 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": "认证失败"})
|
|
|
+
|