后台管理系统 – 页面布局设计

后台管理系统 – 页面布局设计前端的中后台管理系统相比于其他普通项目,从开发设计的角度来说有几点比较特殊:一个是权限设计,具体实现可参考:传送门。一个是页面布局的设计,也是本文要说的。一个好的页面布局设计,无论是对于页面布局的稳定性,还是系统功能拓展的方便性,亦或是用户体验上,都有着重要的提升作用。一、市面参考先来看看市面上的一些优秀的开源系统项目的页面布局。1、vue-element-adminvue-element-admin是vue框架的一个优秀的后台管理系统开源项目,目前star数75k,也是我入行前端的启

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前端的中后台管理系统相比于其他普通项目,从开发设计的角度来说有几点比较特殊:

  • 一个是权限设计,具体实现可参考:传送门
  • 一个是页面布局的设计,也是本文要说的。一个好的页面布局设计,无论是对于页面结构的稳定性,还是功能拓展的方便性,亦或是用户体验上,都有着重要的作用。

一、市面参考

先来看看市面上的一些优秀的开源系统项目的页面布局。

1、vue-element-admin

vue-element-admin 是 vue 框架的一个优秀的后台管理系统开源项目,目前star数75k。

vue-element-admin采用的是侧边菜单布局,侧边菜单 + 顶部导航 + 内容区域,这也是我个人最推崇的布局方式。

后台管理系统 - 页面布局设计

2、ant design pro

ant design pro 有提供三种布局。

(1)顶部菜单布局

即:顶部导航菜单 + 内容区域。

这种方式布局简单,但缺点很明显,菜单都挤在顶部导航区域,在菜单项越来越多时就放不下了,很难处理,可扩展性不强。

后台管理系统 - 页面布局设计

(2)侧边菜单布局

侧边菜单 + 顶部导航 + 内容区域。

同vue-element-admin类似,主要区别就是antd pro的面包屑导航是另起一行单独放的,这样挤压了内容区域的空间,个人觉得还是放在顶部和右上角的快捷按钮放同一行最好。

后台管理系统 - 页面布局设计

(3)混合菜单布局

其实和侧边菜单布局大同小异,还是属于侧边菜单布局的范畴。

只不过这样布局的话,面包屑导航就不适合和顶部放一行了,只能另起一行。

后台管理系统 - 页面布局设计

二、选型

参考市面上比较优秀的两款项目模板的布局后,个人还是觉得vue-element-admin的布局方式更胜一筹。

文本就围绕这种布局结构来设计。

效果图:

后台管理系统 - 页面布局设计

其实技术选型不那么重要,无论是react还是vue,element或是antd,思路一致,都只是实现代码的差异而已。

对于侧边栏菜单和面包屑导航,element和antd都有相应的组件可以直接使用,其他的手写实现。

三、css布局

良好的css布局代码才能保证页面布局的稳定性。

而对于整体布局来说,flex是首选,稳定性更好,不兼容ie9。

这里将整体布局封装成组件PageLayout

(1)首先,设置侧边栏右侧的盒子撑满屏幕剩余宽度。
flex布局有个特性是:只对一个子元素设置flex: 1属性时,该子元素默认会撑满父容器的剩余空间。

.c-PageLayout-index { 
   
  width: 100%;
  height: 100%;
  display: flex; .appMainWrap { 
   
    height: 100%;
    flex: 1; // 占据屏幕剩余宽度
    position: relative;
    padding-top: 50px; // 留出顶部导航栏区域,顶部导航栏使用悬浮置顶。
  }
  .appMain { 
   
    height: 100%;
    overflow: auto;
    padding: 15px; // 内容区域可以在这里统一设置下边距
  }
}
  • c-PageLayout-index 页面整体容器
  • appMainWrap 侧边栏右侧的(顶部导航区域 + 内容区域)容器
  • appMain 内容区域容器

(2)侧边菜单区域默认撑满高度,宽度可交给antd组件自适应,也可以自己设死。

.c-PageLayout-sideBar { 
   
  height: 100%;
  overflow: auto;
}

(3)顶部导航区域悬浮置顶。

.c-PageLayout-headBar { 
   
  height: 50px;
  display: flex;
  justify-content: space-between;
  position: absolute;
  top: 0;
  right: 0;
  width: 100%;
}

四、侧边栏菜单

侧边栏的实现方式是难点,因为这里即涉及到如何和路由数据匹配,又涉及权限的筛选。

侧边栏最好是和路由配置共用一套数据,方便扩展和维护,这里得益于 react-router-waiter 已经封装好的路由管理方案(类vue-router),所以直接读取路由配置数据,动态生成菜单组件结构。

后台管理系统 - 页面布局设计

路由配置数据:

import PageLayout from '@/components/PageLayout'
import { 
    HomeOutlined } from '@ant-design/icons'

const routes: RoutesTypeNew = [
  { 
   
    path: '/',
    element: <PageLayout />,
    children: [
      { 
   
        path: 'index',
        component: () => import(/* webpackChunkName: "index" */ '@/views/index/index'),
        meta: { 
   
          title: '首页',
          icon: <HomeOutlined />,
          accessId: '10000',
        }
      },
    ]
  },
]
  • 如有点击跳转外链的菜单场景,可以在routes里添加个自定义的配置对象,例如通过url属性指代外链地址。

动态生成菜单:

