>>分享流行的Java框架以及开源软件,对孙卫琴的《精通Spring:Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 18768 个阅读者 刷新本主题
 * 贴子主题:  【项目实践】使用Vue.js和ElementUI快速实现后台管理系统的界面布局 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-07-13 00:30:51     消息  查看  搜索  好友  邮件  复制  引用

    

前言

大家都知道,后台管理界面不需要很酷炫的动画效果,也不需要花里胡哨的界面布局,只需要简洁易用、清爽明了的界面以便于管理数据。而现在普遍的后台管理系统的界面布局都差不多,上中下结构,然后左边是导航栏。随便贴两个Bootstrap的主题模板就是这样的:

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     这其中难的不是布局,而是如何点击左侧导航栏来渲染中央显示界面(路由)。在这里我会用Vue.js和ElementUI来快速搭建起这样的后台管理界面布局!

准备

本文搭建项目时的工具以及版本号如下:
  node.js  -- v12.16.1

     npm  -- 6.13.4

     @vue/cli  -- 4.2.2
版本有差异也没有事情,变化不会太大。

     首先,通过Vue-cli工具来快速搭建起一个Vue的项目(这里就不讲解怎么用Vue-cli搭建项目了,文末有项目的github演示地址,下载下来即可运行)

     项目搭建好后呢,接下来要导入我们要用的组件,我在这里会用到ElementUI和font-awesome图标(当然也可以直接使用ElementUI中的图标)。

使用npm来安装两个工具:


npm install element-ui

npm install font-awesome

安装完毕后,在 main.js里导入两个工具,这样才能在项目中使用:    

import Vue from 'vue'
import App from './App.vue'
import router from './router'

// 导入ElementUI
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 导入font-awesome(导入就可以直接用了)
import 'font-awesome/scss/font-awesome.scss'

// 使用ElementUI
Vue.use(ElementUI);

Vue.config.productionTip = false

new Vue({
    router,
    render: h => h(App)
}).$mount('#app')

配置路由

所有都准备好了后,我们来修改App.vue文件,这个是整个项目的界面入口,所以我们在这里定义好最基本的视图:    

<template>
    <div id="app">
        <!--主路由视图-->
        <router-view/>
    </div>
</template>

<style lang="scss">
    // 整体布局样式,让整个视图都铺满
    html, body, #app {
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
    }
</style>

  视图配置好后,接下来要配置路由设置,我们先新建四个页面组件:Main.vue,Index.Vue,Setting.vue,404.vue。这个等下都要用的,其中Index.Vue和Setting.vue都是Main.vue的嵌套路由,这里为了做演示,Index.vue和Setting.vue里面就只写一个简单的一级标题。此时我们的项目结构如下:

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     然后我们在router的js文件里开始配置路由,注意看注释:    

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

const routes = [
    {
        // 重定向,用来指向一打开网页就跳转到哪个路由
        path: '/',
        redirect: '/main'
    },
    {
        // 首页
        path: '/main',
        name: 'Main',
        component: () => import('../views/Main.vue'),
        children:[// 开始嵌套路由,这下面的所有路由都是Main路由的子路由
            {
                path:'/', // 嵌套路由里默认是哪个网页
                redirect: '/index'
            },
            {
                path:'/index', // 首页的路由
                name:'Index',
                component:() => import('../views/Index.vue')
            },
            {
                path:'/setting', // 设置页面的路由
                name:'Setting',
                component:() => import('../views/Setting.vue')
            }
        ]
    },
    {
        path:'/*', // 注意,这里不是嵌套路由了,这是为了设置404页面,一定要放在最后面,这样当服务器找不到页面的时候就会全部跳转到404
        name:'404',
        component: () => import('../views/404.vue')
    }
]

const router = new VueRouter({
    mode: 'history',
    base: process.env.BASE_URL,
    routes
})

export default router

  路由是配置好了,接下来就是最重要的 Main.vue里的布局

布局

我们先在 Main.vue里布置最基本的结构,即上中下,中间又分左右:    

<template>
    <el-container>
        <!--顶部-->
        <el-header></el-header>

        <!--中央区域-->
        <el-main>
            <el-container>
                <!--左侧导航栏-->
                <el-aside></el-aside>
                <!--主内容显示区域,数据内容都是在这里面渲染的-->
                <el-main></el-main>
            </el-container>
        </el-main>

        <!--底部-->
        <el-footer></el-footer>
    </el-container>
</template>

  这样最基本的布局就好了,我们接下来只需要在对应的区域渲染好内容就行,这里最主要的就是使用ElementUI其中的路由功能。

     我们将 Main.vue里的内容完整给写好,注意看注释:    

