vue项目之主页布局
1.背景
2.基本结构

代码:

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>Header</el-header>
<el-container>
<!--左侧-->
<el-aside width="200px">Aside</el-aside>
<!--主题-->
<el-main>Main</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px; > div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
}
</style>
3.头部

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>
<div>
<img src="../assets/ldp.png">
<span>后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<el-container>
<!--左侧-->
<el-aside width="200px">Aside</el-aside>
<!--主题-->
<el-main>Main</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px; > div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
}
</style>
4.左侧菜单

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>
<div>
<img src="../assets/ldp.png">
<span>后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<el-container>
<!--左侧-->
<el-aside width="200px">
<!--左侧菜单区域-->
<el-menu
default-active="2"
class="el-menu-vertical-demo"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b">
<!-- 一级菜单-->
<el-submenu index="1">
<!-- 一级菜单模板区-->
<template slot="title">
<i class="el-icon-location"></i>
<span>导航一</span>
</template>
<!-- 二级菜单-->
<el-menu-item index="1-1">
<!-- 二级菜单模板区-->
<template slot="title">
<i class="el-icon-location"></i>
<span>导航一.1</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<!--主题-->
<el-main>Main</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px;
> div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
}
</style>
5.请求统一配置token
// 设置请求token
axios.interceptors.request.use(config => {
// console.log(config)
config.headers.Authorization = window.sessionStorage.getItem('token')
// 在最后必须 return config
return config
})
6.菜单遍历

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>
<div>
<img src="../assets/ldp.png">
<span>后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<el-container>
<!--左侧-->
<el-aside width="200px">
<!--左侧菜单区域-->
<el-menu
default-active="2"
class="el-menu-vertical-demo"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b">
<!-- 一级菜单-->
<el-submenu v-for=" item in menuList" :index="item.id+''" :key="item.id">
<!-- 一级菜单模板区-->
<template slot="title">
<i class="el-icon-location"></i>
<span>{{item.authName}}</span>
</template>
<!-- 二级菜单-->
<el-menu-item :index="itemChild.id+''" :key="itemChild.id" v-for="itemChild in item.children">
<!-- 二级菜单模板区-->
<template slot="title">
<i class="el-icon-location"></i>
<span>{{itemChild.authName}}</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<!--主题-->
<el-main>Main</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
data() {
// 菜单
return {menuList: []}
},
// 模块加载的时候就执行
created() {
this.getMenuList()
},
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
},
// 获取菜单数据
async getMenuList() {
const {data: result} = await this.$http.get('menus')
console.log(result)
if (result.meta.status !== 200) return this.$message.error(result.meta.msg)
this.menuList = result.data
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px; > div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
}
</style>
7.只展开一个菜单


8.折叠菜单

代码:

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>
<div>
<img src="../assets/ldp.png">
<span>后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<el-container>
<!--左侧-->
<el-aside :width="isCollapse?'60px':'200px'">
<div class="toggle-button" @click="toggleBtn"><<>></div>
<!--左侧菜单区域-->
<el-menu
default-active="2"
class="el-menu-vertical-demo"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b" unique-opened :collapse="isCollapse" :collapse-transition="false">
<!-- 一级菜单-->
<el-submenu v-for=" item in menuList" :index="item.id+''" :key="item.id">
<!-- 一级菜单模板区-->
<template slot="title">
<i :class="iconObj[item.id]"></i>
<span>{{item.authName}}</span>
</template>
<!-- 二级菜单-->
<el-menu-item :index="itemChild.id+''" :key="itemChild.id" v-for="itemChild in item.children">
<!-- 二级菜单模板区-->
<template slot="title">
<i class="el-icon-menu"></i>
<span>{{itemChild.authName}}</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<!--主题-->
<el-main>Main</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
data() {
// 菜单
return {menuList: [],
// 是否折叠左侧菜单
isCollapse:false,
iconObj:{
'125':'el-icon-user',
'103':'el-icon-coordinate',
'101':'el-icon-s-goods',
'102':'el-icon-tickets',
'145':'el-icon-s-operation'
}}
},
// 模块加载的时候就执行
created() {
this.getMenuList()
},
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
},
// 折叠菜单
toggleBtn(){
this.isCollapse=!this.isCollapse
},
// 获取菜单数据
async getMenuList() {
const {data: result} = await this.$http.get('menus')
console.log(result)
if (result.meta.status !== 200) return this.$message.error(result.meta.msg)
this.menuList = result.data
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px; > div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
} .toggle-button {
background-color: #4a5064;
font-size: 10px;
line-height: 24px;
color: #fff;
text-align: center;
letter-spacing: 0.2em;
cursor: pointer;
}
</style>
9.主页里的首页实现
1.编写主页

