Vue + Element-ui实现后台管理系统---项目搭建 + ⾸⻚布局实现

news2025/1/18 17:15:20

目录:导读

项目搭建 + ⾸⻚布局实现

一、项目搭建

1、环境搭建

2、项目初期搭建

二、Main.vue

三、左侧栏部分(CommonAside.vue)

四、header部分(CommonHeader.vue)

五、Home.vue

写在最后


项目搭建 + ⾸⻚布局实现

这篇主要讲解 项目搭建 + 后台⾸⻚布局实现 :

整体效果

后台首页按布局一共包含3个部分: 1、左侧栏部分 2、头部部分 3、内容部分。

说明 在整个后台管理系统中,左侧栏和头部部分是应该一直在页面中展示的,所以对于每个页面这两个组件都应该存在,而 内容部分 才是通过router的跳转而跳到不同的组件。

下面先把整个项目搭建一下,然后再来讲解上面三个部分

一、项目搭建

1、环境搭建

#1、安装node (node -v查询版本号)
node 安装 

#2、安装淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org

#3、安装 webpack,以全局的方式安装
npm install webpack -g

#4、全局安装vue以及脚手架vue-cli
npm install @vue/cli -g --unsafe-perm

#5、创建vue项目 mall-manage-system是你起的项目名称
vue create mall-manage-system

#6、运行当前项目 这个整个项目就搭建好了
npm run serve

在安装中可能会存在的问题

1、node升级后,项目中的node-sass报错的问题

2、npm install 报错,提示 gyp ERR! stack Error: EACCES: permission denied 解决方法

2、项目初期搭建

如果上面都安装成功,那么通过 npm run serve 就可用启动该项目了。这里把简单说明下一些公共配置

1、main.js(主文件)

import Vue from 'vue'
import App from './App.vue'
import router from './router'  //引入 vue-router
import store from './store'    //引入 vuex
// 全局配置
import '@/assets/scss/reset.scss' //全局样式
import 'element-ui/lib/theme-chalk/index.css' //element-ui样式
import http from '@/api/config'  //axios
import './mock'   // mockjs
// 第三方包
import ElementUI from 'element-ui'
Vue.use(ElementUI)
Vue.prototype.$http = http
Vue.config.productionTip = false
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

2、router(路由跳转配置)

router作用:简单理解就是帮助组件之间跳转用的。

这里为了性能都采用懒加载,还有这里不管先登陆登陆页面 默认跳转组件为 Main.vue

import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)

// 完整路由代码
export default new VueRouter({
  routes: [
    {
      path: '/',
      component: () => import('@/views/Main'),
      children: [
        {
          path: '/',
          name: 'home',
          component: () => import('@/views/Home/Home'),
        },
        {
          path: '/user',
          name: 'user',
          component: () => import('@/views/UserManage/UserManage'),
        },
        {
          path: '/mall',
          name: 'mall',
          component: () => import('@/views/MallManage/MallManage'),
        },
        {
          path: '/page1',
          name: 'page1',
          component: () => import('@/views/Other/PageOne'),
        },
        {
          path: '/page2',
          name: 'page2',
          component: () => import('@/views/Other/PageTwo'),
        },
      ]
    }
  ]
})

3、vuex(存储共享数据)

vuex作用:vuex解决了组件之间同一状态的共享问题。

export default {
  //存储数据
  state: {
    isCollapse: false
  },
  //调用方法
  mutations: {
    collapseMenu(state) {
      state.isCollapse = !state.isCollapse
    }
  },
  actions: {}
}

这里先只设定一个全局数据isCollapse,用于侧边栏是否水平展开。

4、axios

axios作用:axios主要是用于向后台发起请求的,还有在请求中做更多是可控功能。

import axios from 'axios'

// 创建一个axios实例
const service = axios.create({
  // 请求超时时间
  timeout: 3000
})

export default service

其它的这里就不详细讲解了,在文章最下面会附上github地址

二、Main.vue

