Ver código fonte

直播校验UID是否属于当前用户,删除设备清除用户UID缓存

zhangdongming 7 meses atrás
pai
commit
60375e2d0d

+ 26 - 1
AdminController/DeviceManagementController.py

@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 import json
 import operator
+import threading
 import time
 
 import oss2
@@ -261,6 +262,10 @@ class DeviceManagement(View):
                 UidPushModel.objects.filter(uid_set__uid=uid).delete()
                 # 删除推送消息
                 EquipmentInfoService.delete_all_equipment_info(device_user_id=userID, device_uid=uid)
+                redis = RedisObject(3)
+                # 构建Redis键
+                device_key = f"{RedisKeyConstant.BASIC_USER.value}{user_id}:UID:{uid}"
+                redis.del_data(device_key)
                 content = json.loads(json.dumps(request_dict))
                 ip = CommonService.get_ip_address(request)
                 log = {
@@ -511,7 +516,8 @@ class DeviceManagement(View):
                     ExperienceContextModel.objects.filter(uid__in=uidList).delete()
                     # Order_Model.objects.filter(UID__in=uidList, order_type=0).delete()
                     Device_Info.objects.filter(UID__in=uidList).update(vodPrimaryUserID='', vodPrimaryMaster='')
-
+                # 删除用户UID缓存
+                threading.Thread(target=DeviceManagement.deleteDeviceCache, args=uidList)
                 # 上传序列号文件且选中序列号解绑uid
                 # if serialNumberList is not None and '序列号解绑uid' in delDataOptions:
                 #     # 解绑uid数据
@@ -550,6 +556,25 @@ class DeviceManagement(View):
             LogModel.objects.create(**log)
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
+    @staticmethod
+    def deleteDeviceCache(uid_list):
+        """
+        翻新重置时清楚验证用户UID缓存
+        @param uid_list:
+        @return:
+        """
+        try:
+            redis = RedisObject(3)
+            for uid in uid_list:
+                user_id_list = list(Device_Info.objects.filter(UID=uid).values_list('userID_id', flat=True))
+                for user in user_id_list:
+                    # 构建Redis键
+                    device_key = f"{RedisKeyConstant.BASIC_USER.value}{user}:UID:{uid}"
+                    redis.del_data(device_key)
+        except Exception as e:
+            error_line = e.__traceback__.tb_lineno
+            LOGGER.error(f'翻新重置异步清缓存异常:error_line:{error_line}, error_msg:{repr(e)}')
+
     def get_app_device_type_list(self, request_dict, response):
         app_bundle_name = request_dict.get('appBundleName', None)
         lang = request_dict.get('lang', None)

+ 59 - 1
Controller/UserDevice/DeviceVersionInfoController.py

@@ -12,7 +12,7 @@ from django.http import QueryDict
 from django.views import View
 from Ansjer.config import LOGGER
 
-from Model.models import DeviceVersionInfo
+from Model.models import DeviceVersionInfo, Device_Info
 from Object.Enums.RedisKeyConstant import RedisKeyConstant
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
@@ -54,6 +54,8 @@ class DeviceVersionInfoView(View):
         userID = tko.userID
         if operation == 'getInfo':
             return self.get_device_version_info(userID, request, request_dict, response)
+        elif operation == 'validateUserDevice':
+            return self.validateUserDevice(userID, request, request_dict, response)
         else:
             return response.json(414)
 
@@ -105,3 +107,59 @@ class DeviceVersionInfoView(View):
 
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def validateUserDevice(cls, user_id, request, request_dict, response):
+        """
+        验证用户设备
+        @param user_id: 用户id
+        @param request: 请求
+        @param request_dict: 请求参数
+        @param response: 响应参数
+        @return: 成功 0 失败 173
+        """
+        uid = request_dict.get('uid')
+        serial_number = request_dict.get('serialNumber')
+        app_bundle_id = request_dict.get('appBundleId')
+        m_code = request_dict.get('mCode')
+
+        if not uid:
+            return response.json(444)  # 错误代码:没有提供uid
+
+        try:
+            LOGGER.info(f'直播验证用户uid:{uid},user:{user_id},m_code:{m_code}')
+
+            redis = RedisObject(3)
+            # 构建Redis键
+            device_key = f"{RedisKeyConstant.BASIC_USER.value}{user_id}:UID:{uid}"
+
+            # 尝试从Redis中获取数据
+            device_info = redis.get_data(device_key)
+
+            # 检查缓存命中和UID匹配
+            if device_info == uid:
+                return response.json(0, uid)  # 缓存命中返回 0
+
+            ip = CommonService.get_ip_address(request)
+            LOGGER.info(f'直播验证用户uid:{uid},ip:{ip},serial:{serial_number},app{app_bundle_id}')
+
+            # 从数据库查询设备版本信息
+            try:
+                device_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid).values('UID')
+                if not device_qs.exists() or uid != device_qs.first().get('UID'):
+                    LOGGER.error(f'验证用户uid错误,未找到设备信息 uid:{uid}')
+                    return response.json(173)  # 错误代码:未找到设备信息
+
+                # 将数据写入Redis,以便后续使用,设置TTL为48小时
+                redis.set_data(device_key, uid, 60 * 60 * 24 * 2)
+
+                return response.json(0, uid)  # 返回设备信息
+
+            except Exception as db_exception:
+                LOGGER.error(f'数据库查询失败 user:{user_id}, uid:{uid}, error: {repr(db_exception)}')
+                return response.json(500, '数据库查询错误')
+
+        except Exception as e:
+            error_line = e.__traceback__.tb_lineno
+            LOGGER.error(f'验证用户uid异常 user:{user_id}, uid:{uid}, error_line:{error_line}, error_msg:{repr(e)}')
+            return response.json(500, f'error_line:{error_line}, error_msg:{repr(e)}')

