当前位置:首页 > VUE

vue elementui实现管理后台

2026-01-21 18:55:48VUE

Vue + ElementUI 实现管理后台

环境准备

确保已安装 Node.js(建议版本 14+)和 npm/yarn。使用 Vue CLI 创建项目:

vue create admin-demo
cd admin-demo

安装 ElementUI 和依赖:

vue add element
npm install axios vue-router vuex --save

项目结构

典型管理后台目录结构:

src/
├── api/           # 接口封装
├── assets/        # 静态资源
├── components/    # 公共组件
├── router/        # 路由配置
├── store/         # Vuex状态管理
├── utils/         # 工具函数
├── views/         # 页面组件
├── App.vue        # 根组件
└── main.js        # 入口文件

基础配置

main.js 中引入 ElementUI:

import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)

布局实现

使用 ElementUI 的布局组件构建框架:

<template>
  <el-container>
    <el-aside width="200px">
      <el-menu router>
        <el-submenu index="1">
          <template slot="title">系统管理</template>
          <el-menu-item index="/user">用户管理</el-menu-item>
        </el-submenu>
      </el-menu>
    </el-aside>

    <el-container>
      <el-header>Header</el-header>
      <el-main>
        <router-view></router-view>
      </el-main>
    </el-container>
  </el-container>
</template>

路由配置

router/index.js 中配置动态路由:

const routes = [
  {
    path: '/',
    component: Layout,
    children: [
      {
        path: '/user',
        component: () => import('@/views/UserManage'),
        meta: { title: '用户管理' }
      }
    ]
  }
]

API 封装

api/user.js 中封装接口:

import request from '@/utils/request'

export function getUsers(params) {
  return request({
    url: '/api/users',
    method: 'get',
    params
  })
}

表格组件

用户管理页示例:

<template>
  <div>
    <el-table :data="userList">
      <el-table-column prop="name" label="姓名"></el-table-column>
      <el-table-column prop="role" label="角色"></el-table-column>
    </el-table>

    <el-pagination
      @size-change="handleSizeChange"
      @current-change="handleCurrentChange"
      :current-page="page"
      :page-sizes="[10, 20, 50]"
      :page-size="size"
      layout="total, sizes, prev, pager, next"
      :total="total">
    </el-pagination>
  </div>
</template>

<script>
import { getUsers } from '@/api/user'

export default {
  data() {
    return {
      userList: [],
      page: 1,
      size: 10,
      total: 0
    }
  },
  created() {
    this.fetchData()
  },
  methods: {
    fetchData() {
      getUsers({
        page: this.page,
        size: this.size
      }).then(res => {
        this.userList = res.data.list
        this.total = res.data.total
      })
    },
    handleSizeChange(val) {
      this.size = val
      this.fetchData()
    },
    handleCurrentChange(val) {
      this.page = val
      this.fetchData()
    }
  }
}
</script>

权限控制

通过路由守卫实现权限验证:

router.beforeEach((to, from, next) => {
  const hasToken = localStorage.getItem('token')
  if (to.path === '/login') {
    next()
  } else {
    hasToken ? next() : next('/login')
  }
})

主题定制

修改 ElementUI 主题色:

  1. 安装主题生成工具:
    npm install element-theme -g
    npm install element-theme-chalk -D
  2. 初始化变量文件:
    et -i ./src/element-variables.scss
  3. 修改变量后编译:
    et
  4. main.js 中引入自定义主题:
    import '../theme/index.css'

优化建议

  • 使用动态路由配合后端权限数据
  • 封装高阶组件处理重复逻辑
  • 添加全局 loading 状态管理
  • 实现多标签页功能
  • 集成国际化方案
  • 使用 keep-alive 缓存页面状态

通过以上步骤可以快速搭建基于 Vue 和 ElementUI 的管理后台系统,具体实现可根据实际需求调整架构和功能模块。

vue elementui实现管理后台

标签: 后台vue
分享给朋友:

相关文章

vue实现全文检索

vue实现全文检索

Vue 实现全文检索的方法 客户端全文检索(适用于小型数据集) 使用 flexsearch 或 lunr.js 等轻量级库实现前端全文检索: import FlexSearch from 'flex…

vue实现文档导入

vue实现文档导入

Vue 实现文档导入的方法 在 Vue 中实现文档导入功能通常涉及文件上传、解析和处理。以下是几种常见的方法: 使用原生文件输入和 FileReader 通过 HTML 的原生 <input…

vue 实现长列表

vue 实现长列表

Vue 实现长列表的优化方案 虚拟滚动技术 虚拟滚动是处理长列表的高效方式,仅渲染可视区域内的元素。通过计算滚动位置动态加载和卸载DOM节点,大幅减少内存占用和渲染压力。 <template&…

vue点击实现排序

vue点击实现排序

实现点击排序的方法 在Vue中实现点击排序功能,可以通过以下几种方式完成: 使用计算属性结合排序方法 定义一个响应式数据存储排序状态,通过计算属性动态返回排序后的数组。点击事件切换排序状态。…

vue 移动端实现签名

vue 移动端实现签名

Vue 移动端签名实现方法 在移动端实现签名功能,可以通过HTML5的Canvas结合触摸事件完成。以下是具体实现步骤: 使用Canvas绘制签名 安装vue-signature-pad插件或直接使…

vue实现下拉刷新组件

vue实现下拉刷新组件

实现下拉刷新组件的核心思路 下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件,…