vue - admin - template 怎么快速上手?从项目搭建到功能拓展一次讲透
很多做后台管理系统的同学,想快速搭框架又不想从头写 Vue + Element UI?vue - admin - template 就是现成的“脚手架”,但刚接触时一堆文件看不懂、权限逻辑摸不透……这篇用问答形式把核心知识点拆明白,新手也能跟着做。
vue - admin - template 是什么,适合哪些场景用?
vue - admin - template 是社区基于 Vue 2 + Element UI 开发的轻量级后台模板(可以理解为「vue - element - admin」的简化版——后者功能全但重,template 更适合快速启动项目)。
它的适用场景很明确:
- 公司内部小后台(比如数据报表、用户管理系统);
- 毕设、练手项目(不用自己折腾布局、侧边栏、面包屑);
- 需求紧急的原型开发(直接改业务逻辑,节省基础开发时间)。
怎么搭建 vue - admin - template 项目环境?
想跑通项目,得先把环境搭好,步骤不难,但细节容易踩坑,咱一步步来:
- 装 Node.js:建议选 14 + 版本(太新可能有兼容问题),装完打开终端输
node - v验证版本。 - 克隆项目:终端执行
git clone https://github.com/PanJiaChen/vue - admin - template.git(没装 Git 就去 GitHub 下载 zip 解压)。 - 进项目目录:
cd vue - admin - template。 - 装依赖:执行
npm install,要是卡着不动,换国内源试试:npm install --registry=https://registry.npm.taobao.org;node - sass报错,换成sass:先卸载npm uninstall node - sass,再装npm install sass sass - loader。 - 启动开发环境:
npm run dev,浏览器打开http://localhost:9528,看到登录页就成功了!
踩坑提示:
npm install报错?先检查 Node 版本,再换源试试;- 启动后白屏?看控制台报错,可能是 Vue 和 Element UI 版本不匹配,或者路由配置错了。
项目目录结构太复杂?核心文件作用拆解
刚打开项目,满屏文件夹容易懵,咱聚焦 src 目录(最核心的业务代码都在这),逐个拆:
- api:管理接口请求!
request.js是 axios 封装(加了请求拦截、响应拦截,处理 token、错误);user.js/order.js这类文件,专门封装某模块的接口(比如用户登录、订单列表)。 - assets:放静态资源!图片、全局 CSS、JS 都丢这。
global.css能覆盖 Element UI 默认样式。 - components:存公共组件!像侧边栏(Sidebar)、顶部栏(Header)、多标签页(TagsView)这些模板自带的组件,你自己写的复用性高的组件也放这。
- router:配置路由!
index.js里分静态路由(登录、404 这些)和动态路由(靠权限逻辑加载);每个路由的meta里能写标题、是否需要权限。 - store:Vuex 状态管理!
modules里分模块(user.js存用户信息,permission.js存权限路由),getters统一管理计算属性。 - views:放业务页面!每个文件夹对应一个页面(
Dashboard是首页),写页面组件就往这丢。 - permission.js:权限控制核心!靠「导航守卫(
router.beforeEach)」判断用户是否登录、有没有权限,动态加载路由。 - main.js:项目入口!引入 Vue、Element UI、全局样式,创建 Vue 实例并挂载 App。
举个例子:你要加个「订单管理」页面,流程是:
- 在
views新建Order文件夹,写Order.vue; - 去
router/index.js配置路由,加meta.roles控制权限; - 接口放
api/order.js,调接口时用this.$store.dispatch或者直接import接口函数。
如何基于模板开发第一个页面?
拿「用户列表」页面举例子,步骤清晰到能直接抄:
新建页面组件
在 src/views 下建 User/User.vue,写基础结构:
<template>
<div class="user - page">
<!-- Element UI 表格 -->
<el - table :data="tableData">
<el - table - column prop="name" label="姓名"></el - table - column>
<el - table - column prop="age" label="年龄"></el - table - column>
</el - table>
<!-- Element UI 分页 -->
<el - pagination layout="total, sizes, prev, pager, next, jumper" :total="100"></el - pagination>
</div>
</template>
<script>
export default {
name: 'User',
data() {
return {
tableData: [/* 先放假数据,{ name: '张三', age: 20 } */]
}
}
}
</script>
配置路由
打开 src/router/index.js,在静态路由(不需要权限的场景)里加配置:
{
path: '/user',
component: Layout, // Layout 是模板自带的布局组件,包含侧边栏 + 主体
redirect: '/user/list',
children: [
{
path: 'list',
name: 'UserList',
component: () => import('@/views/User/User.vue'), // 懒加载组件
meta: { title: '用户列表', icon: 'user' } // title 是侧边栏显示名称,icon 用 Element UI 图标
}
]
}
调真实接口
去 src/api/user.js 封装接口:
import request from '@/utils/request' // 引入 axios 封装
export function getUsers(data) {
return request({
url: '/user/list', // 后端接口地址
method: 'post',
data // 传参
})
}
然后在 User.vue 里调用接口:
<script>
import { getUsers } from '@/api/user' // 引入接口
export default {
// ...
created() {
this.getTableData() // 页面创建时请求数据
},
methods: {
async getTableData() {
const res = await getUsers({ page: 1, size: 10 }) // 传参
this.tableData = res.data.list // 把接口返回的真实数据赋值给表格
}
}
}
</script>
侧边栏自动渲染
因为路由配了 meta.title 和 icon,侧边栏会自动生成「用户列表」选项,刷新页面,点进去就能看到表格和分页啦~
权限管理逻辑怎么理解和改造?
模板默认是「角色权限」模式,流程如下:
- 用户登录 → 后端返回角色(
admin、editor)→ 前端把角色存到 Vuex(store/modules/user.js里的roles)。 - 导航守卫(
permission.js)里,根据roles判断能访问哪些路由 → 用router.addRoute动态加载路由(逻辑在store/modules/permission.js里)。 - 路由配置里的
meta.roles数组(meta: { roles: ['admin'] }),表示只有admin角色能进这个页面。
想改造权限逻辑?看这两种常见需求:
- 按钮权限:在 Vuex 存用户权限点(
user.permissions: ['btn_add', 'btn_delete']),然后写自定义指令v - hasPerm,判断是否有权限,没权限就隐藏按钮。 - 后端返回路由表:登录后后端返回完整路由配置,前端用
router.addRoute循环添加,代替原来“根据 roles 匹配路由”的逻辑。
举个后端返回路由的例子(改 permission.js):
router.beforeEach(async(to, from, next) => {
if (已登录) {
if (!store.getters.routes.length) { // 没加载过路由
const res = await getRouteList() // 调后端接口拿路由表
const accessRoutes = filterAsyncRoutes(res.data, roles) // 处理成前端能识别的格式
router.addRoute(accessRoutes) // 动态添加路由
store.commit('permission/SET_ROUTES', accessRoutes)
next({ ...to, replace: true }) // 确保路由加载后再跳转
} else {
next()
}
} else {
跳转到登录页
}
})
接口请求怎么封装和管理?
模板里 src/utils/request.js 是 axios 封装的核心,重点看这两块:
- 请求拦截器:给请求头加 token(从 Vuex 或 cookie 取),
config.headers['Authorization'] = getToken()。 - 响应拦截器:处理错误(401 表示 token 过期,跳登录;500 是服务器错误,给用户弹提示)。
接口管理技巧:
把不同模块的接口丢 api 文件夹,user.js 放用户相关、order.js 放订单相关,代码解耦更清晰。
例子(登录接口):
// src/api/user.js
export function login(data) {
return request({
url: '/auth/login',
method: 'post',
data
})
}
// 页面里调用
this.login({ username: 'admin', password: '123' })
.then(res => {
// 存 token 到 Vuex 和 cookie
})
.catch(err => {
// 登录失败提示
})
想换主题风格?自定义样式的正确姿势
Element UI 默认是蓝色主题,想改成公司色(比如绿色、紫色),两种方法任选:
定制 Element UI 主题(彻底换色)
- 全局装
element - theme:npm i element - theme - g; - 初始化主题配置:
et - i(生成element - variables.scss文件); - 打开
element - variables.scss,把$--color - primary改成想要的颜色(#52c41a); - 编译主题:
et(生成theme文件夹,里面是编译后的 CSS); - 在
main.js里引入编译后的 CSS:import './theme/index.css',代替原来的import 'element - ui/lib/theme - chalk/index.css'。
全局覆盖样式(局部改色)
在 src/assets/global.css 里直接写样式,覆盖 Element UI 组件:
.el - button--primary {
background - color: #你的颜色;
border - color: #你的颜色;
}
动态主题切换(进阶玩法)
用 CSS 变量 实现:
- 在
global.css定义变量::root { --primary - color: #409eff; /* 初始颜色 */ } - 让 Element UI 组件用变量:
.el - button--primary { background - color: var(--primary - color); border - color: var(--primary - color); } - 写个方法切换颜色(比如点击按钮换主题):
document.documentElement.style.setProperty('--primary - color', '#新颜色')
项目部署到服务器要注意什么?
开发完要上线,这几步不能错:
-
打包:执行
npm run build,生成dist文件夹(里面是静态资源:JS、CSS、HTML)。 -
服务器配置(以 Nginx 为例):
server { listen 80; server_name 你的域名; location / { root /usr/local/nginx/html/dist; # dist 的绝对路径 index index.html index.htm; try_files $uri $uri/ /index.html; # 处理 history 模式路由,否则刷新页面会 404 } location /api { # 接口代理,解决跨域问题 proxy_pass http://后端接口域名; } } -
环境变量:开发时用
.env.development,生产用.env.production,里面VUE_APP_BASE_API = '/api'(生产环境可能要改成后端真实域名),打包时会自动替换。 -
静态资源路径:如果部署在子目录(
https://xxx.com/admin/),要改vue.config.js的publicPath: '/admin/',否则静态资源路径会错。
遇到问题怎么排查?常见坑点总结
开发时遇到 bug 很正常,关键是会定位:
-
路由跳转 404:
- 检查路由配置顺序,404 路由要放最后(
{ path: '*', redirect: '/404', hidden: true }); - 如果用
history模式,Nginx 没配try_files,加上就行。
- 检查路由配置顺序,404 路由要放最后(
-
接口跨域:
- 开发时:在
vue.config.js配devServer.proxy代理; - 生产时:用 Nginx 反向代理,把
/api请求转发到后端。
- 开发时:在
-
Element UI 组件样式不生效:
- 检查是否正确引入样式(
main.js里import 'element - ui/lib/theme - chalk/index.css'); - 自定义样式时,加
/deep/或>>>(因为<style scoped>有样式隔离),<style scoped> .user - page /deep/ .el - table { width: 100%; } </style>
- 检查是否正确引入样式(
-
Vuex 数据刷新丢失:
用vuex - persistedstate插件持久化状态:npm i vuex - persistedstate
然后在
store/index.js里配置:import createPersistedState from 'vuex - persistedstate' const store = new Vuex.Store({ // ... plugins: [createPersistedState({ storage: window.sessionStorage, // 存到 sessionStorage,关闭标签页清除 reducer(val) { return { user: val.user } // 只持久化 user 模块 } })] }) -
依赖版本冲突:
删了node_modules和package - lock.json,重新npm install;或者看package.json里的依赖版本,Vue 2.x 对应 Element UI 2.x,Vue 3 得用 Element Plus。
vue - admin - template 是后台开发的“捷径”,把环境、目录、页面、权限、接口、样式、部署这些核心问题搞懂,就能快速迭代业务功能,遇到问题别慌,先看控制台报错,再查文档(Vue、Element UI、模板官方 GitHub Issues),多试几次就顺了~ 要是想进阶,还能结合 TypeScript、Vue 3 + Element Plus 版本(vue - vite - admin - template),但先把基础版玩明白,再拓展更稳~
(全文约 2500 字,覆盖从 0 到 1 开发流程,新手跟着走就能落地项目~)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网

