SpingBoot的项目实战--模拟电商【4.订单及订单详情的生成】

🥳🥳Welcome Huihui's Code World ! !🥳🥳

接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 

目录

🥳🥳Welcome Huihui's Code World ! !🥳🥳

 一.功能需求

二.代码编写

1.订单的显示

前端

js

html

后端

service

controller

效果预览

2.订单结算

前端

js

html

后端

service

controller

3.清除购物车信息

代码

​编辑效果预览


 一.功能需求

①订单的显示

②订单的结算【订单项新增,订单新增】

③订单生成之后,需要将购物车中的信息清除掉

二.代码编写

1.订单的显示

前端

这里的js是点击去结算按钮,跳转到订单的显示界面

js
/****************************订单结算*******************************/
	$(".count").click(function(){
		let ids=[]
		$(".th").each((i,el)=>{
			//子复选框--选中状态
			let flag =$(el).find('input[type=checkbox]').prop('checked')
			//如果元素被选择了
			if(flag){
				let id=$(el).find('.mynum').attr('data-gid')
				ids.push(id)
			}
		})
		//如果没有选择商品,则不做操作
		if(ids.length===0)return
		//如果选择了商品则跳转页面
		//跳转页面需要将选中的商品的id带过去
		ids=ids.join(",")
		location.href='/cart/toOrder?ids='+ids
	})

然后在界面上遍历集合,显示出来元素即可

html
<!DOCTYPE html>
<html>
	<head lang="en">
		<#include "common/head.html">
		<link rel="stylesheet" type="text/css" href="css/public.css"/>
		<link rel="stylesheet" type="text/css" href="css/proList.css" />
		<link rel="stylesheet" type="text/css" href="css/mygxin.css" />
	</head>
	<body>
		<!----------------------------------------order------------------>
		<div class="head ding">
			<div class="wrapper clearfix">
				<div class="clearfix" id="top">
					<h1 class="fl"><a href="${ctx}/"><img src="img/logo.png"/></a></h1>
					<div class="fr clearfix" id="top1">
						<form action="#" method="get" class="fl">
							<input type="text" placeholder="搜索" />
							<input type="button" />
						</form>
					</div>
				</div>
			</div>
		</div>
		<!-----------------site------------------->
		<div class="order cart mt">
		<div class="site">
				<p class="wrapper clearfix">
					<span class="fl">订单确认</span>
					<img class="top" src="img/temp/cartTop02.png">
				</p>
			</div>
			<!-----------------orderCon------------------->
			<div class="orderCon wrapper clearfix">
				<div class="orderL fl">
					<!--------h3---------------->
					<h3>收件信息<a href="#" class="fr">新增地址</a></h3>
					<!--------addres---------------->
					<div class="addres clearfix">
						<div class="addre fl on">
							<div class="tit clearfix">
								<p class="fl">张三1</p>
								<p class="fr">
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
						<div class="addre fl">
							<div class="tit clearfix">
								<p class="fl">张三2</p>
								<p class="fr">
									<span>|</span>
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
						<div class="addre fl">
							<div class="tit clearfix">
								<p class="fl">张三3</p>
								<p class="fr">
									<span>|</span>
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
					</div>
					<h3>支付方式</h3>
					<!--------way---------------->
					<div class="way clearfix">
						<img class="on" value="0" src="img/temp/way01.jpg">
						<img value="1" src="img/temp/way02.jpg">
						<img value="2" src="img/temp/way03.jpg">
						<img value="3" src="img/temp/way04.jpg">
					</div>
					<h3>选择快递</h3>
					<!--------dis---------------->
					<div class="dis clearfix">
						<span class="on">顺风快递</span>
						<span>百世汇通</span>
						<span>圆通快递</span>
						<span>中通快递</span>
					</div>
				</div>
				<div class="orderR fr">
					<div class="msg">
						<h3>订单内容<a href="${ctx}/shopCar/queryShopCar" class="fr">返回购物车</a></h3>
						<#assign total=0>
						<#list cart as c>
						<#assign total=total+c.xj()>
						<ul class="clearfix">
							<li class="fl">
								<img src="${(c.goodsImg)!}" style="height: 100px; width: 100px;">
							</li>
							<li class="fl">
								<p>${(c.goodsName)!}</p>
								<p>数量:${(c.num)!}</p>
							</li>
							<li class="fr">¥${(c.xj())!}</li>
						</ul>
						</#list>
					</div>
					<!--------tips---------------->
					<div class="tips">
						<p><span class="fl">商品金额:</span><span class="fr">¥${total}</span></p>
						<p><span class="fl">优惠金额:</span><span class="fr">¥0.00</span></p>
						<p><span class="fl">运费:</span><span class="fr">免运费</span></p>
					</div>
					<!--------tips count---------------->
					<div class="count tips">
						<p><span class="fl">合计:</span><span class="fr">¥${total}</span></p>

					</div>
					<!--<input type="button" name="" value="去支付"> -->
					<a href="javascript:void(0);" class="pay" data-ids="${RequestParameters['ids']}">去支付</a>
				</div>
			</div>
		</div>
		<!--编辑弹框-->
		<!--遮罩-->
		<div class="mask"></div>
		<div class="adddz editAddre">
			<form action="#" method="get">
				<input type="text" placeholder="姓名" class="on" />
				<input type="text" placeholder="手机号" />
				<div class="city">
					<select name="">
						<option value="省份/自治区">省份/自治区</option>
					</select>
					<select>
						<option value="城市/地区">城市/地区</option>
					</select>
					<select>
						<option value="区/县">区/县</option>
					</select>
					<select>
						<option value="配送区域">配送区域</option>
					</select>
				</div>
				<textarea name="" rows="" cols="" placeholder="详细地址"></textarea>
				<input type="text" placeholder="邮政编码" />
				<div class="bc">
					<input type="button" value="保存" />
					<input type="button" value="取消" />
				</div>
			</form>
		</div>
		<!--返回顶部-->
		<input type="hidden" id="gids" value="${RequestParameters['gids']!}"/>
		<#include "common/footer.html">
		<script src="js/order.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/public.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/pro.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/user.js" type="text/javascript" charset="utf-8"></script>
	</body>
