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
c67d1da51d

+ 64 - 36
AdminController/MenuController.py

@@ -54,12 +54,14 @@ class MenuView(View):
                 return self.getList(userID, request_dict, response)
             if operation == 'doEdit':
                 return self.doEdit(userID, request_dict, response)
+            if operation == 'doDelete':
+                return self.doDelete(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);
+        menu_qs = MenuModel.objects.filter(parentId=0)
         list = []
         i = 0
         for menu in menu_qs:
@@ -70,6 +72,8 @@ class MenuView(View):
                     'path': menu.path,
                     'name': menu.name,
                     'component': menu.component,
+                    'menutype': menu.menutype,
+                    'menu_code': menu.menu_code,
                     'meta': {
                         'hidden': menu.hidden,
                         'levelHidden': menu.levelHidden,
@@ -87,50 +91,74 @@ class MenuView(View):
                     }
                 }
             )
-        menu_qs = MenuModel.objects.filter(role__in=role_qs)
-        menulist = self.menulist(menu_qs, list)
+        menu_qs = MenuModel.objects.filter()
+        menulist = []
+        for objlist in list:
+            menulist.append(self.menulist(menu_qs, objlist))
 
         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'])
+    def menulist(self, menu_qs, objlist):
+        if objlist is None:
+            return
+        for menu in menu_qs:
+            if objlist['id'] == menu.parentId:
+                if 'children' not in objlist:
+                    objlist['children'] = []
+
+                obj = {
+                    'id': menu.id,
+                    'parentId': menu.parentId,
+                    'path': menu.path,
+                    'name': menu.name,
+                    'component': menu.component,
+                    'menutype': menu.menutype,
+                    'menu_code': menu.menu_code,
+                    '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
+                    }
+                }
+                objlist['children'].append(
+                    obj
+                )
+                self.menulist(menu_qs, obj)
 
-        return list
+        return objlist
 
     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)
+            # data_dict.index(76)
+            data_dict.pop('isEdit')
+            keys = ['parentId', 'name', 'path', 'component', 'hidden', 'alwaysShow', 'levelHidden', 'title', 'icon',
+                    'isCustomSvg', 'noKeepAlive', 'badge', 'tabHidden', 'activeMenu', 'dot', 'dynamicNewTab',
+                    'redirect', 'menu_code', 'menutype', 'sort']
+            data = {}
+            for key in keys:
+                if key in data_dict:
+                    data[key] = data_dict[key]
+
+            MenuModel.objects.filter(id=data_dict['id']).update(**data)
         else:
+            data_dict.pop('isEdit')
             MenuModel.objects.create(**data_dict)
+        return response.json(0)
+
+    def doDelete(self, userID, request_dict, response):
+        id = request_dict.get('id', '')
+        MenuModel.objects.filter(id=id).delete()
         return response.json(0)

+ 71 - 4
AdminController/RoleController.py

@@ -19,12 +19,12 @@ 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
+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 django.db.models import Q, F, Max
 from time import strftime
 
 
@@ -52,9 +52,76 @@ class RoleView(View):
             userID = tko.userID
             if operation == 'getList':
                 return self.getList(userID, request_dict, response)
+            elif operation == 'doEdit':
+                return self.doEdit(userID, request_dict, response)
+            elif operation == 'doDelete':
+                return self.doDelete(userID, request_dict, response)
+            elif operation == 'getPerms':
+                return self.getPerms(userID, request_dict, response)
+            elif operation == 'setPerms':
+                return self.setPerms(userID, request_dict, response)
             else:
                 return response.json(404)
 
     def getList(self, userID, request_dict, response):
