发布时间:2025-12-09 11:49:08 浏览次数:2
最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下。
一、DAO层
/** * 获取奖品列表 * @param systemVersion 手机系统版本(1-安卓 2-iOS) * @Date: 2021/6/7 */ List<LuckyPrize> getPrizeList(int systemVersion);二、mapper.xml
<select > 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层
//签到抽奖LuckyPrizeVo startSignDraw(Integer systemVersion);//积分抽奖LuckyPrizeVo startIntegralDraw(Integer systemVersion);其中入参systemVersion为手机系统,1是安卓 2是苹果
四、实现层
查看代码
/** * 开始签到抽奖 */ @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; }查看代码
/** * 开始积分抽奖 */ @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层
@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语句
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='奖品表';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='抽奖记录表';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='系统卡卷';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='用户签到记录表';