Compare commits

..

13 Commits
main ... mgy

Author SHA1 Message Date
Dawn1Ocean 166c8b6319 add log api & mock 2024-03-27 13:36:37 +08:00
Dawn1Ocean fbaedaad0e add prolist in logs page 2024-03-26 20:36:27 +08:00
Dawn_Ocean 31a782daef add pro component 2024-03-25 20:07:40 +08:00
Dawn_Ocean 31e48dafc8 add antd pro 2024-03-25 20:04:18 +08:00
Dawn_Ocean 31188c0bb0 change icons & logo 2024-03-25 19:33:25 +08:00
Dawn_Ocean 57c0fed976 add logs page 2024-03-25 19:07:34 +08:00
Dawn_Ocean 56174936d3 change footer 2024-03-25 18:58:12 +08:00
Dawn_Ocean 24817aea50 add page & subpage structure 2024-03-25 16:11:01 +08:00
Dawn1Ocean 7316208b21 add mock and doc 2024-03-23 00:39:06 +08:00
Dawn1Ocean fb8b0ddc6e change README.md 2024-03-19 21:17:01 +08:00
FrozenArcher 36bc6653e2 add button text 2024-03-14 21:19:13 +08:00
FrozenArcher 3187c7be28 add read excel file 2024-03-14 20:25:45 +08:00
FrozenArcher 7ee06b9901 refactor routes 2024-03-14 19:46:11 +08:00
17 changed files with 1444 additions and 34 deletions

View File

@ -3,18 +3,58 @@
## 目标 ## 目标
1. 微信小程序的信息管理页面 1. 微信小程序的信息管理页面
2. 人资部后台 2. 人资部后台(长期)
## 功能 ## 功能
### 主席团管理页面 ### 主席团管理页面
1. 值班表导入、更新 1. 值班表导入、更新
1. 值班表渲染
2. 值班表在线更改、上传后端
3. 值班表导出
2. 成员权限管理 2. 成员权限管理
1. 从 Auth 获取成员职位、部门
2. 主席团成员:可更改所有信息
3. 当班所有成员:可更改值班人数,可加入 Oreo可更改状态
4. 所有成员:可认领
3. 特殊维修时间(如学园维修)、值班信息更新 3. 特殊维修时间(如学园维修)、值班信息更新
4. 日志
1. 记录每一次操作、操作者
5. 自动排班功能Enhancement
### 值班组长管理页面 ### 值班组长管理页面
ps. 是微信小程序中小组管理页面的pc端替代 ps. 是微信小程序中小组管理页面的pc端替代
1. 值班组长上传本班相关信息 1. 值班组长上传本班相关信息
2. 值班组长上传值班总结Enhancement
## UI
### 仪表盘
1. 个人信息、职位
2. 新系统中未加入Oreo/预填写工单总数)统计
### 主席团管理页面
#### 值班表管理
1. 值班表渲染
2. 值班表在线更改、上传后端
1. 特殊时间值班表不上传
3. 值班表导出
#### 特殊值班时间
1. (switch) 是否启用平常值班时间
2. 若不在平常值班时间,选择录入不值班原因/特殊值班时间
### 值班组长管理页面(暂空)
1. (Enhancement) 值班总结上传
### 日志(所有人可见)
1. 查询功能

242
doc/api.md 100644
View File