-        role_qs =Role.objects.all().values('rid','roleName','Description');
-        return response.json(0, {'list': CommonService.qs_to_list(role_qs)})
+        isSelect = request_dict.get('isSelect', None)   # 获取全部数据作为角色选项
+        if isSelect:
+            role_qs = Role.objects.all().values('rid', 'roleName', 'Description')
+            return response.json(0, {'list': CommonService.qs_to_list(role_qs)})
+
+        roleName = request_dict.get('roleName', '').strip()  # 移除字符串头尾的空格
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        if roleName:
+            role_qs = Role.objects.filter(roleName=roleName).values('rid', 'roleName', 'Description')
+        else:
+            role_qs = Role.objects.all().values('rid', 'roleName', 'Description')
+
+        count = role_qs.count()
+        role_qs = role_qs.order_by('rid')[(page - 1) * line:page * line]
+
+
+        return response.json(0, {'list': CommonService.qs_to_list(role_qs), 'total': count})
+
+    def doEdit(self, userID, request_dict, response):
+
+        data_dict = request_dict.dict()
+        # data_dict = json.loads(data_str)
+        if 'rid' in data_dict:
+            Role.objects.filter(rid=data_dict['rid']).update(**data_dict)
+        else:
+            id = Role.objects.all().aggregate(Max('rid'))['rid__max'] + 1
+            data_dict['rid'] = id
+            Role.objects.create(**data_dict)
+        return response.json(0)
+
+    def doDelete(self, userID, request_dict, response):
+        rid = request_dict.get('rid', '')
+        if not all([rid]):
+            return response.json(444)
+        Role.objects.filter(rid=rid).delete()
+        return response.json(0)
+
+    def getPerms(self, userID, request_dict, response):
+        rid = request_dict.get('rid', '')
+
+        if rid:
+            role_qs = Role.objects.filter(rid=rid).values('menu__id')
+            return response.json(0, CommonService.qs_to_list(role_qs))
+
+        return response.json(0)
+
+    def setPerms(self, userID, request_dict, response):
+        rid = request_dict.get('rid', '')
+        permsIds = request_dict.get('permsIds', '')
+        if not all([rid]):
+            return response.json(444)
+        Role.objects.get(rid=rid).menu.clear()
+        menu_obj = MenuModel.objects.filter(id__in=permsIds.split(','))
+        Role.objects.filter(rid=rid)[0].menu.add(*menu_obj)
+        return response.json(0)

+ 159 - 4
AdminController/UserLoginController.py → AdminController/UserManageController.py

@@ -132,6 +132,8 @@ class LoginView(TemplateView):
             return response.json(tko.code)
 
 
+
+
 # 获取登录权限
 class GetPermissions(TemplateView):
     @method_decorator(csrf_exempt)  # @csrf_exempt
@@ -168,6 +170,11 @@ class GetPermissions(TemplateView):
                 userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
                 userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
 
+        role_qs = Role.objects.filter(device_user=userID)
+        menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=2);
+        perms = []
+        for menu in menu_qs:
+            perms.append(menu.menu_code)
         res={
           "code": 200,
           "msg": "success",
@@ -175,7 +182,8 @@ class GetPermissions(TemplateView):
             "roles": ["admin"], # 一个用户可包含多个角色如["admin","editor","XXXX"],必须返回,如小项目用不到角色权限请返回 ["admin"]
             "ability": ["READ", "WRITE", "DELETE"], # 如果用不到rabc精细化权限可以不返回,建议返回
             "username": username, # 用户名,必须返回
-            "avatar": userIconUrl# 头像,必须返回
+            "avatar": userIconUrl,# 头像,必须返回
+            "perms": perms
           }
         }
         return response.json(0, res)
@@ -204,7 +212,7 @@ class GetList(TemplateView):
         userID = tko.userID
 
         role_qs =Role.objects.filter(device_user=userID)
-        menu_qs = MenuModel.objects.filter(parentId=0,role__in=role_qs);
+        menu_qs = MenuModel.objects.filter(parentId=0,role__in=role_qs,menutype=1);
         list = []
         i = 0
         for menu in menu_qs:
@@ -232,7 +240,7 @@ class GetList(TemplateView):
                     }
                 }
             )
-        menu_qs = MenuModel.objects.filter(role__in=role_qs)
+        menu_qs = MenuModel.objects.filter(role__in=role_qs,menutype=1)
         menulist = self.menulist(menu_qs, list)
 
         return response.json(0, {'list':menulist})
