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

news2024/11/16 5:49:33

目录

一、前言介绍

二、结构解析

三、页面拆分

(一)页面拆分 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启动metastore服务报错

启动Metastore的时候报错&#xff1a; 简略的报错信息&#xff1a; MetaException(message:Error creating transactional connection factory)Caused by: MetaException(message:Error creating transactional connection factory)Caused by: javax.jdo.JDOFatalInternalExce…

识别图片中的文字

前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下&#xff1a; 免费&#xff1a;完全免费&#xff0c;没有任何次数、大小限制&#xff0c;可以无限使用&#xff1b; 安全&#xff1a;全部数据本地运算&#xff0c;所有图片均不会被上传&#xff1b; 智能&#xf…

CRM的销售预测有什么用?如何操作?

销售预测对于销售团队非常重要&#xff0c;它可以估计未来一段时间内的销售量和收入&#xff0c;帮助销售人员制定基于数据的决策&#xff0c;提高销售业绩。CRM可以收集和分析销售数据&#xff0c;并进行销售预测。下面说说&#xff0c;什么是销售预测&#xff1f;CRM如何进行…

Buzz语音转文字安装使用(含Whisper模型下载)

简介&#xff1a; Transcribe and translate audio offline on your personal computer. Powered by OpenAI’s Whisper. 转录和翻译音频离线在您的个人计算机。由OpenAI的Whisper提供动力。 可以简单理解为QT的前端界面&#xff0c;python语言构建服务端&#xff0c;使用Whis…

Vant 4中的van-picker选择总是第一个的解决办法

Vant 4中的van-picker选择总是第一个的解决办法 官方demo <van-fieldv-model"fieldValue"is-linkreadonlylabel"城市"placeholder"选择城市"click"showPicker true" /> <van-popup v-model:show"showPicker" ro…

netty运行一段时间报错:java.io.IOException: 打开的文件过多

报错详细内容如下&#xff1a; java.io.IOException: 打开的文件过多at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:421)at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSo…

APP Binder客户端调用全流程分析

现在要搞明白JAVA层app调用跨进程的Service接口时&#xff0c;它的binder是怎样从Java->jni-->native--->binder驱动的这条链路&#xff1a;就是上图中的左半部分从上至下的流程。所以切入点在于&#xff0c;如app调用另一个进程的Service接口的getString&#xff08;…

Spring集成【MyBatis】和【PageHelper分页插件】整合---详细介绍

一&#xff0c;spring集成Mybatis的概念 Spring 整合 MyBatis 是将 MyBatis 数据访问框架与 Spring 框架进行集成&#xff0c;以实现更便捷的开发和管理。在集成过程中&#xff0c;Spring 提供了许多特性和功能&#xff0c;如依赖注入、声明式事务管理、AOP 等 它所带来给我们的…

安全学习DAY19_小程序信息打点

信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构 文章目录 信息打点-小程序应用&解包反编译&抓包&静态分析&源码架构本节知识&思维导图本节使用到的链接&工具 小程序获取-各大平台&关键字搜索小程序-模版测试上线&源码…

如何开启esxi主机的ssh远程连接

环境&#xff1a;esxi主机&#xff0c;说明&#xff1a;esxi主机默认ssh是不开启的&#xff0c;需要人工手动启动&#xff0c;也可以设置同esxi主机一起开机启动。 1、找到esxi主机&#xff0c;点击“配置”那里&#xff0c;再点击右边的属性&#xff0c;如图所示&#xff1a; …

java属性映射使用MapStruct的坑

目录 1.实体类和映射类只加注解Data 2.将Data换成getter和setter后build 3.那么此时我把getter和setter换成lombok的getter和setter 1.实体类和映射类只加注解Data 映射关系类 这个时候运行 提示源参数中不存在 注意这个文件夹 2.将Data换成getter和setter后build package c…

Python如何进行基本的数学运算

Python进行基本的数学运算 Python是一门功能强大且易于学习的编程语言&#xff0c;它不仅可以用于开发应用程序&#xff0c;还可以用于执行各种数学运算。让我们一起来看看如何在Python中进行基本的数学运算。 加法、减法、乘法和除法 Python支持常见的加法、减法、乘法和除…

[论文分享]Pedestrian attribute recognition based on attribute correlation

Pedestrian attribute recognition based on attribute correlation 行人属性识别广泛应用于行人跟踪和行人重识别。 两项最基本的挑战&#xff1a; 多标签性质数据样本的差异性特征&#xff0c;例如类别不平衡和部分遮挡。 不同方法的示意图&#xff1a; 此项工作中&#…

Linux操作系统--常用指令(用户管理操作类)

用户的管理需要使用超级管理员(root)来进行操作 (1).useradd添加新用户 功能:给当前的操作系统添加新的用户 语法: useradd 用户名 (2).passwd设置用户新密码 功能:给当前的用户设置密码 语法: passwd用户名 (3).i

核辐射对生物的影响

目录 1.什么是核辐射 2.核辐射的危害 3.核辐射对环境造成的影响 4.核辐射的影响会持续多长时间 1.什么是核辐射 核辐射是指自然界或人工产生的高能粒子或电磁波的放射性能量。当原子核不稳定时&#xff0c;会发生放射性衰变&#xff0c;释放出核辐射。 核辐射主要分为三种类…

市场的新宠:4G智能手表

现在人们提到智能手表&#xff0c;健康监测、运动记录、接打电话等定是他不可或缺的功能&#xff0c;而其中通讯功能在绝大数多的智能手表上都是通过蓝牙实现的&#xff0c;需要让手表通过蓝牙连接到手机端来进行。在没有手机的情况下&#xff0c;配置再高的蓝牙智能手表也是“…

深入浅出AXI协议(2)——通道及信号

一、前言 在之前的文章中&#xff0c;我们主要介绍了什么是AXI协议&#xff0c;AXI协议的特点与优点&#xff0c;然后对于AXI协议非常重要的五通道结构进行了介绍&#xff0c;了解了5个通道各自的作用。本文我们继续AXI协议的学习&#xff0c;我们将讨论5个通道的具体内容和相对…

判断网站是否开启CDN加速

方法一&#xff1a; 我们可以在CMD中ping一下想要测试的网站。比如baidu.com。 我们看到转向的还是baidu.com 接着用命令nslookup尝试下反向解析&#xff1a; 这种情况下一般是没有做CDN加速。 假设我们ping www.csdn.com: 我们看到它跳转到xxxx.com去了&#xff0c;这说明c…

Spring AOP 的实现及原理

目录 什么是 Spring AOP &#xff1f;AOP 是啥 ?Spring AOP 可以干啥 &#xff1f; AOP 的组成Spring AOP 的实现Spring AOP 的实现原理 什么是 Spring AOP &#xff1f; AOP 是啥 ? 我们知道 OOP 是面向对象编程, 那 AOP 又是啥呢 ? AOP&#xff08;Aspect Oriented Prog…