2.配置路由

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/components/Login'
import Home from '@/components/Home'
import Welcome from '@/components/Welcome' Vue.use(Router)
const routerChildren = [
{
path: '/welcome',
name: 'Welcome',
component: Welcome
}
]
const router = new Router({
routes: [
{
path: "/",
redirect: "/login"
},
{
path: '/login',
name: 'Login',
component: Login
}
,
{
path: '/home',
name: 'Home',
redirect: "/welcome",
component: Home,
children: routerChildren
}
]
})
router.beforeEach((to, from, next) => {
// to 将要访问的路径
// from 从哪里跳转来的
// next 放行 // 判断是不是登录登录,登录路径直接放行
if (to.path == '/login') {
next()
return
}
// 获取token,看是否有token,有token放行
const token = window.sessionStorage.getItem("token")
if (!token) {
next('/login')
return;
}
// 放行
next();
})
export default router
3.设置路由占位
<!--主题-->
<el-main>
<!-- 路由占位符 -->
<router-view></router-view>
</el-main>
10.路由到各个子菜单
1.开启子菜单路由

2.index设置路由地址

3.编写各个路由组件
4.配置路由地址

import Vue from 'vue'
import Router from 'vue-router'
import Login from '@/components/Login'
import Home from '@/components/Home'
import Welcome from '@/components/Welcome'
import User from '@/components/user/User' Vue.use(Router)
const routerChildren = [
{
path: '/welcome',
name: 'Welcome',
component: Welcome
},
{
path: '/users',
name: 'User',
component: User
}
]
const router = new Router({
routes: [
{
path: "/",
redirect: "/login"
},
{
path: '/login',
name: 'Login',
component: Login
}
,
{
path: '/home',
name: 'Home',
redirect: "/welcome",
component: Home,
children: routerChildren
}
]
})
router.beforeEach((to, from, next) => {
// to 将要访问的路径
// from 从哪里跳转来的
// next 放行 // 判断是不是登录登录,登录路径直接放行
if (to.path == '/login') {
next()
return
}
// 获取token,看是否有token,有token放行
const token = window.sessionStorage.getItem("token")
if (!token) {
next('/login')
return;
}
// 放行
next();
})
export default router
11.子路由激活状态设置

代码:

