首页 > 编程语言 >Java实现积分中心功能(包含一周积分板,今天是否已签到,连续签到几天)

Java实现积分中心功能(包含一周积分板,今天是否已签到,连续签到几天)

时间:2024-10-23 09:46:23浏览次数:3  
标签:Java PointsDetail pointsDetail 签到 积分 连续 eq

Java实现积分中心功能(包含一周积分板,今天是否已签到,连续签到几天)

概要

Java实现积分中心功能

1,积分中心—查询一周积分板(包括今天是否已签到,连续签到几天)

在这里插入图片描述
根据当前的登录人查询一周计分板,要求根据连续签到天数不同,从今天开始展示每天不用的积分:
【连续签到三天每日加1分,第四天至第六加2分,之后每天加3分】

1.1 查询当前登录人今天是否已签到,签到则获取对应的连续签到天数(连续签到字段会讲如何实现)

@Override
    public R<MiniPointsMainVO> selectSignInChart(Long memberId) {
        MiniPointsMainVO mainVO = new MiniPointsMainVO();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String localDateNow = LocalDate.now().format(formatter);
        // 1,今天是否签到(今天如果是首次进入则今日签到数据为空)
        PointsDetail detail = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
                .eq(PointsDetail::getMemberId, memberId)
                .eq(PointsDetail::getOperateMode, "积分签到")
                .eq(PointsDetail::getCreateTime, localDateNow));
         // 2.1,存在,则设置【todaySignIn今天是否签到】=1
        if (detail != null){
            mainVO.setTodaySignIn(CommonConstant.INT_1);
            // 2.2,连续签到天数
            mainVO.setContinuousDays(detail.getContinuousDays());
        }else {
            mainVO.setTodaySignIn(CommonConstant.INT_0);
            // 3.1 今天没签,则查询昨天是否签到,有则取昨天连续签到天数,否则取0
            String yesterday = LocalDate.now().minusDays(1).format(formatter);
            // 3.2 查询昨天是否签到
            PointsDetail detail_yes = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
                    .eq(PointsDetail::getMemberId, memberId)
                    .eq(PointsDetail::getOperateMode, "积分签到")
                    .eq(PointsDetail::getCreateTime, yesterday));
            // 3.3 昨天签到则获取 昨天【continuousDays连续几天签到】
            if (detail_yes != null){
                mainVO.setContinuousDays(detail_yes.getContinuousDays());
            }else {
                mainVO.setContinuousDays(CommonConstant.INT_0);
            }
        }
        // 4,从今天开始计算周几以及根据连续天数计算周几对应的积分数
        List<MiniPointsDetailVO> detailVOList = buildWeekPoints(mainVO.getContinuousDays());
        mainVO.setDetailVOList(detailVOList);
        return R.data(mainVO);
    }

1.2 从今天开始计算周几以及根据连续天数计算周几对应的积分数

// 核心方法
private List<MiniPointsDetailVO> buildWeekPoints(Integer continuousDays){
        List<MiniPointsDetailVO> detailVOS = new ArrayList<>();
        // 从今日开始,获取今天,明天,后天。。共一周数据
        for (int i=0; i<7;i++){
            MiniPointsDetailVO detailVO = new MiniPointsDetailVO();
            // 1,计算每天的积分数(重点)
            int points = calculateWeeklyPoints(continuousDays+i);
            detailVO.setPoints(Integer.valueOf(points));
            // 2,循环获取今天开始一周的日期
            LocalDate nextDay = LocalDate.now().plusDays(i);
            DayOfWeek dayOfWeek = nextDay.getDayOfWeek();
            // 3,使用中文的星期表示
            Locale chineseLocale = new Locale("zh", "CN");
            String dayOfWeek_CN = dayOfWeek.getDisplayName(TextStyle.FULL, chineseLocale);
            // 4,计算周几
            detailVO.setWeekDay(dayOfWeek_CN);
            detailVOS.add(detailVO);
        }
        return detailVOS;
    }

1.3 计算今天开始共一周的积分数据

private int calculateWeeklyPoints(int consecutiveDays) {
        if (consecutiveDays < 3) {
            return 1;
        } else if (consecutiveDays < 6) {
            return 2;
        } else {
            return 3;
        }
    }

1.4 2个返回VO类

1,MiniPointsMainVO

@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="OrderMessageVO对象", description="客房消息VO类")
public class MiniPointsMainVO  implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "七天签到数据图展示")
    private List<MiniPointsDetailVO> detailVOList;

    @ApiModelProperty(value = "今天是否签到(0否,1是)")
    private Integer todaySignIn;

    @ApiModelProperty(value = "连续几天签到")
    private Integer continuousDays;
}

2,MiniPointsDetailVO

@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="OrderMessageVO对象", description="客房消息VO类")
public class MiniPointsDetailVO  implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "周几")
    private String weekDay;

    @ApiModelProperty(value = "积分数")
    private Integer points;

}

2,用户今天点击签到

