关于电商项目的购物车总结和购物车实现
本文中简述的购物车模仿京东的模式,用户没有登录,也可进行购物车的操作,如果用户登录了,则在数据库中操作购物车。我们基于存放在cookies里面。
先看添加到购物车的按钮
看这个界面是因为,如果放代码,因为代码中很多的数据是与其他相互关联的,所以只要理解了购物车的模式和方法,实现起来就没有那么复杂了,这里放一下,加入购物车需要哪些参数
<form id="cart_form" action="add_cart.do" method="post">
<input type="hidden" name="sku_mch" value="${obj_sku.sku_mch}"/>//商品的描述
<input type="hidden" name="sku_jg" value="${obj_sku.jg}"/>//商品的价格
<input type="hidden" name="tjshl" value="1"/>//添加数量
<input type="hidden" name="hj" value="${obj_sku.jg}"/>//合计
<input type="hidden" name="shp_id" value="${obj_sku.shp_id}"/>//商品的ID
<input type="hidden" name="sku_id" value="${obj_sku.id}"/>//sku的ID
<input type="hidden" name="shp_tp" value="${obj_sku.spu.shp_tp}"/>//商品的图片
<input type="hidden" name="shfxz" value="1"/>//是否选中
<input type="hidden" name="kcdz" value="${obj_sku.kcdz}"/>//库存地址
<c:if test="${not empty user}">
<input type="hidden" name="yh_id" value="${user.id}"/>//是否用户登录
</c:if>
<img src="images/shop.jpg" οnclick="cart_submit()" alt="" style="cursor:pointer;">
</form>
这些信息可根据实际的业务需求来添加和减少,根据购物车的字段进行传参。这里其实还要对商品的库存进行查询,判断商品的库存是否大于等于用户加入购物车商品的数量,也要检查当前游览器是否支持cookies,
后台java代码
购物车bean
public class T_MALL_SHOPPINGCAR {
private int id;
private String sku_mch;
private double sku_jg;
private int tjshl;
private double hj;
private int yh_id;
private int shp_id;
private Date chjshj;
private int sku_id;
private String shp_tp;
private String shfxz;
private String kcdz;
//setter 与 getter 方法省。。。。
}
@RequestMapping("add_cart")
public String add_cart(HttpSession session, HttpServletResponse response,
@CookieValue(value = "list_cart_cookie", required = false) String list_cart_cookie,T_MALL_SHOPPINGCAR cart, ModelMap map) {
List<T_MALL_SHOPPINGCAR> list_cart = new ArrayList<T_MALL_SHOPPINGCAR>();
int yh_id = cart.getYh_id();
// 添加购物车操作
if (yh_id == 0) {
// 用户未登陆,操作cookie
if (StringUtils.isBlank(list_cart_cookie)) {
list_cart.add(cart);
} else {
list_cart = MyJsonUtil.json_to_list(list_cart_cookie, T_MALL_SHOPPINGCAR.class);
// 判断是否重复
boolean b = if_new_cart(list_cart, cart);
if (b) {
// 新车,添加
list_cart.add(cart);
} else {
// 老车,更新
for (int i = 0; i < list_cart.size(); i++) {
if (list_cart.get(i).getSku_id() == cart.getSku_id()) {
/*遍历循环,要有相同的商品,则把购物车的商品 数量加一*/
list_cart.get(i).setTjshl(list_cart.get(i).getTjshl() + cart.getTjshl());
/*计算该商品的合计,该商品的数目 * 该商品的价格*/
list_cart.get(i).setHj(list_cart.get(i).getTjshl() * list_cart.get(i).getSku_jg());
}}
}}
// 覆盖cookie
Cookie cookie = new Cookie("list_cart_cookie", MyJsonUtil.list_to_json(list_cart));
cookie.setMaxAge(60 * 60 * 24);
response.addCookie(cookie);
} else {
list_cart = (List<T_MALL_SHOPPINGCAR>) session.getAttribute("list_cart_session");// 数据库
// 用户已登陆,操作db
/*判断该商品是否存在*/
boolean b = cartService.if_cart_exists(cart);
if (!b) {
cartService.add_cart(cart);
if (list_cart == null || list_cart.isEmpty()) {
list_cart = new ArrayList<T_MALL_SHOPPINGCAR>();
list_cart.add(cart);
session.setAttribute("list_cart_session", list_cart);
} else {
list_cart.add(cart);
}
} else {
for (int i = 0; i < list_cart.size(); i++) {
if (list_cart.get(i).getSku_id() == cart.getSku_id()) {
list_cart.get(i).setTjshl(list_cart.get(i).getTjshl() + cart.getTjshl());
list_cart.get(i).setHj(list_cart.get(i).getTjshl() * list_cart.get(i).getSku_jg());
// 老车,更新
cartService.update_cart(list_cart.get(i));
}
}
}
}
return "redirect:/cart_success.do";
}
private boolean if_new_cart(List<T_MALL_SHOPPINGCAR> list_cart, T_MALL_SHOPPINGCAR cart) {
boolean b = true;
for (int i = 0; i < list_cart.size(); i++) {
if (list_cart.get(i).getSku_id() == cart.getSku_id()) {
b = false;
}
}
return b;
}
这里我把实现的业务放到了controller来方便查看,这里我们可以看到这个@CookieValue(value = “list_cart_cookie”, required = false) String list_cart_cookie,可以获得cookies得值,如没有则是空,而这个不是必须的,首先根据页面是否传来ID来判断用户是否登录,如果用户没有登录,则进行cookies的操作,先判断获得的list_cart_cookie是否为空,如果为空,说明用户还未加商品,直接将商品加入到购物车集合就行了,如果cookies有购物车,先将购物车转为对象,因为cookies获得的值为String类型,判断用户添加的商品与购物车已经存在的商品是否有重复的,遍历商品,看在购物车里面是否存在即可,如不存在,则直接添加,存在,将商品的数量和购物车商品的数量相加,计算商品的总价格,更新购物车,覆盖cookies,如果用户已经登录了,则将购物车从session中获取(用户在登录的时候,已经将购物车与session同步),接下来的步骤与未登录的步骤是一样的,看代码即明白了。
最后使用 return “redirect:/cart_success.do”;防止用户多次提交表单。使用redirect的母的就是防止用户刷新表单,数据再一次提交。下面来看购物车的列表
这里可以对购物车进行改删和进行数量的修改。这些功能不是很难,这里就不给代码了,以及点击图片可以查看商品的详情。大概购物车的功能差不多了,日后想到在补充。