java商城项目实战之购物车功能实现
本文实例为大家分享了java实现购物车功能的具体代码,供大家参考,具体内容如下
1 需要实现
1、实现淘淘商城的购物车功能
2 购物车功能
2.1 功能说明
1、商品加入购物车时,不是必须要求登录。京东不需要登录,淘宝需要登录。各有好处。
2、计算购物车中商品的总价。当商品数量发生变化时需要重新计算。
3、用户可以删除购物车中的商品。
4、用户下单后,删除购物车的功能。
购物车在用户不登陆的情况下也可以使用购物车。需要把购物车的商品信息写入cookie中。所有对购物车的操作都是操作cookie。有效 的降低数据库的压力。
缺点:换一台电脑后购物车的商品不能同步。
实现的工程:taotao-protal中实现购物车功能。只需要调用商品信息的服务,除此之外不需要和其他系统交互。
2.2 功能分析
1、在用户不登陆的清空下也可以使用购物车,那么就需要把购物车信息放入cookie中。
2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。
3、取商品信息可以从cookie中把json数据取出来,然后转换成java对象即可。
4、此功能只需要操作cookie不需要数据库的支持,所以只需要在taotao-portal中实现即可。
5、购物车分有四种动作
a) 添加商品
b) 修改商品数量
c) 删除购物车中的商品
d) 展示购物车商品列表
2.3 添加购物车商品
在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给controller,controller接收id,controller调用service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。
2.3.1 service
功能:接收一个商品id,数量(默认为1),根据商品id查询商品信息。调用taotao-rest的服务。把商品添加到购物车,先把购物车商品列表取出来,判断列表中是否有此商品,如果有就增加数量就可以了。如果没有把此商品添加到商品列表。返回添加成功taotaoresult。
功能:
1、接收controller传递过来的商品id,根据商品id查询商品信息。
2、从cookie中取出购物车信息,转换成商品pojo列表。
3、把商品信息添加到商品列表中。
参数:
1、商品id
2、request
3、response
返回值:
taotaoresult
@service public class cartserviceimpl implements cartservice { //服务url @value("${rest_base_url}") private string rest_base_url; //商品服务url @value("${items_item_url}") private string items_item_url; //cookie中购物车商品对应的key @value("${cart_items_list_key}") private string cart_items_list_key; //购物车cookie生存期 @value("${cart_items_expire_time}") private integer cart_items_expire_time; /** * 添加购物车商品 * <p>title: additem</p> * <p>description: </p> * @param itemid * @param request * @param response * @return * @see com.taotao.portal.service.cartservice#additem(java.lang.long, javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse) */ @override public taotaoresult additem(long itemid, httpservletrequest request, httpservletresponse response) { //根据商品id查询商品信息 item item = getitembyid(itemid); if (item == null) return taotaoresult.build(400, "未查询到该商品信息"); //取cookie中购物车商品列表 list<item> cartitems = getitemlistfromcookie(request); //判断该商品是否存在于购物车中 boolean itemexists = false; for (item i : cartitems) { if (i.getid().longvalue() == itemid.longvalue()) { //购物车中有此商品 i.setnum(i.getnum() + 1); itemexists = true; break; } } //如果商品不存在于购物车则向购物车商品列表中添加一个商品 if (! itemexists) { //设置数量为1 item.setnum(1); //把商品添加到购物车 cartitems.add(item); } //把购物车信息写入cookie中 cookieutils.setcookie(request, response, cart_items_list_key, jsonutils.objecttojson(cartitems), cart_items_expire_time, true); return taotaoresult.ok(cartitems); } private item getitembyid(long itemid) { //根据商品id查询商品信息 string resultstr = httpclientutil.doget(rest_base_url + items_item_url + itemid); //转换成taotaoresult taotaoresult result = taotaoresult.formattopojo(resultstr, item.class); //取商品信息 item item = null; if (result.getstatus() == 200) { item = (item) result.getdata(); } return item; } private list<item> getitemlistfromcookie(httpservletrequest request) { //取cookie中购物车商品列表 string cartitemsstr = cookieutils.getcookievalue(request, cart_items_list_key, true); //如果不为空那么就转换成java对象 list<item> cartitems = null; if (!stringutils.isblank(cartitemsstr)) { cartitems = jsonutils.jsontolist(cartitemsstr, item.class); } else { cartitems = new arraylist<>(); } return cartitems; } }
2.3.2 商品pojo
商品pojo需要使用taotao-portal中的item。此pojo在反序列化时会抛异常。需要做如下修改:
2.3.3 controller
@controller @requestmapping("/cart") public class cartcontroller { @autowired private cartservice cartservice; @requestmapping("/add/{itemid}") public string additem(@pathvariable long itemid, httpservletrequest request, httpservletresponse response, model model) { //添加商品信息 taotaoresult result = cartservice.additem(itemid, request, response); //错误信息 if (result.getstatus() != 200) { model.addattribute("message", result.getmsg()); return "error/exception"; } //把购物车中的商品传递给页面 model.addattribute("cartlist", result.getdata()); return "cart"; } }
用户点击“我的购物车”展示购物车信息
2.4 展示购物车商品
2.4.1 service
/** * 取购物车列表 * <p> * title: getcartitemslist * </p> * <p> * description: * </p> * * @return * @see com.taotao.portal.service.cartservice#getcartitemslist() */ @override public list<item> getcartitemslist(httpservletrequest request) { // 从cookie中取商品列表 list<item> itemslist = getitemlistfromcookie(request); return itemslist; }
2.4.2 controller
@requestmapping("/cart") public string showcart(httpservletrequest request, model mode) { //取购物车信息 list<item> list = cartservice.getcartitemslist(request); mode.addattribute("cartlist", list); return "cart"; }
2.5 修改商品数量
当点击购物车商品的“+”、“-”号时增加或减少商品数量。减少商品数量时,如果数量为“1”则不继续减少。
2.5.1 service
/** * 修改指定商品的数量 * <p>title: changeitemnum</p> * <p>description: </p> * @param itemid * @param num * @param request * @param response * @return * @see com.taotao.portal.service.cartservice#changeitemnum(long, int, javax.servlet.http.httpservletrequest, javax.servlet.http.httpservletresponse) */ @override public taotaoresult changeitemnum(long itemid, int num, httpservletrequest request, httpservletresponse response) { //从cookie中取商品列表 list<item> list = getitemlistfromcookie(request); //从商品列表中找到要修改数量的商品 for (item item : list) { if (item.getid() == itemid) { //找到商品,修改数量 item.setnum(num); break; } } //把商品信息写入cookie cookieutils.setcookie(request, response, cart_items_list_key, jsonutils.objecttojson(list), cart_items_expire_time, true); return taotaoresult.ok(); }
2.5.2 controller
@requestmapping("/update/num/{itemid}/{num}") @responsebody public taotaoresult updatenumbyid(@pathvariable long itemid, @pathvariable integer num, httpservletrequest request, httpservletresponse response) { taotaoresult result = cartservice.changeitemnum(itemid, num, request, response); return result; }
2.6 删除购物车商品
2.6.1 service
/** * 删除购物车中的商品 * <p> * title: deleteitem * </p> * <p> * description: * </p> * * @param itemid * @param request * @param response * @return * @see com.taotao.portal.service.cartservice#deleteitem(java.lang.long, * javax.servlet.http.httpservletrequest, * javax.servlet.http.httpservletresponse) */ @override public list<item> deleteitem(long itemid, httpservletrequest request, httpservletresponse response) { list<item> itemslist = getcartitemslist(request); // 找到购物车中的商品,并删除之 for (item item : itemslist) { if (item.getid().longvalue() == itemid.longvalue()) { itemslist.remove(item); break; } } // 更新cookie中的购物车数据 cookieutils.setcookie(request, response, cart_items_list_key, jsonutils.objecttojson(itemslist), cart_items_expire_time, true); return itemslist; }
2.6.2 controller
@requestmapping("/delete/{itemid}") public string deleteitembyid(@pathvariable long itemid, httpservletrequest request, httpservletresponse response, model model) { list<item> list = cartservice.deleteitem(itemid, request, response); model.addattribute("cartlist", list); return "cart"; }
购物车存在的问题
1、更换设备购物车商品不能同步
a) 不能把购物车商品保存到数据库
b) 要求用户登录才能同步信息
c) 可以把购物车信息保存到redis中,key就是用户,value就是购物车列表
d) 购物车商品合并的问题。
2、提交订单后购物车商品需要清空。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。