</html>

后端

其中在订单页面显示的就是当前用户所勾选的商品,那么就是需要拿到用户勾选的商品的id集合到数据库中查询对应购物车信息即可

service
package com.wh.easyshop.service;


import com.wh.easyshop.model.User;
import com.wh.easyshop.vo.CartVo;

import java.util.List;

public interface IRedisService {

  
    /**
     * 拿到当前用户购物车中的指定商品
     * @param user
     * @param ids
     * @return
     */
    List<CartVo> loadCart(User user,String ids);
}
package com.wh.easyshop.service;

import com.wh.easyshop.model.User;
import com.wh.easyshop.util.Constants;
import com.wh.easyshop.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class RedisServiceImpl implements IRedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

 

    /**
     * 拿到对应的商品
     * @param user
     * @param ids
     * @return
     */
    @Override
    public List<CartVo> loadCart(User user, String ids) {
        //获取操Redi中hash类型数据对象--通过其将购物车存入到缓存中
        HashOperations<String, String , CartVo> rediscart = redisTemplate.opsForHash();
        //大键【hash的键】
        String hashKey=Constants.REDIS_CART_PREFIX + user.getId();
        List<String> myids = Arrays.asList(ids.split(","));
        return  rediscart.multiGet(hashKey, myids);
    }

}
controller

其中还是先去redis中拿到对应的商品id的集合

再通过 id去数据库中拿到对应的商品信息


       

package com.wh.easyshop.controller;

import com.wh.easyshop.model.Goods;
import com.wh.easyshop.model.User;
import com.wh.easyshop.resp.JsonResponseBody;
import com.wh.easyshop.service.IGoodsService;
import com.wh.easyshop.service.IRedisService;
import com.wh.easyshop.util.CookieUtils;
import com.wh.easyshop.vo.CartVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.jws.WebParam;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * <p>
 * 购物车 前端控制器
 * </p>
 *
 * @author wh
 * @since 2024-1-2
 */
@Controller
@RequestMapping("/cart")
public class CartController {
    @Autowired
    IRedisService redisService;
    @Autowired
    IGoodsService goodsService;


