更新记录
1(2026-11-11) 下载此版本
-
平台兼容性
考勤打卡 · 使用说明
基于 uni-app(Vue 2) 的移动考勤打卡应用,一套代码可运行在 App、H5、微信小程序。 考勤规则、打卡位置、允许范围全部可以在界面里改,不需要改代码;数据默认保存在本机,方便在接入后端之前先把流程跑通。
一、功能一览
| 页面 | 能力 |
|---|---|
| 打卡(首页) | 实时时钟、当前位置与「范围内 / 范围外」状态、今日上下班时间、工作时长进度、圆形打卡按钮 |
| 记录 | 按月查看每天上下班时间与工时,长按某条记录可撤销(需开启「允许撤销 / 补卡」) |
| 统计 | 本月出勤进度、近 7 日工时柱状图、整月日历四色标记(正常 / 迟到 / 早退 / 缺卡) |
| 我的 | 员工资料卡、当前考勤规则摘要、查看考勤点、清空本机数据 |
| 考勤规则设置 | 班次时间、迟到宽限、工作日、考勤点(地图选点)、允许打卡半径、两个开关 |
二、目录结构
考勤打卡/
├── App.vue 启动时加载本地保存的考勤规则
├── pages.json 页面与 tabBar 配置
├── manifest.json App / H5 / 小程序配置(地图 Key 在这里)
├── common/
│ ├── config.js 考勤规则:默认值、校验、保存、恢复默认、地图配置
│ ├── utils.js 纯函数:时间换算、距离计算、迟到早退判定、位置状态判定
│ ├── store.js 打卡记录读写、日汇总、月统计
│ └── amap.js 高德 Web 服务:坐标 → 文字地址
├── pages/
│ ├── index/index.vue 打卡首页
│ ├── records/records.vue 打卡记录
│ ├── stats/stats.vue 考勤统计
│ ├── mine/mine.vue 我的
│ └── rules/rules.vue 考勤规则设置
└── static/
├── tabbar/ 底部导航图标
└── marker-punch.png 地图上的考勤点标记
三、快速开始
- 用 HBuilderX 打开本目录(
文件 → 打开目录)。 - 选择运行端:
- App:
运行 → 运行到手机或模拟器(真机需开启定位权限) - H5:
运行 → 运行到浏览器(需先配好地图 Key,见第四节) - 微信小程序:
运行 → 运行到小程序模拟器,需先在manifest.json填小程序 AppID
- App:
- 首次进入会自动定位。若不在考勤范围内,打卡按钮会置灰并提示距离。
改过
manifest.json(尤其是模块、地图 Key)之后,必须停止运行再重新运行,热更新不会重新读取这些配置。
四、地图配置(重要)
本项目一共用到 3 个不同类型的高德 Key,用途不同,需要分别到高德开放平台创建:
| 用途 | 配置位置 | Key 类型 | 说明 |
|---|---|---|---|
| App 端地图显示 + 地图选点 | manifest.json → App 模块配置 → Maps → 高德地图 |
Android / iOS Key | 必须绑定包名 + 签名 SHA1,否则地图空白 |
| H5 端地图显示 + 地图选点 | manifest.json → H5 配置 → 地图 → 高德 |
Web 端(JS API)Key | 2021-12-02 之后申请的 Key 还需填 securityJsCode 安全密钥 |
| 坐标转文字地址 | common/config.js → amap.webServiceKey |
Web 服务 Key | 用于打卡时显示「我在哪条路」,留空则只显示考勤点名称,不影响打卡 |
也可以在 HBuilderX 里点开 manifest.json 用可视化界面填(默认就是可视化模式,右上角可切换到源码视图)。
微信小程序额外要求:把 https://restapi.amap.com 加入小程序后台的 request 合法域名,否则逆地理编码会失败(不影响打卡本身)。
五、考勤规则设置
从「我的 → 考勤规则设置」进入,改完点底部「保存规则」立即生效。
| 规则项 | 说明 | 取值范围 |
|---|---|---|
| 上班时间 / 下班时间 | 标准班次,用于判定迟到、早退、计算应出勤时长 | 00:00 - 23:59,班次不能少于 1 小时 |
| 迟到宽限 | 上班时间后多少分钟内仍算准时 | 0 - 120 分钟,默认 5 分钟 |
| 工作日 | 哪些天需要出勤,影响「应出勤天数」与缺卡统计 | 至少保留 1 天 |
| 考勤点名称 | 显示在打卡页与地图气泡上 | 最多 30 字 |
| 考勤位置 | 点「地图选点」在地图上选择;也可点「用当前位置」把当前坐标设为考勤点 | 经纬度 |
| 允许打卡半径 | 蓝色范围圈的半径,超出即无法打卡 | 100 / 200 / 300 / 500 / 1000 米 |
| 必须在范围内打卡 | 关闭后任何位置都能打卡(定位失败也能打) | 开 / 关 |
| 允许撤销 / 补卡 | 关闭后记录页不能长按撤销 | 开 / 关 |
关于地图与范围圈:设置页的地图会以考勤点为中心画出蓝色圆圈,圆圈就是允许打卡的范围。切换半径时圆圈实时缩放、地图自动调整缩放级别,可以拖动地图确认范围是否把办公楼完整覆盖。
修改规则对历史记录的影响:打卡当时就已经判定好「迟到 / 早退」并写入记录,之后改规则不会回溯修改旧记录,只影响后续打卡。
六、打卡与位置校验
打卡按钮有四种形态:
| 形态 | 表现 |
|---|---|
| 上班打卡 | 蓝色渐变按钮,点击记录到岗时间 |
| 下班打卡 | 橙色渐变按钮,点击记录离岗时间 |
| 已完成 | 灰色按钮,今日上、下班都已打卡 |
| 暂不可打卡 | 灰色锁定按钮,位于范围外或定位未完成;副标题会写明原因(「正在校验考勤范围…」/「定位失败,请先开启定位」/「已超出范围 xx 米」) |
位置判定只有四种结果,页面与数据层共用同一套逻辑:
ok—— 定位成功且在半径内,可打卡out—— 定位成功但超出半径,禁止打卡failed—— 定位失败,禁止打卡(不会因为定位失败就放行)locating—— 定位进行中
两道拦截:页面按钮先拦一次,写入数据前 store.addRecord 再校验一次,防止绕过界面直接调用写入假数据。
七、数据存储
全部数据存在本机 Storage,清除应用数据或点「我的 → 清空考勤数据」会一并丢失。
| Storage Key | 内容 |
|---|---|
attendance_rules_v1 |
考勤规则(只在改过规则后才有值,没改过则用出厂默认) |
attendance_records_v1 |
打卡记录数组 |
attendance_profile_v1 |
员工资料(姓名、工号、部门、职位) |
单条打卡记录的结构:
{
id: '1731300000000-a1b2c3',
date: '2026-11-11',
type: 'in', // in 上班 / out 下班
timestamp: 1731300000000,
timeText: '09:02',
status: 'late', // normal 正常 / late 迟到 / early 早退
location: {
address: '科技园南路',
distance: 42,
inRange: true,
mock: false, // 是否定位失败
simulated: false // 是否使用了开发期模拟坐标
},
remark: ''
}
八、常见问题
1. 点打卡按钮没反应 / 一直显示「正在校验考勤范围…」 定位还没返回结果。进入页面会自动定位,若长时间无结果,点一下顶部定位条或提示条上的「重新定位」。 代码里做了 10 秒超时兜底,超时后会明确提示失败原因,不会一直卡住。
2. 明明在公司,却提示「不在考勤范围」
- 先确认考勤点坐标是否正确:
我的 → 查看考勤点 - 再看顶部定位条显示的距离与半径是否合理
- 室内定位误差可能上百米,可把半径调大一些(如 500 米)
3. 设置页地图是空白的
- App 端:检查高德 Android / iOS Key 是否绑定正确的包名与 SHA1。用 HBuilderX 标准基座调试时包名是
io.dcloud.HBuilder,需要把该包名和对应 SHA1 加入 Key 的白名单;正式打包则填你自己的包名。 - H5 端:
manifest.json → H5 配置 → 地图里的 JS API Key 和安全密钥是否已填。 - 地图加载失败时页面会显示「地图未能加载」占位,此时仍可用「用当前位置」保存坐标。
4. 地图选点打不开,提示「地图选点不可用」
uni.chooseLocation 依赖地图模块与 Key。App 端确认 manifest.json → App 模块配置 已勾选 Maps;H5 端确认已填 JS API Key。临时可用「用当前位置」代替。
5. App 端改了配置不生效
manifest.json 的改动必须重新编译运行,热更新无效。
6. 打卡页显示「模拟定位」
这是开发期的兜底:模拟器拿不到真实定位时,会用考勤点坐标代替,方便验证流程。正式打包(NODE_ENV=production)后此逻辑自动失效。可在 common/config.js 的 debug.mockLocationOnFail 关掉。
7. 清空数据后规则还在 「清空考勤数据」只删打卡记录。要恢复出厂规则用规则设置页的「恢复默认」。
九、接入后端要改哪里
页面只依赖 common/store.js 暴露的函数,把存储换成接口即可,页面几乎不用动:
// common/store.js 里这几个函数改成请求后端
readRecords() → GET /api/attendance/records
writeRecords() → POST /api/attendance/records
addRecord() → 保留位置校验,再提交到服务端
其余对外函数(getTodaySummary / getMonthStat / getMonthDayMap / getRecords / removeRecord / clearRecords)签名保持不变即可。
员工资料在 common/store.js 的 DEFAULT_PROFILE 与 common/config.js 的 DEFAULT_CONFIG.company 里,目前是占位数据(林嘉怡 / 产品设计部 / 深圳南山),上线前记得替换。
十、开发注意事项
1. ATTENDANCE_CONFIG 必须就地改字段
common/config.js 导出的 ATTENDANCE_CONFIG 是运行期共享的同一个对象,页面 data 里持有的是它的引用。改规则一律通过 applyConfig / saveConfig 就地赋值,不要整体替换对象,否则已经渲染的页面收不到更新。
2. 配置校验有两套模式
normalizeConfig(input, { strict: true }) // 保存时:收集错误,有问题拒绝落库
normalizeConfig(input, { strict: false }) // 读缓存时:静默钳制回合法范围,防止手改存储把应用搞挂
3. 历史记录不回溯
迟到 / 早退在打卡当时判定并写死,改规则只影响之后的打卡。如果要让历史统计也跟随规则变化,需要在记录里额外冗余一份规则快照。
4. 单位换算
样式统一用 rpx,逻辑里的距离单位是米、时间单位是分钟。经纬度统一使用 gcj02(高德 / 微信 / uni.getLocation({type:'gcj02'}) 一致),与考勤点坐标同坐标系,计算距离才不会偏。
十一、默认账号与初始数据
| 项 | 默认值 |
|---|---|
| 姓名 / 工号 | 林嘉怡 / H*** |
| 部门 / 职位 | 产品设计部 / 高级产品设计师 |
| 考勤点 | 华清科技 · 总部园区(深圳南山,22.539926, 113.949886) |
| 班次 | 09:00 - 18:00,迟到宽限 5 分钟 |
| 工作日 | 周一至周五 |
| 打卡半径 | 500 米,必须在范围内打卡 |
以上均为演示用占位数据,可在 common/config.js 与规则设置页中修改。

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 4
赞赏 0
下载 12758595
赞赏 1959
赞赏
京公网安备:11010802035340号