需求背景
产品希望统计我们公司线下人员的考勤情况,钉钉的功能目前不能满足一天多次外勤打卡的需求,于是我们打算自己开发一套打卡系统。我们的线下工作人员日常使用的是我们内部的一个微信小程序,产品希望将外勤打卡的功能在小程序上实现。方便线下人员在同一个平台上操作。
微信小程序外勤打卡
我们线下工作人员遍布全国各地,每个人的工作地点可能各不一样,怎样让线下工作人员在指定的地方打卡呢?
1.如何确定打卡的对象和范围
为了方便统一打卡管理,添加一个模块给志愿者管理人员,由管理者添加外勤对象,线下工作者根据当前的定位,选择匹配到方圆1公里的外勤对象,选择对应要打卡的对象进行打卡。
外勤对象: 线下工作者打卡的目标地
2.如何保证一天多次打卡
外勤打卡呢,一个线下工作一天要跑多个工作地点,每个地点都要进行打卡,如何保证一天多次打卡呢?产品希望他们每次出勤都有对应的签到和签退,没完成签退,不可以新建一次外勤,每次签到成功就创建了一次外勤,签退不限制地点,可以进行随时签退,这样就保证了每次出勤都是成对的。
一次外勤:一对签到和签退,要先完成签退,才能到下个地点进行签退。
3.打卡定位
针对打卡功能,我们选用微信小程序开发里面的位置api:定位、和选点定位。
位置api调用前需要 先
用户授权
scope.userLocation。
这次主要使用的两个位置api:
- wx.chooseLocation 打开地图选择位置;
- wx.getLocation 获取当前的地理位置。
对经纬度进行逆解析需要申请腾讯地图的
key
,申请开发者密钥(Key)。
来来来,签到了:
4.如何防止通过刷接口打卡?
- MD5加密
考虑到有可能通过抓包提交经纬度来进行打卡,我们前后端统一指定了一套打卡加密机制。我们采用的 MD5加密,对经纬度、时间戳、小程序密钥等组合加密,前端每次打卡,都要加密后32密钥传给后端,后端校验通过后,才可以打卡。这样就可以阻止部分通过接口打卡的骚操作了。
- 打卡自拍
我们要求每次签到签退都要进行自拍,虽然不能完全杜绝刷打卡,但却可以 避免一部分作弊。
最终我们的打卡:
小结
最后对于开发团队的总结, 前端主动驱动,需求评估后,提前想好解决方案,尽量减少非预知问题,需求评估后可以提前做个demo,对技术选型、功能的实现程度,以及需求的开发周期的有个大致预期。