小程序界,馮大的「抽獎助手」得到了巨大的成功,在上線111天時,用戶超過了1000萬。這件事折射出兩點樸素的道理:1.產品優秀 2.用戶喜歡抽獎。sql
在「抽獎助手」首頁,用戶天天均可以參與由不一樣的贊助商提供的抽獎,我發現不管獎品的價值高低,即便獎品價格相差比較「懸殊」,參與的人數幾乎是相近的,從這點能夠看出人多少仍是有點小貪婪的,一言以蔽之:「我全都要」。此外,因爲是發佈在首頁的抽獎,人人均可以參與。直至開獎截止,參與人數通常在6萬-8萬,暫且認爲大部份獎品是一份,假設一個省的高考考生有20萬,其中500人能上名校,那麼中獎比上名校還要難175倍。(一個不恰當的比方)因此我固然沒有中過(っ °Д °;)っ數據庫
因此抽獎的魅力在於給了人一種未知的機會,即便這個機會眇小到塵埃。有一種機率型獎勵的實驗:將一隻很餓的小白鼠放入斯金納箱中,屢次按動按鈕,機率掉落食物。結果是小白鼠學會了不停地按動按鈕,隨着食物掉落的機率愈來愈低,小白鼠的行爲沒有發生改變,持續了很長一段時間。這與咱們人類很類似,不停地按動着手機上的那個「參與抽獎」的按鈕,固然,能夠寫一個腳本代替,這也是人類比小白鼠高明的地方。小程序
下面言歸正傳,做爲狂熱型小白鼠,我想本身寫一個簡單的抽獎程序,將它運用到以前咱們本身開發的針對本身大學的一款掌上校園軟件「果核」。跨域
動機很單純:bash
手段很單一:app
技術很單薄:ide
H5
Springboot
Mysql
本人小白,估計不少地方設計得不科學,但願你們不吝賜教。測試
由於拙於頁面,因此暫時模仿了小程序「抽獎助手」,手擼了兩個界面,若是涉及侵權,請通知我,立馬就改(→_→)ui
學號
,生日
,學院
,專業
等信息。id
,數量
,名稱
,圖片
,獎品介紹
,贊助者
,贊助者標題
,贊助者詳情
,外鏈
,建立時間
,中獎者id
。id
,獎品id
,用戶id
。具體實現: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;
}
複製代碼
具體實現:
@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;
}
複製代碼
具體實現:
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);
}
}
複製代碼
具體實現:
@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);
}
}
複製代碼
寫到這裏,基本上代碼階段已經完成。不足的地方也有不少,須要慢慢調整,也但願能給我一些寶貴意見。
諸位,人生苦短,盡情抽獎。
後面一句是:中獎是不可能的,這輩子都不可能中獎,做弊又不會,只能靠寫代碼才能維持得了生活這樣子。
源碼可在公衆號後臺回覆:「抽獎」來獲取。
經過關注來提升中獎可能。