vue+ElementUI—实现基础后台管理布局(sideBar+header+appMain)(附源码)

后台管理的模板很多,vue本身就提供了完整的vue-template-admin,vue-admin-beautiful等后台管理系统化框架,但是这些框架正是因为成体系而显得繁重。假如你想搭建一个静态的后台管理模板页面和几个单独的菜单页面,直接就上框架是否就有点大材小用了呢 百分之九十以上的后台管理布局基本都是头部导航,侧边栏,主内容三部分组成。所以,将其单独摘出来为一个单独的轻量后台页面就很有必要了。

1. 效果展示

最常见的系统布局就是:左右布局。左侧是菜单栏,右侧是内容区,内容区又分为头部和展示区。。所以我们的效果显示如下:

 目录结构呢,也很简单,因为不涉及请求,所以就是vue+element+vuex即可

 这种就很适合做vue的静态页面演示开发,因为就只有几个页面,不涉及复杂的路由和权限啥的。

本博文是借鉴了这篇博客写的:vue+elementUi——实现后台管理系统的布局(sideBar+header+appMain)_element ui页面布局模板-CSDN博客

但是由于它的细节问题太多,在调试过程中也遇到了一些问题,所以重新写一篇调试完后的代码,主要的就是方便你我他。

2.关键代码

如果迁入自由的项目,可以复制对应的关键代码,store代码,配置对应的路由,自己调试也可。如果想直接拿来即用的,下面也会附上vue代码git地址。

index.vue 主页面,负责引入头部,侧边栏,主内容组件

