vue组装模板(侧边栏+顶部+主体)--项目阶段4

目录

一、前言介绍

二、结构解析

三、页面拆分

(一)页面拆分 

1.侧边栏页面(固定)--Aside.vue

2.顶部页面(固定)--Header.vue        

3.主体页面(不固定的)--示例用UserView.vue

(二)页面组装-Manage.vue

 四、运行

代码获取


一、前言介绍

在上一篇文章中已经介绍了如何去实现前后端数据的交互并在前端显示出来:

初学者SpringBoot+Vue打通前后端详细步骤(从零开始)--项目阶段3_云边的快乐猫的博客-CSDN博客

本篇文章是给这个项目增加上侧边栏顶部,点击不同的侧边栏菜单会有不同的页面效果。

二、结构解析

前端使用的技术还是Vue+Element-ui,还用到elementui里面的布局容器。

页面要分成3部分组成,分别是侧边栏、顶部和主体3部分。然后再把这3部分页面组装合并在一个Manage.vue页面里面。

其中侧边栏和主体部分可以固定,点击侧边栏中的菜单时候,主体部分就通过路由切换到对应的页面。 

这种结构的优点与缺点:

使用侧边栏的系统实际上是单页面系统,运行用户体验会更好,但是缺点就是SEO(搜索曝光率)没有多页面的好,典型的网易云就是单页面的系统。就是整体框架不会变,只是变里面的内容。这样用户体验度会比较好。

若依开源项目(运行超链接)也是一样的

三、页面拆分与组装

(一)页面拆分 

没有拆分之前的集成代码:

https://download.csdn.net/download/m0_52861000/88244356?spm=1001.2014.3001.5501 

1.侧边栏页面(固定)--Aside.vue

因为侧边栏页面是固定位置的而且是通用的(就是点击菜单栏,这个都存在的,除了登录页面不存在),所以这个页面写在vue的通用页面components包目录下。命名为Aside.vue

<!-- Aside.vue -->
<template>
 <el-aside :width="asideWidth">    <!--asideWidth:下面脚本里面定义了宽度初始为200  -->
        <div style="height: 60px; line-height: 60px; font-size: 20px; display: flex; align-items: center; justify-content: center">
          <img :src="require('@/assets/logo.png')" style="width: 30px;" alt="">
          <span class="logo-title" v-show="!isCollapse">无敌系统</span>
        </div>
        <!-- isCollapse:动态收缩栏。collapse-transition="false表示收缩不使用过渡效果 -->
        <!--fff:菜单选中时为白色。rgba(255, 255, 255, 0.65):没有选中时候为淡灰色。还有加载当前的路由路径。边框为无边框  -->
        <el-menu router :collapse="isCollapse" :collapse-transition="false" background-color="#001529"
                 active-text-color="#fff" text-color="rgba(255, 255, 255, 0.65)" :default-active="$route.path"
                 style="border: none">
          <el-menu-item index="/">
            <i class="el-icon-s-home"></i>
            <span slot="title">系统首页</span>
          </el-menu-item>
          <el-submenu index="2">
            <template slot="title"><i class="el-icon-menu"></i><span>信息管理</span></template>
            <el-menu-item index="/user">用户管理</el-menu-item>
            <el-menu-item index="/admin">管理员管理</el-menu-item>
          </el-submenu>
          <el-submenu index="3">
            <template slot="title"><i class="el-icon-menu"></i><span>部门管理</span></template>
            <el-menu-item index="/work">上班打卡</el-menu-item>
            <el-menu-item index="/rest">下班打开</el-menu-item>
          </el-submenu>
        </el-menu>
      </el-aside>
</template>

<script>
export default {
  name: 'Aside',
  props: {
    asideWidth: String,
    isCollapse: Boolean
    // 其他需要的 props
  }
  // 其他逻辑和方法
};
</script>


<style>
/* 侧边栏里面选中菜单的背景色   !important代表这个优先级很高*/
.el-menu--inline, .el-menu-item {
  background-color: #000c17 !important;
}

