Browse Source

新增PC页面使用VUE --------------------

chenshibin 4 years ago
parent
commit
0a0075873b
5 changed files with 307 additions and 3 deletions
  1. 7 1
      Ansjer/urls.py
  2. 257 0
      Controller/UserLoginController.py
  3. 25 0
      Model/models.py
  4. 4 1
      Object/ResponseObject.py
  5. 14 1
      Object/TokenObject.py

+ 7 - 1
Ansjer/urls.py

@@ -18,7 +18,8 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     VerifyCodeController, FileController, UIDController, LogController, SalesController, \
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
-    DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug
+    DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug, \
+    UserLoginController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -333,6 +334,11 @@ urlpatterns = [
     # url(r'^deviceDebug/(?P<operation>.*)$', DeviceDebug.DeviceDebug.as_view()),
     re_path('deviceDebug/(?P<operation>.*)', DeviceDebug.DeviceDebug.as_view()),
 
+    #后台界面接口
+    url(r'^login$', UserLoginController.LoginView.as_view()),
+    url(r'^userInfo$', UserLoginController.GetPermissions.as_view()),
+    url(r'^router/getList$', UserLoginController.GetList.as_view()),
+
 
     re_path('(?P<path>.*)', LogManager.errorPath),
 

+ 257 - 0
Controller/UserLoginController.py

@@ -0,0 +1,257 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/9/11 15:08
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: UserController.py
+@Contact: chanjunkai@163.com
+"""
+import datetime
+import traceback
+import time
+import logging
+import jwt
+import simplejson
+import simplejson as json
+import requests
+from django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块
+from django.db.models import Q
+from django.http import HttpResponseRedirect
+from django.utils.decorators import method_decorator
+from django.utils.timezone import utc
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from jwt.algorithms import RSAAlgorithm
+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, MenuModel
+from Object.AWS.SesClassObject import SesClassObject
+from Object.AliSmsObject import AliSmsObject
+from Object.RedisObject import RedisObject
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Service.TemplateService import TemplateService
+from django.views.generic import View
+import base64
+import random
+from io import BytesIO
+from PIL import Image, ImageDraw, ImageFont
+from django.shortcuts import HttpResponse
+from Ansjer.config import BASE_DIR
+
+
+# 登录
+class LoginView(TemplateView):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(LoginView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language,'pc')
+
+        return self.validates(request_dict, response)
+
+
+
+    def validates(self, request_dict, response):
+        username = request_dict.get('username', None)
+        password = request_dict.get('password', None)
+        if not username or not password:
+            return response.json(111)
+        username = username.strip()
+        password = password.strip()
+        data_valid = DataValid()
+        if data_valid.email_validate(username):
+            return self.do_email_login(username, password, response)
+        elif data_valid.mobile_validate(username):
+            return self.do_phone_login(username, password, response)
+        elif data_valid.name_validate(username):
+            return self.do_name_login(username, password, response)
+        else:
+            return response.json(107)
+
+    def do_email_login(self, email, password, response):
+        user_qs = Device_User.objects.filter(Q(username=email) | Q(userEmail=email))
+        return self.valid_login(user_qs, password, response)
+
+    def do_phone_login(self, phone, password, response):
+        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)
+
+    def do_name_login(self, username, password, response):
+        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)
+
+    def valid_login(self, user_qs, password, response):
+        if not user_qs.exists():
+            return response.json(104)
+        # 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]
+        if not check_password(password, users['password']):
+            return response.json(111)
+        userID = users['userID']
+        tko = TokenObject(returntpye='pc')
+        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 ''
+            return response.json(0, res)
+        else:
+            return response.json(tko.code)
+
+
+# 获取登录权限
+class GetPermissions(TemplateView):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(GetPermissions, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        token = request.META.get('HTTP_AUTHORIZATION')
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        return self.validates(request_dict,token, response)
+
+
+
+
+    def validates(self, request_dict,token, response):
+        tko = TokenObject(token,returntpye='pc')
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        #待补充逻辑
+        res={
+          "code": 200,
+          "msg": "success",
+          "data": {
+            "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
+            "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
+            "username": "admin", # 用户名,必须返回
+            "avatar": "https://i.gtimg.cn/club/item/face/img/8/15918_100.gif" # 头像,必须返回
+          }
+        }
+        return response.json(0, res)
+
+
+# 获取菜单
+class GetList(TemplateView):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(GetList, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        token = request.META.get('HTTP_AUTHORIZATION')
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        return self.validates(request_dict,token, response)
+
+
+    def validates(self, request_dict,token, response):
+        tko = TokenObject(token,returntpye='pc')
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        #待补充逻辑
+        menu_qs = MenuModel.objects.filter(parentId=0);
+        list = []
+        i = 0
+        for menu in menu_qs:
+            list.append(
+                {
+                'id': menu.id,
+                'path': menu.path,
+                'name': menu.name,
+                'component': menu.component,
+                'meta': {
+                        'hidden': menu.hidden,
+                        'levelHidden': menu.levelHidden,
+                        'title': menu.title,
+                        'icon': menu.icon,
+                        'isCustomSvg':menu.isCustomSvg,
+                        'noKeepAlive': menu.noKeepAlive,
+                        'noClosable':menu.noClosable,
+                        'badge': menu.badge,
+                        'tabHidden': menu.tabHidden,
+                        'activeMenu': menu.activeMenu,
+                        'dot':menu.dot,
+                        'dynamicNewTab': menu.dynamicNewTab,
+                        'sort': menu.sort
+                    }
+                }
+            )
+        menu_qs = MenuModel.objects.all()
+        menulist = self.menulist(menu_qs, list)
+
+        return response.json(0, {'list':menulist})
+
+    def menulist(self,menu_qs,list):
+        for menulist in list:
+            for menu in menu_qs:
+                if menulist['id'] == menu.parentId:
+                    if 'children' not in menulist:
+                        menulist['children'] = []
+                    menulist['children'].append(
+                        {
+                        'id': menu.id,
+                        'path': menu.path,
+                        'name': menu.name,
+                        'component': menu.component,
+                        'meta': {
+                                'hidden': CommonService.decode_data(menu.hidden),
+                                'levelHidden': CommonService.decode_data(menu.levelHidden),
+                                'title': menu.title,
+                                'icon': menu.icon,
+                                'isCustomSvg': CommonService.decode_data(menu.isCustomSvg),
+                                'noKeepAlive': CommonService.decode_data(menu.noKeepAlive),
+                                'noClosable': CommonService.decode_data(menu.noClosable),
+                                'badge': menu.badge,
+                                'tabHidden': CommonService.decode_data(menu.tabHidden),
+                                'activeMenu': menu.activeMenu,
+                                'dot': CommonService.decode_data(menu.dot),
+                                'dynamicNewTab': menu.dynamicNewTab,
+                                'sort': menu.sort
+                            }
+                        }
+                    )
+                    self.menulist(menu_qs,menulist['children'])
+
+        return list

+ 25 - 0
Model/models.py

@@ -1709,3 +1709,28 @@ class P2PIpModel(models.Model):
         verbose_name = u'设备p2p_ip地区表'
         verbose_name_plural = verbose_name
 
+
+class MenuModel(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    parentId = models.IntegerField(default=0, verbose_name='父节点ID')
+    name = models.CharField(max_length=50, default='', verbose_name='名称')   #首字母大写,一定要与vue文件的name对应起来,用于noKeepAlive缓存控制(该项特别重要)
+    path = models.CharField(max_length=100, default='',verbose_name='路径')
+    component = models.CharField(max_length=100, default='', verbose_name='vue文件路径') #所谓的vue 组件
+    hidden = models.BooleanField(blank=True, default=False, verbose_name=u'是否隐藏')
+    levelHidden = models.BooleanField(blank=True, default=False, verbose_name=u'是否隐藏一级路由')
+    title = models.CharField(max_length=50, default='',verbose_name='标题')
+    icon = models.CharField(max_length=50, default='',verbose_name='图标名')
+    isCustomSvg = models.BooleanField(blank=True, default=False, verbose_name=u'是否是自定义svg图标')
+    noKeepAlive = models.BooleanField(blank=True, default=False, verbose_name=u'当前路由是否不缓存')
+    noClosable = models.BooleanField(blank=True, default=False, verbose_name=u'当前路由是否可关闭多标签页')
+    badge = models.CharField(max_length=10, default='', verbose_name='badge小标签(只支持子级)')
+    tabHidden = models.BooleanField(blank=True, default=False, verbose_name=u'当前路由是否不显示多标签页')
+    activeMenu = models.CharField(max_length=50, default='', verbose_name='高亮指定菜单')
+    dot = models.BooleanField(blank=True, default=False, verbose_name=u'小圆点')
+    dynamicNewTab = models.BooleanField(blank=True, default=False, verbose_name=u'动态传参路由是否新开标签页')
+    sort = models.IntegerField(default=0, verbose_name='排序')
+
+    class Meta:
+        db_table = 'menu'
+        verbose_name = u'菜单表'
+        verbose_name_plural = verbose_name

+ 4 - 1
Object/ResponseObject.py

@@ -3,8 +3,9 @@ import simplejson as json
 
 
 class ResponseObject(object):
-    def __init__(self, lang='en'):
+    def __init__(self, lang='en', returntype='currency'):
         self.lang = lang
+        self.returntype = returntype
 
     def data(self, code, res={}):
         data_en = {
@@ -209,6 +210,8 @@ class ResponseObject(object):
             message = '系统错误,code不存在'
         print(self.lang == 'cn')
         print(msg)
+        if self.returntype=='pc':
+            return {'code': code, 'msg': message, 'data': res, 'error_code': code}
         return {'result_code': code, 'reason': message, 'result': res, 'error_code': code}
 
     def formal(self, code, res={}):

+ 14 - 1
Object/TokenObject.py

@@ -19,7 +19,7 @@ from Object.RedisObject import RedisObject
 
 class TokenObject:
 
-    def __init__(self, token=None):
+    def __init__(self, token=None, returntpye='currency'):
         if token == 'local':
             token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTg0MzUxODk2MjgyMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM2ODAzMTc1OTYiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1ODcyNzcwNjB9.c0LV_XyxwbzUlYqMJqx7vw9f19Jv-0kGnUHuu_go-mo'
         if token == 'test':
@@ -31,12 +31,15 @@ class TokenObject:
         self.code = 0
         # 令牌校验
         self.valid()
+        self.returntpye = returntpye
 
     def valid(self):
         if self.token is None:
             self.code = 309
             return
         try:
+            self.token= self.token.replace("Bearer ", "")
+
             res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256')
             # print(res)
             self.userID = res.get('userID', None)
@@ -84,12 +87,22 @@ class TokenObject:
                 refresh_data,
                 OAUTH_REFRESH_TOKEN_SECRET,
                 algorithm='HS256')
+
             res = {
                 'access_token': access_token.decode('utf-8'),
                 'access_expire': access_expire,
                 'refresh_expire': refresh_expire,
                 'refresh_token': refresh_token.decode('utf-8'),
             }
+
+            if self.returntpye=='pc':
+                res = {
+                    'token': access_token.decode('utf-8'),
+                    'access_expire': access_expire,
+                    'refresh_expire': refresh_expire,
+                    'refresh_token': refresh_token.decode('utf-8'),
+                }
+
         except Exception as e:
             self.code = 309
             print(repr(e))