uniapp上下班签到
实现上下班签到的功能
在UniApp中实现上下班签到功能,可以通过以下步骤完成:
1. 获取用户位置信息
使用UniApp的uni.getLocationAPI获取用户当前经纬度,确保用户授权地理位置权限。示例代码:
uni.getLocation({
type: 'gcj02',
success: function (res) {
console.log('当前位置:', res.latitude, res.longitude);
},
fail: function (err) {
console.error('获取位置失败:', err);
}
});
2. 设置签到范围判断 根据公司设定的签到范围(如500米),计算用户当前位置与公司坐标的距离。可以使用Haversine公式计算两点间距离:
function getDistance(lat1, lon1, lat2, lon2) {
const R = 6371; // 地球半径(公里)
const dLat = (lat2 - lat1) * Math.PI / 180;
const dLon = (lon2 - lon1) * Math.PI / 180;
const a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
return R * c * 1000; // 转换为米
}
3. 签到时间记录
获取当前系统时间,判断是否符合签到时间规则(如上班签到时间9:00前)。使用new Date()获取时间:
const now = new Date();
const hours = now.getHours();
const minutes = now.getMinutes();
4. 数据提交与存储
将签到数据(时间、位置、状态)通过uni.request提交到后端服务器:
uni.request({
url: 'https://your-api.com/checkin',
method: 'POST',
data: {
userId: '123',
type: '上班', // 或下班
time: new Date().toISOString(),
location: {lat: res.latitude, lng: res.longitude}
},
success: (res) => {
uni.showToast({title: '签到成功'});
}
});
5. 签到历史记录 创建页面展示用户的签到历史记录,通过调用后端API获取数据并渲染列表:
<view v-for="(item,index) in records" :key="index">
<text>{{item.date}} {{item.type}} {{item.status}}</text>
</view>
注意事项
- 需要处理用户拒绝位置授权的情况,提供手动选择位置的备选方案
- 考虑网络异常时的本地缓存机制,支持离线签到后同步
- 对于跨天或加班情况,需要特殊处理下班签到逻辑
- iOS和Android平台的位置获取可能存在差异,需测试兼容性
扩展功能建议
- 添加拍照打卡功能,使用
uni.chooseImageAPI - 实现Wi-Fi签到,通过
uni.getNetworkType检测指定Wi-Fi - 添加签到提醒和异常签到通知功能
- 开发管理后台查看团队签到情况
以上方案可根据实际需求调整,核心是确保位置真实性、时间准确性和数据可靠性。