这个是后台系统的主组件,它采用的布局是 element-ui的 Container 布局容器 Container 布局容器

<template>
    <el-container style="height: 100%">
        <!--左侧栏-->
        <el-aside width="auto">
            <!--左侧栏控件-->
            <common-aside></common-aside>
        </el-aside>
        <!--右侧栏-->
        <el-container>
            <!--header部分-->
            <el-header>
                <!--header部分控件-->
                <common-header></common-header>
            </el-header>
            <el-main>
   <!--左侧栏 和 header部分对于整个后台部分都是不变的,唯一变的就是上面3的部分,这里就通过router-view来展示所需控件-->
                <router-view/>
            </el-main>
        </el-container>
    </el-container>
</template>

<script>
    import CommonAside from '../components/CommonAside'
    import CommonHeader from "../components/CommonHeader";

    export default {
        components: {
            CommonAside,
            CommonHeader
        }
    }
</script>

这样整个后台管理系统的整个轮廓就定下来了,接下来通过路由的切换的组件展示在router-view的位置。

三、左侧栏部分(CommonAside.vue)

它采用的布局是 element-ui的 NavMenu 导航菜单

<template>
  <!--collapse 是否水平折叠收起菜单-->
  <el-menu
    :collapse="isCollapse"
    :default-active="$route.path"
    class="el-menu-vertical-demo"
    background-color="#545c64"
    text-color="#fff"
    active-text-color="#ffd04b"
  >
    <!--是否水平折叠收起菜单 会影响这里字段的显示 -->
    <h3 v-show="isCollapse">偶囧</h3>
    <h3 v-show="!isCollapse">偶囧后台管理系统</h3>
    <el-menu-item :index="item.path" v-for="item in noChildren" :key="item.path" @click="clickMenu(item)">
      <i :class="'el-icon-' + item.icon"></i>
      <span slot="title">{{ item.label }}</span>
    </el-menu-item>
    <el-submenu :index="item.label" v-for="(item, index) in hasChildren" :key="index">
      <template slot="title">
        <i :class="'el-icon-' + item.icon"></i>
        <span slot="title">{{ item.label }}</span>
      </template>
      <el-menu-item-group>
        <el-menu-item :index="subItem.path" v-for="(subItem, subIndex) in item.children" :key="subIndex" @click="clickMenu(subItem)">
          <i :class="'el-icon-' + subItem.icon"></i>
          <span slot="title">{{ subItem.label }}</span>
        </el-menu-item>
      </el-menu-item-group>
    </el-submenu>
  </el-menu>
</template>

<script>
export default {
  //计算属性
  computed: {
    //没有子菜单
    noChildren() {
      return this.menu.filter(item => !item.children)
    },
    //有子菜单 (这样设置会有一个问题 就是有子菜单的 永远会在没有子菜单的下面)
    hasChildren() {
      return this.menu.filter(item => item.children)
    },
    isCollapse() {
      // 这里的数据就是从vuex取得
      return this.$store.state.tab.isCollapse
    }
  },
  data() {
    return {
      menu: [
        {
          path: '/user',
          name: 'user',
          label: '用户管理',
          icon: 'user',
          url: 'UserManage/UserManage'
        },
        {
          label: '其他',
          icon: 'location',
          children: [
            {
              path: '/page1',
              name: 'page1',
              label: '页面1',
              icon: 'setting',
              url: 'Other/PageOne'
            },
            {
              path: '/page2',
              name: 'page2',
              label: '页面2',
              icon: 'setting',
              url: 'Other/PageTwo'
            }
          ]
        }
      ]
    }
  },
  methods: {
    //跳转路由 根据名称跳转
    clickMenu(item) {
      this.$router.push({ name: item.name })
    }
  }
}
</script>

四、header部分(CommonHeader.vue)

这里通过点击那个图标来控制:左侧栏是否水平折叠收起菜单,所以这里来修改vuex中 isCollapse 数据。