<template><div class="app-wrapper"><div class="layout-aside" :class="isCollapse?'collapse':''"><div class="layout-logo"><router-link to="/"><img v-show="!isCollapse" style="width:50px;height:auto" src="@/assets/logo.png" alt="logo"/><img v-show="isCollapse" style="width:44px;height:auto" src="@/assets/logo.png" alt="logo"/><!-- <span v-show="!isCollapse">工业品超市管理后台</span> --></router-link></div><SideBar :collapse="isCollapse" /></div><div class="layout-container" :class="{collapse:isCollapse}"><div class="layout-header" :class="{collapse:isCollapse}"><Header /></div><div class="layout-main"><AppMain /></div></div></div>
</template>
<script>import Header from "@/components/Header";import SideBar from "@/components/SideBar";import AppMain from "@/components/AppMain";export default{name:'layout',//此页面在router/index.js中对应的namecomponents:{Header,SideBar,AppMain},computed:{isCollapse:function(){return this.$store.state.isCollapse;}},methods:{}}
</script>
<style lang="scss" scoped>
.app-wrapper{position:relative;
}
.layout-aside{position:fixed;left:0;top:0;height:100vh;width:210px;transition:all 0.3s;background-color:#fff;.layout-logo{height:60px;background-color:#ffffff;a{display:flex;width:100%;height:60px;justify-content:center;align-items:center;}img{width:100px;height:auto;}}
}
.layout-aside.collapse{width:64px;
}
.layout-container{margin-left:210px;height:100%;overflow:hidden;
}
.layout-container.collapse{margin-left:64px;transition:all 0.1s;
}
.layout-header{position:fixed;z-index:1;top:0;right:0;width:calc(100% - 210px);height:60px;box-shadow:0 1px 3px rgba(0,21,41,0.08);background-color:#fff;
}
.layout-header.collapse{width:calc(100% - 64px);transition:all 0.1s;
}
.layout-main{padding: 20px;min-height:calc(100vh - 150px);margin:70px 15px 10px 10px;background-color:#fff;
}
</style>

Header头部部分:

<template><div class="header-wrapper"><div class="header-left"><div class="open-icon" @click="handleCollapse"><i class="el-icon-s-fold" v-show="!isMenuOpen"></i><i class="el-icon-s-unfold" v-show="isMenuOpen"></i><span style="font-size:16px;margin-left:5px">梦缘系统</span></div><el-breadcrumb separator="/"><template v-for="(item,index) in breadcrumbList"><el-breadcrumb-item :key="index" v-if="item.meta.title" :to="{path:item.path}"></el-breadcrumb-item></template></el-breadcrumb></div><div class="header-right"><span class="header-user">{{currentName}},欢迎回来</span><el-dropdown  trigger="click"><span class="el-dropdown-line"><img src="https://liuqingwushui.top/usr/uploads/2024/10/09/1728443808722546.jpg" style="border-radius:50%;width:32px" alt="avatar"/><i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-item  icon="el-icon-setting">修改密码</el-dropdown-item ><el-dropdown-item  icon="el-icon-guide" @click.native="handleLogout">退出登录</el-dropdown-item ></el-dropdown-menu></el-dropdown></div></div>
</template>
<script>// import {logout} from "@/api/user";export default{name:'Header',data(){return {isMenuOpen:false,breadcrumbList:[],currentName:'admin'}},watch:{$route(to,from){this.updateBreadcrumb(to.matched);}},mounted(){this.updateBreadcrumb(this.$route.matched);},methods:{updateBreadcrumb(list=[]){this.breadcrumbList = list;},handleCollapse(){this.isMenuOpen= !this.isMenuOpen;this.$store.commit('changeCollapse',this.isMenuOpen);},handleLogout(){this.$confirm('确认退出?','提示',{confirmButtonTextt:'确定',cancelButtonText:'取消',type:'warning'}).then(()=>{//logout();this.$router.push('/login');}).catch(()=>{})}}}
</script>
<style lang="scss" scope>
.header-wrapper{display:flex;justify-content:space-between;align-content:center;padding:0 15px;height:60px;.header-left{display:flex;align-items:center;.open-icon{font-size:20px;margin-right:15px;cursor:pointer;display: flex;align-items: center;}}.header-right{display:flex;align-items:center;.header-user{margin-right:15px;}}
}
.el-dropdown-link{cursor:pointer;color:#409eff;img{width:40px;height:40px;border-radius:5px;}
}
.el-icon-arrow-down{font-size:12px;
}
.demostration{display:block;color:#8492a6;font-size:14px;margin-bottom:20px;
}
</style>

Sidebar侧边栏部分:

<template><el-scrollbar class="sidebar-scroll"><el-menu  class="el-menu-vertical-demo" :default-active="this.$route.path"  :collapse="isCollapse" router><template v-for="(item,index) in menuData"><el-submenu v-if="item.children && item.children.length > 0" :key="index" :index="item.path"><template slot="title"><i :class="item.meta.icon"></i><span>{{ item.meta.title }}</span></template><el-menu-itemv-for="(child,childIndex) in item.children":key="`${index}-${childIndex}`":index="child.path"><i :class="child.meta.icon"></i><span>{{ child.meta.title }}</span></el-menu-item></el-submenu><el-menu-item v-else :key="index" :index="item.path"><i :class="item.meta.icon"></i><span>{{ item.meta.title }}</span></el-menu-item></template></el-menu></el-scrollbar>
</template>
<script>import {mapState,mapGetters} from "vuex";export default{name:'SideBar',computed:{...mapGetters(['firstMenu','subMenu','menuData']),isCollapse:function(){return this.$store.state.isCollapse;}},props:{collapse:{type:Boolean,default:false}},data(){return {currentRouter:''}},watch:{$route(to,from){this.currentRouter = to.path;}},mouted(){this.currentRouter = this.$route.path;},methods:{}}
</script>
<style lang="scss" scoped>.sidebar-scroll{height:calc(100% - 60px);}.sidebar{height:100%;text-align:left;border-right:none;}.el-menu-vertical-demo:not(.el-menu--collapse) {width: 210px;min-height: 400px;}
</style>

Appmain主内容部分:

<template><div class="app-main"><transition name="fade-transfrom" mode="out-in"><router-view /></transition></div>
</template>
<script>
export default{name:'AppMain'
}
</script>
<style lang="scss" scope>.app-main{width:100%;height:100%;}
</style>

Store状态管理js:

// src/store/index.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state:{isCollapse:false,menuData:[{path:'/dream/home',meta:{icon:'el-icon-data-line',title:'首页'}},{path:'/dream/2',meta:{icon:'el-icon-office-building',title:'梦缘'}},{path:'/dream/3',meta:{icon:'el-icon-place',title:'流情'}},{path:'/dream/4',meta:{icon:'el-icon-postcard',title:'日志'}},{path:'/dream/5',meta:{icon:'el-icon-pie-chart',title:'数据'},children:[{path:'/dream/6',meta:{icon:'el-icon-postcard',title:'数据1'}},]   }]},mutations:{changeCollapse: (state,isCollapse) => {state.isCollapse = isCollapse},setMenuData(state,menuData){state.menuData = menuData;}},actions: {// 异步 actions},getters:{menuData(state,rootState){if(state.filterMenu){const {permissions,roles} = rootState.accout;return filterMenu(JSON.parse(JSON.stringfy(state.menuData)),permissions,roles)}return state.menuData;},firstMenu(state){const {menuData} = state;if(menuData.length>0&&!menuData[0].fullPath){formatFullPath(menuData);}return menuData.map(item=>{const menuItem = {...item};delete menuItem.children;return menuItem})},subMenu(state){const {menuData,activateFirst} = state;if(menuData.length>0&&!menuData[0].fullPath){formatFullPath(menuData);}const current = menuData.find(menu=>menu.fullPath== activatedFirst);return current && current.chilren||[]}},modules: {// 模块}
});

