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

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

一、DAO层

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

二、mapper.xml

<select id="getPrizeList">
&#xA0; &#xA0; &#xA0; &#xA0; SELECT *
&#xA0; &#xA0; &#xA0; &#xA0; FROM system_card sc
&#xA0; &#xA0; &#xA0; &#xA0;LEFT JOIN lucky_prize lp ON sc.system_card_id = lp.system_card_id
&#xA0; &#xA0; &#xA0; &#xA0; WHERE sc.status = 1
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; AND sc.category = 3
&#xA0; &#xA0; &#xA0; &#xA0; &#xA0; AND sc.system_version = #{systemVersion}
&#xA0; &#xA0; </select>

三、service层

//&#x7B7E;&#x5230;&#x62BD;&#x5956;
LuckyPrizeVo startSignDraw(Integer systemVersion);

//&#x79EF;&#x5206;&#x62BD;&#x5956;
LuckyPrizeVo startIntegralDraw(Integer systemVersion);

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

四、实现层

查看代码

 /**
     * &#x5F00;&#x59CB;&#x7B7E;&#x5230;&#x62BD;&#x5956;
     */
    @Override
    public LuckyPrizeVo startSignDraw(Integer systemVersion) {
        //&#x5224;&#x65AD;&#x7528;&#x6237;&#x662F;&#x5426;&#x6709;&#x62BD;&#x5956;&#x673A;&#x4F1A;
        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("&#x8FDE;&#x7EED;&#x6210;&#x529F;&#x7B7E;&#x5230;7&#x5929;&#x624D;&#x53EF;&#x53C2;&#x4E0E;&#x62BD;&#x5956;!");
        }
        //&#x5224;&#x65AD;&#x4E0A;&#x6B21;&#x7B7E;&#x5230;&#x65F6;&#x95F4;&#x662F;&#x5426;&#x5728;&#x672C;&#x5468;
        Date nowTime = new Date();
        Date lastSignTime = userSign.getLastSignTime();
        boolean flag = DateUtil.isSameWeek(nowTime, lastSignTime);
        if (!flag) {
            throw new BusinessException("&#x8FDE;&#x7EED;&#x6210;&#x529F;&#x7B7E;&#x5230;7&#x5929;&#x624D;&#x53EF;&#x53C2;&#x4E0E;&#x8F6C;&#x76D8;&#x62BD;&#x5956;");
        }
        //&#x540C;&#x4E00;&#x5468;&#x7684;,&#x53EF;&#x4EE5;&#x62BD;&#x5956;&#xFF0C;&#x8C03;&#x7528;&#x5B9A;&#x4E49;&#x7684;&#x79C1;&#x6709;&#x65B9;&#x6CD5;&#xFF1A;luckyDraw(systemVersion)
        LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);

        //&#x4E2D;&#x5956;&#x4E86;
        //&#x7528;&#x6237;&#x7B7E;&#x5230;&#x673A;&#x4F1A; &#x6539;&#x4E3A;0
        userSign.setLuckChance(0);
        userSignMapper.updateById(userSign);

        //&#x8BB0;&#x5F55;&#x8868;&#x6DFB;&#x52A0;&#x4E00;&#x6761;&#x6570;&#x636E;
        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);

        //&#x7528;&#x6237;&#x5361;&#x5377;&#x6DFB;&#x52A0;&#x4E00;&#x6761;&#x6570;&#x636E;
        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) {
            //&#x6298;&#x6263;&#x5377;&#x548C;&#x4F53;&#x9A8C;&#x5377;&#x6709;&#x6548;&#x671F;&#x4E3A;30&#x5929;
            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;
    }
</usersign>