它采用的布局是 element-ui的 Dropdown 下拉菜单

<template>
    <header>
        <div class="l-content">
            <el-button plain icon="el-icon-menu" size="mini" @click="collapseMenu"></el-button>
            <h3 style=" color : #fff">首页</h3>
        </div>
        <div class="r-content">
            <el-dropdown trigger="click" size="mini">
                <span class="el-dropdown-link"><img :src="userImg" class="user"/></span>
                <el-dropdown-menu slot="dropdown">
                    <el-dropdown-item>个人中心</el-dropdown-item>
                    <el-dropdown-item @click.native="logOut">退出</el-dropdown-item>
                </el-dropdown-menu>
            </el-dropdown>
        </div>
    </header>
</template>

<script>
    export default {
        data() {
            return {
                userImg: require('../assets/images/user.png')
            }
        },
        methods: {
            //控制左侧菜单是否折叠
            collapseMenu() {
                this.$store.commit('collapseMenu')
            },
            //退出登陆
            logOut() {
                location.reload()
            }
        }
    }
</script>

五、Home.vue

它采用的布局是 element-ui的 Card 卡片 + Layout 布局

<template>
    <el-row class="home" :gutter="20">
     <!--span默认一共是24,这里占8 下面占16,所以这两个分隔栏所占的宽度 是1:2-->
    <el-col :span="8" style="margin-top: 20px">
        <!--shadow属性设置卡片阴影出现的时机-->
        <el-card shadow='hover'>
            <div class="user">
                <img :src="userImg"/>
                <div class="userinfo">
                    <p class="name">Admin</p>
                    <p class="access">超级管理员</p>
                </div>
            </div>
            <div class="login-info">
                <p>上次登录时间:<span>2019-10-20</span></p>
                <p>上次登录地点:<span>北京</span></p>
            </div>
        </el-card>
        <el-card style="height: 460px ; margin-top: 20px">
            <el-table :data="tableData">
                <el-table-column show-overflow-tooltip v-for="(val, key) in tableLabel" :key="key" :prop="key"
                                 :label="val"></el-table-column>
            </el-table>
        </el-card>
    </el-col>
        <el-col :span="16" style="margin-top: 20px">
            <div class="num">
                <el-card shadow="hover" v-for="item in countData" :key="item.name" :body-style="{ display: 'flex', padding: 0}">
                    <i class="icon" :class="`el-icon-${item.icon}`" :style="{ background: item.color }"></i>
                    <div class="detail">
                        <p class="num">¥ {{ item.value }}</p>
                        <p class="txt">{{ item.name }}</p>
                    </div>
                </el-card>
            </div>
            <el-card shadow="hover" style="height: 280px">
            </el-card>
            <div class="graph">
                <el-card shadow="hover" style="height: 260px">
                </el-card>
                <el-card shadow="hover" style="height: 260px">
                </el-card>
            </div>
        </el-col>
    </el-row>
</template>

<script>
    export default {
        data() {
            return {
                userImg: require('../../assets/images/user.png'),
                countData: [],
                tableData: [],
                tableLabel: {
                    name: '课程',
                    todayBuy: '今日购买',
                    monthBuy: '本月购买',
                    totalBuy: '总购买'
                }
            }
        },
        methods: {
            getTableData() {
                this.$http.get('/home/getData').then(res => {
                    res = res.data
                    this.tableData = res.data.tableData
                })
            }
        },
        //一进组件就会去请求后端接口 获取首页数据
        created() {
            this.getTableData()
        }
    }

Github地址 mall-manage-system

写在最后

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

都到这了记得三连支持一下吧。

-------------------------------------------------

完整版文档下载方式:

这些资料,对于从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享。

在评论区和我互动交流或者私❤我【软件测试学习】领取即可,拿走不谢。

-------------------------------------------------

 

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

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

相关文章

Oracle项目管理之设施与资产管理Facilities and Asset(中文)

