人生苦短,尽情抽奖。

抽奖,几乎是全部人都乐此不疲的一项活动。

小程序界,冯大的「抽奖助手」得到了巨大的成功,在上线111天时,用户超过了1000万。这件事折射出两点朴素的道理:1.产品优秀 2.用户喜欢抽奖。sql

在「抽奖助手」首页,用户天天均可以参与由不一样的赞助商提供的抽奖,我发现不管奖品的价值高低,即便奖品价格相差比较“悬殊”,参与的人数几乎是相近的,从这点能够看出人多少仍是有点小贪婪的,一言以蔽之:「我全都要」。此外,因为是发布在首页的抽奖,人人均可以参与。直至开奖截止,参与人数通常在6万-8万,暂且认为大部份奖品是一份,假设一个省的高考考生有20万,其中500人能上名校,那么中奖比上名校还要难175倍。(一个不恰当的比方)因此我固然没有中过(っ °Д °;)っ数据库

因此抽奖的魅力在于给了人一种未知的机会,即便这个机会眇小到尘埃。有一种几率型奖励的实验:将一只很饿的小白鼠放入斯金纳箱中,屡次按动按钮,几率掉落食物。结果是小白鼠学会了不停地按动按钮,随着食物掉落的几率愈来愈低,小白鼠的行为没有发生改变,持续了很长一段时间。这与咱们人类很类似,不停地按动着手机上的那个“参与抽奖”的按钮,固然,能够写一个脚本代替,这也是人类比小白鼠高明的地方。小程序

下面言归正传,做为狂热型小白鼠,我想本身写一个简单的抽奖程序,将它运用到以前咱们本身开发的针对本身大学的一款掌上校园软件「果核」。跨域

动机很单纯:bash

  1. 吸引用户
  2. 抽奖有必定趣味
  3. 若是能从赞助商那赚点钱就更好了

手段很单一:app

  1. 全部用户均可以参加(用户总数很少,目前3k)
  2. 奖品价格最低标准50(有赞助商的状况下),没有赞助商我只能挥泪贡献一包辣条了
  3. 一周/月开奖一次,频率视赞助商热情程度而定。

技术很单薄:ide

  1. H5
  2. Springboot
  3. Mysql

本人小白,估计不少地方设计得不科学,但愿你们不吝赐教。测试

页面设计

由于拙于页面,因此暂时模仿了小程序「抽奖助手」,手撸了两个界面,若是涉及侵权,请通知我,立马就改(→_→)ui

  1. 参与界面

image.png
2. 详情及开奖页面。
image.png

数据库

  1. 学生表。这张表以前就有,包含了用户的学号生日学院专业等信息。
  2. 奖品表。这张表须要新建,包含奖品id数量名称图片奖品介绍赞助者赞助者标题赞助者详情外链建立时间中奖者id
  3. 奖品_用户表:由于是多对多的关系,必然须要一张中间表。包含如下字段id奖品id用户id

目录结构

image.png

服务接口

  1. 新增一个抽奖活动:POST方式,参数为一个Prize实体。

具体实现:spa

@Override
    public Prize addPrize(Prize prize) {
        if (prize==null){
            throw new InfoPublishException(ResultEnum.NULL_OBJECT);
        }
        try {
            prizeMapper.insertSelective(prize);
        }catch (Exception e){
            throw new InfoPublishException(ResultEnum.ADD_PRIZE_ERROR);
        }
        return prize;
    }
复制代码
  1. 参与抽奖:POST方式,参数为一个用户id。

具体实现:

@Override
    public Student joinPrize(String studentId) {
        Student student=null;
        if(studentId==null){
            throw new InfoPublishException(ResultEnum.NULL_OBJECT);
        }
        try {
            student=studentMapper.selectByPrimaryKey(studentId);
            Prize currentPrize=prizeMapper.selectCurrentPrize();
            Integer currentPrizeId=currentPrize.getId();
            if(student==null || currentPrizeId==null){
                throw new InfoPublishException(ResultEnum.NULL_OBJECT);
            }else{
                PrizeUser prizeUser=new PrizeUser();
                prizeUser.setPrizeId(currentPrizeId);
                prizeUser.setUserId(student.getUsername());
                try{
                    prizeUserMapper.insertSelective(prizeUser);
                }catch (Exception e){
                    throw  new InfoPublishException(ResultEnum.JOIN_PRIZE_ERROR);
                }
            }
        }catch (Exception e){
            throw new InfoPublishException(ResultEnum.FIND_STUDENT_ERROR);
        }
        return student;
    }
复制代码
  1. 获取当前抽奖的参与状况:GET方式,无参数。

具体实现:

public PrizeElement getCurrentData() {
        Prize prize;
        try {
            //获取当前抽奖实体
            prize=prizeMapper.selectCurrentPrize();
            //根据抽奖实体id来获取参与者的总人数
            Integer prizeId=prize.getId();
            Integer AccountOfJoiners=prizeUserMapper.selectAccountByPrizeId(prizeId);
            //根据抽奖实体id来获取参与者的学院热度
            List<String> academyList=new ArrayList();
            academyList=prizeUserMapper.selectAcademyOfJoiners(prizeId);
            List<String> result=new ArrayList();
            Map<String,Integer> resultMap=new HashMap<>();
            for(String i:academyList){
                boolean flag=false;
                for(String j:result){
                   if(j.equals(i)){
                       flag=true;
                       int temp=resultMap.get(i)+1;
                       resultMap.put(i,temp);
                       break;
                   }
                }
                if(!flag){
                    result.add(i);
                    resultMap.put(i,1);
                }
            }
            PrizeElement pe=new PrizeElement();
            pe.setPrize(prize);
            pe.setTotalJoiners(AccountOfJoiners+"");
            pe.setRankAcademy(resultMap);
            return pe;
        }catch (Exception e){
            throw  new InfoPublishException(ResultEnum.GET_PRIZE_ERROR);
        }
    }
复制代码
  1. 获取开奖信息:GET方式,无参数。

具体实现:

@Override
    public Winner openPrize() {
        Winner winner=new Winner();
        Prize prize=prizeMapper.selectCurrentPrize();
        Student student=studentMapper.selectByPrimaryKey(prize.getGmtOpen());
        winner.setPrize(prize);
        winner.setStudent(student);
        return winner;
    }
复制代码

定时器

由于设计为每周/月进行开奖,那么须要一个定时器去触发任务,这里用的是Quartz

跨域问题

我在网上找了一个现成的写好的类用来继承。

/**

 * @author zhangcunli

 * 解决跨域问题

 */
@Configuration
public class Cors extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        .allowedOrigins("*")
        .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
          .allowCredentials(true).maxAge(3600);
    }
    
    
}
复制代码

测试接口

写到这里,基本上代码阶段已经完成。不足的地方也有不少,须要慢慢调整,也但愿能给我一些宝贵意见。

诸位,人生苦短,尽情抽奖。

后面一句是:中奖是不可能的,这辈子都不可能中奖,做弊又不会,只能靠写代码才能维持得了生活这样子。

源码可在公众号后台回复:“抽奖”来获取。

经过关注来提升中奖可能。
相关文章
相关标签/搜索