vue-element-admin后台管理系统 - 二次开发指南

vue-element-admin 后台管理系统开发指南

TIP

vue-element-admin 是一个基于 Vue 和 Element UI 的后台管理系统解决方案,提供了丰富的功能和组件。


项目介绍

vue-element-adminopen in new window 是一个后台前端解决方案,内置了:

  • 🔐 动态路由和权限验证
  • 📊 丰富的图表组件
  • 📝 多种表单组件
  • 🎨 主题切换
  • 🌐 国际化

快速开始

克隆项目

# 克隆项目
git clone https://github.com/PanJiaChen/vue-element-admin.git

# 进入项目目录
cd vue-element-admin

# 安装依赖
npm install

# 启动开发服务器
npm run dev

项目结构

├── build/                  # 构建配置
├── src/
│   ├── api/               # API 接口
│   ├── assets/            # 静态资源
│   ├── components/        # 公共组件
│   ├── icons/             # SVG 图标
│   ├── layout/            # 布局组件
│   ├── router/            # 路由配置
│   ├── store/             # Vuex 状态管理
│   ├── styles/            # 全局样式
│   ├── utils/             # 工具函数
│   ├── views/             # 页面组件
│   ├── App.vue            # 根组件
│   ├── main.js            # 入口文件
│   ├── permission.js      # 权限控制
│   └── settings.js        # 配置文件
├── .env.development       # 开发环境变量
├── .env.production        # 生产环境变量
└── vue.config.js          # Vue CLI 配置

路由配置

静态路由

// src/router/index.js
export const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [{
      path: 'dashboard',
      name: 'Dashboard',
      component: () => import('@/views/dashboard/index'),
      meta: { title: '首页', icon: 'dashboard' }
    }]
  }
]

动态路由(权限控制)

// src/router/index.js
export const asyncRoutes = [
  {
    path: '/permission',
    component: Layout,
    redirect: '/permission/page',
    name: 'Permission',
    meta: {
      title: '权限管理',
      icon: 'lock',
      roles: ['admin']  // 仅 admin 可见
    },
    children: [
      {
        path: 'page',
        component: () => import('@/views/permission/page'),
        name: 'PagePermission',
        meta: { title: '页面权限', roles: ['admin'] }
      }
    ]
  }
]

权限控制

登录流程

// src/store/modules/user.js
const actions = {
  // 登录
  login({ commit }, userInfo) {
    return new Promise((resolve, reject) => {
      login(userInfo).then(response => {
        const { data } = response
        commit('SET_TOKEN', data.token)
        setToken(data.token)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },
  
  // 获取用户信息
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(response => {
        const { data } = response
        commit('SET_ROLES', data.roles)
        commit('SET_NAME', data.name)
        resolve(data)
      })
    })
  }
}

路由守卫

// src/permission.js
router.beforeEach(async (to, from, next) => {
  const hasToken = getToken()
  
  if (hasToken) {
    if (to.path === '/login') {
      next({ path: '/' })
    } else {
      const hasRoles = store.getters.roles && store.getters.roles.length > 0
      if (hasRoles) {
        next()
      } else {
        // 获取用户信息和权限
        const { roles } = await store.dispatch('user/getInfo')
        // 根据角色生成可访问路由
        const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
        router.addRoutes(accessRoutes)
        next({ ...to, replace: true })
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      next()
    } else {
      next(`/login?redirect=${to.path}`)
    }
  }
})

API 请求封装

请求工具

// src/utils/request.js
import axios from 'axios'
import { Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'

const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      config.headers['Authorization'] = 'Bearer ' + getToken()
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    if (res.code !== 200) {
      Message.error(res.message || '请求失败')
      return Promise.reject(new Error(res.message || 'Error'))
    }
    return res
  },
  error => {
    Message.error(error.message)
    return Promise.reject(error)
  }
)

export default service

API 模块

// src/api/user.js
import request from '@/utils/request'

export function login(data) {
  return request({
    url: '/user/login',
    method: 'post',
    data
  })
}

export function getInfo(token) {
  return request({
    url: '/user/info',
    method: 'get',
    params: { token }
  })
}

export function logout() {
  return request({
    url: '/user/logout',
    method: 'post'
  })
}

常用配置

修改网站标题

// src/settings.js
module.exports = {
  title: '我的后台管理系统',
  showSettings: true,
  tagsView: true,
  fixedHeader: false,
  sidebarLogo: true
}

修改 API 地址

# .env.development
VUE_APP_BASE_API = '/dev-api'

# .env.production
VUE_APP_BASE_API = 'https://api.example.com'

相关链接

如有问题,欢迎在评论区留言!

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.8