日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSD-2204-(业务逻辑开发)-发酷鲨商城front模块-开发购物车功能-Day09

發布時間:2023/12/20 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSD-2204-(业务逻辑开发)-发酷鲨商城front模块-开发购物车功能-Day09 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.開發酷鯊商城front模塊

1.1按分類id查詢spu列表

用戶會根據分類樹中的分類的名稱,查詢它需要的商品類別

點擊商品分類名稱時,實際上我們獲得了它的分類id(categoryId)

我們可以根據這個id到pms_spu表中查詢商品信息

并進行分頁顯示

這個查詢目標仍然為mall-pms數據庫,是product模塊管理的范圍

所以我們在業務邏輯層中編寫利用dubbo調用即可,還是不需要寫mapper

下面就在業務邏輯層中創建FrontProductServiceImpl

@Service @Slf4j public class FrontProductServiceImpl implements IFrontProductService {@DubboReferenceprivate IForFrontSpuService dubboSpuService;@Overridepublic JsonPage<SpuListItemVO> listSpuByCategoryId(Long categoryId, Integer page, Integer pageSize) {// IForFrontSpuService實現類中已經完成了分頁查詢的細節,我們直接調用即可JsonPage<SpuListItemVO> list=dubboSpuService.listSpuByCategoryId(categoryId,page,pageSize);// 返回 list!!!return list;}@Overridepublic SpuStandardVO getFrontSpuById(Long id) {return null;}@Overridepublic List<SkuStandardVO> getFrontSkusBySpuId(Long spuId) {return null;}@Overridepublic SpuDetailStandardVO getSpuDetail(Long spuId) {return null;}@Overridepublic List<AttributeStandardVO> getSpuAttributesBySpuId(Long spuId) {return null;} }

業務邏輯層實現類先只實現按分類id分頁查詢的功能即可

創建FrontSpuController編寫調用代碼如下

@RestController @RequestMapping("/front/spu") @Api(tags = "前臺商品spu模塊") public class FrontSpuController {@Autowiredprivate IFrontProductService frontProductService;// localhost:10004/front/spu/list/3@GetMapping("/list/{categoryId}")@ApiOperation("根據分類id分頁查詢spu列表")@ApiImplicitParams({@ApiImplicitParam(value = "分類id",name="categoryId",example = "3",required = true,dataType = "long"),@ApiImplicitParam(value = "頁碼",name="page",example = "1",required = true,dataType = "int"),@ApiImplicitParam(value = "每頁條數",name="pageSize",example = "2",required = true,dataType = "int")})public JsonResult<JsonPage<SpuListItemVO>> listSpuByPage(@PathVariable Long categoryId, Integer page,Integer pageSize){JsonPage<SpuListItemVO> jsonPage=frontProductService.listSpuByCategoryId(categoryId,page,pageSize);return JsonResult.ok(jsonPage);}}

然后在Nacos\Seata\Redis啟動的前提下

順序啟動Product\Front

進行測試

http://localhost:10004/doc.html

1.2實現查詢商品詳情頁

上面章節完成了查詢spu列表

在商品列表中選中商品后,會顯示這個商品的詳情信息

商品詳情頁我們需要顯示的信息包括

