美文网首页
simpleui权限交互二次开发

simpleui权限交互二次开发

作者: 修行的修行 | 来源:发表于2021-06-10 21:21 被阅读0次

    介绍

    simpleui库是想做django开发但是前端不熟练同学的福音。
    它是Django Admin的一个主题,基于element-ui+vue开发,重写和优化90%以上的页面。
    Django Admin默认界面设计语言存在着的一些不足,比如色彩单一,大量线条的使用,分割化明显。将这些不足归类一下就是界面单调、雷同性明显、缺少惊喜。

    安装

    pip install django-simpleui
    

    用pip或者源码方式安装simpleui后,在自己项目的settings.py文件中INSTALLED_APPS的第一行加入simpleui。

    举个例子:

    INSTALLED_APPS = [
          'simpleui',
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          ...
      ]
    

    更多simpleui的settings配置请看https://simpleui.72wo.com/docs/simpleui/

    常见问题

    如果关闭debug模式后,请执行以下命令将simpleui静态文件静态文件克隆到根目录

    python3 manage.py collectstatic
    

    克隆静态文件出错 请在settings.py文件中加入

    STATIC_ROOT = os.path.join(BASE_DIR, "static")
    

    二次开发

    1.二次开发的原因

    settings.py的SIMPLEUI_CONFIG,虽然可以做到配置admin页面左边的模块展示和模块下拉项,但是无法和用户权限产生交互。用户无权限访问的模块,依旧会显示在页面左边,点击会返回403,十分的不美观。如图所示

    image

    2.如何对simpleui进行二次开发

    删除已经pip成功的simple库

    pip uninstall django-simpleui
    

    克隆simpleui源码到项目下,和其它app同级别。
    修改simpleui/templatetags/simpletags.py文件的menus方法调整models的显示权限控制

    源代码逻辑:
    1.app_list = context.get('app_list')取出系统允许显示的菜单进行处理
    2.读取SIMPLEUI_CONFIG设置合并菜单处理
    3.menu_display一级菜单的排序和过滤处理

    修改步骤:

    1. 干掉系统菜单显示权限逻辑
    image
    2. 读取SIMPLEUI_CONFIG设置合并菜单处理

    对普通用户未拥有权限的展示模块进行去除 , 超级用户不检测权限直接不参与去除。

    key = 'system_keep'
    if config and 'menus' in config:
        total = config.get('menus')
        user_permissions = context.request.user.get_user_permissions()
        for level_one_menu in total:
            # 与一级菜单codename比对权限
            if 'codename' not in level_one_menu or (True in [(True if level_one_menu['codename'] in u_p else False) for u_p in user_permissions]) == False:
                if context.request.user.is_superuser == False:
                    continue
            # 处理面包屑
            if 'models' in level_one_menu:
                del_models = list()
                for level_two_menu in level_one_menu.get('models'):
                    if context.request.user.is_superuser:
                        pass
                    elif 'codename' not in level_two_menu.keys():
                        del_models.append(level_two_menu)
                        continue
                    elif ('codename' not in level_one_menu or 'codename' not in level_two_menu
                            or (level_one_menu['codename'] +'.'+level_two_menu['codename'] not in user_permissions)) and \
                            (level_one_menu['codename'] + '.view_' + level_two_menu['codename'] not in user_permissions) \
                            and (level_one_menu['codename'] + '.add_' + level_two_menu['codename'] not in user_permissions) \
                            and (level_one_menu['codename'] + '.change_' + level_two_menu['codename'] not in user_permissions) \
                            and (level_one_menu['codename'] + '.delete_' + level_two_menu['codename'] not in user_permissions) \
                            and level_two_menu['codename'] not in user_permissions:
                        del_models.append(level_two_menu)
                        continue
                    level_two_menu['breadcrumbs'] = [{
                       'name': level_one_menu.get('name'),
                        'icon': level_one_menu.get('icon')
                    }, {
                        'name': level_two_menu.get('name'),
                        'icon': level_two_menu.get('icon')
                    }]
                for del_m in del_models:
                    level_one_menu['models'].remove(del_m)
            else:
                level_one_menu['breadcrumbs'] = [{
                    'name': level_one_menu.get('name'),
                    'icon': level_one_menu.get('icon')
                }]
            if len(level_one_menu['models']) > 0:
                data.append(level_one_menu)
    else:
        data = config.get('menus')
    
    3. menu_display一级菜单的排序和过滤处理

    获取侧边栏排序, 如果设置了就按照设置的内容排序, 留空则表示默认排序以及全部显示

    if config.get('menu_display') is not None:
        display_data = list()
        for _app in data:
            if _app['name'] not in config.get('menu_display'):
                continue
            # 处理二级菜单显示权限
            if _app.get('menu_display') is not None:
                display_model = list()
                for _app_m in _app['models']:
                    if _app_m['name'] not in _app.get('menu_display'):
                        continue
                # 没有排序逻辑,这里的_weight暂时无效
                _app['_weight'] = config.get('menu_display').index(_app['name'])
                display_data.append(_app)
            else:
                display_model = _app['models']
            _app['models'] = display_model
            _app['_weight'] = config.get('menu_display').index(_app['name'])
            display_data.append(_app)
    
        display_data.sort(key=lambda x: x['_weight'])
        data = display_data
    
    4.settings.py下simpleui_config写法

    只填写一级菜单的codename或不填一级菜单和二级菜单的codename,表示该只允许superuser查看。
    一级菜单的codename必须为app名,二级菜单的codename可通过get_user_permissions方法查看具体的权限名。

    SIMPLEUI_CONFIG = {
        'system_keep':False,
        'dynamic':True,  # 重要,动态更新页面,不然给用户增加权限后界面可能不改变
        'menus': [
            {
            'name': '定时任务',
            'codename': 'django_celery_beat',
            'models': [{
                'name': 'periodictask',
                'url': '/admin/django_celery_beat/periodictask/',
            },{
                'name': 'crontabschedule',
                'url': '/admin/django_celery_beat/crontabschedule/',
            },{
                'name': 'intervalschedule',
                'url': '/admin/django_celery_beat/intervalschedule/',
            },
            {
            'name': '爬虫管理',
            'codename':'spiders_process',
            'models': [{
                'codename':'add_demandsubmit',
                'name': '需求提交',
                'url': '/admin/spiders_process/demandsubmit/',
            },{
                'codename':'add_errorfeedback',
                'name': '异常反馈',
                'url': '/admin/spiders_process/errorfeedback/',
            },{
                'codename':'view_users',
                'name': '用户管理',
                'url': '/admin/spiders_process/users/',
            }
               ]
            },
            {
                'codename':'auth',
                'name': '认证和授权',
                'models': [{
                    'name': '组',
                    'url': '/admin/auth/group/'}, ]
            },
            {
                'name': '数据下载',
                'codename': 'spiders_process',
                'models': [{
                    'codename': 'data_download',
                    'name': '数据下载',
                    'url': '/data_download/'}, ]
            },
            {
                'name': '任务监控',
                'codename': 'spiders_process',
                'models': [{
                    'name': '任务监控',
                    'url': '/flower/'}, ]
            },
        ]
    } 
    

    相关文章

      网友评论

          本文标题:simpleui权限交互二次开发

          本文链接:https://www.haomeiwen.com/subject/gcmpeltx.html