    @RequestMapping("/toOrder")
    public String order (User user,String ids, Model model) {
        List<CartVo> usercart = redisService.loadCart(user,ids);//使用参数解析器
        //拿出所有的购物车中的商id--集合
        List<Long> usercartids = usercart.stream().map(CartVo::getGid).collect(Collectors.toList());
        //根据这个id集合查询所有对应的商品
        List<Goods> goods = goodsService.listByIds(usercartids);
        //遍历集合 赋值给对应的对象
        for (Goods g : goods) {
            //找到对应id相同的元素
            CartVo vo = usercart.stream()
                    .filter(v -> Objects.equals(v.getGid(), g.getGid()))
                    .findFirst()
                    .get();
            //将商品g的属性赋值给vo【这样vo中的属性就有数据了】
            BeanUtils.copyProperties(g,vo);
        }
        model.addAttribute("cart",usercart);
        return "order";
    }


}

效果预览

2.订单结算

这里无论你是否支付成功,都需要先将订单以及订单详情生成【怕用户点击支付支付之后却又取消支付了,如果没有在点击支付的时候就是生成订单,那么用户取消支付后,就无法找到这个订单的信息了】

关于表信息,在这篇博文中

前端

js

这里面需要传递到后端的数据【收货人,手机号...】,都是在页面上面获取,这里因为没有设计那张表了,所以就直接采取这种方式了

首先是需要拿到我们选中的框

当我选中这个框的时候,发现上面会出现一个on的class属性【选中的元素即是这样】,所以就拿到当前有on属性的框

再通过这个框去拿取框中的元素

然后将这些从页面上拿到的属性,封装成一个对象,传递到后端