@@ -269,4 +277,151 @@ class GetList(TemplateView):
                     )
                     self.menulist(menu_qs,menulist['children'])
 
-        return list
+        return list
+
+
+
+class UserManagement(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 == 'getUserInfo':
+                return self.getUserInfo(userID, request_dict, response)
+            elif operation == 'AddOrEditAccount':
+                return self.AddOrEditAccount(userID, request_dict, response)
+            elif operation == 'doDelete':
+                return self.doDelete(userID, request_dict, response)
+            else:
+                return response.json(404)
+
+    def getUserInfo(self, userID, request_dict, response):
+        print('request_dict: ', request_dict)
+        username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if username:    # 查询
+                # 校验查询输入数据是否匹配用户名,手机或邮箱正则
+                dataValid = DataValid()
+                if not (dataValid.name_validate(username) or dataValid.mobile_validate(username) \
+                        or dataValid.email_validate(username)):
+                    return response.json(444)
+                device_user_qs = Device_User.objects.filter(username=username)
+                if not device_user_qs.exists():
+                    device_user_qs = Device_User.objects.filter(phone=username)
+                    if not device_user_qs.exists():
+                        device_user_qs = Device_User.objects.filter(userEmail=username)
+                        if not device_user_qs.exists():
+                            return response.json(104)
+
+            else:
+                device_user_qs = Device_User.objects.filter().all()  # 查询全部
+            count = device_user_qs.count()
+            device_users = device_user_qs[(page - 1) * line:page * line]
+            user_list = []
+            for device_user in device_users:
+                role = device_user.role.first()
+                rid = role.rid if role else 1   # 不存在角色默认分配为'Users'
+                user_list.append({
+                    'userID': device_user.userID,
+                    'username': device_user.username,
+                    'NickName': device_user.NickName,
+                    'role': Role.objects.get(rid=rid).roleName,
+                    'phone': device_user.phone,
+                    'userEmail': device_user.userEmail,
+                    'data_joined': device_user.data_joined.strftime("%Y-%m-%d %H:%M:%S"),
+                    'last_login': device_user.last_login.strftime("%Y-%m-%d %H:%M:%S"),
+                    'online': device_user.online,
+                })
+            print('user_list: ', user_list)
+            return response.json(0, {'list': user_list, 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def AddOrEditAccount(self, userID, request_dict, response):
+        # 添加/编辑用户
+        print('request_dict: ', request_dict)
+        username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格
+        userEmail = request_dict.get('userEmail', '').strip()
+        roleName = request_dict.get('role', None)
+        password = request_dict.get('password', None)
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([username, userEmail, roleName, password]):
+            return response.json(444)
+
+        # 校验用户名,邮箱,密码是否符合规则
+        dataValid = DataValid()
+        if not dataValid.name_validate(username) or not dataValid.email_validate(userEmail) \
+                or not dataValid.password_validate(password):
+            return response.json(444)
+
+        try:
+            if isEdit:  # 编辑用户信息
+                userID = request_dict.get('userID')
+                user_data = {
+                    "username": username,
+                    "NickName": username,
+                    "userEmail": userEmail,
+                    "password": make_password(password),
+                }
+                device_user_qs = Device_User.objects.filter(userID=userID)
+                device_user_qs.update(**user_data)
+
+                # 如果角色改变,修改用户角色
+                device_user_role = device_user_qs[0].role
+                user_role = device_user_role.first()
+                if not user_role or roleName != user_role.roleName:
+                    device_user_role.clear()
+                    role_qs = Role.objects.filter(roleName=roleName)  # 账号角色
+                    device_user_qs[0].role.set(role_qs)
+            else:   # 添加用户
+                # 查询邮箱是否已注册
+                if Device_User.objects.filter(userEmail=userEmail).exists():
+                    return response.json(103)
+                role_qs = Role.objects.filter(roleName=roleName)    # 账号角色
+                # 创建用户
+                user_data = {
+                    "username": username,
+                    "NickName": username,
+                    "userEmail": userEmail,
+                    "password": make_password(password),
+                    "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                    "is_active": True,
+                    "user_isValid": True,
+                }
+                Device_User.objects.create(**user_data).role.set(role_qs)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def doDelete(self, userID, request_dict, response):
+        userID = request_dict.get('userID', '')
+        Device_User.objects.filter(userID=userID).delete()
+        return response.json(0)

+ 5 - 4
Ansjer/urls.py

@@ -19,7 +19,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug
-from AdminController import UserLoginController, RoleController, MenuController
+from AdminController import UserManageController, RoleController, MenuController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -336,9 +336,10 @@ urlpatterns = [
 
     #后台界面接口 -----------------------------------------------------
     #用户登录信息等
-    url(r'^login$', UserLoginController.LoginView.as_view()),
-    url(r'^userInfo$', UserLoginController.GetPermissions.as_view()),
-    url(r'^router/getList$', UserLoginController.GetList.as_view()),
+    url(r'^login$', UserManageController.LoginView.as_view()),
+    url(r'^userInfo$', UserManageController.GetPermissions.as_view()),
+    url(r'^router/getList$', UserManageController.GetList.as_view()),
+    re_path('userManagement/(?P<operation>.*)', UserManageController.UserManagement.as_view()),
 
     #角色管理
     re_path('roleManagement/(?P<operation>.*)', RoleController.RoleView.as_view()),

+ 5 - 5
Controller/VPGController.py

@@ -182,7 +182,7 @@ class VPGView(View):
 
         start = (page - 1) * line
         end = start + line
-        uid_qs = UIDModel.objects.filter(vpg_id=vpg_id).values('uid', 'platform', 'init_string', 'init_string_app')
+        uid_qs = UIDModel.objects.filter(vpg_id=vpg_id).values('uid', 'p2p_type', 'platform', 'init_string', 'init_string_app')
 
         count = VPGModel.objects.get(id=vpg_id).uid_count   # 从vpg表获取uid总数
         uid_qs = uid_qs[start:end]  # 显示条数
@@ -210,11 +210,11 @@ def do_upload_uid(request):
         return response.json(444)
     file = request.FILES.get('file', None)
     vpg_id = request_dict.get('vpg_id', None)
-    platform = request_dict.get('platform', None)
-    init_string = request_dict.get('init_string', None)
-    init_string_app = request_dict.get('init_string_app', None)
+    platform = request_dict.get('platform', '')
+    init_string = request_dict.get('init_string', '')
+    init_string_app = request_dict.get('init_string_app', '')
 
-    if not all([vpg_id, platform, init_string, init_string_app]):
+    if not vpg_id:
         return response.json(444)
 
     bulk = []

+ 5 - 3
Model/models.py

@@ -81,9 +81,9 @@ class Permissions(models.Model):
 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 组件
+    name = models.CharField(max_length=50,  null=True, default='', verbose_name='名称')   #首字母大写,一定要与vue文件的name对应起来,用于noKeepAlive缓存控制(该项特别重要)
+    path = models.CharField(max_length=100, null=True, default='',verbose_name='路径')
+    component = models.CharField(max_length=100, null=True, 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'是否隐藏一级路由')
@@ -98,6 +98,8 @@ class MenuModel(models.Model):
     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='重定向')
+    menu_code = models.CharField(max_length=100, default='', verbose_name='菜单编码')
+    menutype  = models.SmallIntegerField(default=1, verbose_name=u'类型') #类型: 1-菜单 2-按钮
     sort = models.IntegerField(default=0, verbose_name='排序')
 
     class Meta:

+ 1 - 0
Service/CommonService.py

@@ -39,6 +39,7 @@ class CommonService:
     # 格式化query_set转dict
     @staticmethod
     def request_dict_to_dict(request_dict):
+        # 传参格式转换,键包含meta获取meta[]中的值,值'true'/'false'转为True,False
         key_list = []
         value_list = []
         for k, v in request_dict.items():