3.示例源码下载

git地址:vue-admin-static: vue+element后台管理极简版:头部和侧边导航栏,固定路由。适合写vue简单的静态演示,不适合做复杂系统开发

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32CubeIDE使用ADC采用DMA重大BUG

问题描述 STM32CubeIDE 1.8.0问题 大牛攻城狮最近调试STM32L151CBT6。由于项目上使用该款芯片做控制电源使用&#xff0c;其中涉及到多路ADC的数据采样。使用STM32CubeIDE 1.8.0版本详细如下图所示 注意这里的使用的软件版本号很关键。采用该款软件搭建工程&#xff0c;第一次…

物联网如何推动工业数字化转型?

全球步入数字经济时代&#xff0c;制造业的数字化转型已成为驱动经济发展的核心引擎。物联网作为工业数字化转型的强力推手&#xff0c;其深度融入不仅促进了生产流程的智能化与自动化&#xff0c;还实现了数据的实时分析与精准决策&#xff0c;为制造业企业带来了前所未有的创…

基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用。本文深入探讨了Langchain框架下的Prompt工程在调教LLM&#xff08;大语言模型&#xff09;方面的应用&#xff0c…

高效微调理解(prompt-tuning,p-tuning v1,p-tuning v2,lora)

高效微调&#xff08;prompt-tuning&#xff0c;p-tuning v1&#xff0c;p-tuning v2&#xff0c;lora&#xff09; 1.prompt-tuning&#xff1a; 例子理解&#xff1b;保持原本模型参数不变&#xff0c;通过训练提示词的参数调整prompt&#xff0c;使其与下游任务匹配。 例子…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)

SpringBoot教程&#xff08;二十四&#xff09; | SpringBoot实现分布式定时任务之Quartz&#xff08;动态新增、修改等操作&#xff09; 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…

用java来编写web界面

