前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java实现抽奖模块的相关分享

Java实现抽奖模块的相关分享

作者头像
军军不吃鸡
发布2022-10-26 14:24:26
5470
发布2022-10-26 14:24:26
举报
文章被收录于专栏:军军不吃鸡军军不吃鸡

Java实现抽奖模块的相关分享

最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下。

一、DAO层

代码语言:javascript
复制
/**
 * 获取奖品列表
 * @param systemVersion 手机系统版本(1-安卓 2-iOS)
 * @Date: 2021/6/7
 */
 List<LuckyPrize> getPrizeList(int systemVersion);

二、mapper.xml

代码语言:javascript
复制
<select id="getPrizeList">
        SELECT *
        FROM system_card sc
       LEFT JOIN lucky_prize lp ON sc.system_card_id = lp.system_card_id
        WHERE sc.`status` = 1
          AND sc.category = 3
          AND sc.system_version = #{systemVersion}
    </select>

三、service层

代码语言:javascript
复制
//签到抽奖
LuckyPrizeVo startSignDraw(Integer systemVersion);

//积分抽奖
LuckyPrizeVo startIntegralDraw(Integer systemVersion);

其中入参systemVersion为手机系统,1是安卓 2是苹果

四、实现层

查看代码

代码语言:javascript
复制
 /**
     * 开始签到抽奖
     */
    @Override
    public LuckyPrizeVo startSignDraw(Integer systemVersion) {
        //判断用户是否有抽奖机会
        String userId = TokenUtil.getUserId();
        UserSign userSign = userSignMapper.selectOne(new QueryWrapper<UserSign>().eq("user_id", userId).eq("luck_chance", 1));
        if (null == userSign) {
            throw new BusinessException("连续成功签到7天才可参与抽奖!");
        }
        //判断上次签到时间是否在本周
        Date nowTime = new Date();
        Date lastSignTime = userSign.getLastSignTime();
        boolean flag = DateUtil.isSameWeek(nowTime, lastSignTime);
        if (!flag) {
            throw new BusinessException("连续成功签到7天才可参与转盘抽奖");
        }
        //同一周的,可以抽奖,调用定义的私有方法:luckyDraw(systemVersion)
        LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);

        //中奖了
        //用户签到机会 改为0
        userSign.setLuckChance(0);
        userSignMapper.updateById(userSign);

        //记录表添加一条数据
        LuckyPrizeLog luckyPrizeLog = new LuckyPrizeLog();
        luckyPrizeLog.setLogId(SnowflakeUtil.genId());
        luckyPrizeLog.setLuckyPrizeId(luckyPrizeVo.getLuckyPrizeId());
        luckyPrizeLog.setUserId(userId);
        luckyPrizeLog.setPrizeName(luckyPrizeVo.getCardName());
        luckyPrizeLog.setCreateTime(nowTime);
        luckyPrizeLogMapper.insert(luckyPrizeLog);

        //用户卡卷添加一条数据
        UserCard userCard = new UserCard();
        userCard.setUserCardId(SnowflakeUtil.genId());
        userCard.setUserId(userId);
        userCard.setSystemCardId(luckyPrizeVo.getSystemCardId());
        int systemCardType = luckyPrizeVo.getSystemCardType();
        userCard.setType(systemCardType);
        userCard.setStatus(0);
        userCard.setCreateTime(nowTime);
        if (systemCardType == 1 || systemCardType == 2) {
            //折扣卷和体验卷有效期为30天
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, 30);
            Date date = calendar.getTime();
            userCard.setExpirationDate(date);
        }
        userCard.setRules(luckyPrizeVo.getSystemRules());
        userCardMapper.insert(userCard);
        return luckyPrizeVo;
    }

查看代码

代码语言:javascript
复制
    /**
     * 开始积分抽奖
     */
    @Override
    public LuckyPrizeVo startIntegralDraw(Integer systemVersion) {
        //判断用户是否有抽奖资格(100积分抽一次)
        String userId = TokenUtil.getUserId();
        UserExperience userExperience = userExperienceMapper.selectById(userId);
        if (null == userExperience) {
            throw new BusinessException("您的积分异常");
        }
        int integral = userExperience.getIntegral();
        //积分满100,抽一次
        int score = 100;
        if (integral < score) {
            throw new BusinessException("您的积分不足,无法参与抽奖");
        }

        LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);

        //中奖了
        //更新用户积分
        int newIntegral = integral - 100;
        userExperience.setIntegral(newIntegral);
        userExperienceMapper.updateById(userExperience);
        Date nowTime = new Date();
        //记录表添加一条数据
        LuckyPrizeLog luckyPrizeLog = new LuckyPrizeLog();
        luckyPrizeLog.setLogId(SnowflakeUtil.genId());
        luckyPrizeLog.setLuckyPrizeId(luckyPrizeVo.getLuckyPrizeId());
        luckyPrizeLog.setUserId(userId);
        luckyPrizeLog.setPrizeName(luckyPrizeVo.getCardName());
        luckyPrizeLog.setCreateTime(nowTime);
        luckyPrizeLogMapper.insert(luckyPrizeLog);

        //用户卡卷添加一条数据
        UserCard userCard = new UserCard();
        userCard.setUserCardId(SnowflakeUtil.genId());
        userCard.setUserId(userId);
        userCard.setSystemCardId(luckyPrizeVo.getSystemCardId());
        int systemCardType = luckyPrizeVo.getSystemCardType();
        userCard.setType(systemCardType);
        userCard.setStatus(0);
        userCard.setCreateTime(nowTime);
        if (systemCardType == 1 || systemCardType == 2) {
            //折扣卷和体验卷有效期为30天
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, 30);
            Date date = calendar.getTime();
            userCard.setExpirationDate(date);
        }
        userCard.setRules(luckyPrizeVo.getSystemRules());
        userCardMapper.insert(userCard);
        return luckyPrizeVo;
    }