/****************************去支付*******************************/
$(".pay").click(function(){
    //拿到当前所选择的个人信息框【选中的框会有一个on】
    let mydiv=$(".addres").find(".on");
    //收货人
    let person=mydiv.find(".tit .fl").text();
    //地址
    let address=mydiv.find(".addCon p:first-child").text();
    //手机号
    let telephone=mydiv.find(".addCon p:last-child").text();
    //支付方式
    let pay=$(".way .on ").attr("value");
    //快递
    let mail=$(".dis .on ").text();
    //商品的id
   let ids= $(this).attr("data-ids");
   let order={
       person,
       address,
       telephone,
       pay,
       mail,
       ids
   }
    $.post('/order/addOrder',order,resp=>{
        if(resp.code===200){
            alert("订单生成成功")
        }
    },'json')
})
html
<!DOCTYPE html>
<html>
	<head lang="en">
		<#include "common/head.html">
		<link rel="stylesheet" type="text/css" href="css/public.css"/>
		<link rel="stylesheet" type="text/css" href="css/proList.css" />
		<link rel="stylesheet" type="text/css" href="css/mygxin.css" />
	</head>
	<body>
		<!----------------------------------------order------------------>
		<div class="head ding">
			<div class="wrapper clearfix">
				<div class="clearfix" id="top">
					<h1 class="fl"><a href="${ctx}/"><img src="img/logo.png"/></a></h1>
					<div class="fr clearfix" id="top1">
						<form action="#" method="get" class="fl">
							<input type="text" placeholder="搜索" />
							<input type="button" />
						</form>
					</div>
				</div>
			</div>
		</div>
		<!-----------------site------------------->
		<div class="order cart mt">
		<div class="site">
				<p class="wrapper clearfix">
					<span class="fl">订单确认</span>
					<img class="top" src="img/temp/cartTop02.png">
				</p>
			</div>
			<!-----------------orderCon------------------->
			<div class="orderCon wrapper clearfix">
				<div class="orderL fl">
					<!--------h3---------------->
					<h3>收件信息<a href="#" class="fr">新增地址</a></h3>
					<!--------addres---------------->
					<div class="addres clearfix">
						<div class="addre fl on">
							<div class="tit clearfix">
								<p class="fl">张三1</p>
								<p class="fr">
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
						<div class="addre fl">
							<div class="tit clearfix">
								<p class="fl">张三2</p>
								<p class="fr">
									<span>|</span>
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
						<div class="addre fl">
							<div class="tit clearfix">
								<p class="fl">张三3</p>
								<p class="fr">
									<span>|</span>
									<a href="#">删除</a>
									<span>|</span>
									<a href="#" class="edit">编辑</a>
								</p>
							</div>
							<div class="addCon">
								<p>河北省&nbsp;唐山市&nbsp;路北区&nbsp;大学生公寓村</p>
								<p>15732570937</p>
							</div>
						</div>
					</div>
					<h3>支付方式</h3>
					<!--------way---------------->
					<div class="way clearfix">
						<img class="on" value="0" src="img/temp/way01.jpg">
						<img value="1" src="img/temp/way02.jpg">
						<img value="2" src="img/temp/way03.jpg">
						<img value="3" src="img/temp/way04.jpg">
					</div>
					<h3>选择快递</h3>
					<!--------dis---------------->
					<div class="dis clearfix">
						<span class="on">顺风快递</span>
						<span>百世汇通</span>
						<span>圆通快递</span>
						<span>中通快递</span>
					</div>
				</div>
				<div class="orderR fr">
					<div class="msg">
						<h3>订单内容<a href="${ctx}/shopCar/queryShopCar" class="fr">返回购物车</a></h3>
						<#assign total=0>
						<#list cart as c>
						<#assign total=total+c.xj()>
						<ul class="clearfix">
							<li class="fl">
								<img src="${(c.goodsImg)!}" style="height: 100px; width: 100px;">
							</li>
							<li class="fl">
								<p>${(c.goodsName)!}</p>
								<p>数量:${(c.num)!}</p>
							</li>
							<li class="fr">¥${(c.xj())!}</li>
						</ul>
						</#list>
					</div>
					<!--------tips---------------->
					<div class="tips">
						<p><span class="fl">商品金额:</span><span class="fr">¥${total}</span></p>
						<p><span class="fl">优惠金额:</span><span class="fr">¥0.00</span></p>
						<p><span class="fl">运费:</span><span class="fr">免运费</span></p>
					</div>
					<!--------tips count---------------->
					<div class="count tips">
						<p><span class="fl">合计:</span><span class="fr">¥${total}</span></p>

					</div>
					<!--<input type="button" name="" value="去支付"> -->
					<a href="javascript:void(0);" class="pay" data-ids="${RequestParameters['ids']}">去支付</a>
				</div>
			</div>
		</div>
		<!--编辑弹框-->
		<!--遮罩-->
		<div class="mask"></div>
		<div class="adddz editAddre">
			<form action="#" method="get">
				<input type="text" placeholder="姓名" class="on" />
				<input type="text" placeholder="手机号" />
				<div class="city">
					<select name="">
						<option value="省份/自治区">省份/自治区</option>
					</select>
					<select>
						<option value="城市/地区">城市/地区</option>
					</select>
					<select>
						<option value="区/县">区/县</option>
					</select>
					<select>
						<option value="配送区域">配送区域</option>
					</select>
				</div>
				<textarea name="" rows="" cols="" placeholder="详细地址"></textarea>
				<input type="text" placeholder="邮政编码" />
				<div class="bc">
					<input type="button" value="保存" />
					<input type="button" value="取消" />
				</div>
			</form>
		</div>
		<!--返回顶部-->
		<input type="hidden" id="gids" value="${RequestParameters['gids']!}"/>
		<#include "common/footer.html">
		<script src="js/order.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/public.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/pro.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/user.js" type="text/javascript" charset="utf-8"></script>
	</body>
</html>

后端

service

这里跟显示订单详情是一样的,要拿到当前用户所选取的商品id再去数据库中查询商品信息,后面的生成订单详情以及生成订单的方法都是mybatis-plus自带的接口

package com.wh.easyshop.service;


import com.wh.easyshop.model.User;
import com.wh.easyshop.vo.CartVo;

import java.util.List;

public interface IRedisService {

  
    /**
     * 拿到当前用户购物车中的指定商品
     * @param user
     * @param ids
     * @return
     */
    List<CartVo> loadCart(User user,String ids);
}
package com.wh.easyshop.service;