一、ssm框架整体目录架构 二、编写后端代码 1、编写实体层代码 实体层代码就是你的对象 entity package com.cv.entity;public class Apple {private Integer id;private String name;private Integer quantity;private Integer price;private Integer categoryId;public…

libaom 源码分析系列:noise_model.c 文件

libaom libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信(RTC)优化等,并定期进行更新以提高压缩效率和编码速度 。 libaom 的一些…

2.1 HTML5 - Canvas标签

文章目录 引言Canvas标签概述定义实例&#xff1a;创建画布 理解Canvas坐标系概述实例&#xff1a;获取Canvas坐标 获取Canvas环境上下文概述实例&#xff1a;获取Canvas上下文设置渐变色效果 结语 引言 大家好&#xff0c;今天我们要一起探索HTML5中一个非常有趣且强大的特性…

Redhat的yum源出错——如何将yum源换成阿里云Centos源

文章目录 引言1. 查看和删除已安装的yum包2. 查看系统的版本号3. 镜像文件下载4. 镜像文件安装5. 下载和安装repo文件6. 配置repo文件7. 更新软件包缓存8. 验证9. 问题问题1 参考文献 Linux RedHat更换阿里云yum源 Redhat8.0 yum install问题解决 阿里云镜像 引言 为什么redha…

六西格玛黑带项目:TBX-02无人机飞行稳定性提升——张驰咨询

一、项目背景与问题定义 TBX-02是该公司最新发布的消费级无人机&#xff0c;面向摄影爱好者和户外探险者。产品上市后&#xff0c;通过客户反馈和实际测试数据发现&#xff0c;该无人机在复杂飞行环境中&#xff0c;如强风或快速移动时&#xff0c;存在明显的飞行抖动和稳定性…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型&#xff1f;结论 &#x1f4af;指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…

一起体验AI动手实验,OceanBase 2024 年度发布会精彩预告

2024年OceanBase年度发布会将于10月23日在北京望京凯悦酒店举行。此次大会围绕“不止于记录”的主题&#xff0c;共同探讨当前数据库领域的前沿话题&#xff0c;包含主论坛、分论坛、AI 动手实训营、开源技术交流会等多个环节&#xff0c;诚邀全国各地的企业和开发者共同参与&a…

[论文期刊|稳定检索]2024年信号处理与光学工程国际会议(SPOE 2024 )

2024年信号处理与光学工程国际会议 2024 International Conference on Signal Processing and Optical Engineering 【1】大会信息 会议名称&#xff1a;2024年信号处理与光学工程国际会议 会议简称&#xff1a;SPOE 2024 大会时间&#xff1a;请查看官网 大会地点&#xf…

51单片机的智能电饭煲【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器按键、LED等模块构成。适用于智能电饭锅等相似项目。 可实现功能: 1、LCD1602实时显示温度、运行模式、煮饭等模式的计时时间 2、首先选择电饭锅的模式&#xff0c;如煮饭、煮粥、蒸、煲汤&#…

Android常用界面控件——ProgressBar

ProgressBar 目录 ProgressBar 在XML中定义ProgressBar ProgressBar风格样式 ProgressBar常用XML属性 在Java代码中控制ProgressBar 实例 什么是ProgressBar&#xff1f; ProgressBar是Android中的一个视图控件&#xff0c;主要用于表示一个任务的进度情况&#xff0c;…

【AI视频】复刻抖音爆款AI数字人作品初体验

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI视频 | AI数字人 文章目录 &#x1f4af;前言&#x1f4af;抖音上的爆火AI数字人视频&#x1f4af;注册HeyGen账号&#x1f4af;复刻抖音爆款AI数字人&#x1f4af;最终生成效果&#x1f4af;小结 对比原视频效果&#xff1a;…

有了WPF后Winform还有活路吗?

近年来&#xff0c;随着技术的不断发展&#xff0c;Windows Presentation Foundation&#xff08;WPF&#xff09;和Windows Forms&#xff08;WinForms&#xff09;这两种技术在开发桌面应用程序方面一直备受关注。虽然WPF以其强大的功能和灵活性吸引了众多开发者&#xff0c;…

谷歌-BERT-第四步:模型部署

1 需求 需求1&#xff1a;基于gradio实现大模型的WEB UI交互界面 2 接口 3 示例 import gradio as gr from transformers import *classifier pipeline("text-classification", model"./model", tokenizer"./model")gr.Interface.from_pipel…

HarmonyOS NEXT 应用开发实战(三、ArkUI页面底部导航TabBar的实现)

在开发HarmonyOS NEXT应用时&#xff0c;TabBar是用户界面设计中不可或缺的一部分。本文将通过代码示例&#xff0c;带领大家一同实现一个常用的TabBar&#xff0c;涵盖三个主要的内容页&#xff1a;首页、知乎日报和我的页面。以模仿知乎日报的项目为背景驱动&#xff0c;设定…

搭建`mongodb`副本集-开启权限认证 mongo:7.0.5

搭建mongodb副本集-开启权限认证 mongo:7.0.5 1.5.1、创建文件 创建配置文件保存目录和数据保存目录 mkdir -p /data/mongodb/{/conf,/data,/logs}生成和设置权限 这个文件一定要在一个服务里面生成然后复制到其它服务器&#xff0c;所有服务器的这个key一定是相同的。 op…