使用vue3从0搭建后台管理系统
项目简介
源码地址
https://gitee.com/szxio/zx-vue-next
描述
本项目是使用 vue3 来开发的后台管理系统模板。页面简单大方,使用悬浮式的风格,将菜单栏,顶部面包屑,中间操作区域等合理划分,功能丰富,支持主题颜色自定义,一键开启黑色主题,浅色、深色菜单动态切换等。路由采用动态路由,依托若依后端接口,拥有强大的权限管理功能。对若依感兴趣的点此跳转,希望各位小伙伴能够在学习本项目的过程中或多或少的有所收获。
如果感觉对你有所帮助,请点击 Star,感谢支持。
本文档同步至以下网站:
技术栈
- vue3
- element-plus
- Pinia
- vue-router
- js-cookie
- sass
- ….
页面截图
本地运行
本项目后端借用了若依的后台框架,在她的基础上稍作了修改。
可以在本地启动本项目中的 java 代码。再启动前端查看效果。
若依启动成功截图
创建项目
使用 vite 来创建我们的工程
1 | npm create vite@latest |
或者
1 | yarn create vite |
然后按照提示操作即可!
elementui-plus
安装
官方文档:https://element-plus.gitee.io/zh-CN/
安装
1 | cnpm install element-plus --save |
引入
1 | // main.ts |
组件自动导入
实现组件自动导入
1 | npm install -D unplugin-vue-components unplugin-auto-import |
然后把下列代码插入到你的 Vite
的配置文件中
1 | // vite.config.ts |
注册所有图标
安装
1 | # NPM |
注册所有组件
1 | // main.ts |
解决默认是英文的问题
引入中文包:import lang from 'element-plus/lib/locale/lang/zh-cn'
,然后设置全局语言即可
1 | import lang from 'element-plus/lib/locale/lang/zh-cn' |
添加Router
官方文档:https://router.vuejs.org/zh/
安装
1 | npm install vue-router@4 |
新建测试路由
1 | // 1.从vue-router导出两个方法使用 |
引入
1 | // main.ts |
修改App.vue
1 | <template> |
配置@路径别名
首先安装依赖
1 | npm install @types/node |
1 | import {defineConfig} from 'vite' |
安装prettier代码格式化插件
安装
1 | npm i --save-dev prettier |
然后再根目录新建 .prettierrc
文件,内容如下
1 | { |
然后以 webStorm 工具为例,使用 prettier
格式效果
Pinia
安装
1 | npm install pinia |
添加 src/stores/index.ts
1 | import { createPinia } from 'pinia' |
引入
1 | // main.ts |
使用pinia保存路由信息
新建 src/store/routesList.ts
1 | import { defineStore } from 'pinia' |
然后再前置路由守卫中调用方法保存
1 | import { routesList } from '../stores/routesList' |
递归显示多级菜单
新建 src/layout/menu/Menu.vue
1 | <template> |
新建 src/layout/menu/SubMenu.vue
1 | <template> |
效果展示
根据权限显示菜单
首先设置两个角色:admin、common,分别表示管理员和普通用户。
创建 src/stores/userInfo.ts
,暂时写死一个用户数据
1 | import { defineStore } from 'pinia' |
创建 src/stores/routesList.ts
文件,存放路由集合信息
1 | import { defineStore } from 'pinia' |
创建 src/router/routes.ts
菜单数据文件,其中 meta 里面有 roles 数组,表示只要用户的角色在这里就显示当前菜单
1 | // src/router/routes.ts |
修改 src/router/index.ts
文件如下
1 | // 1.从vue-router导出两个方法使用 |
添加 src/router/filterRouter.ts
文件,待会会用到这里面的方法
1 | /** |
在 src/layout/menu/Menu.vue
组件中添加如下逻辑,首先进入页面触发 onBeforeMount,在该生命周期中调用 getRouterListByRole 方法获取菜单数据,getRouterListByRole 方法中又调用 setFilterHasRolesMenu 方法,来实现根据权限获取不同菜单
1 | import { onBeforeRouteUpdate, useRoute } from 'vue-router' |
效果显示
普通用户没有系统管理菜单
管理员可以看到系统管理
实现点击菜单进行路由跳转
首先添加下面代码,作用是可以将内层的菜单设置为全路径
1 | onBeforeMount(() => { |
然后开启 Menu 组件的 router 模式即可
动态面包屑导航
完整代码
1 | <template> |
效果
页面最大化和最小化
1 | <template> |
主题颜色自定义
添加一个初始化配置文件 src/stores/styleconfig.ts
1 | import { defineStore } from 'pinia' |
新建一个工具文件 src/utils/theme.ts
1 | import { ElMessage } from 'element-plus'; |
然后再新建一个配置文件 src/config/styleSetting.ts
1 | import { styleConfig } from '../stores/styleconfig' |
然后在 main.ts
中引入 styleSetting.ts
1 | import setStyle from "./config/styleSetting"; |
然后在 css 中需要设置主颜色时,直接使用变量来代替颜色值,例如下面是设置菜单选中时的颜色
1 | >>> .el-menu-item.is-active { |
默认显示的主题颜色
然后写一个设置主题颜色的方法,来实时的更新 --el-color-primary
值,点击保存后把配置保存在缓存中
1 | <template> |
修改一个颜色后,页面整体颜色都会发生变化
设置国际化
引入指定版本的 "vue-i18n": "^9.1.10"
,否则高版本会报错
1 | npm install vue-i18n@9.1.10 |
新建文件夹 src/i18n
,这个文件夹下新建如下文件:
- lang
- en.ts
- zh.ts
- router
- en.ts
- zh.ts
- index.ts
内容分别如下
1 | // pages/en.ts |
1 | // pages/zh.ts |
1 | // router/en.ts |
1 | // router/en.ts |
然后在 index.ts 里面整合
1 | // index.ts |
在 main.ts
中引入
1 | import i18n from "./i18n/index" |
使用也非常简单,根据前缀不同,会自动的显示不同的语言
在页面中使用
1 | <template> |
在菜单中使用,修改 name 的值,不能写死为固定的中文名,而是改成国际化文件对应的属性
1 | { |
然后在组件中使用 t 转义
1 | <template v-else> |
1 | import { useI18n } from 'vue-i18n' |
然后可以添加一个方法,来切换中英文显示
1 | <template> |
英文界面
中文界面
动态路由
添加返回模拟数据的方法
模拟实现从后端直接获取路由进行菜单展示
首先新建:src/api/testrouter/index.ts,这个文件用来模拟后端接口返回数据
1 | // 管理员看到的菜单 |
添加模拟获取菜单数据的接口
新建:src/api/menu/index.ts,这个里面来获取上面接口的返回值
1 | import { adminRouter, commonRouter } from '../testrouter' |
添加模拟返回用户信息的接口
接着新建模拟登录接口:src/api/login/index.ts
1 | export const getUerInfoFun = (parames: any) => { |
封装获取菜单,保存菜单的方法
新建 src/router/backEnd.ts,用于处理后端返回的数据
1 | import { RouteRecordRaw } from 'vue-router' |
添加辅助文件
上面的代码中引用了下面的文件
src/stores/requestOldRoutes.ts
1 | import { defineStore } from 'pinia' |
src/stores/routesList.ts
1 | import { defineStore } from 'pinia' |
src/stores/tagsViewRoutes.ts
1 | import { defineStore } from 'pinia' |
修改导出路由的文件
然后改写 src/router/routes.ts,分成三个部分导出
1 | import Layout from '../layout/index.vue' |
修改router文件
修改 src/router/index.ts,默认只加载一个 staticRoutes
1 | // 1.从vue-router导出两个方法使用 |
添加登录页面完成测试
最后添加登录页面
1 | <template> |
实现退出登录方法
1 | <template> |
测试不同人员返回不同菜单
首先我们直接写死一个用户名为 test 的用户来登录
查看菜单,没有系统管理的菜单
然后再用 admin 登录
修改后,重新登录查看菜单
在js中使用scss变量
首先创建 scss 变量文件 primary.module.scss
1 | $primary-color: var(--el-color-primary); |
需要注意的是,在 vite
创建的项目中,如果你想在 js
里引用 scss
文件,需要在后缀前加上 .module
。
然后再 js 中引入,html 中直接使用对应的变量即可
1 | <el-table |
1 | import exCss from '@/style/module/primary.module.scss' |
我这里做了一个表头的背景色跟着主题色变化的功能
webstorm设置代码块
自动导入vue3相关Api
安装
1 | npm install -D unplugin-vue-components unplugin-auto-import |
修改配置
1 | // vite.config.ts |
添加自动依赖
重启项目后会自动生成两个文件
其中 auto-import.d.ts 文件里面声明了所有可以自动引入的 Api
使用
设置完成后,在页面使用 reactive,ref,onMounted 等函数时,无需从 vue 中导出,可以直接使用。示例如下
在使用过程中也通过 webStorm 可以看到改函数的来源
1 | <template> |
效果在页面中可以正常显示,控制台也没有报错
自定义全局loading
首先添加css样式文件 src/style/loading.scss
1 | .loading-next { |
添加 src/utils/loading.ts
1 | import { nextTick } from 'vue' |
使用
1 | import { zxLoading } from '@/utils/loading' |
CSS设置动画
1 | <template> |
效果展示