  • 根據spuId查詢spu信息
  • 根據spuId查詢spuDetail詳情
  • 根據spuId查詢當前Spu包含的所有屬性
  • 根據spuId查詢對應的sku列表

繼續編寫FrontProductServiceImpl其他沒有實現的方法

@Service @Slf4j public class FrontProductServiceImpl implements IFrontProductService {@DubboReferenceprivate IForFrontSpuService dubboSpuService;// 消費skuService的相關服務:根據spuId查詢sku列表@DubboReferenceprivate IForFrontSkuService dubboSkuService;// 消費指定商品查詢所有參數選項的相關服務:根據spuId查詢參數列表@DubboReferenceprivate IForFrontAttributeService dubboAttributeService;@Overridepublic JsonPage<SpuListItemVO> listSpuByCategoryId(Long categoryId, Integer page, Integer pageSize) {// IForFrontSpuService實現類中已經完成了分頁查詢的細節,我們直接調用即可JsonPage<SpuListItemVO> list=dubboSpuService.listSpuByCategoryId(categoryId,page,pageSize);// 返回 list!!!return list;}// 根據spuId查詢Spu對象信息@Overridepublic SpuStandardVO getFrontSpuById(Long id) {//SpuStandardVO是標準的查詢spu的返回值SpuStandardVO spuStandardVO=dubboSpuService.getSpuById(id);return spuStandardVO;}// 根據SpuId查詢sku列表@Overridepublic List<SkuStandardVO> getFrontSkusBySpuId(Long spuId) {// SkuStandardVO是標準的查詢sku的返回值List<SkuStandardVO> list=dubboSkuService.getSkusBySpuId(spuId);return list;}// 根據spuId查詢spuDetail對象@Overridepublic SpuDetailStandardVO getSpuDetail(Long spuId) {SpuDetailStandardVO spuDetailStandardVO=dubboSpuService.getSpuDetailById(spuId);return spuDetailStandardVO;}// 根據spuId查詢當前商品所有參數列表@Overridepublic List<AttributeStandardVO> getSpuAttributesBySpuId(Long spuId) {List<AttributeStandardVO> list=dubboAttributeService.getSpuAttributesBySpuId(spuId);return list;} }

其中根據spuId查詢所有對應屬性的功能,是需要多表聯查實現的

根據spuId查詢參數選項的思路

1.根據spu_id去pms_spu表查詢category_id

2.根據category_id去pms_category表查詢分類對象

3.根據category_id去pms_category_attribute_template表查詢attribute_template_id

4.根據attribute_template_id去pms_attribute_template表查詢attribute_template數據行

5.根據attribute_template_id去pms_attribute表查詢對應所有屬性信息行

實際上,上面的聯表查詢可以簡化為3表聯查,結果相同

SELECT pa.id, pa.template_id, pa.name,pa.description, pa.type,pa.value_list, pa.unit FROM pms_spu ps JOIN pms_category pc ON ps.category_id=pc.id JOIN pms_category_attribute_template pcat ONpc.id=pcat.category_id JOIN pms_attribute_template pat ON pcat.attribute_template_id= pat.id JOIN pms_attribute pa ON pa.template_id=pat.id WHERE ps.id=1

業務邏輯層正常調用

FrontSpuController添加兩個方法

  • 根據spuId查詢spu詳情
  • 根據spuId查詢參數列表的
@RestController @RequestMapping("/front/spu") @Api(tags = "前臺商品spu模塊") public class FrontSpuController {@Autowiredprivate IFrontProductService frontProductService;// localhost:10004/front/spu/list/3@GetMapping("/list/{categoryId}")@ApiOperation("根據分類id分頁查詢spu列表")@ApiImplicitParams({@ApiImplicitParam(value = "分類id",name="categoryId",example = "3",required = true,dataType = "long"),@ApiImplicitParam(value = "頁碼",name="page",example = "1",required = true,dataType = "int"),@ApiImplicitParam(value = "每頁條數",name="pageSize",example = "2",required = true,dataType = "int")})public JsonResult<JsonPage<SpuListItemVO>> listSpuByPage(@PathVariable Long categoryId, Integer page,Integer pageSize){JsonPage<SpuListItemVO> jsonPage=frontProductService.listSpuByCategoryId(categoryId,page,pageSize);return JsonResult.ok(jsonPage);}// 根據spuId查詢spu信息// localhost:10004/front/spu/1@GetMapping("/{spuId}")@ApiOperation("根據spuId查詢spu信息")@ApiImplicitParam(value = "spuId",name="spuId",example = "1",required = true,dataType = "long")public JsonResult<SpuStandardVO> getFrontSpuById(@PathVariable Long spuId){SpuStandardVO spuStandardVO=frontProductService.getFrontSpuById(spuId);return JsonResult.ok(spuStandardVO);}// 根據spuId查詢所有參數選項@GetMapping("/template/{id}")@ApiOperation("根據spuId查詢所有參數選項")@ApiImplicitParam(value = "spuId",name="id",example = "1",required = true,dataType = "long")public JsonResult<List<AttributeStandardVO>> getAttributesBySpuId(@PathVariable Long id){List<AttributeStandardVO> list=frontProductService.getSpuAttributesBySpuId(id);return JsonResult.ok(list);}}

創建FrontSkuController添加一個方法