@ -0,0 +1,242 @@
# 接口文档
## 基本格式
### 成功响应格式
```json
{
"success": true,
"data": {
"foo": "bar"
}
}
```
**NOTE:** 若无特殊说明,`POST`请求的响应`data`字段为空(`{}`),可以不用管。
### 失败响应格式
```json
{
"success": false,
"err": "some error"
}
```
### `GET`请求默认格式(若无特殊说明)
```json
{
"token": "token_test"
}
```
## 主页面
### 统计数据 `GET /admin/stats`
data:
```json
{
"success": true,
"data": {
"notInOreo": 114,
"total": 514
}
}
```
### 当前值班信息 `GET /admin/duty/current`
data:
```json
{
"isInDuty": true,
"currentDuty": "2",
"inDutyCnt": 3,
"otherDutyTime": "",
"offDutyReason": "",
"place": "204",
"dutyRecoverTime": ""
}
```
## 主席团页面
### 值班表管理
#### 更新值班表 `POST /admin/sheet/create`
request:
```json
{
"name": "2024 春学期值班表",
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["马嘉祺", "丁程鑫", "宋亚轩"],
"leader": "蔡徐坤"
},
{
"weekday": 1,
"shift": 2,
"workers": ["王俊凯", "易烊千玺", "王源"],
"leader": "丁真珍珠"
}
// ...
]
}
```
#### 更新值班表 `POST /admin/sheet/update`
request:
```json
{
"id": 114514,
"name": "2024 春学期值班表",
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["马嘉祺", "丁程鑫", "宋亚轩"],
"leader": "蔡徐坤"
},
{
"weekday": 1,
"shift": 2,
"workers": ["王俊凯", "易烊千玺", "王源"],
"leader": "丁真珍珠"
}
// ...
]
}
```
#### 获取当前值班表 `GET /admin/sheet/current`
data:
```json
{
"name": "2024 春学期值班表",
"id": 114514,
"createdTime": "2024-03-07T19:52:48.523303",
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["马嘉祺", "丁程鑫", "宋亚轩"],
"leader": "蔡徐坤"
},
{
"weekday": 1,
"shift": 2,
"workers": ["王俊凯", "易烊千玺", "王源"],
"leader": "丁真珍珠"
}
// ...
]
}
```
#### 获取所有值班表 `GET /admin/sheet/list`
data:
```json
{
"current": 114514,
"list": [
{
"name": "2024 春学期值班表",
"id": 114514,
"createdTime": "2024-03-07T19:52:48.523303",
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["马嘉祺", "丁程鑫", "宋亚轩"],
"leader": "蔡徐坤"
},
{
"weekday": 1,
"shift": 2,
"workers": ["王俊凯", "易烊千玺", "王源"],
"leader": "丁真珍珠"
}
// ...
]
}
// ...
]
}
```
### 特殊值班
#### 获取当前值班情况 `GET /admin/duty/current`
data:
```json
{
"isInDuty": true,
"currentDuty": "2",
"inDutyCnt": 3,
"otherDutyTime": "",
"offDutyReason": "",
"place": "",
"dutyRecoverTime": "",
},
```
#### 更新当前值班情况 `POST /admin/duty/update`
无关项返回空字符串,后端手动校验
request:
```json
{
"isInDuty": true,
"currentDuty": "2",
"inDutyCnt": 3,
"otherDutyTime": "",
"offDutyReason": "",
"place": "204",
"dutyRecoverTime": "",
},
```
## 日志页面
### 获取日志列表 `GET /admin/loglist`
data:
```json
{
"op": "宇航员",
"time": "2024-03-07T19:52:48.523303",
"operation": 2,
"target": 1,
"prev": {
"id": 114,
"info": "马嘉祺"
},
"curr": {
"id": 514,
"info": "何君琳"
}
},
```
前端显示的信息:"{op} 于 {time} {operation} 了 {target}{prev.info} -> {curr.info}"

63
mock/api.ts 100644
View File

@ -0,0 +1,63 @@
import sheetlist from './sheetlist.json';
import sheet from './sheet.json';
const api = {
'GET /admin/stats': {
success: true,
data: {
notInOreo: 114,
total: 514,
},
},
'POST /admin/sheet/update': {
success: true,
data: {},
},
'POST /admin/sheet/create': {
success: true,
data: {},
},
'GET /admin/sheet/current': {
success: true,
data: sheet,
},
'GET /admin/sheet/list': {
success: true,
data: sheetlist,
},
'GET /admin/duty/current': {
success: true,
data: {
isInDuty: true,
currentDuty: '2',
inDutyCnt: 3,
otherDutyTime: '',
offDutyReason: '',
place: '204',
dutyRecoverTime: '',
},
},
'POST /admin/duty/update': {
success: true,
data: {},
},
'GET /admin/loglist': {
success: true,
data: {
op: '宇航员',
time: '2024-03-07T19:52:48.523303',
operation: 2,
target: 1,
prev: {
id: 114,
info: '马嘉祺',
},
curr: {
id: 514,
info: '何君琳',
},
},
},
};
export default api;

127
mock/sheet.json 100644
View File

@ -0,0 +1,127 @@
{
"name": "2024 春学期值班表",
"createdTime": "2024-03-07T19:52:48.523303",
"id": 114,
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
}
]
}

259
mock/sheetlist.json 100644
View File

@ -0,0 +1,259 @@
{
"current": 514,
"list": [
{
"name": "2024 春学期值班表",
"createdTime": "2024-03-07T19:52:48.523303",
"id": 114,
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
}
]
},
{
"name": "2024 秋学期值班表",
"createdTime": "2024-03-07T11:45:14.523303",
"id": 514,
"sheet": [
{
"weekday": 1,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 1,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 2,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 3,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 4,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 5,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 6,
"shift": 3,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 1,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
},
{
"weekday": 7,
"shift": 2,
"workers": ["123423", "31424", "31242"],
"leader": "3902487"
}
]
}
]
}

548
package-lock.json generated
View File