提示:

1.可能我的需求与大家不一样,具体还是要看各位的需求要有所改动,但大体的思路可以参考我的代码; 2.项目中,继承了mabytis-plus,还封装了一些工具类,以及结果的统一处理。

五、Controller层

代码语言:javascript
复制
    @PostMapping("/startSignDraw")
    @ApiOperation(value = "签到抽奖")
    @Log(title = "签到抽奖")
    public String startSignDraw(@RequestBody SystemVersionDto dto) {
        LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startSignDraw(Integer.valueOf(dto.getSystemVersion()));
        return Result.success(luckyPrizeVo);
    }

    @PostMapping("/startIntegralDraw")
    @ApiOperation(value = "积分抽奖")
    @Log(title = "积分抽奖")
    public String startIntegralDraw(@RequestBody SystemVersionDto dto) {
        LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startIntegralDraw(Integer.valueOf(dto.getSystemVersion()));
        return Result.success(luckyPrizeVo);
    }

最后,附上建表sql: 六、建表SQL语句

代码语言:javascript
复制
CREATE TABLE `lucky_prize` (
  `lucky_prize_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '奖品id',
  `system_card_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '系统卡卷id',
  `system_version` tinyint(1) DEFAULT NULL COMMENT '手机系统版本(1-安卓 2-iOS)',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  `probability` double(3,2) NOT NULL COMMENT '抽奖概率',
  `num` int DEFAULT NULL COMMENT '奖品数量',
  PRIMARY KEY (`lucky_prize_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='奖品表';
代码语言:javascript
复制
CREATE TABLE `lucky_prize_log` (
  `log_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '记录id',
  `lucky_prize_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '奖品id',
  `user_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '抽奖用户id',
  `prize_name` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '奖品名称',
  `create_time` datetime DEFAULT NULL COMMENT '抽奖时间',
  PRIMARY KEY (`log_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='抽奖记录表';
代码语言:javascript
复制
CREATE TABLE `system_card` (
  `system_card_id` char(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '系统卡卷id',
  `card_name` char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '卡卷名称',
  `type` tinyint(1) NOT NULL COMMENT '卡卷类型(0谢谢参与卷 1折扣卷 2vip体验卷 3经验卷)',
  `count` int DEFAULT NULL COMMENT '卡卷数量(个)',
  `is_count` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有数量(0否 1是)默认为0',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0未启用,1已启用,2已下线) 默认为1',
  `failure_time` tinyint(1) NOT NULL COMMENT '卡卷时效时间(天)',
  `is_failure_time` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否有时效时间(0否 1是)默认为0',
  `create_time` datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  `remark` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',
  `rules` double(5,2) NOT NULL COMMENT '卡卷规则',
  `category` tinyint(1) DEFAULT NULL COMMENT '卡卷种类(1-普通类 2-积分兑换类 3-转盘类)',
  `system_version` tinyint(1) DEFAULT NULL COMMENT '手机系统版本(1-安卓 2-iOS)',
  `required_points` int DEFAULT NULL COMMENT '积分卷所需积分',
  PRIMARY KEY (`system_card_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='系统卡卷';
代码语言:javascript
复制
CREATE TABLE `user_sign` (
  `user_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户id',
  `is_monday` tinyint(1) DEFAULT '0' COMMENT '周一是否签到(0无 1有)',
  `is_tuesday` tinyint(1) DEFAULT '0' COMMENT '周二是否签到(0无 1有)',
  `is_wednesday` tinyint(1) DEFAULT '0' COMMENT '周三是否签到(0无 1有)',
  `is_thursday` tinyint(1) DEFAULT '0' COMMENT '周四是否签到(0无 1有)',
  `is_friday` tinyint(1) DEFAULT '0' COMMENT '周五是否签到(0无 1有)',
  `is_saturday` tinyint(1) DEFAULT '0' COMMENT '周六是否签到(0无 1有)',
  `is_sunday` tinyint(1) DEFAULT '0' COMMENT '周末是否签到(0无 1有)',
  `last_sign_time` datetime DEFAULT NULL COMMENT '最近一次签到时间',
  `luck_chance` tinyint(1) DEFAULT '0' COMMENT '抽奖机会(0无 1有)',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='用户签到记录表';
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Java实现抽奖模块的相关分享
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档