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是苹果

四、实现层

查看代码
 /**
* 开始签到抽奖
*/
@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='用户签到记录表';

Java实现抽奖模块的相关分享的更多相关文章

  1. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  2. java学习路线(好资源大家分享)

    对于入门java将近两年的时间,曾经迷惘过,一直想知道java的具体学习路线,看过了许许多多的java经验分享的帖子,评论,以及其他各种培训机构所谓的学习路线,发现没有一个符合我个人需求的学习路线,根 ...

  3. 利用java实现抽奖转盘(着重安全控制)

    本文是针对jquery 实现抽奖转盘作者的一个补充(主要用java去实现转盘结果生成及存储,解决jquery 做法 非法用户采用模拟器实现改变转盘值的风险性),针对jQuery的具体实现,请看案例:h ...

  4. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  5. 乐字节Java反射之四:反射相关操作

    大家好,乐字节小乐继续为Java初学者讲述Java基础知识.上次说到乐字节Java反射之三:方法.数组.类加载器,这次是Java反射之四:反射相关操作 1.操作属性 //1.获取Class对象 Cla ...

  6. 合宙模块LUA相关资料汇总

    1. 目录 1. 目录 [2. LUA二次开发](#2. LUA二次开发) 2.1 [新手教程](#2.1 新手教程) 2.2 [进阶教程](#2.2 进阶教程) 2.3 [LUA开发环境](#2.3 ...

  7. 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)

    1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...

  8. 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

    1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...

  9. Java的cmd配置(也即Java的JDK配置及相关常用命令)——找不到或无法加载主类 的解决方法

    Java的cmd配置(也即Java的JDK配置及相关常用命令) ——找不到或无法加载主类  的解决方法 这段时间一直纠结于cmd下Java无法编译运行的问题.主要问题描述如下: javac 命令可以正 ...

随机推荐

  1. 去除爬虫采集到的\xa0、\u3000等字符

    \xa0表示不间断空白符,爬虫中遇到它的概率不可谓不小,而经常和它一同出现的还有\u3000.\u2800.\t等Unicode字符串.单从对\xa0.\t.\u3000等含空白字符的处理来说,有以下 ...

  2. &pwn1_sctf_2016 &ciscn_2019_n_1 &ciscn_2019_c_1 &ciscn_2019_en_2&

    在做buu题目的时候,发现在最上面有几道被各位师傅打到1分的题,强迫症逼迫我去做那几道题. 这里来试着去解决这些题...讲真的,我感觉自己刷题真的少,即使是很简单的栈题目,我还是能学习到新的东西.这里 ...

  3. 转置Table.Transpose(Power Query 之 M 语言)

    数据源: 任意五行两列 目标: 转置成两行五列 操作过程: [转换]>[转置] M公式:  = Table.Transpose( 表 )  

  4. 用Word做表,总会多出一页来?(Word技巧集团)

    用Word做表的同学都有这样的体验,表格后面都会多出一行,默认的,去都去不掉.如果一个表刚好做到一页的最下面,嗯,那就多出一页来,如下图: 这一页,多不多余啊,讨不讨厌啊,可不可恶啊--可是Word同 ...

  5. CF1166A Silent Classroom 题解

    Content 现在有 \(n\) 名学生,我们需要将这些学生分到两个班上.对于两名在同一班级的学生,如果他们的名字首字母相同,他们就会聊天. 现在给定这些学生的名字,问最少有多少对学生会在一起聊天. ...

  6. CF893B Beautiful Divisors 题解

    Content 给定一个数 \(n\),求出 \(n\) 最大的可以表示成 \((2^k-1)\cdot2^{k-1}\) 形式的因数 \(x\). 数据范围:\(1\leqslant n\leqsl ...

  7. python requests库的简单运用

    python requests的简单运用 使用pycharm获取requests包 ctrl+alt+s Project:pythonProject pythoninterpreter 点+号搜索 使 ...

  8. IDEA微服务项目SpringBoot一键(批量)顺序启动

    找到 搜索 RunDashboard <option name="configurationTypes"> <set> <option value=& ...

  9. 【LeetCode】361. Bomb Enemy 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力搜索 日期 题目地址:https://leetco ...

  10. linux系统安装java

    1.下载Java压缩包 *.gz 2.解压 3.修改Linux配置文件,配置Java环境变量 4.使用命令source /etc/profile让修改生效 转载 https://www.cnblogs ...