# Smart Office 前端交付文档（给另一个模型使用）

> 目标：在没有上下文的情况下，仅凭本文档生成**与当前后端完全兼容**的前端界面。
> 技术栈：React 18 + Vite

---

## 1. 项目概览
- 系统名称：Smart Office（智能办公管理系统）
- 当前版本：v1.0（MVP）
- 已实现模块：登录/权限、考勤打卡、请假审批、通知、用户管理
- 角色：`ADMIN` / `MANAGER` / `EMPLOYEE`

### 默认账号
- admin / admin123
- manager / manager123
- employee / employee123

### 目标页面
- 登录
- 概览（Dashboard）
- 考勤（打卡、个人记录）
- 请假（提交、我的请假）
- 审批（经理/管理员可见）
- 用户管理（管理员/经理可见，创建仅管理员）
- 通知

---

## 2. 技术与接入约定
- API Base：`/api/v1`
- 本地后端：`http://localhost:8080`（如在 8081，可通过 `VITE_PROXY_TARGET` 或 `VITE_API_BASE` 配置）
- Token：JWT，存储在 LocalStorage，Header：`Authorization: Bearer <token>`
- 后端响应结构统一：
```json
{
  "code": 200,
  "message": "OK",
  "data": {},
  "timestamp": "2026-01-28T11:31:58.291Z"
}
```

---

## 3. 权限规则（前端必须遵守）
- `ADMIN`：全部页面、可创建用户/修改状态、可审批
- `MANAGER`：可查看用户列表、审批
- `EMPLOYEE`：仅个人考勤、请假、通知、概览

UI 级别必须隐藏不可访问页面，但后端也会校验权限。

---

## 4. 路由建议
- `/login` 登录页
- `/` 概览
- `/attendance` 考勤
- `/leave` 请假
- `/approvals` 审批（ADMIN/MANAGER）
- `/users` 用户（ADMIN/MANAGER）
- `/notifications` 通知

---

## 5. 后端接口文档（完整）

### 5.1 Auth
#### 登录
- **POST** `/auth/login`
```json
{ "username": "admin", "password": "admin123" }
```
响应：
```json
{
  "code": 200,
  "message": "OK",
  "data": {
    "token": "jwt-token",
    "user": {
      "id": 1,
      "username": "admin",
      "fullName": "管理员",
      "role": "ADMIN",
      "status": "ACTIVE",
      "lastLoginAt": "2026-01-28T11:31:58.275Z"
    }
  }
}
```

#### 注册
- **POST** `/auth/register`
```json
{
  "username": "u1",
  "password": "u1123",
  "fullName": "Test User",
  "email": "u1@example.com",
  "phone": "123456"
}
```
响应：`UserDto`

#### 当前用户
- **GET** `/auth/me`
- Header：`Authorization`
- 响应：`UserDto`

---

### 5.2 用户管理 Users
> ADMIN/MANAGER 可访问；创建/状态变更仅 ADMIN

#### 列表
- **GET** `/users`
- 响应：`UserDto[]`

#### 详情
- **GET** `/users/{id}`
- 响应：`UserDto`

#### 创建用户
- **POST** `/users`
```json
{
  "username": "u1",
  "password": "u1123",
  "fullName": "Test User",
  "email": "u1@example.com",
  "phone": "123456",
  "role": "EMPLOYEE"
}
```

#### 修改状态
- **PATCH** `/users/{id}/status`
```json
{ "status": "ACTIVE" }
```

---

### 5.3 考勤 Attendance
#### 上班打卡
- **POST** `/attendance/check-in`
```json
{ "location": "HQ" }
```

#### 下班签退
- **POST** `/attendance/check-out`

#### 我的考勤记录
- **GET** `/attendance/me`

---

### 5.4 请假 Leave Requests
#### 提交请假
- **POST** `/leave-requests`
```json
{
  "type": "ANNUAL",
  "startTime": "2026-01-29T09:00:00Z",
  "endTime": "2026-01-29T18:00:00Z",
  "reason": "Family matters"
}
```

#### 我的请假
- **GET** `/leave-requests/my`

#### 待审批列表（ADMIN/MANAGER）
- **GET** `/leave-requests/pending`

#### 审批通过
- **POST** `/leave-requests/{id}/approve`
```json
{ "note": "Approved" }
```

#### 审批拒绝
- **POST** `/leave-requests/{id}/reject`
```json
{ "note": "Rejected" }
```

---

### 5.5 通知 Notifications
#### 通知列表
- **GET** `/notifications`

#### 标记已读
- **POST** `/notifications/{id}/read`

---

## 6. DTO 数据结构

### UserDto
```ts
{
  id: number
  username: string
  fullName: string
  email?: string
  phone?: string
  role: 'ADMIN' | 'MANAGER' | 'EMPLOYEE'
  status: 'ACTIVE' | 'DISABLED' | 'LOCKED'
  lastLoginAt?: string
}
```

### AttendanceDto
```ts
{
  id: number
  date: string
  checkInTime?: string
  checkOutTime?: string
  workHours: number
  status: string
  location?: string
}
```

### LeaveDto
```ts
{
  id: number
  requester: UserDto
  type: string
  startTime: string
  endTime: string
  reason: string
  status: string
  approver?: UserDto
  decidedAt?: string
  createdAt: string
}
```

### NotificationDto
```ts
{
  id: number
  type: string
  title: string
  content: string
  readAt?: string
  createdAt: string
}
```

---

## 7. 枚举
- 角色：`ADMIN | MANAGER | EMPLOYEE`
- 用户状态：`ACTIVE | DISABLED | LOCKED`
- 请假类型：`ANNUAL | SICK | PERSONAL | MARRIAGE | MATERNITY | BEREAVEMENT`

---

## 8. 错误码参考
- 400：参数校验失败
- 401：未登录 / Token 无效
- 403：无权限
- 404：资源不存在
- 409：冲突（如重复、已处理）
- 500：服务器异常

---

## 9. 设计要求（给生成前端用）
- 必须生成 **企业级、现代、干净** 的 UI
- 页面需覆盖所有模块，角色权限需隐藏
- 所有接口调用必须与上述 API 完全一致
- Token 保存到 LocalStorage，并在每次请求中带上

---

## 10. v1.1 增量（目前无 API，前端可暂不实现）
- 考勤规则配置实体
- 部门结构实体
> 后端暂未提供接口，仅模型存在
