springboot项目实战---Redis购物车

Redis购物车

个人商城系统,后台对购物车数据进行“半持久化”。
因为购物车增删改的操作很频繁,如果使用mysql效率会很低,
所以使用redis进行存储。如果担心redis会挂,可使用redis集群,还是很靠谱的


配置文件 和redis连接池

参考上一篇redis进行缓存
购物车redis缓存设置:
CartPrefix.class

public class CartPrefix extends BasePrefix{

    public CartPrefix(int expireSeconds, String prefix) {
        super(expireSeconds, prefix);
    }

    /**
     * 设置购物车缓存
     */
    public static CartPrefix getCartList= new CartPrefix(0,"cart");
}

购物车service层代码:
CartService.class

@Service
@Slf4j
public class CartServiceImpl implements CartService {
    @Autowired
    RedisService redisService;

    @Autowired
    ProductInfoDao productInfoDao;

    @Override
    public int addCart(String userId, String productId, int num) {
        //key为 userId_cart,校验是否已存在
        Boolean exists = redisService.existsValue(CartPrefix.getCartList,userId,productId);
        if (exists){
            //获取现有的购物车中的数据
            String json = redisService.hget(CartPrefix.getCartList,userId,productId);
            if (json !=null){
                //转换为java实体类
                CartDto cartDto = JSON.toJavaObject(JSONObject.parseObject(json),CartDto.class);
                cartDto.setProductNum(cartDto.getProductNum()+num);
                redisService.hset(CartPrefix.getCartList,userId,productId,JSON.toJSON(cartDto).toString());
            }else {
                return 0;
            }
            return 1;
        }
        //根据商品id获取商品
        ProductInfo productInfo = productInfoDao.findProductById(productId);
        if (productInfo==null){
            return 0;
        }
        //设置购物车值
        CartDto cartDto = new CartDto();
        cartDto.setProductId(productId);
        cartDto.setProductName(productInfo.getProductName());
        cartDto.setProductIcon(productInfo.getProductIcon());
        cartDto.setProductPrice(productInfo.getProductPrice());
        cartDto.setProductStatus(productInfo.getProductStatus());
        cartDto.setProductNum(num);
        cartDto.setCheck("1");
        redisService.hset(CartPrefix.getCartList,userId,productId,JSON.toJSON(cartDto).toString());
        return 1;
    }

    /**
     * 展示购物车
     * @param userId
     * @return
     */
    @Override
    public List<CartDto> getCartList(String userId) {
        List<String> jsonList = redisService.hvals(CartPrefix.getCartList,userId);
        List<CartDto> cartDtoList = new LinkedList<>();
        for (String json:jsonList){
            CartDto cartDto = JSON.toJavaObject(JSONObject.parseObject(json),CartDto.class);
            cartDtoList.add(cartDto);
        }
        return cartDtoList;
    }

    /**
     * 更新数量
     * @param userId
     * @param productId
     * @param num
     * @return
     */
    @Override
    public int updateCartNum(String userId, String productId, int num) {
        String json = redisService.hget(CartPrefix.getCartList,userId,productId);
        if (json==null){
            return 0;
        }
        CartDto cartDto = JSON.toJavaObject(JSONObject.parseObject(json),CartDto.class);
        cartDto.setProductNum(num);
        redisService.hset(CartPrefix.getCartList,userId,productId,JSON.toJSON(cartDto).toString());
        return 1;
    }

    /**
     * 全选商品
     * @param userId
     * @param checked
     * @return
     */
    @Override
    public int checkAll(String userId, String checked) {
        //获取商品列表
        List<String> jsonList = redisService.hvals(CartPrefix.getCartList,userId);
        for (String json:jsonList){
            CartDto cartDto = JSON.toJavaObject(JSONObject.parseObject(json),CartDto.class);
            if ("true".equals(checked)){
                cartDto.setCheck("1");
            }else if ("false".equals(checked)){
                cartDto.setCheck("0");
            }else {
                return 0;
            }
            redisService.hset(CartPrefix.getCartList,userId,cartDto.getProductId(),JSON.toJSON(cartDto).toString());
        }
        return 1;
    }

    /**
     * 删除商品
     * @param userId
     * @param productId
     * @return
     */
    @Override
    public int delCartProduct(String userId, String productId) {
        redisService.hdel(CartPrefix.getCartList,userId,productId);
        return 1;
    }

    /**
     * 清空购物车
     * @param userId
     * @return
     */
    @Override
    public int delCart(String userId) {
        redisService.delete(CartPrefix.getCartList,userId);
        return 1;
    }
}

购物车接口实现:
CartController.class

@RestController
@RequestMapping("/cart")
@Slf4j
public class CartController {
    @Autowired
    CartService cartService;

