新增sku到購物車
上次課我們開發(fā)到了顯示商品詳情
有點擊”添加到購物車”的按鈕
但是沒有反應(yīng),我們完成添加購物車的功能就能實現(xiàn)這個效果了
打開mall-order-webapi模塊
業(yè)務(wù)邏輯中一些基本的注意事項
- * 判斷用戶是否登錄,只有登錄后才能將商品新增到購物車
- * 驗證購物車信息的完整性
- * 業(yè)務(wù)邏輯層要判斷新增的sku是否在當(dāng)前用戶的購物車表中已經(jīng)存在
- * 如果不存在是新增sku流程
- * 如果已經(jīng)存在,是修改數(shù)量的流程
開發(fā)持久層
持久層要按上面分析的業(yè)務(wù)邏輯,開發(fā)多個方法
mapper包創(chuàng)建OmsCartMapper接口,編寫代碼如下
@Repositorypublic interface OmsCartMapper {// 判斷當(dāng)前用戶的購物車列表中是否包含指定sku商品的方法OmsCart selectExistsCart(@Param(“userId”) Long userId,@Param(“skuId”) Long skuId);// 新增商品到購物車表中void saveCart(OmsCart omsCart);// 修改指定購物車商品的數(shù)量的方法void updateQuantityById(OmsCart omsCart);}
對應(yīng)的Mapper.xml文件
id,user_id,sku_id,title,main_picture,price,quantity,gmt_create,gmt_modifiedselectfromoms_cartwhereuser_id=#{userId}andsku_id=#{skuId}insert into oms_cart(user_id,sku_id,title,main_picture,price,quantity) values(#{userId},#{skuId},#{title},#{mainPicture},#{price},#{quantity})updateoms_cartsetquantity=#{quantity}whereid=#{id}
開發(fā)業(yè)務(wù)邏輯層
創(chuàng)建OmsCartServiceImpl類實現(xiàn)IOmsCartService接口
實現(xiàn)其中方法,先實現(xiàn)新增購物車的方法即可
需要注意,我們在業(yè)務(wù)邏輯層中需要使用用戶的信息
要單獨編寫一個方法獲取用戶信息,
@Servicepublic class OmsCartServiceImpl implements IOmsCartService {@Autowiredprivate OmsCartMapper omsCartMapper;@Overridepublic void addCart(CartAddDTO cartDTO) {// 獲取當(dāng)前登錄用戶的userIdLong userId=getUserId();// 查詢這個userId的用戶是否已經(jīng)將指定的sku添加到購物車OmsCart omsCart=omsCartMapper.selectExistsCart(userId,cartDTO.getSkuId());// 判斷查詢結(jié)果是否為nullif(omsCart!=null){// 不等于null,表示當(dāng)前用戶這個sku已經(jīng)添加在購物車列表中// 我們需要做的就是修改它的數(shù)量,根據(jù)cartDTO對象的quantity屬性值添加omsCart.setQuantity(omsCart.getQuantity()+cartDTO.getQuantity());// 調(diào)用持久層方法修改數(shù)量omsCartMapper.updateQuantityById(omsCart);}else{// 如果omsCart是null 會運行else代碼塊// 去完成購物車對象的新增,先實例化OmsCart對象OmsCart newOmsCart=new OmsCart();// 將參數(shù)cartDTO的同名屬性賦值給newOmsCartBeanUtils.copyProperties(cartDTO,newOmsCart);// cartDTO對象中沒有userId屬性,需要單獨賦newOmsCart.setUserId(userId);// 執(zhí)行新增omsCartMapper.saveCart(newOmsCart);}}@Overridepublic JsonPage listCarts(Integer page, Integer pageSize) {return null;}@Overridepublic void removeCart(Long[] ids) {}@Overridepublic void removeAllCarts() {}@Overridepublic void removeUserCarts(OmsCart omsCart) {}@Overridepublic void updateQuantity(CartUpdateDTO cartUpdateDTO) {}// 業(yè)務(wù)邏輯層獲得用戶信息的方法,因為多個方法需要獲得用戶信息,所以單獨編寫一個方法// 這個方法的實現(xiàn)是SpringSecurity提供的登錄用戶的容器// 方法的目標(biāo)是獲得SpringSecurity用戶容器,從容器中獲得用戶信息public CsmallAuthenticationInfo getUserInfo(){// 獲得SpringSecurity容器對象UsernamePasswordAuthenticationToken authenticationToken=(UsernamePasswordAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();// 判斷獲取的容器信息是否為空if(authenticationToken!=null){// 如果容器中有內(nèi)容,證明當(dāng)前容器中有登錄用戶信息// 我們獲取這個用戶信息并返回CsmallAuthenticationInfo csmallAuthenticationInfo=(CsmallAuthenticationInfo)authenticationToken.getCredentials();return csmallAuthenticationInfo;}throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,”沒有登錄信息”);}// 業(yè)務(wù)邏輯層中大多數(shù)方法都是獲得用戶id,所以編寫一個返回用戶id的方法public Long getUserId(){return getUserInfo().getId();}}
開發(fā)控制層
創(chuàng)建OmsCartController
@RestController@RequestMapping(“/oms/cart”)@Api(tags = “購物車管理模塊”)public class OmsCartController {@Autowiredprivate IOmsCartService omsCartService;// 新增購物車信息的控制層方法@PostMapping(“/add”)@ApiOperation(“新增購物車信息”)// 判斷當(dāng)前用戶是否具有普通用戶權(quán)限ROLE_user// sso模塊登錄時,會在用戶的權(quán)限列表中添加ROLE_user權(quán)限@PreAuthorize(“hasRole(‘ROLE_user’)”)// cartAddDTO參數(shù)是需要經(jīng)過SpringValidation框架驗證的// @Validated就是激活框架驗證功能,如果cartAddDTO不滿足驗證要求,會自動運行// 統(tǒng)一由異常處理類中的BingingException異常處理public JsonResult addCart(@Validated CartAddDTO cartAddDTO){omsCartService.addCart(cartAddDTO);return JsonResult.ok(“成功添加到購物車”);}}
先注意sso模塊application-test.yml的地址和端口號(密碼有兩個)
也要注意order模塊application-test.yml的地址和端口號
都保證正確的前提下
啟動 leaf passport order
sso:10002
order:10005
先訪問10002登錄獲得JWT 用戶名jackson密碼123456
先登錄看到JWT 然后復(fù)制JWT
轉(zhuǎn)到10005 order模塊 文檔管理->全局參數(shù)設(shè)置->添加參數(shù)
參數(shù)名:Authorization
參數(shù)值:Bearer [粘貼JWT]
然后刷新當(dāng)前10005的界面
然后進(jìn)行發(fā)送請求即可成功!
javax.xml.bindjaxb-api2.3.0
SpringSecurity驗證規(guī)則
SpringSecurity框架登錄后,一定會有一個權(quán)限列表
在userDetails對象中
我們登錄用戶的這個對象的值可能是
{“authorities”:[“ROLE_user”],”id”:1,”userType”:”USER”,”username”:”jackson”}
sso模塊前臺用戶登錄時,會authorities屬性中添加ROLE_user權(quán)限
而后臺管理用戶登錄時會向authorities屬性中添加下面屬性
[“/pms/product/read”,”/pms/product/update”,”/pms/product/delete”]
所以想要在控制器運行前判斷權(quán)限時就可以使用下面的寫法
@PreAuthorize(“hasAuthority(‘ROLE_user’)”)
hasRole判斷是專用于判斷當(dāng)前用戶角色的指令
hasRole會自動在我們判斷的內(nèi)容前添加ROLE_
@PreAuthorize(“hasRole(‘ROLE_user’)”)
開發(fā)查詢購物車功能
開發(fā)持久層
OmsCartMapper添加方法如下
// 根據(jù)當(dāng)前用戶id查詢購物車列表List selectCartsByUserId(Long userId);
OmsCartMapper.xml添加對應(yīng)內(nèi)容
selectfromoms_cartwhereuser_id=#{id}
開發(fā)業(yè)務(wù)邏輯層
OmsCartServiceImpl業(yè)務(wù)實現(xiàn)
返回值支持分頁結(jié)果,按分頁條件查詢
// 根據(jù)用戶id分頁查詢當(dāng)前用戶的購物車列表@Overridepublic JsonPage listCarts(Integer page, Integer pageSize) {// 獲得用戶idLong userId=getUserId();// 執(zhí)行查詢前設(shè)置分頁條件PageHelper.startPage(page,pageSize);// 執(zhí)行分頁查詢List list=omsCartMapper.selectCartsByUserId(userId);// 實例化PageInfo對象獲得分頁信息后將它轉(zhuǎn)換為JsonPage返回return JsonPage.restPage(new PageInfo(list));}
下面開發(fā)控制層,調(diào)用方法進(jìn)行測試
OmsCartController添加方法如下
// 分頁查詢當(dāng)前用戶購物車中的信息@GetMapping(“/list”)@ApiOperation(“分頁查詢當(dāng)前用戶購物車中的信息”)@ApiImplicitParams({@ApiImplicitParam(value = “頁碼”,name = “page”,dataType = “int”,example = “1”),@ApiImplicitParam(value = “每頁條數(shù)”,name = “pageSize”,dataType = “int”,example = “5”)}) @PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult listCartByPage( // 當(dāng)控制器參數(shù)可能為空,當(dāng)空時,我們要給它賦默認(rèn)值時,可以用下面的格式 @RequestParam(required = false,defaultValue = WebConsts.DEFAULT_PAGE) Integer page, @RequestParam(required = false,defaultValue = WebConsts.DEFAULT_PAGE_SIZE)Integer pageSize){ // 控制層調(diào)用業(yè)務(wù)邏輯層代碼 JsonPage jsonPage=omsCartService.listCarts(page,pageSize); return JsonResult.ok(jsonPage);}
啟動nacosseata
啟動leafssoorder模塊
測試http://localhost:10005/doc.html
刪除清空購物車
刪除購物車的持久層
我們刪除購物車的功能支持同時刪除一個或多個購物車中的商品
基本思路就是將一個要刪除的購物車商品的id數(shù)組傳入到Mapper中進(jìn)行刪除
在OmsCartMapper接口中添加放方法
// 根據(jù)購物車的id刪除商品(支持刪除多個商品)int deleteCartsByIds(Long[] ids);
對應(yīng)的mapper.xml
delete fromoms_cartwhereid in#{id}
刪除購物車的業(yè)務(wù)邏輯層
OmsCartServiceImpl添加方法
// 按ids數(shù)組中的id值刪除cart表中信息@Overridepublic void removeCart(Long[] ids) {// 刪除是包含返回值的int rows=omsCartMapper.deleteCartsByIds(ids);if(rows==0){throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,”購物車中沒有您要刪除的商品”);}}
開發(fā)控制層代碼
OmsCartController
@PostMapping(“/delete”)@ApiOperation(“根據(jù)用戶選擇的購物車商品刪除(支持批量)”)@ApiImplicitParam(value = “刪除購物車的id”,name=”ids”,required = true,dataType = “array”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult removeCartsByIds(Long[] ids){omsCartService.removeCart(ids);return JsonResult.ok();}
開發(fā)清空當(dāng)前登錄用戶購物車的功能
delete fromoms_cartwhereuser_id=#{userId}@Overridepublic void removeAllCarts() {}
清空購物車功能
Mapper接口
// 刪除當(dāng)前用戶購物車中所有內(nèi)容int deleteCartsByUserId(Long userId);
mapper.xml
delete fromoms_cartwhereuser_id=#{userId}
OmsCartServiceImpl
// 清空當(dāng)前登錄用戶購物車@Overridepublic void removeAllCarts() {Long userId=getUserId();int rows=omsCartMapper.deleteCartsByUserId(userId);if(rows==0){throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,”您的購物車中沒有商品”);}}
OmsCartController
// 根據(jù)用戶id清空購物車@PostMapping(“/delete/all”)@ApiOperation(“根據(jù)用戶id清空購物車”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult removeCartsByUserId(){omsCartService.removeAllCarts();;return JsonResult.ok(“購物車已清空”);}
修改購物車商品數(shù)量
開發(fā)業(yè)務(wù)邏輯層
因為前面我們已經(jīng)完成了修改購物車數(shù)量的持久層,所以不需要再編寫了,直接從業(yè)務(wù)層開始
// 修改購物車商品數(shù)量的方法@Overridepublic void updateQuantity(CartUpdateDTO cartUpdateDTO) {// 持久層中已經(jīng)包含了修改數(shù)量的方法,但是參數(shù)是OmsCart// 將本方法的cartUpdateDTO參數(shù)值賦值給OmsCart再調(diào)用持久層方法即可OmsCart omsCart=new OmsCart();BeanUtils.copyProperties(cartUpdateDTO,omsCart);// 調(diào)用持久層實施修改omsCartMapper.updateQuantityById(omsCart);}
控制層OmsCartController
// 修改購物車數(shù)量@PostMapping(“/update/quantity”)@ApiOperation(“修改購物車數(shù)量”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult updateQuantity(@Validated CartUpdateDTO cartUpdateDTO){omsCartService.updateQuantity(cartUpdateDTO);return JsonResult.ok(“修改完成”);}
重啟order測試清空和修改購物車數(shù)量的功能
學(xué)習(xí)記錄,如有侵權(quán)請聯(lián)系刪除