/* 菜单栏一级标题样式 */
.el-submenu__title {
  height: 40px !important;  /* 一级标题的框整体高度 */
  line-height: 40px !important;  /* 一级标题的字在框里面整体高度 */
  padding: 0 25px !important;    /* 一级标题位置,越大越右 */
  transition: color 10s;      /* 对文字颜色过渡效果时间 */
}
/* 菜单栏图标文字对齐样式(去掉也没关系) */
.el-submenu__title>i:nth-child(1) {
  margin-top: 2px;    /* 用来微调菜单栏里面图标和文字上下对齐的 */
}
/* 菜单栏展开箭头样式位置(去掉也没关系) */
.el-submenu__title>i.el-submenu__icon-arrow {
  margin-top: -5px;
}
/* 菜单栏样式(去掉影响也还好) */
.el-menu-item {
  min-width: 0 !important;   /*允许最小屏幕的宽度  */
  width: calc(100% - 10px);
  margin: 5px;   /*菜单项主键的间距  */
  height: 40px !important;    /*首页菜单高度大小  */
  line-height: 40px !important;    /*二级菜单大小,最好和上面一样  */
  border-radius: 10px;  /*菜单标题的边框添加圆角,越大越圆*/
}
/* 菜单栏二级标题左移 (去掉也没关系) */
.el-menu--inline>.el-menu-item {
  padding-left: 50px !important;
}
/* 菜单栏选中的背景颜色(去掉也没关系) */
.el-menu-item.is-active {
  background-color: dodgerblue !important;
}
/* 菜单栏鼠标悬停在二级标题的颜色(去掉也没关系) */
.el-menu-item:hover {
  color: #fff !important;
}
/* 菜单栏鼠标悬停在一级标题的颜色(去掉也没关系) */
.el-submenu__title:hover *, .el-submenu__title:hover {
  color: #fff !important;
}
/* 菜单栏整体的美观样式 */
.el-aside {
  box-shadow: 5px 0 6px rgba(15, 14, 14, 0.35); /* 菜单栏右侧阴影  0  阴影扩散范围 阴影的颜色 */
  background-color: #001529;   /* 菜单栏整体的背景色 */
  color: #fff;   /* 菜单栏顶部的系统颜色 */
  min-height: 100vh;  /* 菜单栏整体高度 */
  transition: width .3s;  /* 菜单栏展开收缩的整体时间0.3s */
}
/* 用于指示侧边栏折叠状态的选中一级图标偏移 */
.el-menu--collapse .el-tooltip {
  padding: 0 15px !important;
}
/*菜单栏logo图标和文字的距离*/
.logo-title {
  margin-left: 5px;  
  transition: all .3s;
}
.el-menu {
  transition: all .3s;
}
</style>

2.顶部页面(固定)--Header.vue        

 因为顶部页面是固定位置的而且是通用的(就是点击菜单栏,这个都存在的,除了登录页面不存在),所以这个页面写在vue的通用页面components包目录下。命名为Header.vue

<!-- Header.vue -->
<template>
  <div class="aa">
  <el-header style="height: 60px; display: flex; align-items: center; box-shadow: 2px 0 6px rgba(0, 21, 41, .35);">
          <!-- 侧边栏展开收缩!!collapseIcon:点击侧边栏图标样式  handleCollapse:绑定了图标点击事件(脚本)  还有图标大小为30px-->
          <i :class="collapseIcon" @click="handleCollapse" style="font-size: 30px"></i>
          <!-- 绑定字体距离图标的距离、还有点击图标跳转的路由 -->
          <el-breadcrumb separator="/" style="margin-left: 20px">
            <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
            <el-breadcrumb-item :to="{ path: '/' }">课程管理</el-breadcrumb-item>
          </el-breadcrumb>
                <!--点击收缩栏时候的头部弹性布局,justify-content:推向右边 。align-items:内容居中 -->
          <div style="flex: 1; display: flex; justify-content: flex-end; align-items: center">
            <!-- placement="bottom":按钮触发下方弹出  cursor: pointer:鼠标放到这里变成一个手指-->
            <el-dropdown placement="bottom">
              <div style="display: flex; align-items: center; cursor: pointer">
                <!-- 图标的设置和宽度 -->
                <img :src="require('@/assets/logo.png')" style="width: 30px;" alt="">
                <span>管理员</span>
              </div>
              <!-- 顶部的触碰显示下来信息 -->
              <el-dropdown-menu slot="dropdown">
                  <router-link to="/person" style="text-decoration: none">
                  <el-dropdown-item>个人信息</el-dropdown-item>
                  </router-link>
                  <router-link to="/change-password" style="text-decoration: none">
                  <el-dropdown-item>修改密码</el-dropdown-item>
                  </router-link>
                  <el-dropdown-item @click="handleLogout">退出登录</el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
          </div>
        </el-header>
      </div>
</template>

<script>
export default {
  name: 'Header',
  props: {
    collapseIcon: String,
    handleCollapse: Function
    // 其他需要的 props
  }
  // 其他逻辑和方法
};
</script>

<style>

</style>

3.主体页面(不固定的)--示例用UserView.vue

主体页面界面就是自由嵌套一个完整页面进去的。我这里做示范,把上一个做的页面放进来

(二)页面组装-Manage.vue

1.接下来就要把这些侧边栏、顶部、主体页面组装放到一个新页面里面。这里也是放到通用文件components里面,命名为Manage.vue

