个人网站备案 名称,业务网站建设,北京软件开发招聘信息,建立免费网站的步骤接口
1.签到功能接口参数说明请求方式POST请求路径/sign-records请求参数无返回值{ signDays: 10, // 连续签到天数 points : 14 // 今日签到获取的积分 }SignRecordController.java/*** 新增签到记录* return SignResultVO*/PostMappingApiOper…接口1.签到功能接口参数说明请求方式POST请求路径/sign-records请求参数无返回值{ signDays: 10, // 连续签到天数 points : 14 // 今日签到获取的积分 }SignRecordController.java/** * 新增签到记录 * return SignResultVO */PostMappingApiOperation(新增签到记录)publicSignResultVOaddSignRecords(){returnsignRecordService.addSignRecords();}ISignRecordService.javaSignResultVOaddSignRecords();RedisConstants.javapublicinterfaceRedisConstants{/** * 签到记录的key前缀 完整格式为 sign:uid:用户id:年月 */StringSIGN_RECORD_KEY_PREFIXsign:uid:;}SignRecordServiceImpl.javaOverridepublicSignResultVOaddSignRecords(){// 1.签到LonguserUserContext.getUser();StringsignRecordKeyPrefixRedisConstants.SIGN_RECORD_KEY_PREFIX;StringnowLocalDate.now().format(DateUtils.SIGN_DATE_SUFFIX_FORMATTER);//key offsetStringkeysignRecordKeyPrefixusernow;intoffsetLocalDate.now().getDayOfMonth()-1;BooleanbstringRedisTemplate.opsForValue().setBit(key,offset,true);// 2计算签到得分//已经签到过了if(Boolean.TRUE.equals(b)){thrownewBizIllegalException(请勿重复签到);}// 3.统计连续签到天数(传递键与当天的日期)intcontinueSignDayscountSignDays(key,offset1);// 本月签到天数intcountedMonthDayscountMonthDays(key,offset1);intrewardPoints0;switch(countedMonthDays){case7:rewardPoints5;break;case14:rewardPoints10;break;case21:rewardPoints15;break;}log.info(用户{}签到成功连续签到{}天签到天数{},签到得分{},user,continueSignDays,countedMonthDays,rewardPoints);SignResultVOsignResultVOnewSignResultVO();//连续签到天数signResultVO.setSignDays(continueSignDays);//签到得分signResultVO.setRewardPoints(rewardPoints);returnsignResultVO;}/** * 计算签到的天数 * * param key 缓存中的key * param dayOfMonth 今天几号 * return */privateintcountMonthDays(Stringkey,intdayOfMonth){// 求本月第一天到今天签到的天数 bitFiled 得到的是十进制// bitField key get u天数 0ListLongbitFieldstringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if(CollUtils.isEmpty(bitField)){return0;}// 本月第一天到今天的签到天数 拿到的十进制LongnumbitField.get(0);// num转二进制 从后往前推共有多少个一intcounter0;while((num1)1){counter;numnum1;}returncounter;}/** * 统计连续签到天数 * * param key 缓存中的key * param dayOfMonth 今天记号 * return */privateintcountSignDays(Stringkey,intdayOfMonth){// 1.获取对应的十进制数ListLonglongsstringRedisTemplate.opsForValue().bitField(key,BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0));if(CollUtils.isEmpty(longs)){return0;}// 2.循环与运算intsignNumlongs.get(0).intValue();intcontinuousDays0;// 遇到未签到终止循环判断最后一位是否为1是否签到while((signNum1)!0){// 连续签到计数器1continuousDays;// 右移一位判断前一天signNumsignNum1;}// 5.返回结果returncontinuousDays;}2.查询本月签到记录参数说明请求方式GET请求路径/sign-records请求参数无返回值[ 0, // 第1天签到情况 1, // 第2天签到情况 1, // 第3天签到情况 // ... ]SignRecordController.java/** * 查询签到记录 * return List */GetMappingApiOperation(查询签到记录)publicListIntegerquerySignRecord(){returnISignRecordService.querySignRecord();}ISignRecordService.javaListIntegerquerySignRecord();SignRecordServiceImpl.javaOverridepublicListIntegerquerySignRecord(){// 1.用户id与日期LonguserUserContext.getUser();LocalDatetodayLocalDate.now();// 2.key与偏移量Stringnowtoday.format(DateUtils.SIGN_DATE_SUFFIX_FORMATTER);StringkeyRedisConstants.SIGN_RECORD_KEY_PREFIXusernow;intoffsettoday.getDayOfMonth()-1;// 3.创建集合ArrayListIntegerarrnewArrayList(40);for(inti0;ioffset;i){BooleanisSignstringRedisTemplate.opsForValue().getBit(key,i);if(Boolean.TRUE.equals(isSign)){arr.add(1);}else{arr.add(0);}}returnarr;}3.新增积分记录SignInMessage.java/** * 签到消息 * * author ax */DataAllArgsConstructorNoArgsConstructorpublicclassSignInMessage{privateLonguserId;privateIntegerpoints;}LearningPointsListener.javapackagecom.tianji.learning.mq;importcom.tianji.common.constants.MqConstants;importcom.tianji.learning.enums.PointsRecordType;importcom.tianji.learning.mq.message.SignInMessage;importcom.tianji.learning.service.IPointsRecordService;importlombok.RequiredArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.amqp.core.ExchangeTypes;importorg.springframework.amqp.rabbit.annotation.Exchange;importorg.springframework.amqp.rabbit.annotation.Queue;importorg.springframework.amqp.rabbit.annotation.QueueBinding;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;/** * 积分监听器 * * author ax */Slf4jComponentRequiredArgsConstructorpublicclassLearningPointsListener{privatefinalIPointsRecordServicepointsRecordService;/** * 监听-写回答积分 * * param userId */RabbitListener(bindingsQueueBinding(valueQueue(nameqa.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.WRITE_REPLY))publicvoidlistenWriteReplyMessage(LonguserId){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(userId,5,PointsRecordType.QA);}/** * 监听-签到积分 * * param message */RabbitListener(bindingsQueueBinding(valueQueue(namesign.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.SIGN_IN))publicvoidlistenWriteSignMessage(SignInMessagemessage){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(message.getUserId(),message.getPoints(),PointsRecordType.SIGN);}/** * 监听-被采纳笔记积分 * * param userId */RabbitListener(bindingsQueueBinding(valueQueue(namenotegathered.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.NOTE_GATHERED))publicvoidlistenWriteNoteMessage01(LonguserId){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(userId,2,PointsRecordType.NOTE);}/** * 监听-写笔记积分 * * param userId */RabbitListener(bindingsQueueBinding(valueQueue(namenote.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.WRITE_NOTE))publicvoidlistenWriteNoteMessage02(LonguserId){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(userId,3,PointsRecordType.NOTE);}/** * 监听-学习视频积分 * * param userId */RabbitListener(bindingsQueueBinding(valueQueue(namevideo.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.LEARN_SECTION))publicvoidlistenWriteVideoMessage(LonguserId){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(userId,10,PointsRecordType.LEARNING);}/** * 监听-评论积分 * * param userId */RabbitListener(bindingsQueueBinding(valueQueue(namecomment.points.queue,durabletrue),exchangeExchange(nameMqConstants.Exchange.LEARNING_EXCHANGE,typeExchangeTypes.TOPIC),keyMqConstants.Key.COMMENT))publicvoidlistenWriteCommentMessage(LonguserId){//用户id累加的积分积分类型pointsRecordService.addPointsRecord(userId,10,PointsRecordType.COMMENT);}// /* 写回答 */// String WRITE_REPLY reply.new;// /* 签到 */// String SIGN_IN sign.in;// /* 学习视频 */// String LEARN_SECTION section.learned;// /* 写笔记 */// String WRITE_NOTE note.new;// /* 笔记被采集 */// String NOTE_GATHERED note.gathered;// /* 评论 */// String COMMENT comment.new;// LEARNING(1, 课程学习, 50),// SIGN(2, 每日签到, 0),// QA(3, 课程问答, 20),// NOTE(4, 课程笔记, 20),// COMMENT(5, 课程评价, 0),}IPointsRecordService.javavoidaddPointsRecord(LonguserId,intpoint,PointsRecordTypepointsRecordType);PointsRecordServiceImpl.javaOverridepublicvoidaddPointsRecord(LonguserId,intpoint,PointsRecordTypetype){//判断该积分类型是否有上限 type.maxPoints是否大于0if(point0){return;}intmaxPointstype.getMaxPoints();if(maxPoints0){LocalDateTimenowLocalDateTime.now();LocalDateTimedayStartTimeDateUtils.getDayStartTime(now);LocalDateTimedayEndTimeDateUtils.getDayEndTime(now);//如果有上限 查询该用户 该积分类型 今日已得积分 points_record 条件userId typeQueryWrapperPointsRecordwrappernewQueryWrapper();wrapper.select(sum(points) as totalPoints);wrapper.eq(user_id,userId);wrapper.eq(type,type);wrapper.between(create_time,dayStartTime,dayEndTime);MapString,Objectmapthis.getMap(wrapper);//当前用户该积分类型 已得积分intcurrentPoints0;if(map!nullmap.containsKey(totalPoints)){BigDecimaltotalPoints(BigDecimal)map.get(totalPoints);currentPointstotalPoints.intValue();}//判断已得积分是否超过上限if(currentPointsmaxPoints){//说明已得积分 达到上限return;}// 此时的point标识能得得积分if(currentPointspointmaxPoints){pointmaxPoints-currentPoints;}}//保存积分PointsRecordrecordnewPointsRecord();record.setUserId(userId);record.setType(type);record.setPoints(point);this.save(record);}4.查询今日积分情况参数说明请求方式GET请求路径/points/today请求参数无返回值[ { type: 每日签到, // 积分类型描述 points : 1, // 今日签到获取的积分 maxPoints : 5, // 每日积分上限 }, { type: 回答问题, // 积分类型描述 points : 1, // 今日签到获取的积分 maxPoints : 5, // 每日积分上限 } ]PointsRecordController.javaApiOperation(查询今日积分)GetMapping(today)publicListPointsStatisticsVOgetPointsRecord(){returnpointsRecordService.queryMyPointsToday();}IPointsRecordService.javaListPointsStatisticsVOqueryMyPointsToday();PointsRecordServiceImpl.javaOverridepublicListPointsStatisticsVOqueryMyPointsToday(){// 1.获取用户idLonguserIdUserContext.getUser();// 2.获取当天得时间范围LocalDateTimenowLocalDateTime.now();LocalDateTimedayStartTimeDateUtils.getDayStartTime(now);LocalDateTimedayEndTimeDateUtils.getDayEndTime(now);// 3.借助类型去分组判断每个类型今日获取得积分在语句当中将积分和映射为userId从而便于映射实体QueryWrapperPointsRecordwrappernewQueryWrapper();wrapper.select(type,sum(points) as userId);wrapper.eq(user_id,userId);wrapper.between(create_time,dayStartTime,dayEndTime);wrapper.groupBy(type);ListPointsRecordlistthis.list(wrapper);if(CollUtils.isEmpty(list)){returnCollUtils.emptyList();}//封装vo返回ListPointsStatisticsVOvoListnewArrayList();for(PointsRecordrecord:list){PointsStatisticsVOvonewPointsStatisticsVO();//积分类型vo.setType(record.getType().getDesc());//积分类型得分数上限vo.setMaxPoints(record.getType().getMaxPoints());// if(record.getType().getMaxPoints()0){// vo.setMaxPoints(41);// }//今日已获得积分vo.setPoints(record.getUserId().intValue());voList.add(vo);}returnvoList;}查询赛季列表功能参数说明请求方式GET请求路径/boards/seasons/list请求参数无返回值[ { id: 110, // 赛季id name: 第一赛季, // 赛季名称 beginTime: 2023-05-01, // 赛季开始时间 endTime: 2023-05-31, // 赛季结束时间 } ]PointsBoardSeasonController.javaApiOperation(查询赛季列表)GetMapping(list)publicListPointsBoardSeasonqueryPointBoardSeasonList(){returnpointsBoardSeasonService.list();//要返回的结果字段与po字段一样 所以可以直接调用mp中的list方法}