Browse Source

Merge remote-tracking branch 'origin/test' into linhaohong

# Conflicts:
#	Controller/UserController.py
linhaohong 5 months ago
parent
commit
1a66c00669
4 changed files with 193 additions and 25 deletions
  1. 71 1
      Controller/EquipmentManagerV3.py
  2. 88 2
      Controller/SerialNumberController.py
  3. 23 22
      Controller/UserController.py
  4. 11 0
      Model/models.py

+ 71 - 1
Controller/EquipmentManagerV3.py

@@ -20,6 +20,7 @@ from Controller.UnicomCombo.WXTechController import WXTechControllerView
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
 from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidChannelSetModel, \
     Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UnicomDeviceInfo, CountryModel, \
     Device_User, iotdeviceInfoModel, UIDCompanySerialModel, UnicomDeviceInfo, CountryModel, \
     DeviceCloudPhotoInfo, UidPushModel, ExperienceContextModel, LogModel, UserAudioVideoPush, UIDModel
     DeviceCloudPhotoInfo, UidPushModel, ExperienceContextModel, LogModel, UserAudioVideoPush, UIDModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
@@ -82,6 +83,10 @@ class EquipmentManagerV3(View):
             return self.save_button_user(request_dict, response)
             return self.save_button_user(request_dict, response)
         elif operation == 'getButtonUser':
         elif operation == 'getButtonUser':
             return self.get_button_user(request_dict, response)
             return self.get_button_user(request_dict, response)
+        elif operation == 'verifyCode':
+            return self.verify_code(request_dict, response)
+        elif operation == 'viewDevicePassword':
+            return self.view_device_password(request_dict, response)
         else:
         else:
             return response.json(414)
             return response.json(414)
 
 
@@ -684,6 +689,7 @@ class EquipmentManagerV3(View):
             if not dev_info_qs.exists():
             if not dev_info_qs.exists():
                 return response.json(173)
                 return response.json(173)
 
 
+            view_password = ''
             if deviceData.__contains__('View_Password'):
             if deviceData.__contains__('View_Password'):
                 encrypt_pwd = deviceData['View_Password']
                 encrypt_pwd = deviceData['View_Password']
                 view_password = self.decode_pwd(deviceData['View_Password'])
                 view_password = self.decode_pwd(deviceData['View_Password'])
@@ -718,6 +724,8 @@ class EquipmentManagerV3(View):
                 if us_qs.exists():
                 if us_qs.exists():
                     if deviceData.__contains__('NickName'):
                     if deviceData.__contains__('NickName'):
                         us_qs.update(nickname=nickname)
                         us_qs.update(nickname=nickname)
+                    if view_password:
+                        us_qs.update(pwd=view_password)
                 else:
                 else:
                     ip = CommonService.get_ip_address(request)
                     ip = CommonService.get_ip_address(request)
                     ipInfo = CommonService.getIpIpInfo(ip, 'CN')
                     ipInfo = CommonService.getIpIpInfo(ip, 'CN')
@@ -733,7 +741,8 @@ class EquipmentManagerV3(View):
                         'channel': ChannelIndex,
                         'channel': ChannelIndex,
                         'nickname': nickname,
                         'nickname': nickname,
                         'device_type': qs[0].Type,
                         'device_type': qs[0].Type,
-                        'tb_country': country
+                        'tb_country': country,
+                        'pwd': view_password
                     }
                     }
                     UidSetModel.objects.create(**uid_set_create_dict)
                     UidSetModel.objects.create(**uid_set_create_dict)
                 di_qs = Device_Info.objects.filter(UID=uid)
                 di_qs = Device_Info.objects.filter(UID=uid)
@@ -1194,6 +1203,7 @@ class EquipmentManagerV3(View):
 
 
             view_password = self.decode_pwd(encrypt_pwd)
             view_password = self.decode_pwd(encrypt_pwd)
             Device_Info.objects.filter(UID=uid).update(View_Password=view_password)
             Device_Info.objects.filter(UID=uid).update(View_Password=view_password)