目录 维护管理 独立或集成 设施状况评估 空间管理 租赁管理 交易管理 资产组合管理 投资组合管理能力 可持续性和能源管理 单一综合设施和资产生命周期管理 Oracle Primavera Unifier 设施与资产管理是一个功能强大且易于使用的解决方案&#xff0c;用于管理您的财产…

第九章服务器内部转发和客户端重定向

文章目录为什么需要转发和重定向服务器内部转发客户端重定向重定向的相关的状态码对比转发和重定向的应用场景为什么需要转发和重定向 发一个请求给Servlet&#xff0c;接力棒就传递到了Servlet手中。而绝大部分情况下&#xff0c;Servlet不能独自完成一切&#xff0c;需要把接…

云原生之使用docker部署qbittorrent

云原生之使用docker部署qbittorrent一、qbittorrent介绍二、检查本地docker状态三、下载qbittorrent四、部署qbittorrent1.创建数据目录2.创建qbittorrent容器3.查看qbittorrent容器状态五、访问qbittorrent1.进入qbittorrent 登录页2.进入qbittorrent 首页六、qbittorrent的基…

在 Vue 中,使用 $attrs 构建高级组件

我们来看下 Vue3 中的 $attrs 属性。首先&#xff0c;我们会介绍它的用途以及它的实现与 Vue2 有哪些不两同点&#xff0c;并通过事例来加深对它的理解。 真正理解了 $attrs 属性有助于我们构建易于使用和可扩展的高级组件 什么是 $attrs 对 $attrs 定义&#xff0c; Vue2 与…

百亿诈骗案频出,欧科云链用“技术责任”拓宽Web3安全边界

2022年12月1日&#xff0c;《中华人民共和国反电信网络诈骗法》正式实施&#xff0c;中国正式迈入“全民反诈时代”。据CNNIC和智研咨询统计显示&#xff0c;截至2021年12月&#xff0c;国内网民遭遇网络诈骗比例为16.6%&#xff0c;数千万人深受网络诈骗的危害。 以新兴技术区…

第05讲:Security之基于注解的用户授权

使用注解进行用户授权只需要两个步骤&#xff1a; 在SecurityConfig配置类上添加开启用户授权的注解EnableGlobalMethodSecurity(securedEnabled true)在需要被授权的Controller上添加授权的注解 一、新建项目&#xff0c;并进项相关配置 参考&#xff1a;第04讲&#xff1…

重大变化:Documents for Excel (GcExcel) 6.0-Crack

GrapeCity Documents for Excel&#xff0c;Java 版 在 Java 应用程序中以编程方式轻松生成、加载、修改和转换 Excel .xlsx 电子表格。GrapeCity Documents for Excel (GcExcel) 是一个跨平台的高速、占用空间小的电子表格 API 库&#xff0c;不需要依赖 Excel。使用此电子表…

《山本耀司》- 我不烦你,请你也不要来烦我

《山本耀司: 我投下一枚炸弹》 关于作者 山本耀司是时尚界日本新浪潮的新掌门 人&#xff0c;与川久保玲、三宅一生并称日本时尚 界的三驾马车&#xff0c;同时也是20世纪80年代闯 入巴黎时装舞台的先锋派人物之一。他的设计以黑色为主色调&#xff0c;奔放且宽松&#xff0c;…

Mac环境编译安装tesseract-4.1.1

Mojave 编译安装 tesseract-4.1.1 前言 顺便学习下Python&#xff0c;尝试使用Python3安装tesseract进行文字识别&#xff0c;结果踩了好深一个坑&#xff0c;特此记念…… 好多坑&#xff0c;好多坑…… 参考彭世瑜的这一篇&#xff1a;https://blog.csdn.net/mouday/arti…

一起从零开始学VUE(15)初识VUE3

创建Vue3.0工程 使用vue cli 需要保证vue的版本在4.5以上使用vite创建——新一代前端构建工具 开发环境中&#xff0c;无需打包操作&#xff0c;可快速的冷启动轻量快速的热重载HMR真正的按需编译&#xff0c;不再等待整个应用编译完成 步骤 创建工程 npm init vite-app <…

