فهرست منبع

Merge remote-tracking branch 'remotes/origin/Bin' into dev

tanghongbin 5 سال پیش
والد
کامیت
c879f5547a
5فایلهای تغییر یافته به همراه156 افزوده شده و 6 حذف شده
  1. 7 3
      Ansjer/urls.py
  2. 126 1
      Controller/UserController.py
  3. 2 0
      Model/models.py
  4. 2 0
      Object/ResponseObject.py
  5. 19 2
      Service/CommonService.py

+ 7 - 3
Ansjer/urls.py

@@ -127,6 +127,10 @@ urlpatterns = [
     url(r'^account/loginCode$', UserController.loginCodeView.as_view()),
     url(r'^v3/account/loginByCode$', UserController.v3LoginByCodeView.as_view()),
 
+    # 指纹登录
+    url(r'^v3/account/loginByFingerprint$', UserController.v3LoginByFingerprintView.as_view()),
+    url(r'^v3/account/setFingerprint$', UserController.v3SetFingerprintView.as_view()),
+
     # 新增
     url(r'^detect/detect_group_push$',DetectController.NotificationView.detect_group_push),
     url(r'^detect/add$', DetectController.PushNotificationView.as_view()),
@@ -210,10 +214,10 @@ urlpatterns = [
     url(r'^date/(?P<operation>.*)$', DateController.DateConView.as_view()),
 
     url(r'^equipment/flow_test$', EquipmentManager.uid_status_test),
-    # url(r'^account/appFrequency/(?P<operation>.*)$', UserController.UserAppFrequencyView.as_view()),
+    url(r'^account/appFrequency/(?P<operation>.*)$', UserController.UserAppFrequencyView.as_view()),
     url(r'^v2/userbrand/(?P<operation>.*)$', UserBrandControllerV2.UserBrandV2.as_view()),
-    # url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
-    # url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
+    url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
+    url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
     # app 设备消息模板
     # 路由加参数参考
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),

+ 126 - 1
Controller/UserController.py

@@ -1753,7 +1753,7 @@ class v3LoginView(TemplateView):
         # users = user_qs.values('role__rid', 'role__roleName', 'userID', 'role', 'NickName', 'username', 'userEmail',
         #                        'phone', 'password', 'userIconPath', 'user_isValid', 'is_active')[0]
         users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
-                               'phone', 'password', 'userIconPath')[0]
+                               'phone', 'password', 'userIconPath', 'fingerprint_enable', 'fingerprint_key')[0]
         if not check_password(password, users['password']):
             return response.json(111)
         userID = users['userID']
@@ -1778,6 +1778,8 @@ class v3LoginView(TemplateView):
             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'] = users['fingerprint_key']
             return response.json(0, res)
         else:
             return response.json(tko.code)
@@ -3164,3 +3166,126 @@ class v3LoginByCodeView(View):
             return response.json(0, res)
         else:
             return response.json(tko.code)
