SSM综合项目实战(TTSC) -- day12 购物车
来源:互联网 发布:网络作家收入100排行榜 编辑:程序博客网 时间:2024/06/01 08:48
一、购物车的流程
1、以前的购物车流程
存在的问题:
(1)、购物车保存在session,如果session销毁,购物车就没了
给购物车做持久化操作
(2)、用户未登录的时候,不能添加购物车
未登录状态,可以把购物车数据保存在cookie
(3)、购物车使用session,session是使用服务器的内存,使用了服务器的内存资源,这样很不好
MySQL数据库(数据的完整性)
redis数据库(使用redis,I/O读写速度快)
(4)、session无法共享,无法行水平扩展(集群)
2、现在的购物车个流程
二、购物车系统的搭建
1、购物车系统在架构中的位置
2、创建聚合父工程taotao-cart
3、创建父工程的子工程taotao-cart-interface、taotao-cart-service
4、加入依赖关系
taotao-cart-interface 依赖 taotao-manager-pojo
taotao-cart-service 依赖 taotao-manager-mapper、taotao-cart-interface
5、加入tomcat插件
6、将taotao-manager-service的配置文件拷入,并改造
7、将taotao-manager-service中的redis配置拷入
三、搭建购物车功能的代码环境
1、创建购物车的pojo类
package com.taotao.manager.pojo;/** * 购物车的pojo * * @author Administrator * */public class Cart extends BasePojo {private Long id;private Long userId;private Long itemId;private String itemTitle;private String itemImage;private Long itemPrice;private Integer num;public Cart(Long id, Long userId, Long itemId, String itemTitle, String itemImage, Long itemPrice, Integer num) {super();this.id = id;this.userId = userId;this.itemId = itemId;this.itemTitle = itemTitle;this.itemImage = itemImage;this.itemPrice = itemPrice;this.num = num;}public Cart() {super();// TODO Auto-generated constructor stub}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Long getUserId() {return userId;}public void setUserId(Long userId) {this.userId = userId;}public Long getItemId() {return itemId;}public void setItemId(Long itemId) {this.itemId = itemId;}public String getItemTitle() {return itemTitle;}public void setItemTitle(String itemTitle) {this.itemTitle = itemTitle;}public String getItemImage() {return itemImage;}public void setItemImage(String itemImage) {this.itemImage = itemImage;}public Long getItemPrice() {return itemPrice;}public void setItemPrice(Long itemPrice) {this.itemPrice = itemPrice;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}@Overridepublic String toString() {return "Cart [id=" + id + ", userId=" + userId + ", itemId=" + itemId + ", itemTitle=" + itemTitle+ ", itemImage=" + itemImage + ", itemPrice=" + itemPrice + ", num=" + num + "]";}}
2、创建购物车的Service层接口和实现类
package com.taotao.cart.service;/** * 购物车的业务层接口 * @author Administrator * */public interface CartService {}
package com.taotao.cart.service.impl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.taotao.cart.redis.RedisUtils;import com.taotao.cart.service.CartService;/** * 购物车的业务层实现类 * * @author Administrator * */@Servicepublic class CartServiceImpl implements CartService {@Autowiredprivate RedisUtils redisUtils;}
3、在taotao-cart-service中声明服务的发布
4、在taotao-portal加入对taotao-cart-interface的依赖并在spring.xml中声明服务的调用
5、创建表现层的CarController
四、购物车功能分析
1、商品详情页面添加购物车按钮分析及改造
2、需求分析
用户进入商品详情页可以点击“加入购物车”按钮,然后跳转到购物车详情页,可以查看到新添加的商品和之前添加的商品
首先完成登录状态下的购物车功能
实现需要完成两件事:
(1)、添加商品到购物车
获取用户信息 调用购物车服务,把商品数据保存在redis的购物车中的
参数包含:用户id,商品id,商品数量
(2)、展示购物车详情页
获取用户信息,需要用户的id
调用购物车服务,把该用户的所有购物车数据查询数来,根据用户id查询
跳转到购物车页面(cart.jsp),显示数据
前台系统实现的购物车功能,所以在前台系统的controller接受请求前台系统调用购物车服务,实现把商品添加到购物车中
五、实现登录状态的购物车功能
1、在静态资源文件中添加内容
2、编写Controlelr层代码
package com.taotao.portal.controller;import java.util.List;import javax.servlet.http.HttpServletRequest;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import com.taotao.cart.service.CartService;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.User;import com.taotao.portal.utils.CookieUtils;import com.taotao.sso.service.UserService;/** * 购物侧的表现层 * * @author Administrator * */@Controller@RequestMapping("cart")public class CartController {@Autowiredprivate CartService cartService;@Autowiredprivate UserService userService;@Value("${COOKIE_TICKET}")private String COOKIE_TICKET;/** * 添加商品到购物车 * * @param request * @param itemId * @param num * @return */@RequestMapping(value = "{itemId}", method = RequestMethod.GET)public String addItemByCart(HttpServletRequest request, @PathVariable Long itemId, Integer num) {// 从cookie中获取用户登录信息User user = this.getUserByTicket(request);// 判断用户是否登录if (user != null) {// 如果为不为null// 用户登录状态下添加购物车// 根据用户id查询购物车信息,把商品合并到购物车中this.cartService.addItemByCart(user.getId(), itemId, num);} else {// 如果为null,表示用户为登录}return "redirect:/cart/show.html";}/** * 从cookie中获取用户登录的信息 * * @param request */private User getUserByTicket(HttpServletRequest request) {// 从cookie中获取ticketString ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET, true);// 调用单点登录服务,根据ticket查询用户登录信息User user = this.userService.queryUserByTicket(ticket);return user;}/** * 展示购物车详情页面 * * @return */@RequestMapping(value = "show", method = RequestMethod.GET)public String show(HttpServletRequest request, Model model) {// 从cookie中获取用户登录信息User user = this.getUserByTicket(request);List<Cart> cartList = null;// 判断用户是否为nullif (user != null) {// 不为null表示用户已经登录// 根据用户id查询购物车信息cartList = this.cartService.queryCartByUserId(user.getId());} else {// 如果为null,表示用户未登录}// 把查询到的购物车列表传递给页面用于展示model.addAttribute("cartList", cartList);return "cart";}}
3、编写service层接口和实现类
package com.taotao.cart.service;import java.util.List;import com.taotao.manager.pojo.Cart;/** * 购物车的业务层接口 * * @author Administrator * */public interface CartService {/** * 添加商品到购物车中 * * @param id * @param itemId * @param num */public void addItemByCart(Long id, Long itemId, Integer num);/** * 根据用户id查询购物车列表 * * @param id * @return */public List<Cart> queryCartByUserId(Long id);}
package com.taotao.cart.service.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.cart.redis.RedisUtils;import com.taotao.cart.service.CartService;import com.taotao.manager.mapper.ItemMapper;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.Item;/** * 购物车的业务层实现类 * * @author Administrator * */@Servicepublic class CartServiceImpl implements CartService {private static final ObjectMapper MAPPER = new ObjectMapper();@Autowiredprivate RedisUtils redisUtils;@Value("${TAOTAO_CART_KEY_PRE}")private String TAOTAO_CART_KEY_PRE;@Autowiredprivate ItemMapper itemMapper;public void addItemByCart(Long userId, Long itemId, Integer num) {// 根据用户id查询购物车List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车,判断购物车中是否存在该商品Cart cart = null;for (Cart c : cartList) {// 判断购物车中是否存在该商品if (c.getItemId().longValue() == itemId.longValue()) {// 购物车中存在该商品cart = c;// 跳出循环break;}}if (cart != null) {// 如果购物车中存在商品,则商品数量相加cart.setNum(cart.getNum() + num);cart.setUpdated(new Date());} else {// 如果购物车中不存在商品,则把商品添加到购物车中// 根据id查询商品数据Item item = this.itemMapper.selectByPrimaryKey(itemId);// 创建购物车cart = new Cart();// 设置购物车数据cart.setUserId(userId);cart.setItemId(itemId);cart.setNum(num);if (null == item.getImages()) {cart.setItemImage("");} else {cart.setItemImage(item.getImages()[0]);}cart.setItemPrice(item.getPrice());cart.setItemTitle(item.getTitle());cart.setCreated(new Date());cart.setUpdated(cart.getCreated());// 把购物车添加到list集合中cartList.add(cart);}try {// 把修改后的购物车信息放到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {e.printStackTrace();}}@Overridepublic List<Cart> queryCartByUserId(Long userId) {// 根据用户id查询redis中的购物车信息String jsonCart = this.redisUtils.get(this.TAOTAO_CART_KEY_PRE + userId);// 判断json数据是否为nullif (StringUtils.isNotBlank(jsonCart)) {try {// 解析json数据List<Cart> list = MAPPER.readValue(jsonCart,MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));return list;} catch (Exception e) {e.printStackTrace();}}return new ArrayList<Cart>();}}
4、测试运行添加到购物车效果
5、实现在登录状态下购物车界面修改商品数量功能
(1)、分析页面商品数量加减号点击事件
(2)、编写CartController中修改商品数量的方法
/** * 购物车页面根据商品id修改商品数量 * * @param request * @param itemId * @param num */@RequestMapping(value = "update/num/{itemId}/{num}", method = RequestMethod.POST)@ResponseBodypublic void updateItemByCart(HttpServletRequest request, @PathVariable Long itemId, @PathVariable Integer num) {// 从cookie中获取当前用户登录信息String ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET);// 调用方法,根据ticket获取用户信息User user = this.userService.queryUserByTicket(ticket);// 判断用户是否登录if (user != null) {// 用户已经登录// 调用方法更新购物车信息this.cartService.updateItemByCart(user.getId(), itemId, num);//} else {// 用户未登录}}
(3)、编写Service层接口和实现类
/** * 修改购物车商品数量 * * @param userId * @param itemId * @param num */public void updateItemByCart(Long userId, Long itemId, Integer num);
/** * 修改购物车商品数量 */public void updateItemByCart(Long userId, Long itemId, Integer num) {// 根据用户id查询购物车信息List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车信息for (Cart cart : cartList) {// 判断购物车中是否存在该商品if (cart.getItemId().longValue() == itemId.longValue()) {// 存在该商品,修改商品数量cart.setNum(num);cart.setUpdated(new Date());try {// 把修改后的商品数据放到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 跳出循环break;}}}
6、实现登录状态下的删除购物车中商品操作
(1)、Controller层代码
/** * 删除购物车中的商品 * * @param request * @param itemId * @return */@RequestMapping(value = "delete/{itemId}", method = RequestMethod.GET)public String deleteItemByCart(HttpServletRequest request, @PathVariable Long itemId) {// 从cookie中获取用户ticketString ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET);// 调用方法,根据ticket获取用户信息User user = this.userService.queryUserByTicket(ticket);// 判断用户是否为nullif (user != null) {// 用户已经登录this.cartService.deleteItemByCart(user.getId(), itemId);} else {// 用户未登录}return "redirect:/cart/show.html";}
(2)、Service层接口和实现类
/** * 删除购物车中的商品 * * @param id * @param itemId */public void deleteItemByCart(Long id, Long itemId);
/** * 删除购物车中的商品 */public void deleteItemByCart(Long userId, Long itemId) {// 根据用户信息,查询出购物车列表List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车for (Cart cart : cartList) {// 判断商品是否存在if (cart.getItemId().longValue() == itemId.longValue()) {// 存在,则删除商品cartList.remove(cart);try {// 将数据从新写回到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 跳出循环break;}}}
六、实现未登录状态的购物车功能
1、修改spring.xml中扫描注解的路径,并添加商品服务的调用
2、在资源文件中添加cookie中存放购物车的key
3、修改未登录状态下添加购物车和展示购物车信息的代码
(1)、Controlelr层
(2)、Service层
package com.taotao.portal.service;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.Item;import com.taotao.manager.service.ItemService;import com.taotao.portal.utils.CookieUtils;/** * 从cookie中操作购物车信息的业务层方法 * @author Administrator * */@Servicepublic class CartCookieService {private static final ObjectMapper MAPPER = new ObjectMapper();@Value("${TAOTAO_COOKIE_CART}")private String TAOTAO_COOKIE_CART;@Autowiredprivate ItemService itemService;/** * 未登录状态下将商品添加到购物成中的操作 * * @param request * @param response * @param itemId * @param num */public void addItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {// 查询cookie中的购物车数据List<Cart> cartList = this.queryCartByCookie(request);// 遍历购物车Cart cart = null;for (Cart c : cartList) {// 判断商品是否存在if (c.getItemId().longValue() == itemId.longValue()) {cart = c;// 跳出循环break;}}// 判断Cookie中的购物车是否存在if (cart != null) {// 购物车存在,把商品数量添加cart.setNum(cart.getNum() + num);cart.setUpdated(new Date());} else {// 购物车不存在,新增商品// 根据id查询商品数据Item item = this.itemService.queryById(itemId);// 创建购物车,封装数据cart = new Cart();cart.setItemId(itemId);cart.setNum(num);if (item.getImages() != null && item.getImages().length > 0) {cart.setItemImage(item.getImages()[0]);} else {cart.setItemImage("");}cart.setItemPrice(item.getPrice());cart.setItemTitle(item.getTitle());cart.setCreated(new Date());cart.setUpdated(item.getCreated());// 把封装好的商品数据放到购物车中cartList.add(cart);}try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART, MAPPER.writeValueAsString(cartList),60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}}/** * 查询cookie中的购物车 * * @param request * @return */public List<Cart> queryCartByCookie(HttpServletRequest request) {// 查询cookie中的购物车数据String jsonCart = CookieUtils.getCookieValue(request, this.TAOTAO_COOKIE_CART, true);// 判断数据是否为空if (StringUtils.isNotBlank(jsonCart)) {try {// 不为空,则解析为购物车List<Cart> list = MAPPER.readValue(jsonCart,MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));// 返回购物车数据return list;} catch (Exception e) {e.printStackTrace();}}return new ArrayList<Cart>();}}
4、实现未登录状态下修改购物车中商品数量和删除购物车信息
(1)、修改CartController中代码
(2)、添加cartCookieService中的方法
/** * 更新Cookie中购物车中商品数量 * * @param request * @param response * @param itemId * @param num */public void updateItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {// 从cookie中获取购物车列表List<Cart> cartList = this.queryCartByCookie(request);for (Cart cart : cartList) {if (cart.getItemId().longValue() == itemId.longValue()) {// 修改商品数量cart.setNum(num);cart.setUpdated(new Date());try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART,MAPPER.writeValueAsString(cartList), 60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}// 跳出循环break;}}}/** * 删除cookie中购物车信息 * * @param request * @param response * @param itemId */public void deleteItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId) {// 从cookie中获取购物车信息List<Cart> cartList = this.queryCartByCookie(request);// 遍历购物车列表for (Cart cart : cartList) {if (cart.getItemId().longValue() == itemId.longValue()) {// 删除商品信息cartList.remove(cart);// 保存购物车信息try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART,MAPPER.writeValueAsString(cartList), 60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}// 跳出循环break;}}}
七、购物车整体总结
1、流程分析
未登录
已登陆
2、Controller层代码
package com.taotao.portal.controller;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.taotao.cart.service.CartService;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.User;import com.taotao.portal.service.CartCookieService;import com.taotao.portal.utils.CookieUtils;import com.taotao.sso.service.UserService;/** * 购物侧的表现层 * * @author Administrator * */@Controller@RequestMapping("cart")public class CartController {@Autowiredprivate CartService cartService;@Autowiredprivate UserService userService;@Value("${COOKIE_TICKET}")private String COOKIE_TICKET;@Autowiredprivate CartCookieService cartCookieService;/** * 添加商品到购物车 * * @param request * @param itemId * @param num * @return */@RequestMapping(value = "{itemId}", method = RequestMethod.GET)public String addItemByCart(HttpServletRequest request, HttpServletResponse response, @PathVariable Long itemId,Integer num) {// 从cookie中获取用户登录信息User user = this.getUserByTicket(request);// 判断用户是否登录if (user != null) {// 如果为不为null// 用户登录状态下添加购物车// 根据用户id查询购物车信息,把商品合并到购物车中this.cartService.addItemByCart(user.getId(), itemId, num);} else {// 如果为null,表示用户未登录this.cartCookieService.addItemByCart(request, response, itemId, num);}return "redirect:/cart/show.html";}/** * 从cookie中获取用户登录的信息 * * @param request */private User getUserByTicket(HttpServletRequest request) {// 从cookie中获取ticketString ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET, true);// 调用单点登录服务,根据ticket查询用户登录信息User user = this.userService.queryUserByTicket(ticket);return user;}/** * 展示购物车详情页面 * * @return */@RequestMapping(value = "show", method = RequestMethod.GET)public String show(HttpServletRequest request, Model model) {// 从cookie中获取用户登录信息User user = this.getUserByTicket(request);List<Cart> cartList = null;// 判断用户是否为nullif (user != null) {// 不为null表示用户已经登录// 根据用户id查询购物车信息cartList = this.cartService.queryCartByUserId(user.getId());} else {// 如果为null,表示用户未登录// 从cookie中查询用户购物车信息cartList = this.cartCookieService.queryCartByCookie(request);}// 把查询到的购物车列表传递给页面用于展示model.addAttribute("cartList", cartList);return "cart";}/** * 购物车页面根据商品id修改商品数量 * * @param request * @param itemId * @param num */@RequestMapping(value = "update/num/{itemId}/{num}", method = RequestMethod.POST)@ResponseBodypublic void updateItemByCart(HttpServletRequest request, HttpServletResponse response, @PathVariable Long itemId,@PathVariable Integer num) {// 从cookie中获取当前用户登录信息String ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET);// 调用方法,根据ticket获取用户信息User user = this.userService.queryUserByTicket(ticket);// 判断用户是否登录if (user != null) {// 用户已经登录// 调用方法更新购物车信息this.cartService.updateItemByCart(user.getId(), itemId, num);} else {// 用户未登录// 调用方法更新数据this.cartCookieService.updateItemByCart(request, response, itemId, num);}}/** * 删除购物车中的商品 * * @param request * @param itemId * @return */@RequestMapping(value = "delete/{itemId}", method = RequestMethod.GET)public String deleteItemByCart(HttpServletRequest request, HttpServletResponse response,@PathVariable Long itemId) {// 从cookie中获取用户ticketString ticket = CookieUtils.getCookieValue(request, this.COOKIE_TICKET);// 调用方法,根据ticket获取用户信息User user = this.userService.queryUserByTicket(ticket);// 判断用户是否为nullif (user != null) {// 用户已经登录this.cartService.deleteItemByCart(user.getId(), itemId);} else {// 用户未登录this.cartCookieService.deleteItemByCart(request,response,itemId);}return "redirect:/cart/show.html";}}
3、Service层接口和实现类
(1)、cartService接口和实现类
cartService.java
package com.taotao.cart.service;import java.util.List;import com.taotao.manager.pojo.Cart;/** * 购物车的业务层接口 * * @author Administrator * */public interface CartService {/** * 添加商品到购物车中 * * @param id * @param itemId * @param num */public void addItemByCart(Long id, Long itemId, Integer num);/** * 根据用户id查询购物车列表 * * @param id * @return */public List<Cart> queryCartByUserId(Long id);/** * 修改购物车商品数量 * * @param userId * @param itemId * @param num */public void updateItemByCart(Long userId, Long itemId, Integer num);/** * 删除购物车中的商品 * * @param id * @param itemId */public void deleteItemByCart(Long id, Long itemId);}
CartServiceImpl.java
package com.taotao.cart.service.impl;import java.util.ArrayList;import java.util.Date;import java.util.List;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.cart.redis.RedisUtils;import com.taotao.cart.service.CartService;import com.taotao.manager.mapper.ItemMapper;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.Item;/** * 购物车的业务层实现类 * * @author Administrator * */@Servicepublic class CartServiceImpl implements CartService {private static final ObjectMapper MAPPER = new ObjectMapper();@Autowiredprivate RedisUtils redisUtils;@Value("${TAOTAO_CART_KEY_PRE}")private String TAOTAO_CART_KEY_PRE;@Autowiredprivate ItemMapper itemMapper;public void addItemByCart(Long userId, Long itemId, Integer num) {// 根据用户id查询购物车List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车,判断购物车中是否存在该商品Cart cart = null;for (Cart c : cartList) {// 判断购物车中是否存在该商品if (c.getItemId().longValue() == itemId.longValue()) {// 购物车中存在该商品cart = c;// 跳出循环break;}}if (cart != null) {// 如果购物车中存在商品,则商品数量相加cart.setNum(cart.getNum() + num);cart.setUpdated(new Date());} else {// 如果购物车中不存在商品,则把商品添加到购物车中// 根据id查询商品数据Item item = this.itemMapper.selectByPrimaryKey(itemId);// 创建购物车cart = new Cart();// 设置购物车数据cart.setUserId(userId);cart.setItemId(itemId);cart.setNum(num);if (null == item.getImages()) {cart.setItemImage("");} else {cart.setItemImage(item.getImages()[0]);}cart.setItemPrice(item.getPrice());cart.setItemTitle(item.getTitle());cart.setCreated(new Date());cart.setUpdated(cart.getCreated());// 把购物车添加到list集合中cartList.add(cart);}try {// 把修改后的购物车信息放到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {e.printStackTrace();}}@Overridepublic List<Cart> queryCartByUserId(Long userId) {// 根据用户id查询redis中的购物车信息String jsonCart = this.redisUtils.get(this.TAOTAO_CART_KEY_PRE + userId);// 判断json数据是否为nullif (StringUtils.isNotBlank(jsonCart)) {try {// 解析json数据List<Cart> list = MAPPER.readValue(jsonCart,MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));return list;} catch (Exception e) {e.printStackTrace();}}return new ArrayList<Cart>();}/** * 修改购物车商品数量 */public void updateItemByCart(Long userId, Long itemId, Integer num) {// 根据用户id查询购物车信息List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车信息for (Cart cart : cartList) {// 判断购物车中是否存在该商品if (cart.getItemId().longValue() == itemId.longValue()) {// 存在该商品,修改商品数量cart.setNum(num);cart.setUpdated(new Date());try {// 把修改后的商品数据放到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 跳出循环break;}}}/** * 删除购物车中的商品 */public void deleteItemByCart(Long userId, Long itemId) {// 根据用户信息,查询出购物车列表List<Cart> cartList = this.queryCartByUserId(userId);// 遍历购物车for (Cart cart : cartList) {// 判断商品是否存在if (cart.getItemId().longValue() == itemId.longValue()) {// 存在,则删除商品cartList.remove(cart);try {// 将数据从新写回到redis中this.redisUtils.set(this.TAOTAO_CART_KEY_PRE + userId, MAPPER.writeValueAsString(cartList));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}// 跳出循环break;}}}}
(2)、CartCookieService代码
CartCookieService.java
package com.taotao.portal.service;import java.util.ArrayList;import java.util.Date;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import com.fasterxml.jackson.databind.ObjectMapper;import com.taotao.manager.pojo.Cart;import com.taotao.manager.pojo.Item;import com.taotao.manager.service.ItemService;import com.taotao.portal.utils.CookieUtils;/** * 从cookie中操作购物车信息的业务层方法 * * @author Administrator * */@Servicepublic class CartCookieService {private static final ObjectMapper MAPPER = new ObjectMapper();@Value("${TAOTAO_COOKIE_CART}")private String TAOTAO_COOKIE_CART;@Autowiredprivate ItemService itemService;/** * 未登录状态下将商品添加到购物成中的操作 * * @param request * @param response * @param itemId * @param num */public void addItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {// 查询cookie中的购物车数据List<Cart> cartList = this.queryCartByCookie(request);// 遍历购物车Cart cart = null;for (Cart c : cartList) {// 判断商品是否存在if (c.getItemId().longValue() == itemId.longValue()) {cart = c;// 跳出循环break;}}// 判断Cookie中的购物车是否存在if (cart != null) {// 购物车存在,把商品数量添加cart.setNum(cart.getNum() + num);cart.setUpdated(new Date());} else {// 购物车不存在,新增商品// 根据id查询商品数据Item item = this.itemService.queryById(itemId);// 创建购物车,封装数据cart = new Cart();cart.setItemId(itemId);cart.setNum(num);if (item.getImages() != null && item.getImages().length > 0) {cart.setItemImage(item.getImages()[0]);} else {cart.setItemImage("");}cart.setItemPrice(item.getPrice());cart.setItemTitle(item.getTitle());cart.setCreated(new Date());cart.setUpdated(item.getCreated());// 把封装好的商品数据放到购物车中cartList.add(cart);}try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART, MAPPER.writeValueAsString(cartList),60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}}/** * 查询cookie中的购物车 * * @param request * @return */public List<Cart> queryCartByCookie(HttpServletRequest request) {// 查询cookie中的购物车数据String jsonCart = CookieUtils.getCookieValue(request, this.TAOTAO_COOKIE_CART, true);// 判断数据是否为空if (StringUtils.isNotBlank(jsonCart)) {try {// 不为空,则解析为购物车List<Cart> list = MAPPER.readValue(jsonCart,MAPPER.getTypeFactory().constructCollectionType(List.class, Cart.class));// 返回购物车数据return list;} catch (Exception e) {e.printStackTrace();}}return new ArrayList<Cart>();}/** * 更新Cookie中购物车中商品数量 * * @param request * @param response * @param itemId * @param num */public void updateItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId, Integer num) {// 从cookie中获取购物车列表List<Cart> cartList = this.queryCartByCookie(request);for (Cart cart : cartList) {if (cart.getItemId().longValue() == itemId.longValue()) {// 修改商品数量cart.setNum(num);cart.setUpdated(new Date());try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART,MAPPER.writeValueAsString(cartList), 60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}// 跳出循环break;}}}/** * 删除cookie中购物车信息 * * @param request * @param response * @param itemId */public void deleteItemByCart(HttpServletRequest request, HttpServletResponse response, Long itemId) {// 从cookie中获取购物车信息List<Cart> cartList = this.queryCartByCookie(request);// 遍历购物车列表for (Cart cart : cartList) {if (cart.getItemId().longValue() == itemId.longValue()) {// 删除商品信息cartList.remove(cart);// 保存购物车信息try {// 把修改后的购物车信息放到cookie中CookieUtils.setCookie(request, response, this.TAOTAO_COOKIE_CART,MAPPER.writeValueAsString(cartList), 60 * 60 * 24, true);} catch (Exception e) {e.printStackTrace();}// 跳出循环break;}}}}
- SSM综合项目实战(TTSC) -- day12 购物车
- SSM综合项目实战(TTSC) -- day14 项目部署、MyCat
- SSM综合项目实战(TTSC) -- day09 Solr,搜索系统
- SSM综合项目实战(TTSC) -- day13 订单、定时器Quartz
- SSM综合项目实战(TTSC) -- day01 项目介绍、工程搭建
- SSM综合项目实战(TTSC) -- day02 Dubbo注册中心,通用Mapper,分页插件
- SSM综合项目实战(TTSC) -- day03 Nginx,类目选择,新增商品
- SSM综合项目实战(TTSC) -- day04 图片上传、商品列表
- SSM综合项目实战(TTSC) -- day05 搭建门户,内容管理,大广告位
- SSM综合项目实战(TTSC) -- day06 大广告位、添加缓存
- SSM综合项目实战(TTSC) -- day07 RESTful,HttpClient,单点登录
- SSM综合项目实战(TTSC) -- day08 单点登录,注册登录,jsonp
- SSM综合项目实战(TTSC) -- day10 搜索实现,同步问题,ActiveMQ
- SSM综合项目实战(TTSC) -- day11 商品详情页,FreeMarker
- SSH综合项目实战(快递) -- day12 shiro授权的方法、菜单功能添加
- ssm实战--实现购物车功能
- 购物车的综合
- ssm实战项目视频
- 怎样才能赚到钱系列(二)
- 设计模式之工厂模式
- HDU
- 简单明了理解java中的“==”和“equals”的区别
- LeetCode 560 Subarray Sum Equals K
- SSM综合项目实战(TTSC) -- day12 购物车
- [BZOJ2440][中山市选2011]完全平方数(二分+容斥)
- web.xml之context-param,listener,filter,servlet加载顺序及其周边
- 微服务应用概念整理
- #java#对十个到多个数进行排序
- 前端案例-原生javascript开发打气球小游戏
- 【HTML+JavaScript+CSS】动画,特效
- Tomcat中的Connector和Container
- tensorflow 实战笔记