• SpringBoot电商项目之实现购物车功能


    目录

    一、自定义的参数解析器

    在使用自定义的参数解析器之前的做法:

    使用自定义的参数解析器之后的做法:

    二、购物车后台

    1.定义购物车对象ShopCar

     2.web层定义ShopCarController.java

    三、商品详情页面实现

    四、购物车查询以及新增的前台

    五、购物车删除功能和修改功能

    删除

    修改


    上节内容完成了首页以及登录的功能,登录之后弹出“OK”提示,忘记实现自动跳页面了,这里先继续简单完善一下,比较简单:

     login.js:

     再次去登录成功之后就会自动跳转回主页并且绑定了用户名:

    OK,进入今日主题:

    一、自定义的参数解析器

    在使用自定义的参数解析器之前的做法:

    shopCarController :

    1. package com.ycx.spbootpro.controller;
    2. import com.ycx.spbootpro.exception.BusinessException;
    3. import com.ycx.spbootpro.model.User;
    4. import com.ycx.spbootpro.service.IRedisService;
    5. import com.ycx.spbootpro.utils.JsonResponseBody;
    6. import com.ycx.spbootpro.utils.JsonResponseStatus;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.CookieValue;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import org.springframework.web.bind.annotation.RestController;
    11. /**
    12. * @author 杨总
    13. * @create 2022-11-07 18:28
    14. */
    15. @RestController
    16. @RequestMapping("/shopCar")
    17. public class shopCarController {
    18. @Autowired
    19. private IRedisService redisService;
    20. /**
    21. * 使用参数解析器之前的做法 弊端:
    22. * 在每一个需要登录之后才能操作的功能,都需要做用户登录验证,即以下代码都需要再写一遍
    23. * @param token
    24. * @return
    25. */
    26. @RequestMapping("/check")
    27. public JsonResponseBody check(@CookieValue("token") String token){
    28. if(token==null)
    29. throw new BusinessException(JsonResponseStatus.TOKEN_EEROR);
    30. User user=redisService.getUserByToken(token);
    31. if(user==null)
    32. throw new BusinessException(JsonResponseStatus.TOKEN_EEROR);
    33. return new JsonResponseBody();
    34. }
    35. }

     弊端:
         在每一个需要登录之后才能操作的功能,都需要做用户登录验证,即以下代码都需要再写一遍

    运行时,点击加入购物车

    会出现关于Mybatis-plus时间字段代码生成问题

     org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
     at [Source: (byte[])"{"@class":"com.zking.testspbootpro.model.User","nickname":"小胖","password":"6502cbf0ac7d357831536b119ff26d28","salt":"7ceff545c6944e5cb7da355ae6243939","registerDate":{"month":"DECEMBER","year":2021,"dayOfMonth":11,"hour":2,"minute":36,"monthValue":12,"nano":0,"second":56,"dayOfWeek":"SATURDAY","dayOfYear":345,"chronology":{"@class":"java.time.chrono.IsoChronology","id":"ISO","calendarType":"iso8601"}},"lastLoginDate":null,"loginCount":0}"; line: 1, column: 172] (through reference chain: com.zking.testspbootpro.model.User["registerDate"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
     at [Source: (byte[])"{"@class":"com.zking.testspbootpro.model.User","nickname":"小胖","password":"6502cbf0ac7d357831536b119ff26d28","salt":"7ceff545c6944e5cb7da355ae6243939","registerDate":{"month":"DECEMBER","year":2021,"dayOfMonth":11,"hour":2,"minute":36,"monthValue":12,"nano":0,"second":56,"dayOfWeek":"SATURDAY","dayOfYear":345,"chronology":{"@class":"java.time.chrono.IsoChronology","id":"ISO","calendarType":"iso8601"}},"lastLoginDate":null,"loginCount":0}"; line: 1, column: 172] (through reference chain: com.zking.testspbootpro.model.User["registerDate"])

     出现上述错误,原因是使用了lastLoginDate,去User.java类,将其改成java.util.Date;

    改完之后将redis中的数据以及cookie中的数据清空,再次登录测试;

     此外我们还要在User类里面添加一个id属性,因为后面有需要涉及到:

    1. package com.ycx.spbootpro.model;
    2. import com.baomidou.mybatisplus.annotation.TableName;
    3. import java.time.LocalDateTime;
    4. import java.io.Serializable;
    5. import java.util.Date;
    6. import lombok.Data;
    7. import lombok.EqualsAndHashCode;
    8. /**
    9. *

    10. * 用户信息表
    11. *

    12. *
    13. * @author yangzong
    14. * @since 2022-11-05
    15. */
    16. @Data
    17. @EqualsAndHashCode(callSuper = false)
    18. @TableName("t_user")
    19. public class User implements Serializable {
    20. private Long id;
    21. /**
    22. * 昵称
    23. */
    24. private String nickname;
    25. /**
    26. * MD5(MD5(pass明文+固定salt)+salt)
    27. */
    28. private String password;
    29. /**
    30. * 随机salt
    31. */
    32. private String salt;
    33. /**
    34. * 注册时间
    35. */
    36. private Date registerDate;
    37. /**
    38. * 最后一次登录时间
    39. */
    40. private Date lastLoginDate;
    41. /**
    42. * 登录次数
    43. */
    44. private Integer loginCount;
    45. }

     使用自定义的参数解析器之后的做法:

    shopCarController更改之后 :

    1. package com.ycx.spbootpro.controller;
    2. import com.ycx.spbootpro.exception.BusinessException;
    3. import com.ycx.spbootpro.model.User;
    4. import com.ycx.spbootpro.service.IRedisService;
    5. import com.ycx.spbootpro.utils.JsonResponseBody;
    6. import com.ycx.spbootpro.utils.JsonResponseStatus;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.CookieValue;
    9. import org.springframework.web.bind.annotation.RequestMapping;
    10. import org.springframework.web.bind.annotation.RestController;
    11. /**
    12. * @author 杨总
    13. * @create 2022-11-07 18:28
    14. */
    15. @RestController
    16. @RequestMapping("/shopCar")
    17. public class shopCarController {
    18. @Autowired
    19. private IRedisService redisService;
    20. @RequestMapping("/check")
    21. public JsonResponseBody check(User user){
    22. return new JsonResponseBody();
    23. }
    24. }

    UserArgumentResovler : 

    1. package com.ycx.spbootpro.config;
    2. import com.ycx.spbootpro.exception.BusinessException;
    3. import com.ycx.spbootpro.model.User;
    4. import com.ycx.spbootpro.service.IRedisService;
    5. import com.ycx.spbootpro.utils.CookieUtils;
    6. import com.ycx.spbootpro.utils.JsonResponseStatus;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.core.MethodParameter;
    9. import org.springframework.stereotype.Component;
    10. import org.springframework.web.bind.support.WebDataBinderFactory;
    11. import org.springframework.web.context.request.NativeWebRequest;
    12. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    13. import org.springframework.web.method.support.ModelAndViewContainer;
    14. import javax.servlet.http.HttpServletRequest;
    15. /**
    16. * @author 杨总
    17. * @create 2022-11-07 19:14
    18. *
    19. * 凡是实现HandlerMethodArgumentResolver接口的类都是参数解析器类
    20. */
    21. @Component
    22. public class UserArgumentResovler implements HandlerMethodArgumentResolver {
    23. @Autowired
    24. private IRedisService redisService;
    25. /**
    26. * supportsParameter方法的返回值,
    27. * true:则会调用下面resolveArgument
    28. * false:则不调用
    29. * @param methodParameter
    30. * @return
    31. */
    32. @Override
    33. public boolean supportsParameter(MethodParameter methodParameter) {
    34. return methodParameter.getParameterType() == User.class;
    35. }
    36. /**
    37. * resolveArgument:具体的业务代码处理
    38. * @param methodParameter
    39. * @param modelAndViewContainer
    40. * @param nativeWebRequest
    41. * @param webDataBinderFactory
    42. * @return
    43. * @throws Exception
    44. */
    45. @Override
    46. public Object resolveArgument(MethodParameter methodParameter,
    47. ModelAndViewContainer modelAndViewContainer,
    48. NativeWebRequest nativeWebRequest,
    49. WebDataBinderFactory webDataBinderFactory) throws Exception {
    50. HttpServletRequest request =(HttpServletRequest) nativeWebRequest.getNativeRequest();
    51. String token = CookieUtils.getCookieValue(request, "token");
    52. if(token==null)
    53. throw new BusinessException(JsonResponseStatus.TOKEN_EEROR);
    54. User user=redisService.getUserByToken(token);
    55. if(user==null)
    56. throw new BusinessException(JsonResponseStatus.TOKEN_EEROR);
    57. return user;
    58. }
    59. }

    WebConfig :

    1. package com.ycx.spbootpro.config;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    5. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    7. import java.util.List;
    8. /**
    9. * @author 杨总
    10. * @create 2022-11-07 19:37
    11. *
    12. * WebMvcConfigurer添加之后,会覆盖application.yml中静态资源映射
    13. * mvc:
    14. * static-path-pattern: /static/**
    15. */
    16. @Configuration
    17. public class WebConfig implements WebMvcConfigurer {
    18. @Autowired
    19. private UserArgumentResovler userArgumentResovler;
    20. /**
    21. * 将对应的解析器添加到配置中
    22. * 配置静态资源访问映射,使用了WebMvcConfigurer会覆盖原有的application.yml文件中的静态资源配置
    23. * @param registry
    24. */
    25. @Override
    26. public void addResourceHandlers(ResourceHandlerRegistry registry) {
    27. registry.addResourceHandler("/static/**")
    28. .addResourceLocations("classpath:/static/");
    29. }
    30. /**
    31. * 添加自定义的参数解析器
    32. * @param resolvers
    33. */
    34. @Override
    35. public void addArgumentResolvers(List resolvers) {
    36. resolvers.add(userArgumentResovler);
    37. }
    38. }


    测试:

     

     然后去进行登录之后,再点击去购物车:

    目前是404,因为queryShopCar页面还没有编写

     但是此时redis已经存在用户的值了(如下图):

    经过测试,我们会发现,凡是controller中的方法中包含参数User,都会进参数解析器UserArgumentResovler中的resolveArgument方法;这样一定程度下可以减少用户信息登录检验;

    当然,我们也可以通过拦截器、过滤器、aop等方式,来解决这一类问题。

    二、购物车后台

    购物车明细

     ShopCarItem :

    1. package com.ycx.spbootpro.model.vo;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import java.math.BigDecimal;
    6. import java.util.ArrayList;
    7. import java.util.List;
    8. /**
    9. * @author 杨总
    10. * @create 2022-11-07 22:01
    11. *
    12. * 购物车明细
    13. */
    14. @Data
    15. @NoArgsConstructor
    16. @AllArgsConstructor
    17. public class ShopCarItem {
    18. private Long gid;//商品id
    19. private String goodsName;//名称
    20. private String goodsImg;//图片
    21. private BigDecimal goodsPrice;//价格
    22. private Integer quantity;//数量
    23. /**
    24. * 这是个虚拟方法,用于计算商品的小计
    25. * 公式:商品的单价*数量=小计
    26. * @return
    27. */
    28. public BigDecimal smalltotal(){
    29. BigDecimal num=new BigDecimal(quantity);
    30. return goodsPrice.multiply(num);
    31. }
    32. }

    1.定义购物车对象ShopCar

    1.1购物车中商品集合
    定义购物车商品详情对象ShopCarItem
    商品ID/商品名称/商品单价/商品图片/商品数量/小计计算方法
    1.2加入购物车
    1.3删除购物车中指定商品
    1.4更新购物车中商品数量
    1.5清空购物车
    1.6总价计算

    1. package com.ycx.spbootpro.model.vo;
    2. import java.math.BigDecimal;
    3. import java.util.ArrayList;
    4. import java.util.Arrays;
    5. import java.util.List;
    6. import java.util.ListIterator;
    7. /**
    8. * @author 杨总
    9. * @create 2022-11-07 22:00
    10. *
    11. * vo:view object
    12. *
    13. * 购物车对象
    14. */
    15. public class ShopCar {
    16. // 1.1购物车中商品集合
    17. private List<ShopCarItem> items=new ArrayList<>();
    18. public List<ShopCarItem> getItems() {
    19. return items;
    20. }
    21. public void setItems(List items) {
    22. this.items = items;
    23. }
    24. // 1.2加入购物车(增加)
    25. public void add(ShopCarItem shopCarItem) {
    26. //循环遍历购物车集合
    27. for (ShopCarItem item : items) {
    28. //判断加入购物车中的商品ID与购物车中的商品ID是否一致
    29. if (item.getGid().equals(shopCarItem.getGid()+"")) {
    30. //获取购物车中原有商品的数量,再进行+1
    31. Integer num = item.getQuantity();
    32. item.setQuantity(num + 1);
    33. // item.setQuantity(item.getQuantity()+1);
    34. return;
    35. }
    36. }
    37. //加入购物车
    38. items.add(shopCarItem);
    39. }
    40. // 1.3删除购物车中指定商品(删除)
    41. public void delete(String gids) {
    42. //将gids分割后转换成List集合
    43. List<String> ids = Arrays.asList(gids.split(","));
    44. //获取商品集合迭代器对象
    45. ListIterator<ShopCarItem> it = items.listIterator();
    46. //循环遍历迭代器
    47. while (it.hasNext()) {
    48. //获取迭代器元素并移动下标
    49. ShopCarItem shopCarItem = it.next();
    50. //判断购物车中的商品ID是否在被删除商品的ID集合中
    51. if (ids.contains(shopCarItem.getGid() + "")) {
    52. //删除商品
    53. it.remove();
    54. }
    55. }
    56. }
    57. // 1.4更新购物车中商品数量(修改)
    58. public void update(ShopCarItem shopCarItem) {
    59. //循环遍历购物车集合
    60. for (ShopCarItem item : items) {
    61. //判断加入购物车中的商品ID与购物车中的商品ID是否一致
    62. if (item.getGid().equals(shopCarItem.getGid())) {
    63. //将更新的商品数量覆盖购物车中对应商品的数量
    64. item.setQuantity(shopCarItem.getQuantity());
    65. break;
    66. }
    67. }
    68. }
    69. // 1.5清空购物车
    70. public void clear() {
    71. items.clear();
    72. }
    73. // 1.6总价计算
    74. public BigDecimal total() {
    75. BigDecimal total = new BigDecimal(0);
    76. for (ShopCarItem item : items) {
    77. total = total.add(item.smalltotal());
    78. }
    79. return total;
    80. }
    81. }

      2.web层定义ShopCarController.java

    1) 从session中获取购物车对象ShopCar
    注:根据当前登陆用户ID绑定购物车,确保一人一车
    2) 加入购物车方法
    3) 查询购物车商品方法
    4) 删除购物车指定商品方法
    5) 更新购物车商品数量方法

    1. package com.ycx.spbootpro.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.ycx.spbootpro.exception.BusinessException;
    4. import com.ycx.spbootpro.model.Goods;
    5. import com.ycx.spbootpro.model.User;
    6. import com.ycx.spbootpro.model.vo.ShopCar;
    7. import com.ycx.spbootpro.model.vo.ShopCarItem;
    8. import com.ycx.spbootpro.service.IGoodsService;
    9. import com.ycx.spbootpro.service.IRedisService;
    10. import com.ycx.spbootpro.utils.JsonResponseBody;
    11. import com.ycx.spbootpro.utils.JsonResponseStatus;
    12. import org.springframework.beans.factory.annotation.Autowired;
    13. import org.springframework.stereotype.Controller;
    14. import org.springframework.web.bind.annotation.CookieValue;
    15. import org.springframework.web.bind.annotation.RequestMapping;
    16. import org.springframework.web.bind.annotation.ResponseBody;
    17. import org.springframework.web.bind.annotation.RestController;
    18. import org.springframework.web.servlet.ModelAndView;
    19. import javax.servlet.http.HttpServletRequest;
    20. import javax.servlet.http.HttpServletResponse;
    21. import javax.servlet.http.HttpSession;
    22. /**
    23. * @author 杨总
    24. * @create 2022-11-07 18:28
    25. */
    26. @Controller
    27. @RequestMapping("/shopCar")
    28. public class shopCarController {
    29. @Autowired
    30. private IRedisService redisService;
    31. @ResponseBody
    32. @RequestMapping("/check")
    33. public JsonResponseBody check(User user) {
    34. return new JsonResponseBody();
    35. }
    36. // 从session中获取购物车对象
    37. private ShopCar getShopCar(User user, HttpServletRequest request) {
    38. HttpSession session = request.getSession();
    39. ShopCar shopCar = (ShopCar) session.getAttribute(user.getId() + "_shopCar");
    40. if (shopCar == null) {
    41. shopCar = new ShopCar();
    42. session.setAttribute(user.getId() + "_shopCar", shopCar);
    43. }
    44. return shopCar;
    45. }
    46. // 查询
    47. @RequestMapping("/queryShopCar")
    48. public ModelAndView queryShopCar(User user,
    49. HttpServletRequest request,
    50. HttpServletResponse resp) {
    51. ModelAndView mv = new ModelAndView();
    52. ShopCar shopCar = getShopCar(user, request);
    53. mv.addObject("shopCar", shopCar);
    54. mv.setViewName("cart.html");
    55. return mv;
    56. }
    57. @Autowired
    58. private IGoodsService goodsService;
    59. /**
    60. * 增加
    61. * @param user
    62. * @param request
    63. * @param resp
    64. * @param gid
    65. * @return
    66. */
    67. @ResponseBody
    68. @RequestMapping("/add")
    69. public JsonResponseBody add(User user,
    70. HttpServletRequest request,
    71. HttpServletResponse resp,
    72. Long gid) {
    73. ModelAndView mv = new ModelAndView();
    74. ShopCar shopCar = getShopCar(user, request);
    75. Goods goods = goodsService.getOne(new QueryWrapper<Goods>().eq("gid", gid));
    76. // 初始化商品详情ShopCarItem
    77. ShopCarItem item = new ShopCarItem();
    78. item.setQuantity(1);
    79. item.setGid(goods.getGid());
    80. item.setGoodsImg(goods.getGoodsImg());
    81. item.setGoodsName(goods.getGoodsName());
    82. item.setGoodsPrice(goods.getGoodsPrice());
    83. //加入购物车
    84. shopCar.add(item);
    85. return new JsonResponseBody<>();
    86. }
    87. /**
    88. * 修改
    89. * @param user
    90. * @param request
    91. * @param resp
    92. * @param shopCarItem
    93. * @return
    94. */
    95. @ResponseBody
    96. @RequestMapping("/update")
    97. public JsonResponseBody update(User user,
    98. HttpServletRequest request,
    99. HttpServletResponse resp,
    100. ShopCarItem shopCarItem) {
    101. ModelAndView mv = new ModelAndView();
    102. ShopCar shopCar = getShopCar(user, request);
    103. //加入购物车
    104. shopCar.update(shopCarItem);
    105. return new JsonResponseBody<>();
    106. }
    107. /**
    108. * 删除购物车中指定的商品
    109. * @param user 用户对象
    110. * @param gids 商品ID
    111. * @param request
    112. * @return
    113. */
    114. @RequestMapping("/delete")
    115. @ResponseBody
    116. public JsonResponseBody delete(User user,
    117. HttpServletRequest request,
    118. HttpServletResponse resp,
    119. String gids){
    120. ModelAndView mv = new ModelAndView();
    121. //从session中获取购物车对象
    122. ShopCar shopCar = getShopCar(user, request);
    123. //更新商品数量
    124. shopCar.delete(gids);
    125. return new JsonResponseBody<>();
    126. }
    127. }

    三、商品详情页面实现

    index.html修改如下:

    1. DOCTYPE html>
    2. <html>
    3. <head lang="en">
    4. <#include "common/head.html" />
    5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
    6. <link rel="stylesheet" type="text/css" href="css/index.css" />
    7. head>
    8. <div>
    9. <#include "common/top.html" />
    10. <div class="block_home_slider">
    11. <div id="home_slider" class="flexslider">
    12. <ul class="slides">
    13. <li>
    14. <div class="slide">
    15. <img src="img/banner2.jpg"/>
    16. div>
    17. li>
    18. <li>
    19. <div class="slide">
    20. <img src="img/banner1.jpg"/>
    21. div>
    22. li>
    23. ul>
    24. div>
    25. div>
    26. <div class="thImg">
    27. <div class="clearfix">
    28. <a href="${ctx}/page/vase_proList.html"><img src="img/i1.jpg"/>a>
    29. <a href="${ctx}/page/proList.html"><img src="img/i2.jpg"/>a>
    30. <a href="#2"><img src="img/i3.jpg"/>a>
    31. div>
    32. div>
    33. <div class="news">
    34. <div class="wrapper">
    35. <h2><img src="img/ih1.jpg"/>h2>
    36. <div class="top clearfix">
    37. <a href="${ctx}/page/proDetail.html"><img src="img/n1.jpg"/><p>p>a>
    38. <a href="${ctx}/page/proDetail.html"><img src="img/n2.jpg"/><p>p>a>
    39. <a href="${ctx}/page/proDetail.html"><img src="img/n3.jpg"/><p>p>a>
    40. div>
    41. <div class="bott clearfix">
    42. <a href="${ctx}/page/proDetail.html"><img src="img/n4.jpg"/><p>p>a>
    43. <a href="${ctx}/page/proDetail.html"><img src="img/n5.jpg"/><p>p>a>
    44. <a href="${ctx}/page/proDetail.html"><img src="img/n6.jpg"/><p>p>a>
    45. div>
    46. <h2><img src="img/ih2.jpg"/>h2>
    47. <#if gt01?? && gt01?size gt 0>
    48. <#list gt01?keys as key>
    49. <div class="flower clearfix tran">
    50. <#list gt01[key] as g>
    51. <a href="${ctx}/goods/detail/${g.gid}" class="clearfix">
    52. <dl>
    53. <dt>
    54. <span class="abl">span>
    55. <img src="${g.goodsImg}"/>
    56. <span class="abr">span>
    57. dt>
    58. <dd>${g.goodsName}dd>
    59. <dd><span>¥ ${g.goodsPrice}span>dd>
    60. dl>
    61. a>
    62. div>
    63. div>
    64. div>
    65. <a href="#" class="ad"><img src="img/ib1.jpg"/>a>
    66. <div class="people">
    67. <div class="wrapper">
    68. <h2><img src="img/ih3.jpg"/>h2>
    69. <#if gt07?? && gt07?size gt 0>
    70. <#list gt07?keys as key>
    71. <div class="pList clearfix tran">
    72. <#list gt07[key] as g>
    73. <a href="${ctx}/goods/detail/${g.gid}">
    74. <dl>
    75. <dt>
    76. <span class="abl">span>
    77. <img src="${g.goodsImg}"/>
    78. <span class="abr">span>
    79. dt>
    80. <dd>${g.goodsName}dd>
    81. <dd><span>¥ ${g.goodsPrice}span>dd>
    82. dl>
    83. a>
    84. div>
    85. >
    86. div>
    87. div>
    88. <#include "common/footer.html"/>
    89. <script src="js/public.js" type="text/javascript" charset="utf-8">script>
    90. <script src="js/nav.js" type="text/javascript" charset="utf-8">script>
    91. <script src="js/jquery.flexslider-min.js" type="text/javascript" charset="utf-8">script>
    92. <script type="text/javascript">
    93. $(function() {
    94. $('#home_slider').flexslider({
    95. animation: 'slide',
    96. controlNav: true,
    97. directionNav: true,
    98. animationLoop: true,
    99. slideshow: true,
    100. slideshowSpeed:2000,
    101. useCSS: false
    102. });
    103. });
    104. script>

    cart.html修改如下:

    1. html>
    2. <html>
    3. <head lang="en">
    4. <#include "common/head.html">
    5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
    6. <link rel="stylesheet" type="text/css" href="css/proList.css" />
    7. head>
    8. <body>
    9. <div class="head ding">
    10. <div class="wrapper clearfix">
    11. <div class="clearfix" id="top">
    12. <h1 class="fl"><a href="${ctx}/"><img src="img/logo.png"/>a>h1>
    13. <div class="fr clearfix" id="top1">
    14. <form action="#" method="get" class="fl">
    15. <input type="text" placeholder="搜索" />
    16. <input type="button" />
    17. form>
    18. div>
    19. div>
    20. div>
    21. div>
    22. <div class="cart mt">
    23. <div class="site">
    24. <p class=" wrapper clearfix">
    25. <span class="fl">购物车span>
    26. <img class="top" src="img/temp/cartTop01.png">
    27. <a href="${ctx}/" class="fr">继续购物>a>
    28. p>
    29. div>
    30. <div class="table wrapper">
    31. <div class="tr">
    32. <div>商品div>
    33. <div>单价div>
    34. <div>数量div>
    35. <div>小计div>
    36. <div>操作div>
    37. div>
    38. <#if shopCar??>
    39. <#list shopCar.items as g>
    40. <div class="th">
    41. <div class="pro clearfix">
    42. <label class="fl">
    43. <input type="hidden" value="${g.gid!}"/>
    44. <input type="checkbox"/>
    45. <span>span>
    46. label>
    47. <a class="fl" href="#">
    48. <dl class="clearfix">
    49. <dt class="fl"><img style="width: 120px;height: 120px;" src="${g.goodsImg}">dt>
    50. <dd class="fl">
    51. <p>${g.goodsName}p>
    52. <p>颜色分类:p>
    53. <p>白色瓷瓶+白色串枚p>
    54. dd>
    55. dl>
    56. a>
    57. div>
    58. <div class="price">¥${g.goodsPrice}div>
    59. <div class="number">
    60. <p class="num clearfix">
    61. <img class="fl sub" src="img/temp/sub.jpg">
    62. <span class="fl">${g.quantity}span>
    63. <img class="fl add" src="img/temp/add.jpg">
    64. p>
    65. div>
    66. <div class="price sAll">¥${g.smalltotal()}div>
    67. <div class="price"><a class="del" href="javascript:void(0)">删除a>div>
    68. div>
    69. <div class="goOn">空空如也~<a href="${ctx}/">去逛逛a>div>
    70. <div class="tr clearfix">
    71. <label class="fl">
    72. <input class="checkAll" type="checkbox"/>
    73. <span>span>
    74. label>
    75. <p class="fl">
    76. <a href="javascript:void(0);">全选a>
    77. <a href="javascript:void(0);" class="del">删除a>
    78. p>
    79. <p class="fr">
    80. <span><small id="sl">0small>件商品span>
    81. <span>合计: <small id="all">¥0.00small>span>
    82. <a class="count">结算a>
    83. p>
    84. div>
    85. div>
    86. div>
    87. <div class="mask">div>
    88. <div class="tipDel">
    89. <p>确定要删除该商品吗?p>
    90. <p class="clearfix">
    91. <a class="fl cer" href="javascript:void(0);">确定a>
    92. <a class="fr cancel" href="javascript:void(0);">取消a>
    93. p>
    94. div>
    95. <#include "common/footer.html">
    96. <div class="mask">div>
    97. <div class="proDets">
    98. <img class="off" src="img/temp/off.jpg" />
    99. <div class="proCon clearfix">
    100. <div class="proImg fr">
    101. <img class="list" src="img/temp/proDet.jpg" />
    102. <div class="smallImg clearfix">
    103. <img src="img/temp/proDet01.jpg" data-src="img/temp/proDet01_big.jpg">
    104. <img src="img/temp/proDet02.jpg" data-src="img/temp/proDet02_big.jpg">
    105. <img src="img/temp/proDet03.jpg" data-src="img/temp/proDet03_big.jpg">
    106. <img src="img/temp/proDet04.jpg" data-src="img/temp/proDet04_big.jpg">
    107. div>
    108. div>
    109. <div class="fl">
    110. <div class="proIntro change">
    111. <p>颜色分类p>
    112. <div class="smallImg clearfix">
    113. <p class="fl on"><img src="img/temp/prosmall01.jpg" alt="白瓷花瓶+20支快乐花" data-src="img/temp/proBig01.jpg">p>
    114. <p class="fl"><img src="img/temp/prosmall02.jpg" alt="白瓷花瓶+20支兔尾巴草" data-src="img/temp/proBig02.jpg">p>
    115. <p class="fl"><img src="img/temp/prosmall03.jpg" alt="20支快乐花" data-src="img/temp/proBig03.jpg">p>
    116. <p class="fl"><img src="img/temp/prosmall04.jpg" alt="20支兔尾巴草" data-src="img/temp/proBig04.jpg">p>
    117. div>
    118. div>
    119. <div class="changeBtn clearfix">
    120. <a href="#2" class="fl"><p class="buy">确认p>a>
    121. <a href="#2" class="fr"><p class="cart">取消p>a>
    122. div>
    123. div>
    124. div>
    125. div>
    126. <div class="pleaseC">
    127. <p>请选择宝贝p>
    128. <img class="off" src="img/temp/off.jpg" />
    129. div>
    130. <script src="js/public.js" type="text/javascript" charset="utf-8">script>
    131. <script src="js/pro.js" type="text/javascript" charset="utf-8">script>
    132. <script src="js/cart.js" type="text/javascript" charset="utf-8">script>
    133. body>
    134. html>

    proDetail.html修改如下:

    1. html>
    2. <html>
    3. <head>
    4. <#include "common/head.html">
    5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
    6. <link rel="stylesheet" type="text/css" href="css/proList.css"/>
    7. head>
    8. <body>
    9. <#include "common/top.html">
    10. <div class="address">
    11. <div class="wrapper clearfix">
    12. <a href="${ctx}/">首页a>
    13. <span>/span>
    14. <a href="${ctx}/page/flowerDer.html">装饰摆件a>
    15. <span>/span>
    16. <a href="${ctx}/page/proList.html">干花花艺a>
    17. <span>/span>
    18. <#--
    19. 注意:
    20. 1)${goods.goodsTitle!}:只能判断goodsTitle属性是否为空,不能判断goods对象是否为空
    21. 2)${(goods.goodsTitle)!}:既可以判断goods对象是否为空,也可以判断goodsTitle属性是否为空
    22. -->
    23. <a href="#" class="on">【最家】非洲菊仿真花干花a>
    24. div>
    25. div>
    26. <div class="detCon">
    27. <div class="proDet wrapper">
    28. <div class="proCon clearfix">
    29. <div class="proImg fl">
    30. <img class="det" src="${goods.goodsImg}" />
    31. div>
    32. <div class="fr intro">
    33. <div class="title">
    34. <h4>【最家】${goods.goodsName}h4>
    35. <p>${goods.goodsDetail}p>
    36. <span>¥ ${goods.goodsPrice}span>
    37. div>
    38. <div class="proIntro">
    39. <p>颜色分类p>
    40. <div class="smallImg clearfix categ">
    41. <p class="fl"><img src="img/temp/prosmall01.jpg" alt="白瓷花瓶+20支快乐花" data-src="img/temp/proBig01.jpg">p>
    42. <p class="fl"><img src="img/temp/prosmall02.jpg" alt="白瓷花瓶+20支兔尾巴草" data-src="img/temp/proBig02.jpg">p>
    43. <p class="fl"><img src="img/temp/prosmall03.jpg" alt="20支快乐花" data-src="img/temp/proBig03.jpg">p>
    44. <p class="fl"><img src="img/temp/prosmall04.jpg" alt="20支兔尾巴草" data-src="img/temp/proBig04.jpg">p>
    45. div>
    46. <p>数量  库存<span>${goods.goodsStock}span>件p>
    47. <div class="num clearfix">
    48. <img class="fl sub" src="img/temp/sub.jpg">
    49. <span class="fl" contentEditable="true">1span>
    50. <img class="fl add" src="img/temp/add.jpg">
    51. <p class="please fl">请选择商品属性!p>
    52. div>
    53. div>
    54. <div class="btns clearfix">
    55. <a href="#2"><p class="buy fl">立即购买p>a>
    56. <a href="javascript:void(0);"><p class="cart fr">加入购物车p>a>
    57. div>
    58. div>
    59. div>
    60. div>
    61. div>
    62. <div class="introMsg wrapper clearfix">
    63. <div class="msgL fl">
    64. <div class="msgTit clearfix">
    65. <a class="on">商品详情a>
    66. <a>所有评价a>
    67. div>
    68. <div class="msgAll">
    69. <div class="msgImgs">
    70. <img src="img/temp/det01.jpg">
    71. <img src="img/temp/det02.jpg">
    72. <img src="img/temp/det03.jpg">
    73. <img src="img/temp/det04.jpg">
    74. <img src="img/temp/det05.jpg">
    75. <img src="img/temp/det06.jpg">
    76. <img src="img/temp/det07.jpg">
    77. div>
    78. <div class="eva">
    79. <div class="per clearfix">
    80. <img class="fl" src="img/temp/per01.jpg">
    81. <div class="perR fl">
    82. <p>馨***呀p>
    83. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    84. <div class="clearfix">
    85. <p><img src="img/temp/eva01.jpg">p>
    86. <p><img src="img/temp/eva02.jpg">p>
    87. <p><img src="img/temp/eva03.jpg">p>
    88. <p><img src="img/temp/eva04.jpg">p>
    89. <p><img src="img/temp/eva05.jpg">p>
    90. div>
    91. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    92. div>
    93. div>
    94. <div class="per clearfix">
    95. <img class="fl" src="img/temp/per02.jpg">
    96. <div class="perR fl">
    97. <p>么***周p>
    98. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    99. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    100. div>
    101. div>
    102. <div class="per clearfix">
    103. <img class="fl" src="img/temp/per01.jpg">
    104. <div class="perR fl">
    105. <p>馨***呀p>
    106. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    107. <div class="clearfix">
    108. <p><img src="img/temp/eva01.jpg">p>
    109. <p><img src="img/temp/eva02.jpg">p>
    110. <p><img src="img/temp/eva03.jpg">p>
    111. <p><img src="img/temp/eva04.jpg">p>
    112. <p><img src="img/temp/eva05.jpg">p>
    113. div>
    114. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    115. div>
    116. div>
    117. <div class="per clearfix">
    118. <img class="fl" src="img/temp/per02.jpg">
    119. <div class="perR fl">
    120. <p>么***周p>
    121. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    122. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    123. div>
    124. div>
    125. <div class="per clearfix">
    126. <img class="fl" src="img/temp/per01.jpg">
    127. <div class="perR fl">
    128. <p>馨***呀p>
    129. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    130. <div class="clearfix">
    131. <p><img src="img/temp/eva01.jpg">p>
    132. <p><img src="img/temp/eva02.jpg">p>
    133. <p><img src="img/temp/eva03.jpg">p>
    134. <p><img src="img/temp/eva04.jpg">p>
    135. <p><img src="img/temp/eva05.jpg">p>
    136. div>
    137. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    138. div>
    139. div>
    140. <div class="per clearfix">
    141. <img class="fl" src="img/temp/per02.jpg">
    142. <div class="perR fl">
    143. <p>么***周p>
    144. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    145. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    146. div>
    147. div>
    148. <div class="per clearfix">
    149. <img class="fl" src="img/temp/per01.jpg">
    150. <div class="perR fl">
    151. <p>馨***呀p>
    152. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    153. <div class="clearfix">
    154. <p><img src="img/temp/eva01.jpg">p>
    155. <p><img src="img/temp/eva02.jpg">p>
    156. <p><img src="img/temp/eva03.jpg">p>
    157. <p><img src="img/temp/eva04.jpg">p>
    158. <p><img src="img/temp/eva05.jpg">p>
    159. div>
    160. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    161. div>
    162. div>
    163. <div class="per clearfix">
    164. <img class="fl" src="img/temp/per02.jpg">
    165. <div class="perR fl">
    166. <p>么***周p>
    167. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    168. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    169. div>
    170. div>
    171. <div class="per clearfix">
    172. <img class="fl" src="img/temp/per01.jpg">
    173. <div class="perR fl">
    174. <p>馨***呀p>
    175. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    176. <div class="clearfix">
    177. <p><img src="img/temp/eva01.jpg">p>
    178. <p><img src="img/temp/eva02.jpg">p>
    179. <p><img src="img/temp/eva03.jpg">p>
    180. <p><img src="img/temp/eva04.jpg">p>
    181. <p><img src="img/temp/eva05.jpg">p>
    182. div>
    183. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    184. div>
    185. div>
    186. <div class="per clearfix">
    187. <img class="fl" src="img/temp/per02.jpg">
    188. <div class="perR fl">
    189. <p>么***周p>
    190. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    191. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    192. div>
    193. div>
    194. div>
    195. div>
    196. div>
    197. <div class="msgR fr">
    198. <h4>为你推荐h4>
    199. <div class="seeList">
    200. <a href="#">
    201. <dl>
    202. <dt><img src="img/temp/see01.jpg">dt>
    203. <dd>【最家】复古文艺风玻璃花瓶dd>
    204. <dd>¥193.20dd>
    205. dl>
    206. a>
    207. <a href="#">
    208. <dl>
    209. <dt><img src="img/temp/see02.jpg">dt>
    210. <dd>【最家】复古文艺风玻璃花瓶dd>
    211. <dd>¥193.20dd>
    212. dl>
    213. a>
    214. <a href="#">
    215. <dl>
    216. <dt><img src="img/temp/see03.jpg">dt>
    217. <dd>【最家】复古文艺风玻璃花瓶dd>
    218. <dd>¥193.20dd>
    219. dl>
    220. a>
    221. <a href="#">
    222. <dl>
    223. <dt><img src="img/temp/see04.jpg">dt>
    224. <dd>【最家】复古文艺风玻璃花瓶dd>
    225. <dd>¥193.20dd>
    226. dl>
    227. a>
    228. div>
    229. div>
    230. div>
    231. <div class="like">
    232. <h4>猜你喜欢h4>
    233. <div class="bottom">
    234. <div class="hd">
    235. <span class="prev"><img src="img/temp/prev.png">span>
    236. <span class="next"><img src="img/temp/next.png">span>
    237. div>
    238. <div class="imgCon bd">
    239. <div class="likeList clearfix">
    240. <div>
    241. <a href="${ctx}/page/proDetail.html">
    242. <dl>
    243. <dt><img src="img/temp/like01.jpg">dt>
    244. <dd>【最家】复古文艺风玻璃花瓶dd>
    245. <dd>¥193.20dd>
    246. dl>
    247. a>
    248. <a href="${ctx}/page/proDetail.html">
    249. <dl>
    250. <dt><img src="img/temp/like02.jpg">dt>
    251. <dd>【最家】复古文艺风玻璃花瓶dd>
    252. <dd>¥193.20dd>
    253. dl>
    254. a>
    255. <a href="${ctx}/page/proDetail.html">
    256. <dl>
    257. <dt><img src="img/temp/like03.jpg">dt>
    258. <dd>【最家】复古文艺风玻璃花瓶dd>
    259. <dd>¥193.20dd>
    260. dl>
    261. a>
    262. <a href="${ctx}/page/proDetail.html">
    263. <dl>
    264. <dt><img src="img/temp/like04.jpg">dt>
    265. <dd>【最家】复古文艺风玻璃花瓶dd>
    266. <dd>¥193.20dd>
    267. dl>
    268. a>
    269. <a href="${ctx}/page/proDetail.html" class="last">
    270. <dl>
    271. <dt><img src="img/temp/like05.jpg">dt>
    272. <dd>【最家】复古文艺风玻璃花瓶dd>
    273. <dd>¥193.20dd>
    274. dl>
    275. a>
    276. div>
    277. <div>
    278. <a href="${ctx}/page/proDetail.html">
    279. <dl>
    280. <dt><img src="img/temp/like01.jpg">dt>
    281. <dd>【最家】复古文艺风玻璃花瓶dd>
    282. <dd>¥193.20dd>
    283. dl>
    284. a>
    285. <a href="${ctx}/page/proDetail.html">
    286. <dl>
    287. <dt><img src="img/temp/like02.jpg">dt>
    288. <dd>【最家】复古文艺风玻璃花瓶dd>
    289. <dd>¥193.20dd>
    290. dl>
    291. a>
    292. <a href="${ctx}/page/proDetail.html">
    293. <dl>
    294. <dt><img src="img/temp/like03.jpg">dt>
    295. <dd>【最家】复古文艺风玻璃花瓶dd>
    296. <dd>¥193.20dd>
    297. dl>
    298. a>
    299. <a href="${ctx}/page/proDetail.html">
    300. <dl>
    301. <dt><img src="img/temp/like04.jpg">dt>
    302. <dd>【最家】复古文艺风玻璃花瓶dd>
    303. <dd>¥193.20dd>
    304. dl>
    305. a>
    306. <a href="${ctx}/page/proDetail.html" class="last">
    307. <dl>
    308. <dt><img src="img/temp/like05.jpg">dt>
    309. <dd>【最家】复古文艺风玻璃花瓶dd>
    310. <dd>¥193.20dd>
    311. dl>
    312. a>
    313. div>
    314. div>
    315. div>
    316. div>
    317. div>
    318. <#include "common/footer.html">
    319. <script src="js/jquery.SuperSlide.2.1.1.js" type="text/javascript" charset="utf-8">script>
    320. <script src="js/public.js" type="text/javascript" charset="utf-8">script>
    321. <script src="js/nav.js" type="text/javascript" charset="utf-8">script>
    322. <script src="js/pro.js" type="text/javascript" charset="utf-8">script>
    323. <script src="js/cart.js" type="text/javascript" charset="utf-8">script>
    324. <script type="text/javascript">
    325. jQuery(".bottom").slide({titCell:".hd ul",mainCell:".bd .likeList",autoPage:true,autoPlay:false,effect:"leftLoop",autoPlay:true,vis:1});
    326. script>
    327. body>
    328. html>

    GoodsController :

    1. package com.ycx.spbootpro.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.ycx.spbootpro.model.Goods;
    4. import com.ycx.spbootpro.service.IGoodsService;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.PathVariable;
    7. import org.springframework.web.bind.annotation.RequestMapping;
    8. import org.springframework.web.bind.annotation.RestController;
    9. import org.springframework.web.servlet.ModelAndView;
    10. /**
    11. *

    12. * 商品信息表 前端控制器
    13. *

    14. *
    15. * @author yangzong
    16. * @since 2022-11-05
    17. */
    18. @Controller
    19. @RequestMapping("/goods")
    20. public class GoodsController {
    21. @Autowired
    22. private IGoodsService goodsService;
    23. /**
    24. * 根据商品ID查询商品详情信息
    25. * @param gid
    26. * @return
    27. */
    28. @RequestMapping("/detail/{gid}")
    29. public ModelAndView detail(@PathVariable("gid") Long gid){
    30. ModelAndView mv=new ModelAndView();
    31. //根据商品ID查询单个商品信息
    32. Goods goods = goodsService.getOne(new QueryWrapper<Goods>().eq("gid", gid));
    33. //将商品存入model带入前端展示
    34. mv.addObject("goods",goods);
    35. //设置跳转页面,商品详情页
    36. mv.setViewName("proDetail.html");
    37. return mv;
    38. }
    39. }

    测试查看商品详情页面:

     

     

     ——————————————————————————————————————————

    查看商品详情功能已完成呢

    四、购物车查询以及新增的前台

    修改proDetail.html:

    1. html>
    2. <html>
    3. <head>
    4. <#include "common/head.html">
    5. <link rel="stylesheet" type="text/css" href="css/public.css"/>
    6. <link rel="stylesheet" type="text/css" href="css/proList.css"/>
    7. head>
    8. <body>
    9. <#include "common/top.html">
    10. <div class="address">
    11. <div class="wrapper clearfix">
    12. <a href="${ctx}/">首页a>
    13. <span>/span>
    14. <a href="${ctx}/page/flowerDer.html">装饰摆件a>
    15. <span>/span>
    16. <a href="${ctx}/page/proList.html">干花花艺a>
    17. <span>/span>
    18. <#--
    19. 注意:
    20. 1)${goods.goodsTitle!}:只能判断goodsTitle属性是否为空,不能判断goods对象是否为空
    21. 2)${(goods.goodsTitle)!}:既可以判断goods对象是否为空,也可以判断goodsTitle属性是否为空
    22. -->
    23. <a href="#" class="on">【最家】非洲菊仿真花干花a>
    24. div>
    25. div>
    26. <div class="detCon">
    27. <div class="proDet wrapper">
    28. <div class="proCon clearfix">
    29. <div class="proImg fl">
    30. <img class="det" src="${goods.goodsImg}" />
    31. div>
    32. <div class="fr intro">
    33. <div class="title">
    34. <input type="hidden" id="gids" value="${goods.gid}">
    35. <h4>【最家】${goods.goodsName}h4>
    36. <p>${goods.goodsDetail}p>
    37. <span>¥ ${goods.goodsPrice}span>
    38. div>
    39. <div class="proIntro">
    40. <p>颜色分类p>
    41. <div class="smallImg clearfix categ">
    42. <p class="fl"><img src="img/temp/prosmall01.jpg" alt="白瓷花瓶+20支快乐花" data-src="img/temp/proBig01.jpg">p>
    43. <p class="fl"><img src="img/temp/prosmall02.jpg" alt="白瓷花瓶+20支兔尾巴草" data-src="img/temp/proBig02.jpg">p>
    44. <p class="fl"><img src="img/temp/prosmall03.jpg" alt="20支快乐花" data-src="img/temp/proBig03.jpg">p>
    45. <p class="fl"><img src="img/temp/prosmall04.jpg" alt="20支兔尾巴草" data-src="img/temp/proBig04.jpg">p>
    46. div>
    47. <p>数量  库存<span>${goods.goodsStock}span>件p>
    48. <div class="num clearfix">
    49. <img class="fl sub" src="img/temp/sub.jpg">
    50. <span class="fl" contentEditable="true">1span>
    51. <img class="fl add" src="img/temp/add.jpg">
    52. <p class="please fl">请选择商品属性!p>
    53. div>
    54. div>
    55. <div class="btns clearfix">
    56. <a href="#2"><p class="buy fl">立即购买p>a>
    57. <a href="javascript:void(0);"><p class="cart fr">加入购物车p>a>
    58. div>
    59. div>
    60. div>
    61. div>
    62. div>
    63. <div class="introMsg wrapper clearfix">
    64. <div class="msgL fl">
    65. <div class="msgTit clearfix">
    66. <a class="on">商品详情a>
    67. <a>所有评价a>
    68. div>
    69. <div class="msgAll">
    70. <div class="msgImgs">
    71. <img src="img/temp/det01.jpg">
    72. <img src="img/temp/det02.jpg">
    73. <img src="img/temp/det03.jpg">
    74. <img src="img/temp/det04.jpg">
    75. <img src="img/temp/det05.jpg">
    76. <img src="img/temp/det06.jpg">
    77. <img src="img/temp/det07.jpg">
    78. div>
    79. <div class="eva">
    80. <div class="per clearfix">
    81. <img class="fl" src="img/temp/per01.jpg">
    82. <div class="perR fl">
    83. <p>馨***呀p>
    84. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    85. <div class="clearfix">
    86. <p><img src="img/temp/eva01.jpg">p>
    87. <p><img src="img/temp/eva02.jpg">p>
    88. <p><img src="img/temp/eva03.jpg">p>
    89. <p><img src="img/temp/eva04.jpg">p>
    90. <p><img src="img/temp/eva05.jpg">p>
    91. div>
    92. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    93. div>
    94. div>
    95. <div class="per clearfix">
    96. <img class="fl" src="img/temp/per02.jpg">
    97. <div class="perR fl">
    98. <p>么***周p>
    99. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    100. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    101. div>
    102. div>
    103. <div class="per clearfix">
    104. <img class="fl" src="img/temp/per01.jpg">
    105. <div class="perR fl">
    106. <p>馨***呀p>
    107. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    108. <div class="clearfix">
    109. <p><img src="img/temp/eva01.jpg">p>
    110. <p><img src="img/temp/eva02.jpg">p>
    111. <p><img src="img/temp/eva03.jpg">p>
    112. <p><img src="img/temp/eva04.jpg">p>
    113. <p><img src="img/temp/eva05.jpg">p>
    114. div>
    115. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    116. div>
    117. div>
    118. <div class="per clearfix">
    119. <img class="fl" src="img/temp/per02.jpg">
    120. <div class="perR fl">
    121. <p>么***周p>
    122. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    123. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    124. div>
    125. div>
    126. <div class="per clearfix">
    127. <img class="fl" src="img/temp/per01.jpg">
    128. <div class="perR fl">
    129. <p>馨***呀p>
    130. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    131. <div class="clearfix">
    132. <p><img src="img/temp/eva01.jpg">p>
    133. <p><img src="img/temp/eva02.jpg">p>
    134. <p><img src="img/temp/eva03.jpg">p>
    135. <p><img src="img/temp/eva04.jpg">p>
    136. <p><img src="img/temp/eva05.jpg">p>
    137. div>
    138. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    139. div>
    140. div>
    141. <div class="per clearfix">
    142. <img class="fl" src="img/temp/per02.jpg">
    143. <div class="perR fl">
    144. <p>么***周p>
    145. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    146. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    147. div>
    148. div>
    149. <div class="per clearfix">
    150. <img class="fl" src="img/temp/per01.jpg">
    151. <div class="perR fl">
    152. <p>馨***呀p>
    153. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    154. <div class="clearfix">
    155. <p><img src="img/temp/eva01.jpg">p>
    156. <p><img src="img/temp/eva02.jpg">p>
    157. <p><img src="img/temp/eva03.jpg">p>
    158. <p><img src="img/temp/eva04.jpg">p>
    159. <p><img src="img/temp/eva05.jpg">p>
    160. div>
    161. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    162. div>
    163. div>
    164. <div class="per clearfix">
    165. <img class="fl" src="img/temp/per02.jpg">
    166. <div class="perR fl">
    167. <p>么***周p>
    168. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    169. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    170. div>
    171. div>
    172. <div class="per clearfix">
    173. <img class="fl" src="img/temp/per01.jpg">
    174. <div class="perR fl">
    175. <p>馨***呀p>
    176. <p>不好意思评价晚了,产品很好,价格比玻璃品便宜,没有我担心的杂色,发货快,包装好,全5分p>
    177. <div class="clearfix">
    178. <p><img src="img/temp/eva01.jpg">p>
    179. <p><img src="img/temp/eva02.jpg">p>
    180. <p><img src="img/temp/eva03.jpg">p>
    181. <p><img src="img/temp/eva04.jpg">p>
    182. <p><img src="img/temp/eva05.jpg">p>
    183. div>
    184. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    185. div>
    186. div>
    187. <div class="per clearfix">
    188. <img class="fl" src="img/temp/per02.jpg">
    189. <div class="perR fl">
    190. <p>么***周p>
    191. <p>花瓶超级棒,我看图以为是光面的,收货发现是磨砂,但感觉也超有质感,很喜欢。磨砂上面还有点纹路,不过觉得挺自然的,不影响美观。包装也很好,绝对不会磕碎碰坏,好评!p>
    192. <p><span>2016年12月27日08:31span><span>颜色分类:大中小三件套(不含花)span>p>
    193. div>
    194. div>
    195. div>
    196. div>
    197. div>
    198. <div class="msgR fr">
    199. <h4>为你推荐h4>
    200. <div class="seeList">
    201. <a href="#">
    202. <dl>
    203. <dt><img src="img/temp/see01.jpg">dt>
    204. <dd>【最家】复古文艺风玻璃花瓶dd>
    205. <dd>¥193.20dd>
    206. dl>
    207. a>
    208. <a href="#">
    209. <dl>
    210. <dt><img src="img/temp/see02.jpg">dt>
    211. <dd>【最家】复古文艺风玻璃花瓶dd>
    212. <dd>¥193.20dd>
    213. dl>
    214. a>
    215. <a href="#">
    216. <dl>
    217. <dt><img src="img/temp/see03.jpg">dt>
    218. <dd>【最家】复古文艺风玻璃花瓶dd>
    219. <dd>¥193.20dd>
    220. dl>
    221. a>
    222. <a href="#">
    223. <dl>
    224. <dt><img src="img/temp/see04.jpg">dt>
    225. <dd>【最家】复古文艺风玻璃花瓶dd>
    226. <dd>¥193.20dd>
    227. dl>
    228. a>
    229. div>
    230. div>
    231. div>
    232. <div class="like">
    233. <h4>猜你喜欢h4>
    234. <div class="bottom">
    235. <div class="hd">
    236. <span class="prev"><img src="img/temp/prev.png">span>
    237. <span class="next"><img src="img/temp/next.png">span>
    238. div>
    239. <div class="imgCon bd">
    240. <div class="likeList clearfix">
    241. <div>
    242. <a href="${ctx}/page/proDetail.html">
    243. <dl>
    244. <dt><img src="img/temp/like01.jpg">dt>
    245. <dd>【最家】复古文艺风玻璃花瓶dd>
    246. <dd>¥193.20dd>
    247. dl>
    248. a>
    249. <a href="${ctx}/page/proDetail.html">
    250. <dl>
    251. <dt><img src="img/temp/like02.jpg">dt>
    252. <dd>【最家】复古文艺风玻璃花瓶dd>
    253. <dd>¥193.20dd>
    254. dl>
    255. a>
    256. <a href="${ctx}/page/proDetail.html">
    257. <dl>
    258. <dt><img src="img/temp/like03.jpg">dt>
    259. <dd>【最家】复古文艺风玻璃花瓶dd>
    260. <dd>¥193.20dd>
    261. dl>
    262. a>
    263. <a href="${ctx}/page/proDetail.html">
    264. <dl>
    265. <dt><img src="img/temp/like04.jpg">dt>
    266. <dd>【最家】复古文艺风玻璃花瓶dd>
    267. <dd>¥193.20dd>
    268. dl>
    269. a>
    270. <a href="${ctx}/page/proDetail.html" class="last">
    271. <dl>
    272. <dt><img src="img/temp/like05.jpg">dt>
    273. <dd>【最家】复古文艺风玻璃花瓶dd>
    274. <dd>¥193.20dd>
    275. dl>
    276. a>
    277. div>
    278. <div>
    279. <a href="${ctx}/page/proDetail.html">
    280. <dl>
    281. <dt><img src="img/temp/like01.jpg">dt>
    282. <dd>【最家】复古文艺风玻璃花瓶dd>
    283. <dd>¥193.20dd>
    284. dl>
    285. a>
    286. <a href="${ctx}/page/proDetail.html">
    287. <dl>
    288. <dt><img src="img/temp/like02.jpg">dt>
    289. <dd>【最家】复古文艺风玻璃花瓶dd>
    290. <dd>¥193.20dd>
    291. dl>
    292. a>
    293. <a href="${ctx}/page/proDetail.html">
    294. <dl>
    295. <dt><img src="img/temp/like03.jpg">dt>
    296. <dd>【最家】复古文艺风玻璃花瓶dd>
    297. <dd>¥193.20dd>
    298. dl>
    299. a>
    300. <a href="${ctx}/page/proDetail.html">
    301. <dl>
    302. <dt><img src="img/temp/like04.jpg">dt>
    303. <dd>【最家】复古文艺风玻璃花瓶dd>
    304. <dd>¥193.20dd>
    305. dl>
    306. a>
    307. <a href="${ctx}/page/proDetail.html" class="last">
    308. <dl>
    309. <dt><img src="img/temp/like05.jpg">dt>
    310. <dd>【最家】复古文艺风玻璃花瓶dd>
    311. <dd>¥193.20dd>
    312. dl>
    313. a>
    314. div>
    315. div>
    316. div>
    317. div>
    318. div>
    319. <#include "common/footer.html">
    320. <script src="js/jquery.SuperSlide.2.1.1.js" type="text/javascript" charset="utf-8">script>
    321. <script src="js/public.js" type="text/javascript" charset="utf-8">script>
    322. <script src="js/nav.js" type="text/javascript" charset="utf-8">script>
    323. <script src="js/pro.js" type="text/javascript" charset="utf-8">script>
    324. <script src="js/cart.js" type="text/javascript" charset="utf-8">script>
    325. <script type="text/javascript">
    326. jQuery(".bottom").slide({titCell:".hd ul",mainCell:".bd .likeList",autoPage:true,autoPlay:false,effect:"leftLoop",autoPlay:true,vis:1});
    327. $(function () {
    328. $(".cart").click(function () {
    329. $.get('/shopCar/add',{gid:$("#gids").val()},function(rs){
    330. if(rs.code!=200){
    331. alert('请先登录后再购买商品!');
    332. }else
    333. location.href='/shopCar/queryShopCar';
    334. },'json');
    335. });
    336. })
    337. script>
    338. body>
    339. html>

    测试 加入购物车:

     如果再加一个商品:

     

    加入多个商品:

    那么加入购物车就成功啦~

    五、购物车删除功能和修改功能

    删除

    cart.js:

    1. $(function(){
    2. /**************数量加减***************/
    3. $(".num .sub").click(function(){
    4. var num = parseInt($(this).siblings("span").text());
    5. if(num<=1){
    6. $(this).attr("disabled","disabled");
    7. }else{
    8. num--;
    9. $(this).siblings("span").text(num);
    10. //获取除了货币符号以外的数字
    11. var price = $(this).parents(".number").prev().text().substring(1);
    12. //单价和数量相乘并保留两位小数
    13. $(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
    14. jisuan();
    15. zg();
    16. }
    17. });
    18. $(".num .add").click(function(){
    19. var num = parseInt($(this).siblings("span").text());
    20. if(num>=5){
    21. confirm("限购5件");
    22. }else{
    23. num++;
    24. $(this).siblings("span").text(num);
    25. var price = $(this).parents(".number").prev().text().substring(1);
    26. $(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
    27. jisuan();
    28. zg();
    29. }
    30. });
    31. //计算总价
    32. function jisuan(){
    33. var all=0;
    34. var len =$(".th input[type='checkbox']:checked").length;
    35. if(len==0){
    36. $("#all").text('¥'+parseFloat(0).toFixed(2));
    37. }else{
    38. $(".th input[type='checkbox']:checked").each(function(){
    39. //获取小计里的数值
    40. var sAll = $(this).parents(".pro").siblings('.sAll').text().substring(1);
    41. //累加
    42. all+=parseFloat(sAll);
    43. //赋值
    44. $("#all").text('¥'+all.toFixed(2));
    45. })
    46. }
    47. }
    48. //计算总共几件商品
    49. function zg(){
    50. var zsl = 0;
    51. var index = $(".th input[type='checkbox']:checked").parents(".th").find(".num span");
    52. var len =index.length;
    53. if(len==0){
    54. $("#sl").text(0);
    55. }else{
    56. index.each(function(){
    57. zsl+=parseInt($(this).text());
    58. $("#sl").text(zsl);
    59. })
    60. }
    61. if($("#sl").text()>0){
    62. $(".count").css("background","#c10000");
    63. }else{
    64. $(".count").css("background","#8e8e8e");
    65. }
    66. }
    67. /*****************商品全选***********************/
    68. $("input[type='checkbox']").on('click',function(){
    69. var sf = $(this).is(":checked");
    70. var sc= $(this).hasClass("checkAll");
    71. if(sf){
    72. if(sc){
    73. $("input[type='checkbox']").each(function(){
    74. this.checked=true;
    75. });
    76. zg();
    77. jisuan();
    78. }else{
    79. $(this).checked=true;
    80. var len = $("input[type='checkbox']:checked").length;
    81. var len1 = $("input").length-1;
    82. if(len==len1){
    83. $("input[type='checkbox']").each(function(){
    84. this.checked=true;
    85. });
    86. }
    87. zg();
    88. jisuan();
    89. }
    90. }else{
    91. if(sc){
    92. $("input[type='checkbox']").each(function(){
    93. this.checked=false;
    94. });
    95. zg();
    96. jisuan();
    97. }else{
    98. $(this).checked=false;
    99. var len = $(".th input[type='checkbox']:checked").length;
    100. var len1 = $("input").length-1;
    101. if(len
    102. $('.checkAll').attr("checked",false);
    103. }
    104. zg();
    105. jisuan();
    106. }
    107. }
    108. });
    109. /****************************proDetail 加入购物车*******************************/
    110. $(".btns .cart").click(function(){
    111. if($(".categ p").hasClass("on")){
    112. var num = parseInt($(".num span").text());
    113. var num1 = parseInt($(".goCart span").text());
    114. $(".goCart span").text(num+num1);
    115. }
    116. });
    117. //删除购物车商品
    118. $('.del').click(function(){
    119. //定义商品id
    120. let gids="";
    121. //单个删除
    122. if($(this).parent().parent().hasClass("th")){
    123. $(".mask").show();
    124. $(".tipDel").show();
    125. index = $(this).parents(".th").index()-1;
    126. //TODO 获取当前的checkbox中设置的隐藏域(包含了商品ID)
    127. gids=$(".th").eq(index).find('div:eq(0) input[type=hidden]').val();
    128. $('.cer').click(function(){
    129. $(".mask").hide();
    130. $(".tipDel").hide();
    131. $(".th").eq(index).remove();
    132. $('.cer').off('click');
    133. if($(".th").length==0){
    134. $(".table .goOn").show();
    135. }
    136. del(gids);
    137. })
    138. }else{
    139. //选中多个一起删除
    140. if($(".th input[type='checkbox']:checked").length==0){
    141. $(".mask").show();
    142. $(".pleaseC").show();
    143. }
    144. else{
    145. $(".mask").show();
    146. $(".tipDel").show();
    147. let gidarr=new Array();
    148. $(".th input[type='checkbox']:checked").each(function(j){
    149. gidarr.push($(".th").eq(index).find('div:eq(0) input[type=hidden]').val());
    150. });
    151. gids=gidarr.join(",")
    152. $('.cer').click(function(){
    153. $(".th input[type='checkbox']:checked").each(function(j){
    154. index = $(this).parents('.th').index()-1;
    155. $(".th").eq(index).remove();
    156. if($(".th").length==0){
    157. $(".table .goOn").show();
    158. }
    159. })
    160. $(".mask").hide();
    161. $(".tipDel").hide();
    162. zg();
    163. jisuan();
    164. del(gids);
    165. })
    166. }
    167. }
    168. })
    169. $('.cancel').click(function(){
    170. $(".mask").hide();
    171. $(".tipDel").hide();
    172. })
    173. //在页面初始化事件外添加删除方法
    174. //删除商品
    175. function del(gids){
    176. $.post('/shopCar/delete',{
    177. 'gids':gids
    178. },function(rs){
    179. if(rs.code!=200)
    180. alert(rs.msg);
    181. else
    182. location.href='/shopCar/queryShopCar';
    183. },'json');
    184. }
    185. })

    测试单个删除:

    删除单个成功:

    测试全选删除:

     全选删除成功:

    修改

    cart.js进行整改:

    1. $(function(){
    2. /**************数量加减***************/
    3. $(".num .sub").click(function(){
    4. var num = parseInt($(this).siblings("span").text());
    5. if(num<=1){
    6. $(this).attr("disabled","disabled");
    7. }else{
    8. num--;
    9. $(this).siblings("span").text(num);
    10. //获取除了货币符号以外的数字
    11. var price = $(this).parents(".number").prev().text().substring(1);
    12. //单价和数量相乘并保留两位小数
    13. $(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
    14. jisuan();
    15. zg();
    16. //TODO 获取当前行的行索引
    17. let index = $(this).parents(".th").index()-1;
    18. //获取当前的checkbox中设置的隐藏域(包含了商品ID)
    19. let gid=$(".th").eq(index).find('div:eq(0) input[type=hidden]').val();
    20. update(num,gid);
    21. }
    22. });
    23. $(".num .add").click(function(){
    24. var num = parseInt($(this).siblings("span").text());
    25. if(num>=5){
    26. confirm("限购5件");
    27. }else{
    28. num++;
    29. $(this).siblings("span").text(num);
    30. var price = $(this).parents(".number").prev().text().substring(1);
    31. $(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
    32. jisuan();
    33. zg();
    34. //TODO 获取当前行的行索引
    35. let index = $(this).parents(".th").index()-1;
    36. //获取当前的checkbox中设置的隐藏域(包含了商品ID)
    37. let gid=$(".th").eq(index).find('div:eq(0) input[type=hidden]').val();
    38. update(num,gid);
    39. }
    40. });
    41. //计算总价
    42. function jisuan(){
    43. var all=0;
    44. var len =$(".th input[type='checkbox']:checked").length;
    45. if(len==0){
    46. $("#all").text('¥'+parseFloat(0).toFixed(2));
    47. }else{
    48. $(".th input[type='checkbox']:checked").each(function(){
    49. //获取小计里的数值
    50. var sAll = $(this).parents(".pro").siblings('.sAll').text().substring(1);
    51. //累加
    52. all+=parseFloat(sAll);
    53. //赋值
    54. $("#all").text('¥'+all.toFixed(2));
    55. })
    56. }
    57. }
    58. //计算总共几件商品
    59. function zg(){
    60. var zsl = 0;
    61. var index = $(".th input[type='checkbox']:checked").parents(".th").find(".num span");
    62. var len =index.length;
    63. if(len==0){
    64. $("#sl").text(0);
    65. }else{
    66. index.each(function(){
    67. zsl+=parseInt($(this).text());
    68. $("#sl").text(zsl);
    69. })
    70. }
    71. if($("#sl").text()>0){
    72. $(".count").css("background","#c10000");
    73. }else{
    74. $(".count").css("background","#8e8e8e");
    75. }
    76. }
    77. /*****************商品全选***********************/
    78. $("input[type='checkbox']").on('click',function(){
    79. var sf = $(this).is(":checked");
    80. var sc= $(this).hasClass("checkAll");
    81. if(sf){
    82. if(sc){
    83. $("input[type='checkbox']").each(function(){
    84. this.checked=true;
    85. });
    86. zg();
    87. jisuan();
    88. }else{
    89. $(this).checked=true;
    90. var len = $("input[type='checkbox']:checked").length;
    91. var len1 = $("input").length-1;
    92. if(len==len1){
    93. $("input[type='checkbox']").each(function(){
    94. this.checked=true;
    95. });
    96. }
    97. zg();
    98. jisuan();
    99. }
    100. }else{
    101. if(sc){
    102. $("input[type='checkbox']").each(function(){
    103. this.checked=false;
    104. });
    105. zg();
    106. jisuan();
    107. }else{
    108. $(this).checked=false;
    109. var len = $(".th input[type='checkbox']:checked").length;
    110. var len1 = $("input").length-1;
    111. if(len
    112. $('.checkAll').attr("checked",false);
    113. }
    114. zg();
    115. jisuan();
    116. }
    117. }
    118. });
    119. /****************************proDetail 加入购物车*******************************/
    120. $(".btns .cart").click(function(){
    121. if($(".categ p").hasClass("on")){
    122. var num = parseInt($(".num span").text());
    123. var num1 = parseInt($(".goCart span").text());
    124. $(".goCart span").text(num+num1);
    125. }
    126. });
    127. //删除购物车商品
    128. $('.del').click(function(){
    129. //定义商品id
    130. let gids="";
    131. //单个删除
    132. if($(this).parent().parent().hasClass("th")){
    133. $(".mask").show();
    134. $(".tipDel").show();
    135. index = $(this).parents(".th").index()-1;
    136. //TODO 获取当前的checkbox中设置的隐藏域(包含了商品ID)
    137. gids=$(".th").eq(index).find('div:eq(0) input[type=hidden]').val();
    138. $('.cer').click(function(){
    139. $(".mask").hide();
    140. $(".tipDel").hide();
    141. $(".th").eq(index).remove();
    142. $('.cer').off('click');
    143. if($(".th").length==0){
    144. $(".table .goOn").show();
    145. }
    146. del(gids);
    147. })
    148. }else{
    149. //选中多个一起删除
    150. if($(".th input[type='checkbox']:checked").length==0){
    151. $(".mask").show();
    152. $(".pleaseC").show();
    153. }
    154. else{
    155. $(".mask").show();
    156. $(".tipDel").show();
    157. let gidarr=new Array();
    158. $(".th input[type='checkbox']:checked").each(function(j){
    159. gidarr.push($(".th").eq(index).find('div:eq(0) input[type=hidden]').val());
    160. });
    161. gids=gidarr.join(",")
    162. $('.cer').click(function(){
    163. $(".th input[type='checkbox']:checked").each(function(j){
    164. index = $(this).parents('.th').index()-1;
    165. $(".th").eq(index).remove();
    166. if($(".th").length==0){
    167. $(".table .goOn").show();
    168. }
    169. })
    170. $(".mask").hide();
    171. $(".tipDel").hide();
    172. zg();
    173. jisuan();
    174. del(gids);
    175. })
    176. }
    177. }
    178. })
    179. $('.cancel').click(function(){
    180. $(".mask").hide();
    181. $(".tipDel").hide();
    182. })
    183. //在页面初始化事件外添加删除方法
    184. //删除商品
    185. function del(gids){
    186. $.post('/shopCar/delete',{
    187. 'gids':gids
    188. },function(rs){
    189. if(rs.code!=200)
    190. alert(rs.msg);
    191. else
    192. location.href='/shopCar/queryShopCar';
    193. },'json');
    194. }
    195. //在页面初始化事件外添加修改方法
    196. //更新商品数量
    197. function update(num,gid){
    198. $.post('/shopCar/update',{
    199. 'gid':gid,
    200. 'quantity':num
    201. },function(rs){
    202. if(rs.code!=200)
    203. alert(rs.msg);
    204. else
    205. location.href='/shopCar/queryShopCar';
    206. },'json');
    207. }
    208. })

    测试:

    今日内容就到这啦,下次再会!如果本文对您有帮助的话,点个赞支持一下叭~ 

  • 相关阅读:
    Docker 学习
    智慧公厕:打造智慧城市的环卫明珠
    C++ 条件变量的使用
    Day130.MySQL高级:Liunx安装、三大范式、InnoDB、数据结构、B+树
    Vue-table动态增加、删除表头不实时更新问题
    mmsegmentation 训练自制数据集
    java毕业设计养老院管理系统Mybatis+系统+数据库+调试部署
    插入排序与希尔排序
    深入理解传输层协议:TCP与UDP的比较与应用
    使用oss对象存储服务的两种方式
  • 原文地址:https://blog.csdn.net/weixin_65808248/article/details/127736372