亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java仿淘寶首頁(yè)分類(lèi)列表功能的示例代碼

 更新時(shí)間:2018年05月08日 10:14:31   作者:Steafan_  
這篇文章主要介紹了仿淘寶分類(lèi)管理功能的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,也給大家做個(gè)參考

在之前的博文中,我們已經(jīng)完成了用戶(hù)模塊的所有的功能,那么在接下來(lái)的幾篇博文中,我們來(lái)完成分類(lèi)管理功能模塊。

先來(lái)看一下后臺(tái)的分類(lèi)管理都有哪些功能點(diǎn)

后臺(tái)品類(lèi)管理其實(shí)就是對(duì)商品的一個(gè)管理,主要分為增加品類(lèi)、更新品類(lèi)名稱(chēng)、獲取同級(jí)品類(lèi)結(jié)點(diǎn)和獲取品類(lèi)id及子節(jié)點(diǎn)品類(lèi)

一、分類(lèi)管理模塊-增加品類(lèi)功能的實(shí)現(xiàn)

先來(lái)看Service層

// 添加品類(lèi) 
 public ServerResponse addCategory(String categoryName, Integer parentId){ 
  if(parentId == null || StringUtils.isBlank(categoryName)){ 
   return ServerResponse.createByErrorMessage("參數(shù)錯(cuò)誤"); 
  } 
 
  Category category = new Category(); 
  category.setName(categoryName); 
  category.setParentId(parentId); 
  category.setStatus(true); 
 
  int rowCount = categoryMapper.insert(category); 
  if(rowCount > 0){ 
   return ServerResponse.createBySuceessMessage("添加品類(lèi)成功"); 
  } 
  return ServerResponse.createByErrorMessage("添加品類(lèi)失敗"); 
 } 

添加品類(lèi)相對(duì)來(lái)說(shuō)還是比較簡(jiǎn)單的。和之前的注冊(cè)邏輯有點(diǎn)相似。首先校驗(yàn)前端傳過(guò)來(lái)的categoryName和parentId是否存在,如果不存在則提示參數(shù)錯(cuò)誤,否則就繼續(xù)使用JavaBean的實(shí)例來(lái)增加品類(lèi)。同樣的,在用JavaBean增加完之后,將結(jié)果插入到數(shù)據(jù)庫(kù)中,如果返回的生效行數(shù)大于0,則添加品類(lèi)成功,否則添加品類(lèi)失敗。