  • 根據spuId查詢sku列表
@RestController @RequestMapping("/front/sku") @Api(tags="商品前臺sku模塊") public class FrontSkuController {@Autowiredprivate IFrontProductService frontProductService;// 根據spuId查詢sku列表// localhost:10004/front/sku/1@GetMapping("/{spuId}")@ApiOperation("根據spuId查詢sku列表")@ApiImplicitParam(value = "spuId",name="spuId",example = "1",required = true,dataType = "long")public JsonResult<List<SkuStandardVO>> getSkuListBySpuId(@PathVariable Long spuId){List<SkuStandardVO> list=frontProductService.getFrontSkusBySpuId(spuId);return JsonResult.ok(list);}}

FrontSpuDetailController添加一個方法

  • 根據spuId查詢spuDetail
@RestController @RequestMapping("/front/spu/detail") @Api(tags = "前臺spuDetail模塊") public class FrontSpuDetailController {@Autowiredprivate IFrontProductService frontProductService;// 根據spuId查詢spuDetail信息@GetMapping("/{spuId}")@ApiOperation("根據spuId查詢spuDetail信息")@ApiImplicitParam(value = "spuId",name = "spuId",example = "1",required = true,dataType = "long")public JsonResult<SpuDetailStandardVO> getSpuDetailBySpuId(@PathVariable Long spuId){SpuDetailStandardVO spuDetailStandardVO=frontProductService.getSpuDetail(spuId);return JsonResult.ok(spuDetailStandardVO);}}

nacos\seata\redis保持啟動

啟動product?重起front

訪問10004測試

2.登錄流程回顧

2.1用戶\角色\權限

用戶是一個基本的單位

我們登錄時都是在登錄用戶的

我們再登錄后需要明確這個用戶具有哪些角色

用戶和角色的關系是多對多

用戶是一張表,角色也是一張表,因為它們是多對多的關系所以要有一張保存用戶和角色關系的中間表

角色也不能直接決定這個用戶能做什么操作,有哪些權限

需要再關聯權限表決定

角色和權限也是多對多的關系,也要有中間表

如果項目開發的權限比較全面,可能會出現臨時用戶權限關系表

2.2Spring Security

Spring Security框架用于實現登錄,內置加密,驗證,放行等各種功能,可靠性強

同時還可以將當前登錄用戶的信息保存

特別的,對于用戶具備的權限,有特殊的管理

在控制器運行前,可以使用注解來判斷當前登錄用戶是否具備某個權限

@PreAuthorize("[權限名稱]")

SpringSecurity在運行該方法之前進行核查

如果不具備這個權限會返回403狀態碼

2.3關于單點登錄

2.3.1普通登錄的問題

SSO是單點登錄的縮寫

微服務架構下,要解決單點登錄實現會話保持的問題

首先我們分析一下普通登錄和微服務登錄的區別

先是單體項目登錄之后的操作流程

主要依靠服務器的session保存用戶信息

客戶端發請求時,將sessionid同時發往服務器,根據sessionid就能確認用戶身份

分布式或微服務項目中,服務器不再只有一個

那么就會出現下面的問題

上面的圖片,表示我們在微服務系統中登錄時遇到的問題

我們在用戶模塊中登錄,只是將用戶信息保存在用戶模塊的session中

而這個session不會和其他模塊共享

所以在我們訪問購物車模塊或其他模塊時,通過sessionid并不能獲得在用戶模塊中登錄成功的信息

這樣就丟失的用戶信息,不能完成業務

市面上現在大多使用JWT來實現微服務架構下的會話保持

也就是在一個服務器上登錄成功后,微服務的其他模塊也能識別用戶的登錄信息

這個技術就是單點登錄

2.4單點登錄解決方案

2.4.1Session共享

Session共享是能夠實現單點登錄效果的

這種方式的核心思想是將用戶的登錄信息共享給其他模塊

適用于小型的,用戶量不大的微服務項目

將登錄成功的用戶信息共享給Redis

其他模塊根據sessionId獲得Redis中保存的用戶信息即可

