## ADDED Requirements

### Requirement: Global Notification Bell

The admin frontend SHALL provide a global notification bell in the top navigation near the settings and user avatar entries.

#### Scenario: Display unread count

- **GIVEN** 用户已登录后台
- **WHEN** 顶部导航加载未读通知数量
- **THEN** 铃铛 MUST call `GET /api/admin/notifications/unread-count`
- **AND** 数量 MUST display as `0`, `1` through `99`, or `99+`

#### Scenario: Open recent notification drawer

- **WHEN** 用户点击顶部通知铃铛
- **THEN** 页面 MUST display the latest 10 notifications from the unread summary contract
- **AND** 抽屉 MUST provide 全部、审批、临期、同步/系统分类
- **AND** 抽屉 MUST provide an entry to `/notifications`

### Requirement: Notification Center Filtering

The admin frontend SHALL provide a `/notifications` notification center with server-backed filtering.

#### Scenario: Filter notifications

- **WHEN** 用户打开通知中心或调整筛选条件
- **THEN** 页面 MUST support category, notification type, severity and read-state filters
- **AND** 页面 MUST load results from `GET /api/admin/notifications`
- **AND** 页面 MUST display notification title, content, category, severity, read state and created time

#### Scenario: Mark all notifications read

- **WHEN** 用户点击全部已读
- **THEN** 页面 MUST call `PUT /api/admin/notifications/read-all`
- **AND** 页面 MUST refresh the unread count and visible notification read states after success

### Requirement: Notification Read State Synchronization

The notification drawer and notification center SHALL keep read state and unread count synchronized with the backend.

#### Scenario: Mark a notification read

- **WHEN** 用户点击一条未读通知
- **THEN** 页面 MUST call `PUT /api/admin/notifications/{id}/read` before navigation
- **AND** 页面 MUST refresh or update the shared unread count after the read request succeeds

#### Scenario: Preserve read state after refresh

- **GIVEN** 用户已完成单条已读或全部已读操作
- **WHEN** 用户关闭抽屉、切换页面或刷新通知中心
- **THEN** 页面 MUST use the latest backend response rather than restoring stale local unread state

### Requirement: Controlled Notification Navigation

The admin frontend SHALL navigate from notifications only through controlled internal targets.

#### Scenario: Navigate to a valid notification target

- **GIVEN** 通知包含受支持的 `ref_type` 或业务引用
- **WHEN** 单条已读成功后页面请求 `GET /api/admin/notifications/{id}/target`
- **THEN** 页面 MUST navigate only to a target recognized by the frontend route table
- **AND** 页面 MUST preserve the target route parameters returned by the backend

#### Scenario: Handle an unknown target safely

- **GIVEN** 通知的 `ref_type` 未知、目标已删除或目标无权限
- **WHEN** 页面处理通知点击
- **THEN** 页面 MUST not navigate to an arbitrary URL
- **AND** 页面 MUST still display the notification content and a stable unavailable-target state

### Requirement: Consistent Notification Categories

The notification drawer and notification center SHALL present balance warnings, expiry reminders, approval results and system alerts through the same notification data contract.

#### Scenario: Display supported notification types

- **GIVEN** 后端返回余额预警、临期提醒、审批结果或系统告警
- **WHEN** 用户查看抽屉或通知中心
- **THEN** 页面 MUST display each item using its backend category, type and severity
- **AND** 页面 MUST not replace the item with hardcoded mock notification content
