diff --git a/练手项目/考勤打卡系统-产品需求文档.md b/练手项目/考勤打卡系统-产品需求文档.md new file mode 100644 index 0000000..b068262 --- /dev/null +++ b/练手项目/考勤打卡系统-产品需求文档.md @@ -0,0 +1,544 @@ +# 考勤打卡系统 — 产品需求文档(PRD) + +> **产品定位**:面向中小团队(5~100人)的桌面端考勤打卡工具,基于 Tauri 构建,轻量、离线可用、数据本地化。 +> **版本**:V1.0 MVP → V1.5 增强 → V2.0 联网协作 +> **作者**:产品经理 · Yuhang Wu +> **日期**:2026-07-02 + +--- + +## 目录 + +1. [用户画像与场景](#1-用户画像与场景) +2. [产品架构总览](#2-产品架构总览) +3. [功能模块详述](#3-功能模块详述) + - [3.1 打卡模块](#31-打卡模块) + - [3.2 考勤统计与看板](#32-考勤统计与看板) + - [3.3 排班管理](#33-排班管理) + - [3.4 请假管理](#34-请假管理) + - [3.5 补卡与申诉](#35-补卡与申诉) + - [3.6 报表导出](#36-报表导出) + - [3.7 系统设置](#37-系统设置) +4. [数据模型概览](#4-数据模型概览) +5. [版本迭代路线图](#5-版本迭代路线图) +6. [UI/UX 设计要点](#6-uiux-设计要点) +7. [技术选型建议](#7-技术选型建议) + +--- + +## 1. 用户画像与场景 + +| 角色 | 核心诉求 | 使用频率 | +|---|---|---| +| **员工** | 一键打卡、查看自己出勤记录、请假/补卡申请 | 每天 2~4 次 | +| **团队组长** | 查看组员出勤、审批请假/补卡、关注异常考勤 | 每天 1~2 次 | +| **HR/管理员** | 排班配置、月考勤汇总、导出报表、全局设置 | 每周 2~3 次,月末高频 | + +**典型场景**: + +- 🏢 **固定办公**:早 9 点到公司 → 打开 App → 点击「上班打卡」→ 晚 6 点点击「下班打卡」 +- 🏠 **远程办公**:在家打开电脑 → 点击「远程打卡」→ 系统自动记录 IP/位置备注 +- 🚗 **外勤拜访**:到达客户公司 → 点击「外勤打卡」→ 拍照上传 / 填写备注 +- 📅 **月末结算**:HR 打开 App → 进入「考勤统计」→ 查看部门月度汇总 → 导出 Excel → 发给财务算工资 +- 😷 **早上起晚了**:员工 10 点到公司 → 发现已迟到 → 在 App 内发起「补卡申请」→ 组长审批 + +--- + +## 2. 产品架构总览 + +``` +┌─────────────────────────────────────────────────┐ +│ 考勤打卡系统 │ +├─────────────────────────────────────────────────┤ +│ 前端 (React / Vue / Svelte + TailwindCSS) │ +│ ├─ 首页看板 (Dashboard) │ +│ ├─ 打卡页 (Punch) │ +│ ├─ 考勤统计 (Statistics) │ +│ ├─ 排班管理 (Schedule) │ +│ ├─ 请假管理 (Leave) │ +│ ├─ 审批中心 (Approval) │ +│ ├─ 报表导出 (Report) │ +│ └─ 系统设置 (Settings) │ +├─────────────────────────────────────────────────┤ +│ Tauri Bridge (IPC) │ +├─────────────────────────────────────────────────┤ +│ Rust 后端 │ +│ ├─ 打卡业务逻辑 │ +│ ├─ 考勤计算引擎 │ +│ ├─ 数据持久化 (SQLite) │ +│ ├─ 定时任务 (自动打卡提醒) │ +│ └─ 导出引擎 (xlsx/csv) │ +└─────────────────────────────────────────────────┘ +``` + +**设计原则**: +1. **离线优先** — 所有核心功能无网络时也能使用,数据存在本地 SQLite +2. **隐私安全** — 数据归用户所有,不上传任何云端服务器(V1.0) +3. **简单直接** — 打卡不超过 2 步操作,核心路径最短 +4. **渐进增强** — V1.0 单机版 → V2.0 局域网同步 → V3.0 云端协作 + +--- + +## 3. 功能模块详述 + +### 3.1 打卡模块 + +#### 3.1.1 快速打卡(核心功能) + +**描述**:应用首页最核心区域,提供一键打卡能力。 + +| 特性 | 说明 | +|---|---| +| 上班打卡 | 点击「上班打卡」按钮,记录打卡时间;按钮在打卡后变为禁用灰态并显示已打卡时间 | +| 下班打卡 | 同上,区分上班/下班两个按钮 | +| 打卡时间显示 | 实时显示当前时间(精确到秒),让用户确认打卡时刻 | +| 打卡确认动画 | 打卡成功后播放 0.5s 动画反馈(✅ + 时间戳) | +| 今日状态条 | 顶部显示"今日已打卡:上班 09:02 | 下班 —"等状态信息 | +| 连续打卡天数 | 显示"已连续打卡 X 天"的激励提示 | + +**打卡规则**(可配置): +- 上班打卡有效时间窗口:如 "06:00~12:00" +- 下班打卡有效时间窗口:如 "16:00~23:59" +- 最早/最晚打卡限制 +- 重复打卡提示:"你今天已经在 09:02 打卡上班,确定重新打卡?" + +#### 3.1.2 打卡方式 + +| 方式 | 描述 | 优先级 | +|---|---|---| +| **手动点击打卡** | 打开应用 → 点击按钮 | MVP | +| **快捷键打卡** | 系统全局快捷键 `Ctrl+Shift+I/O` 快速打卡 | V1.0 | +| **系统托盘打卡** | 右键托盘图标 → 选择打卡类型 | V1.0 | +| **开机自启自动提醒** | 开机后弹窗提醒打卡 | V1.5 | + +#### 3.1.3 打卡类型 + +| 类型 | 图标 | 说明 | +|---|---|---| +| 🏢 正常打卡 | 办公 | 默认类型 | +| 🏠 远程打卡 | 居家 | 标记为远程办公,可选填备注 | +| 🚗 外勤打卡 | 出行 | 标记外勤,支持拍照附件(V1.5) | +| ⏰ 加班打卡 | 时钟 | 超出正常工作时间后的打卡,自动算加班 | + +#### 3.1.4 打卡记录列表 + +- 列表页展示历史打卡记录,按日期倒序 +- 每条记录显示:日期、上班时间、下班时间、类型标签、工时 +- 异常标记:红色标记迟到/早退/缺卡 +- 支持按日期范围筛选 +- 点击某天可查看详情 + +--- + +### 3.2 考勤统计与看板 + +#### 3.2.1 个人考勤看板 + +``` +┌────────────────────────────────────────┐ +│ 📊 我的考勤 — 2026年7月 │ +├────────────────────────────────────────┤ +│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ +│ │ 应出勤 │ │ 实际出勤│ │ 迟到 │ │ 早退 │ │ +│ │ 22天 │ │ 20天 │ │ 2次 │ │ 0次 │ │ +│ └──────┘ └──────┘ └──────┘ └──────┘ │ +│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ +│ │ 缺卡 │ │ 加班 │ │ 请假 │ │ 外勤 │ │ +│ │ 0次 │ │ 8.5h │ │ 2天 │ │ 3次 │ │ +│ └──────┘ └──────┘ └──────┘ └──────┘ │ +├────────────────────────────────────────┤ +│ 本月趋势图 (折线图: 每日工时走势) │ +│ ▓▂▃▅▇▆▄▂▁▃▅▇█▆▄▃▂▁▂▄▆▇█▆▄▃▂ │ +├────────────────────────────────────────┤ +│ 日历视图 (绿色=正常, 黄=迟到, 红=缺卡) │ +│ 一 二 三 四 五 六 日 │ +│ 🟢 🟢 🟡 🟢 🟢 — — │ +│ 🟢 🟢 🟢 🟢 🟢 — — │ +│ ... │ +└────────────────────────────────────────┘ +``` + +#### 3.2.2 管理端考勤总览 + +- 管理员/组长可查看团队所有成员的考勤汇总 +- 异常考勤高亮:迟到、早退、缺卡、未打卡人员 +- 支持按部门/人员筛选 +- 实时统计:今日已打卡人数/总人数 + +#### 3.2.3 工时计算规则 + +| 规则项 | 说明 | +|---|---| +| 标准工时 | 可配置,默认 8h/天 | +| 迟到扣减 | 迟到 N 分钟,扣减 N 分钟工时(可配置宽限时间) | +| 早退扣减 | 早退 N 分钟,扣减 N 分钟工时 | +| 加班计算 | 超出标准工时的部分自动计为加班 | +| 午休扣除 | 可配置是否自动扣除午休时间 | + +--- + +### 3.3 排班管理 + +#### 3.3.1 排班模板 + +| 模板 | 描述 | +|---|---| +| **固定班制** | 周一至周五 09:00-18:00,周末双休 | +| **大小周** | 单周 6 天、双周 5 天 | +| **弹性工作制** | 核心在岗时间(如 10:00-16:00),其余时间弹性 | +| **轮班制** | 早/中/晚三班倒,支持自定义轮换规则 | +| **自定义** | 完全自定义每天的工作时段 | + +#### 3.3.2 排班功能 + +- 为每位员工分配排班模板 +- 支持临时调班:拖拽日历调整某天的班次 +- 批量排班:为部门/团队统一设置排班 +- 排班日历视图:可预览任意月份的排班情况 + +#### 3.3.3 节假日管理 + +- 内置中国法定节假日(2026年起) +- 支持手动添加/修改节假日 +- 调休日自动标注(如周六上班补五一假期) +- 节假日不计入缺勤 + +--- + +### 3.4 请假管理 + +#### 3.4.1 请假类型 + +| 类型 | 带薪 | 说明 | +|---|---|---| +| 年假 | ✅ | 按工龄阶梯增加,可配置年假天数 | +| 事假 | ❌ | 扣薪,无额度限制 | +| 病假 | ✅/❌ | 可配置带薪天数上限 | +| 婚假 | ✅ | 默认 3 天,可配置 | +| 产假/陪产假 | ✅ | 默认 98/15 天,可配置 | +| 丧假 | ✅ | 默认 3 天,可配置 | +| 调休 | ✅ | 用加班时长兑换 | +| 其他 | 自定义 | HR 可自定义假期类型 | + +#### 3.4.2 请假流程 + +``` +发起请假 ──→ 选择请假类型 ──→ 选择日期范围 ──→ 填写原因 + │ + ▼ +提交申请 ──→ 推送审批通知 ──→ 审批人(组长/HR) + │ │ + ├── 通过 ──→ 回写考勤记录,标记"已请假" + │ + └── 驳回 ──→ 通知申请人 + 驳回原因 +``` + +#### 3.4.3 假期余额 + +- 每位员工的各类假期余额管理 +- 年假自动按规则发放(如入职满 1 年发放 5 天) +- 假期余额不足时提示 +- 调休余额 = 已加班小时数 ÷ 8(转换为天数) + +--- + +### 3.5 补卡与申诉 + +#### 3.5.1 补卡 + +- 忘记打卡的次日可发起补卡申请 +- 补卡次数限制(如每月最多 3 次) +- 需填写补卡原因 + 实际到岗/离岗时间 +- 审批通过后修正考勤记录 + +#### 3.5.2 考勤异常申诉 + +- 迟到/早退/缺卡 → 员工可在异常发生后发起申诉 +- 申诉类型: + - "系统/设备故障导致无法打卡" + - "临时外出公干" + - "身体不适延迟但未请病假" + - "其他原因(需详细说明)" +- 管理员审核后修正考勤状态 + +--- + +### 3.6 报表导出 + +#### 3.6.1 支持的报表类型 + +| 报表 | 内容 | 格式 | +|---|---|---| +| 月度考勤汇总表 | 每人:应出勤、实际出勤、迟到、早退、缺卡、请假、加班 | Excel | +| 日打卡明细表 | 每人每天:上班时间、下班时间、工时、异常标记 | Excel/CSV | +| 请假统计表 | 每人:各类假期已用/剩余 | Excel | +| 加班统计表 | 每人:加班日期、时长、原因 | Excel | +| 月度工资考勤底表 | 汇总所有与薪资相关考勤数据 | Excel | + +#### 3.6.2 导出功能 + +- 选择日期范围(月/自定义) +- 选择人员范围(个人/部门/全员) +- 选择导出字段 +- 预览后导出 +- 导出历史记录 + +--- + +### 3.7 系统设置 + +#### 3.7.1 考勤规则配置 + +| 配置项 | 默认值 | 说明 | +|---|---|---| +| 上班时间 | 09:00 | — | +| 下班时间 | 18:00 | — | +| 迟到宽限 | 5 分钟 | 9:05 之前不算迟到 | +| 早退宽限 | 5 分钟 | 17:55 之后不算早退 | +| 午休时间 | 12:00-13:00 | 自动扣除 | +| 半天请假判定 | 4 小时 | 当天工时 < 4h 算半天缺勤 | +| 加班起算 | 超出标准工时 30 分钟 | 避免误计加班 | +| 每月补卡上限 | 3 次 | — | +| 工作日设置 | 周一至周五 | — | + +#### 3.7.2 通用设置 + +- 公司名称/Logo 设置 +- 数据存储路径 +- 数据备份与恢复 + - 手动备份(导出 .db 文件) + - 自动备份(每周/每月定时备份) + - 从备份恢复 +- 主题切换(亮色/暗色) +- 语言(中文/英文) +- 开机自启动 +- 最小化到系统托盘 +- 打卡提醒时间(如 08:55 弹窗提醒) + +#### 3.7.3 用户与权限 + +| 角色 | 权限范围 | +|---|---| +| **超级管理员** | 所有权限:系统配置、用户管理、全部数据查看 | +| **HR** | 排班配置、请假审批、报表导出、查看全员考勤 | +| **组长** | 查看组员考勤、审批组员请假/补卡、组员异常提醒 | +| **员工** | 个人打卡、个人考勤查看、请假/补卡申请、个人设置 | + +--- + +## 4. 数据模型概览 + +### 核心实体关系 + +``` +User (用户) + ├─ 1:N → PunchRecord (打卡记录) + ├─ 1:N → LeaveRequest (请假申请) + ├─ 1:N → PatchRequest (补卡申请) + ├─ 1:N → Appeal (考勤申诉) + ├─ 1:1 → UserSchedule (用户排班) + └─ 1:1 → LeaveBalance (假期余额) + +Schedule (排班模板) + └─ 1:N → UserSchedule (用户排班) + +Holiday (节假日) + └─ 全局 + +SystemConfig (系统配置) + └─ 单例 +``` + +### 核心表结构(伪代码) + +```sql +-- 用户表 +User { + id, name, department, role, email, phone, + hire_date, created_at, updated_at +} + +-- 打卡记录表 +PunchRecord { + id, user_id, date, punch_in_time, punch_out_time, + punch_in_type, punch_out_type, -- normal/remote/field/overtime + work_hours, status, -- normal/late/early/missing/leave + remark, created_at +} + +-- 排班模板表 +ScheduleTemplate { + id, name, type, -- fixed/flexible/shift/custom + work_days, -- JSON: [1,2,3,4,5] 表示周一到周五 + start_time, end_time, + core_start, core_end, -- 弹性工作制核心时段 + is_active +} + +-- 用户排班表 +UserSchedule { + id, user_id, template_id, + effective_from, effective_to, -- 排班有效期 + overrides -- JSON: 特殊日期调整 +} + +-- 请假申请表 +LeaveRequest { + id, user_id, leave_type, -- annual/sick/personal/marriage/... + start_date, end_date, duration_days, + reason, status, -- pending/approved/rejected + approver_id, approved_at, remark +} + +-- 假期余额表 +LeaveBalance { + id, user_id, leave_type, total_days, used_days, remaining_days, year +} + +-- 节假日表 +Holiday { + id, name, date, is_workday, -- true=调休上班日 + description +} + +-- 补卡申请表 +PatchRequest { + id, user_id, target_date, + actual_in_time, actual_out_time, + reason, status, approver_id, created_at +} + +-- 考勤申诉表 +Appeal { + id, user_id, punch_record_id, + appeal_type, reason, evidence, -- evidence: 附件路径 + status, handler_id, handled_at, result_remark +} +``` + +--- + +## 5. 版本迭代路线图 + +### V1.0 — MVP 最小可用版本(单人单机) + +> **目标**:一个人能用,覆盖最基本的打卡+查看+导出。 + +| 功能 | 说明 | +|---|---| +| ✅ 上班/下班打卡 | 手动点击打卡,区分上下班 | +| ✅ 打卡历史列表 | 按日期查看自己的打卡记录 | +| ✅ 个人月考勤统计 | 出勤天数、迟到、早退、缺卡计数 | +| ✅ 固定排班规则 | 硬编码:周一至周五 9:00-18:00 | +| ✅ 基本设置 | 公司名、上班时间、下班时间 | +| ✅ SQLite 本地存储 | 所有数据存在本地 | +| ✅ 系统托盘 | 最小化到托盘 + 右键菜单打卡 | +| ✅ 暗色/亮色主题 | 基础主题切换 | +| ✅ 月度 Excel 导出 | 导出个人月度考勤汇总 | + +### V1.5 — 功能增强(单机多用户) + +> **目标**:支持多个用户在同一个应用内管理,模拟真实团队场景。 + +| 功能 | 说明 | +|---|---| +| ✅ 多用户管理 | 添加/编辑/删除用户,角色区分 | +| ✅ 排班模板 | 固定/弹性/大小周 至少 3 种模板 | +| ✅ 请假申请与审批 | 完整流程:申请→审批→回写考勤 | +| ✅ 补卡申请与审批 | — | +| ✅ 假期余额管理 | — | +| ✅ 节假日管理 | 内置中国法定节假日 | +| ✅ 管理端考勤总览 | 团队考勤看板 | +| ✅ 考勤异常申诉 | — | +| ✅ 数据备份恢复 | 手动备份 + 自动备份 | +| ✅ 多格式导出 | Excel 多报表类型 | +| ✅ 打卡提醒 | 定时弹窗提醒 | + +### V2.0 — 联网协作 + +> **目标**:局域网/服务器部署后端,多设备协同。 + +| 功能 | 说明 | +|---|---| +| ✅ C/S 架构 | Tauri 客户端 + Rust 后端服务(Axum/Actix) | +| ✅ 用户登录系统 | JWT 认证 | +| ✅ 数据实时同步 | WebSocket 推送打卡状态 | +| ✅ 审批通知 | 实时推送审批提醒 | +| ✅ 多设备登录 | 同一账号可在多设备打卡 | +| ✅ 管理后台 Web 端 | 独立 Web 管理后台 | + +### V3.0 — 企业级增强(远期规划) + +- 对接企业微信/钉钉/飞书 +- 人脸/指纹打卡(调用系统生物识别) +- GPS 围栏打卡(外勤地理校验) +- 考勤数据大屏 +- 薪资计算联动 + +--- + +## 6. UI/UX 设计要点 + +### 6.1 信息架构 + +``` +侧边栏导航 +├── 🏠 首页看板 ← 默认页,今日状态 + 快速打卡 +├── 📋 打卡记录 ← 历史打卡列表 +├── 📊 考勤统计 ← 个人/团队统计 +├── 📅 排班管理 ← 排班模板 + 人员排班(管理员) +├── 🏖️ 请假管理 ← 请假申请 + 我的假期 +├── ✍️ 审批中心 ← 待审批列表(管理员/组长) +└── ⚙️ 设置 ← 系统配置 +``` + +### 6.2 关键交互规范 + +- **打卡按钮**:大尺寸、醒目颜色(上班绿色/下班橙色)、点击即完成 +- **状态反馈**:打卡成功 → 动画 + 振动(可选)+ 声音(可选) +- **异常提示**:迟到/缺卡 → 红色标记 + 悬浮提示原因 +- **表格交互**:考勤记录支持排序/筛选/列显隐 +- **日历组件**:考勤日历支持月份切换、点击日期查看详情 +- **响应式**:窗口最小尺寸 900×600,适配不同分辨率 + +### 6.3 视觉风格 + +- 现代简洁风格,专业但不冰冷 +- 主色调:蓝色系(#2563EB 为主色),传达专业可信赖感 +- 功能色:绿色=正常打卡,橙色=迟到,红色=缺卡/异常 +- 圆角卡片布局,适度的阴影层次 + +--- + +## 7. 技术选型建议 + +| 层 | 技术 | 理由 | +|---|---|---| +| **桌面框架** | Tauri 2.x | 轻量(相比 Electron)、Rust 后端、Web 前端 | +| **前端框架** | React + TypeScript | 生态丰富、适合中大型应用 | +| **UI 组件库** | Ant Design / shadcn/ui | 前者功能全、后者定制性好 | +| **CSS** | TailwindCSS | 快速开发、与 shadcn/ui 配合良好 | +| **状态管理** | Zustand / Jotai | 轻量,适合 Tauri 单窗口场景 | +| **图表** | Recharts / ECharts | 考勤趋势图、统计饼图 | +| **数据库** | SQLite (via rusqlite) | 轻量、无需安装、Tauri 原生支持 | +| **导出** | rust_xlsxwriter | Rust 原生 Excel 写入 | +| **后端 (V2.0+)** | Axum + SQLx | Rust 异步 HTTP 框架 + 类型安全 SQL | +| **打包** | Tauri Bundle (msi/dmg/deb) | 跨平台分发 | + +--- + +## 附录:MVP 第一周开发计划(参考) + +| 天 | 任务 | +|---|---| +| Day 1 | 初始化 Tauri + React 项目,配置 SQLite,实现用户表 CRUD | +| Day 2 | 打卡核心功能:上下班按钮 + 时间记录 + 今日状态 | +| Day 3 | 打卡记录列表页 + 基本筛选 | +| Day 4 | 考勤统计页:统计卡片 + 日历视图 | +| Day 5 | 系统设置页 + Excel 导出 | +| Day 6 | 系统托盘 + 快捷键打卡 + 打包测试 | +| Day 7 | Bug 修复 + UI 打磨 + 文档 | + +--- + +> **小结**:这个考勤打卡系统作为 Rust + Tauri 的练手项目非常合适——它功能层次分明、数据模型清晰、从简单到复杂可逐步迭代,能覆盖 Tauri 开发的核心知识点:Rust 后端逻辑、SQLite 操作、IPC 通信、系统托盘、文件导出、前端组件化等。从 MVP 开始,跑通最小闭环,再逐步叠加功能,学习的正反馈会很足。