# wonderland
**Repository Path**: coke-code/wonderland
## Basic Information
- **Project Name**: wonderland
- **Description**: react18 + vite + antd5 template
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-11-28
- **Last Updated**: 2022-12-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# REACT后台开发模板
## 项目简介
后台通用业务开发模板
### 依赖版本
- React@18.2.0
- Antd@5.0.2
- React-router-dom@6.4.3
- Axios@1.2.0
- Vite@3.2.3
## 风格规范
### 命名
#### 文件及目录
大驼峰命名组件(component)和页面(page)以及布局(layout),其他文件通常用小驼峰
通常除了`index`文件外其余文件及文件名都采用大驼峰命名法
#### TS 规范
遵循选型中 eslint 配置,使用 Airbnb 规范
代码注释规范,采用 jsdoc:
#### 样式规范
CSS 的命名,采用 BEM 命名规范,可以有效的避免组件间样式的相互污染,减少嵌套层级。具体规则如下:
BEM 使用分隔符将类名区隔成三个部分:
[prefix]-[block]__[element]--[modifier]
- prefix:全局的前缀,这里指代表 tdesign 的前缀,也就是 t-
- Block(块) :组件的最外层父元素,这个类包含最通用和可重用的功能。
- Element(元素) :组件内可包含一个或多个元素,元素为块添加了新功能。无需重置任何属性。
- Modifier(修饰类) :块或元素都可以通过修饰词来表示为变体。
#### Git 提交规范
使用 angular 提交规范:
feat 与 fix 提交将被用于生成 changelog
- feat:新功能
- fix:修补 bug
- docs:文档类变动
- style:样式
- refactor:重构
- test:增加测试
- chore:构建过程或辅助工具的变动
## 主要功能
### 路由权限
常见的权限系统分为两类:
1. 前端固定路由表和权限配置,由后端提供用户权限标识(静态遍历)
2. 后端提供权限和路由信息结构接口,动态生成权限和菜单(动态生成)
采用后端返回角色所包含的权限,前端进行控制方案(`静态遍历`)。此方案不会带来过于复杂的系统涉及,且适合绝大多数场景。
#### 工作方式
登录返回当前角色id`role`,前端调用接口获取当前角色的所有`access`
```typescript
//login
interface ILogin{
id: number
name: string
role: id
slogan: string
avatar: string
lastIn: number
}
// access
interface IAccess {
id: number
parentId: number
name: string
key: string
view?: string[]
action?: string[]
}
```
1. `router/dictionary`是静态前端路由配置的字典,每次新增页面需要在此配置`对应组件`和`路由地址`,以及**最关键**的路由唯一表示`key`。
2. 后端返回`扁平`权限数组,数组包含`唯一标识`字符串`key`,`操作`字符串数组`action`,`视图`字符串数组`view`。下面关于这几个名词的解释:
- `key` 后端返回的`key`与`字典路由`中的`key`属于一一对应关系,用于建立对应关系和匹配
- `action` 当前路由视图中展示但禁止操作的按钮或交互
- `view` 当前路由视图中动态的元素的阅读权限
#### 路由方法
- `findRouteBySearch` 通过`key`或`path`搜索`字典`中的路由
- `getRouteByAccess` 将`access`转换成系统中的权限路由
#### hook
**useAccess**:获取当前路由的交互操作`action`及动态元素`view`的权限控制
```typescript
interface IAccess {
action?: string[]
view?: string[]
}
const access:IAccess = useAccess()
```