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

签到送金币项目

@Override
    public void sign() {
        // 通过redis存储签到信息
        // key :   sign:年月:用户id
        String yearAndMonth = DateUtils.formatDate(new Date(), "yyyyMM");
        // Integer uid = TokenUtils.getUidFromToken();
        // 通过ThreadLocal获取用户id
        Integer uid = UserUtils.getUid();
        String signKey = String.format(RedisKeyEnum.KEY_SIGN.getKey(), yearAndMonth, uid);
        // offset是从0开始,本例中从1开始记录,offset是1表示1号,依次类推
        Long day = Long.valueOf(LocalDate.now().getDayOfMonth());
        boolean ret = RedisUtils.getBit(signKey, day);
        if (ret) {
            throw new RuntimeException("今日已签到");
        }
        RedisUtils.setBit(signKey, day);

        // 签到成功送积分
        // 从积分规则表中查询签到送多少积分,
        // PointRule pointRule = pointRuleService.ruleInfoByType(PointTypeEnum.TYPE_SIGN.getType());

        // 使用redis缓存规则数据后的逻辑
        List<PointRule> pointRules = pointRuleService.ruleList();
        PointRule pointRule = pointRules.stream()
                .filter(item -> item.getPointType().equals(PointTypeEnum.TYPE_SIGN.getType()))
                .findFirst()
                .orElse(null);

        threadPoolExecutor.execute(() -> {
            PointInfo info = new PointInfo();
            info.setUid(uid);
            info.setPoint(pointRule.getPoint());
            info.setPointType(PointTypeEnum.TYPE_SIGN.getType());
            // 然后向积分记录表中添加数据
            try {
                pointInfoService.addPointInfo(info);
            } catch (Exception e) {
                // e.printStackTrace();
                PointRetry retry = new PointRetry();
                retry.setUid(uid);
                retry.setPoint(pointRule.getPoint());
                retry.setPointType(PointTypeEnum.TYPE_SIGN.getType());
                pointRetryService.addRetry(retry);
            }
        });


        // 进行连续签到判断
        // 使用bitfield命令获取指定范围的二进制数据,内部转为long类型数据返回
        Long v = RedisUtils.bitfield(signKey, day.intValue(), 1);
        // 计算连续签到的天数,(方案:1将数据转为二进制字符串,2位运算)
        String s = Long.toBinaryString(v);
        int continueDay = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            char c = s.charAt(i);
            if (c == '1') {
                continueDay++;
                continue;
            }
            break;
        }

        // 根据连续签到天数额外送积分
        PointRule pointRule2 = pointRuleService.ruleInfoByType(PointTypeEnum.TYPE_CONTINUE_SIGN.getType());
        String days = pointRule2.getDays();

        // 将json字符串转为列表对象
        // 第二个参数:列表中元素的类型
        List<ContinueDayInfo> continueDayInfos = JSON.parseArray(days, ContinueDayInfo.class);
        int finalContinueDay = continueDay;
        // 借助stream流来查找数据
        ContinueDayInfo dayInfo = continueDayInfos.stream()
                .filter(item -> item.getDays().equals(finalContinueDay))
                .findFirst()
                .orElse(null);
        // 如果找到对应的连续签到天数的数据,赠送积分
        if (dayInfo != null) {
            PointInfo info2 = new PointInfo();
            info2.setUid(uid);
            info2.setPoint(dayInfo.getPoint());
            info2.setPointType(PointTypeEnum.TYPE_CONTINUE_SIGN.getType());
            // 然后向积分记录表中添加数据
            pointInfoService.addPointInfo(info2);
        }

//        for (ContinueDayInfo dayInfo : continueDayInfos) {
//            if (dayInfo.getDays().equals(continueDay)) {
//                // 送积分
//                break;
//            }
//        }

    }

http://www.kler.cn/a/409454.html

相关文章:

  • pringboot自动装配原理是?
  • 【软考】数据库
  • LLaMA-Mesh: Unifying 3D Mesh Generation with Language Models 论文解读
  • 【Linux 篇】Docker 启动和停止的精准掌舵:操控指南
  • 使用timm库加载模型与模型权重
  • BERT的中文问答系统38
  • 集合Queue、Deque、LinkedList、ArrayDeque、PriorityQueue详解
  • FastAPI和SQLModel结合的优点
  • 拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM
  • selenium grid 远程webdriver添加上网代理
  • 7-401 平均值
  • Git 提交的相对引用
  • 【Linux】安装cuda
  • 实验7 JavaScript编程基础7.1密码验证
  • go-web项目通用脚手架
  • 每天100w次登录请求,8G内存该如何设置JVM参数?
  • 论文解析:EdgeToll:基于区块链的异构公共共享收费系统(2019,IEEE INFOCOM 会议);layer2 应对:频繁小额交易,无交易费
  • 数据库-MySQL-Dynamic-Datasource源码解析
  • 鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店
  • 网络安全 - SQL Injection
  • 【Python】数据抓取失败解析
  • Vue3-后台管理系统
  • 网络安全,文明上网(2)加强网络安全意识
  • 【LC】2529. 正整数和负整数的最大计数
  • 【人工智能】用Python和NLP工具构建文本摘要模型:使用NLTK和spaCy进行自然语言处理
  • Java爬虫的奇妙冒险:揭开1688商品详情的神秘面纱