+
+
+class v3LoginByFingerprintView(View):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(v3LoginByFingerprintView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        lang = request.POST.get('lang', None)
+        if not lang:
+            lang = request.POST.get('language', None)
+        response = ResponseObject(lang)
+        request_dict = request.POST
+
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.validate(request_dict, response)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        lang = request.GET.get('lang', None)
+        if not lang:
+            lang = request.GET.get('language', None)
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        request_dict = request.GET
+        return self.validate(request_dict, response)
+
+    def validate(self, request_dict, response):
+        password = request_dict.get("password", None)
+
+        if password:
+            password = CommonService.decode_data(password)
+            if password is None:
+                return response.json(444)
+            else:
+                user_qs = Device_User.objects.filter(username=password, is_active=True, user_isValid=True)
+                if not user_qs.exists():
+                    return response.json(104)
+                else:
+                    users = user_qs.values('role__rid', 'role__roleName', 'userID', 'NickName', 'username', 'userEmail',
+                               'phone', 'password', 'userIconPath', 'fingerprint_enable', 'fingerprint_key')[0]
+                    if users['fingerprint_enable'] == 0:
+                        return response.json(112)
+                    else:
+                        userID = users['userID']
+                        tko = TokenObject()
+                        res = tko.generate(
+                            data={'userID': userID, 'lang': response.lang, 'user': users['username'],
+                                  'm_code': '123413243214'})
+                        if tko.code == 0:
+                            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+                            user_qs.update(last_login=now_time, language=response.lang)
+                            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_key'] = CommonService.encode_data(content=users['fingerprint_key'], start=2)
+                            return response.json(0, res)
+                        else:
+                            return response.json(tko.code)
+        else:
+            return response.json(444)
+
+
+class v3SetFingerprintView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(v3SetFingerprintView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        lang = request_dict.get('lang', None)
+        token = request_dict.get('token', None)
+        fingerprint_enable = request_dict.get('fingerprint_enable', None)
+        fingerprint_key = request_dict.get('fingerprint_key', None)
+
+        response = ResponseObject()
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if not lang:
+            return response.json(444, 'lang')
+
+        response.lang = lang
+
+        data = {}
+
+        if fingerprint_enable:
+            data['fingerprint_enable'] = int(fingerprint_enable)
+
+        if fingerprint_key:
+            data['fingerprint_key'] = CommonService.decode_data(fingerprint_key, end=3)
+
+        if len(data) > 0:
+            Device_User.objects.filter(userID=token.userID).update(**data)
+        return response.json(0)

+ 2 - 0
Model/models.py

@@ -147,6 +147,8 @@ class Device_User(AbstractBaseUser):
     language = models.CharField(blank=True, max_length=16, default='en', verbose_name=u'语言地区')
     # 手机注册增加字段
     phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', blank=True)
+    fingerprint_enable = models.SmallIntegerField(default=0, verbose_name=u'是否开启了指纹登录') # 0:未开启,1:已开启
+    fingerprint_key = models.CharField(max_length=128, default='', verbose_name=u'客户端用于解码的密钥等信息')
     objects = UserManager()
 
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识

+ 2 - 0
Object/ResponseObject.py

@@ -31,6 +31,7 @@ class ResponseObject(object):
             109: 'The password not conform to the rules!',
             110: 'user doesn\'t activated',
             111: 'Error password',
+            112: 'Fingerprint login is not turned on',
             119: 'The qr code has expired',
             120: 'The code has expired',
             121: 'The verification code is wrong!',
@@ -93,6 +94,7 @@ class ResponseObject(object):
             109: '密码格式不符合!',
             110: '用户未激活!',
             111: '密码不正确!',
+            112: '未开通指纹登录',
             119: '二维码过期',
             120: '验证码过期',
             121: '验证码错了!',

+ 19 - 2
Service/CommonService.py

@@ -13,6 +13,9 @@ from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET
 
 
 # 复用性且公用较高封装代码在这
+from Controller.CheckUserData import RandomStr
+
+
 class CommonService:
     # 添加模糊搜索
     @staticmethod
@@ -225,9 +228,9 @@ class CommonService:
         return str
 
     @staticmethod
-    def decode_data(content):
+    def decode_data(content, start=1, end=4):
         try:
-            for i in range(1, 4):
+            for i in range(start, end):
                 if i == 1:
                     content = base64.b64decode(content)
                     content = content.decode('utf-8')
@@ -245,3 +248,17 @@ class CommonService:
         except Exception as e:
             print(e)
             return None
+
+    @staticmethod
+    def encode_data(content, start=1, end=4):
+        for i in range(start, end):
+            if i == 1:
+                content = RandomStr(3, False)+content+RandomStr(3, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+            if i == 2:
+                content = RandomStr(2, False)+str(content)+RandomStr(2, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+            if i == 3:
+                content = RandomStr(1, False)+str(content)+RandomStr(1, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+        return content