Java秒殺系統實戰系列~待秒殺商品列表與詳情功能開發

摘要:

本篇博文是「Java秒殺系統實戰系列文章」的第四篇,從這篇文章開始咱們將進入該秒殺系統相關業務模塊的代碼實戰!本篇博文將首先從最簡單的業務模塊入手,即如何實現「獲取待秒殺商品的列表以及查看待秒殺的商品詳情」功能!

內容:html

對於「待秒殺商品列表及其詳情的展現」這一功能,咱們將採用目前比較流行的mvc開發模式來實現!值得一提的是,這一功能模塊涉及的主要數據庫表爲「商品信息表item」、「待秒殺商品信息item_kill」。

1、「待秒殺商品列表」代碼實戰前端

(1)首先是在 ItemController控制器中開發「獲取待秒殺商品列表」的請求方法,其源代碼以下所示:java

//獲取商品列表
@RequestMapping(value = {"/","/index",prefix+"/list",prefix+"/index.html"},method = RequestMethod.GET) public String list(ModelMap modelMap){ try { //獲取待秒殺商品列表
        List<ItemKill> list=itemService.getKillItems(); modelMap.put("list",list); log.info("獲取待秒殺商品列表-數據:{}",list); }catch (Exception e){ log.error("獲取待秒殺商品列表-發生異常:",e.fillInStackTrace()); return "redirect:/base/error"; } return "list"; }

 

控制器的這一方法在獲取到待秒殺商品的列表信息後,將經過modelMap的形式將數據列表返回給到前端的頁面list.jsp中進行渲染!其中,itemService.getKillItems() 主要用於獲取待秒殺商品的列表信息,其源代碼以下所示: git

@Autowired private ItemKillMapper itemKillMapper; //獲取待秒殺商品列表
@Override public List<ItemKill> getKillItems() throws Exception { return itemKillMapper.selectAll(); }

  

(2)緊接着是開發 itemKillMapper.selectAll() 方法,其主要是基於Mybatis在配置文件中寫動態Sql,該Sql的做用在於「獲取待秒殺商品的列表」,其源代碼以下所示:數據庫

  <!--查詢待秒殺的活動商品列表-->
  <select id="selectAll" resultType="com.debug.kill.model.entity.ItemKill">
    SELECT
      a.*,
      b.name AS itemName,
      (
        CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0)
          THEN 1
        ELSE 0
        END
      )      AS canKill
    FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id
    WHERE a.is_active = 1
  </select>

  

在這裏的Sql,Debug是採用了Left Join左關聯查詢的方式獲取列表信息,目的是爲了獲取「商品信息表」中的商品信息,如「商品名稱」等等。值得一提的是,在這裏Debug還使用了一個小技巧,即採用一個字段 canKill 來表示當前「待秒殺的商品」是否能夠被秒殺/被搶購!其判斷的標準爲:

當待秒殺的商品的剩餘數量/庫存,即 total 字段的取值大於0時,而且 「當前的服務器時間now()處於待秒殺商品的搶購開始時間 和 搶購結束時間的範圍內」時,canKill的取值將爲1,即表明能夠被搶購或者被秒殺。不然canKill的取值將爲0。

(3)至此,「待秒殺商品列表」這一功能模塊的後端代碼開發已經完成了!前端發起請求後,請求將首先到達controller,經過請求路徑url映射到某個方法進行調用,controller的方法首先會進行最基本的數據校驗,而後經過調用service提供的接口獲取真正的業務數據,最後是在service中執行真正的dao層層面的數據查詢或者數據操做邏輯,最終完成整個業務流的操做。

(4)接下來是開發一個頁面list.jsp用於展現「待秒殺商品列表的信息」,下面展現了該頁面的部分核心源碼,以下圖所示:
後端

 

從該代碼中能夠看出,當canKill字段取值爲1時,將能夠點擊「詳情」進行查看;不然,將會提示相應的信息!即「判斷是否能夠秒殺」的邏輯Debug是將其放在了後端來實現!

