Demo购物车

新增sku到购物车

上次课我们开发到了显示商品详情

有点击”添加到购物车”的按钮

但是没有反应,我们完成添加购物车的功能就能实现这个效果了

打开mall-order-webapi模块

业务逻辑中一些基本的注意事项

  • * 判断用户是否登录,只有登录后才能将商品新增到购物车
  • * 验证购物车信息的完整性
  • * 业务逻辑层要判断新增的sku是否在当前用户的购物车表中已经存在
  • * 如果不存在是新增sku流程
  • * 如果已经存在,是修改数量的流程

开发持久

持久层要按上面分析的业务逻辑,开发多个方法

  • 判断当前登录用户购物车中是否包含指定skuid商品的方法
  • 新增sku到购物车表中
  • 修改购物车指定sku数量的方法
  • mapper包创建OmsCartMapper接口,编写代码如下

    @Repositorypublic interface OmsCartMapper {// 判断当前用户的购物车列表中是否包含指定sku商品的方法OmsCart selectExistsCart(@Param(“userId”) Long userId,@Param(“skuId”) Long skuId);// 新增商品到购物车表中void saveCart(OmsCart omsCart);// 修改指定购物车商品的数量的方法void updateQuantityById(OmsCart omsCart);}

    对应的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}

    开发业务逻辑层

    创建OmsCartServiceImpl类实现IOmsCartService接口

    实现其中方法,先实现新增购物车的方法即可

    需要注意,我们在业务逻辑层中需要使用用户的信息

    要单独编写一个方法获取用户信息,

    @Servicepublic class OmsCartServiceImpl implements IOmsCartService {@Autowiredprivate OmsCartMapper omsCartMapper;@Overridepublic void addCart(CartAddDTO cartDTO) {// 获取当前登录用户的userIdLong userId=getUserId();// 查询这个userId的用户是否已经将指定的sku添加到购物车OmsCart omsCart=omsCartMapper.selectExistsCart(userId,cartDTO.getSkuId());// 判断查询结果是否为nullif(omsCart!=null){// 不等于null,表示当前用户这个sku已经添加在购物车列表中// 我们需要做的就是修改它的数量,根据cartDTO对象的quantity属性值添加omsCart.setQuantity(omsCart.getQuantity()+cartDTO.getQuantity());// 调用持久层方法修改数量omsCartMapper.updateQuantityById(omsCart);}else{// 如果omsCart是null 会运行else代码块// 去完成购物车对象的新增,先实例化OmsCart对象OmsCart newOmsCart=new OmsCart();// 将参数cartDTO的同名属性赋值给newOmsCartBeanUtils.copyProperties(cartDTO,newOmsCart);// cartDTO对象中没有userId属性,需要单独赋newOmsCart.setUserId(userId);// 执行新增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) {}// 业务逻辑层获得用户信息的方法,因为多个方法需要获得用户信息,所以单独编写一个方法// 这个方法的实现是SpringSecurity提供的登录用户的容器// 方法的目标是获得SpringSecurity用户容器,从容器中获得用户信息public CsmallAuthenticationInfo getUserInfo(){// 获得SpringSecurity容器对象UsernamePasswordAuthenticationToken authenticationToken=(UsernamePasswordAuthenticationToken)SecurityContextHolder.getContext().getAuthentication();// 判断获取的容器信息是否为空if(authenticationToken!=null){// 如果容器中有内容,证明当前容器中有登录用户信息// 我们获取这个用户信息并返回CsmallAuthenticationInfo csmallAuthenticationInfo=(CsmallAuthenticationInfo)authenticationToken.getCredentials();return csmallAuthenticationInfo;}throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,”没有登录信息”);}// 业务逻辑层中大多数方法都是获得用户id,所以编写一个返回用户id的方法public Long getUserId(){return getUserInfo().getId();}}

    开发控制层

    创建OmsCartController

    @RestController@RequestMapping(“/oms/cart”)@Api(tags = “购物车管理模块”)public class OmsCartController {@Autowiredprivate IOmsCartService omsCartService;// 新增购物车信息的控制层方法@PostMapping(“/add”)@ApiOperation(“新增购物车信息”)// 判断当前用户是否具有普通用户权限ROLE_user// sso模块登录时,会在用户的权限列表中添加ROLE_user权限@PreAuthorize(“hasRole(‘ROLE_user’)”)// cartAddDTO参数是需要经过SpringValidation框架验证的// @Validated就是激活框架验证功能,如果cartAddDTO不满足验证要求,会自动运行// 统一由异常处理类中的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 然后复制JWT

    转到10005 order模块 文档管理->全局参数设置->添加参数

    参数名:Authorization

    参数值:Bearer [粘贴JWT]

    然后刷新当前10005的界面

    然后进行发送请求即可成功!

    javax.xml.bindjaxb-api2.3.0

    SpringSecurity验证规则

    SpringSecurity框架登录后,一定会有一个权限列表

    在userDetails对象中

    我们登录用户的这个对象的值可能是

    {“authorities”:[“ROLE_user”],”id”:1,”userType”:”USER”,”username”:”jackson”}

    sso模块前台用户登录时,会authorities属性中添加ROLE_user权限

    而后台管理用户登录时会向authorities属性中添加下面属性

    [“/pms/product/read”,”/pms/product/update”,”/pms/product/delete”]

    所以想要在控制器运行前判断权限时就可以使用下面的写法

    @PreAuthorize(“hasAuthority(‘ROLE_user’)”)

    hasRole判断是专用于判断当前用户角色的指令

    hasRole会自动在我们判断的内容前添加ROLE_

    @PreAuthorize(“hasRole(‘ROLE_user’)”)

    开发查询购物车功能

    开发持久层

    OmsCartMapper添加方法如下

    // 根据当前用户id查询购物车列表List selectCartsByUserId(Long userId);

    OmsCartMapper.xml添加对应内容

    selectfromoms_cartwhereuser_id=#{id}

    开发业务逻辑层

    OmsCartServiceImpl业务实现

    返回值支持分页结果,按分页条件查询

    // 根据用户id分页查询当前用户的购物车列表@Overridepublic JsonPage listCarts(Integer page, Integer pageSize) {// 获得用户idLong userId=getUserId();// 执行查询前设置分页条件PageHelper.startPage(page,pageSize);// 执行分页查询List list=omsCartMapper.selectCartsByUserId(userId);// 实例化PageInfo对象获得分页信息后将它转换为JsonPage返回return JsonPage.restPage(new PageInfo(list));}

    下面开发控制层,调用方法进行测试

    OmsCartController添加方法如下

    // 分页查询当前用户购物车中的信息@GetMapping(“/list”)@ApiOperation(“分页查询当前用户购物车中的信息”)@ApiImplicitParams({@ApiImplicitParam(value = “页码”,name = “page”,dataType = “int”,example = “1”),@ApiImplicitParam(value = “每页条数”,name = “pageSize”,dataType = “int”,example = “5”)}) @PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult listCartByPage( // 当控制器参数可能为空,当空时,我们要给它赋默认值时,可以用下面的格式 @RequestParam(required = false,defaultValue = WebConsts.DEFAULT_PAGE) Integer page, @RequestParam(required = false,defaultValue = WebConsts.DEFAULT_PAGE_SIZE)Integer pageSize){ // 控制层调用业务逻辑层代码 JsonPage jsonPage=omsCartService.listCarts(page,pageSize); return JsonResult.ok(jsonPage);}

    启动nacosseata

    启动leafssoorder模块

    测试http://localhost:10005/doc.html

    删除清空购物车

    删除购物车的持久层

    我们删除购物车的功能支持同时删除一个或多个购物车中的商品

    基本思路就是将一个要删除的购物车商品的id数组传入到Mapper中进行删除

    在OmsCartMapper接口中添加放方法

    // 根据购物车的id删除商品(支持删除多个商品)int deleteCartsByIds(Long[] ids);

    对应的mapper.xml

    delete fromoms_cartwhereid in#{id}

    删除购物车的业务逻辑层

    OmsCartServiceImpl添加方法

    // 按ids数组中的id值删除cart表中信息@Overridepublic void removeCart(Long[] ids) {// 删除是包含返回值的int rows=omsCartMapper.deleteCartsByIds(ids);if(rows==0){throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,”购物车中没有您要删除的商品”);}}

    开发控制层代码

    OmsCartController

    @PostMapping(“/delete”)@ApiOperation(“根据用户选择的购物车商品删除(支持批量)”)@ApiImplicitParam(value = “删除购物车的id”,name=”ids”,required = true,dataType = “array”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult removeCartsByIds(Long[] ids){omsCartService.removeCart(ids);return JsonResult.ok();}

    开发清空当前登录用户购物车的功能

    delete fromoms_cartwhereuser_id=#{userId}@Overridepublic void removeAllCarts() {}

    清空购物车功能

    Mapper接口

    // 删除当前用户购物车中所有内容int deleteCartsByUserId(Long userId);

    mapper.xml

    delete fromoms_cartwhereuser_id=#{userId}

    OmsCartServiceImpl

    // 清空当前登录用户购物车@Overridepublic void removeAllCarts() {Long userId=getUserId();int rows=omsCartMapper.deleteCartsByUserId(userId);if(rows==0){throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,”您的购物车中没有商品”);}}

    OmsCartController

    // 根据用户id清空购物车@PostMapping(“/delete/all”)@ApiOperation(“根据用户id清空购物车”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult removeCartsByUserId(){omsCartService.removeAllCarts();;return JsonResult.ok(“购物车已清空”);}

    修改购物车商品数量

    开发业务逻辑层

    因为前面我们已经完成了修改购物车数量的持久层,所以不需要再编写了,直接从业务层开始

    // 修改购物车商品数量的方法@Overridepublic void updateQuantity(CartUpdateDTO cartUpdateDTO) {// 持久层中已经包含了修改数量的方法,但是参数是OmsCart// 将本方法的cartUpdateDTO参数值赋值给OmsCart再调用持久层方法即可OmsCart omsCart=new OmsCart();BeanUtils.copyProperties(cartUpdateDTO,omsCart);// 调用持久层实施修改omsCartMapper.updateQuantityById(omsCart);}

    控制层OmsCartController

    // 修改购物车数量@PostMapping(“/update/quantity”)@ApiOperation(“修改购物车数量”)@PreAuthorize(“hasRole(‘ROLE_user’)”)public JsonResult updateQuantity(@Validated CartUpdateDTO cartUpdateDTO){omsCartService.updateQuantity(cartUpdateDTO);return JsonResult.ok(“修改完成”);}

    重启order测试清空和修改购物车数量的功能

    学习记录,如有侵权请联系删除

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年7月18日
    下一篇 2022年7月18日

    相关推荐

    • OPPO Reno8 Pro明日开售 看完决定买不买

      6月11日(即明天)上午10点,OPPO Reno8 Pro即将正式开售,届时预定了该机的用户也会陆续收到发货。凭借下放的马里亚纳 MariSilicon X影像专用NPU搭配全球…

      2022年6月13日
    • 《原神》怎么阻止无相草复苏 无相之草净化方法

      抽到小草神的小伙伴想必正在疯狂的蹂躏无相草,那么怎么阻止无相草复苏?下面就由小编给大家带来无相之草净化方法,希望能给大家带来帮助。 原神无相之草净化方法 【净化方法】 当无相之草,…

      2022年11月4日
    • ModuleNotFoundError: No module named通俗的解释和方法

      阿刁是一个自动化测试用例,从一出生他就被赋予终生使命,去测试一个叫登录的过程是否合理。他一直就被关在一个小黑屋里面,从来也没有出去过,小黑屋里还被关着其他的同胞,他们身上都捆着两个…

      2022年7月21日
    • 社交梦不息,微软又做了一款很像脸书的新玩意

      社交无疑是互联网行业中最为璀璨的一颗明珠,并且一直以来也吸引了无数巨头参与其中。在国内市场,阿里、百度、字节跳动等等大厂,千方百计地试图撬动腾讯的“社交帝国”,而在海外,微软方面更…

      2022年7月22日
    • 苹果曝出重大安全漏洞,黑客或可完全接管苹果设备

      当地时间8月19日(周五),苹果公司(Apple)呼吁用户立刻下载最新更新。就在两天前,该公司报告了一个重大的安全漏洞,据称可以让黑客接管苹果设备。 这一消息将影响除个别地区以外的…

      2022年8月24日
    • “熔”“合”创新 推动数字健康产业发展

      6月24日,在以“熔·合-激发医疗生产力”为主题的Winning World 2022(卫宁健康用户大会)上,深信服副总裁裘波发表了《新一代卫信云:推动数字健康产业发展》的主题演讲…

      2022年6月28日
    • 健康护肤,睡眠也是很重要的“护肤”方法……

      健康护肤,在睡眠中让肌肤变的更美丽。 1.为什么睡眠不足会对肌肤产生不好的影响。 人在白天活动期间,细胞集中在脑部,不能到达肌肤,晚上睡觉时,脑处于休息状态,血液就会集中到肌肤和内…

      2022年8月15日
    • 将物质雕刻成复杂形状的简单方法

      在附图中,扭曲的光照射到移动的BEC上,将其分解成BEC液滴簇,这些液滴跟随光的特征移动。来源:斯特拉斯克莱德大学 一种使用“扭曲”光将物质塑造成复杂形状的新方法已经在斯特拉斯克莱…

      2022年8月17日
    • 中国科学论文数量超美国居世界第一

      日本文部科学省下属的一家研究所星期二(8月9日)发布的一份报告称,中国在自然科学领域发表的论文数量上已经超过美国,跃居世界第一位,紧随美中之后的是德国。与此同时,中国在科研经费方面…

      2022年8月13日
    • 最具潜在破坏力小行星接近地球!是否会威胁人类安全?

      最近,美国国家航空航天局(NASA)近地天体研究中心消息称,一颗名为7335(1989 JA)的小行星将于5月27日与地球“擦肩而过”。它将是今年接近地球的小行星中,最大也是“最具…

      2022年8月15日

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息