本文为作者(寒食君)投稿,欢迎大家投稿优秀文章

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

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

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

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

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

动机很单纯:

  1. 吸引用户

  2. 抽奖有一定趣味

  3. 如果能从赞助商那赚点钱就更好了

手段很单一:

  1. 所有用户都可以参加(用户总数不多,目前3k)

  2. 奖品价格最低标准50(有赞助商的情况下),没有赞助商我只能挥泪贡献一包辣条了

  3. 一周/月开奖一次,频率视赞助商热情程度而定。

技术很单薄:

  1. H5

  2. Springboot

  3. Mysql

本人小白,估计很多地方设计得不科学,希望大家不吝赐教。

页面设计

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

  1. 参与界面

  1. 详情及开奖页面。

数据库

  1. 学生表。这张表之前就有,包含了用户的学号生日学院专业等信息。

  2. 奖品表。这张表需要新建,包含奖品id数量名称图片奖品介绍赞助者赞助者标题赞助者详情外链创建时间中奖者id

  3. 奖品_用户表:因为是多对多的关系,必然需要一张中间表。包含以下字段id奖品id用户id

目录结构

image.png

服务接口

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

具体实现:

 1@Override 2    public Prize addPrize(Prize prize) { 3        if (prize==null){ 4            throw new InfoPublishException(ResultEnum.NULL_OBJECT); 5        } 6        try { 7            prizeMapper.insertSelective(prize); 8        }catch (Exception e){ 9            throw new InfoPublishException(ResultEnum.ADD_PRIZE_ERROR);10        }11        return prize;12    }
  1. 参与抽奖:POST方式,参数为一个用户id。

具体实现:

 1@Override 2    public Student joinPrize(String studentId) { 3        Student student=null; 4        if(studentId==null){ 5            throw new InfoPublishException(ResultEnum.NULL_OBJECT); 6        } 7        try { 8            student=studentMapper.selectByPrimaryKey(studentId); 9            Prize currentPrize=prizeMapper.selectCurrentPrize();10            Integer currentPrizeId=currentPrize.getId();11            if(student==null || currentPrizeId==null){12                throw new InfoPublishException(ResultEnum.NULL_OBJECT);13            }else{14                PrizeUser prizeUser=new PrizeUser();15                prizeUser.setPrizeId(currentPrizeId);16                prizeUser.setUserId(student.getUsername());17                try{18                    prizeUserMapper.insertSelective(prizeUser);19                }catch (Exception e){20                    throw  new InfoPublishException(ResultEnum.JOIN_PRIZE_ERROR);21                }22            }23        }catch (Exception e){24            throw new InfoPublishException(ResultEnum.FIND_STUDENT_ERROR);25        }26        return student;27    }
  1. 获取当前抽奖的参与情况:GET方式,无参数。