(5)至此,「獲取待秒殺商品列表」這一功能模塊的先後端代碼實戰已經完畢了,點擊運行整個項目,將整個系統運行在外置的tomcat服務器中,觀察控制檯的輸出信息,若是沒有報錯,這說明整個系統的代碼在語法級別層面是木有問題的。以下圖所示爲整個秒殺系統、項目在運行起來以後的首頁:
tomcat

 

雖然不是很美觀,可是Debug以爲仍是湊合着用吧 哈哈!!  安全

 

2、「待秒殺商品詳情」代碼實戰服務器

(1)接下來是點擊「詳情」,查看「待秒殺商品的詳情信息」,對於這個功能模塊,其實仍是比較簡單的,其核心主要是根據「主鍵」進行查詢。一樣的道理,首先須要在 ItemController控制器中開發接收前端請求的功能方法,其源代碼以下所示:微信

/** * 獲取待秒殺商品的詳情 * @return
 */ @RequestMapping(value = prefix+"/detail/{id}",method = RequestMethod.GET) public String detail(@PathVariable Integer id,ModelMap modelMap){ if (id==null || id<=0){ return "redirect:/base/error"; } try { ItemKill detail=itemService.getKillDetail(id); modelMap.put("detail",detail); }catch (Exception e){ log.error("獲取待秒殺商品的詳情-發生異常:id={}",id,e.fillInStackTrace()); return "redirect:/base/error"; } return "info"; }

 

該控制器的方法在獲取到待秒殺商品的詳情後,將經過modelMap把詳情信息塞回info.jsp前端頁面中進行渲染展現!

(2)緊接着是itemService.getKillDetail(id) 的開發,即用於獲取「待秒殺商品的詳情」,其源代碼以下所示:

/** * 獲取待秒殺商品詳情 */ @Override public ItemKill getKillDetail(Integer id) throws Exception { ItemKill entity=itemKillMapper.selectById(id); if (entity==null){ throw new Exception("獲取秒殺詳情-待秒殺商品記錄不存在"); } return entity; }

 

其中,itemKillMapper.selectById(id); 主要是基於Mybatis在配置文件中寫動態Sql,該Sql的主要功能爲根據主鍵查詢待秒殺商品的詳情,其源代碼以下所示:   

<!--獲取秒殺詳情-->
<select id="selectById" resultType="com.debug.kill.model.entity.ItemKill"> SELECT a.*, b.name AS itemName, ( CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0) THEN 1 ELSE 0 END ) AS canKill FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id WHERE a.is_active = 1 AND a.id= #{id} </select>

 

從該Sql中不難看出,其實就是在「獲取待秒殺商品列表」的Sql中加入「主鍵的精準查詢」!

(3)最後是在頁面info.jsp渲染展現該詳情信息,以下圖所示爲該頁面的部分核心源代碼:

 

從該頁面的部分核心源代碼中能夠看出,爲了不有人「跳過頁面的請求,直接惡意刷後端接口」,在該頁面仍然再次進行了一次判斷(在後面執行「搶購/秒殺」請求時,後端接口還會再次進行判斷的,全部這些都是爲了安全考慮!)

(4)至此,關於「待秒殺商品的詳情展現」的功能的先後端代碼實戰已經完成了!再次將整個系統/項目運行在外置的tomcat服務器中,點擊列表頁中的「詳情」按鈕,能夠看到待秒殺商品的詳情信息,以下圖所示:

 

 

至此,本文所要分享介紹的內容已經完成了,即主要分享介紹了「獲取待秒殺商品的列表」和「查看待秒殺商品的詳情」功能! 

補充:

一、目前,這一秒殺系統的總體構建與代碼實戰已經所有完成了,完整的源代碼數據庫地址能夠來這裏下載:https://gitee.com/steadyjack/SpringBoot-SecondKill 記得Fork跟Star啊!!!

二、實戰期間有任何問題均可以留言或者與Debug聯繫、交流;QQ技術交流羣:605610429,順便關注一下Debug的技術微信公衆號唄:

相關文章
相關標籤/搜索