本篇博文是「Java秒殺系統實戰系列文章」的第四篇,從這篇文章開始咱們將進入該秒殺系統相關業務模塊的代碼實戰!本篇博文將首先從最簡單的業務模塊入手,即如何實現「獲取待秒殺商品的列表以及查看待秒殺的商品詳情」功能!
html
對於「待秒殺商品列表及其詳情的展現」這一功能,咱們將採用目前比較流行的mvc開發模式來實現!值得一提的是,這一功能模塊涉及的主要數據庫表爲「商品信息表item」、「待秒殺商品信息item_kill」。
1、「待秒殺商品列表」代碼實戰前端
(1)首先是在 ItemController控制器中開發「獲取待秒殺商品列表」的請求方法,其源代碼以下所示:git
//獲取商品列表
@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用於展現「待秒殺商品列表的信息」,下面展現了該頁面的部分核心源碼,以下圖所示:
tomcat
從該代碼中能夠看出,當canKill字段取值爲1時,將能夠點擊「詳情」進行查看;不然,將會提示相應的信息!即「判斷是否能夠秒殺」的邏輯Debug是將其放在了後端來實現!
(5)至此,「獲取待秒殺商品列表」這一功能模塊的先後端代碼實戰已經完畢了,點擊運行整個項目,將整個系統運行在外置的tomcat服務器中,觀察控制檯的輸出信息,若是沒有報錯,這說明整個系統的代碼在語法級別層面是木有問題的。以下圖所示爲整個秒殺系統、項目在運行起來以後的首頁:安全
雖然不是很美觀,可是Debug以爲仍是湊合着用吧 哈哈!!
bash
2、「待秒殺商品詳情」代碼實戰服務器
(1)接下來是點擊「詳情」,查看「待秒殺商品的詳情信息」,對於這個功能模塊,其實仍是比較簡單的,其核心主要是根據「主鍵」進行查詢。一樣的道理,首先須要在 ItemController控制器中開發接收前端請求的功能方法,其源代碼以下所示:mvc
/**
* 獲取待秒殺商品的詳情
* @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服務器中,點擊列表頁中的「詳情」按鈕,能夠看到待秒殺商品的詳情信息,以下圖所示:
至此,本文所要分享介紹的內容已經完成了,即主要分享介紹了「獲取待秒殺商品的列表」和「查看待秒殺商品的詳情」功能!
一、目前,這一秒殺系統的總體構建與代碼實戰已經所有完成了,完整的源代碼數據庫地址能夠來這裏下載:gitee.com/steadyjack/… 記得Fork跟Star啊!!!