在之前的博文中,我們已經完成了用戶模塊的所有的功能,那么在接下來的幾篇博文中,我們來完成分類管理功能模塊。
先來看一下后臺的分類管理都有哪些功能點
后臺品類管理其實就是對商品的一個管理,主要分為增加品類、更新品類名稱、獲取同級品類結點和獲取品類id及子節點品類
一、分類管理模塊-增加品類功能的實現
先來看service層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 添加品類 public serverresponse addcategory(string categoryname, integer parentid){ if (parentid == null || stringutils.isblank(categoryname)){ return serverresponse.createbyerrormessage( "參數錯誤" ); } 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是否存在,如果不存在則提示參數錯誤,否則就繼續使用javabean的實例來增加品類。同樣的,在用javabean增加完之后,將結果插入到數據庫中,如果返回的生效行數大于0,則添加品類成功,否則添加品類失敗。
再來看controller層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** * 管理品類-增加品類 * @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( "無權限操作,請登錄管理員" ); } } |
首先有一個不同的地方在與requestmapping的value值,只有一個接口名稱,而沒有規定接口請求的方法,是因為品類管理模塊是網站管理員進行后臺管理,屬于后臺模塊。針對于后臺模塊,其是公司內部員工使用,不需要對外界進行公開,所以使用默認的get方式請求就可以。
后臺功能管理的通用邏輯就是首先驗證用戶是否處于登錄狀態,如果用戶處于登錄狀態,再來驗證當前登錄的是不是網站管理員,如果不是管理員,則無權進行相關的管理操作,如果是管理員,就可以進行后臺的管理。在進行后臺功能管理的邏輯中,一般的直接返回在service層中方法處理結果就可以了。
在上述方法中,需要判斷用戶的登錄狀態,所以需要引入用戶服務,然后直接調用相應的方法即可。
二、分類管理模塊-更新品類名稱功能的實現
先來看service層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
// 更新品類名稱 public serverresponse updatecategoryname(string categoryname, integer categoryid){ if (categoryid == null || stringutils.isblank(categoryname)){ return serverresponse.createbyerrormessage( "更新品類參數錯誤" ); } 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層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 管理品類-更新品類名稱 * @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( "無權限操作,請登錄管理員" ); } } |
和之前的處理邏輯完全一樣,這里不再一一贅述。
三、分類管理模塊-獲取平級品類結點(后臺商品搜索)功能的實現
service層
1
2
3
4
5
6
7
8
|
// 平級查詢品類結點 public serverresponse<list<category>> getchildrenparallecategory(integer categoryid){ list<category> categorylist = categorymapper.selectcategorychildrenbyparentid(categoryid); if (collectionutils.isempty(categorylist)){ logger.info( "未找到當前分類的子分類" ); } return serverresponse.createbysuccess(categorylist); } |
處理一組商品信息,往往使用集合的方式,根據集合不同種類,其適用長青也不一樣。這里,我用的是list集合,一是考慮到list集合方便遍歷操作,也方便管理。因為是管理商品,所以指定list集合的泛型為category,通過categorymapper的selectcategorychildrenbyparentid方法來進行商品id的查詢。在邏輯判斷上,使用java中封裝好的collectionutils工具類,來判斷集合的返回結果是否為空,如果為空就打印一行日志,否則將執行成功的categorylist結果返回即可。這里的logger是餓哦們自己封裝的日志打印工具類,關于他的用法,簡單提一下
private org.slf4j.logger logger = loggerfactory.getlogger(categoryserviceimpl.class);
注意,這個logger使用的是slf4j包下的,不要導錯包了,然后loggerfactory.getlogger(classs),需要傳遞一個參數,就是當前需要打印日志的類,例如這里的categoryserviceimpl.class。即可在控制臺看到日志的打印結果。
controller層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 管理品類-獲取同級品類的結點 * @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( "無權限操作,請登錄管理員" ); } } |
出于實際情況的考慮,當商品數量為0時,不需要對商品品類進行管理,所以使用requestparam注解的defaultvalue="0"來規定一個參數的默認值。其余的邏輯處理和之前的完全一樣。
四、分類管理模塊-獲取品類id及子結點功能的實現
看service層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
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); } // 遞歸算法,算出子節點 private set<category> findchildcategory(integer categoryid, set<category> categoryset){ category category = categorymapper.selectbyprimarykey(categoryid); if (category != null ){ categoryset.add(category); } // 查找子節點 list<category> categorylist = categorymapper.selectcategorychildrenbyparentid(categoryid); for (category categoryitem : categorylist){ findchildcategory(categoryitem.getid(), categoryset); } return categoryset; } |
主方法是selectcategoryandchildrenbyid,輔助方法為findchildcategory,通過遞歸算出子節點。在輔助方法中,通過categoryid來查詢出商品的id信息,并且加入到set集合中,再通過foreach循環來遍歷出商品的子節點,最后返回categoryset。在主方法中通過調用輔助方法,將商品的id及子節點全部查出,然后放到list集合中,再通過foreach循環遍歷出我們想要的結果,最后直接返回categoryidlist即可。
controller層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 管理品類-獲取id及子節點品類 * @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( "無權限操作,請登錄管理員" ); } } |
和之前的獲取品類同級結點的邏輯處理完全一樣,這里就不一一贅述了。
五、補充用戶模塊
在后臺品類管理模塊中,用到了校驗當前登錄的用戶是否是管理員的方法,這個是在用戶模塊中寫到的,之前我忘記寫了,所以,在這里做一個補充。
用戶模塊的service層
1
2
3
4
5
6
7
|
// 用戶后臺-校驗是否是管理員 public serverresponse checkadmin(user user){ if (user != null && user.getrole().intvalue() == const .role.role_admin){ return serverresponse.createbysuccess(); } return serverresponse.createbyerror(); } |
因為是管理員相關,所以只需要在service層中進行邏輯處理,不需要再在controller中聲明。該方法傳入一個user對象,通過封裝好的role接口進行權限判定,如果返回值為admin,則視為管理員,直接返回成功,否則返回失敗。
寫到這里,后臺的品類管理模塊就寫完了。因為該模塊的功能接口比較少,所以用了較長的篇幅全部寫在一篇博文中,這樣也方便大家一次性就學完后臺的品類管理模塊。
在接下來的博文中,繼續推進項目進度,將為大家帶來后臺商品模塊的開發,希望大家跟上進度。
如果在之前的博文中你遇到了什么問題,歡迎留言反饋,我會盡可能為大家解決問題。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/qq_36314960/article/details/79314608