  • 這樣做最大的缺點就是內存嚴重冗余,不適合大量用戶的微服務項目

JWT單點登錄

token令牌

Json Web Token

這種登錄方式,最大的優點就是不占用內存

生成的JWT由客戶端自己保存,不占用服務器內存

在需要表明自己用戶身份\信息時,將JWT信息保存到請求頭中發送請求即可

2.3.2Jwt登錄流程圖

SSO(Single Sign On):單點登錄

2.4開發購物車功能

2.4.1新增sku到購物車

我們開發完成了顯示商品詳情的功能

可以通過選中具體規格之后確定要購買的sku信息

再點擊"添加到購物車"按鈕

就應該將選中的sku的信息保存在購物車中

打開mall-order-webapi模塊

創建mapper\service.impl\controller包

當前mall-order模塊,管理的數據庫是mall-oms數據庫

業務邏輯分析

  • 判斷用戶是否登錄,只有登錄后才能將商品新增到購物車
  • 驗證購物車信息的完整性(SpringValidation)
  • 業務邏輯層要判斷新增的sku是否在當前用戶的購物車表中已經存在
    • 如果不存在是新增sku流程
    • 如果已經存在,是修改數量的流程

2.4.2開發持久層

持久層要按上面分析的業務邏輯,開發多個方法

1.判斷當前登錄用戶購物車中是否包含指定skuid商品的方法

2.新增sku到購物車表中

3.修改購物車指定sku數量的方法

在mapper包中創建OmsCartMapper接口,編寫代碼如下

@Repository public interface OmsCartMapper {// 判斷當前用戶的購物車中是否已經包含指定商品的skuOmsCart selectExistsCart(@Param("userId") Long userId,@Param("skuId") Long skuId);// 新增sku信息到購物車int saveCart(OmsCart omsCart);// 修改購物車中sku的數量int updateQuantityById(OmsCart omsCart);}

對應的OmsCartMapper.xml文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cn.tedu.mall.order.mapper.OmsCartMapper"><!-- 通用查詢映射結果 --><resultMap id="BaseResultMap" type="cn.tedu.mall.pojo.order.model.OmsCart"><id column="id" property="id" /><result column="user_id" property="userId" /><result column="sku_id" property="skuId" /><result column="title" property="title" /><result column="main_picture" property="mainPicture" /><result column="price" property="price" /><result column="quantity" property="quantity" /><result column="gmt_create" property="gmtCreate" /><result column="gmt_modified" property="gmtModified" /><result column="bar_code" property="barCode"/><result column="data" property="data"/></resultMap><!-- 定義查詢時所有列名的sql片段 --><sql id="SimpleQueryFields"><if test="true">id,user_id,sku_id,title,main_picture,price,quantity,gmt_create,gmt_modified</if></sql><!-- 判斷當前用戶的購物車中是否已經包含指定商品的sku --><select id="selectExistsCart" resultMap="BaseResultMap">select<include refid="SimpleQueryFields"/>fromoms_cartwhereuser_id=#{userId}andsku_id=#{skuId}</select><!-- 新增購物車中sku的信息 --><insert id="saveCart" useGeneratedKeys="true" keyProperty="id" >insert into oms_cart(user_id,sku_id,title,main_picture,price,quantity) values(#{userId},#{skuId},#{title},#{mainPicture},#{price},#{quantity})</insert><!-- 修改購物車中sku的數量 --><update id="updateQuantityById">updateoms_cartsetquantity=#{quantity}whereid=#{id}</update> </mapper>

2.4.3開發業務邏輯層

創建OmsCartServiceImpl類實現IOmsCartService接口

實現其中方法,先實現新增購物車的方法即可

在編寫業務邏輯層具體代碼前,先在該類中編寫一個從SpringSecurity上下文中獲取用戶信息的方法

隨筆

楊過?學生?簽到

尹志平?班主任?考勤管理

小龍女?授課老師?課程管理

張無忌?年級組長?考試管理

張三豐?校長?課表管理

??學生管理

??教師管理

總結

以上是生活随笔為你收集整理的JSD-2204-(业务逻辑开发)-发酷鲨商城front模块-开发购物车功能-Day09的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。