import com.wh.easyshop.model.User;
import com.wh.easyshop.util.Constants;
import com.wh.easyshop.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class RedisServiceImpl implements IRedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

 

    /**
     * 拿到对应的商品
     * @param user
     * @param ids
     * @return
     */
    @Override
    public List<CartVo> loadCart(User user, String ids) {
        //获取操Redi中hash类型数据对象--通过其将购物车存入到缓存中
        HashOperations<String, String , CartVo> rediscart = redisTemplate.opsForHash();
        //大键【hash的键】
        String hashKey=Constants.REDIS_CART_PREFIX + user.getId();
        List<String> myids = Arrays.asList(ids.split(","));
        return  rediscart.multiGet(hashKey, myids);
    }

}
controller

其中都有详细的代码注释,在这就不过多的去阐述了

package com.wh.easyshop.controller;

import com.github.yitter.idgen.YitIdHelper;
import com.wh.easyshop.model.Goods;
import com.wh.easyshop.model.Order;
import com.wh.easyshop.model.OrderItem;
import com.wh.easyshop.model.User;
import com.wh.easyshop.resp.JsonResponseBody;
import com.wh.easyshop.service.IGoodsService;
import com.wh.easyshop.service.IOrderItemService;
import com.wh.easyshop.service.IOrderService;
import com.wh.easyshop.service.IRedisService;
import com.wh.easyshop.vo.CartVo;
import com.wh.easyshop.vo.OrderVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;

/**
 * <p>
 * 订单信息表 前端控制器
 * </p>
 *
 * @author wh
 * @since 2023-12-27
 */
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    IRedisService redisService;
    @Autowired
    IGoodsService goodsService;
    @Autowired
    IOrderItemService iOrderItemService;
    @Autowired
    IOrderService iOrderService;

    @RequestMapping("/addOrder")
    public JsonResponseBody<?> order (User user, OrderVo orderVo) {
        //拿到其中的商品id
        String ids = orderVo.getIds();
        //拿到购物车中指定的商品【数量和id】
        List<CartVo> cartVos = redisService.loadCart(user, ids);
        List<Long> ds = cartVos.stream().map(CartVo::getGid).collect(Collectors.toList());
        //拿到数据库中的内容【名字,价格】
        List<Goods> goods = goodsService.listByIds(ds);
        //遍历集合 赋值给对应的对象
        for (Goods g : goods) {
            //找到对应id相同的元素
            CartVo vo = cartVos.stream()
                    .filter(v -> Objects.equals(v.getGid(), g.getGid()))
                    .findFirst()
                    .get();
            //将商品g的属性赋值给vo【这样vo中的属性就有数据了】
            BeanUtils.copyProperties(g,vo);
        }
        //订单中的总价
        BigDecimal total =new BigDecimal(0);
        //生成订单详情
        //需要订单id【雪花id生成】
        long oid = YitIdHelper.nextId();
        //使用集合将需要加进去的订单详情装起来【使用批处理一次性处理掉】
        List<OrderItem> orderItemList=new ArrayList<>();
        for (CartVo cartVo : cartVos) {
        //订单详情
            OrderItem orderItem = new OrderItem();
            //将vo类的属性赋值给orderitem【共有的属性赋值】
            BeanUtils.copyProperties(cartVo,orderItem);
            //还有一个数量的值没有赋成功【因为两个实体中的这个属性名字不一样】
            orderItem.setQuantity(cartVo.getNum());
            //设置订单详情的id
            orderItem.setOoid(YitIdHelper.nextId());
            //设置订单id
            orderItem.setOid(oid);
            //将订单详情加入到订单详情的集合中
            orderItemList.add(orderItem);
            //计算总价
            total=total.add(cartVo.xj());
        }
        //将生成的额订单详情加入到数据库中
        iOrderItemService.saveBatch(orderItemList,5);
        //生成订单
        Order order = new Order();
        //将其中的ordervo的属性赋值给order
        BeanUtils.copyProperties(orderVo,order);
        //总价
        order.setTotal(total);
        //用户id
        order.setUserId(user.getId());
        //订单生成时间
        order.setCreateDate(new Date());
        //订单状态【0 未支付】
        order.setStatus(0);
        //将生成的订单加入到数据库
        iOrderService.save(order);
        //订单生成成功之后需要将购物车中的信息删除
        String ids1 = orderVo.getIds();
        List<String> delids = Arrays.asList(ids1.split(","));
        redisService.delCart(delids,user);
        return JsonResponseBody.success();
    }

}