+            UidSetModel.objects.filter(uid=uid).update(pwd=view_password)
             content = json.loads(json.dumps(request_dict))
             content = json.loads(json.dumps(request_dict))
             log = {
             log = {
                 'user_id': 2,
                 'user_id': 2,
@@ -1313,3 +1323,63 @@ class EquipmentManagerV3(View):
         except Exception as e:
         except Exception as e:
             return response.json(500, repr(e))
             return response.json(500, repr(e))
 
 
+    @staticmethod
+    def verify_code(request_dict, response):
+        """
+        校验验证码(查看设备密码)
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        email = request_dict.get('email', None)
+        phone = request_dict.get('phone', None)
+        uid = request_dict.get('uid', None)
+        authcode = request_dict.get('authcode', None)
+        if not any([email, phone]):
+            return response.json(444)
+        if not all([uid, authcode]):
+            return response.json(444)
+        try:
+            authcode = CommonService.decode_data(authcode.strip())
+            if authcode is None:
+                return response.json(444, 'authcode')
+            user_info = email if email is not None else phone
+            redis = RedisObject()
+            redis_key = '{}_{}_GetDevicePassword'.format(user_info, uid)
+            reset_code = redis.get_data(key=redis_key)
+            if reset_code is False:
+                return response.json(90)
+            if authcode != reset_code:
+                return response.json(121)
+            if not redis.del_data(redis_key):
+                return response.json(10, '删除缓存失败')
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def view_device_password(request_dict, response):
+        """
+        查看设备密码
+        @param request_dict:
+        @param response:
+        @return:
+        """
+        uid = request_dict.get('uid', None)
+        if not all([uid]):
+            return response.json(444)
+        try:
+            uid_set_qs = UidSetModel.objects.filter(uid=uid).values('pwd')
+            if uid_set_qs.exists():
+                device_password = uid_set_qs[0]['pwd']
+            else:
+                device_info_qs = Device_Info.objects.filter(UID=uid).values('View_Password')
+                if not device_info_qs.exists():
+                    return response.json(173)
+                device_password = device_info_qs[0]['View_Password']
+            res = {
+                'device_password': device_password
+            }
+            return response.json(0, res)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 88 - 2
Controller/SerialNumberController.py

@@ -10,12 +10,15 @@ from django.views import View
 
 
 from Ansjer.config import CRCKey, CONFIG_INFO, CONFIG_US, CONFIG_EUR, \
 from Ansjer.config import CRCKey, CONFIG_INFO, CONFIG_US, CONFIG_EUR, \
     CONFIG_CN, USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, SERVER_DOMAIN_US, REGION_ID_LIST, SERVER_DOMAIN_TEST, \
     CONFIG_CN, USED_SERIAL_REDIS_LIST, UNUSED_SERIAL_REDIS_LIST, SERVER_DOMAIN_US, REGION_ID_LIST, SERVER_DOMAIN_TEST, \
-    SERVER_DOMAIN_LIST, SERVER_DOMAIN_CN, SERVER_DOMAIN_EUR, RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER, CONFIG_TEST
+    SERVER_DOMAIN_LIST, SERVER_DOMAIN_CN, SERVER_DOMAIN_EUR, RESET_REGION_ID_SERIAL_REDIS_LIST, LOGGER, CONFIG_TEST, \
+    SERVER_DOMAIN
+from Controller.CheckUserData import DataValid
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Controller.UnicomCombo.UnicomComboController import UnicomComboView
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
 from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, UIDModel, Device_Info, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     iotdeviceInfoModel, LogModel, UidSetModel, UID_Bucket, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
     Unused_Uid_Meal, Order_Model, StsCrdModel, VodHlsModel, ExperienceContextModel, UidUserModel, ExperienceAiModel, \
-    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID
+    AiService, DeviceDomainRegionModel, RegionModel, UidPushModel, AppScannedSerial, Device_User, SerialUnbindUID, \
+    DeviceNetInfo
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -72,6 +75,8 @@ class SerialNumberView(View):
             return self.get_global_uid_region(request_dict, response)
             return self.get_global_uid_region(request_dict, response)
         elif operation == 'getIoTCoreBySerialNumber':  # 根据序列号获取iot core
         elif operation == 'getIoTCoreBySerialNumber':  # 根据序列号获取iot core
             return self.get_iot_core_by_serial_number(request_dict, response)
             return self.get_iot_core_by_serial_number(request_dict, response)
+        elif operation == 'saveUserNetInfo':
+            return self.save_user_net_info(request_dict, response)
         else:
         else:
             return response.json(414)
             return response.json(414)
 
 
@@ -976,3 +981,84 @@ class SerialNumberView(View):
         except Exception as e:
         except Exception as e:
             LOGGER.info('{}同步iot异常,errLine:{}, errMsg:{}'.format(serial_number, e.__traceback__.tb_lineno, repr(e)))
             LOGGER.info('{}同步iot异常,errLine:{}, errMsg:{}'.format(serial_number, e.__traceback__.tb_lineno, repr(e)))
             return False
             return False
+
+    @staticmethod
+    def save_user_net_info(request_dict, response):
+        """
+        保存用户网络信息
+        @return:
+        """
+        serial = request_dict.get('serial', None)
+        username = request_dict.get('username', None)
+        wifi_name = request_dict.get('wifi_name', None)
+        wifi_password = request_dict.get('wifi_password', None)
+
+        if not all([serial, username, wifi_name, wifi_password]):
+            return response.json(444)
+
+        # 根据序列号获取p2p类型,设备类型信息
+        serial_number = serial[:9]
+        p2p_type = serial[9:10]
+        device_type = int(serial[10:14], 16)
+
+        # 请求绑定uid或查询uid
+        time_stamp = int(time.time())
+        token = CommonService.encode_data(time_stamp)
+        is_verify = '1'
+        data = {
+            'serial_number': serial_number,
+            'p2ptype': p2p_type,
+            'time_stamp': time_stamp,
+            'token': token,
+            'is_verify': is_verify
+        }
+        url = SERVER_DOMAIN + 'serialNumber/attachUID'
+        try:
+            r = requests.post(url=url, data=data, timeout=30)
+            assert r.status_code == 200
+            r = r.json()
+            assert r['result_code'] == 0
+            uid = CommonService.decode_data(r['result']['uid'])
+
+            # 查询用户是否存在,不存在则创建
+            device_user_qs = Device_User.objects.filter(username=username).values('userID')
+            if device_user_qs.exists():
+                user_id = device_user_qs[0]['userID']
+                # 已保存过,更新网络信息
+                device_info_qs = Device_Info.objects.filter(userID_id=user_id, UID=uid).values('id')
+                if device_info_qs.exists():
+                    device_id = device_info_qs[0]['id']
+                    device_net_info_qs = DeviceNetInfo.objects.filter(device_id=device_id)
+                    if device_net_info_qs.exists():
+                        device_net_info_qs.update(wifi_name=wifi_name, wifi_password=wifi_password)
+            else:
+                password = ''
+                user_id = CommonService.getUserID(μs=False, setOTAID=True)
+                user_data = {
+                    'userID': user_id,
+                    'username': username,
+                    'NickName': username,
+                    'password': password
+                }
+                # 判断用户名是手机号还是邮箱
+                if DataValid().mobile_validate(username):
+                    user_data['phone'] = username
+                elif DataValid().email_validate(username):
+                    user_data['userEmail'] = username
+                else:
+                    return response.json(444)
+                Device_User.objects.create(**user_data)
+
+            # 创建用户设备数据
+            device_id = CommonService.getUserID(getUser=False)
+            Device_Info.objects.create(
+                id=device_id, userID_id=user_id, serial_number=serial_number, UID=uid, NickName=serial[:6],
+                Type=device_type, View_Account='admin', View_Password='admin', vodPrimaryMaster=username,
+                vodPrimaryUserID=user_id
+            )
+            DeviceNetInfo.objects.create(
+                device_id=device_id, wifi_name=wifi_name, wifi_password=wifi_password
+            )
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 23 - 22
Controller/UserController.py

@@ -3395,40 +3395,40 @@ class SingleLoginView(TemplateView):
         uid = request_dict.get('uid', None)
         uid = request_dict.get('uid', None)
         if not any([email, phone]):
         if not any([email, phone]):
             return response.json(444)
             return response.json(444)
+
         try:
         try:
-            # 查询主用户信息
-            device_info_qs = Device_Info.objects.filter(UID=uid).values('vodPrimaryMaster')
-            if not device_info_qs.exists():
-                return response.json(173)
-            primary_master = device_info_qs[0]['vodPrimaryMaster']
-            # 邮箱验证码
-            if email is not None:
-                email = email.strip()
+            # 查看设备密码,传uid和检验主用户
+            if code_type == '2':
                 if uid is None:
                 if uid is None:
                     return response.json(444)
                     return response.json(444)
-                # 判断是否为主用户
-                if email != primary_master:
+                user_info = email if email is not None else phone
+                # 查询主用户信息
+                device_info_qs = Device_Info.objects.filter(UID=uid).values('vodPrimaryMaster')
+                if not device_info_qs.exists():
+                    return response.json(173)
+                if user_info != device_info_qs[0]['vodPrimaryMaster']:
                     return response.json(12)
                     return response.json(12)
-                return self.get_aliyun_email_code(email, code_type, response)
+            # 邮箱验证码
+            if email is not None:
+                email = email.strip()
+                return self.get_aliyun_email_code(email, code_type, uid, response)
             # 手机验证码
             # 手机验证码
             else:
             else:
                 phone = phone.strip()
                 phone = phone.strip()
-                # 判断是否为主用户
-                if phone != primary_master:
-                    return response.json(12)
                 country_code = str(country_code.strip())
                 country_code = str(country_code.strip())
                 # 短信签名
                 # 短信签名
                 sign_name = CommonService.confirm_msg_sign_name(sign_name)
                 sign_name = CommonService.confirm_msg_sign_name(sign_name)
-                return self.get_phone_code(country_code, phone, sign_name, code_type, response)
+                return self.get_phone_code(country_code, phone, sign_name, code_type, uid, response)
         except Exception as e:
         except Exception as e:
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
             return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 
 
     @staticmethod
     @staticmethod
-    def get_aliyun_email_code(email, code_type, response):
+    def get_aliyun_email_code(email, code_type, uid, response):
         """
         """
         获取邮箱验证码
         获取邮箱验证码
         @param email: 邮箱
         @param email: 邮箱
         @param code_type:  不传: 单点登录, 2: 查看设备密码
         @param code_type:  不传: 单点登录, 2: 查看设备密码
+        @param uid:
         @param response:
         @param response:
         @return:
         @return:
         """
         """
@@ -3443,10 +3443,10 @@ class SingleLoginView(TemplateView):
 
 
         # 确定缓存key
         # 确定缓存key
         if code_type is None:
         if code_type is None:
-            redis_key = email + '_SingleLogin'
+            redis_key = '{}_SingleLogin'.format(email)
             email_type = 'register_code'
             email_type = 'register_code'
         elif code_type == '2':
         elif code_type == '2':
-            redis_key = email + '_GetDevicePassword'
+            redis_key = '{}_{}_GetDevicePassword'.format(email, uid)
             email_type = 'get_device_password'
             email_type = 'get_device_password'
         else:
         else:
             return response.json(444)
             return response.json(444)
@@ -3475,13 +3475,14 @@ class SingleLoginView(TemplateView):
         return response.json(0)
         return response.json(0)
 
 
     @staticmethod
     @staticmethod
-    def get_phone_code(country_code, phone, sign_name, code_type, response):
+    def get_phone_code(country_code, phone, sign_name, code_type, uid, response):
         """
         """
         获取手机验证码
         获取手机验证码
         @param country_code: 国家编码
         @param country_code: 国家编码
         @param phone: 手机号码
         @param phone: 手机号码
         @param sign_name: 短信签名
         @param sign_name: 短信签名
         @param code_type: 验证码类型, None: 单点登录, 1: 修改手机号码, 2: 查看设备密码
         @param code_type: 验证码类型, None: 单点登录, 1: 修改手机号码, 2: 查看设备密码
+        @param uid:
         @param response:
         @param response:
         @return:
         @return:
         """
         """
@@ -3493,14 +3494,14 @@ class SingleLoginView(TemplateView):
             user_qs = Device_User.objects.filter(Q(username=phone) | Q(phone=phone))
             user_qs = Device_User.objects.filter(Q(username=phone) | Q(phone=phone))
             if not user_qs.exists():
             if not user_qs.exists():
                 return response.json(102)
                 return response.json(102)
-            redis_key = str(phone) + '_SingleLogin'
+            redis_key = '{}_SingleLogin'.format(phone)
             # 短信模板
             # 短信模板
             temp_msg = 'SMS_151675019' if country_code == '86' else 'SMS_172200051'
             temp_msg = 'SMS_151675019' if country_code == '86' else 'SMS_172200051'
         elif code_type == '1':
         elif code_type == '1':
-            redis_key = str(phone) + '_ChangePhone'
+            redis_key = '{}_ChangePhone'.format(phone)
             temp_msg = 'SMS_151675018' if country_code == '86' else 'SMS_172165867'
             temp_msg = 'SMS_151675018' if country_code == '86' else 'SMS_172165867'
         elif code_type == '2':
         elif code_type == '2':
-            redis_key = str(phone) + '_GetDevicePassword'
+            redis_key = '{}_{}_GetDevicePassword'.format(phone, uid)
             temp_msg = 'SMS_479855154' if country_code == '86' else 'SMS_479785146'
             temp_msg = 'SMS_479855154' if country_code == '86' else 'SMS_479785146'
         else:
         else:
             return response.json(444)
             return response.json(444)

+ 11 - 0
Model/models.py

@@ -5693,3 +5693,14 @@ class DeviceGroup(models.Model):
         db_table = 'device_group'
         db_table = 'device_group'
         verbose_name = '设备分组'
         verbose_name = '设备分组'
 
 
+
+class DeviceNetInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增标记ID')
+    device_id = models.CharField(default='', max_length=32, verbose_name='关联设备信息表id')
+    wifi_name = models.CharField(default='', max_length=64, verbose_name='wifi名称')
+    wifi_password = models.CharField(default='', max_length=64, verbose_name='wifi密码')
+
+    class Meta:
+        db_table = 'device_net_info'
+        verbose_name = '设备网络信息'
+