具体实现:

 1public PrizeElement getCurrentData() { 2        Prize prize; 3        try { 4            //获取当前抽奖实体 5            prize=prizeMapper.selectCurrentPrize(); 6            //根据抽奖实体id来获取参与者的总人数 7            Integer prizeId=prize.getId(); 8            Integer AccountOfJoiners=prizeUserMapper.selectAccountByPrizeId(prizeId); 9            //根据抽奖实体id来获取参与者的学院热度10            List<String> academyList=new ArrayList();11            academyList=prizeUserMapper.selectAcademyOfJoiners(prizeId);12            List<String> result=new ArrayList();13            Map<String,Integer> resultMap=new HashMap<>();14            for(String i:academyList){15                boolean flag=false;16                for(String j:result){17                   if(j.equals(i)){18                       flag=true;19                       int temp=resultMap.get(i)+1;20                       resultMap.put(i,temp);21                       break;22                   }23                }24                if(!flag){25                    result.add(i);26                    resultMap.put(i,1);27                }28            }29            PrizeElement pe=new PrizeElement();30            pe.setPrize(prize);31            pe.setTotalJoiners(AccountOfJoiners+"");32            pe.setRankAcademy(resultMap);33            return pe;34        }catch (Exception e){35            throw  new InfoPublishException(ResultEnum.GET_PRIZE_ERROR);36        }37    }
  1. 获取开奖信息:GET方式,无参数。

具体实现:

1@Override2    public Winner openPrize() {3        Winner winner=new Winner();4        Prize prize=prizeMapper.selectCurrentPrize();5        Student student=studentMapper.selectByPrimaryKey(prize.getGmtOpen());6        winner.setPrize(prize);7        winner.setStudent(student);8        return winner;9    }

定时器

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

跨域问题

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

 1/** 2 * @author zhangcunli 3 * 解决跨域问题 4 */ 5@Configuration 6public class Cors extends WebMvcConfigurerAdapter { 7    @Override 8    public void addCorsMappings(CorsRegistry registry) { 9        registry.addMapping("/**")10        .allowedOrigins("*")11        .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")12          .allowCredentials(true).maxAge(3600);13    }14}

测试接口


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

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

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

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

END

人生苦短,尽情抽奖。相关推荐

  1. Android SurfaceView实战 打造抽奖转盘

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41722441 ,本文出自:[张鸿洋的博客] 1.概述 今天给大家带来Surfac ...

  2. 免费抽奖 | 《阿巴豆》探索未来系列盲盒数字版权作品全网首发!

    无界版图 X FULU     #阿巴豆系列#   - 阿巴豆系列盲盒 - 人工智能算法 元宇宙与现实结合 重新定义数字时代的创造力 无界版图 X FULU   #阿巴豆系列#    #阿巴豆系列#  ...

  3. Python实现淘宝直播自动点赞与抽奖

    最近入了直播抽奖的坑,而且中了不少奖,薅羊毛事后一时爽,天天刷火葬场. 于是想到用Python自动监控,直播福利是以抽奖为形式的,粉丝们在互动区疯狂发送关键字,主播随机截图,并给在截图中的粉丝送出福利 ...

  4. [Skr-Shop]通用抽奖工具之需求分析

    还不更新❓❓❓来啦- Skr Shop年底第二弹<营销体系>第二篇<通用抽奖工具之需求分析>- 前言 回顾营销体系的组成: 营销体系 活动营销系统 销售营销系统 今天带来的是活 ...

  5. 浇灌迅雷幸福树 抽奖可领取会员3天

    迅雷幸福树作为原p2p分享率的升级,更加形象的记录了用户上传和下载时所产生的流量,将用户贡献的上传流量记为阳光值,用于抽取奖品作为对用户贡献流量的回馈: 将下载流量记为成长值用于幸福树等级的提升,使用 ...

  6. php ajax 概率 转盘,php+jquery实现转盘抽奖 概率可任意调

    转盘抽奖,炫丽的一般是flash做的.不懂flash而又不需要那么炫丽,可以简单的通过jquery来实现.网上教程有很多,跟着做了一下,也贴出来吧.要实现转盘抽奖,有两个关键点,一是让转盘或指针转起来 ...

  7. php jq实现抽奖,jquery实现抽奖系统

    闲来无事做了一个抽奖的系统: 抽奖系统 #box{ width:450px; margin:0 auto; } .show{ width:100px; height:55px; text-align: ...

  8. 程序模拟抽奖流程图_一道与联欢会相关的概率统计题目的模拟仿真

    继续昨天的问题,回顾一下相应的规则. 1. 同学按座位号依次进行抽签: 2. 抽签过程中抽到的同学不能为之前已经抽到的同学: 3. 按照昨天的规则,为了计算简便,可以抽到自己. 那么根据昨天的分析,我 ...

  9. Java项目:晚会抽奖系统(java+Jdbc+Servlet+Ajax+mysql)

    源码获取:博客首页 "资源" 里下载! 一.项目运行 环境配置: Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclisp ...

最新文章

  1. Maven -- 使用Myeclipse创建Maven项目
  2. 【ASP.NET开发】ASP.NET对SQLServer的通用数据库访问类
  3. MVC 中使用bootstrap-select 基础使用方法
  4. Android的短信接收类
  5. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
  6. Element-UI分页组件超详细使用示例
  7. radiant序列码_阅“码”无数|第一期
  8. appium 驱动 对应9.0 系统_以后做Appium自动化测试,再也不会踩这些坑了!
  9. ITK:在傅立叶域中过滤图像
  10. 【codecombat】 试玩全攻略 第十四关 已知敌人
  11. Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
  12. php socket 不能用,PHP无法用Socket方式连接MySQ
  13. powermockito测试私有方法_Spock代码讲解 静态方法测试
  14. 用计算机思维认识摩斯密码(摩斯密码速记)
  15. STC51入门笔记(郭天祥C语言)---第九节:常见芯片和运放电路介绍
  16. laravel excel 导出图片
  17. 数据分析师与数据科学家的区别
  18. Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建
  19. html粒子特效图片切换,javascript转换静态图片,增加粒子动画效果_javascript技巧...
  20. 利用github和hexo一步步生成个人博客(2)---基本配置和发表文章

热门文章

  1. 官媒:发挥数字货币的正能量,服务于实体经济
  2. 米家共享显示服务器错误,米家摄像头云服务器
  3. Python+selenium自动化学习笔记(一)
  4. HMS 华为推送服务 推送绑定回执
  5. 【电子实验1】电容充电、放电显示器
  6. 超码、候选码、主码、主属性、非主属性
  7. 【Nginx源码分析】Nginx配置文件解析(一)
  8. 富文本编辑器的一键排版功能
  9. 疯狂安卓讲义第三版安卓源码(最新版的)
  10. SAP 电商云 Spartacus UI 去除 Checkout 页面 header 和 footer 区域的几种方法介绍