3.清除购物车信息

代码

package com.wh.easyshop.service;


import com.wh.easyshop.model.User;
import com.wh.easyshop.vo.CartVo;

import java.util.List;

public interface IRedisService {

  
    /**
     * 删除购物车
     * @param ids
     * @param user
     */
    void delCart(List<String> ids, User user);


 
}
package com.wh.easyshop.service;

import com.wh.easyshop.model.User;
import com.wh.easyshop.util.Constants;
import com.wh.easyshop.vo.CartVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class RedisServiceImpl implements IRedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;


    /**
     * 删除购物车
     * @param ids
     * @param user
     */
    @Override
    public void delCart(List<String> ids, User user) {
        //获取操Redi中hash类型数据对象--通过其将购物车存入到缓存中
        HashOperations<String, String , CartVo> rediscart = redisTemplate.opsForHash();
        //大键【hash的键】
        String hashKey=Constants.REDIS_CART_PREFIX + user.getId();
        for (String id : ids) {
            rediscart.delete(hashKey, id);
        }

    }

   
}

效果预览

好啦,今天的分享就到这了,希望能够帮到你呢!😊😊  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/289279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023最大技术潮:大模型冲击下的智能汽车

作者 |德新 编辑 |王博 过去这年最大的技术潮&#xff0c;非大模型莫属。 2023年初&#xff0c;由ChatGPT掀起的浪花&#xff0c;迅速地演变成了席卷全球的AI科技浪潮。汽车行业在其中也不可避免。各大车企纷纷投入与大模型相关的布局。 长城官宣成立了AI Lab&#xff0c;到…

Python从入门到精通之元类

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合&#xff08;List列表、Tuple元组、Dict字典、Set&#xff09;-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正

问题描述 使用环境与工具&#xff1a;Unity 2022.3.4fc1&#xff0c;steam VR(2.7.3)&#xff0c;steamvrSDK&#xff08;1.14.15&#xff09;&#xff0c;HTC vive pro专业版&#xff0c;Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明&#xff08;可参考&#xff1a;HI5 2.0 交…

Character Controller Smooth

流畅的角色控制器 Unity的FPS解决方案&#xff01; 它是一种具有非常平滑运动和多种设置的解决方案&#xff1a; - 移动和跳跃 - 坐的能力 - 侧翻角度 - 不平整表面的处理 - 惯性守恒 - 重力 - 与物理物体的碰撞。 - 支持没有家长控制的平台 此解决方案适用于那些需要角色控制器…

蓝桥圣诞树(C++)

问题描述 输入样例&#xff1a; 1 3 101 1 2 2 3 输出样例&#xff1a; YES 思路&#xff1a; 这道题还是比较好想的&#xff0c;因为它构造的二叉树是用边连接起来的&#xff0c;不是像之前一样从上到下从左到右按编号构造的&#xff0c;所以可以用邻接表来存每个点还有边&am…

【JAVA】AI医疗导诊系统源码

智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件&#xff0c;它能够通过对患者的症状、病史等信息进行计算分析&#xff0c;快速推荐科室和医生。通过简单的描述自身症状&#xff0c;系统即可找到最适合的科室&#xff0c;实现线上高效挂号&#xff0c;线下门诊…

drf知识--10

接口文档 # 后端把接口写好后&#xff1a; 登录接口&#xff1a;/api/v1/login ---> post---name pwd 注册接口 查询所有图书带过滤接口 # 前后端需要做对接&#xff0c;对接第一个东西就是这个接口文档&#xff0c;前端照着接口文档开发 公司3个人&#xff…

性能测评高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘

阿里云服务器系统盘或数据盘支持多种云盘类型&#xff0c;如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等&#xff0c;阿里云百科aliyunbaike.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延等性…

数据库中的几种锁

数据库锁 1.数据库锁的种类 以 mysql innoDB 为例&#xff0c;数据库的锁有 排他锁&#xff0c;共享锁&#xff0c;意向锁&#xff0c;自增锁&#xff0c;间隙锁&#xff0c;锁的范围有包括&#xff0c;行锁&#xff0c;表锁 &#xff0c;区间锁。 从应用研发的视角&#xff…

