在之前的博文中,我們已經(jīng)完成了用戶模塊的所有的功能,那么在接下來(lái)的幾篇博文中,我們來(lái)完成分類管理功能模塊。
先來(lái)看一下后臺(tái)的分類管理都有哪些功能點(diǎn)
后臺(tái)品類管理其實(shí)就是對(duì)商品的一個(gè)管理,主要分為增加品類、更新品類名稱、獲取同級(jí)品類結(jié)點(diǎn)和獲取品類id及子節(jié)點(diǎn)品類
一、分類管理模塊-增加品類功能的實(shí)現(xiàn)
先來(lái)看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( "參數(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( "添加品類成功" ); } return serverresponse.createbyerrormessage( "添加品類失敗" ); } |
添加品類相對(duì)來(lái)說(shuō)還是比較簡(jiǎn)單的。和之前的注冊(cè)邏輯有點(diǎn)相似。首先校驗(yàn)前端傳過(guò)來(lái)的categoryname和parentid是否存在,如果不存在則提示參數(shù)錯(cuò)誤,否則就繼續(xù)使用javabean的實(shí)例來(lái)增加品類。同樣的,在用javabean增加完之后,將結(jié)果插入到數(shù)據(jù)庫(kù)中,如果返回的生效行數(shù)大于0,則添加品類成功,否則添加品類失敗。
再來(lái)看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(), "用戶未登錄,請(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è)接口名稱,而沒(méi)有規(guī)定接口請(qǐng)求的方法,是因?yàn)槠奉惞芾砟K是網(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)證用戶是否處于登錄狀態(tài),如果用戶處于登錄狀態(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é)果就可以了。
在上述方法中,需要判斷用戶的登錄狀態(tài),所以需要引入用戶服務(wù),然后直接調(diào)用相應(yīng)的方法即可。
二、分類管理模塊-更新品類名稱功能的實(shí)現(xiàn)
先來(lái)看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( "更新品類參數(shù)錯(cuò)誤" ); } category category = new category(); category.setid(categoryid); category.setname(categoryname); int rowcount = categorymapper.updatebyprimarykeyselective(category); if (rowcount > 0 ){ return serverresponse.createbysuceessmessage( "更新品類名稱成功" ); } return serverresponse.createbyerrormessage( "更新品類名稱失敗" ); } |
和之前的處理邏輯完全一樣,這里不再一一贅述。
再來(lái)看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(), "用戶未登錄,請(qǐng)登錄" ); } if (iuserservice.checkadmin(user).issuccess()){ return icategoryservice.updatecategoryname(categoryname, categoryid); } else { return serverresponse.createbyerrormessage( "無(wú)權(quán)限操作,請(qǐng)登錄管理員" ); } } |
和之前的處理邏輯完全一樣,這里不再一一贅述。
三、分類管理模塊-獲取平級(jí)品類結(jié)點(diǎn)(后臺(tái)商品搜索)功能的實(shí)現(xiàn)
service層
1
2
3
4
5
6
7
8
|
// 平級(jí)查詢品類結(jié)點(diǎn) public serverresponse<list<category>> getchildrenparallecategory(integer categoryid){ list<category> categorylist = categorymapper.selectcategorychildrenbyparentid(categoryid); if (collectionutils.isempty(categorylist)){ logger.info( "未找到當(dāng)前分類的子分類" ); } return serverresponse.createbysuccess(categorylist); } |
處理一組商品信息,往往使用集合的方式,根據(jù)集合不同種類,其適用長(zhǎng)青也不一樣。這里,我用的是list集合,一是考慮到list集合方便遍歷操作,也方便管理。因?yàn)槭枪芾砩唐罚灾付╨ist集合的泛型為category,通過(guò)categorymapper的selectcategorychildrenbyparentid方法來(lái)進(jìn)行商品id的查詢。在邏輯判斷上,使用java中封裝好的collectionutils工具類,來(lái)判斷集合的返回結(jié)果是否為空,如果為空就打印一行日志,否則將執(zhí)行成功的categorylist結(jié)果返回即可。這里的logger是餓哦們自己封裝的日志打印工具類,關(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)前需要打印日志的類,例如這里的categoryserviceimpl.class。即可在控制臺(tái)看到日志的打印結(jié)果。
controller層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 管理品類-獲取同級(jí)品類的結(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(), "用戶未登錄,請(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ì)商品品類進(jìn)行管理,所以使用requestparam注解的defaultvalue="0"來(lái)規(guī)定一個(gè)參數(shù)的默認(rèn)值。其余的邏輯處理和之前的完全一樣。
四、分類管理模塊-獲取品類id及子結(jié)點(diǎn)功能的實(shí)現(xiàn)
看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); } // 遞歸算法,算出子節(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)查詢出商品的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層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 管理品類-獲取id及子節(jié)點(diǎn)品類 * @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(), "用戶未登錄,請(qǐng)登錄" ); } if (iuserservice.checkadmin(user).issuccess()){ return icategoryservice.selectcategoryandchildrenbyid(categoryid); } else { return serverresponse.createbyerrormessage( "無(wú)權(quán)限操作,請(qǐng)登錄管理員" ); } } |
和之前的獲取品類同級(jí)結(jié)點(diǎn)的邏輯處理完全一樣,這里就不一一贅述了。
五、補(bǔ)充用戶模塊
在后臺(tái)品類管理模塊中,用到了校驗(yàn)當(dāng)前登錄的用戶是否是管理員的方法,這個(gè)是在用戶模塊中寫到的,之前我忘記寫了,所以,在這里做一個(gè)補(bǔ)充。
用戶模塊的service層
1
2
3
4
5
6
7
|
// 用戶后臺(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,則視為管理員,直接返回成功,否則返回失敗。
寫到這里,后臺(tái)的品類管理模塊就寫完了。因?yàn)樵撃K的功能接口比較少,所以用了較長(zhǎng)的篇幅全部寫在一篇博文中,這樣也方便大家一次性就學(xué)完后臺(tá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í)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/qq_36314960/article/details/79314608