电商项目(二十一)购物车(登陆情况下)
程序员文章站
2022-04-14 23:18:11
...
一、用户登录状态下的购物车操作
1. 将商品添加到购物车
1.1 在common_redis服务中实现缓存购物车信息
在common_redis模块,新增CartController,新增方法:将购物车的信息缓存到redis,方法的参数:@RequestBody Map<String,Object> map,方法的返回值:void
在业务层中实现将商品添加到缓存中
1.2 在common_redis服务中实现查询购物车信息
在common_redis模块,新增CartController,新增方法:根据用户ID查询购物车,方法的参数:@RequestParam String userId,方法的返回值:Map<String ,CartItem >
在业务层中实现查询购物车
1.3 在frontend_cart服务中实现用户在登陆状态下向购物车添加商品
在CartController中,在用户已经登录的情况下,
在业务层层中,方法的参数:Long itemId,Integer num,String userId,返回值: Result
流程:
第一,查询商品
定义方法,查询商品
第二,获取购物车(根据用户的id)
定义方法,获取购物车
第三,将商品加入购物车
第四,将购物车信息保存到Redis中
1.4 在frontend_cart服务中实现用户在登陆状态下向查看购物车商品
在CartController中实现用户登录的情况下的购物车
在业务层中RedisCartServiceImpl中,新增方法,查看购物车,
1.5 在frontend_cart服务中实现用户在登陆状态下购物车商品的数量修改
1.6 在frontend_cart服务中实现用户在登陆状态下购物车商品的删除
1.7 在frontend_sso模块实现用户登录业务实现购物车同步业务和删除
将临时购物车的商品同步到永久购物车
/**
* 用户注册与登录业务层
*/
@Service
public class SSOServiceImpl implements SSOService {
@Autowired
private TbUserMapper tbUserMapper;
@Autowired
private CommonRedisFeignClient commonRedisFeignClient;
@Value("${cart_cookie_name}")
private String cart_cookie_name;
/**
* 对用户的注册信息(用户名与电话号码)做数据校验
*/
@Override
public Result checkUserInfo(String checkValue, Integer checkFlag) {
TbUserExample example =new TbUserExample();
TbUserExample.Criteria criteria = example.createCriteria();
if(checkFlag == 1){
criteria.andUsernameEqualTo(checkValue);
}else if(checkFlag == 2){
criteria.andPhoneEqualTo(checkValue);
}
Integer rows = this.tbUserMapper.countByExample(example);
if(rows > 0){
return Result.error("数据不可用");
}
return Result.ok(checkValue);
}
/**
* 用户注册
*/
@Override
@LcnTransaction
public Result userRegister(TbUser user) {
//将密码做加密处理。
String pwd = MD5Utils.digest(user.getPassword());
user.setPassword(pwd);
//补齐数据
user.setCreated(new Date());
user.setUpdated(new Date());
this.tbUserMapper.insert(user);
return Result.ok();
}
/**
* 用户登录
* @param username
* @param password
* @return
*/
@Override
public Result userLogin(String username, String password,HttpServletRequest request,HttpServletResponse response) {
//根据用户名密码查询数据库
TbUser tbUser = this.login(username,password);
if(tbUser == null){
return Result.error("用户名或密码有误,请重新输入");
}
//将用户添加到Redis中
String userToken = UUID.randomUUID().toString();
Integer flag = this.insertUserToRedis(tbUser,userToken);
if(flag == 500){
return Result.error("登录失败");
}
Map<String,String> map = new HashMap<>();
map.put("token",userToken);
map.put("userid",tbUser.getId().toString());
map.put("username",tbUser.getUsername());
//将临时购物车中的商品同步到永久购物车中
this.syncCart(tbUser.getId().toString(),request);
//同步购物车成功后,需要将临时购物车中的商品删除掉
this.deleteCookieCart(request,response);
return Result.ok(map);
}
/**
* 同步购物车
*/
private void syncCart(String userId,HttpServletRequest request){
//获取临时购物车
Map<String,CartItem> cookieCart = this.getCart(request);
//获取永久购物车
Map<String,CartItem> redisCart = this.getCart(userId);
//删除永久购物车中所包含临时购物车中的商品
Set<String> keys = cookieCart.keySet();
for(String key:keys){
redisCart.remove(key);
}
//将同步后的购物车缓存到redis中
redisCart.putAll(cookieCart);
//将永久购物车重新缓存到redis中
this.addCartToRedis(userId,redisCart);
}
/**
* 获取临时购物车
*/
private Map<String,CartItem> getCart(HttpServletRequest request){
//临时购物车已存在
String cartJson= CookieUtils.getCookieValue(request,this.cart_cookie_name,true);
if(StringUtils.isBlank(cartJson)){
//临时购物车不存在
return new HashMap<String,CartItem>();
}
try{
//如果含有临时购物车,那么需要做json转换
Map<String,CartItem> map = JsonUtils.jsonToMap(cartJson,CartItem.class);
return map;
}catch(Exception e){
e.printStackTrace();
}
return new HashMap<String,CartItem>();
}
/**
* 获取永久购物车
*/
private Map<String,CartItem> getCart(String userId){
try{
Map<String,CartItem> cart = this.commonRedisFeignClient.selectCartByUserId(userId);
if(cart == null){
cart = new HashMap<String,CartItem>();
}
return cart;
}catch(Exception e){
e.printStackTrace();
}
return new HashMap<String,CartItem>();
}
/**
* 将永久购物车重新缓存到redis中
*/
private void addCartToRedis(String userId,Map<String,CartItem> cart){
Map<String,Object> map = new HashMap<>();
map.put("userId",userId);
map.put("cart",cart);
this.commonRedisFeignClient.insertCart(map);
}
/**
* 用户登录业务处理
*/
private TbUser login(String username,String password){
String pwd = MD5Utils.digest(password);
TbUserExample example = new TbUserExample();
TbUserExample.Criteria criteria = example.createCriteria();
criteria.andUsernameEqualTo(username);
criteria.andPasswordEqualTo(pwd);
List<TbUser> list = this.tbUserMapper.selectByExample(example);
if(list == null || list.size() <= 0){
return null;
}
return list.get(0);
}
/**
* 将用户添加到Redis中
*/
private Integer insertUserToRedis(TbUser tbUser,String userToken){
try{
this.commonRedisFeignClient.insertUser(tbUser,userToken);
return 200;
}catch(Exception e){
e.printStackTrace();
}
return 500;
}
}
上一篇: 电商项目(二十四)网关服务
下一篇: Spark调优 数据本地化调优