购物车实战案例

1. 创建ego-item-web购物车系统

(1) 谈谈购物车的实现过程
用户登录后点击要加入购物车的商品,前台会将商品的id返回给后台,根据商品的id查询数据库,将查询的数据存储到Redis数据库中,商品的id为key,商品的详细信息为value,存储,再将map集合储存到用户的map集合中,用户id为key,存储商品信息的map为value,存储到Redis中。
(2) 谈谈购物车的数据模型,购物车和商品之间的关系
购物车类中属性封装了TbItem购买商品对象数据和num购买商品数量数据

2. ego-item-web添加拦截器

(1) 描述springmvc中拦截器的定义步骤

package com.bjsxt.ego.item.interceptor;

import com.bjsxt.ego.beans.CookieUtils;
import com.bjsxt.ego.beans.JsonUtils;
import com.bjsxt.ego.rpc.pojo.TbUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import redis.clients.jedis.JedisCluster;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 拦截器两种实现
 * 1、继承HandlerInterceptorAdapter
 * 2、实现接口HandlerInterceptor
 */
public class LoginInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private JedisCluster jedisCluster;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //获得token
        String token = CookieUtils.getCookieValue(request, "sso_token");

        if (!StringUtils.isEmpty(token)) {
            //查询Redis数据库
            String jsonStr = jedisCluster.get(token);
            //验证用户是否登录
            if (!StringUtils.isEmpty(jsonStr)) {

                TbUser tbUser = JsonUtils.jsonToPojo(jsonStr, TbUser.class);
                request.setAttribute("user", tbUser);

                //说明登录放行
                return true;
            }
        }

        //在用户登陆成功后需要跳转的路径
        String url = request.getRequestURL().toString();
        //重定向到登录页面
        response.sendRedirect("http://localhost:8083/login?redirect="+url);
        return false;
    }
}

(2) 说明springmvc中拦截器的两种注册的区别
一个是类继承HandlerInterceptorAdapter,一个是接口HandlerInterceptor
类中已经重写了方法只需调用需要的方法即可,而接口必须重写接口中的所有方法,造成冗余。

3. 商品添加到购物车

(1) 描述商品添加到购物车的过程

@Override
public void addItemToCarService(Long itemid, Long uid) {

    //获得商品对象
    TbItem tbItem = itemService.loadTbItemById(itemid);

    //判断用户是否是第一次购物,或者判断是否已经存在的map
    carMap = carItemDao.loadCarMap(String.valueOf(uid));
    if(carMap==null){
        //创建Map集合对象
        carMap = new HashMap<>();
    }

    //判断item对象的商品是否存在于一个购物车对象
    String carItemStr = carItemDao.loadCarItem(String.valueOf(uid), String.valueOf(itemid));
    if(StringUtils.isEmpty(carItemStr)){
        //创建购物车对象
        carItem = new CarItem();
        //将商品放入购物车
        carItem.setItem(tbItem);
        carItem.setNum(1);
    }else {
        carItem = JsonUtils.jsonToPojo(carItemStr, CarItem.class);
        /*System.out.println(carItem);*/
        carItem.setNum(carItem.getNum()+1);
    }

    //将商品对象转换为json字符串
    String jsonStr = JsonUtils.objectToJson(carItem);
    //购物车对象放入map集合
    carMap.put(String.valueOf(itemid),jsonStr);

    //将数据存储到Redis数据库
    carItemDao.addCarMap(String.valueOf(uid),carMap);

}

(2) 描述商品添加到购物车重复购买某个商品的解决方案
判断用户是否是第一次购物,或者判断是否已经存在的map,如果是第一次登录,新建一个用户专属的map集合,如果存在则获取存在Redis数item对象的商品是否存在于一个购物车对象,如果存在获取对象将商品数量加一操作,然后将商品对象转化为json字符串,重新放入map中存储到Redis数据库中

4. 描述查看购物车列表的实现思路

(1) 描述用户登录状态获取的实现过程
通过request请求回去用户的登录状态,获取Redis数据库中的value验证是否登录

(2) 描述怎么将redis数据库查询获得Map集合转化为List集合

1.从redis缓存中获取的为map集合
Map<String, String> m = null;
try {
m = RedisUtil.getIns().hashGetAll(kdid);
} catch (Exception e) {
e.printStackTrace();
}
List sublist = new ArrayList();
for (String key : m.keySet()) {
//将字符串反序列化为list
String value = m.get(key);
JSONArray jsonAry = JSONArray.fromObject(value);
for(int i=0;i<jsonAry.size();i++){
Map map = (Map) JSONObject.toBean((JSONObject) jsonAry.get(i),HashMap.class);  
sublist.add(map);
} 
}
list.addAll(sublist);



2.从redis缓存中获取的为list集合

list = new ArrayList();
List subList = RedisUtil.getIns().hashGetT(kdid, kcid, List.class);
for(int i=0;i<subList.size();i++){
JSONObject jsonObject = JSONObject.fromObject(subList.get(i)) ;
Map map = (Map) JSONObject.toBean(jsonObject,HashMap.class); 
list.add(map);
}

5. 修改购物车数量

(1) 描述实现购物车数量修改的实现思路

@Override
public String updateCarItemNumService(Long itemid, Long uid,Integer num) {
    try {
        //获得需要修改的购物车对象
        String carItemStr = carItemDao.loadCarItem(String.valueOf(uid), String.valueOf(itemid));
        //将carItemStr转换成caritem对象
        CarItem carItem = JsonUtils.jsonToPojo(carItemStr, CarItem.class);
        //修改购物车数量
        carItem.setNum(num);

        //将修改后的数据更新到Redis数据库
        carItemDao.updateCarMapNum(String.valueOf(uid), String.valueOf(itemid),JsonUtils.objectToJson(carItem));

        return "ok";
    }catch (Exception e){
        e.printStackTrace();
    }
    return null;
}


(2)	修改购物车数量需要前端提交什么参数?
/**
 * 处理更新购物车数量的请求
 */
@RequestMapping("/cart/update/num/{itemid}/{num}")
@ResponseBody
public String cartUpdateNum(@PathVariable Long itemid,
                            @PathVariable Integer num,
                            HttpServletRequest request){
    TbUser user = (TbUser) request.getAttribute("user");
    Long uid = user.getId();
    return carItemService.updateCarItemNumService(itemid,uid,num);
}

6. 删除购物车商品_清空购物车

.
(1) 描述删除购物车的实现思路
根据用户id查询对应的购物车数据模型,再根据itemid查询需要删除的数据,在执行删除Redis数据库中的删除方法
(2) 描述清空购物车的实现思路
根据用户id查询对应的购物车数据模型,调用Redis中的del方法删除Redis数据库中的数据

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值