Преглед изворни кода

新增直播校验用户UID

zhangdongming пре 7 месеци
родитељ
комит
0a9bd49c43

+ 25 - 0
AdminController/DeviceManagementController.py

@@ -2,6 +2,7 @@
 # -*- coding: utf-8 -*-
 import json
 import operator
+import threading
 import time
 
 import oss2
@@ -256,11 +257,15 @@ class DeviceManagement(View):
             return response.json(444)
 
         try:
+            redis = RedisObject(3)
             with transaction.atomic():
                 Device_Info.objects.filter(id=deviceID).delete()
                 UidPushModel.objects.filter(uid_set__uid=uid).delete()
                 # 删除推送消息
                 EquipmentInfoService.delete_all_equipment_info(device_user_id=userID, device_uid=uid)
+                # 构建Redis键
+                device_key = f"{RedisKeyConstant.BASIC_USER.value}{userID}:UID:{uid}"
+                redis.del_data(device_key)
                 content = json.loads(json.dumps(request_dict))
                 ip = CommonService.get_ip_address(request)
                 log = {
@@ -488,6 +493,11 @@ class DeviceManagement(View):
 
                 # 根据删除项删除相关数据
                 if '设备信息数据' in delDataOptions:
+                    # 删除用户UID缓存
+                    user_list = list(Device_Info.objects.filter(UID__in=uidList).values('userID_id', 'UID'))
+                    thread = threading.Thread(target=DeviceManagement.deleteDeviceCache, args=(user_list,))
+                    thread.start()
+
                     Device_Info.objects.filter(UID__in=uidList).delete()
                     UidPushModel.objects.filter(uid_set__uid__in=uidList).delete()
                 if '设备配置数据' in delDataOptions:
@@ -550,6 +560,21 @@ 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缓存
+        """
+        try:
+            redis = RedisObject(3)
+            for item in uid_list:
+                # 构建Redis键
+                device_key = f"{RedisKeyConstant.BASIC_USER.value}{item['userID_id']}:UID:{item['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)}')

+ 7 - 0
Object/Enums/RedisKeyConstant.py

@@ -20,6 +20,13 @@ class RedisKeyConstant(Enum):
     GRANT_COUPONS_LOCK = 'grant_coupons_lock_'
     # 基础模块用户优惠券
     BASIC_CLOUD_COUPON = 'BASIC:CLOUD:COUPON:'
+    # 云存优惠套餐
+    PACKAGE_IS_COUPON_TRUE = 'PACKAGE:IS:COUPON:TRUE:LIST'
+    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