1 签到日历周期
签到周期: 常用的签到周期为一周或者一个月.我们的app采用的是一个月的方案.市面上的签到日历界面都大同小异,接下来我会给大家分享以月为周期的签到日历实现方案以及伴生的签到任务实现方案.
2 展示效果以及接口分析
2.1 效果图
2.2 需求分析
通过图上分析,可大致把这个界面分成四个部分头部的总积分部分
最关键的签到日历展示部分
连续签到文案配置部分
签到任务展示部分
通过分析我把这个界面分成了三个接口/signIn GET协议 用于查询头部的总积分和签到日历部分.
/signIn/configuration GET协议 查询连续签到文案配置,如果不需要后台可配置连续签到获取积分的数量和文案,此接口可省略,前端写死.
/signIn/task GET协议 用于查询签到任务,以及各个任务的完成状态.
3 查询总积分,签到日历接口
public ResponseResult selectSignIn(Integer userId, Integer year, Integer month) {
boolean signFlag = Boolean.FALSE;
String signKey = String.format(RedisKeyConstant.USER_SIGN_IN, year, userId);
LocalDate date = LocalDate.of(year, month, 1);
//这个方法前面的文章有介绍过.是查询出一个偏移值区间的位图集合
List list = cacheClient.getBit(signKey, month * 100 + 1, date.lengthOfMonth());
//查询reids中当前用户补签的hash列表 (hash列表的key为补签的日期,value存在就说明这个日期补签了)
String retroactiveKey = String.format(RedisKeyConstant.USER_RETROACTIVE_SIGN_IN, date.getMonthValue(), userId);
Set keys = cacheClient.hkeys(retroactiveKey);
TreeMap signMap = new TreeMap<>();
if (list != null && list.size() > 0) {
// 由低位到高位,为0表示未签,为1表示已签
long v = list.get(0) == null ? 0 : lis