浏览代码

网关设备推送~

locky 3 年之前
父节点
当前提交
7315b3e615
共有 2 个文件被更改,包括 81 次插入54 次删除
  1. 62 54
      Controller/UserController.py
  2. 19 0
      Model/models.py

+ 62 - 54
Controller/UserController.py

@@ -32,7 +32,8 @@ from ratelimit.decorators import ratelimit
 from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN
 from Controller.CheckUserData import DataValid, date_handler, RandomStr
 from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
-    UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, Order_Model, UID_Bucket, Unused_Uid_Meal
+    UserAppFrequencyModel, CountryIPModel, CountryModel, UidChannelSetModel, Order_Model, UID_Bucket, Unused_Uid_Meal, \
+    GatewayPush
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
 from Object.RedisObject import RedisObject
@@ -310,24 +311,19 @@ class LogoutView(TemplateView):
         response = ResponseObject()
         token = request_dict.get('token')
         tko = TokenObject(token)
-        if tko.code == 0:
-            Device_User.objects.filter(userID=tko.userID).update(online=False)
-
-            redisObj = RedisObject(db=3)
-            redisObj.del_data(key=tko.userID)
-            m_code = request_dict.get('m_code', None)
-            if m_code:
-                userID = tko.userID
-                try:
-                    UidPushModel.objects.filter(userID_id=userID, m_code=m_code).delete()
-                except Exception as e:
-                    pass
-                else:
-                    pass
-            return response.json(0)
-        else:
+        if tko.code != 0:
             return response.json(tko.code)
 
+        Device_User.objects.filter(userID=tko.userID).update(online=False)
+        redisObj = RedisObject(db=3)
+        redisObj.del_data(key=tko.userID)
+        m_code = request_dict.get('m_code', None)
+        if m_code:
+            userID = tko.userID
+            UidPushModel.objects.filter(userID_id=userID, m_code=m_code).delete()
+            GatewayPush.objects.filter(user_id=userID, m_code=m_code).update(logout=True)
+        return response.json(0)
+
 
 # 修改密码
 class ChangePwdView(TemplateView):
@@ -1975,28 +1971,28 @@ class v3LoginView(TemplateView):
         else:
             data_valid = DataValid()
             if data_valid.email_validate(username):
-                return self.do_email_login(username, password, response, subscribe, number)
+                return self.do_email_login(username, password, response, subscribe, number, request_dict)
             elif data_valid.mobile_validate(username):
-                return self.do_phone_login(username, password, response, subscribe, number)
+                return self.do_phone_login(username, password, response, subscribe, number, request_dict)
             elif data_valid.name_validate(username):
-                return self.do_name_login(username, password, response, subscribe, number)
+                return self.do_name_login(username, password, response, subscribe, number, request_dict)
             else:
                 return response.json(107)
 
-    def do_email_login(self, email, password, response, subscribe, number):
+    def do_email_login(self, email, password, response, subscribe, number, request_dict):
         user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
-        return self.valid_login(user_qs, password, response, subscribe, number)
+        return self.valid_login(user_qs, password, response, subscribe, number, request_dict)
 
-    def do_phone_login(self, phone, password, response, subscribe, number):
+    def do_phone_login(self, phone, password, response, subscribe, number, request_dict):
         user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone), is_active=True, user_isValid=True)
-        return self.valid_login(user_qs, password, response, subscribe, number)
+        return self.valid_login(user_qs, password, response, subscribe, number, request_dict)
 
-    def do_name_login(self, username, password, response, subscribe, number):
+    def do_name_login(self, username, password, response, subscribe, number, request_dict):
         user_qs = Device_User.objects.filter(Q(username=username) | Q(phone=username) | Q(userEmail=username),
                                              is_active=True, user_isValid=True)
-        return self.valid_login(user_qs, password, response, subscribe, number)
+        return self.valid_login(user_qs, password, response, subscribe, number, request_dict)
 
-    def valid_login(self, user_qs, password, response, subscribe, number):
+    def valid_login(self, user_qs, password, response, subscribe, number, request_dict):
         if not user_qs.exists():
             return response.json(104)
         # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
@@ -2008,6 +2004,7 @@ class v3LoginView(TemplateView):
                                'phone', 'password', 'userIconPath', 'fingerprint_enable', 'fingerprint_key', 'subscribe_email')[0]
         if not check_password(password, users['password']):
             return response.json(111)
