电商平台的购物车代码逻辑
本文详细阐述了当时写购物车代码的逻辑,主要包括了以下部分:
- 添加商品到购物车
- 删除单个商品到购物车
- 清空购物车
其中,在思考添加商品到购物车的逻辑最为麻烦,主要考虑到在未登录的情况下,同样应该可以使用购物车功能。
1、封装根据用户id从数据库中获取购物车cart对象的方法,引用此方法得到cart对象
* 封装根据用户id从数据库中获取购物车cart对象的方法,引用此方法得到cart对象
*/
public Cart getCartBuyUid(String uid) throws SQLException {
List<CartSession> list = cartService.queryCartByUid(uid);
System.out.println("list-->"+list);
Cart cart2 = new Cart();
Map<String, CartItem> map = cart2.getCartitems();
if (list!=null) {
for (CartSession cartSession : list) {
map.put(cartSession.getProdid(), new CartItem(productService.queryProductByPid(cartSession.getProdid()), cartSession.getBuynum(), cartSession.getTotal()));
}
}
cart2.setCartitems(map);
cart2.setTotal(cartService.queryCartTotalCountByUid(uid));
return cart2;
}
2、封装方法根据uid 获取数据库中的cart数据,并传递到cart.jsp
* 根据uid 获取数据库中的cart数据,并传递到cart.jsp
*/
public void getCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
System.out.println("getcart:"+user);
if (user==null) {//未登录
Cart cart = (Cart) session.getAttribute("cart");
if (cart!=null) {
session.setAttribute("cart", cart);
response.sendRedirect("cart.jsp");
}response.sendRedirect("cart.jsp");
}else {//登陆过,判断session中是否有数据,有的话保存到数据库
Cart cartSession = (Cart) session.getAttribute("cart");
if (cartSession!=null) {
//删除session中的cart
session.removeAttribute("cart");
Map<String, CartItem> maps = cartSession.getCartitems();
for (Entry<String, CartItem> entry : maps.entrySet()) {
double submoney = entry.getValue().getProduct().getProdprice()*entry.getValue().getBuyNum();
int result = cartService.findCart(entry.getKey(), user.getuId());
System.out.println("result:"+result);
if (result==0) {//此商品数据库中没有,插入数据
cartService.saveCart(UUIDUtil.getUUID(), user.getuId(),submoney, entry.getKey(), entry.getValue().getBuyNum());
}else {//此商品数据库中有,更新数量,更新小计金额
int newBuyNum = entry.getValue().getBuyNum()+result;
double newSubTotal = new ProductServiceImpl().queryProductByPid(entry.getKey()).getProdprice()*newBuyNum;
cartService.updateCart(user.getuId(), newSubTotal, entry.getKey(), newBuyNum);
}
}
}
String uid = user.getuId();
System.out.println("uid:"+uid);
Cart cart = getCartBuyUid(uid);
System.out.println("getCart==>cart==>"+cart);
request.setAttribute("cart", cart);
request.getRequestDispatcher("cart.jsp").forward(request, response);
}
}
3、实现添加购物车功能,包括登录和未登录
- 登录后:数据保存在数据库,实现登录前保存在session的购物车信息与登录后保存在数据库的购物车数据合并,页面数据为重新从数据库中查询的数据
- 未登录:数据库保存在session中,页面显示数据为session中的数据
* 实现添加购物车功能,包括登录和未登录
* 登录后:数据保存在数据库,实现登录前保存在session的购物车信息与登录后保存在数据库的购物车数据合并,页面数据为重新从数据库中查询的数据
* 未登录:数据库保存在session中,页面显示数据为session中的数据
*/
public void addCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
HttpSession session = request.getSession();
String pid = request.getParameter("pid");
String buyNum = request.getParameter("buyNum");
User user = (User) session.getAttribute("user");
int number = 0;
try {
number = Integer.parseInt(buyNum);
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (number<=0) {
return;
}
if (user==null) {
//未登录,购物车保存在session中
Product product = productService.queryProductByPid(pid);
CartItem cartItem = new CartItem(product,number,product.getProdprice()*number);
Cart cart = (Cart) session.getAttribute("cart");
if (cart==null) {
cart = new Cart();
}
Map<String, CartItem> cartitems = cart.getCartitems();
if (cartitems.containsKey(pid)) {
CartItem it = cartitems.get(pid);
it.setBuyNum(number+it.getBuyNum());
it.setSubTotal(it.getSubTotal()+cartItem.getSubTotal());
}else {
cartitems.put(pid, cartItem);
}
cart.setTotal(cart.getTotal()+number*product.getProdprice());
session.setAttribute("cart", cart);
System.out.println("cart:"+cart);
request.getRequestDispatcher("cart.jsp").forward(request, response);
}else {//登录了账号
//判断session中是否存在cart,若存在,与本地合并,
Cart cart = (Cart) session.getAttribute("cart");
String uid = user.getuId();
if (cart!=null) { //session中存在session
session.removeAttribute("cart");
String cartid = UUIDUtil.getUUID();
Map<String, CartItem> map = cart.getCartitems();
for(Entry<String, CartItem> entry : map.entrySet()) {
double submoney = entry.getValue().getProduct().getProdprice()*entry.getValue().getBuyNum();
int result = cartService.findCart(entry.getKey(), uid);
System.out.println("result:"+result);
if (result==0) {//此商品数据库中没有,插入数据
cartService.saveCart(UUIDUtil.getUUID(), uid,submoney, entry.getKey(), entry.getValue().getBuyNum());
}else {//此商品数据库中有,更新数量,更新小计金额
int newBuyNum = entry.getValue().getBuyNum()+result;
double newSubTotal = new ProductServiceImpl().queryProductByPid(entry.getKey()).getProdprice()*newBuyNum;
cartService.updateCart(uid, newSubTotal, pid, newBuyNum);
}
}
}else {//登录前没有添加商品到购物车,商品判断 1.数据库没有,直接存储在数据库 2.数据库中,更新数量 ,更新小计金额
int result = cartService.findCart(pid, uid);
if (result==0) {//此商品数据库中没有,插入数据
cartService.saveCart(UUIDUtil.getUUID(), uid,productService.queryProductByPid(pid).getProdprice()*number, pid,number );
}else {//此商品数据库中有,更新数量,更新小计金额
int newBuyNum = number+result;
double newSubTotal = new ProductServiceImpl().queryProductByPid(pid).getProdprice()*newBuyNum;
cartService.updateCart(uid, newSubTotal, pid, newBuyNum);
}
}
//从数据库中取数据,封装cart对象,使用request转发cart对象到cart.jsp
Cart cart2 = getCartBuyUid(uid);
request.setAttribute("cart", cart2);
request.getRequestDispatcher("cart.jsp").forward(request, response);
}
}
4、删除购物车中单个商品信息
/*
* 删除购物车中单个信息
*/
public void removeCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
HttpSession session = request.getSession();
String pid = request.getParameter("pid");
User user = (User) session.getAttribute("user");
if (user==null) {//未登录
Cart cart = (Cart) session.getAttribute("cart");
if (cart!=null) {
Map<String, CartItem> cartitems = cart.getCartitems();
if (cartitems.containsKey(pid)) {
System.out.println("222");
cart.setTotal(cart.getTotal()-cartitems.get(pid).getSubTotal());
cartitems.remove(pid);
}
}
session.setAttribute("cart", cart);
response.sendRedirect("cart.jsp");
}else {//登陆了账号,要从数据库中删除数据
cartService.removeCartByPidAndUid(pid,user.getuId());
Cart cart = getCartBuyUid(user.getuId());
request.setAttribute("cart", cart);
request.getRequestDispatcher("cart.jsp").forward(request, response);
}
}
5、清空购物车
* 清空购物车 ,未登录:清空session中的数据 登录后:清空数据库中的数据
*/
public void emptyCart(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException{
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (user==null) {//未登录
session.removeAttribute("cart");
response.sendRedirect("cart?method=getCart");
}else { //已登录,清空数据库中购物车的数据
cartService.emptyCartBuyUid(user.getuId());
response.sendRedirect("cart?method=getCart");
}
}
6、总结
上述代码中,包含不同登陆状态下对添加商品,删除单个商品,清空整个购物车等功能的逻辑实现,纯属个人分析,不严谨的地方希望大家指出,共同学习,谢谢!