查看代码

 &#xA0; &#xA0;/**
     * &#x5F00;&#x59CB;&#x79EF;&#x5206;&#x62BD;&#x5956;
     */
    @Override
    public LuckyPrizeVo startIntegralDraw(Integer systemVersion) {
        //&#x5224;&#x65AD;&#x7528;&#x6237;&#x662F;&#x5426;&#x6709;&#x62BD;&#x5956;&#x8D44;&#x683C;&#xFF08;100&#x79EF;&#x5206;&#x62BD;&#x4E00;&#x6B21;&#xFF09;
        String userId = TokenUtil.getUserId();
        UserExperience userExperience = userExperienceMapper.selectById(userId);
        if (null == userExperience) {
            throw new BusinessException("&#x60A8;&#x7684;&#x79EF;&#x5206;&#x5F02;&#x5E38;");
        }
        int integral = userExperience.getIntegral();
        //&#x79EF;&#x5206;&#x6EE1;100&#xFF0C;&#x62BD;&#x4E00;&#x6B21;
        int score = 100;
        if (integral < score) {
            throw new BusinessException("&#x60A8;&#x7684;&#x79EF;&#x5206;&#x4E0D;&#x8DB3;,&#x65E0;&#x6CD5;&#x53C2;&#x4E0E;&#x62BD;&#x5956;");
        }

        LuckyPrizeVo luckyPrizeVo = luckyDraw(systemVersion);

        //&#x4E2D;&#x5956;&#x4E86;
        //&#x66F4;&#x65B0;&#x7528;&#x6237;&#x79EF;&#x5206;
        int newIntegral = integral - 100;
        userExperience.setIntegral(newIntegral);
        userExperienceMapper.updateById(userExperience);
        Date nowTime = new Date();
        //&#x8BB0;&#x5F55;&#x8868;&#x6DFB;&#x52A0;&#x4E00;&#x6761;&#x6570;&#x636E;
        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);

        //&#x7528;&#x6237;&#x5361;&#x5377;&#x6DFB;&#x52A0;&#x4E00;&#x6761;&#x6570;&#x636E;
        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) {
            //&#x6298;&#x6263;&#x5377;&#x548C;&#x4F53;&#x9A8C;&#x5377;&#x6709;&#x6548;&#x671F;&#x4E3A;30&#x5929;
            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 = "&#x7B7E;&#x5230;&#x62BD;&#x5956;")
    @Log(title = "&#x7B7E;&#x5230;&#x62BD;&#x5956;")
    public String startSignDraw(@RequestBody SystemVersionDto dto) {
        LuckyPrizeVo luckyPrizeVo = luckyPrizeService.startSignDraw(Integer.valueOf(dto.getSystemVersion()));
        return Result.success(luckyPrizeVo);
    }

    @PostMapping("/startIntegralDraw")
    @ApiOperation(value = "&#x79EF;&#x5206;&#x62BD;&#x5956;")
    @Log(title = "&#x79EF;&#x5206;&#x62BD;&#x5956;")
    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 '&#x5956;&#x54C1;id',
  system_card_id char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x7CFB;&#x7EDF;&#x5361;&#x5377;id',
  system_version tinyint(1) DEFAULT NULL COMMENT '&#x624B;&#x673A;&#x7CFB;&#x7EDF;&#x7248;&#x672C;(1-&#x5B89;&#x5353; 2-iOS)',
  remark varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x5907;&#x6CE8;',
  probability double(3,2) NOT NULL COMMENT '&#x62BD;&#x5956;&#x6982;&#x7387;',
  num int DEFAULT NULL COMMENT '&#x5956;&#x54C1;&#x6570;&#x91CF;',
  PRIMARY KEY (lucky_prize_id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='&#x5956;&#x54C1;&#x8868;';
CREATE TABLE lucky_prize_log (
  log_id char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '&#x8BB0;&#x5F55;id',
  lucky_prize_id char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x5956;&#x54C1;id',
  user_id char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x62BD;&#x5956;&#x7528;&#x6237;id',
  prize_name char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x5956;&#x54C1;&#x540D;&#x79F0;',
  create_time datetime DEFAULT NULL COMMENT '&#x62BD;&#x5956;&#x65F6;&#x95F4;',
  PRIMARY KEY (log_id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='&#x62BD;&#x5956;&#x8BB0;&#x5F55;&#x8868;';
CREATE TABLE system_card (
  system_card_id char(18) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '&#x7CFB;&#x7EDF;&#x5361;&#x5377;id',
  card_name char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '&#x5361;&#x5377;&#x540D;&#x79F0;',
  type tinyint(1) NOT NULL COMMENT '&#x5361;&#x5377;&#x7C7B;&#x578B;(0&#x8C22;&#x8C22;&#x53C2;&#x4E0E;&#x5377; 1&#x6298;&#x6263;&#x5377; 2vip&#x4F53;&#x9A8C;&#x5377; 3&#x7ECF;&#x9A8C;&#x5377;)',
  count int DEFAULT NULL COMMENT '&#x5361;&#x5377;&#x6570;&#x91CF;(&#x4E2A;)',
  is_count tinyint(1) NOT NULL DEFAULT '0' COMMENT '&#x662F;&#x5426;&#x6709;&#x6570;&#x91CF;(0&#x5426; 1&#x662F;)&#x9ED8;&#x8BA4;&#x4E3A;0',
  status tinyint(1) NOT NULL DEFAULT '1' COMMENT '&#x72B6;&#x6001;(0&#x672A;&#x542F;&#x7528;&#xFF0C;1&#x5DF2;&#x542F;&#x7528;&#xFF0C;2&#x5DF2;&#x4E0B;&#x7EBF;) &#x9ED8;&#x8BA4;&#x4E3A;1',
  failure_time tinyint(1) NOT NULL COMMENT '&#x5361;&#x5377;&#x65F6;&#x6548;&#x65F6;&#x95F4;(&#x5929;)',
  is_failure_time tinyint(1) NOT NULL DEFAULT '0' COMMENT '&#x662F;&#x5426;&#x6709;&#x65F6;&#x6548;&#x65F6;&#x95F4;(0&#x5426; 1&#x662F;)&#x9ED8;&#x8BA4;&#x4E3A;0',
  create_time datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '&#x521B;&#x5EFA;&#x65F6;&#x95F4;',
  update_time datetime DEFAULT NULL COMMENT '&#x4FEE;&#x6539;&#x65F6;&#x95F4;',
  remark char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '&#x5907;&#x6CE8;',
  rules double(5,2) NOT NULL COMMENT '&#x5361;&#x5377;&#x89C4;&#x5219;',
  category tinyint(1) DEFAULT NULL COMMENT '&#x5361;&#x5377;&#x79CD;&#x7C7B;(1-&#x666E;&#x901A;&#x7C7B; 2-&#x79EF;&#x5206;&#x5151;&#x6362;&#x7C7B; 3-&#x8F6C;&#x76D8;&#x7C7B;)',
  system_version tinyint(1) DEFAULT NULL COMMENT '&#x624B;&#x673A;&#x7CFB;&#x7EDF;&#x7248;&#x672C;(1-&#x5B89;&#x5353; 2-iOS)',
  required_points int DEFAULT NULL COMMENT '&#x79EF;&#x5206;&#x5377;&#x6240;&#x9700;&#x79EF;&#x5206;',
  PRIMARY KEY (system_card_id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='&#x7CFB;&#x7EDF;&#x5361;&#x5377;';
CREATE TABLE user_sign (
  user_id char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '&#x7528;&#x6237;id',
  is_monday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x4E00;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_tuesday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x4E8C;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_wednesday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x4E09;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_thursday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x56DB;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_friday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x4E94;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_saturday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x516D;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  is_sunday tinyint(1) DEFAULT '0' COMMENT '&#x5468;&#x672B;&#x662F;&#x5426;&#x7B7E;&#x5230;(0&#x65E0; 1&#x6709;)',
  last_sign_time datetime DEFAULT NULL COMMENT '&#x6700;&#x8FD1;&#x4E00;&#x6B21;&#x7B7E;&#x5230;&#x65F6;&#x95F4;',
  luck_chance tinyint(1) DEFAULT '0' COMMENT '&#x62BD;&#x5956;&#x673A;&#x4F1A;&#xFF08;0&#x65E0; 1&#x6709;&#xFF09;',
  PRIMARY KEY (user_id) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='&#x7528;&#x6237;&#x7B7E;&#x5230;&#x8BB0;&#x5F55;&#x8868;';

Original: https://www.cnblogs.com/wyj-java/p/15796800.html
Author: Javaの甘乃迪
Title: Java实现抽奖模块的相关分享

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/615945/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • OpenFeign生产者与消费者

    用到的VO package com.datang.api.vo; import java.util.List; /** * @author 顶风少年 * @date 2022/6/…

    Java 2023年6月8日
    077
  • Java学习-第一部分-第一阶段-第七节:面向对象编程(中级)

    面向对象编程(中级) 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) lntelliJ IDEA ●IDEA介绍…

    Java 2023年6月16日
    087
  • Java并发编程 | 从进程、线程到并发问题实例解决

    计划写几篇文章讲述下Java并发编程,帮助一些初学者成体系的理解并发编程并实际使用,而不只是碎片化的了解一些Synchronized、ReentrantLock等技术点。在讲述的过…

    Java 2023年6月15日
    069
  • 人工智能与机器学习的不同之处

    人工智能早已不是一个新名词,它的发展历史已经有几十年。从80年代早期开始,当时计算机科学家设计出可以学习和模仿人类行为的算法。在学习方面,最重要的算法是神经网络,但由于模型过于强大…

    Java 2023年6月5日
    073
  • spring-gateway基于数据库 + nacos 的动态路由

    动态路由的实现方式多种多样,研究一下基于数据方式的动态路由。 1. 创建项目,并pom.xml文件引入如下依赖 <span class="code-snippet_…

    Java 2023年6月7日
    077
  • Java基础问题

    基础问题 谈谈你对面向对象的理解 — 结合场景 为何要使用对象编程? 可重复利用,方便拓展 面向对象有三大特征:封装、继承和多态 封装:为什么要封装?可以使类的 成员(…

    Java 2023年6月7日
    062
  • mybatis 字段类型映射一览表

    Original: https://www.cnblogs.com/tangzeqi/p/13155854.htmlAuthor: instrTitle: mybatis 字段类型…

    Java 2023年6月6日
    065
  • SpringBoot基础注解

    @SpringBootApplication:核心启动类,开启自动配置,相当于@SpringBootConfiguration+@EnableAutoConfiguration+@…

    Java 2023年6月8日
    065
  • Vuex 简单使用

    官网:https://vuex.vuejs.org/zh/ 参考文章:https://www.cnblogs.com/chinabin1993/p/9848720.html Vue…

    Java 2023年6月13日
    059
  • Spring5——JdbcTemplate笔记

    Spring5——JdbcTemplate笔记 概念 template,翻译过来是模板的意思,顾名思义,JdbcTemplate就是一个JDBC的模板,它对JDBC进行了封装,可以…

    Java 2023年6月8日
    072
  • 解决org.hibernate.LazyInitializationException的正确姿势

    项目运行过程中,一个报错信息,报错信息如下: org.hibernate.LazyInitializationException: could not initialize pro…

    Java 2023年6月7日
    082
  • 虚拟机和主机ping不通解决办法

    参考文章 另外一个问题,我的判断是:我一台笔记本上既安装了Virtual BOX,又安装了VMWare Workstation,当我禁用了Virtual BOX的虚拟网卡之后,重启…

    Java 2023年5月30日
    062
  • 利用订阅模式实现缓存更新

    1. 引言 很多Web项目,都需要和数据库打交道,典型的就是CRUD(读,写,更新,删除)操作。无论是哪种数据库,Asp.Net MVC 作为后端框架的项目,都有很多操作数据库的类…

    Java 2023年6月5日
    052
  • Java基础(1)——ThreadLocal

    1.1. ThreadLocal ThreadLocal是一个泛型类,当我们在一个类中声明一个字段: private ThreadLocal<foo> threadLo…

    Java 2023年6月10日
    067
  • Swagger框架

    开发软件:IDEA 项目类型:SpringBoot的JavaWeb 官网:https://swagger.io/ 在线文档:https://swagger.io/docs/spec…

    Java 2023年6月9日
    078
  • spring-boot自动配置原理

    SpringBoot启动会加载大量的自动配置类 我们需要看我们需要的功能有没有在Spri ngBoot默认写好的自动配置类 我们再来看这个自动配置类中到底配置了哪些组件(只要我们需…

    Java 2023年6月14日
    076
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球