vue-element-admin后台管理系统 - 二次开发指南
vue-element-admin 后台管理系统开发指南
TIP
vue-element-admin 是一个基于 Vue 和 Element UI 的后台管理系统解决方案,提供了丰富的功能和组件。
项目介绍
vue-element-admin 是一个后台前端解决方案,内置了:
- 🔐 动态路由和权限验证
- 📊 丰富的图表组件
- 📝 多种表单组件
- 🎨 主题切换
- 🌐 国际化
快速开始
克隆项目
# 克隆项目
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