// 递归获取层级菜单
function getMenuList () { 
   
  const getList: any = (routeList = [], prePath = '') => { 
   
    let menuList: JSX.Element[] = []
    routeList.forEach((v: RoutesItemTypeNew) => { 
   
      if (v.path === '/') { 
   
        menuList = menuList.concat(getList(v.children, '/'))
      } else { 
   
        const currentPath = prePath + v.path
        if (v.children) { 
   
          menuList.push((
            <SubMenu key={ 
   currentPath} icon={ 
   v.meta.icon} title={ 
   v.meta.title}>
              { 
   getList(v.children, currentPath + '/')}
            </SubMenu>
          ))
        } else { 
   
          menuList.push((
            <ItemMenu key={ 
   currentPath} icon={ 
   v.meta.icon}>
              <Link to={ 
   currentPath}>{ 
   v.meta.title}</Link>
            </ItemMenu>
          ))
        }
      }
    })
    return menuList
  }
  return getList(routes)
}
  • 如需要对权限路由做筛选,通过在路由配置数据meta里添加accessId字段作为路由权限id,然后在遍历routeList时,读取该accessId做权限判断。

五、面包屑导航

要使用面包屑导航,需要对路由路径配置有一定的约束规则,即,配置path路径时不要随意使用斜杠/划分,只通过嵌套路径自动划分路径。

这样才能对路由完整路径通过/分隔并匹配,来生成对应的面包屑导航数据。

后台管理系统 - 页面布局设计

首先,写个方法,遍历路由,生成路由路径和路由meta字段的映射数据:

function getRouteMetaMap () { 
   
  const getMap: any = (routeList = [], prePath = '') => { 
   
    let map = { 
   }
    routeList.forEach((v: RoutesItemTypeNew) => { 
   
      let currentPath = prePath + v.path
      if (v.path === '/') { 
   
        currentPath = ''
      } else { 
   
        map = { 
   
          ...map,
          [currentPath]: v.meta || { 
   }
        }
      }
      if (v.children) { 
   
        map = { 
   
          ...map,
          ...getMap(v.children, currentPath + '/')
        }
      }
    })
    return map
  }
  return getMap(routes)
}
  • 映射数据示例:
    { 
         
        "/index": { 
         
            "title": "首页",
            "accessId": "10000"
        },
        "/nest": { 
         
            "title": "多级菜单",
        },
        "/nest/nest1": { 
         
            "title": "二级菜单1"
        },
        "/nest/nest1/nest11": { 
         
            "title": "三级菜单11"
        }
    }
    

然后,获取当前路由完整路径(例如:/nest/nest1/nest11),再通过/分隔成多段子路由,和上述getRouteMetaMap方法取到的映射数据匹配,获取子路由的title标题组合成面包屑(多级菜单 / 二级菜单1 / 三级菜单11),展示出来。

const routeMetaMap = getRouteMetaMap()
const pathSnippets = location.pathname.split('/').filter(i => i)
const extraBreadcrumbItems = pathSnippets.map((_, index) => { 
   
  const url = `/${ 
     pathSnippets.slice(0, index + 1).join('/')}`
  return (
    <Breadcrumb.Item key={ 
   url}>
      <span>{ 
   routeMetaMap[url].title}</span>
    </Breadcrumb.Item>
  )
})

本文示例项目源码:react-antd-mobx-admin


参考链接:
https://panjiachen.gitee.io/vue-element-admin/
https://preview.pro.ant.design/form/basic-form

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/194951.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 汇编语言之Debug教程篇

    参考书籍《汇编语言》——王爽Debug的命令比较多,这里我介绍常用的命令,其余的等需要的时候再进行查询。命令用途Debug-R查看、改变CPU寄存器的内容Debug-D查看内存中的内容Debug-E改写内存中的内容Debug-U将内存中的机器指令翻译成汇编指令Debug-T执行一条机器指令…

  • pycharm向左缩进_pycharm取消缩进快捷键

    pycharm向左缩进_pycharm取消缩进快捷键在使用pycharm时,经常会需要多行代码同时缩进、左移,pycharm提供了快捷方式1、pycharm使多行代码同时缩进鼠标选中多行代码后,按下Tab键,一次向右缩进四个字符2、pycharm使多行代码同时左移鼠标选中多行代码后,同时按住shift+Tab键,一次向左移四个字符另外:在使用pycharm过程中光标变粗,此时变成了改写模式,只需要按下键盘的insert键即可…

  • jdk下载与安装[通俗易懂]

    1.JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html安装完成后,需要进行环境变量的配置,右键我的电脑—属性—-高级系统设置就会看到下面的界面:2.点击环境变量,开始坏境变量的配置:(1)点击系统变量下的新建按钮,变量名JAVA_HOME(代表你的JDK安装路径),值对应的是你的JDK的安装路径。(2)继续在系统变量里面新建一个CLASSPATH变量,其变量值如下图所示:….

  • 创业之路_小项目创业网

    创业之路_小项目创业网美国《时代周刊》评论曾经有这样一段话,“在21世纪,改变你命运的只有你自己,别期盼有人会来帮助你。从现在开始,‘学习、改变、创业’是通往新世界的唯一道路”。决心创业并已参加培训的学员勇敢地迈出了第一步,只要能吃苦耐劳,勇于开拓,勤于学习,坚忍不拔,一定能实现自己心中的目标。创业,是一个发现和捕捉机会,并由创造出新颖的产品,提升服务,实现其潜在价值的过程。创业能否成功,与创业者的素质…

  • 常用的DNS服务器_国内目前最快的DNS

    常用的DNS服务器_国内目前最快的DNS北京联通      202.106.0.20   202.106.196.115阿里              223.5.5.5 223.6.6.6114              114.114.114.114南方电信      180.153.225.136百度              180.76.76.76360                 101.226….

  • QQ分享 QQ空间分享 API链接:

    QQ分享 QQ空间分享 API链接:

    2021年10月29日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号