diff --git a/docs/HANDOVER_FEATURE.md b/docs/HANDOVER_FEATURE.md
new file mode 100644
index 0000000..154ba0b
--- /dev/null
+++ b/docs/HANDOVER_FEATURE.md
@@ -0,0 +1,427 @@
+# 护工端交接班流程功能文档
+
+## 📋 功能概述
+
+护工端交接班流程是一个完整的工作交接解决方案,帮助护工在下班时系统地记录工作内容、传递重要信息给下一班护工,确保老人护理工作的连续性和质量。
+
+## 🎨 设计特点
+
+- **高保真原型设计**:完全按照产品设计文档实现,包含详细的视觉规范
+- **微交互动画**:丰富的动画效果提升用户体验
+- **响应式适配**:支持不同尺寸屏幕,包括横屏模式
+- **无障碍设计**:遵循无障碍设计规范,支持语音操作
+
+## 🗂️ 项目结构
+
+```
+src/
+├── pages/
+│ └── handover/ # 交接班功能目录
+│ ├── index.vue # 入口页面(下班提醒)
+│ ├── previous-notes.vue # 查看上一班留言
+│ ├── work-summary.vue # 填写本班工作总结
+│ ├── next-shift-notes.vue # 填写下一班注意事项
+│ ├── waiting-confirm.vue # 等待接班人确认
+│ ├── complete.vue # 交接完成
+│ └── components/ # 共享组件
+│ ├── progress-indicator.vue # 进度指示器
+│ ├── elder-card.vue # 老人信息卡片
+│ ├── shift-end-reminder.vue # 下班提醒弹窗
+│ └── remind-colleague-modal.vue # 催促接班人弹窗
+│
+├── store/
+│ └── modules/
+│ └── handover.js # 交接班状态管理
+│
+├── api/
+│ └── modules/
+│ └── handover.js # 交接班 API 接口
+│
+└── styles/
+ ├── handover-design.scss # 设计系统变量
+ └── handover-animations.scss # 动画效果样式
+```
+
+## 🎯 功能流程
+
+### 1. 下班提醒(第1屏)
+
+**触发时机**:当前时间接近班次结束时间前15分钟
+
+**功能**:
+- 自动弹出提醒弹窗
+- 显示下班时间
+- 提供"开始交接班"和"稍后再说"选项
+- 稍后再说后15分钟再次提醒
+
+**组件**:`shift-end-reminder.vue`
+
+### 2. 查看上一班留言(第2屏)
+
+**路由**:`/handover/previous-notes`
+
+**功能**:
+- 显示上一班护工的基本信息
+- 展示重点关注老人列表(按紧急程度分类)
+ - 🔴 危险红:紧急/异常情况
+ - 🟡 警告橙:需要关注的情况
+ - 🔵 蓝色:一般提醒
+- 显示待完成任务列表
+- 支持点击卡片查看详细信息
+
+**数据结构**:
+```javascript
+{
+ caregiver: '李小花',
+ timeRange: '06:00-14:00',
+ focusElders: [
+ {
+ id: 1,
+ room: '101房',
+ name: '张淑华奶奶',
+ level: 'danger', // 'danger' | 'warning' | 'normal'
+ issue: '血压异常',
+ description: '详细描述...',
+ reminder: '提醒事项...'
+ }
+ ],
+ todos: [
+ {
+ id: 1,
+ content: '101房 17:00 测量血压',
+ note: '未完成,请接手处理'
+ }
+ ]
+}
+```
+
+### 3. 填写本班工作总结(第3屏)
+
+**路由**:`/handover/work-summary`
+
+**功能**:
+- 展示本班工作统计数据
+ - 总任务数、护理任务、用餐任务、监测任务
+ - 任务完成率
+- 填写重点工作记录
+ - 支持文本输入
+ - 支持语音输入(长按语音按钮)
+ - 字数限制:500字
+- 快捷标签功能
+ - 预设标签:血压正常、食欲改善、情绪稳定等
+ - 支持自定义标签
+ - 点击标签自动插入到文本框
+- 照片记录
+ - 最多上传9张照片
+ - 支持拍照和从相册选择
+ - 可删除已上传的照片
+
+**验证**:
+- 必须填写工作记录(至少1个字符)才能进入下一步
+
+### 4. 填写下一班注意事项(第4屏)
+
+**路由**:`/handover/next-shift-notes`
+
+**功能**:
+- 选择需要特别关注的老人
+ - 勾选老人后展开详细信息
+ - 可添加提醒事项
+ - 支持添加其他老人
+- 填写补充说明
+ - 支持文本和语音输入
+ - 字数限制:500字
+- 显示接班人信息
+ - 姓名、班次、时间、电话
+ - 在线状态显示
+- 提交交接班记录
+
+**验证**:
+- 必须至少勾选一位需要关注的老人
+- 接班人必须在线才能提交
+
+### 5. 等待接班人确认(第5屏)
+
+**路由**:`/handover/waiting-confirm`
+
+**功能**:
+- 显示等待状态
+ - 沙漏旋转动画
+ - 进度转圈动画
+- 显示接班人信息和在线状态
+- 展示已发送的通知
+ - 微信通知
+ - 短信提醒
+ - APP推送
+- 显示预计等待时间
+- 提供催促功能
+ - 点击"催一下"按钮
+ - 30秒内不可重复催促
+ - 超过5分钟未确认显示"联系管理员"
+
+**自动流程**:
+- 3秒后(演示用)自动跳转到完成页面
+- 实际应该等待接班人确认后跳转
+
+### 6. 交接完成(第6屏)
+
+**路由**:`/handover/complete`
+
+**功能**:
+- 显示完成状态(✅ 动画)
+- 展示今日工作统计
+ - 工作时长
+ - 完成任务数和完成率
+ - 服务评价
+ - 今日亮点
+- 展示今日收益预览
+ - 基础工时费
+ - 绩效奖金
+ - 服务提成
+ - 预计总收入
+ - 发放日期提示
+- 操作按钮
+ - 查看详细报告
+ - 确定下班(打卡)
+ - 分享今日工作
+
+### 7. 催促接班人弹窗(第7屏)
+
+**组件**:`remind-colleague-modal.vue`
+
+**触发时机**:
+- 在等待确认页面点击"催一下"
+- 等待超过3分钟自动弹出
+
+**功能**:
+- 提供多种催促方式
+ - 📱 发送微信消息
+ - 📞 直接拨打电话
+ - 👔 联系管理员
+- 再等等选项
+
+## 🎨 设计系统
+
+### 颜色系统
+
+```scss
+// 主色调
+$handover-primary: #3B82F6; // 主蓝色
+$handover-primary-dark: #2563EB; // 深蓝色
+$handover-primary-deep: #1E40AF; // 更深蓝色
+
+// 辅助色
+$handover-success: #10B981; // 成功绿
+$handover-warning: #F59E0B; // 警告橙
+$handover-danger: #EF4444; // 危险红
+
+// 中性色
+$handover-gray-900 ~ $handover-gray-50 // 灰度阶梯
+```
+
+### 字体系统
+
+```scss
+// 字号
+$handover-font-size-2xl: 24px; // 超大标题
+$handover-font-size-xl: 20px; // 大标题
+$handover-font-size-lg: 18px; // 页面标题
+$handover-font-size-md: 16px; // 章节标题
+$handover-font-size-base: 14px; // 正文
+$handover-font-size-sm: 13px; // 辅助信息
+$handover-font-size-xs: 12px; // 小字
+
+// 字重
+$handover-font-weight-regular: 400;
+$handover-font-weight-medium: 500;
+$handover-font-weight-semibold: 600;
+$handover-font-weight-bold: 700;
+```
+
+### 间距系统
+
+```scss
+$handover-spacing-2xs: 4px;
+$handover-spacing-xs: 8px;
+$handover-spacing-sm: 12px;
+$handover-spacing-md: 16px;
+$handover-spacing-lg: 20px;
+$handover-spacing-xl: 24px;
+$handover-spacing-2xl: 32px;
+```
+
+## 🔧 状态管理
+
+### Pinia Store
+
+**位置**:`src/store/modules/handover.js`
+
+**State**:
+```javascript
+{
+ currentShift: {}, // 当前班次信息
+ previousNotes: {}, // 上一班留言
+ workSummary: {}, // 本班工作总结
+ nextShiftNotes: {}, // 下一班注意事项
+ successor: {}, // 接班人信息
+ handoverStatus: {}, // 交接班状态
+ reminderSettings: {} // 提醒设置
+}
+```
+
+**Getters**:
+- `canStartHandover`:是否可以开始交接班
+- `shouldShowReminder`:是否需要显示下班提醒
+- `focusElderCount`:重点关注老人数量
+- `todoCount`:待完成任务数量
+- `handoverProgress`:交接班进度百分比
+
+**Actions**:
+- `initHandover()`:初始化交接班数据
+- `loadPreviousNotes()`:加载上一班留言
+- `updateWorkSummary(data)`:更新工作总结
+- `updateNextShiftNotes(data)`:更新下一班注意事项
+- `submitHandover()`:提交交接班记录
+- `confirmHandover()`:接班人确认
+- `resetHandover()`:重置交接班状态
+
+## 🌐 API 接口
+
+**位置**:`src/api/modules/handover.js`
+
+### 接口列表
+
+| 接口名称 | 方法 | 路径 | 说明 |
+|---------|------|------|------|
+| getCurrentShift | GET | /handover/current-shift | 获取当前班次信息 |
+| getPreviousNotes | GET | /handover/previous-notes | 获取上一班留言 |
+| getFocusElders | GET | /handover/focus-elders | 获取重点关注老人列表 |
+| getTodoList | GET | /handover/todos | 获取待完成任务列表 |
+| getWorkStatistics | GET | /handover/work-statistics | 获取本班工作统计 |
+| saveWorkSummary | POST | /handover/work-summary | 保存工作总结 |
+| uploadPhoto | POST | /handover/upload-photo | 上传照片 |
+| getSuccessorInfo | GET | /handover/successor | 获取接班人信息 |
+| saveNextShiftNotes | POST | /handover/next-shift-notes | 保存下一班注意事项 |
+| submitHandover | POST | /handover/submit | 提交交接班记录 |
+| checkSuccessorOnline | GET | /handover/check-online/:id | 检查接班人是否在线 |
+| remindSuccessor | POST | /handover/remind-successor | 催促接班人确认 |
+| getHandoverHistory | GET | /handover/history | 获取交接班历史记录 |
+| getTodayReport | GET | /handover/today-report | 获取今日工作统计报告 |
+| getTodayEarnings | GET | /handover/today-earnings | 获取今日收益预览 |
+| confirmClockOut | POST | /handover/clock-out | 确认下班打卡 |
+
+## 🎭 动画效果
+
+**位置**:`src/styles/handover-animations.scss`
+
+### 可用动画类
+
+- **页面转场**:`.page-enter`, `.page-exit`
+- **按钮反馈**:`.button-press`
+- **加载状态**:`.loading-spin`, `.skeleton`, `.pulse`
+- **淡入淡出**:`.fade-in`, `.fade-out`, `.fade-in-up`, `.fade-in-down`
+- **缩放动画**:`.scale-in`, `.scale-pop`
+- **抖动动画**:`.shake`
+- **弹跳动画**:`.bounce`
+- **滑动动画**:`.slide-in-left`, `.slide-in-right`
+- **特殊动画**:`.bell-ring`, `.hourglass-rotate`, `.breathe`
+
+### 使用示例
+
+```vue
+
+ 内容
+
+```
+
+## 🚀 开发指南
+
+### 1. 安装依赖
+
+```bash
+pnpm install
+```
+
+### 2. 运行开发服务器
+
+```bash
+# H5
+pnpm dev:h5
+
+# 微信小程序
+pnpm dev:mp-weixin
+
+# App
+pnpm dev:app
+```
+
+### 3. 访问交接班功能
+
+在应用中导航到 `/handover` 路径,或者在首页添加入口按钮。
+
+### 4. 模拟数据
+
+目前使用的是模拟数据,可以在以下位置修改:
+
+- **Store**:`src/store/modules/handover.js` 中的 `loadPreviousNotes()` 方法
+- **页面组件**:各个页面的 `ref` 数据
+
+### 5. 对接后端 API
+
+1. 修改 `src/api/request.js` 配置 API 基础URL
+2. 实现 `src/api/modules/handover.js` 中的接口
+3. 在 Store 的 actions 中调用 API 接口
+4. 处理错误和加载状态
+
+## 📱 响应式适配
+
+### 屏幕尺寸
+
+- **小屏手机** (≤375px):缩小间距和字号
+- **标准手机** (375-414px):标准尺寸
+- **大屏手机** (≥414px):适当增加间距
+- **平板** (≥768px):采用两栏布局
+
+### 横屏适配
+
+横屏时:
+- 导航栏高度缩小至48px
+- 内容区域采用左右分栏
+- 左侧:老人列表(40%)
+- 右侧:详细信息(60%)
+
+## ♿ 无障碍设计
+
+- **文字可读性**:最小字号12px,行高至少1.5倍
+- **色彩对比度**:正文对比度 ≥ 4.5:1
+- **触控区域**:按钮最小尺寸 44×44px
+- **语音操作**:支持语音输入作为备选方案
+
+## 🐛 已知问题
+
+1. **语音输入功能**:目前是模拟实现,需要集成实际的语音识别服务
+2. **照片上传**:需要配置实际的文件上传服务器
+3. **推送通知**:需要集成推送服务(如极光推送、uni-push等)
+4. **实时在线状态**:需要 WebSocket 或轮询实现
+
+## 🔮 后续优化
+
+1. **离线支持**:添加离线数据缓存
+2. **数据同步**:实现离线数据同步机制
+3. **更多语言**:支持多语言国际化
+4. **主题切换**:支持暗色模式
+5. **性能优化**:图片懒加载、虚拟列表等
+6. **测试覆盖**:添加单元测试和 E2E 测试
+
+## 📄 许可证
+
+MIT License
+
+## 👥 贡献者
+
+- Claude (AI Assistant)
+- [您的团队成员]
+
+## 📞 联系方式
+
+如有问题或建议,请联系项目负责人。
diff --git a/src/api/modules/handover.js b/src/api/modules/handover.js
new file mode 100644
index 0000000..8167e0c
--- /dev/null
+++ b/src/api/modules/handover.js
@@ -0,0 +1,254 @@
+/**
+ * 交接班相关 API 接口
+ */
+import request from '../request'
+
+/**
+ * 获取当前班次信息
+ */
+export function getCurrentShift() {
+ return request({
+ url: '/handover/current-shift',
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取上一班留言
+ */
+export function getPreviousNotes() {
+ return request({
+ url: '/handover/previous-notes',
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取重点关注老人列表
+ */
+export function getFocusElders() {
+ return request({
+ url: '/handover/focus-elders',
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取待完成任务列表
+ */
+export function getTodoList() {
+ return request({
+ url: '/handover/todos',
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取本班工作统计
+ */
+export function getWorkStatistics() {
+ return request({
+ url: '/handover/work-statistics',
+ method: 'GET'
+ })
+}
+
+/**
+ * 保存工作总结
+ * @param {Object} data - 工作总结数据
+ * @param {String} data.workRecord - 工作记录文本
+ * @param {Array} data.selectedTags - 选中的标签
+ * @param {Array} data.photos - 照片列表
+ */
+export function saveWorkSummary(data) {
+ return request({
+ url: '/handover/work-summary',
+ method: 'POST',
+ data
+ })
+}
+
+/**
+ * 上传照片
+ * @param {File} file - 照片文件
+ */
+export function uploadPhoto(file) {
+ const formData = new FormData()
+ formData.append('file', file)
+
+ return request({
+ url: '/handover/upload-photo',
+ method: 'POST',
+ data: formData,
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ })
+}
+
+/**
+ * 获取接班人信息
+ */
+export function getSuccessorInfo() {
+ return request({
+ url: '/handover/successor',
+ method: 'GET'
+ })
+}
+
+/**
+ * 保存下一班注意事项
+ * @param {Object} data - 注意事项数据
+ * @param {Array} data.focusElders - 重点关注老人列表
+ * @param {String} data.supplementNote - 补充说明
+ * @param {Array} data.attachments - 附件列表
+ */
+export function saveNextShiftNotes(data) {
+ return request({
+ url: '/handover/next-shift-notes',
+ method: 'POST',
+ data
+ })
+}
+
+/**
+ * 提交交接班记录
+ * @param {Object} data - 交接班完整数据
+ */
+export function submitHandover(data) {
+ return request({
+ url: '/handover/submit',
+ method: 'POST',
+ data
+ })
+}
+
+/**
+ * 检查接班人是否在线
+ * @param {String} successorId - 接班人ID
+ */
+export function checkSuccessorOnline(successorId) {
+ return request({
+ url: `/handover/check-online/${successorId}`,
+ method: 'GET'
+ })
+}
+
+/**
+ * 催促接班人确认
+ * @param {String} successorId - 接班人ID
+ * @param {String} method - 催促方式: 'wechat', 'sms', 'phone', 'admin'
+ */
+export function remindSuccessor(successorId, method) {
+ return request({
+ url: '/handover/remind-successor',
+ method: 'POST',
+ data: {
+ successorId,
+ method
+ }
+ })
+}
+
+/**
+ * 获取交接班历史记录
+ * @param {Object} params - 查询参数
+ * @param {Number} params.page - 页码
+ * @param {Number} params.pageSize - 每页数量
+ * @param {String} params.startDate - 开始日期
+ * @param {String} params.endDate - 结束日期
+ */
+export function getHandoverHistory(params) {
+ return request({
+ url: '/handover/history',
+ method: 'GET',
+ params
+ })
+}
+
+/**
+ * 获取交接班详情
+ * @param {String} handoverId - 交接班记录ID
+ */
+export function getHandoverDetail(handoverId) {
+ return request({
+ url: `/handover/detail/${handoverId}`,
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取今日工作统计报告
+ */
+export function getTodayReport() {
+ return request({
+ url: '/handover/today-report',
+ method: 'GET'
+ })
+}
+
+/**
+ * 获取今日收益预览
+ */
+export function getTodayEarnings() {
+ return request({
+ url: '/handover/today-earnings',
+ method: 'GET'
+ })
+}
+
+/**
+ * 确认下班打卡
+ */
+export function confirmClockOut() {
+ return request({
+ url: '/handover/clock-out',
+ method: 'POST'
+ })
+}
+
+/**
+ * 获取快捷标签列表
+ */
+export function getQuickTags() {
+ return request({
+ url: '/handover/quick-tags',
+ method: 'GET'
+ })
+}
+
+/**
+ * 添加自定义标签
+ * @param {String} tagName - 标签名称
+ */
+export function addCustomTag(tagName) {
+ return request({
+ url: '/handover/custom-tag',
+ method: 'POST',
+ data: {
+ tagName
+ }
+ })
+}
+
+export default {
+ getCurrentShift,
+ getPreviousNotes,
+ getFocusElders,
+ getTodoList,
+ getWorkStatistics,
+ saveWorkSummary,
+ uploadPhoto,
+ getSuccessorInfo,
+ saveNextShiftNotes,
+ submitHandover,
+ checkSuccessorOnline,
+ remindSuccessor,
+ getHandoverHistory,
+ getHandoverDetail,
+ getTodayReport,
+ getTodayEarnings,
+ confirmClockOut,
+ getQuickTags,
+ addCustomTag
+}
diff --git a/src/pages.json b/src/pages.json
index 52d1e3a..e8724ba 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -93,6 +93,65 @@
}
}
]
+ },
+ {
+ "root": "pages/handover",
+ "pages": [
+ {
+ "path": "index",
+ "aliasPath": "/handover",
+ "name": "handover",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "交接班"
+ }
+ },
+ {
+ "path": "previous-notes",
+ "aliasPath": "/handover/previous-notes",
+ "name": "handover-previous-notes",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "查看上一班留言"
+ }
+ },
+ {
+ "path": "work-summary",
+ "aliasPath": "/handover/work-summary",
+ "name": "handover-work-summary",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "本班工作总结"
+ }
+ },
+ {
+ "path": "next-shift-notes",
+ "aliasPath": "/handover/next-shift-notes",
+ "name": "handover-next-shift-notes",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "下一班注意事项"
+ }
+ },
+ {
+ "path": "waiting-confirm",
+ "aliasPath": "/handover/waiting-confirm",
+ "name": "handover-waiting-confirm",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "等待确认"
+ }
+ },
+ {
+ "path": "complete",
+ "aliasPath": "/handover/complete",
+ "name": "handover-complete",
+ "style": {
+ "navigationStyle": "custom",
+ "navigationBarTitleText": "交接完成"
+ }
+ }
+ ]
}
],
"tabBar": {
diff --git a/src/pages/handover/complete.vue b/src/pages/handover/complete.vue
new file mode 100644
index 0000000..0b7e9b9
--- /dev/null
+++ b/src/pages/handover/complete.vue
@@ -0,0 +1,457 @@
+
+
+
+
+ ✅
+
+
+ 交接完成!
+ {{ successor.name }}已确认接班,您可以下班了
+ 辛苦了!👏
+
+
+
+
+
+
+ ⏰
+
+ 工作时长
+ {{ statistics.workHours }}
+
+
+
+
+ ✅
+
+ 完成任务
+ {{ statistics.completedTasks }}
+
+
+
+
+ ⭐
+
+ 服务评价
+ {{ statistics.rating }}
+ {{ statistics.reviews }}
+
+
+
+
+ 🏆
+ 今日亮点
+
+ •
+ {{ item }}
+
+
+
+
+
+
+
+
+
+ 基础工时费:
+ ¥{{ earnings.base }}
+
+
+ 绩效奖金:
+ ¥{{ earnings.bonus }}
+
+
+ 服务提成:
+ ¥{{ earnings.commission }}
+
+
+
+ 预计收入:
+ ¥{{ earnings.total }}
+
+
+
+ 💡
+ 将在本月15日发放工资
+
+
+
+
+
+
+
+
+ [分享今日工作]
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/components/elder-card.vue b/src/pages/handover/components/elder-card.vue
new file mode 100644
index 0000000..4dd7324
--- /dev/null
+++ b/src/pages/handover/components/elder-card.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+ {{ elder.issue }}
+ {{ elder.description }}
+
+
+
+ 📌
+ {{ elder.reminder }}
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/components/progress-indicator.vue b/src/pages/handover/components/progress-indicator.vue
new file mode 100644
index 0000000..4812e0d
--- /dev/null
+++ b/src/pages/handover/components/progress-indicator.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+ ✓
+
+
+ {{ step }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/components/remind-colleague-modal.vue b/src/pages/handover/components/remind-colleague-modal.vue
new file mode 100644
index 0000000..46f46e9
--- /dev/null
+++ b/src/pages/handover/components/remind-colleague-modal.vue
@@ -0,0 +1,203 @@
+
+
+
+
+
+
+
+
+
+ ⚠️
+
+
+ 提醒接班人
+
+ {{ successor.name }}还没有确认接班
+
+ 您可以选择:
+
+
+
+
+ 📱
+ 发送微信消息
+
+
+
+ 📞
+ 直接拨打电话
+
+
+
+ 👔
+ 联系管理员
+
+
+
+
+
+ 再等等
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/components/shift-end-reminder.vue b/src/pages/handover/components/shift-end-reminder.vue
new file mode 100644
index 0000000..d70777d
--- /dev/null
+++ b/src/pages/handover/components/shift-end-reminder.vue
@@ -0,0 +1,180 @@
+
+
+
+
+
+
+
+
+
+ 🔔
+
+
+ 您今天的班次即将结束
+
+
+ ⏰
+ {{ shiftEndTime }} 是您的下班时间
+
+
+ 请完成交接班记录后再下班
+
+
+
+
+
+
+ 稍后再说
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/index.vue b/src/pages/handover/index.vue
new file mode 100644
index 0000000..88ac562
--- /dev/null
+++ b/src/pages/handover/index.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/next-shift-notes.vue b/src/pages/handover/next-shift-notes.vue
new file mode 100644
index 0000000..d4e7208
--- /dev/null
+++ b/src/pages/handover/next-shift-notes.vue
@@ -0,0 +1,635 @@
+
+
+
+
+
+ ←
+ 交接班
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 提醒事项:
+
+ •
+ {{ item }}
+
+
+
+
+ 📋 [添加提醒事项]
+
+
+
+
+
+ [+ 添加其他需要关注的老人]
+
+
+
+
+
+
+
+
+
+ {{ supplementNote.length }}/500
+
+
+
+
+
+ 🎤
+ 语音
+
+
+ ⌨️
+ 键盘
+
+
+ 📎
+ 附件
+
+
+
+
+
+
+
+
+
+
+ 王
+
+
+ {{ successor.name }}
+ {{ successor.shift }}
+ {{ successor.time }}
+ 📞 {{ successor.phone }}
+
+
+
+
+
+ {{ successor.name }}已在线,可以开始交接
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/previous-notes.vue b/src/pages/handover/previous-notes.vue
new file mode 100644
index 0000000..23d7df1
--- /dev/null
+++ b/src/pages/handover/previous-notes.vue
@@ -0,0 +1,352 @@
+
+
+
+
+
+ ←
+ 交接班
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 👤
+ 早班 {{ previousShift.caregiver }}
+
+
+ ⏰
+ {{ previousShift.timeRange }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ☐
+
+ {{ todo.content }}
+ {{ todo.note }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/waiting-confirm.vue b/src/pages/handover/waiting-confirm.vue
new file mode 100644
index 0000000..d4a760b
--- /dev/null
+++ b/src/pages/handover/waiting-confirm.vue
@@ -0,0 +1,360 @@
+
+
+
+
+
+
+
+
+
+ ⏳
+
+
+ 等待确认中...
+
+ 已向{{ successor.name }}发送交接班记录
+
+
+
+
+ {{ successor.name.charAt(0) }}
+
+ {{ successor.name }}
+ {{ successor.role }}
+
+
+ 在线
+
+
+
+
+
+ 系统已自动发送:
+
+ ✓
+ {{ item }}
+
+
+
+
+
+ 预计等待时间: < 2分钟
+
+
+
+
+ 催一下
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/handover/work-summary.vue b/src/pages/handover/work-summary.vue
new file mode 100644
index 0000000..3dec1c9
--- /dev/null
+++ b/src/pages/handover/work-summary.vue
@@ -0,0 +1,611 @@
+
+
+
+
+
+ ←
+ 交接班
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ statistics.total }}
+ 总任务
+
+
+ {{ statistics.care }}
+ 护理
+
+
+ {{ statistics.meal }}
+ 用餐
+
+
+ {{ statistics.monitor }}
+ 监测
+
+
+
+
+ ✅
+ {{ statistics.completion }}% 任务完成率
+
+ 今天表现很棒!
+
+
+
+
+
+
+
+
+ {{ workRecord.length }}/500
+
+
+
+
+
+ 🎤
+ 语音
+
+
+ ⌨️
+ 键盘
+
+
+ 📷
+ 拍照
+
+
+
+
+ 💡
+ 说说今天的重点工作和需要交代的事项
+
+
+
+
+
+
+
+
+
+ {{ tag }}
+
+
+ + 自定义
+
+
+
+
+
+
+
+
+
+
+
+
+ ×
+
+
+
+ +
+ 添加
+
+
+
+
+ 💡
+ 可以拍摄老人状态、餐食等照片
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/store/modules/handover.js b/src/store/modules/handover.js
new file mode 100644
index 0000000..6c4b77f
--- /dev/null
+++ b/src/store/modules/handover.js
@@ -0,0 +1,244 @@
+import { defineStore } from 'pinia'
+
+export const useHandoverStore = defineStore('handover', {
+ state: () => ({
+ // 当前班次信息
+ currentShift: {
+ id: null,
+ caregiver: '',
+ startTime: '',
+ endTime: '',
+ shiftType: '' // 'morning', 'afternoon', 'evening', 'night'
+ },
+
+ // 上一班留言
+ previousNotes: {
+ caregiver: '',
+ timeRange: '',
+ focusElders: [],
+ todos: []
+ },
+
+ // 本班工作总结
+ workSummary: {
+ statistics: {
+ total: 0,
+ care: 0,
+ meal: 0,
+ monitor: 0,
+ completion: 0
+ },
+ workRecord: '',
+ selectedTags: [],
+ photos: []
+ },
+
+ // 下一班注意事项
+ nextShiftNotes: {
+ focusElders: [],
+ supplementNote: '',
+ attachments: []
+ },
+
+ // 接班人信息
+ successor: {
+ id: null,
+ name: '',
+ role: '',
+ shift: '',
+ time: '',
+ phone: '',
+ online: false
+ },
+
+ // 交接班状态
+ handoverStatus: {
+ step: 0, // 0: 未开始, 1: 查看留言, 2: 填写总结, 3: 填写注意事项, 4: 等待确认, 5: 已完成
+ submitted: false,
+ confirmed: false,
+ completedAt: null
+ },
+
+ // 提醒设置
+ reminderSettings: {
+ enabled: true,
+ reminderTime: 15, // 提前15分钟提醒
+ repeatInterval: 15 // 15分钟后再次提醒
+ }
+ }),
+
+ getters: {
+ // 是否可以开始交接班
+ canStartHandover: (state) => {
+ return state.currentShift.id && !state.handoverStatus.submitted
+ },
+
+ // 是否需要显示下班提醒
+ shouldShowReminder: (state) => {
+ if (!state.reminderSettings.enabled) return false
+ if (state.handoverStatus.submitted) return false
+
+ // TODO: 根据当前时间和班次结束时间判断
+ return true
+ },
+
+ // 重点关注老人数量
+ focusElderCount: (state) => {
+ return state.previousNotes.focusElders.filter(e => e.level !== 'normal').length
+ },
+
+ // 待完成任务数量
+ todoCount: (state) => {
+ return state.previousNotes.todos.length
+ },
+
+ // 交接班进度百分比
+ handoverProgress: (state) => {
+ return Math.round((state.handoverStatus.step / 5) * 100)
+ }
+ },
+
+ actions: {
+ // 初始化交接班数据
+ async initHandover() {
+ // TODO: 从API加载数据
+ console.log('初始化交接班数据')
+ },
+
+ // 加载上一班留言
+ async loadPreviousNotes() {
+ // TODO: 从API加载上一班留言
+ // 模拟数据
+ this.previousNotes = {
+ caregiver: '李小花',
+ timeRange: '06:00-14:00',
+ focusElders: [
+ {
+ id: 1,
+ room: '101房',
+ name: '张淑华奶奶',
+ level: 'danger',
+ issue: '血压异常',
+ description: '早上测量 158/95 mmHg\n已通知值班医生,医生建议加强监测',
+ reminder: '下午17:00需再次测量血压'
+ },
+ {
+ id: 2,
+ room: '102房',
+ name: '王建国爷爷',
+ level: 'warning',
+ issue: '食欲不佳',
+ description: '午餐只吃了一半(约40%)',
+ reminder: '晚餐需特别关注,喂食协助'
+ },
+ {
+ id: 3,
+ room: '103房',
+ name: '李秀英奶奶',
+ level: 'warning',
+ issue: '情绪低落',
+ description: '上午不愿参加活动,在房间发呆',
+ reminder: '建议多陪伴聊天,了解原因'
+ }
+ ],
+ todos: [
+ {
+ id: 1,
+ content: '101房 17:00 测量血压',
+ note: '未完成,请接手处理'
+ },
+ {
+ id: 2,
+ content: '103房 晚餐特别照顾',
+ note: '注意观察食欲和情绪'
+ }
+ ]
+ }
+ },
+
+ // 更新工作总结
+ updateWorkSummary(data) {
+ this.workSummary = {
+ ...this.workSummary,
+ ...data
+ }
+ },
+
+ // 更新下一班注意事项
+ updateNextShiftNotes(data) {
+ this.nextShiftNotes = {
+ ...this.nextShiftNotes,
+ ...data
+ }
+ },
+
+ // 提交交接班记录
+ async submitHandover() {
+ try {
+ // TODO: 调用API提交
+ console.log('提交交接班记录')
+
+ this.handoverStatus.submitted = true
+ this.handoverStatus.step = 4
+
+ return true
+ } catch (error) {
+ console.error('提交交接班记录失败:', error)
+ return false
+ }
+ },
+
+ // 接班人确认
+ confirmHandover() {
+ this.handoverStatus.confirmed = true
+ this.handoverStatus.step = 5
+ this.handoverStatus.completedAt = new Date().toISOString()
+ },
+
+ // 重置交接班状态
+ resetHandover() {
+ this.handoverStatus = {
+ step: 0,
+ submitted: false,
+ confirmed: false,
+ completedAt: null
+ }
+ this.workSummary = {
+ statistics: {
+ total: 0,
+ care: 0,
+ meal: 0,
+ monitor: 0,
+ completion: 0
+ },
+ workRecord: '',
+ selectedTags: [],
+ photos: []
+ }
+ this.nextShiftNotes = {
+ focusElders: [],
+ supplementNote: '',
+ attachments: []
+ }
+ },
+
+ // 更新交接班步骤
+ updateStep(step) {
+ this.handoverStatus.step = step
+ }
+ },
+
+ // 持久化配置
+ persist: {
+ enabled: true,
+ strategies: [
+ {
+ key: 'handover-store',
+ storage: uni.getStorageSync ? {
+ getItem: (key) => uni.getStorageSync(key),
+ setItem: (key, value) => uni.setStorageSync(key, value)
+ } : undefined
+ }
+ ]
+ }
+})
diff --git a/src/styles/handover-animations.scss b/src/styles/handover-animations.scss
new file mode 100644
index 0000000..0dabf88
--- /dev/null
+++ b/src/styles/handover-animations.scss
@@ -0,0 +1,494 @@
+/**
+ * 护工端交接班流程 - 微交互动画效果
+ * Micro-interactions and Animations for Handover Process
+ */
+
+/* ============================================
+ 1. 页面转场动画 (Page Transitions)
+ ============================================ */
+
+/* 页面进入 */
+.page-enter {
+ transform: translateX(100%);
+ opacity: 0;
+}
+
+.page-enter-active {
+ transform: translateX(0);
+ opacity: 1;
+ transition: all $handover-duration-slow $handover-ease-in-out;
+}
+
+/* 页面退出 */
+.page-exit {
+ transform: translateX(0);
+}
+
+.page-exit-active {
+ transform: translateX(-30%);
+ opacity: 0.5;
+ transition: all $handover-duration-slow $handover-ease-in-out;
+}
+
+/* ============================================
+ 2. 按钮按压反馈 (Button Press Feedback)
+ ============================================ */
+
+.button-press {
+ transition: transform $handover-duration-fast ease;
+
+ &:active {
+ transform: scale(0.95);
+ }
+}
+
+.button-primary {
+ &:active {
+ background-color: $handover-primary-dark;
+ box-shadow: $handover-shadow-button;
+ }
+}
+
+/* ============================================
+ 3. 语音输入动画 (Voice Input Animation)
+ ============================================ */
+
+.voice-recording {
+ display: flex;
+ align-items: center;
+ gap: $handover-spacing-2xs;
+}
+
+.voice-wave {
+ display: flex;
+ align-items: center;
+ gap: 4rpx;
+
+ span {
+ width: 6rpx;
+ background-color: $handover-primary;
+ border-radius: 3rpx;
+ animation: wave 0.8s ease-in-out infinite;
+
+ &:nth-child(1) {
+ animation-delay: 0s;
+ }
+
+ &:nth-child(2) {
+ animation-delay: 0.1s;
+ }
+
+ &:nth-child(3) {
+ animation-delay: 0.2s;
+ }
+
+ &:nth-child(4) {
+ animation-delay: 0.3s;
+ }
+
+ &:nth-child(5) {
+ animation-delay: 0.4s;
+ }
+ }
+}
+
+@keyframes wave {
+ 0%, 100% {
+ height: 40rpx;
+ }
+ 50% {
+ height: 80rpx;
+ }
+}
+
+/* ============================================
+ 4. 复选框勾选动画 (Checkbox Check Animation)
+ ============================================ */
+
+.checkbox {
+ position: relative;
+ display: inline-block;
+
+ &::after {
+ content: '';
+ position: absolute;
+ display: none;
+ }
+
+ &.checked::after {
+ display: block;
+ animation: check $handover-duration-slow ease;
+ }
+}
+
+@keyframes check {
+ 0% {
+ transform: scale(0) rotate(-45deg);
+ }
+ 50% {
+ transform: scale(1.2) rotate(-45deg);
+ }
+ 100% {
+ transform: scale(1) rotate(-45deg);
+ }
+}
+
+/* ============================================
+ 5. 加载状态 (Loading States)
+ ============================================ */
+
+/* 旋转加载 */
+.loading-spin {
+ animation: spin 1s linear infinite;
+}
+
+@keyframes spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+/* 骨架屏脉冲 */
+.skeleton {
+ background: linear-gradient(
+ 90deg,
+ $handover-gray-100 25%,
+ $handover-gray-50 50%,
+ $handover-gray-100 75%
+ );
+ background-size: 200% 100%;
+ animation: pulse 1.5s ease-in-out infinite;
+}
+
+@keyframes pulse {
+ 0% {
+ background-position: 200% 0;
+ }
+ 100% {
+ background-position: -200% 0;
+ }
+}
+
+/* 脉冲效果 */
+.pulse {
+ animation: pulseOpacity 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+@keyframes pulseOpacity {
+ 0%, 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0.5;
+ }
+}
+
+/* ============================================
+ 6. 淡入淡出动画 (Fade Animations)
+ ============================================ */
+
+.fade-in {
+ animation: fadeIn $handover-duration-slow ease;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+.fade-out {
+ animation: fadeOut $handover-duration-slow ease;
+}
+
+@keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+ to {
+ opacity: 0;
+ }
+}
+
+/* 从下淡入 */
+.fade-in-up {
+ animation: fadeInUp 0.5s ease forwards;
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 从上淡入 */
+.fade-in-down {
+ animation: fadeInDown 0.5s ease forwards;
+}
+
+@keyframes fadeInDown {
+ from {
+ opacity: 0;
+ transform: translateY(-20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* ============================================
+ 7. 缩放动画 (Scale Animations)
+ ============================================ */
+
+.scale-in {
+ animation: scaleIn $handover-duration-slow ease;
+}
+
+@keyframes scaleIn {
+ from {
+ opacity: 0;
+ transform: scale(0.9);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1);
+ }
+}
+
+.scale-pop {
+ animation: scalePop 0.6s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+}
+
+@keyframes scalePop {
+ 0% {
+ transform: scale(0.5);
+ opacity: 0;
+ }
+ 50% {
+ transform: scale(1.1);
+ }
+ 100% {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+/* ============================================
+ 8. 抖动动画 (Shake Animation)
+ ============================================ */
+
+.shake {
+ animation: shake 0.5s ease;
+}
+
+@keyframes shake {
+ 0%, 100% {
+ transform: translateX(0);
+ }
+ 10%, 30%, 50%, 70%, 90% {
+ transform: translateX(-10px);
+ }
+ 20%, 40%, 60%, 80% {
+ transform: translateX(10px);
+ }
+}
+
+/* ============================================
+ 9. 弹跳动画 (Bounce Animation)
+ ============================================ */
+
+.bounce {
+ animation: bounce 1s ease infinite;
+}
+
+@keyframes bounce {
+ 0%, 100% {
+ transform: translateY(0);
+ }
+ 50% {
+ transform: translateY(-10px);
+ }
+}
+
+/* ============================================
+ 10. 滑动动画 (Slide Animations)
+ ============================================ */
+
+.slide-in-left {
+ animation: slideInLeft $handover-duration-slow ease;
+}
+
+@keyframes slideInLeft {
+ from {
+ transform: translateX(-100%);
+ }
+ to {
+ transform: translateX(0);
+ }
+}
+
+.slide-in-right {
+ animation: slideInRight $handover-duration-slow ease;
+}
+
+@keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ }
+ to {
+ transform: translateX(0);
+ }
+}
+
+.slide-out-left {
+ animation: slideOutLeft $handover-duration-slow ease;
+}
+
+@keyframes slideOutLeft {
+ from {
+ transform: translateX(0);
+ }
+ to {
+ transform: translateX(-100%);
+ }
+}
+
+.slide-out-right {
+ animation: slideOutRight $handover-duration-slow ease;
+}
+
+@keyframes slideOutRight {
+ from {
+ transform: translateX(0);
+ }
+ to {
+ transform: translateX(100%);
+ }
+}
+
+/* ============================================
+ 11. 特殊动画 (Special Animations)
+ ============================================ */
+
+/* 铃铛摇摆 */
+.bell-ring {
+ animation: bellRing 1s ease-in-out infinite;
+}
+
+@keyframes bellRing {
+ 0%, 100% {
+ transform: rotate(-15deg);
+ }
+ 50% {
+ transform: rotate(15deg);
+ }
+}
+
+/* 沙漏旋转 */
+.hourglass-rotate {
+ animation: hourglassRotate 2s linear infinite;
+}
+
+@keyframes hourglassRotate {
+ 0%, 100% {
+ transform: rotate(0deg);
+ }
+ 50% {
+ transform: rotate(180deg);
+ }
+}
+
+/* 呼吸效果 */
+.breathe {
+ animation: breathe 2s ease-in-out infinite;
+}
+
+@keyframes breathe {
+ 0%, 100% {
+ transform: scale(1);
+ }
+ 50% {
+ transform: scale(1.05);
+ }
+}
+
+/* 闪烁效果 */
+.blink {
+ animation: blink 1s ease-in-out infinite;
+}
+
+@keyframes blink {
+ 0%, 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0;
+ }
+}
+
+/* ============================================
+ 12. 工具类 (Utility Classes)
+ ============================================ */
+
+.animated {
+ animation-duration: $handover-duration-slow;
+ animation-fill-mode: both;
+}
+
+.animated-fast {
+ animation-duration: $handover-duration-fast;
+}
+
+.animated-slow {
+ animation-duration: $handover-duration-slower;
+}
+
+.animation-delay-1 {
+ animation-delay: 0.1s;
+}
+
+.animation-delay-2 {
+ animation-delay: 0.2s;
+}
+
+.animation-delay-3 {
+ animation-delay: 0.3s;
+}
+
+.animation-delay-4 {
+ animation-delay: 0.4s;
+}
+
+.animation-delay-5 {
+ animation-delay: 0.5s;
+}
+
+/* ============================================
+ 13. 过渡效果 (Transitions)
+ ============================================ */
+
+.transition-all {
+ transition: all $handover-duration-normal $handover-ease-in-out;
+}
+
+.transition-colors {
+ transition: background-color $handover-duration-normal $handover-ease-in-out,
+ color $handover-duration-normal $handover-ease-in-out;
+}
+
+.transition-transform {
+ transition: transform $handover-duration-normal $handover-ease-in-out;
+}
+
+.transition-opacity {
+ transition: opacity $handover-duration-normal $handover-ease-in-out;
+}
diff --git a/src/styles/handover-design.scss b/src/styles/handover-design.scss
new file mode 100644
index 0000000..ebc3420
--- /dev/null
+++ b/src/styles/handover-design.scss
@@ -0,0 +1,220 @@
+/**
+ * 护工端交接班流程 - 设计系统配置
+ * Design System for Caregiver Handover Process
+ */
+
+/* ============================================
+ 1. 品牌色彩系统 (Brand Color System)
+ ============================================ */
+
+/* 主色调(品牌色) */
+$handover-primary: #3B82F6; /* 主蓝色 - 主要按钮、标题 */
+$handover-primary-dark: #2563EB; /* 深蓝色 - 按钮按下态 */
+$handover-primary-deep: #1E40AF; /* 深蓝色 - 已读状态、次要文字 */
+$handover-primary-light: #DBEAFE; /* 浅蓝色 - 背景 */
+$handover-primary-lighter: #EFF6FF;/* 更浅蓝色 - 卡片背景 */
+
+/* 辅助色 */
+$handover-success: #10B981; /* 成功绿 - 完成状态、正常数据 */
+$handover-success-light: #D1FAE5; /* 浅绿色 - 成功背景 */
+$handover-warning: #F59E0B; /* 警告橙 - 需关注、待处理 */
+$handover-warning-light: #FEF3C7; /* 浅黄色 - 警告背景 */
+$handover-danger: #EF4444; /* 危险红 - 紧急、异常 */
+$handover-danger-light: #FEE2E2; /* 浅红色 - 危险背景 */
+
+/* 中性色 */
+$handover-gray-900: #111827; /* 最深灰 - 标题文字 */
+$handover-gray-800: #1F2937; /* 深灰 - 正文文字 */
+$handover-gray-700: #374151; /* 灰色 - 按钮文字 */
+$handover-gray-600: #4B5563; /* 中灰 - 辅助文字 */
+$handover-gray-500: #6B7280; /* 中性灰 - 普通文字、图标 */
+$handover-gray-400: #9CA3AF; /* 浅灰 - 提示文字 */
+$handover-gray-300: #D1D5DB; /* 更浅灰 - 边框 */
+$handover-gray-200: #E5E7EB; /* 分割线 */
+$handover-gray-100: #F3F4F6; /* 输入框背景 */
+$handover-gray-50: #F9FAFB; /* 页面背景 */
+
+/* 背景色 */
+$handover-bg-page: #F9FAFB; /* 页面背景 */
+$handover-bg-card: #FFFFFF; /* 卡片背景 */
+$handover-bg-input: #F3F4F6; /* 输入框背景 */
+$handover-bg-divider: #E5E7EB; /* 分割线 */
+$handover-bg-mask: rgba(0, 0, 0, 0.4); /* 遮罩层 */
+
+/* ============================================
+ 2. 字体规范 (Typography System)
+ ============================================ */
+
+/* 字体家族 */
+$handover-font-family: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Helvetica Neue', 'Segoe UI', 'Roboto', sans-serif;
+
+/* 字号体系 */
+$handover-font-size-2xl: 24px; /* 超大标题 */
+$handover-font-size-xl: 20px; /* 大标题 */
+$handover-font-size-lg: 18px; /* 页面标题 */
+$handover-font-size-md: 16px; /* 章节标题 */
+$handover-font-size-base: 14px; /* 正文 */
+$handover-font-size-sm: 13px; /* 辅助信息 */
+$handover-font-size-xs: 12px; /* 小字 */
+$handover-font-size-2xs: 11px; /* 极小字 */
+
+/* 字重 */
+$handover-font-weight-regular: 400;
+$handover-font-weight-medium: 500;
+$handover-font-weight-semibold: 600;
+$handover-font-weight-bold: 700;
+
+/* 行高 */
+$handover-line-height-tight: 1.25;
+$handover-line-height-normal: 1.5;
+$handover-line-height-relaxed: 1.6;
+$handover-line-height-loose: 1.75;
+
+/* ============================================
+ 3. 间距系统 (Spacing System)
+ ============================================ */
+
+/* 基础间距 */
+$handover-spacing-2xs: 4px;
+$handover-spacing-xs: 8px;
+$handover-spacing-sm: 12px;
+$handover-spacing-md: 16px;
+$handover-spacing-lg: 20px;
+$handover-spacing-xl: 24px;
+$handover-spacing-2xl: 32px;
+
+/* 页面间距 */
+$handover-page-padding: 16px; /* 页面边距 */
+$handover-card-gap: 12px; /* 卡片间距 */
+$handover-element-gap: 8px; /* 元素间距 */
+$handover-content-padding: 16px; /* 内容内边距 */
+
+/* 按钮内边距 */
+$handover-button-padding-x: 24px;
+$handover-button-padding-y: 12px;
+
+/* ============================================
+ 4. 圆角系统 (Border Radius System)
+ ============================================ */
+
+$handover-radius-xs: 4px;
+$handover-radius-sm: 8px;
+$handover-radius-md: 12px;
+$handover-radius-lg: 16px;
+$handover-radius-xl: 20px;
+$handover-radius-full: 9999px; /* 完全圆角 */
+
+/* ============================================
+ 5. 阴影系统 (Shadow System)
+ ============================================ */
+
+$handover-shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05);
+$handover-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);
+$handover-shadow-md: 0 4px 8px rgba(0, 0, 0, 0.1);
+$handover-shadow-lg: 0 8px 16px rgba(0, 0, 0, 0.12);
+$handover-shadow-xl: 0 8px 24px rgba(0, 0, 0, 0.12);
+$handover-shadow-2xl: 0 12px 32px rgba(0, 0, 0, 0.15);
+
+/* 按钮阴影 */
+$handover-shadow-button: 0 2px 8px rgba(37, 99, 235, 0.3);
+
+/* ============================================
+ 6. 动画时长 (Animation Duration)
+ ============================================ */
+
+$handover-duration-fast: 0.1s;
+$handover-duration-normal: 0.2s;
+$handover-duration-slow: 0.3s;
+$handover-duration-slower: 0.5s;
+
+/* 动画缓动函数 */
+$handover-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
+$handover-ease-out: cubic-bezier(0.0, 0, 0.2, 1);
+$handover-ease-in: cubic-bezier(0.4, 0, 1, 1);
+
+/* ============================================
+ 7. Z-Index 层级系统 (Z-Index System)
+ ============================================ */
+
+$handover-z-base: 1;
+$handover-z-sticky: 10;
+$handover-z-fixed: 100;
+$handover-z-modal: 1000;
+$handover-z-popup: 2000;
+$handover-z-toast: 3000;
+
+/* ============================================
+ 8. 尺寸系统 (Size System)
+ ============================================ */
+
+/* 导航栏 */
+$handover-navbar-height: 56px;
+$handover-navbar-height-small: 48px;
+
+/* 按钮高度 */
+$handover-button-height-sm: 44px;
+$handover-button-height-md: 48px;
+$handover-button-height-lg: 52px;
+
+/* 输入框高度 */
+$handover-input-height-sm: 36px;
+$handover-input-height-md: 44px;
+$handover-input-height-lg: 48px;
+
+/* 图标尺寸 */
+$handover-icon-xs: 16px;
+$handover-icon-sm: 20px;
+$handover-icon-md: 24px;
+$handover-icon-lg: 32px;
+$handover-icon-xl: 48px;
+$handover-icon-2xl: 64px;
+$handover-icon-3xl: 80px;
+
+/* 头像尺寸 */
+$handover-avatar-sm: 32px;
+$handover-avatar-md: 48px;
+$handover-avatar-lg: 64px;
+
+/* 复选框尺寸 */
+$handover-checkbox-size: 20px;
+$handover-checkbox-size-lg: 24px;
+
+/* ============================================
+ 9. CSS 变量定义 (CSS Variables)
+ ============================================ */
+
+:root {
+ /* 品牌色 */
+ --handover-primary: #{$handover-primary};
+ --handover-primary-dark: #{$handover-primary-dark};
+ --handover-primary-deep: #{$handover-primary-deep};
+ --handover-primary-light: #{$handover-primary-light};
+ --handover-primary-lighter: #{$handover-primary-lighter};
+
+ /* 辅助色 */
+ --handover-success: #{$handover-success};
+ --handover-success-light: #{$handover-success-light};
+ --handover-warning: #{$handover-warning};
+ --handover-warning-light: #{$handover-warning-light};
+ --handover-danger: #{$handover-danger};
+ --handover-danger-light: #{$handover-danger-light};
+
+ /* 中性色 */
+ --handover-gray-900: #{$handover-gray-900};
+ --handover-gray-800: #{$handover-gray-800};
+ --handover-gray-700: #{$handover-gray-700};
+ --handover-gray-600: #{$handover-gray-600};
+ --handover-gray-500: #{$handover-gray-500};
+ --handover-gray-400: #{$handover-gray-400};
+ --handover-gray-300: #{$handover-gray-300};
+ --handover-gray-200: #{$handover-gray-200};
+ --handover-gray-100: #{$handover-gray-100};
+ --handover-gray-50: #{$handover-gray-50};
+
+ /* 背景色 */
+ --handover-bg-page: #{$handover-bg-page};
+ --handover-bg-card: #{$handover-bg-card};
+ --handover-bg-input: #{$handover-bg-input};
+ --handover-bg-divider: #{$handover-bg-divider};
+ --handover-bg-mask: #{$handover-bg-mask};
+}
diff --git a/src/styles/index.scss b/src/styles/index.scss
index de224a9..2d16b96 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -1,3 +1,5 @@
@import './reset.scss';
@import './variable.scss';
@import './global.scss';
+@import './handover-design.scss';
+@import './handover-animations.scss';
diff --git a/unocss.config.js b/unocss.config.js
index 411a425..e008e15 100644
--- a/unocss.config.js
+++ b/unocss.config.js
@@ -52,7 +52,25 @@ export default defineConfig({
theme: {
colors: {
/** 主题色,用法如: text-primary */
- primary: 'var(--wot-color-theme,#0957DE)'
+ primary: 'var(--wot-color-theme,#0957DE)',
+ /** 交接班主题色 */
+ 'handover-primary': '#3B82F6',
+ 'handover-primary-dark': '#2563EB',
+ 'handover-success': '#10B981',
+ 'handover-warning': '#F59E0B',
+ 'handover-danger': '#EF4444',
+ 'handover-gray': {
+ 50: '#F9FAFB',
+ 100: '#F3F4F6',
+ 200: '#E5E7EB',
+ 300: '#D1D5DB',
+ 400: '#9CA3AF',
+ 500: '#6B7280',
+ 600: '#4B5563',
+ 700: '#374151',
+ 800: '#1F2937',
+ 900: '#111827'
+ }
},
fontSize: {
/** 提供更小号的字体,用法如:text-2xs */