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(创建速度可能会有点慢,耐心等),博文讲完后,源码托 ...
随机推荐
- 阿里云OSS图片上传和显示注意点
1. java.lang.IllegalArgumentException: The object key "/image-业务名称/20230818/20230818-订单号参数-acci ...
- Golang基于Mysql分布式锁实现集群主备
背景 集群中如果需要主备,可以基于Redis.zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现. 原理 数据库中包含数据字段(此处为Master的主机名).版本号和上一次更新时间. ...
- 【读论文】LLaMA: Open and Efficient Foundation Language Models
论文:LLaMA: Open and Efficient Foundation Language Models 模型代码:https://github.com/facebookresearch/lla ...
- 实验9.单臂路由实现Vlan互通实验
# 单臂路由实现Vlan互通实验 本实验用于测试单臂路由方式实现Vlan路由. 实验组 实验过程 SW int g0/0/1 port link-type access port default vl ...
- 在Linux应用层使用POSIX定时器
在Linux应用层使用POSIX定时器 ref : http://blog.chinaunix.net/uid-28458801-id-5035347.html http://blog.sina.co ...
- var、let、const 区别?
var 存在变量提升.let 只能在块级作用域内访问.const 用来定义常量,必须初始化,不能修改(对象特殊) 1.var[声明变量] var 没有块的概念,可以跨块访问,无法跨函数访问: 2.le ...
- 作业错题集锦(pta英文数据结构)
A graph with 30 vertices and 40 edges must have at most twenty one connected component(s). 要计算最大连通分量 ...
- 小产品,快变现,Solo社区共建者 James 专访
采访人:徐小夕. 本次受邀采访的嘉宾是Solo社区计划负责人&Solo社区联合创建者 James Pan(老潘). 专访内容 1. Solo社区创建的背景 随着国内软件市场内卷加剧,加上大环境 ...
- 解决方案 | winrar 使用命令行解压到同名文件夹 (QTTabBar 中创建一个【解压文件】命令按钮的设置)
需求:我们经常需要把rar或者zip解压到当前文件夹,如果是直接解压的话可能会解压出来很多文件,事实上我们当然可以通过右键解压到这个指定文件夹. 但是 经过查询知道,如果是指定文件夹好说,直接指定.\ ...
- 基于django(爱抚宠物) 小程序设计和实现(源码+LW+部署讲解)
感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 系统介绍: 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用 ...