Linux 进程和计划任务管理

一 内核功用&#xff1a;进程管理、内存管理、文件系统、网络功能、驱动程序、安全功能等 1 程序 是一组计算机能识别和执行的指令&#xff0c;运行于电子计算机上&#xff0c;满足人们某种需求的信息化工具 用于描述进程要完成的功能&#xff0c;是控制进程执行的指令集 2…

电路笔记 :自激振荡电路笔记 电弧打火机

三极管相关 三极管的形象描述 二极管 简单求解&#xff08;理想&#xff09; 优先导通&#xff08;理想&#xff09; 恒压降 稳压管&#xff08;二极管plus&#xff09; 基础工作模块 理想稳压管的工作特性 晶体管之三极管(“两个二极管的组合” ) 电弧打火机电路 1.闭合开…

竞赛保研 基于机器视觉的停车位识别检测

简介 你是不是经常在停车场周围转来转去寻找停车位。如果你的车辆能准确地告诉你最近的停车位在哪里&#xff0c;那是不是很爽&#xff1f;事实证明&#xff0c;基于深度学习和OpenCV解决这个问题相对容易&#xff0c;只需获取停车场的实时视频即可。 该项目较为新颖&#xf…

Docker与虚拟机的比对

在Windows操作系统上的对比&#xff1a; 但是官方还是建议我们尽量不要将Docker直接安装到Windows操作系统上。

k8s 之7大CNI 网络插件

一、介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求&#xff0c;但在实现方面也具有一定的灵活性。因此&#xff0c;业界已有不少不同的网络方案&#xff0c;来满足特定的环境和要求。 CNI意为容器网络…

[C语言]比特鹏哥

主页有博主其他上万字精品笔记,都在不断完善更新! C语言 初识C语言 基本了解C语言的基础知识&#xff0c;对C语言有一个大概的认识。 每个知识点就是简单认识&#xff0c;不做详细讲解&#xff0c;后期课程都会细讲。 本章重点&#xff1a; 什么是C语言 第一个C语言程序 数据…

MySQL是如何做到可以恢复到半个月内任意一秒的状态的?

MySQL的逻辑架构图 MySQL中两个重要的日志模块&#xff1a;redo log&#xff08;重做日志&#xff09;和binlog&#xff08;归档日志&#xff09; 我们先来看redo log&#xff1a; 介绍一个MySQL里经常说到的WAL技术&#xff0c;即Write-Ahead-Logging&#xff0c;它的关键点…

2024年了,如何制作高水平简历?(附模板)

Q&#xff1a;什么是高水平的简历&#xff1f; A&#xff1a;满足HR需求的同时&#xff0c;最大化的体现自身价值的简历是高水平的简历 HR的需求是什么&#xff1f; ✅ HR想看到清晰专业的简历模板 ——家人们每天看几百份简历谁懂啊&#xff01;花里胡哨真看不下去一点&…

阿里是如何去“O”的?

大家好&#xff0c;我是老猫&#xff0c;猫头鹰的“猫”。 今天我们来聊聊数据库这个话题。 2009年&#xff0c;阿里提出“去IOE化”的概念&#xff0c;这在当时看起来是天方夜谭&#xff0c;但目前来看可以说是"轻舟已过万重山"。 IOE是传统IT三大件&#xff0c;…

消息队列神器:打造高效、可靠的分布式系统

消息队列&#xff08;Message Queueing&#xff09;是现代应用架构中不可或缺的组件&#xff0c;它在处理大规模数据流、服务解耦、系统伸缩性和异步通信等方面发挥着关键作用。但是&#xff0c;要充分利用消息队列&#xff0c;我们必须解决一系列关于高可用性、一致性、顺序性…

你真的知道2024程序员搞钱新姿势吗?

2023年即将过去&#xff0c;2024的序曲已经奏响&#xff01;回顾2023&#xff0c;我们经历了降薪裁员的大趋势&#xff0c;身为程序员也有点惶惶不可终日&#xff0c;害怕会失去工作&#xff0c;害怕面对家人无奈的模样&#xff0c;害怕跟不上时代的步伐&#xff0c;沦为被大环…