<!-- 左右结构,左边是菜单栏、右边是一个大盒子分为通用顶部(上)和变换的主体(下) -->
<template>
    <el-container>
      <Aside :asideWidth="asideWidth" :isCollapse="isCollapse" />
      <div style="width: 100%;flex-wrap: wrap;">
      <Header :collapseIcon="collapseIcon" :handleCollapse="handleCollapse" />
        <el-main>
          <router-view />  <!-- 表示当前页面的子路由会在<router-view />里面展示      -->
        </el-main>
      </div>
    </el-container>
</template>

<script>
import Aside from '../components/Aside.vue';
import Header from '../components/Header.vue';

export default {
  components: {
    Aside,
    Header,
  },
  data() {
    return {
      isCollapse: false,   //展开
      asideWidth: '200px',   //侧边栏默认值为200
      collapseIcon: 'el-icon-s-fold'   //展开图标箭头向左
    };
  },
  methods: {
  handleCollapse() {
    this.isCollapse = !this.isCollapse;
    if (this.isCollapse) {     //折叠图标
      this.asideWidth = '64px';
      this.collapseIcon = 'el-icon-s-unfold';
    } else {
      this.asideWidth = '200px';    //展开图标
      this.collapseIcon = 'el-icon-s-fold';
    }
  }
}

};
</script>

2.最后一个步骤,让这些页面可以加载起来,那就是放到路由里面。

 四、运行

cd切到到当前文件夹demo,然后输入运行命令

npm run serve

默认8080端口然后主体部分会重定向到user界面 

代码获取

1.点击下方那个猫扫一下

2.去那边回:项目阶段4

有什么问题都可以评论区留言,看见都会回复的

如果你觉得本篇文章对你有所帮助的,把“文章有帮助的”打在评论区

多多支持吧!!!

点赞收藏评论,当然也可以点击文章底部的红包或者👇订阅付费文章创作支持一下了。抱拳了!

vip文章:http://t.csdn.cn/Uq5j1

bug大全订阅文章http://t.csdn.cn/j6UyR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/98458.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PYTHON用户流失数据挖掘:建立逻辑回归、XGBOOST、随机森林、决策树、支持向量机、朴素贝叶斯和KMEANS聚类用户画像...

原文链接&#xff1a;http://tecdat.cn/?p24346 在今天产品高度同质化的品牌营销阶段&#xff0c;企业与企业之间的竞争集中地体现在对客户的争夺上&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 “用户就是上帝”促使众多的企业不惜代价去争夺尽可能多的客…

C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…

bug复刻,解决方案---在改变div层级关系时,导致传参失败

问题描述&#xff1a; 在优化页面时&#xff0c;为了实现网页顶部遮挡效果&#xff08;内容滚动&#xff0c;顶部导航栏不随着一起滚动&#xff0c;并且覆盖&#xff09;&#xff0c;做法是将内容都放在一个div里面&#xff0c;为这个新的div设置样式&#xff0c;margin-top w…

查漏补缺 - JS三 WebAPI

目录 BOMhistory DOM操作DOM1&#xff0c;dom.children 和 dom.childNodes 区别2&#xff0c;dom.remove()3&#xff0c;其他常用 API DOM 属性1&#xff0c;标准属性2&#xff0c;自定义属性 DOM 内容DOM样式DOM事件 JavaScript 包括 EcmaScript 和 WebAPI EcmaScript 包括 语…

25 Linux可视化-Webmin和bt运维工具

25 Linux可视化-Webmin和bt运维工具 文章目录 25 Linux可视化-Webmin和bt运维工具25.1 Web运行环境简介25.2 Webmin的安装及使用25.2.1 安装webmin25.2.2 Webmin使用演示 25.3 bt(宝塔)的安装及使用25.3.1 安装宝塔25.3.2 宝塔Web登录Linux服务器25.3.3 找回宝塔登录密码 学习视…

客路旅行(KLOOK)面试(部分)(未完全解析)

一面 用过Chatgpt的哪个版本&#xff0c;了解Chatgpt版本之间的差异吗 什么是优雅部署&#xff1f;newBing: 服务启动时&#xff0c;检查依赖的组件或容器是否就绪&#xff0c;如果不就绪&#xff0c;等待或重试&#xff0c;直到就绪后再注册到服务中心&#xff0c;对外提供服…

Java之API详解之BigDecimal类的详细解析

7 BigDecimal类 7.1 引入 首先我们来分析一下如下程序的执行结果&#xff1a; public class BigDecimalDemo01 {public static void main(String[] args) {System.out.println(0.09 0.01);}} 这段代码比较简单&#xff0c;就是计算0.09和0.01之和&#xff0c;并且将其结果…

Mapbox-gl 关闭所有Popup,以及关闭按钮出现黑色边框bug

