93 lines
2.6 KiB
Markdown
93 lines
2.6 KiB
Markdown
|
|
# 任务002:前端骨架
|
|||
|
|
|
|||
|
|
## 目标
|
|||
|
|
|
|||
|
|
搭建React + Arco Design Pro前端项目,配置菜单和路由,实现登录页。
|
|||
|
|
|
|||
|
|
## 技术栈
|
|||
|
|
|
|||
|
|
- React + TypeScript
|
|||
|
|
- Arco Design Pro (React版)
|
|||
|
|
- Vite
|
|||
|
|
- Tailwind CSS
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
software/web/
|
|||
|
|
├── package.json
|
|||
|
|
├── vite.config.ts
|
|||
|
|
├── src/
|
|||
|
|
│ ├── App.tsx
|
|||
|
|
│ ├── main.tsx
|
|||
|
|
│ ├── layouts/
|
|||
|
|
│ │ └── AdminLayout.tsx # 后台布局(侧栏+顶栏+内容区)
|
|||
|
|
│ ├── pages/
|
|||
|
|
│ │ ├── Login.tsx # 登录页
|
|||
|
|
│ │ ├── Dashboard.tsx # 首页概览
|
|||
|
|
│ │ ├── devices/ # 设备管理
|
|||
|
|
│ │ ├── charge-records/ # 充电记录
|
|||
|
|
│ │ ├── device-logs/ # 设备日志
|
|||
|
|
│ │ ├── energy/ # 能耗管理
|
|||
|
|
│ │ └── settings/ # 系统设置
|
|||
|
|
│ ├── api/
|
|||
|
|
│ │ └── request.ts # HTTP请求封装
|
|||
|
|
│ ├── stores/
|
|||
|
|
│ │ └── auth.ts # 认证状态
|
|||
|
|
│ └── utils/
|
|||
|
|
│ └── permission.ts # 权限工具
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 菜单配置
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
const menuConfig = [
|
|||
|
|
{ key: 'dashboard', label: 'Dashboard', icon: 'Dashboard' },
|
|||
|
|
{ key: 'devices', label: '设备管理', icon: 'Device' },
|
|||
|
|
{ key: 'charge-records', label: '充电记录', icon: 'File' },
|
|||
|
|
{ key: 'device-logs', label: '设备日志', icon: 'Bug' },
|
|||
|
|
{ key: 'energy', label: '能耗管理', icon: 'Thunderbolt' },
|
|||
|
|
{ key: 'settings', label: '系统设置', icon: 'Settings', children: [
|
|||
|
|
{ key: 'users', label: '用户管理' },
|
|||
|
|
{ key: 'roles', label: '角色权限' },
|
|||
|
|
{ key: 'operation-logs', label: '操作日志' }
|
|||
|
|
]}
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 登录页
|
|||
|
|
|
|||
|
|
- 手机号 + 密码登录
|
|||
|
|
- 登录后存储token到localStorage
|
|||
|
|
- 跳转到Dashboard
|
|||
|
|
|
|||
|
|
## API基础配置
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 开发环境
|
|||
|
|
const API_BASE = 'http://localhost:3000/api';
|
|||
|
|
|
|||
|
|
// 请求封装
|
|||
|
|
const request = async (url, options) => {
|
|||
|
|
const token = localStorage.getItem('token');
|
|||
|
|
const res = await fetch(`${API_BASE}${url}`, {
|
|||
|
|
...options,
|
|||
|
|
headers: {
|
|||
|
|
'Content-Type': 'application/json',
|
|||
|
|
'Authorization': `Bearer ${token}`
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
if (!res.ok) throw new Error(res.statusText);
|
|||
|
|
return res.json();
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 质量约束
|
|||
|
|
|
|||
|
|
1. 完成代码后执行 `tsc --noEmit`,必须零报错、零警告
|
|||
|
|
2. 分层拆分,单函数≤80行,命名语义化,完整注释
|
|||
|
|
3. 所有外部IO/网络请求异常捕获
|
|||
|
|
4. 分支逻辑全覆盖,不遗漏兜底分支
|
|||
|
|
5. 常量抽离,不使用废弃API
|
|||
|
|
6. React函数式组件+Hooks,不写Class组件
|