购物车实战案例
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数据库中的数据
上一篇: 分布式Session解决方案
推荐阅读
-
建议收藏:.net core 使用EPPlus导入导出Excel详细案例,精心整理源码已更新至开源模板
-
微服务架构案例(06):通过业务、应用、技术、存储方面,聊聊架构
-
让Python给你讲笑话、段子,一个有趣的Python案例
-
Go语言冒泡、选择、插入、快速排序实战浅析
-
Python入门(一个有趣的画图例子实战)你肯定不会
-
微服务架构案例(02):业务架构设计,系统分层管理
-
SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅
-
实战SpringCloud响应式微服务系列教程(第九章)使用Spring WebFlux构建响应式RESTful服务
-
Docker基础与实战,看这一篇就够了
-
JS实现的贪吃蛇游戏案例详解