+
         userID = users['userID']
         tko = TokenObject()
         res = tko.generate(
@@ -2017,36 +2014,47 @@ class v3LoginView(TemplateView):
         if oauth_qs.exists():
             auth_type = oauth_qs[0].authType
 
+        if tko.code != 0:
+            return response.json(tko.code)
 
-        if tko.code == 0:
-            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
-            if not number:
-                user_qs.update(last_login=now_time, language=response.lang)
-            else:
-                user_qs.update(last_login=now_time, language=response.lang, region_country=number)
+        # 网关推送新增内容
+        app_bundle_id = request_dict.get('appBundleId', None)
+        app_type = request_dict.get('appType', None)
+        push_type = request_dict.get('pushType', None)
+        token_val = request_dict.get('tokenVal', None)
+        m_code = request_dict.get('mCode', None)
+        lang = request_dict.get('language', 'en')
+        tz = request_dict.get('tz', None)
+        if all([app_bundle_id, app_type, push_type, token_val, m_code, tz]):
+            gateway_push_qs = GatewayPush.objects.filter(user_id=userID, m_code=m_code)
+            if not gateway_push_qs.exists():
+                GatewayPush.objects.create(user_id=userID, app_bundle_id=app_bundle_id, app_type=app_type,
+                                           push_type=push_type, token_val=token_val, m_code=m_code, lang=lang, tz=tz)
 
-            res['rid'] = users['role__rid']
-            res['roleName'] = users['role__roleName']
-            res['permList'] = ModelService.own_permission(userID)
-            res['userID'] = userID
-            # 昵称,邮箱,电话,刷新,头像
-            userIconPath = str(users['userIconPath'])
-            if userIconPath and userIconPath.find('static/') != -1:
-                userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
-                res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
-            else:
-                res['userIconUrl'] = ''
-            res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
-            res['username'] = users['username'] if users['username'] is not None else ''
-            res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
-            res['phone'] = users['phone'] if users['phone'] is not None else ''
-            # res['fingerprint_enable'] = users['fingerprint_enable']
-            # res['fingerprint_key'] = CommonService.encode_data(content=users['fingerprint_key'], start=2)
-            res['authType'] = auth_type
-            res['subscribe_email'] = users['subscribe_email'] if users['subscribe_email'] is not None else ''
-            return response.json(0, res)
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        if not number:
+            user_qs.update(last_login=now_time, language=response.lang)
         else:
-            return response.json(tko.code)
+            user_qs.update(last_login=now_time, language=response.lang, region_country=number)
+
+        res['rid'] = users['role__rid']
+        res['roleName'] = users['role__roleName']
+        res['permList'] = ModelService.own_permission(userID)
+        res['userID'] = userID
+        # 昵称,邮箱,电话,刷新,头像
+        userIconPath = str(users['userIconPath'])
+        if userIconPath and userIconPath.find('static/') != -1:
+            userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
+            res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
+        else:
+            res['userIconUrl'] = ''
+        res['NickName'] = users['NickName'] if users['NickName'] is not None else ''
+        res['username'] = users['username'] if users['username'] is not None else ''
+        res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
+        res['phone'] = users['phone'] if users['phone'] is not None else ''
+        res['authType'] = auth_type
+        res['subscribe_email'] = users['subscribe_email'] if users['subscribe_email'] is not None else ''
+        return response.json(0, res)
 
 
 # 一键登录接口

+ 19 - 0
Model/models.py

@@ -1218,6 +1218,25 @@ class UidPushModel(models.Model):
         ordering = ('-id',)
 
 
+class GatewayPush(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='自增id')
+    user_id = models.CharField(default='', max_length=32, verbose_name=u'用户id')
+    app_bundle_id = models.CharField(default='', max_length=32, verbose_name=u'app包id')
+    app_type = models.IntegerField(default=0, verbose_name=u'app类型')    # 1: ios, 2: 安卓
+    push_type = models.IntegerField(default=0, verbose_name=u'推送类型')    # 0: apns, 1: 安卓gcm, 2: 极光
+    token_val = models.CharField(default='', max_length=500, verbose_name=u'设备验证令牌')
+    m_code = models.CharField(default='', max_length=64, verbose_name='手机唯一标识')
+    lang = models.CharField(default='en', max_length=8, verbose_name='推送语言')
+    tz = models.CharField(default='0', max_length=8, verbose_name='时区')
+    logout = models.BooleanField(default=False, verbose_name=u'退出登录')
+
+    class Meta:
+        db_table = 'gateway_push'
+        verbose_name = '网关推送'
+        verbose_name_plural = verbose_name
+        app_label = 'PushModel'
+
+
 # 设备通道配置
 class UidChannelSetModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')