Java实现抽奖模块的相关分享最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下 。
【java实现抽奖活动 Java实现抽奖模块的相关分享】一、DAO层
/** * 获取奖品列表 * @param systemVersion 手机系统版本(1-安卓 2-iOS) * @Date: 2021/6/7 */ List<LuckyPrize> getPrizeList(int systemVersion);二、mapper.xml
<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层
//签到抽奖LuckyPrizeVo startSignDraw(Integer systemVersion);//积分抽奖LuckyPrizeVo startIntegralDraw(Integer systemVersion);其中入参systemVersion为手机系统,1是安卓 2是苹果
四、实现层
/*** 开始签到抽奖*/@Overridepublic 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);//中奖了//用户签到机会 改为0userSign.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;} /*** 开始积分抽奖*/@Overridepublic 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 = "https://tazarkount.com/read/签到抽奖")@Log(title = "签到抽奖")public String startSignDraw(@RequestBody SystemVersionDto dto) {LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startSignDraw(Integer.valueOf(dto.getSystemVersion()));return Result.success(luckyPrizeVo);}@PostMapping("/startIntegralDraw")@ApiOperation(value = "https://tazarkount.com/read/积分抽奖")@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='用户签到记录表';
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
