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

发布时间:2025-12-09 11:49:08 浏览次数:2

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

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

一、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='用户签到记录表';
lucky prize
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477