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;}}}}


阅读全文
0 0