1.官方示例 var popup new mapboxgl.Popup().addTo(map);popup.remove(); 很明显&#xff0c;需要记录popup对象&#xff0c;管理起来比较麻烦。 2.本人采用div的方式关闭所有的popup&#xff0c;在map对象上新增加方法 map.closePopupmapView.popupClear function(){$(&q…

ceph架构及 IO流程

CEPH是由多个节点构成的集群&#xff0c;它具有良好的可扩展性和可靠性。节点之间相互通信以达到&#xff1a; 存储和检索数据 数据复制 监控集群的健康状况 保证数据的完整性 检测故障并恢复 基本架构如下图&#xff1a; 分布式对象存储系统RADOS是CEPH最为关键的技术&a…

WebRTC音视频通话-WebRTC推拉流过程中日志log输出

WebRTC音视频通话-WebRTC推拉流过程中日志log输出 之前实现iOS端调用ossrs服务实现推拉流流程。 推流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132262724 拉流&#xff1a;https://blog.csdn.net/gloryFlow/article/details/132417602 在推拉流过程中的…

第 3 章 栈和队列(用递归函数求解迷宫问题(求出所有解))

1. 背景说明&#xff1a; 若迷宫 maze 中存在从入口 start 到出口 end 的通道&#xff0c;则求出所有合理解并求出最优解 迷宫示意图&#xff1a; 输入文本&#xff1a; 10 10181 3 1 7 2 3 2 7 3 5 3 6 4 2 4 3 4 4 5 4 6 2 6 6 7 2 7 3 7 4 7 6 7 7 8 11 18 8 2. 示例代码…

【计算机组成 课程笔记】3.1 算数运算和逻辑运算

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 1 - 301-算术运算和逻辑运算&#xff08;13-7--&#xff09;_哔哩哔哩_bilibili 计算机的核心功能就是运算&#xff0c;运算的基本类型包括算数运算和逻辑运算。想要了解计算机是如何实现运算的&#xff0c;我…

Vlan和Trunk

文章目录 一、VLAN的定义与背景1. 传统以太网的问题&#xff08;广播域&#xff09;2. 用VLAN隔离广播域3. VLAN的优点与应用 二、VLAN的转发过程举例三、802.1Q标签&#xff1a;帧格式与作用四、VLAN工作原理交换机端口类型AccessTrunkHybrid PVID&#xff08;Port VLAN ID&am…

【基于空间纹理的残差网络无监督Pansharpening】

Unsupervised Pansharpening method Using Residual Network with Spatial Texture Attention &#xff08;基于空间纹理的残差网络无监督泛锐化方法&#xff09; 近年来&#xff0c;深度学习已经成为最受欢迎的泛锐化工具之一&#xff0c;许多相关方法已经被研究并反映出良好…

android 实现本地一键打包,告别繁琐的studio操作

前言 在实际开发项目中&#xff0c;我们的工程目录往往是多个app在一个工程下的&#xff0c;每次打包都需要手动的用studio点击Build->Generate Signed Bundle or APK->APK 选择app&#xff0c;签名等&#xff0c;甚至有的app签名还不一样&#xff0c;还需要手动的来回切…

【esp32】解决以太网+mqtt堆栈溢出问题 报错 no mem for receive buffer

本文主要记录了 esp32 + 以太网 +mqtt 功能时遇到的堆栈溢出的情况,千里之堤毁于蚁穴,开发过程的不细心导致多付出了一天多的时间,记录于此,共勉 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:欢迎访问我的 Ethernet_Comm 博…

小游戏分发平台如何以技术拓流?

2023年&#xff0c;小游戏的发展将受到多方面的影响&#xff0c;例如新技术的引入、参与小游戏的新玩家以及游戏市场的激烈竞争等。首先&#xff0c;新技术如虚拟现实&#xff08;VR&#xff09;、增强现实&#xff08;AR&#xff09;和机器人技术都可以带来新颖的游戏体验。其…

【Qt学习】10 利用QSharedMemory实现单例运行

问题 让应用程序只有一个运行实例 QSharedMemory除了可以完成进程间通信&#xff0c;还可以实现应用程序单例化。 解法 首先&#xff0c;看看QSharedMemory的几个函数&#xff1a; 1、QSharedMemory(const QString &key, QObject *parent Q_NULLPTR)构造函数 该构造函数…

大模型综述论文笔记6-15

这里写自定义目录标题 KeywordsBackgroud for LLMsTechnical Evolution of GPT-series ModelsResearch of OpenAI on LLMs can be roughly divided into the following stagesEarly ExplorationsCapacity LeapCapacity EnhancementThe Milestones of Language Models Resources…

OPENCV实现计算描述子

1、计算描述子 kp,des = sift.computer(img,kp) 2、其作用是进行特征匹配 3、同时计算关键点和描述 3.1、kp,des = sift.detectAnd Computer(img,...)