<template>
<el-container class="home-container">
<!-- 头部-->
<el-header>
<div>
<img src="../assets/ldp.png">
<span>后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
<el-container>
<!--左侧-->
<el-aside :width="isCollapse?'60px':'200px'">
<div class="toggle-button" @click="toggleBtn"><<>></div>
<!--左侧菜单区域-->
<el-menu
default-active="2"
class="el-menu-vertical-demo"
background-color="#545c64"
text-color="#fff"
active-text-color="#ffd04b"
unique-opened router
:collapse="isCollapse"
:collapse-transition="false"
:default-active="defaultActive">
<!-- 一级菜单-->
<el-submenu v-for=" item in menuList" :index="'/'+item.path" :key="item.id">
<!-- 一级菜单模板区-->
<template slot="title">
<i :class="iconObj[item.id]"></i>
<span>{{item.authName}}</span>
</template>
<!-- 二级菜单-->
<el-menu-item
:index="'/'+itemChild.path"
:key="itemChild.id"
v-for="itemChild in item.children"
@click="clickMenuItem('/'+itemChild.path)">
<!-- 二级菜单模板区-->
<template slot="title">
<i class="el-icon-menu"></i>
<span>{{itemChild.authName}}</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
<!--主题-->
<el-main>
<!-- 路由占位符 -->
<router-view></router-view>
</el-main>
</el-container>
</el-container>
</template> <script>
export default {
name: "Home",
data() {
// 菜单
return {
menuList: [],
// 是否折叠左侧菜单
isCollapse: false,
defaultActive:'',
iconObj: {
'125': 'el-icon-user',
'103': 'el-icon-coordinate',
'101': 'el-icon-s-goods',
'102': 'el-icon-tickets',
'145': 'el-icon-s-operation'
}
}
},
// 模块加载的时候就执行
created() {
this.getMenuList()
},
methods: {
// 退出登录
logout() {
window.sessionStorage.clear()
this.$router.push("/login")
},
// 折叠菜单
toggleBtn() {
this.isCollapse = !this.isCollapse
},
// 菜单点击
clickMenuItem(path){
window.sessionStorage.setItem("activePath",path)
this.defaultActive=path
},
// 获取菜单数据
async getMenuList() {
const {data: result} = await this.$http.get('menus')
console.log(result)
if (result.meta.status !== 200) return this.$message.error(result.meta.msg)
this.menuList = result.data
}
}
}
</script> <style lang="less" scoped>
.home-container {
height: 100%;
} .el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #fff;
font-size: 20px; > div {
display: flex;
align-items: center; span {
margin-left: 15px;
}
}
} .el-aside {
background-color: #333744; .el-menu {
border-right: none;
}
} .el-main {
background-color: #eaedf1;
} .toggle-button {
background-color: #4a5064;
font-size: 10px;
line-height: 24px;
color: #fff;
text-align: center;
letter-spacing: 0.2em;
cursor: pointer;
}
</style>
完美!
vue项目之主页布局的更多相关文章
- vue后台管理系统——主页布局
电商后台管理系统的功能--页面的整体布局 1. 整体布局 整体布局:先上下划分,再左右划分. 需要使用到ElementUI中提供的Container组件 <el-container> &l ...
- webpack+vue项目实战(四,前端与后端的数据交互和前端展示数据)
地址:https://segmentfault.com/a/1190000010063757 1.前言 今天要做的,就是在上一篇文章的基础上,进行功能页面的开发.简单点说呢,就是与后端的数据交互和怎么 ...
- 一步一步搭建vue项目
1 安装步骤 创建一个目录,我们这里定义为Vue 在Vue目录打开dos窗体,输入如下命令:vue create myproject 选择自定义 4. 先选择要安装的项目,我们这里选择4个 5 ...
- Vue项目开发相关问题总结
Vue项目开发相关问题总结 一.创建一个项目(两种方式) 1.通过CLI命令行创建,具体步骤如下: (1)Node 版本要求 Vue CLI 需要 Node.js 8.9 或更高版本 (推荐 8.11 ...
- 基于Mint UI和MUI开发VUE项目一之环境搭建和首页的实现
一:简介 Mint UI 包含丰富的 CSS 和 JS 组件,能够满足日常的移动端开发需要.通过它,可以快速构建出风格统一的页面,提升开发效率.真正意义上的按需加载组件.可以只加载声明过的组件及其样式 ...
- vue项目的骨架及常用组件介绍
vue项目基础结构 一个vue的项目,我觉得最小的子集其实就是{vue,vue-router,component},vue作为基础库,为我们提供双向绑定等功能.vue-router连接不同的" ...
- 在nginx上部署vue项目(history模式);
在nginx上部署vue项目(history模式): vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载.但是如果我们不想has ...
- 创建一个vue项目的过程
创建一个vue项目: 1.首先从UI手上拿到PSD设计图,然后看设计搞的内容,需要做个大概的页面布局 2.做vue之前不许安装node,因为做vue项目要和node结合使用 3.然后安装vue脚手架: ...
- Vue项目搭建与部署
Vue项目搭建与部署 一,介绍与需求 1.1,介绍 Vue 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue两大核心思想:组件化和数据驱动.组 ...
- vue项目全局引入vue-awesome-swiper插件做出轮播效果
在安装了vue的前提下,打开命令行窗口,输入vue init webpack swiper-test,创建一个vue项目且名为swiper-test(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ...
随机推荐
- javascript class 方法的this指向问题
踩坑记录 JavaScript 的 class 里面有两种定义方法的方式 普通函数(fun1) 箭头函数(fun2) class Obj { func1() { // write some code. ...
- Vue微前端架构与Qiankun实践理论指南
title: Vue微前端架构与Qiankun实践理论指南 date: 2024/6/15 updated: 2024/6/15 author: cmdragon excerpt: 这篇文章介绍了微前 ...
- @ConfigurationProperties(prefix = “xx.xx.xx“) 从配置文件中取值赋给类的属性
@ConfigurationProperties(prefix = "xx.xx.xx") 从配置文件中取值赋给类的属性 @ConfigurationProperties(pref ...
- LuBase 低代码开发框架介绍 - 可私有化部署
框架定位 面向开发人员,针对管理软件领域,对页面交互和通用功能进行高阶封装,逐步打造成平台型.生态型开发工具. 涓涓细流 ,汇聚成海,基于 PBC(组件式开发)开发理念,让功能模块的复用更简单. 让管 ...
- 详解Web应用安全系列(3)失效的身份认证
大多数身份和访问管理系统的设计和实现,普遍存在身份认证失效的问题.会话管理是身份验证和访问控制的基础,并且存在于所有有状态的应用程序中.攻击者可以使用指南手册来检测失效的身份认证,但通常会关注密码转储 ...
- 全国产!全志T3+Logos FPGA开发板(4核ARM Cortex-A7)规格书
评估板简介 创龙科技TLT3F-EVM是一款基于全志科技T3四核ARM Cortex-A7 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核国产工业评估板,ARM Corte ...
- CM3调试系统简析
CM3 调试系统简析 **"一直以来,单片机的调试一直不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接烧入片子,再根据错误症状来判断问题,然后修改程序 ...
- 解决php提示Maximum execution time of 30 seconds exceeded错误
如何解决错误? 基本上,有3种方法可以处理此错误: 修改php配置文件php.ini文件 使用 ini_set() 函数 使用set_time_limit()函数 1)修改php配置文件php.ini ...
- 可视化—gojs 超多超实用经验分享(三)
目录 32.go.Palette 一排放两个 33.go.Palette 基本用法 34.创建自己指向自己的连线 35.设置不同的 groupTemplate 和 linkTemplate 36.监听 ...
- [oeasy]python0104_指示灯_显示_LED_辉光管_霓虹灯
编码进化 回忆上次内容 x86.arm.riscv等基础架构 都是二进制的 包括各种数据.指令 但是我们接触到的东西 都是屏幕显示出来的字符 计算机 显示出来的 一个个具体的字型 ...