<template>
    <el-container>
        <!--顶部-->
        <el-header style="border-bottom: 1px solid gray;">
            <el-row style="margin: 10px 15px">
                <el-col :span="1">
                    <!--收缩条-->
                    <a href="#" @click="changeCollapse" style="font-size: 25px;color:#909399;"><i
                            :class="collpaseIcon"></i></a>
                </el-col>
            </el-row>
        </el-header>
        <!--中央区域-->
        <el-main>
            <el-container>
                <!--左侧导航栏-->
                <el-aside :style="{width:collpaseWidth}">
                    <!--default-active代表导航栏默认选中哪个index, :collapse决定导航栏是否展开,为boolean类型
                    :router决定导航栏是否开启路由模式,即在菜单item上设置路由是否生效,值为boolean类型-->
                    <el-menu
                            default-active="0"
                            class="el-menu-vertical-demo"
                            :collapse="isCollapse"
                            :router="true"
                    >
                        <!--index设置当前item的下标,:route则是传一个对象进行,指定路由-->
                        <el-menu-item index="0" :route="{name:'Index'}">
                            <i class="fa fa-magic"></i>
                            <span slot="title"> 首页</span>
                        </el-menu-item>

                        <el-submenu index="1">
                            <template slot="title">
                                <i class="fa fa-cogs"></i><span> 系统管理</span>
                            </template>

                            <el-menu-item index="/Setting" :route="{name:'Setting'}"><i class="fa fa-cog"></i> 网站设置
                            </el-menu-item>
                            <el-menu-item index="1-2"><i class="fa fa-user-circle-o"></i> 角色管理</el-menu-item>
                            <el-menu-item index="1-2"><i class="fa fa-object-group"></i> 店铺模板</el-menu-item>
                        </el-submenu>

                        <el-submenu index="2">
                            <template slot="title">
                                <i class="fa fa-users"></i>
                                <span> 会员管理</span>
                            </template>

                            <el-menu-item index="2-1" :route="{name:'Customer'}"><i class="fa fa-address-card-o"></i>
                                会员列表
                            </el-menu-item>
                            <el-menu-item index="2-2"><i class="fa fa-envelope-o"></i> 会员通知</el-menu-item>
                        </el-submenu>

                        </el-menu>

                </el-aside>
                <!--主内容显示区域-->
                <el-main>
                    <!--路由渲染-->
                    <router-view></router-view>
                </el-main>
            </el-container>
        </el-main>
        <!--底部-->
        <el-footer style="border-top: 1px solid gray"></el-footer>
    </el-container>
</template>

<script>
    // 这一大段JS就是为了做收缩/展开导航栏而用的!
    export default {
        name: "Main",
        data: function () {
            return {
                isCollapse: false, // 决定左侧导航栏是否展开
            }
        },
        computed: {
            collpaseIcon: function () { // 左侧导航栏是否展开状态的图标
                // 如果是展开状态就图标向右,否则图标向左
                return this.isCollapse ? 'el-icon-s-fold' : 'el-icon-s-unfold';
            },
            collpaseWidth: function () { // 左侧导航栏是否展开状态的宽度
                // 如果是展开状态就导航栏宽度为65px,否则200px
                return this.isCollapse ? '65px' : '200px';
            }
        },
        methods: {
            changeCollapse: function () { // 更改左侧导航栏展示状态
                this.isCollapse = !this.isCollapse;
            }
        }
    }
</script>

<style scoped>
    /*整体显示区域布局样式*/
    .el-container {
        height: 100%;
    }

    .el-header, .el-main {
        padding: 0;
    }

    /*左边导航栏具体样式*/
    .el-menu-vertical-demo.el-menu {
        padding-left: 20px;
        text-align: left;
        height: 100%;
        padding: 0;
    }

    el-container > .el-menu-vertical-demo.el-menu {
        padding: 0;
    }

    .el-submenu .el-menu-item, .el-menu-item {
        min-width: 50px;
    }

    .el-menu-item {
        padding: 0;
    }
</style>

  这时候页面就已经做好了,我们来看下效果:

                点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

     项目github地址如下:

     https://github.com/RudeCrab/rude-java/tree/master/project-practice/vue-route-demo

     clone到本地即可运行,如果对你有帮助请在github上点个star,我还会继续更新更多【项目实践】哦!


----------------------------
原文链接:https://www.jianshu.com/p/9bf451f36088

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-08-23 21:35:49 重新编辑]
  Java面向对象编程-->变量的作用域和初始化
  JavaWeb开发-->自定义JSP标签(Ⅱ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->用Swing组件展示HTML文档
  精通Spring-->CSS过渡和动画
  Vue3开发-->组合(Composition)API
  Spring boot参考指南
  如何编写优雅的Spring架构API
  微服务的拆分方式
  Spring 自动注入的三种方式:byName、byType、constructor
  国内 Java 开发者必备的两个神器:Maven国内镜像和Spring国内...
  Nginx安装及配置
  RESTful API 设计最佳实践
  理解 RESTful 风格的 API
  Nginx技术探秘
  微服务中的Kafka与Micronaut
  Gradle入门
  一份Spring Boot核心知识清单
  Spring Boot整合WebSocket及Spring Security实例
  Axis、Axis2和CXF比较
  Spring与MyBatis整合
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。