人生苦短,盡情抽獎。

抽獎,幾乎是全部人都樂此不疲的一項活動。

小程序界,馮大的「抽獎助手」得到了巨大的成功,在上線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);
    }
    
    
}
複製代碼

測試接口

寫到這裏,基本上代碼階段已經完成。不足的地方也有不少,須要慢慢調整,也但願能給我一些寶貴意見。

諸位,人生苦短,盡情抽獎。

後面一句是:中獎是不可能的,這輩子都不可能中獎,做弊又不會,只能靠寫代碼才能維持得了生活這樣子。

源碼可在公衆號後臺回覆:「抽獎」來獲取。

經過關注來提升中獎可能。
相關文章
相關標籤/搜索