    /**
     * 加入购物车
     * @param reqMap
     * @param user
     * @return
     */
    @PostMapping(value = "/add")
    @Autorization
    public Object addCart(@RequestBody Map<String, Object> reqMap, @CurrentUser User user){
        //获取登陆用户的userId
        String userId = RequestUtil.getMapString(user.getId());
        String productId = RequestUtil.getMapString(reqMap.get("product_id").toString());
        String numString = RequestUtil.getMapString(reqMap.get("product_num").toString());
        Integer num = Integer.parseInt(numString);
        //加入购物车
        int effectNum = cartService.addCart(userId,productId,num);
        if (effectNum<=0){
            return ResultUtil.fail(ResultEnum.ADD_CART_ERROR);
        }
        return ResultUtil.ok(ResultEnum.ADD_CART_SUCCESS.getMessage());
    }

    @GetMapping(value = "/getCartList")
    @Autorization
    public Object getCartList(@CurrentUser User user){
        String userId = RequestUtil.getMapString(user.getId());
        List<CartDto> cartDtoList = cartService.getCartList(userId);
        return ResultUtil.ok(cartDtoList);
    }

    @PostMapping(value = "/updateCartNum")
    @Autorization
    public Object updateCartNum(@RequestBody Map<String,Object> reqMap,@CurrentUser User user){
        String userId = RequestUtil.getMapString(user.getId());
        String productId = RequestUtil.getMapString(reqMap.get("product_id").toString());
        String numString = RequestUtil.getMapString(reqMap.get("product_num").toString());
        Integer num = Integer.parseInt(numString);

        int effectNum = cartService.updateCartNum(userId,productId,num);
        if (effectNum <=0){
            return ResultUtil.fail();
        }
        return ResultUtil.ok();
    }

    @PostMapping(value = "/checkAll")
    @Autorization
    public Object checkAll(@RequestBody Map<String,Object> reqMap,@CurrentUser User user){
        String userId = RequestUtil.getMapString(user.getId());
        String check = RequestUtil.getMapString(reqMap.get("check").toString());

        int effectNum = cartService.checkAll(userId,check);
        if (effectNum <=0){
            return ResultUtil.fail();
        }
        return ResultUtil.ok();
    }

    @PostMapping("/delCartProduct")
    @Autorization
    public Object delCartProduct(@RequestBody Map<String,Object> reqMap,@CurrentUser User user){
        String userId = RequestUtil.getMapString(user.getId());
        String productId = RequestUtil.getMapString(reqMap.get("product_id").toString());

        int effectNum = cartService.delCartProduct(userId,productId);
        if (effectNum <=0){
            return ResultUtil.fail();
        }
        return ResultUtil.ok();
    }

    @PostMapping("/delCart")
    @Autorization
    public Object delCart(@CurrentUser User user){
        String userId = RequestUtil.getMapString(user.getId());

        int effectNum = cartService.delCart(userId);
        if (effectNum <=0){
            return ResultUtil.fail();
        }
        return ResultUtil.ok();
    }

}

商城项目地址 https://github.com/627886474/sneaker
欢迎start,如有不足,还请指教。

在这里插入图片描述

本文介绍了一个基于Spring Boot、Spring Cloud和Vue前后端分离的项目实战。这个项目是一个简单的在线商城,包含了用户注册、登录、商品展示、购物车、订单管理等功能。通过这个项目,读者可以深入理解前后端分离的架构模式和互联网应用的开发方式。 首先,文章介绍了前后端分离的基本概念和优势。前后端分离是将应用的前端和后端代码分开来开发,使得前端和后端具有独立的开发周期和技术栈,进而提高了开发效率和代码质量。同时,前后端分离还可以提供更好的用户体验和灵活性,对于互联网应用来说尤为重要。 接下来,文章介绍了项目的架构和技术栈。项目采用了Spring Boot和Spring Cloud框架来实现后端代码,采用MyBatis作为ORM框架和Redis作为缓存中间件。同时,项目还采用了Vue.js作为前端框架和Element UI组件库来实现前端页面。通过这些开源框架和组件,可以快速搭建一个前后端分离的互联网应用。 然后,文章介绍了项目的核心功能和代码实现。在用户注册和登录方面,项目采用了Spring Security框架和JWT令牌来实现用户认证和授权,保证了用户信息的安全性。在商品展示和购物车方面,项目采用了Vue.js来实现前端页面和事件处理。在订单管理方面,项目采用了MyBatis Plus来实现订单数据的持久化和分页查询。 最后,文章介绍了项目的测试和优化。通过对项目的压力测试和性能测试,文章发现项目存在一些性能瓶颈和安全隐患,可以通过优化数据库查询、缓存配置和代码实现来提高应用的性能和安全性。 总之,这篇文章介绍了一个基于Spring Boot、Spring Cloud和Vue前后端分离的项目实战,通过实现一个在线商城的功能,展示了前后端分离的开发模式和互联网应用的开发技术栈。本文可以作为前后端分离开发的入门教程,也可以作为互联网应用开发的参考文档。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值