learning-rust/练手项目/考勤打卡系统-产品需求文档.md

545 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 考勤打卡系统 — 产品需求文档PRD
> **产品定位**面向中小团队5100人的桌面端考勤打卡工具基于 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. 用户画像与场景
| 角色 | 核心诉求 | 使用频率 |
|---|---|---|
| **员工** | 一键打卡、查看自己出勤记录、请假/补卡申请 | 每天 24 次 |
| **团队组长** | 查看组员出勤、审批请假/补卡、关注异常考勤 | 每天 12 次 |
| **HR/管理员** | 排班配置、月考勤汇总、导出报表、全局设置 | 每周 23 次,月末高频 |
**典型场景**
- 🏢 **固定办公**:早 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:0012:00"
- 下班打卡有效时间窗口:如 "16:0023: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 开始,跑通最小闭环,再逐步叠加功能,学习的正反馈会很足。