+ 2 - 0
Object/Enums/RedisKeyConstant.py

@@ -25,6 +25,8 @@ class RedisKeyConstant(Enum):
     PACKAGE_IS_COUPON_FALSE = 'PACKAGE:IS:COUPON:FALSE:LIST'
     # 每日查询云存套餐界面访问数量
     TODAY_CLOUD_QUERY_NUMBER = 'TODAY:CLOUD:QUERY:NUMBER'
+    # 基础模块用户ID
+    BASIC_USER = 'BASIC:USER:'
 
     # Redis 过期时间常量 (秒)
     EXPIRE_TIME_60_SECONDS = 60    # 60秒

+ 24 - 4
Service/ModelService.py

@@ -7,6 +7,9 @@ from django.db.models import Q
 from Ansjer.config import BASE_DIR
 from Model.models import *
 from Service.EquipmentInfoService import EquipmentInfoService
+from Ansjer.config import LOGGER
+from Object.Enums.RedisKeyConstant import RedisKeyConstant
+from Object.RedisObject import RedisObject
 
 
 # 针对模型封装的复用性代码
@@ -148,8 +151,16 @@ class ModelService:
 
     @staticmethod
     def del_eq_info(userID, uid):
-        notify_alexa_delete(userID, uid)
-        EquipmentInfoService.delete_all_equipment_info(device_user_id=userID, device_uid=uid)
+        try:
+            notify_alexa_delete(userID, uid)
+            EquipmentInfoService.delete_all_equipment_info(device_user_id=userID, device_uid=uid)
+            redis = RedisObject(3)
+            # 构建Redis键
+            device_key = f"{RedisKeyConstant.BASIC_USER.value}{userID}:UID:{uid}"
+            redis.del_data(device_key)
+        except Exception as e:
+            error_line = e.__traceback__.tb_lineno
+            LOGGER.error(f'异步删除异常user:{userID}, uid:{uid}, error_line:{error_line}, error_msg:{repr(e)}')
 
     @staticmethod
     def del_user_list_eq_info(user_id_list, user_id, uid):
@@ -160,8 +171,17 @@ class ModelService:
         @param uid:
         @return:
         """
-        notify_alexa_delete(user_id, uid)
-        EquipmentInfoService.delete_all_equipment_info(device_user_id__in=user_id_list, device_uid=uid)
+        try:
+            notify_alexa_delete(user_id, uid)
+            EquipmentInfoService.delete_all_equipment_info(device_user_id__in=user_id_list, device_uid=uid)
+            redis = RedisObject(3)
+            for user in user_id_list:
+                # 构建Redis键
+                device_key = f"{RedisKeyConstant.BASIC_USER.value}{user}:UID:{uid}"
+                redis.del_data(device_key)
+        except Exception as e:
+            error_line = e.__traceback__.tb_lineno
+            LOGGER.error(f'异步删除异常user:{user_id}, uid:{uid}, error_line:{error_line}, error_msg:{repr(e)}')
 
     # 获取绑定用户设备列表
     @staticmethod