Browse Source

Merge branch 'dev' of http://192.168.136.99:3000/servers/ASJServer into dev

lang 4 năm trước cách đây
mục cha
commit
7126b4f29e

+ 136 - 0
AdminController/MenuController.py

@@ -0,0 +1,136 @@
+#!/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: 2021/07/06 11:17
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+"""
+import json
+import time
+import urllib
+import uuid
+import boto3
+import threading
+import logging
+from boto3.session import Session
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.views.generic.base import View
+from Model.models import Device_Info, Role, MenuModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.UidTokenObject import UidTokenObject
+from Service.CommonService import CommonService
+from django.db.models import Q, F
+from time import strftime
+
+
+class MenuView(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        if operation == '??':
+            return 0
+        else:
+            tko = TokenObject(request.META.get('HTTP_AUTHORIZATION'),returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            userID = tko.userID
+            if operation == 'getList':
+                return self.getList(userID, request_dict, response)
+            if operation == 'doEdit':
+                return self.doEdit(userID, request_dict, response)
+            else:
+                return response.json(404)
+
+    def getList(self, userID, request_dict, response):
+        role_qs = Role.objects.filter(device_user=userID)
+        menu_qs = MenuModel.objects.filter(parentId=0, role__in=role_qs);
+        list = []
+        i = 0
+        for menu in menu_qs:
+            list.append(
+                {
+                    'id': menu.id,
+                    'parentId': menu.parentId,
+                    '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.filter(role__in=role_qs)
+        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,
+                        'parentId': menu.parentId,
+                        '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
+                            }
+                        }
+                    )
+                    self.menulist(menu_qs,menulist['children'])
+
+        return list
+
+    def doEdit(self, userID, request_dict, response):
+        print('request_dict: ', request_dict)
+        data_dict = CommonService.request_dict_to_dict(request_dict)
+        if data_dict['isEdit']:
+            MenuModel.objects.filter(name=data_dict['name']).update(**data_dict)
+        else:
+            MenuModel.objects.create(**data_dict)
+        return response.json(0)

+ 20 - 5
AdminController/UserLoginController.py

@@ -155,15 +155,27 @@ class GetPermissions(TemplateView):
         if tko.code != 0:
         if tko.code != 0:
             return response.json(tko.code)
             return response.json(tko.code)
         userID = tko.userID
         userID = tko.userID
+
+
+        user_qs = Device_User.objects.filter(userID=userID)
+        if not user_qs.exists():
+            return response.json(104)
         #待补充逻辑
         #待补充逻辑
+        username = user_qs[0].username
+        userIconPath = user_qs[0].userIconPath.url
+        if userIconPath:
+            if userIconPath.find('static/') != -1:
+                userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
+                userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
+
         res={
         res={
           "code": 200,
           "code": 200,
           "msg": "success",
           "msg": "success",
           "data": {
           "data": {
             "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
             "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
             "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
             "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
-            "username": "admin", # 用户名,必须返回
-            "avatar": "https://i.gtimg.cn/club/item/face/img/8/15918_100.gif" # 头像,必须返回
+            "username": username, # 用户名,必须返回
+            "avatar": userIconUrl# 头像,必须返回
           }
           }
         }
         }
         return response.json(0, res)
         return response.json(0, res)
@@ -190,14 +202,16 @@ class GetList(TemplateView):
         if tko.code != 0:
         if tko.code != 0:
             return response.json(tko.code)
             return response.json(tko.code)
         userID = tko.userID
         userID = tko.userID
-        #待补充逻辑
-        menu_qs = MenuModel.objects.filter(parentId=0);
+
+        role_qs =Role.objects.filter(device_user=userID)
+        menu_qs = MenuModel.objects.filter(parentId=0,role__in=role_qs);
         list = []
         list = []
         i = 0
         i = 0
         for menu in menu_qs:
         for menu in menu_qs:
             list.append(
             list.append(
                 {
                 {
                 'id': menu.id,
                 'id': menu.id,
+                'parentId': menu.parentId,
                 'path': menu.path,
                 'path': menu.path,
                 'name': menu.name,
                 'name': menu.name,
                 'component': menu.component,
                 'component': menu.component,
@@ -218,7 +232,7 @@ class GetList(TemplateView):
                     }
                     }
                 }
                 }
             )
             )
-        menu_qs = MenuModel.objects.all()
+        menu_qs = MenuModel.objects.filter(role__in=role_qs)
         menulist = self.menulist(menu_qs, list)
         menulist = self.menulist(menu_qs, list)
 
 
         return response.json(0, {'list':menulist})
         return response.json(0, {'list':menulist})
@@ -232,6 +246,7 @@ class GetList(TemplateView):
                     menulist['children'].append(
                     menulist['children'].append(
                         {
                         {
                         'id': menu.id,
                         'id': menu.id,
+                        'parentId': menu.parentId,
                         'path': menu.path,
                         'path': menu.path,
                         'name': menu.name,
                         'name': menu.name,
                         'component': menu.component,
                         'component': menu.component,

+ 3 - 1
Ansjer/urls.py

@@ -19,7 +19,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug
-from AdminController import UserLoginController, RoleController
+from AdminController import UserLoginController, RoleController, MenuController
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -343,6 +343,8 @@ urlpatterns = [
     #角色管理
     #角色管理
     re_path('roleManagement/(?P<operation>.*)', RoleController.RoleView.as_view()),
     re_path('roleManagement/(?P<operation>.*)', RoleController.RoleView.as_view()),
 
 
+    #菜单管理
+    re_path('menuManagement/(?P<operation>.*)', MenuController.MenuView.as_view()),
 
 
     #后台界面接口 -----------------------------------------------------
     #后台界面接口 -----------------------------------------------------
     re_path('(?P<path>.*)', LogManager.errorPath),
     re_path('(?P<path>.*)', LogManager.errorPath),

+ 15 - 24
Controller/PcInfo.py

@@ -11,6 +11,7 @@ from django.http import HttpResponse
 
 
 from django.views.generic.base import View
 from django.views.generic.base import View
 
 
+from Controller.PctestController import TokenObject1
 from Model.models import Pc_Info, PctestlogModel
 from Model.models import Pc_Info, PctestlogModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -303,30 +304,21 @@ class PcInfo(View):
         logger.info('s3方式上传参数:')
         logger.info('s3方式上传参数:')
         logger.info(request_dict)
         logger.info(request_dict)
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
-        tko = TokenObject(token)
+        tko = TokenObject1(token)
         response.lang = tko.lang
         response.lang = tko.lang
         if tko.code != 0:
         if tko.code != 0:
             return response.json(tko.code)
             return response.json(tko.code)
-        userID = tko.userID
-        if not userID:
-            return response.json(104)
-        pc_name = request_dict.get('pc_name', None)
-        bundle_version = request_dict.get('bundle_version', None)
-        pc_version = request_dict.get('pc_version', None)
-        pc_test = request_dict.get('pc_test', None)
-        lang = request_dict.get('lang', None)
+        # 获取访问者的id和岗位
+        userID = tko.id
+
+
+        datetime = request_dict.get('datetime', None)
         file_name = request_dict.get('file_name', None)
         file_name = request_dict.get('file_name', None)
-        file_type = request_dict.get('file_type', None)
-        package = request_dict.get('package', None)
-        explain = request_dict.get('explain', '')
-        is_update = request_dict.get('is_update', None)
-        is_open = request_dict.get('is_open', None)
-        pathtype = request_dict.get('pathtype', None)
+        pathtype = request_dict.get('pathtype', 'log')
         # logger.info('文件名字:')
         # logger.info('文件名字:')
         # logger.info(file_name)
         # logger.info(file_name)
         param_flag = CommonService.get_param_flag(
         param_flag = CommonService.get_param_flag(
-            data=[pc_name, bundle_version, pc_version, pc_test, lang, file_name, file_type, package, is_update,
-                  is_open])
+            data=[datetime, file_name, pathtype])
         if param_flag is not True:
         if param_flag is not True:
             return response.json(444)
             return response.json(444)
 
 
@@ -339,9 +331,8 @@ class PcInfo(View):
             config=botocore.client.Config(signature_version='s3v4'),
             config=botocore.client.Config(signature_version='s3v4'),
             region_name='cn-northwest-1'
             region_name='cn-northwest-1'
         )
         )
-        download_link = '{pc_name}/{pathtype}/{pc_version}_{bundle_version}_{pc_test}_{file_name}'.format(
-            pc_name=pc_name, pathtype=pathtype, pc_version=pc_version, bundle_version=bundle_version,
-            pc_test=pc_test, file_name=file_name)
+        download_link = '{pathtype}/{datetime}/{file_name}'.format(
+            pathtype=pathtype, datetime=datetime, file_name=file_name)
         response_url = aws_s3_guonei.generate_presigned_url(
         response_url = aws_s3_guonei.generate_presigned_url(
             ClientMethod='put_object',
             ClientMethod='put_object',
             Params={
             Params={
@@ -352,7 +343,7 @@ class PcInfo(View):
         )
         )
         add_time = time.time()
         add_time = time.time()
         PctestlogModel.objects.create(user_id=userID, content=download_link, addtime=add_time)
         PctestlogModel.objects.create(user_id=userID, content=download_link, addtime=add_time)
-        return response.json(0, {'upload_url': response_url})
+        return response.json(0, {'upload_url': response_url, 'datetime': datetime})
 
 
 
 
     def s3download(self, request_dict, response):
     def s3download(self, request_dict, response):
@@ -391,10 +382,10 @@ class PcInfo(View):
 
 
     def s3downloadlog(self, request_dict, response):
     def s3downloadlog(self, request_dict, response):
         id = request_dict.get('id', None)
         id = request_dict.get('id', None)
-        path = PctestlogModel.objects.filter(id=id)
-        if not path:
+        pclog_qs = PctestlogModel.objects.filter(id=id)
+        if not pclog_qs:
             return response.json(173)
             return response.json(173)
-        path = path[0]['content']
+        path = pclog_qs[0].content
         aws_s3_guonei = boto3.client(
         aws_s3_guonei = boto3.client(
             's3',
             's3',
             aws_access_key_id=AWS_ACCESS_KEY_ID[0],
             aws_access_key_id=AWS_ACCESS_KEY_ID[0],

+ 6 - 3
Controller/PctestController.py

@@ -427,10 +427,13 @@ class PcTest(View):
         return response.json(0)
         return response.json(0)
 
 
     def logquery(self, request_dict, userID, response):
     def logquery(self, request_dict, userID, response):
-        if userID == 1:
-            job_device_list = PctestlogModel.objects.values('id', 'user__id', 'user__username', 'content', 'addtime')
+        startDateTime = request_dict.get('startDateTime', None)
+        endDateTime = request_dict.get('endDateTime', None)
+        userid = request_dict.get('userid', None)
+        if userid :
+            job_device_list = PctestlogModel.objects.filter(user_id=userID,addtime__range=(startDateTime, endDateTime)).values('id', 'user__id', 'user__username', 'content', 'addtime')
         else:
         else:
-            job_device_list = PctestlogModel.objects.filter(user_id=userID).values('id', 'user__id', 'user__username', 'content', 'addtime')
+            job_device_list = PctestlogModel.objects.filter(addtime__range=(startDateTime, endDateTime)).values('id', 'user__id', 'user__username', 'content', 'addtime')
         device_list = []
         device_list = []
         for i in job_device_list:
         for i in job_device_list:
             device_list.append(i)
             device_list.append(i)

+ 28 - 24
Model/models.py

@@ -78,12 +78,40 @@ class Permissions(models.Model):
     def natural_key(self):
     def natural_key(self):
         return (self.permName)
         return (self.permName)
 
 
+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, unique=True, 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'是否隐藏')
+    alwaysShow = 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'动态传参路由是否新开标签页')
+    redirect = models.CharField(max_length=50, default='', verbose_name='重定向')
+    sort = models.IntegerField(default=0, verbose_name='排序')
+
+    class Meta:
+        db_table = 'menu'
+        verbose_name = u'菜单表'
+        verbose_name_plural = verbose_name
 
 
 class Role(models.Model):
 class Role(models.Model):
     rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID')
     rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID')
     roleName = models.CharField(max_length=32, unique=True,
     roleName = models.CharField(max_length=32, unique=True,
                                 default='User', verbose_name=u'角色名称')
                                 default='User', verbose_name=u'角色名称')
     permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions')
     permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions')
+    menu = models.ManyToManyField(to='MenuModel', blank=True, verbose_name=u'后台菜单权限', db_table='role_menu')
+
     Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')
     Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')
 
 
     objects = RoleManager()
     objects = RoleManager()
@@ -1710,27 +1738,3 @@ class P2PIpModel(models.Model):
         verbose_name_plural = verbose_name
         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

+ 16 - 0
Service/CommonService.py

@@ -36,6 +36,22 @@ class CommonService:
         sqlDict = dict(zip(["datas"], [sqlList]))
         sqlDict = dict(zip(["datas"], [sqlList]))
         return sqlDict
         return sqlDict
 
 
+    # 格式化query_set转dict
+    @staticmethod
+    def request_dict_to_dict(request_dict):
+        key_list = []
+        value_list = []
+        for k, v in request_dict.items():
+            key_list.append(k[k.index('[')+1:k.index(']')] if 'meta' in k else k)
+            if v == 'true':
+                v = True
+            elif v == 'false':
+                v = False
+            value_list.append(v)
+        data_dict = dict(zip(key_list, value_list))
+        print(data_dict)
+        return data_dict
+
     # 获取文件大小
     # 获取文件大小
     @staticmethod
     @staticmethod
     def get_file_size(file_path='', suffix_type='', decimal_point=0):
     def get_file_size(file_path='', suffix_type='', decimal_point=0):

+ 1 - 1
templates/appVerList.html

@@ -5,7 +5,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1">
     <meta name="viewport" content="width=device-width, initial-scale=1">
       {% if lang == 'cn' %}
       {% if lang == 'cn' %}
-        <title>更新记录</title>
+        <title>版本记录</title>
       {% else %}
       {% else %}
 		<title>Update Record</title>
 		<title>Update Record</title>
       {% endif %}
       {% endif %}