再來(lái)看Controller層

 /** 
  * 管理品類(lèi)-增加品類(lèi) 
  * @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(), "用戶(hù)未登錄,請(qǐng)登錄"); 
  } 
//  校驗(yàn)是否是管理員 
  if (iUserService.checkAdmin(user).isSuccess()) { 
   return iCategoryService.addCategory(categoryName, parentId); 
  } else { 
   return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作,請(qǐng)登錄管理員"); 
  } 
 } 

首先有一個(gè)不同的地方在與RequestMapping的value值,只有一個(gè)接口名稱(chēng),而沒(méi)有規(guī)定接口請(qǐng)求的方法,是因?yàn)槠奉?lèi)管理模塊是網(wǎng)站管理員進(jìn)行后臺(tái)管理,屬于后臺(tái)模塊。針對(duì)于后臺(tái)模塊,其是公司內(nèi)部員工使用,不需要對(duì)外界進(jìn)行公開(kāi),所以使用默認(rèn)的GET方式請(qǐng)求就可以。

后臺(tái)功能管理的通用邏輯就是首先驗(yàn)證用戶(hù)是否處于登錄狀態(tài),如果用戶(hù)處于登錄狀態(tài),再來(lái)驗(yàn)證當(dāng)前登錄的是不是網(wǎng)站管理員,如果不是管理員,則無(wú)權(quán)進(jìn)行相關(guān)的管理操作,如果是管理員,就可以進(jìn)行后臺(tái)的管理。在進(jìn)行后臺(tái)功能管理的邏輯中,一般的直接返回在Service層中方法處理結(jié)果就可以了。

  在上述方法中,需要判斷用戶(hù)的登錄狀態(tài),所以需要引入用戶(hù)服務(wù),然后直接調(diào)用相應(yīng)的方法即可。

二、分類(lèi)管理模塊-更新品類(lèi)名稱(chēng)功能的實(shí)現(xiàn)

先來(lái)看Service層

// 更新品類(lèi)名稱(chēng) 
 public ServerResponse updateCategoryName(String categoryName, Integer categoryId){ 
  if(categoryId == null || StringUtils.isBlank(categoryName)){ 
   return ServerResponse.createByErrorMessage("更新品類(lèi)參數(shù)錯(cuò)誤"); 
  } 
  Category category = new Category(); 
  category.setId(categoryId); 
  category.setName(categoryName); 
 
  int rowCount = categoryMapper.updateByPrimaryKeySelective(category); 
  if(rowCount > 0){ 
   return ServerResponse.createBySuceessMessage("更新品類(lèi)名稱(chēng)成功"); 
  } 
  return ServerResponse.createByErrorMessage("更新品類(lèi)名稱(chēng)失敗"); 
 } 

和之前的處理邏輯完全一樣,這里不再一一贅述。

再來(lái)看Controller層

/** 
  * 管理品類(lèi)-更新品類(lèi)名稱(chēng) 
  * @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(), "用戶(hù)未登錄,請(qǐng)登錄"); 
  } 
  if(iUserService.checkAdmin(user).isSuccess()){ 
   return iCategoryService.updateCategoryName(categoryName, categoryId); 
  }else{ 
   return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作,請(qǐng)登錄管理員"); 
  } 
 } 

和之前的處理邏輯完全一樣,這里不再一一贅述。

三、分類(lèi)管理模塊-獲取平級(jí)品類(lèi)結(jié)點(diǎn)(后臺(tái)商品搜索)功能的實(shí)現(xiàn)

Service層

// 平級(jí)查詢(xún)品類(lèi)結(jié)點(diǎn) 
 public ServerResponse<List<Category>> getChildrenParalleCategory(Integer categoryId){ 
  List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId); 
  if(CollectionUtils.isEmpty(categoryList)){ 
   logger.info("未找到當(dāng)前分類(lèi)的子分類(lèi)"); 
  } 
  return ServerResponse.createBySuccess(categoryList); 
 } 

處理一組商品信息,往往使用集合的方式,根據(jù)集合不同種類(lèi),其適用長(zhǎng)青也不一樣。這里,我用的是List集合,一是考慮到List集合方便遍歷操作,也方便管理。因?yàn)槭枪芾砩唐罚灾付↙ist集合的泛型為Category,通過(guò)categoryMapper的selectCategoryChildrenByParentId方法來(lái)進(jìn)行商品id的查詢(xún)。在邏輯判斷上,使用Java中封裝好的CollectionUtils工具類(lèi),來(lái)判斷集合的返回結(jié)果是否為空,如果為空就打印一行日志,否則將執(zhí)行成功的categoryList結(jié)果返回即可。這里的logger是餓哦們自己封裝的日志打印工具類(lèi),關(guān)于他的用法,簡(jiǎn)單提一下

private org.slf4j.Logger logger = LoggerFactory.getLogger(CategoryServiceImpl.class);

注意,這個(gè)logger使用的是slf4j包下的,不要導(dǎo)錯(cuò)包了,然后LoggerFactory.getLogger(classs),需要傳遞一個(gè)參數(shù),就是當(dāng)前需要打印日志的類(lèi),例如這里的CategoryServiceImpl.class。即可在控制臺(tái)看到日志的打印結(jié)果。

Controller層

/** 
  * 管理品類(lèi)-獲取同級(jí)品類(lèi)的結(jié)點(diǎn) 
  * @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(), "用戶(hù)未登錄,請(qǐng)登錄"); 
  } 
  if(iUserService.checkAdmin(user).isSuccess()){ 
   return iCategoryService.getChildrenParalleCategory(categoryId); 
  }else { 
   return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作,請(qǐng)登錄管理員"); 
  } 
 } 

出于實(shí)際情況的考慮,當(dāng)商品數(shù)量為0時(shí),不需要對(duì)商品品類(lèi)進(jìn)行管理,所以使用RequestParam注解的defaultValue="0"來(lái)規(guī)定一個(gè)參數(shù)的默認(rèn)值。其余的邏輯處理和之前的完全一樣。

四、分類(lèi)管理模塊-獲取品類(lèi)id及子結(jié)點(diǎn)功能的實(shí)現(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é)點(diǎn) 
 private Set<Category> findChildCategory(Integer categoryId, Set<Category> categorySet){ 
  Category category = categoryMapper.selectByPrimaryKey(categoryId); 
  if(category != null){ 
   categorySet.add(category); 
  } 
//  查找子節(jié)點(diǎn) 
  List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId); 
  for(Category categoryItem : categoryList){ 
   findChildCategory(categoryItem.getId(), categorySet); 
  } 
  return categorySet; 
 } 

主方法是selectCategoryAndChildrenById,輔助方法為findChildCategory,通過(guò)遞歸算出子節(jié)點(diǎn)。在輔助方法中,通過(guò)categoryId來(lái)查詢(xún)出商品的id信息,并且加入到Set集合中,再通過(guò)foreach循環(huán)來(lái)遍歷出商品的子節(jié)點(diǎn),最后返回categorySet。在主方法中通過(guò)調(diào)用輔助方法,將商品的id及子節(jié)點(diǎn)全部查出,然后放到List集合中,再通過(guò)foreach循環(huán)遍歷出我們想要的結(jié)果,最后直接返回categoryIdList即可。

Controller層

/** 
  * 管理品類(lèi)-獲取id及子節(jié)點(diǎn)品類(lèi) 
  * @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(), "用戶(hù)未登錄,請(qǐng)登錄"); 
  } 
  if(iUserService.checkAdmin(user).isSuccess()){ 
   return iCategoryService.selectCategoryAndChildrenById(categoryId); 
  }else{ 
   return ServerResponse.createByErrorMessage("無(wú)權(quán)限操作,請(qǐng)登錄管理員"); 
  } 
 }

和之前的獲取品類(lèi)同級(jí)結(jié)點(diǎn)的邏輯處理完全一樣,這里就不一一贅述了。

五、補(bǔ)充用戶(hù)模塊

在后臺(tái)品類(lèi)管理模塊中,用到了校驗(yàn)當(dāng)前登錄的用戶(hù)是否是管理員的方法,這個(gè)是在用戶(hù)模塊中寫(xiě)到的,之前我忘記寫(xiě)了,所以,在這里做一個(gè)補(bǔ)充。

用戶(hù)模塊的Service層

// 用戶(hù)后臺(tái)-校驗(yàn)是否是管理員 
 public ServerResponse checkAdmin(User user){ 
  if(user != null && user.getRole().intValue() == Const.Role.ROLE_ADMIN){ 
   return ServerResponse.createBySuccess(); 
  } 
  return ServerResponse.createByError(); 
 } 

因?yàn)槭枪芾韱T相關(guān),所以只需要在Service層中進(jìn)行邏輯處理,不需要再在Controller中聲明。該方法傳入一個(gè)user對(duì)象,通過(guò)封裝好的Role接口進(jìn)行權(quán)限判定,如果返回值為ADMIN,則視為管理員,直接返回成功,否則返回失敗。

寫(xiě)到這里,后臺(tái)的品類(lèi)管理模塊就寫(xiě)完了。因?yàn)樵撃K的功能接口比較少,所以用了較長(zhǎng)的篇幅全部寫(xiě)在一篇博文中,這樣也方便大家一次性就學(xué)完后臺(tái)的品類(lèi)管理模塊。

在接下來(lái)的博文中,繼續(xù)推進(jìn)項(xiàng)目進(jìn)度,將為大家?guī)?lái)后臺(tái)商品模塊的開(kāi)發(fā),希望大家跟上進(jìn)度。

如果在之前的博文中你遇到了什么問(wèn)題,歡迎留言反饋,我會(huì)盡可能為大家解決問(wèn)題。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法

    js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法

    這篇文章主要介紹了js判斷是否是移動(dòng)設(shè)備登陸網(wǎng)頁(yè)的簡(jiǎn)單方法,需要的朋友可以參考下
    2014-02-02
  • prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解

    prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解

    這篇文章主要介紹了prometheus監(jiān)控springboot應(yīng)用簡(jiǎn)單使用介紹詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • Spring?Boot?ORM?框架JPA使用與連接池?Hikari詳解

    Spring?Boot?ORM?框架JPA使用與連接池?Hikari詳解

    這篇文章主要介紹了SpringBoot?ORM框架JPA與連接池Hikari,主要就是介紹JPA?的使用姿勢(shì),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • 詳解Java中的四種引用類(lèi)型(強(qiáng)軟弱虛)

    詳解Java中的四種引用類(lèi)型(強(qiáng)軟弱虛)

    Java中的引用類(lèi)型主要分為四種,分別是強(qiáng)引用、軟引用、弱引用和虛引用,這篇文章主要為大家詳細(xì)介紹了四者的使用與區(qū)別,需要的小伙伴可以參考下
    2023-10-10
  • Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)

    Apache Calcite進(jìn)行SQL解析(java代碼實(shí)例)

    Calcite是一款開(kāi)源SQL解析工具, 可以將各種SQL語(yǔ)句解析成抽象語(yǔ)法樹(shù)AST(Abstract Syntax Tree), 之后通過(guò)操作AST就可以把SQL中所要表達(dá)的算法與關(guān)系體現(xiàn)在具體代碼之中,今天通過(guò)代碼實(shí)例給大家介紹Apache Calcite進(jìn)行SQL解析問(wèn)題,感興趣的朋友一起看看吧
    2022-01-01
  • JavaCV簡(jiǎn)介與環(huán)境搭建詳細(xì)步驟

    JavaCV簡(jiǎn)介與環(huán)境搭建詳細(xì)步驟

    JavaCV是一個(gè)開(kāi)源的Java接口,它為幾個(gè)著名的計(jì)算機(jī)視覺(jué)庫(kù)(如OpenCV、FFmpeg)提供了Java封裝,這篇文章主要給大家介紹了關(guān)于JavaCV簡(jiǎn)介與環(huán)境搭建的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Maven使用Nexus創(chuàng)建私服的實(shí)現(xiàn)

    Maven使用Nexus創(chuàng)建私服的實(shí)現(xiàn)

    本文主要介紹了Maven使用Nexus創(chuàng)建私服的實(shí)現(xiàn),通過(guò)建立自己的私服,就可以降低中央倉(cāng)庫(kù)負(fù)荷、節(jié)省外網(wǎng)帶寬、加速M(fèi)aven構(gòu)建、自己部署構(gòu)件等,從而高效地使用Maven,感興趣的可以了解一下
    2024-04-04
  • 詳解Mybatis中的PooledDataSource

    詳解Mybatis中的PooledDataSource

    這篇文章主要介紹了詳解Mybatis中的PooledDataSource,PooledDataSource使用了數(shù)據(jù)庫(kù)連接池可以實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接池的重復(fù)利用,還能控制連接數(shù)據(jù)庫(kù)的連接上限
    2022-06-06
  • 淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)

    淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)

    這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 基于request.getAttribute與request.getParameter的區(qū)別詳解

    基于request.getAttribute與request.getParameter的區(qū)別詳解

    本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下
    2013-04-04

最新評(píng)論