@ -8,6 +8,8 @@
"name": "notify-admin", "name": "notify-admin",
"version": "0.1.0", "version": "0.1.0",
"dependencies": { "dependencies": {
"@ant-design/icons": "^5.3.1",
"@ant-design/pro-components": "^2.6.52",
"@types/node": "^16.18.88", "@types/node": "^16.18.88",
"@types/react": "^18.2.65", "@types/react": "^18.2.65",
"@types/react-dom": "^18.2.21", "@types/react-dom": "^18.2.21",
@ -16,7 +18,8 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.22.3",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"typescript": "^4.9.5" "typescript": "^4.9.5",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"eslint-plugin-prettier": "^5.1.3", "eslint-plugin-prettier": "^5.1.3",
@ -108,6 +111,286 @@
"resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
"integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==" "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
}, },
"node_modules/@ant-design/pro-card": {
"version": "2.5.30",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-card/-/pro-card-2.5.30.tgz",
"integrity": "sha512-3r1DB9NZ+yQ9636ZR8zgIBbmEd9/TrJnTBBTBDfOgNbiLLq3Rg4FfVNy6m1O8bF1YcGHI3uTP2/eWq4SSk1hWA==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.4.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-components": {
"version": "2.6.52",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-components/-/pro-components-2.6.52.tgz",
"integrity": "sha512-TocUF5k5tjGRW65y/NAnS+gZxx5aconoOvENfjwrwPxJ9HP49FD8nMiH97xOqVI+6ew4Mr9+9+Acs+C/bw4glA==",
"dependencies": {
"@ant-design/pro-card": "2.5.30",
"@ant-design/pro-descriptions": "2.5.35",
"@ant-design/pro-field": "2.14.8",
"@ant-design/pro-form": "2.25.0",
"@ant-design/pro-layout": "7.18.0",
"@ant-design/pro-list": "2.5.50",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-skeleton": "2.1.11",
"@ant-design/pro-table": "3.15.1",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.16.3"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-descriptions": {
"version": "2.5.35",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-descriptions/-/pro-descriptions-2.5.35.tgz",
"integrity": "sha512-GhoN013irN3q+G1MQa0HrY3/YxbwYNp4GYSuCxYSRpoC2VG9Y8NyxY+v88p2e1g9kn4Y6WtbxG+nScVObgaUJQ==",
"dependencies": {
"@ant-design/pro-field": "2.14.8",
"@ant-design/pro-form": "2.25.0",
"@ant-design/pro-skeleton": "2.1.11",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"rc-resize-observer": "^0.2.3",
"rc-util": "^5.0.6"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-descriptions/node_modules/rc-resize-observer": {
"version": "0.2.6",
"resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-0.2.6.tgz",
"integrity": "sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==",
"dependencies": {
"@babel/runtime": "^7.10.1",
"classnames": "^2.2.1",
"rc-util": "^5.0.0",
"resize-observer-polyfill": "^1.5.1"
},
"peerDependencies": {
"react": ">=16.9.0",
"react-dom": ">=16.9.0"
}
},
"node_modules/@ant-design/pro-field": {
"version": "2.14.8",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-field/-/pro-field-2.14.8.tgz",
"integrity": "sha512-FwxUoBX33cN/A4c7PB+D/erUASOI2uIAFybc/7TbBg+LmVO5RoH2EZZIGvZ4IeYaqMiwH1k0Y0GwOg7sNoUpAQ==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"@chenshuai2144/sketch-color": "^1.0.8",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.tonumber": "^4.0.3",
"omit.js": "^2.0.2",
"rc-util": "^5.4.0",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-form": {
"version": "2.25.0",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-form/-/pro-form-2.25.0.tgz",
"integrity": "sha512-XH1G05LpVOfdTv2SPix0eg1q59L1pDC98MbF/D0Kjq0DVrwsJ7Ze0NrmR80Apy26JLUMnLTPPjIhBI5mhvmDkw==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-field": "2.14.8",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"@chenshuai2144/sketch-color": "^1.0.7",
"@umijs/use-params": "^1.0.9",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.1.0",
"rc-util": "^5.0.6"
},
"peerDependencies": {
"@types/lodash.merge": "^4.6.7",
"antd": "^4.24.15 || ^5.11.2",
"rc-field-form": "^1.22.0",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
},
"peerDependenciesMeta": {
"@types/lodash.merge": {
"optional": true
}
}
},
"node_modules/@ant-design/pro-layout": {
"version": "7.18.0",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-layout/-/pro-layout-7.18.0.tgz",
"integrity": "sha512-Es/mQAif5RJVynC/rVM+DsX1Kvp3xkjlAgZta3Sak4GZmkq3lRMq80MPlsKLeIZMwOBE1k3CZ4i7VEdWTcXCgg==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"@umijs/route-utils": "^4.0.0",
"@umijs/use-params": "^1.0.9",
"classnames": "^2.3.2",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"path-to-regexp": "2.4.0",
"rc-resize-observer": "^1.1.0",
"rc-util": "^5.0.6",
"swr": "^2.0.0",
"warning": "^4.0.3"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-layout/node_modules/path-to-regexp": {
"version": "2.4.0",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-2.4.0.tgz",
"integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w=="
},
"node_modules/@ant-design/pro-list": {
"version": "2.5.50",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-list/-/pro-list-2.5.50.tgz",
"integrity": "sha512-FiTn96C5NAMFwIl4ibM9QAwD01Q4EE9CV632jj8VX16w/KhBu4Gox8CvuOkWxvhw+Fw5Vz49jDLuToZrE9nNTA==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-card": "2.5.30",
"@ant-design/pro-field": "2.14.8",
"@ant-design/pro-table": "3.15.1",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"rc-resize-observer": "^1.0.0",
"rc-util": "^4.19.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-list/node_modules/rc-util": {
"version": "4.21.1",
"resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-4.21.1.tgz",
"integrity": "sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==",
"dependencies": {
"add-dom-event-listener": "^1.1.0",
"prop-types": "^15.5.10",
"react-is": "^16.12.0",
"react-lifecycles-compat": "^3.0.4",
"shallowequal": "^1.1.0"
}
},
"node_modules/@ant-design/pro-list/node_modules/react-is": {
"version": "16.13.1",
"resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
"node_modules/@ant-design/pro-provider": {
"version": "2.14.0",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-provider/-/pro-provider-2.14.0.tgz",
"integrity": "sha512-C89hwefeC7OJlLBzPjYS5XbW/t3NAM1KKqPiBeTkr0+KHQE7xjYfh+bi7RcQ7TsHNIYHjd52cEZuEdTJqzyHPg==",
"dependencies": {
"@ant-design/cssinjs": "^1.11.1",
"@babel/runtime": "^7.18.0",
"@ctrl/tinycolor": "^3.4.0",
"rc-util": "^5.0.1",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-skeleton": {
"version": "2.1.11",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-skeleton/-/pro-skeleton-2.1.11.tgz",
"integrity": "sha512-a1drmZSDXHFexFniN1YD7PgYiWvhdBAM9OwzSOO3eXPAltAg2cGcaVBlFmweShN+dupO220RN+6aaLUv3G9B2Q==",
"dependencies": {
"@babel/runtime": "^7.18.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-table": {
"version": "3.15.1",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-table/-/pro-table-3.15.1.tgz",
"integrity": "sha512-rLM1gzcI4VQ/mdU6UzkgnF/6eisrhVqMtGa7XfOVgAyQ8JePWSHAkc4aTk4Psgbk2nDLepobEAodWy7DOaIuGQ==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-card": "2.5.30",
"@ant-design/pro-field": "2.14.8",
"@ant-design/pro-form": "2.25.0",
"@ant-design/pro-provider": "2.14.0",
"@ant-design/pro-utils": "2.15.5",
"@babel/runtime": "^7.18.0",
"@dnd-kit/core": "^6.0.8",
"@dnd-kit/modifiers": "^6.0.1",
"@dnd-kit/sortable": "^7.0.2",
"@dnd-kit/utilities": "^3.2.1",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"omit.js": "^2.0.2",
"rc-resize-observer": "^1.0.0",
"rc-util": "^5.0.1"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"rc-field-form": "^1.22.0",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/pro-utils": {
"version": "2.15.5",
"resolved": "https://registry.npmmirror.com/@ant-design/pro-utils/-/pro-utils-2.15.5.tgz",
"integrity": "sha512-352WZhzWRsyRd85R0fIxJgDEl9+vgxIzDxIW7G0/oWpXilxDIUnVVB/U46UM3d1YuR+0PQsKBXJmS1niro8sXA==",
"dependencies": {
"@ant-design/icons": "^5.0.0",
"@ant-design/pro-provider": "2.14.0",
"@babel/runtime": "^7.18.0",
"classnames": "^2.3.2",
"dayjs": "^1.11.10",
"lodash.merge": "^4.6.2",
"rc-util": "^5.0.6",
"safe-stable-stringify": "^2.4.3",
"swr": "^2.0.0"
},
"peerDependencies": {
"antd": "^4.24.15 || ^5.11.2",
"react": ">=17.0.0",
"react-dom": ">=17.0.0"
}
},
"node_modules/@ant-design/react-slick": { "node_modules/@ant-design/react-slick": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.0.2.tgz",
@ -2079,6 +2362,18 @@
"resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "resolved": "https://registry.npmmirror.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="
}, },
"node_modules/@chenshuai2144/sketch-color": {
"version": "1.0.9",
"resolved": "https://registry.npmmirror.com/@chenshuai2144/sketch-color/-/sketch-color-1.0.9.tgz",
"integrity": "sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==",
"dependencies": {
"reactcss": "^1.2.3",
"tinycolor2": "^1.4.2"
},
"peerDependencies": {
"react": ">=16.12.0"
}
},
"node_modules/@csstools/css-parser-algorithms": { "node_modules/@csstools/css-parser-algorithms": {
"version": "2.6.0", "version": "2.6.0",
"resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz", "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz",
@ -2335,6 +2630,68 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.0",
"resolved": "https://registry.npmmirror.com/@dnd-kit/accessibility/-/accessibility-3.1.0.tgz",
"integrity": "sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/core": {
"version": "6.1.0",
"resolved": "https://registry.npmmirror.com/@dnd-kit/core/-/core-6.1.0.tgz",
"integrity": "sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==",
"dependencies": {
"@dnd-kit/accessibility": "^3.1.0",
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@dnd-kit/modifiers": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/@dnd-kit/modifiers/-/modifiers-6.0.1.tgz",
"integrity": "sha512-rbxcsg3HhzlcMHVHWDuh9LCjpOVAgqbV78wLGI8tziXY3+qcMQ61qVXIvNKQFuhj75dSfD+o+PYZQ/NUk2A23A==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.1",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.0.6",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/sortable": {
"version": "7.0.2",
"resolved": "https://registry.npmmirror.com/@dnd-kit/sortable/-/sortable-7.0.2.tgz",
"integrity": "sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.0",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.0.7",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmmirror.com/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@emotion/unitless": { "node_modules/@emotion/unitless": {
"version": "0.7.5", "version": "0.7.5",
"resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz", "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz",
@ -4246,6 +4603,19 @@
"node": "^12.22.0 || ^14.17.0 || >=16.0.0" "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
} }
}, },
"node_modules/@umijs/route-utils": {
"version": "4.0.1",
"resolved": "https://registry.npmmirror.com/@umijs/route-utils/-/route-utils-4.0.1.tgz",
"integrity": "sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ=="
},
"node_modules/@umijs/use-params": {
"version": "1.0.9",
"resolved": "https://registry.npmmirror.com/@umijs/use-params/-/use-params-1.0.9.tgz",
"integrity": "sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==",
"peerDependencies": {
"react": "*"
}
},
"node_modules/@ungap/structured-clone": { "node_modules/@ungap/structured-clone": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -4465,6 +4835,14 @@
"node": ">=0.4.0" "node": ">=0.4.0"
} }
}, },
"node_modules/add-dom-event-listener": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz",
"integrity": "sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==",
"dependencies": {
"object-assign": "4.x"
}
},
"node_modules/address": { "node_modules/address": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz",
@ -4485,6 +4863,14 @@
"node": ">=8.9" "node": ">=8.9"
} }
}, },
"node_modules/adler-32": {
"version": "1.3.1",
"resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
"integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/agent-base": { "node_modules/agent-base": {
"version": "6.0.2", "version": "6.0.2",
"resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
@ -5516,6 +5902,18 @@
"node": ">=4" "node": ">=4"
} }
}, },
"node_modules/cfb": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
"integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
"dependencies": {
"adler-32": "~1.3.0",
"crc-32": "~1.2.0"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/chalk": { "node_modules/chalk": {
"version": "2.4.2", "version": "2.4.2",
"resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
@ -5715,6 +6113,11 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/client-only": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
"node_modules/cliui": { "node_modules/cliui": {
"version": "7.0.4", "version": "7.0.4",
"resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz",
@ -5747,6 +6150,14 @@
"node": ">= 4.0" "node": ">= 4.0"
} }
}, },
"node_modules/codepage": {
"version": "1.15.0",
"resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
"integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/collect-v8-coverage": { "node_modules/collect-v8-coverage": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
@ -5961,6 +6372,17 @@
"node": ">=10" "node": ">=10"
} }
}, },
"node_modules/crc-32": {
"version": "1.2.2",
"resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
"integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
"bin": {
"crc32": "bin/crc32.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
"version": "7.0.3", "version": "7.0.3",
"resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@ -8162,6 +8584,14 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/frac": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
"integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/fraction.js": { "node_modules/fraction.js": {
"version": "4.3.7", "version": "4.3.7",
"resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz",
@ -11838,6 +12268,11 @@
"resolved": "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "resolved": "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
"integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
}, },
"node_modules/lodash.tonumber": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/lodash.tonumber/-/lodash.tonumber-4.0.3.tgz",
"integrity": "sha512-SY0SwuPOHRwKcCNTdsntPYb+Zddz5mDUIVFABzRMqmAiL41pMeyoQFGxYAw5zdc9NnH4pbJqiqqp5ckfxa+zSA=="
},
"node_modules/lodash.truncate": { "node_modules/lodash.truncate": {
"version": "4.4.2", "version": "4.4.2",
"resolved": "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "resolved": "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
@ -12507,6 +12942,11 @@
"resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz", "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
}, },
"node_modules/omit.js": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/omit.js/-/omit.js-2.0.2.tgz",
"integrity": "sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg=="
},
"node_modules/on-finished": { "node_modules/on-finished": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
@ -14982,6 +15422,11 @@
"resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz",
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
}, },
"node_modules/react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
},
"node_modules/react-refresh": { "node_modules/react-refresh": {
"version": "0.11.0", "version": "0.11.0",
"resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.11.0.tgz", "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.11.0.tgz",
@ -15092,6 +15537,14 @@
} }
} }
}, },
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/reactcss/-/reactcss-1.2.3.tgz",
"integrity": "sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==",
"dependencies": {
"lodash": "^4.0.1"
}
},
"node_modules/read-cache": { "node_modules/read-cache": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz",
@ -15534,6 +15987,14 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/safe-stable-stringify": {
"version": "2.4.3",
"resolved": "https://registry.npmmirror.com/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
"integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
"engines": {
"node": ">=10"
}
},
"node_modules/safer-buffer": { "node_modules/safer-buffer": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
@ -15860,6 +16321,11 @@
"resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
}, },
"node_modules/shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
@ -16063,6 +16529,17 @@
"resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
}, },
"node_modules/ssf": {
"version": "0.11.2",
"resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
"integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
"dependencies": {
"frac": "~1.1.2"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/stable": { "node_modules/stable": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz", "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
@ -16854,6 +17331,18 @@
"boolbase": "~1.0.0" "boolbase": "~1.0.0"
} }
}, },
"node_modules/swr": {
"version": "2.2.5",
"resolved": "https://registry.npmmirror.com/swr/-/swr-2.2.5.tgz",
"integrity": "sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==",
"dependencies": {
"client-only": "^0.0.1",
"use-sync-external-store": "^1.2.0"
},
"peerDependencies": {
"react": "^16.11.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/symbol-tree": { "node_modules/symbol-tree": {
"version": "3.2.4", "version": "3.2.4",
"resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz",
@ -17098,6 +17587,11 @@
"resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
"integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
}, },
"node_modules/tinycolor2": {
"version": "1.6.0",
"resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
},
"node_modules/tmpl": { "node_modules/tmpl": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz", "resolved": "https://registry.npmmirror.com/tmpl/-/tmpl-1.0.5.tgz",
@ -17476,6 +17970,14 @@
"requires-port": "^1.0.0" "requires-port": "^1.0.0"
} }
}, },
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
@ -17567,6 +18069,14 @@
"makeerror": "1.0.12" "makeerror": "1.0.12"
} }
}, },
"node_modules/warning": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz",
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/watchpack": { "node_modules/watchpack": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",
@ -18014,6 +18524,22 @@
"node": ">= 0.4" "node": ">= 0.4"
} }
}, },
"node_modules/wmf": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
"integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/word": {
"version": "0.3.0",
"resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
"integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
"engines": {
"node": ">=0.8"
}
},
"node_modules/word-wrap": { "node_modules/word-wrap": {
"version": "1.2.5", "version": "1.2.5",
"resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
@ -18431,6 +18957,26 @@
} }
} }
}, },
"node_modules/xlsx": {
"version": "0.18.5",
"resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz",
"integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==",
"dependencies": {
"adler-32": "~1.3.0",
"cfb": "~1.2.1",
"codepage": "~1.15.0",
"crc-32": "~1.2.1",
"ssf": "~0.11.2",
"wmf": "~1.0.1",
"word": "~0.3.0"
},
"bin": {
"xlsx": "bin/xlsx.njs"
},
"engines": {
"node": ">=0.8"
}
},
"node_modules/xml-name-validator": { "node_modules/xml-name-validator": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz", "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz",

View File

@ -6,6 +6,8 @@
"name": "EVA Tech" "name": "EVA Tech"
}, },
"dependencies": { "dependencies": {
"@ant-design/icons": "^5.3.1",
"@ant-design/pro-components": "^2.6.52",
"@types/node": "^16.18.88", "@types/node": "^16.18.88",
"@types/react": "^18.2.65", "@types/react": "^18.2.65",
"@types/react-dom": "^18.2.21", "@types/react-dom": "^18.2.21",
@ -14,7 +16,8 @@
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-router-dom": "^6.22.3", "react-router-dom": "^6.22.3",
"react-scripts": "5.0.1", "react-scripts": "5.0.1",
"typescript": "^4.9.5" "typescript": "^4.9.5",
"xlsx": "^0.18.5"
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",

View File

@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> <link rel="icon" href="%PUBLIC_URL%/logo.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<meta <meta
@ -15,7 +15,7 @@
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
--> -->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<title>EVA-Notify Admin Page</title> <title>EVA Tea</title>
</head> </head>
<body style="margin: 0;"> <body style="margin: 0;">
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>

BIN
public/logo.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

View File

@ -1,14 +1,16 @@
import { useState, FC } from 'react'; import { FC } from 'react';
import { useLocation, useNavigate } from 'react-router-dom'; import { useLocation, useNavigate } from 'react-router-dom';
import { import {
TeamOutlined, TeamOutlined,
UserOutlined,
DesktopOutlined,
HomeOutlined, HomeOutlined,
SmileOutlined,
CrownOutlined,
ClockCircleOutlined,
ThunderboltOutlined,
} from '@ant-design/icons'; } from '@ant-design/icons';
import type { MenuProps } from 'antd'; import type { MenuProps } from 'antd';
import { Breadcrumb, Layout, Menu, theme } from 'antd'; import { Breadcrumb, Layout, Menu, theme } from 'antd';
import { AppRouter } from './router'; import { AppRouter, routes, routeName } from './router';
import PageFooter from './components/PageFooter'; import PageFooter from './components/PageFooter';
const { Content, Sider } = Layout; const { Content, Sider } = Layout;
@ -62,17 +64,16 @@ function defSubMenu(
} }
const items: MenuItem[] = [ const items: MenuItem[] = [
defMenu('主页', 'mainpage', <DesktopOutlined />, '/'), defMenu('主页', 'mainpage', <SmileOutlined />, routes.main),
defRootMenu('展示信息管理', 'sub1', <UserOutlined />, [ defRootMenu('主席团管理', 'admin', <CrownOutlined />, [
defSubMenu('选项1', '1', '/admin/hello1'), defSubMenu('排班表管理', 'dutytable', routes.admin.dutyTable),
defSubMenu('选项2', '2', '/admin/hello2'), defSubMenu('值班信息管理', 'dutyinfo', routes.admin.dutyInfo),
defSubMenu('选项3', '3', '/admin/hello3'),
]), ]),
defRootMenu('值班组长', 'sub2', <TeamOutlined />, [ defRootMenu('值班组长', 'leader', <TeamOutlined />, [
defSubMenu('选项1', '4', '/duty/hi1'), defSubMenu('值班总结', 'conclusion', routes.duty.conclusion),
defSubMenu('选项2', '5', '/duty/hi2'),
]), ]),
defMenu('关于我们', 'aboutpage', <UserOutlined />, '/about'), defMenu('日志', 'logspage', <ClockCircleOutlined />, routes.logs),
defMenu('关于我们', 'aboutpage', <ThunderboltOutlined />, routes.about),
]; ];
interface BreadcrumbItem { interface BreadcrumbItem {
@ -81,7 +82,6 @@ interface BreadcrumbItem {
} }
const AppLayout: FC<{ router: JSX.Element }> = (props) => { const AppLayout: FC<{ router: JSX.Element }> = (props) => {
const [collapsed, setCollapsed] = useState(false);
const { colorBgContainer, borderRadiusLG } = theme.getDesignToken(); const { colorBgContainer, borderRadiusLG } = theme.getDesignToken();
const navigate = useNavigate(); const navigate = useNavigate();
@ -97,17 +97,13 @@ const AppLayout: FC<{ router: JSX.Element }> = (props) => {
for (var i = 1; i < pathArray.length; i++) { for (var i = 1; i < pathArray.length; i++) {
currentRouteItems.push({ currentRouteItems.push({
href: '', href: '',
title: <span>{pathArray[i]}</span>, title: <span>{routeName.get(pathArray[i])}</span>,
}); });
} }
return ( return (
<Layout style={{ minHeight: '100vh' }}> <Layout style={{ minHeight: '100vh' }}>
<Sider <Sider>
collapsible
collapsed={collapsed}
onCollapse={(value) => setCollapsed(value)}
>
<div className='demo-logo-vertical' /> <div className='demo-logo-vertical' />
<Menu <Menu
theme='dark' theme='dark'

View File

@ -12,9 +12,12 @@ const PageFooter: React.FC = () => {
yearStr = startYear.toString() + ' - ' + curYear.toString(); yearStr = startYear.toString() + ' - ' + curYear.toString();
} }
return ( return (
<Footer style={{ textAlign: 'center' }}> <div>
EVA-Notify Admin Page &copy; {yearStr} EVA Tech <Footer style={{ textAlign: 'center', color: '#808080' }}>
EVA Tea <br /> <br />
&copy; {yearStr} EVA Tech
</Footer> </Footer>
</div>
); );
}; };

View File

@ -0,0 +1,24 @@
import { Button, Upload } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import { FC } from 'react';
import { readExcelFile } from '../../utils/excel';
const DutyTablePage: FC = () => {
return (
<Upload
name='file'
action=''
beforeUpload={(file) => {
let data = readExcelFile(file, 0);
data
.then((d) => console.log('read data', d))
.catch((e) => console.log('got error', e));
return false;
}}
>
<Button icon={<UploadOutlined />}></Button>
</Upload>
);
};
export default DutyTablePage;

View File

@ -0,0 +1,61 @@
import { FC } from 'react';
import { EllipsisOutlined } from '@ant-design/icons';
import { ProList } from '@ant-design/pro-components';
import { Progress, Tag } from 'antd';
const data = [
'语雀的天空',
'Ant Design',
'蚂蚁金服体验科技',
'TechUI',
'TechUI 2.0',
'Bigfish',
'Umi',
].map((item) => ({
title: item,
subTitle: <Tag color='#5BD8A6'></Tag>,
actions: [<EllipsisOutlined />],
avatar:
'https://gw.alipayobjects.com/zos/antfincdn/UCSiy1j6jx/xingzhuang.svg',
content: (
<div
style={{
flex: 1,
display: 'flex',
justifyContent: 'flex-end',
}}
>
<div
style={{
width: 200,
}}
>
<div></div>
<Progress percent={80} />
</div>
</div>
),
}));
const LogsPage: FC = () => {
return (
<ProList<any>
pagination={{
defaultPageSize: 5,
showSizeChanger: true,
}}
metas={{
title: {},
subTitle: {},
type: {},
avatar: {},
content: {},
actions: {},
}}
headerTitle='翻页'
dataSource={data}
/>
);
};
export default LogsPage;

View File

@ -1,15 +1,42 @@
import { Routes, Route } from 'react-router-dom'; import { Routes, Route } from 'react-router-dom';
import Todo from './components/Todo'; import Todo from './components/Todo';
import DutyTablePage from './pages/duty/DutyTable';
import LogsPage from './pages/logs/Logs';
export const routes = {
main: '/',
about: '/about',
admin: {
dutyTable: '/admin/dutytable',
userControl: '/admin/usercontrol',
dutyInfo: '/admin/dutyinfo',
},
duty: {
conclusion: '/duty/conclusion',
},
logs: '/logs',
};
export const routeName = new Map<string, string>([
['admin', '主席团管理'],
['about', '关于我们'],
['duty', '值班组长'],
['dutytable', '排班表'],
['dutyinfo', '值班信息'],
['conclusion', '值班总结'],
['logs', '日志'],
]);
export const AppRouter: React.FC = () => { export const AppRouter: React.FC = () => {
return ( return (
<Routes> <Routes>
<Route path='/' element={<Todo />} /> <Route path={routes.main} element={<Todo />} />
<Route path='/admin/hello1' element={<Todo />} /> <Route path={routes.admin.dutyTable} element={<DutyTablePage />} />
<Route path='/admin/hello2' element={<Todo />} /> <Route path={routes.admin.userControl} element={<Todo />} />
<Route path='/admin/hello3' element={<Todo />} /> <Route path={routes.admin.dutyInfo} element={<Todo />} />
<Route path='/duty/hi1' element={<Todo />} /> <Route path={routes.duty.conclusion} element={<Todo />} />
<Route path='/duty/hi2' element={<Todo />} /> <Route path={routes.about} element={<Todo />} />
<Route path={routes.logs} element={<LogsPage />} />
</Routes> </Routes>
); );
}; };

View File

10
src/utils/excel.ts 100644
View File

@ -0,0 +1,10 @@
import { read as xlsxRead, utils as xlsxUtils } from 'xlsx';
import { readFile } from './readfile';
export async function readExcelFile(file: File, sheetIndex: number) {
let data = await readFile(file);
let workbook = xlsxRead(data, { type: 'binary' });
let worksheet = workbook.Sheets[workbook.SheetNames[sheetIndex]];
data = xlsxUtils.sheet_to_json(worksheet);
return data;
}

View File

@ -0,0 +1,9 @@
export function readFile(file: File) {
return new Promise((resolve) => {
let reader = new FileReader();
reader.readAsBinaryString(file);
reader.onload = (ev) => {
resolve(ev.target?.result);
};
});
}