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

摘要:

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

內容:

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

一、“待秒殺商品列表”代碼實戰

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

//獲取商品列表
@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() 主要用於獲取待秒殺商品的列表信息,其源代碼如下所示:

@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用於展示“待秒殺商品列表的信息”,下面展示了該頁面的部分核心源碼,如下圖所示:

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

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

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

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

雖然不是很美觀,但是Debug覺得還是湊合着用吧 哈哈!!

二、“待秒殺商品詳情”代碼實戰

(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渲染展示該詳情信息,如下圖所示爲該頁面的部分核心源代碼:

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

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

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

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

補充

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

2、由於相應的博客的更新可能並不會很快,故而如果有想要快速入門以及實戰整套系統的,可以考慮聯繫Debug獲取這一“Java秒殺系統”的完整視頻教程(課程是收費的!),當然,大家也可以點擊下面這個鏈接 https://gitee.com/steadyjack/SpringBoot-SecondKill 聯繫Debug或者加入相應的技術交流羣進行交流!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章