docker安装达梦数据库最佳实践

达蒙数据库 数据库安装部署 下载地址&#xff1a;产品下载 | 达梦数据库 安装博客地址&#xff1a;安装前准备 | 达梦技术文档 到官网docker部署那一章节&#xff0c;下载镜像tar包&#xff0c;上传到服务器上后&#xff0c;运行下面的命令 docker安装启动脚本&#xff1a;…

window10录屏怎么录?看完这篇文章,快速掌握

Windows系统的电脑用户有不少&#xff0c;有时我们需要录制屏幕与朋友分享电脑屏幕上的内容&#xff0c;windows10录屏怎么录&#xff1f;其实windows10录屏的操作很简单&#xff0c;今天小编就和大家分享详细的windows10录屏的操作步骤。 一、使用QQ对windows10录屏 很多小伙…

java计算机毕业设计基于安卓Android的跨校区班车乘车预约系统APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把班车乘车预约与现在网络相结合,利用java 技术建设班车乘车预约APP,实现谷惠农产品线上销售的信息化。则对于进一步提高乘车发展,班车乘车预约经验能起到不少的促进作用。 班车乘车预约APP能够通过互联网得到广泛的、全面…

SSM整合xml方式(精简版)

注&#xff1a;本次只介绍ssm整合的核心部分&#xff0c;不重要的部分进行了省略 1、maven核心依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2…

BEPUphysicsint碰撞事件详解

上一节我们給大家介绍了BEPUphysicsint的基本使用,在游戏开发中我们经常要使用物理引擎的事件&#xff0c;所以本节我们详细的讲解BEPUphysicsint 的物理事件。此物理引擎会产生了碰撞事件与非碰撞事件&#xff0c;碰撞事件大家好理解&#xff0c;非碰撞事件例如: 物理Entity的…

携程季报图解:营收69亿同比增29% 净利为2.45亿

雷递网 雷建平 12月15日携程集团有限公司&#xff08;纳斯达克&#xff1a;TCOM&#xff1b;香港联交所&#xff1a;9961&#xff09;今日发布财报。财报显示&#xff0c;携程2022年第三季度营收为69亿元&#xff0c;同比增长29%&#xff1b;净利润为2.45亿元&#xff1b;经调整…

原生拖拽太拉跨了,纯JS自己手写一个拖拽效果,纵享丝滑

前言 提到元素拖拽&#xff0c;通常都会先想到用 HTML5 的拖拽放置 (Drag 和 Drop) 来实现&#xff0c;它提供了一套完整的事件机制&#xff0c;看起来似乎是首选的解决方案&#xff0c;但实际却不是那么美好&#xff0c;主要是它的样式太过简陋&#xff0c;无法实现更高级的用…

spring boot实现文件上传和下载

文章目录 spring boot实现文件上传 1.文件上传 2.文件下载 1.文件上传 1.代码如下&#xff1a; package com.example.demo; import org.omg.PortableInterceptor.ServerRequestInfo; import org.springframework.stereotype.Controller; import org.springframework.we…

k8s 综合部署练习(针对负载均衡+外网访问web)

部署需求 &#xff08;1&#xff09;Kubernetes 区域可采用 Kubeadm 方式进行安装。 &#xff08;2&#xff09;要求在 Kubernetes 环境中&#xff0c;通过yaml文件的方式&#xff0c;创建Deployment控制器和4个Nginx Pod副本&#xff0c;并进入容器中修改index.html文件内容&…

【12月13日更新半决赛预测】用二元泊松模型预测2022年世界杯淘汰赛结果

用二元泊松模型预测2022年世界杯淘汰赛结果 网上有很多文章用双泊松&#xff08;Double Poisson&#xff09;模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷&#xff0c;那就是它假设比赛中两队的比分是条件独立的。而我们都知道&#xff0c;在对抗性比赛中&…