描述:查询昨天是否有签到记录,如果有则获取昨天的【连续签到天数】字段值,+1后,赋值给今天的签到记录保存。
因为假设从第一天开始,查询昨天签到不存在,则今天连续天数为1,明天查今天,查到连续签到是1,明天+1后就是2,依次类推,只需要查询昨天的连续签到数据+1即可得到今天的连续签到天数。

// 当前登录人id,要加的积分数(用户保存到签到记录表)
 @Override
    public R dailySignIn(Long memberId, BigDecimal addPoints) {
        // 1,需要增加会员积分明细
        PointsDetail pointsDetail = new PointsDetail();
        // 2,判断是否签到,签到则连续天数=昨天的连续天数+1,否则为1
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String yesterday = LocalDate.now().minusDays(1).format(formatter);
        // 3,昨天是否签到
        PointsDetail detail = baseMapper.selectOne(new QueryWrapper<PointsDetail>().lambda()
                .eq(PointsDetail::getMemberId, memberId)
                .eq(PointsDetail::getOperateMode, "积分签到")
                .eq(PointsDetail::getCreateTime, yesterday));
        if (detail != null){
            int continuousDays= detail.getContinuousDays()+1;
            pointsDetail.setContinuousDays(Integer.valueOf(continuousDays));
        }else {
        	// 昨天不存在说明今天是第一天签到或者昨天没签到导致断开连续,从1开始计数
            pointsDetail.setContinuousDays(CommonConstant.INT_1);
        }
        pointsDetail.setMemberId(memberId);
        pointsDetail.setOperateMode("积分签到");
        pointsDetail.setBillAmount(addPoints);
        pointsDetail.setCreateTime(LocalDate.now());
        log.info(" 会员点击签到{}生成一条【积分签到】积分明细,积分{}", members.getMemberName(), addPoints );
        // 新增一条积分明细数据
        baseMapper.insert(pointsDetail);
        return R.data(pointsDetail.getId(), "签到成功");
    }

总结

本文章结合作者项目实战,通过Java实现了小程序常用的积分中心签到功能,如后更好的方式欢迎留言评论,

创作不易,尊重知识,转载请附带本文链接

标签:Java,PointsDetail,pointsDetail,签到,积分,连续,eq
From: https://blog.csdn.net/rain_is_my_name/article/details/143117668

相关文章

  • Java:继承和多态
    面向对象程序三大特性:封装、继承、多态。在前的一章我们已经了解了什么是封装,而今天我们就要开始了解后面的两个————继承和多态。 一.继承1.继承概念继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。用官方的......
  • Java毕设项目案例实战II 基于移动平台的远程在线诊疗系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在当今数字化时代,医疗行业正经历着前所未......
  • java基于springboot的点餐系统(源码+vue+部署文档+前后端分离等)
    收藏关注不迷路!!......
  • java基于springboot的个性化课程推荐系统(源码+vue+部署文档+前后端分离等)
    收藏关注不迷路!!......
  • Java 的奇妙探险:揭秘 @Retention 和 @Target 的魔法奥秘
    前言在Java的魔法世界里,隐藏着两个神秘的符号,它们的名字是@Retention和@Target。这对“魔法师”的法杖不仅能让你施展代码的魅力,还能决定注解的生命旅程和使用场所。想象一下,如何用这些注解为你的代码注入灵魂,创造出更为高效和优雅的程序。今天,就让我们一同踏上这场充满......
  • Java安全-反射
    反射​反射是一种强大的机制,它允许程序在运行时访问、检查和修改它自己的结构,比如类、接口、字段(属性)和方法。反射提供了一种动态性,使得Java程序可以在运行时处理对象和类。所以说通过反射,我们可以使java这类静态语言附上动态的特征。几个反射中重要的方法:获取类的⽅法:......
  • Java调用第三方接口、http请求详解,一文学会
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据......
  • 精通Java并发锁机制:24种锁技巧+业务锁匹配方案
    在Java并发编程中,锁是确保线程安全、协调多线程访问共享资源的关键机制。从基本的synchronized同步关键字到高级的ReentrantLock、读写锁ReadWriteLock、无锁设计如AtomicInteger,再到复杂的同步辅助工具如CountDownLatch、CyclicBarrier和Semaphore,每种锁都针对......
  • Redis 的位图(Bitmap)设计签到系统
    在使用Redis的位图(Bitmap)实现签到系统时,可以通过字符串的位定位(bitposition)来记录用户的签到状态。这是一种高效的存储和检索方式,因为你可以在一个字符串中使用位来表示二进制状态,通常每一位(bit)代表一个用户或一天的状态。以下是如何实现签到系统的思路:设计数据结构:每个用户......
  • 黑马程序员Java进阶学习(三)
    异常Java的异常体系异常的基本处理异常的作用异常是什么?异常是代码在编译或者执行的过程中可能出现的错误。异常的代表是谁?分为几类?Exception,分为两类:编译时异常、运行时异常。编译时异常:没有继承RuntimeExcpetion的异常,编译阶段就会出错。运行时异常:继承自Runtim......