当前位置: 首页 > wzjs >正文

网站开发工程师是干嘛的什么是信息流广告

网站开发工程师是干嘛的,什么是信息流广告,加快全省政府网站建设的意见,装修第三方平台网站建设文章目录 概要整体架构流程技术细节小结 概要 需求分析以及接口设计 由KEY的结构可知,要签到,就必须知道是谁在哪一天签到,也就是两个信息: 当前用户 当前时间 这两个信息我们都可以自己获取,因此签到时&#xff…

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

需求分析以及接口设计

由KEY的结构可知,要签到,就必须知道是哪一天签到,也就是两个信息:

  • 当前用户

  • 当前时间

这两个信息我们都可以自己获取,因此签到时,前端无需传递任何参数。

那么签到以后是否需要返回数据呢?

需求中说连续签到会有积分奖励,那么为了提升用户体验,在用户签到成功以后是不是应该返回连续签到天数和获取的积分奖励呢。

综上,最终签到的接口信息如下:

另外,为了便于统计,我们计划每个月为每个用户生成一个独立的KEY,因此KEY中必须包含用户信息、月份信息,长这样:

 

sign:uid:xxx:202401

 

技术细节

package com.tianji.learning.domain.vo;import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(description = "签到结果")
public class SignResultVO {@ApiModelProperty("连续签到天数")private Integer signDays;@ApiModelProperty("签到得分")private Integer signPoints = 1;@ApiModelProperty("连续签到奖励积分,连续签到超过7天以上才有奖励")private Integer rewardPoints;@JsonIgnorepublic int totalPoints(){return signPoints + rewardPoints;}
}

1.Controller层

package com.tianji.learning.controller;import com.tianji.learning.domain.vo.SignResultVO;
import com.tianji.learning.service.ISignRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@Api(tags = "签到相关接口")
@RestController
@RequestMapping("sign-records")
@RequiredArgsConstructor
public class SignRecordController {private final ISignRecordService recordService;@PostMapping@ApiOperation("签到功能接口")public SignResultVO addSignRecords(){return recordService.addSignRecords();}
}

2.Service层:

package com.tianji.learning.service.impl;import com.tianji.common.autoconfigure.mq.RabbitMqHelper;
import com.tianji.common.constants.MqConstants;
import com.tianji.common.exceptions.BizIllegalException;
import com.tianji.common.utils.BooleanUtils;
import com.tianji.common.utils.CollUtils;
import com.tianji.common.utils.DateUtils;
import com.tianji.common.utils.UserContext;
import com.tianji.learning.constants.RedisConstants;
import com.tianji.learning.domain.vo.SignResultVO;
import com.tianji.learning.mq.message.SignInMessage;
import com.tianji.learning.service.ISignRecordService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.connection.BitFieldSubCommands;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;import java.time.LocalDate;
import java.util.List;@Service
@RequiredArgsConstructor
public class SignRecordServiceImpl implements ISignRecordService {private final StringRedisTemplate redisTemplate;@Overridepublic SignResultVO addSignRecords() {// 1.签到// 1.1.获取登录用户Long userId = UserContext.getUser();// 1.2.获取日期LocalDate now = LocalDate.now();// 1.3.拼接keyString key = RedisConstants.SIGN_RECORD_KEY_PREFIX+ userId+ now.format(DateUtils.SIGN_DATE_SUFFIX_FORMATTER);// 1.4.计算offsetint offset = now.getDayOfMonth() - 1;// 1.5.保存签到信息Boolean exists = redisTemplate.opsForValue().setBit(key, offset, true);if (BooleanUtils.isTrue(exists)) {throw new BizIllegalException("不允许重复签到!");}// 2.计算连续签到天数int signDays = countSignDays(key, now.getDayOfMonth());// 3.计算签到得分int rewardPoints = 0;switch (signDays) {case 7:rewardPoints = 10;break;case 14:rewardPoints = 20;break;case 28:rewardPoints = 40;break;}// TODO 4.保存积分明细记录 // 5.封装返回SignResultVO vo = new SignResultVO();vo.setSignDays(signDays);vo.setRewardPoints(rewardPoints);return vo;}private int countSignDays(String key, int len) {// 1.获取本月从第一天开始,到今天为止的所有签到记录List<Long> result = redisTemplate.opsForValue().bitField(key, BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(len)).valueAt(0));if (CollUtils.isEmpty(result)) {return 0;}int num = result.get(0).intValue();// 2.定义一个计数器int count = 0;// 3.循环,与1做与运算,得到最后一个bit,判断是否为0,为0则终止,为1则继续while ((num & 1) == 1) {// 4.计数器+1count++;// 5.把数字右移一位,最后一位被舍弃,倒数第二位成了最后一位num >>>= 1;}return count;}
}

http://www.dtcms.com/wzjs/108845.html

相关文章:

  • 云巅seo现在的seo1发布页在哪里
  • 用别人网站名做长尾关键词商城网站开发公司
  • 做卡贴的网站品牌营销策划怎么写
  • 自己如何高效有力的维护一个网站淘宝店铺怎么推广
  • 云南网站设计模板福州百度推广排名优化
  • 哪里有免费电影网站爱站网ip反域名查询
  • 怎样做内网网站免费下载百度软件
  • 网站设计与网页制作代码大全网络运营怎么学
  • 杭州做购物网站本周新闻热点事件
  • 网站空间购买哪家好搜索词和关键词
  • 泉州手机网站建设费用百度推广费用一年多少钱
  • 做网站带源码软件-dw优化关键词的方法包括
  • 做网站可以用什么语言网站建设小程序开发
  • 郑州营销网站托管公司seo综合诊断工具
  • 手机触屏版网站在线识别图片找原图
  • 个人 网站建设方案书 备案百度推广官方
  • 做网站要执照吗东莞网站建设seo
  • 网站被清空了怎么办软文网站有哪些
  • 织梦做商城网站黑马培训机构可靠吗
  • 湖州网站集约化平台宣传推广方案范文
  • 百度免费网站申请注册国家职业技能培训平台
  • 站长工具乱码搜狗搜索排名优化
  • 个人如何做购物网站 关于支付接口关键词歌曲
  • 网站代码怎么打开链接平台
  • w78企业网站后台怎么做2022近期重大新闻事件10条
  • 网站营销推广怎么做网络营销推广网络营销专业是学什么的
  • 网站设置不能手机访问个人购买链接
  • 网站设网站设计网络营销策略内容
  • 熊掌号网站的基础建设费用互联网营销师怎么做
  • wordpress小说网站主题营销网站制作公司