Vue学习四—— Home主体页面

news/2025/1/31 18:15:25/

前言

在之前已经实现了登录页面,项目页面增删查改的操作,然后选择项目,进入Home页面,也就是核心主体页面。

一、实现效果图

在这里插入图片描述

使用elemrnt-plus的布局容器,将页面分为4部分,也可以选择自己喜欢的布局。
在侧边栏点击相应的内容,出现在右边main
在这里插入图片描述

布局容器

如果将3块内容全部写在一个homeview下面,代码会很多,不方便查找修改。所以使用自定义组件,分开来写

<!-- HomeView.vue -->
<template><el-container><!-- 左侧侧边栏 --><el-aside width="200px"><LeftMenu></LeftMenu></el-aside><el-container><!-- 页面头部内容 --><el-header><Header></Header></el-header><!-- 页面主体内容 --><el-main><!-- 主体内容区域 --></el-main><!-- 页面底部内容 --><el-footer><Footer></Footer></el-footer></el-container></el-container>
</template><style lang="scss" scoped>.el-container {height: 100%;.el-aside {border-right: solid 1px #6a6a6a;}.el-header {border-bottom: solid 1px #6a6a6a;padding: 0;height: 55px;}.el-footer {border-top: solid 1px #6a6a6a;height: 29px;}.el-main{padding: 0;}}
</style>

二、页面内容

1. 左边部分(LeftMenu)

创建LeftMenu.vue文件,用来写左边内容。左边部分分为上面logo和下面的列表,列表循环展示MenuList的内容
在这里插入图片描述
在这里插入图片描述

设置菜单激活

在这里插入图片描述

通过设置element–plus菜单组件的参数,来管理菜单项的激活状态。
比如设置了第二个路径是\home,当前访问的路径也是\home,第二个菜单就被激活高亮显示了

2.顶部部分(Header)

初步设想是分3块内容,左边的收缩按钮(将左侧菜单栏收缩),中间一个平台名称展示,右边的个人信息和其他操作。
在这里插入图片描述

<div class="head_box"><div class="left_box"></div><div class="center_box"></div><div class="righr_box"></div>
</div>

左侧部分(left_box)

1. 测试环境的获取及选择
<div class="left_box"><el-button icon="Fold"></el-button><!-- 选择框 --><el-select v-model="env" placeholder="请选择测试环境"><el-option v-for='item in evnList' :key="item.id" :label="item.name" :value="item.id" /></el-select>
</div>

结合后端,测试环境的值从后端请求获取。

  1. 封装api接口

在这里插入图片描述

//ProjectApi.js
//获取测试环境列表getEnvListApi(pro_id){return request.get(`/api/testPro/envs`,{params:{project:pro_id}})}
  1. 在ProStore中封装获取列表的方法
export const ProjectStore = defineStore('proStore',{state:() => {return {pro : {},envList : [],env: null,}},actions:{//获取项目下所有测试环境async getEnvList(){const response =  await http.pro.getEnvListApi(this.pro.id)if(response.status==200){this.envList = response.data}}},...
  1. 在Header中使用方法获取环境数据
	import {ref,reactive} from 'vue'import http from '@/api/index'import {ProjectStore} from '@/stores/module/ProStore'import { storeToRefs } from 'pinia'const proStore = ProjectStore()const proStoreRef = storeToRefs(proStore)proStore.getEnvList()const envList = proStoreRef.envListlet env = proStoreRef.env

这里 storeToRefs 主要是为了解构 Store 时,仍然能够保持状态的响应式特性。更多可以参考其他使用文档

StoreToRefs

这样就获取到了该项目下的测试环境数据
在这里插入图片描述

2.左侧菜单栏收缩与展开

proStore新增一个状态字段isCollapse

state:() => {return {pro : {},isCollapse:false,envList : [],env: null,}

点击就将状态取反,展开就收起,收起则展开。

<el-icon size="28" @click="switchCollapse" style="margin: 0 5px;"><Expand v-if='proStore.isCollapse' /><Fold v-else />
</el-icon>
...
function switchCollapse(){proStore.isCollapse = !proStore.isCollapse}

在这里插入图片描述
相应的要在HomeView读取proStore的是否收起菜单的状态,用于显示宽度,动态绑定style

// HomeView.vue<el-aside :style="{width:proStore.isCollapse? '65px' : '200px'}"><LeftMenu></LeftMenu>
</el-aside>

在这里插入图片描述

中间部分(center_box)

纯文案 + 背景样式,可以是图片,反正各种自定义都行。

<div class="center_box">接口测试平台
</div>...
<style lang='scss' scoped> 
.center_box{height: 50px;width: 700px;line-height: 50px;text-align: center;font-weight: bold;font-size: 22px;color: #00aaff;flex-shrink: 0;border-radius: 10px;background: linear-gradient(120deg, #F3BA48 0%, #FEDC96 100%);margin-right: 3px;
}
</style>

右边的项目和个人信息部分(right_box)

切换项目

不做那么麻烦,给按钮添加点击事件ChangePro,直接回到选择项目的页面,重新选就行了。

	const router = useRouter()function ChangePro(){router.push('project')}

在这里插入图片描述

右侧个人信息

用户信息肯定得从ustore读取,然后增加一个退出登录的功能

//Header.vue
...
<el-dropdown><el-button plain icon="User" > {{uStore.userinfo.nickname}} </el-button><template #dropdown><el-button plain icon="User" @click='LogOut'> 退出登录 </el-button></template>			
</el-dropdown>
...
function LogOut(){// 跳转到登录页面,清空登录的用户信息和pinia的数据router.push({name: "login"})ElNotification({title: '已退出登录',type: 'success',})// 清除tokenuStore.token = ''// 修改登录的状态uStore.isAuthenticated = false
}
...

在这里插入图片描述

3. 底部部分(Footer)

就一些描述信息,可有可无

<template><div class="text_desc" >牛马测试平台,版权归属@John (2025:1月份开始开发)阿巴阿巴</div>
</template><script>
</script><style scoped>.text_desc{height: 29px;line-height: 28px;text-align: center;font-size: 14px;color: #969696;}
</style>

4. 中间主体部分(Main)

主体部分使用路由出口局部渲染展示。

router-view

...
<el-main><router-view></router-view>
</el-main>
...

新建几个页面,一个测试环境页面,一个测试接口页面…
在LeftMenu里,定义好他们的路径
在这里插入图片描述
同时在router的index种,定义好home页的子页面路径,注意路径一致。
在这里插入图片描述
也可以访问home页,重定向到env页面,增加redirect就行

在这里插入图片描述
有一点点跟自己想要的不一致,需要整个html占据页面100%,可以修改一下全局定义样式

html,
body,
#app
{margin: 0;padding: 0;height: 100%;width: 100%;
}

在这里插入图片描述
主体页面大致就是这样,后面需要完成的就是每一个具体页面的开发,然后将内容渲染到主体页面中间。

总结

  1. elemrnt-plus的布局容器
  2. pinia -> actions
  3. router-view

http://www.ppmy.cn/news/1568208.html

相关文章

无监督学习:聚类、异常检测

聚类 工作原因我对聚类特别熟悉&#xff0c;因此视频课程基本快进看完&#xff0c;不做记录 异常检测 高斯(正态)分布 多特征异常检测 将每个特征作为独立特征&#xff08;实践证明即使不完全独立也影响不大&#xff09;计算高斯分布的参数&#xff0c;然后将待预估样本代入…

LINUX部署微服务项目步骤

项目简介技术栈 主体技术&#xff1a;SpringCloud&#xff0c;SpringBoot&#xff0c;VUE2&#xff0c; 中间件&#xff1a;RabbitMQ、Redis 创建用户 在linux服务器home下创建用户qshh&#xff0c;用于后续本项目需要的环境进行安装配置 #创建用户 useradd 用户名 #设置登录密…

three.js+WebGL踩坑经验合集(2):3D场景被相机裁切后,被裁切的部分依然可以被鼠标碰撞检测得到(射线检测)

three.js内置了Raycaster类实现鼠标的碰撞检测&#xff0c;用它可以实现3D物体的鼠标点击&#xff0c;移入移出&#xff0c;触屏检测一类的业务功能。 该功能虽然强大&#xff0c;但同事们普遍反映不是那么好用&#xff0c;因为它不像其它配套了可视编辑的3D引擎一样&#xff…

新月智能护甲系统CMIA--未来战场的守护者

新月智能护甲系统&#xff08;Crescent Moon Intelligent Armor System&#xff0c;简称CMIA&#xff09; 新月智能护甲系统&#xff08;CMIA&#xff09;是新月结合了她多年的研究成果&#xff0c;开发出的一款高度智能化的个人防护装备。这款护甲集成了先进的环境监测、生命…

机器学习 vs 深度学习

目录 一、机器学习 1、实现原理 2、实施方法 二、深度学习 1、与机器学习的联系与区别 2、神经网络的历史发展 3、神经网络的基本概念 一、机器学习 1、实现原理 训练&#xff08;归纳&#xff09;和预测&#xff08;演绎&#xff09; 归纳: 从具体案例中抽象一般规律…

Vivado生成X1或X4位宽mcs文件并固化到flash

1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型&#xff0c;相关配置步骤可参考下图。 注意&#xff1a;Flash数据传输位宽如果需要选择X4位宽&am…

jQuery小游戏(二)

jQuery小游戏&#xff08;二&#xff09; 今天是新年的第二天&#xff0c;本人在这里祝大家&#xff0c;新年快乐&#xff0c;万事胜意&#x1f495; 紧接jQuery小游戏&#xff08;一&#xff09;的内容&#xff0c;我们开始继续往下咯&#x1f61c; 游戏中使用到的方法 key…

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器&#xff1a;负责告诉磁盘是读还是写。 数据寄存器&#xff1a;给…