# ice-cream-admin **Repository Path**: cloud_of_tim/ice-cream-admin ## Basic Information - **Project Name**: ice-cream-admin - **Description**: 雪糕后台管理系统(Ice Crean Admin)是一个 vue3+vite+vue-router+pinia 后台管理系统。 - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2023-07-04 - **Last Updated**: 2023-07-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
|
|
## 主要框架/插件及其文档
| 框架/插件 | 文档 |
| --- | --- |
| vue3 | https://cn.vuejs.org/ |
| vite | https://vitejs.cn/ |
| vue-router | https://router.vuejs.org/zh/ |
| pinia | https://pinia.vuejs.org/ |
| pinia-plugin-persistedstate | https://github.com/prazdevs/pinia-plugin-persistedstate |
| element-plus | https://element-plus.gitee.io/zh-CN/ |
| @element-plus/icons-vue | https://github.com/element-plus/element-plus-icons |
另外,该项目是基于 create-vue 脚手架搭建的,相关文档在这里:https://github.com/vuejs/create-vue
项目里 vue 暴露的属性或方法和 element-plus 组件都是通过插件按需自动导入的,所以你会发现项目里有很多类似如下这种情况。
```js
// import { ref } from 'vue'
// import { ElMessage } from 'element-plus'
// ref 和 ElMessage 都会按需自动导入,无需上面的 import
const test = ref()
ElMessage('element-plus 消息')
```
如果你想知道如何实现“按需自动导入”,可以参考这个项目 element-plus-best-practices 的 vite.config.ts 配置(也有关于如何配置 vue 的自动导入)以及 element-plus 自动导入的相关文档。
## 关于分支(branch)和标签(tags)
| 分支 | 说明 |
| --- | --- |
| master | 主干分支 |
| develop | 开发分支 |
| deploy | 发布分支 |
| gh-pages | github/gitee pages 部署分支 |
如果想要项目的稳定版本,请拉取标签(tags)的相关代码。
## 目前实现的功能
- 多窗口功能
- 可配置菜单
- 设置功能(是否开启多窗口功能、是否固定头部等等)
- 静态权限验证
- 动态权限验证
## 基于角色的权限验证(RBAC)
### 静态权限验证和动态权限验证
本系统给予两种方式进行权限验证,可根据自己的需求进行选择合适的方式。
(1)静态权限验证思路
- 在登录时,后端返回角色集字段,如:张三的角色集为:['admin', 'teacher']
- 前端根据“需求”在对应的路由 meta.roles 配置可以访问到该路由的角色集
(2)动态权限验证思路
- 在登录时,后端根据表(通常是用户表、角色表、权限表、用户角色表、角色权限表)数据进行返回登录用户的权限树(建议与前端的路由树结构一致)
- 前端将后端返回的权限树转化为自己的路由树(如果结构一致,可以省略这一步),再利用路由前置守卫将路由树添加到路由上。
### 静态权限验证和动态权限验证的区别
- 理论上,两种验证方式均可同时使用,但考虑到在实际业务中,通常仅会使用其中一种方式,本系统不做这个兼容,如有需要可以自己改写。
- 动态权限验证会比静态权限验证好很多,因为这可以随时在系统上定制菜单以及权限而无需做部署,而静态权限验证方案,每次修改权限都要进行部署一遍前端。
- 建议使用动态权限验证,它唯一的缺点可能就是稍微有点难实现,但是本系统已经把这个难点解决了,只需要后端的配合即可简单实现这一功能。
### 如何使用静态验证和动态验证
- 首先更改 .env 的 VITE_AUTH_MODE 环境变量(static: 静态权限验证;dynamic: 动态权限验证)
- 如果是静态权限验证方式
- 首先要在 login 页面的 login 接口对接里,需要将后端返回的角色集直接赋予到 userStore.roles,
后面的一切权限判断都会以 userStore.roles 数据作为依据。
- 前端根据“需求”在对应的路由 meta.roles 配置可以访问到该路由的角色集即可,如下所示:
```js
{
path: '/form',
...
meta: { ..., roles: ['admin', 'teacher'] },
...
}
```
- 如果是动态权限验证方式
- 首先要在 login 页面的 login 接口对接里,需要将后端返回的权限直接赋予到 userStore.auths。
- 然后改写 userStore.initDynamicRoutes() 方法,这个方法是用来根据 userStore.auths(即后端返回的权限) 初始化 userStore.dynamicRoutes,就是需要将后端的数据转化为前端的路由树结构,如果结构本来就一致,那就只需要直接赋值即可(建议与后端沟通,保持数据结构一致)。另外,这个方法会在登录后自动调用(详看:路由前置守卫)。
## Features
### 关于多窗口功能
现在的多窗口功能是基于 element-plus 的Tabs 组件来写的,所以有诸多限制。
第一个问题是,这里的样式难以改写成我理想中的样式,我理想中的样式是比较接近浏览器窗口的那种感觉。
第二个问题是,固定(fixed)窗口的头部时,样式发生了一点点异常的变化,暂时找不到原因。
第三个问题,由于这个 Tabs 的组件的设计并不太适合做类似浏览器的多窗口(主要是它的很多事件都是传递 name 值),我这里的写法存在内存泄漏问题,不过这只会发生在删除过多的窗口的极端情况下发生。
总之,后面肯定需要自己手写一个窗口组件来代替 element-plus 的 Tabs 组件进行实现多窗口功能。
## 使用
### Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Compile and Minify for Production
```sh
npm run build
```
## License
[MIT](https://gitee.com/only1zhuo/ice-cream-admin/blob/master/LICENSE) license.
Copyright (c) 2022-present only1zhuo(技术四毛喵)