实现主页的基本布局
1.主页的页面布局
1.1选择页面布局
前往Element官网Container布局容器部分,寻找需要的页面布局,复制对应的代码到主页中。
对应代码:
<el-container>
<el-header>Header</el-header>
<el-container>
<el-aside width="200px">Aside</el-aside>
<el-main>Main</el-main>
</el-container>
</el-container>
1.2对主页布局进行宽高设置
因为页面容器高度不会自动撑满整个页面,因此需要进行class和高度设置。
小知识:每个element标签,比如el-container,在浏览器中会以class的形式展示,因此可以通过.el-container对该类标签进行css设置,其他标签同理。但是如果有多个相同类名的标签,则需要再设置class类,避免样式的冲突。
2.el-header内容和样式
头部内容通常包括图标,标题和按钮或者链接,如图:
使用弹性布局即可,
<el-header>
<div>
<img src="../assets/logo.jpg" width="50px" height="50px" alt />
<span>电商后台管理系统</span>
</div>
<el-button type="info" @click="logout">退出</el-button>
</el-header>
.el-header {
background-color: #373d41;
display: flex;
justify-content: space-between;
padding-left: 0;
align-items: center;
color: #ffffff;
font-size: 20px;
> div {
display: flex;
align-items: center;
span {
margin-left: 15px;
}
}
}
3.侧边栏内容和样式
3.1侧边栏基本结构
侧边栏直接使用elemen官网的navMenu导航菜单,找到合适的组件进行改造
<!-- 侧边栏 -->
<el-aside width="200px">
<el-menu 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-4-1">
<template slot="title">
<i class="el-icon-location"></i>
<span>导航一</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
这样,一个基本的侧边栏结构就算完成了。
3.2侧边栏menu数据获取
3.2.1设置axios拦截器,挂载Authorization字段
查看后台项目api接口文档,
因为登录后的内容接口属于需要授权的API,因此必须在请求头中使用 Authorization
字段提供 token
令牌。
返回前端项目,在main.js添加拦截器,在请求头挂载Authorization
,这样需要权限的API在登录后就可以直接使用了。
//设置拦截器,登录时会自动执行(挂载Authorization,有权限的请求就能请求成功了)
axios.interceptors.request.use(config => {
// console.log(config)
config.headers.Authorization = window.sessionStorage.getItem('token')
// 在最后必须要返回 config
return config
})
打开控制台,查看Network,可以看到,登录前Headers中并没有 Authorization
字段
登录时,因为我们设置了拦截器,Headers中添加Authorization
字段,但是此时该字段为null。
在登录后,sessionStorage中的token才被赋值到Headers中的Authorization
字段。可以在进行获取menu数据或者其他需要Authorization
字段的请求中看到该字段的值。
3.2.2请求菜单数据
首先在data中设置menuList数组,用于存储请求的数据。在created函数中放置一个getMenuList方法用于获取menu数据
随后在methods中设置getMenuList方法
async getMenuList() {
const { data: res } = await this.$http.get('menus')
if (res.meta.status !== 200) return this.$message.error(res.meta.msg)
this.menuList = res.data
console.log(res)
},
可以看到Headers中的Authorization
字段已经获取了token,
3.3侧边栏内容和样式设置
内容:
<!-- 侧边栏 -->
<el-aside :width="isCollapse?'64px':'200px'">
<div class="toggle-button" @click="toggleCollapse">|||</div>
<!-- 侧边栏菜单区域 -->
<el-menu
background-color="#545c64"
text-color="#fff"
active-text-color="#4a7bcf"
unique-opened
:collapse="isCollapse"
:collapse-transition="false"
>
<!-- 一级菜单 -->
<el-submenu :index="item.id + ''" v-for="item in menuList" :key="item.id">
<!-- 一级菜单的模板区域 -->
<template slot="title">
<!-- 图标 -->
<i :class="iconsObj[item.id]"></i>
<!-- 文本 -->
<span>{{item.authName}}</span>
</template>
<!-- 二级菜单 -->
<el-menu-item
:index="subItem.id + ''"
v-for="subItem in item.children"
:key="subItem.id"
>
<template slot="title">
<!-- 图标 -->
<i class="el-icon-menu"></i>
<!-- 文本 -->
<span>{{subItem.authName}}</span>
</template>
</el-menu-item>
</el-submenu>
</el-menu>
</el-aside>
样式:
.el-aside {
background-color: rgb(84, 92, 100);
.el-menu {
// height: 100%;
border-right: none;
}
}
.el-icon {
margin-right: 10px;
}
.toggle-button {
background-color: rgb(84, 92, 100);
color: #fff;
text-align: center;
font-size: 10px;
height: 24px;
line-height: 24px;
letter-spacing: 0.1em;
cursor: pointer;
}
methods中的侧边栏折叠方法
// 点击按钮,切换侧边栏的折叠和展开
toggleCollapse() {
this.isCollapse = !this.isCollapse
}
根据item.id设置对应图标: