# backstage
**Repository Path**: W-JunHui/backstage
## Basic Information
- **Project Name**: backstage
- **Description**: A common backstage management system based on Vite +Vue3.
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-02-18
- **Last Updated**: 2023-02-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 通用后台管理系统
## 概述



基于 Vite + Vue3 构建的**纯前端静态 Web 应用**,使用 [Mock.js](http://mockjs.com/) 在本地模拟项目中请求后端的各类数据,同时可根据不同用户的登录权限,显示不同的侧边栏菜单
当前管理系统中:
- 默认**管理员**账号:`admin`,密码:`123456`
- 默认**成员**账号:`Apple`,密码:`123456`
部署于 GitHub pages: https://outofforbit.com/backstage
部署于 Gitee pages: https://w-junhui.gitee.io/backstage
## 技术应用
(1)使用 [Element Plus](https://element-plus.gitee.io/zh-CN/) 构建项目 UI 界面:
- 使用 [Vue 3](https://www.javascriptc.com/vue3js/) 的 `setup` 语法构建项目的`普通组件`和`路由组件`
(2)使用 [Vue Router 4](https://router.vuejs.org/zh/) 构建项目的前端路由系统:
- 使用 **Hash** 路由模式,在路由配置的 `component` 属性中使用 `() = > import()` 组件导入语法实现**路由懒加载**
- 在用户登录后返回的侧边栏菜单对象中,包含了设置**动态子路由**的 `path`、`name`、`component`的相关属性,因此在管理菜单数据的 `mutation` 中,通过全局路由对象提供的 `addRoute()` 方法**动态**添加子路由,同时使用 [Vite](https://vitejs.cn/) 的动态导入模块语法 `import.meta.glob` 实现**动态路由懒加载**
- 设置**全局前置守卫**,处理登录前通过修改路径的非法访问,以及处理登录后访问不存在路径
(3)使用 [Mock.js](http://mockjs.com/) 模拟后端的各类数据:
- 封装 `Mock.js` 模块,使用**正则表达式**匹配请求路径并拦截项目中的 Ajax 请求
- 根据项目的不同功能模块,封装不同的数据请求函数,在拦截请求后进行调用以返回正确的数据
(4)使用 [Axios](http://axios-js.com/) 发起 Ajax 请求,并对 Axios 进行**二次封装**:
- **统一**处理项目中所有请求的**重复步骤**,包括在请求前自定义携带 header、处理请求失败的反馈信息、解构赋值请求成功的参数对象以简化嵌套,方便赋值
- 根据请求携带参数中定义的 `mock` 布尔值,可选择是否使用 [fastmock](https://www.fastmock.site/) 的模拟数据
- 根据已封装好的 Ajax 请求环境配置文件,判断在`开发环境`、`测试环境`、`生产环境`下应使用的**请求根路径**,防止`生产环境`使用 fastmock
- 将项目中的所有 Ajax 请求函数封装为**统一**的接口模块 `api.js`,在该模块导入已二次封装的 `request` 函数,实现**统一管理**项目所有的请求接口
(5)使用 [Vuex 4](https://vuex.vuejs.org/zh/) 管理项目数据,实现不同组件间的**数据通讯**:
- 在用户登录后会返回一个的侧边栏菜单对象,通过提交 mutation 将其存储至 Vuex 中,以供侧边栏动态设置菜单项以及面包屑动态设置路径名
- 在点击侧边栏菜单后会返回一个`激活菜单栏对象`,通过提交 mutation 将其存储至 Vuex 中,供路由组件显示区顶部的 `tag` 标签使用
- 通过 `localStorage` 持久化登录后的侧边栏菜单对象、激活菜单对象,并在 `main.js` 中提交对应的 mutation 以防止页面刷新后 Vuex 数据丢失引起的侧边栏、面包屑、tag 标签数据丢失
(6)使用 [Echarts.js](https://echarts.apache.org/zh/index.html) 构建首页中的数据展示:
- 对首页中具有 X/Y 轴的图表(折线图、柱状图)进行基础的通用对象配置,对饼状图单独定义配置对象
- 处理请求返回的 Mock 图表源数据,并将其与每个图表的配置对象结合以渲染图表
(7)使用 **vue-cookies** 存储或移除浏览器 cookie 的登录认证 `token`
(8)使用 **vue3-lottie** 加载 `JSON` 格式的 lottie 动画,实现展示页面**低消耗**的 Web 网页动画
## 开发模式
```sh
# Fork仓库后,安装依赖
npm i
# 启用普通的开发环境
npm run dev
```
## 构建与部署
借助 [GitHub Actions](https://docs.github.com/zh/actions),当前应用能在构建项目的同时,自动部署至 [GitHub Pages](https://docs.github.com/zh/pages) 和 [Gitee Pages](https://gitee.com/help/articles/4136#article-header0)。同时,构建项目也不再需要手动执行脚本命令(npm run build ),而是使用 GitHub Actions,在工作流中增加构建项目的任务步骤即可
通过工作流的相关设置,项目自动构建完毕后,构建目录 `dist/` 将会部署在远程仓库的 `gh-pages` 分支
该项目部署与我的博客部署类似,可参考我的博客文章 [《我的博客部署之路》](https://w-junhui.gitee.io/%E6%8A%80%E6%9C%AF%E5%8D%9A%E6%96%87/VuePress/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2%E4%B9%8B%E8%B7%AF.html)
CSDN:[我的 VuePress 博客部署之路](https://blog.csdn.net/INT_FUTURE/article/details/128975977)
## 静态资源
为尽可能提升后台系统的访问与运行速度:
- 图片均使用 `.webp` 格式,而类似于 logo 的小图标则使用 `.svg` 格式,
- lottie 动画使用 `JSON` 格式
## 联系我
如果对该仓库的代码有任何疑问,可通过邮箱联系我:wu-junhui@foxmail.com
或者你也可以创建一个 [Issues](https://github.com/Wu-JunHui/Wu-JunHui.github.io/issues)
## 开源许可
[MIT](/LICENSE)