# 桌面通知功能说明

## 功能概述

系统已集成浏览器桌面通知功能，当收到新消息时会在 Windows/Mac 系统级别发送通知。

## 触发条件

桌面通知会在以下情况触发：
1. 收到新消息（非自己发送的）
2. 页面不在前台（浏览器最小化或切换到其他标签页）
3. 或者正在查看其他会话（不在当前消息的会话页面）

## 通知内容

- **标题**：发送者角色 + 昵称（如："客服 · 张三"）
- **内容**：消息文本（最多显示100字）
- **图片消息**：显示 "[图片消息]"
- **点击通知**：自动跳转到对应会话

## 使用方式

### 用户端
1. 进入 `/messages` 消息列表页面
2. 点击页面右上角的铃铛图标
3. 浏览器会弹出权限请求，点击"允许"
4. 之后收到新消息时会自动发送桌面通知

### 管理端
1. 进入 `/admin/chats` 客服管理页面
2. 首次进入会在用户交互后自动请求权限
3. 允许权限后即可接收通知

### 移动端
- iOS Safari：不支持桌面通知
- Android Chrome：支持桌面通知

## 权限状态

- **未开启**：默认状态，首次需要点击允许
- **已开启**：绿色铃铛图标，正常接收通知
- **已拒绝**：用户点击了拒绝，需要在浏览器设置中手动开启
  - Chrome: 设置 → 隐私和安全 → 网站设置 → 通知
  - Safari: 偏好设置 → 网站 → 通知

## 技术实现

### 前端文件
- `frontend/src/features/chats/composables/useDesktopNotification.ts` - 通知核心逻辑
- `frontend/src/features/chats/components/NotificationSettings.vue` - 通知设置组件
- `frontend/src/features/chats/views/ChatView.vue` - 用户端聊天页集成
- `frontend/src/features/chats/views/MobileChatView.vue` - 移动端聊天页集成
- `frontend/src/features/admin/views/AdminChatsView.vue` - 管理端集成

### 核心 API
```typescript
const { notify, requestPermission, permission } = useDesktopNotification('user')

// 发送通知
notify(chatEvent, currentConversationId)

// 请求权限
await requestPermission()

// 权限状态：'default' | 'granted' | 'denied'
console.log(permission.value)
```

## 浏览器兼容性

| 浏览器 | 桌面通知支持 |
|--------|-------------|
| Chrome | ✅ 完全支持 |
| Firefox | ✅ 完全支持 |
| Safari (macOS) | ✅ 完全支持 |
| Edge | ✅ 完全支持 |
| Safari (iOS) | ❌ 不支持 |
| 微信内置浏览器 | ❌ 不支持 |

## 通知特性

1. **智能去重**：相同会话的通知会自动替换（不会堆积）
2. **自动关闭**：通知5秒后自动消失
3. **点击跳转**：点击通知会自动跳转到对应会话并聚焦浏览器窗口
4. **不干扰当前会话**：如果正在查看该会话，不会发送通知
5. **仅限他人消息**：自己发送的消息不会触发通知

## 注意事项

1. **首次使用需要用户授权**：浏览器安全策略要求用户主动允许
2. **需要 HTTPS**：生产环境必须使用 HTTPS（本地开发 localhost 除外）
3. **系统勿扰模式**：如果操作系统开启了勿扰模式，通知可能不会显示
4. **浏览器设置**：用户可以在浏览器设置中随时关闭网站通知

## 测试方法

1. 打开两个浏览器窗口（或使用隐私模式）
2. 窗口A：登录用户/客服A，进入某个会话
3. 窗口B：登录用户/客服B，进入相同会话
4. 在窗口B发送消息
5. 将窗口A最小化或切换到其他标签页
6. 应该会收到系统通知

## 排查问题

如果没有收到通知，检查：
1. 浏览器是否支持 Notification API
2. 网站通知权限是否被拒绝（检查浏览器地址栏左侧的锁图标）
3. 操作系统通知设置是否开启
4. 浏览器是否开启了勿扰模式
5. 是否在查看当前会话（查看当前会话不会发通知）
6. 是否是自己发送的消息（自己发送的不会通知）
