欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

购物车实战案例

程序员文章站 2022-06-21 17:07:06
...

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数据库中的数据