Java仿淘寶首頁分類列表功能的示例代碼
在之前的博文中,我們已經(jīng)完成了用戶模塊的所有的功能,那么在接下來的幾篇博文中,我們來完成分類管理功能模塊。
先來看一下后臺的分類管理都有哪些功能點

后臺品類管理其實就是對商品的一個管理,主要分為增加品類、更新品類名稱、獲取同級品類結(jié)點和獲取品類id及子節(jié)點品類
一、分類管理模塊-增加品類功能的實現(xiàn)
先來看Service層
// 添加品類
public ServerResponse addCategory(String categoryName, Integer parentId){
if(parentId == null || StringUtils.isBlank(categoryName)){
return ServerResponse.createByErrorMessage("參數(shù)錯誤");
}
Category category = new Category();
category.setName(categoryName);
category.setParentId(parentId);
category.setStatus(true);
int rowCount = categoryMapper.insert(category);
if(rowCount > 0){
return ServerResponse.createBySuceessMessage("添加品類成功");
}
return ServerResponse.createByErrorMessage("添加品類失敗");
}
添加品類相對來說還是比較簡單的。和之前的注冊邏輯有點相似。首先校驗前端傳過來的categoryName和parentId是否存在,如果不存在則提示參數(shù)錯誤,否則就繼續(xù)使用JavaBean的實例來增加品類。同樣的,在用JavaBean增加完之后,將結(jié)果插入到數(shù)據(jù)庫中,如果返回的生效行數(shù)大于0,則添加品類成功,否則添加品類失敗。
再來看Controller層
/**
* 管理品類-增加品類
* @param categoryName
* @param parentId
* @param session
* @return
*/
@RequestMapping(value = "add_category.do")
@ResponseBody
public ServerResponse addCategory(String categoryName, @RequestParam(value = "parentId", defaultValue = "0") int parentId, HttpSession session) {
User user = (User) session.getAttribute(Const.CURRENT_USER);
if (user == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "用戶未登錄,請登錄");
}
// 校驗是否是管理員
if (iUserService.checkAdmin(user).isSuccess()) {
return iCategoryService.addCategory(categoryName, parentId);
} else {
return ServerResponse.createByErrorMessage("無權(quán)限操作,請登錄管理員");
}
}
首先有一個不同的地方在與RequestMapping的value值,只有一個接口名稱,而沒有規(guī)定接口請求的方法,是因為品類管理模塊是網(wǎng)站管理員進行后臺管理,屬于后臺模塊。針對于后臺模塊,其是公司內(nèi)部員工使用,不需要對外界進行公開,所以使用默認的GET方式請求就可以。
后臺功能管理的通用邏輯就是首先驗證用戶是否處于登錄狀態(tài),如果用戶處于登錄狀態(tài),再來驗證當前登錄的是不是網(wǎng)站管理員,如果不是管理員,則無權(quán)進行相關(guān)的管理操作,如果是管理員,就可以進行后臺的管理。在進行后臺功能管理的邏輯中,一般的直接返回在Service層中方法處理結(jié)果就可以了。
在上述方法中,需要判斷用戶的登錄狀態(tài),所以需要引入用戶服務,然后直接調(diào)用相應的方法即可。
二、分類管理模塊-更新品類名稱功能的實現(xiàn)
先來看Service層
// 更新品類名稱
public ServerResponse updateCategoryName(String categoryName, Integer categoryId){
if(categoryId == null || StringUtils.isBlank(categoryName)){
return ServerResponse.createByErrorMessage("更新品類參數(shù)錯誤");
}
Category category = new Category();
category.setId(categoryId);
category.setName(categoryName);
int rowCount = categoryMapper.updateByPrimaryKeySelective(category);
if(rowCount > 0){
return ServerResponse.createBySuceessMessage("更新品類名稱成功");
}
return ServerResponse.createByErrorMessage("更新品類名稱失敗");
}
和之前的處理邏輯完全一樣,這里不再一一贅述。
再來看Controller層
/**
* 管理品類-更新品類名稱
* @param categoryName
* @param categoryId
* @param session
* @return
*/
@RequestMapping(value = "update_category_name")
@ResponseBody
public ServerResponse updateCategoryName(String categoryName, Integer categoryId, HttpSession session){
User user = (User)session.getAttribute(Const.CURRENT_USER);
if(user == null){
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "用戶未登錄,請登錄");
}
if(iUserService.checkAdmin(user).isSuccess()){
return iCategoryService.updateCategoryName(categoryName, categoryId);
}else{
return ServerResponse.createByErrorMessage("無權(quán)限操作,請登錄管理員");
}
}
和之前的處理邏輯完全一樣,這里不再一一贅述。
三、分類管理模塊-獲取平級品類結(jié)點(后臺商品搜索)功能的實現(xiàn)
Service層
// 平級查詢品類結(jié)點
public ServerResponse<List<Category>> getChildrenParalleCategory(Integer categoryId){
List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
if(CollectionUtils.isEmpty(categoryList)){
logger.info("未找到當前分類的子分類");
}
return ServerResponse.createBySuccess(categoryList);
}
處理一組商品信息,往往使用集合的方式,根據(jù)集合不同種類,其適用長青也不一樣。這里,我用的是List集合,一是考慮到List集合方便遍歷操作,也方便管理。因為是管理商品,所以指定List集合的泛型為Category,通過categoryMapper的selectCategoryChildrenByParentId方法來進行商品id的查詢。在邏輯判斷上,使用Java中封裝好的CollectionUtils工具類,來判斷集合的返回結(jié)果是否為空,如果為空就打印一行日志,否則將執(zhí)行成功的categoryList結(jié)果返回即可。這里的logger是餓哦們自己封裝的日志打印工具類,關(guān)于他的用法,簡單提一下
private org.slf4j.Logger logger = LoggerFactory.getLogger(CategoryServiceImpl.class);
注意,這個logger使用的是slf4j包下的,不要導錯包了,然后LoggerFactory.getLogger(classs),需要傳遞一個參數(shù),就是當前需要打印日志的類,例如這里的CategoryServiceImpl.class。即可在控制臺看到日志的打印結(jié)果。
Controller層
/**
* 管理品類-獲取同級品類的結(jié)點
* @param categoryId
* @param session
* @return
*/
@RequestMapping(value = "get_category.do")
@ResponseBody
public ServerResponse getChildrenParalleCategory(@RequestParam(value = "categoryId", defaultValue = "0") Integer categoryId, HttpSession session){
User user = (User)session.getAttribute(Const.CURRENT_USER);
if(user == null){
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "用戶未登錄,請登錄");
}
if(iUserService.checkAdmin(user).isSuccess()){
return iCategoryService.getChildrenParalleCategory(categoryId);
}else {
return ServerResponse.createByErrorMessage("無權(quán)限操作,請登錄管理員");
}
}
出于實際情況的考慮,當商品數(shù)量為0時,不需要對商品品類進行管理,所以使用RequestParam注解的defaultValue="0"來規(guī)定一個參數(shù)的默認值。其余的邏輯處理和之前的完全一樣。
四、分類管理模塊-獲取品類id及子結(jié)點功能的實現(xiàn)
看Service層
public ServerResponse<List<Integer>> selectCategoryAndChildrenById(Integer categoryId){
Set<Category> categorySet = Sets.newHashSet();
findChildCategory(categoryId, categorySet);
List<Integer> categoryIdList = Lists.newArrayList();
if(categoryId != null){
for(Category categoryItem : categorySet){
categoryIdList.add(categoryItem.getId());
}
}
return ServerResponse.createBySuccess(categoryIdList);
}
// 遞歸算法,算出子節(jié)點
private Set<Category> findChildCategory(Integer categoryId, Set<Category> categorySet){
Category category = categoryMapper.selectByPrimaryKey(categoryId);
if(category != null){
categorySet.add(category);
}
// 查找子節(jié)點
List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
for(Category categoryItem : categoryList){
findChildCategory(categoryItem.getId(), categorySet);
}
return categorySet;
}
主方法是selectCategoryAndChildrenById,輔助方法為findChildCategory,通過遞歸算出子節(jié)點。在輔助方法中,通過categoryId來查詢出商品的id信息,并且加入到Set集合中,再通過foreach循環(huán)來遍歷出商品的子節(jié)點,最后返回categorySet。在主方法中通過調(diào)用輔助方法,將商品的id及子節(jié)點全部查出,然后放到List集合中,再通過foreach循環(huán)遍歷出我們想要的結(jié)果,最后直接返回categoryIdList即可。
Controller層
/**
* 管理品類-獲取id及子節(jié)點品類
* @param categoryId
* @param session
* @return
*/
@RequestMapping(value = "get_deep_category.do")
@ResponseBody
public ServerResponse getCategoryAndDeepChildrenCategory(@RequestParam(value = "categoryId", defaultValue = "0") Integer categoryId, HttpSession session){
User user = (User)session.getAttribute(Const.CURRENT_USER);
if(user == null){
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "用戶未登錄,請登錄");
}
if(iUserService.checkAdmin(user).isSuccess()){
return iCategoryService.selectCategoryAndChildrenById(categoryId);
}else{
return ServerResponse.createByErrorMessage("無權(quán)限操作,請登錄管理員");
}
}
和之前的獲取品類同級結(jié)點的邏輯處理完全一樣,這里就不一一贅述了。
五、補充用戶模塊
在后臺品類管理模塊中,用到了校驗當前登錄的用戶是否是管理員的方法,這個是在用戶模塊中寫到的,之前我忘記寫了,所以,在這里做一個補充。
用戶模塊的Service層
// 用戶后臺-校驗是否是管理員
public ServerResponse checkAdmin(User user){
if(user != null && user.getRole().intValue() == Const.Role.ROLE_ADMIN){
return ServerResponse.createBySuccess();
}
return ServerResponse.createByError();
}
因為是管理員相關(guān),所以只需要在Service層中進行邏輯處理,不需要再在Controller中聲明。該方法傳入一個user對象,通過封裝好的Role接口進行權(quán)限判定,如果返回值為ADMIN,則視為管理員,直接返回成功,否則返回失敗。
寫到這里,后臺的品類管理模塊就寫完了。因為該模塊的功能接口比較少,所以用了較長的篇幅全部寫在一篇博文中,這樣也方便大家一次性就學完后臺的品類管理模塊。
在接下來的博文中,繼續(xù)推進項目進度,將為大家?guī)砗笈_商品模塊的開發(fā),希望大家跟上進度。
如果在之前的博文中你遇到了什么問題,歡迎留言反饋,我會盡可能為大家解決問題。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
prometheus監(jiān)控springboot應用簡單使用介紹詳解
這篇文章主要介紹了prometheus監(jiān)控springboot應用簡單使用介紹詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
Spring?Boot?ORM?框架JPA使用與連接池?Hikari詳解
這篇文章主要介紹了SpringBoot?ORM框架JPA與連接池Hikari,主要就是介紹JPA?的使用姿勢,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-08-08
Apache Calcite進行SQL解析(java代碼實例)
Calcite是一款開源SQL解析工具, 可以將各種SQL語句解析成抽象語法樹AST(Abstract Syntax Tree), 之后通過操作AST就可以把SQL中所要表達的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過代碼實例給大家介紹Apache Calcite進行SQL解析問題,感興趣的朋友一起看看吧2022-01-01
Maven使用Nexus創(chuàng)建私服的實現(xiàn)
本文主要介紹了Maven使用Nexus創(chuàng)建私服的實現(xiàn),通過建立自己的私服,就可以降低中央倉庫負荷、節(jié)省外網(wǎng)帶寬、加速Maven構(gòu)建、自己部署構(gòu)件等,從而高效地使用Maven,感興趣的可以了解一下2024-04-04
淺談Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn)
這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03
基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04

