首页 > 其他分享 >瑞吉外卖day7

瑞吉外卖day7

时间:2023-05-23 09:34:23浏览次数:32  
标签:queryWrapper return day7 addressBook 购物车 瑞吉 list 外卖 菜品

菜品展示,购物车,下单

导入用户地址薄相关功能

需求分析

地址簿,指的是移动端消费者用户的地址信息,用户登录成功后可以维护自己的地址信息。同一个用户可以有多个地
址信息,但是只能有一个默认地址.

代码开发

 

  @Autowired
    private AddressBookService addressBookService;

    /**
     * 新增
     */
    @PostMapping
    public R<AddressBook> save(@RequestBody AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        log.info("addressBook:{}", addressBook);
        addressBookService.save(addressBook);
        return R.success(addressBook);
    }

    /**
     * 设置默认地址
     */
    @PutMapping("default")
    public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {
        log.info("addressBook:{}", addressBook);
        LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        wrapper.set(AddressBook::getIsDefault, 0);
        //SQL:update address_book set is_default = 0 where user_id = ?
        addressBookService.update(wrapper);

        addressBook.setIsDefault(1);
        //SQL:update address_book set is_default = 1 where id = ?
        addressBookService.updateById(addressBook);
        return R.success(addressBook);
    }

    /**
     * 根据id查询地址
     */
    @GetMapping("/{id}")
    public R get(@PathVariable Long id) {
        AddressBook addressBook = addressBookService.getById(id);
        if (addressBook != null) {
            return R.success(addressBook);
        } else {
            return R.error("没有找到该对象");
        }
    }

    /**
     * 查询默认地址
     */
    @GetMapping("default")
    public R<AddressBook> getDefault() {
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
        queryWrapper.eq(AddressBook::getIsDefault, 1);

        //SQL:select * from address_book where user_id = ? and is_default = 1
        AddressBook addressBook = addressBookService.getOne(queryWrapper);

        if (null == addressBook) {
            return R.error("没有找到该对象");
        } else {
            return R.success(addressBook);
        }
    }

    /**
     * 查询指定用户的全部地址
     */
    @GetMapping("/list")
    public R<List<AddressBook>> list(AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        log.info("addressBook:{}", addressBook);

        //条件构造器
        LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
        queryWrapper.orderByDesc(AddressBook::getUpdateTime);

        //SQL:select * from address_book where user_id = ? order by update_time desc
        return R.success(addressBookService.list(queryWrapper));
    }

菜品展示

需求分析

用户登录成功后跳转到系统首页,在首页需要根据分类来展示菜品和套餐。如果菜品设置了口味信息,需要展示
选择规格 按钮,否则显示+按钮。

 代码开发-梳理交互过程 

在开发代码之前,需要梳理一下前端页面和服务端的交互过程:1、页面(front/index.html)发送ajax请求,获取分类数据 (菜品分类和套餐分类)2、页面发送ajax请求,获取第一个分类下的菜品或者套餐开发菜品展示功能,其实就是在服务端编写代码去处理前端页面发送的这2次请求即可。
注意:首页加载完成后,还发送了一次aiax请求用于加载购物车数据,此处可以将这次请求的地址暂时修改一下,从静态ison文件获取数据,等后续开发购物车功能时再修改回来

代码开发

菜品展示存在bug,无法展示菜品口味,重写dishController中的list方法,获取到dishDto对象返回给客户端

@GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){
        //构造查询条件
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null ,Dish::getCategoryId,dish.getCategoryId());
        //添加条件,查询状态为1(起售状态)的菜品
        queryWrapper.eq(Dish::getStatus,1);

        //添加排序条件
        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);

        List<Dish> list = dishService.list(queryWrapper);

        List<DishDto> dishDtoList = list.stream().map((item) -> {
            DishDto dishDto = new DishDto();

            BeanUtils.copyProperties(item,dishDto);

            Long categoryId = item.getCategoryId();//分类id
            //根据id查询分类对象
            Category category = categoryService.getById(categoryId);

            if(category != null){
                String categoryName = category.getName();
                dishDto.setCategoryName(categoryName);
            }

            //当前菜品的id
            Long dishId = item.getId();
            LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(DishFlavor::getDishId,dishId);
            //SQL:select * from dish_flavor where dish_id = ?
            List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
            dishDto.setFlavors(dishFlavorList);
            return dishDto;
        }).collect(Collectors.toList());

        return R.success(dishDtoList);
    }

套餐页面无法正常展示,根据条件查询套餐

/**
     * 根据条件查询套餐数据
     * @param setmeal
     * @return
     */
    @GetMapping("/list")
    public R<List<Setmeal>> list(Setmeal setmeal){
        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(setmeal.getCategoryId() != null,Setmeal::getCategoryId,setmeal.getCategoryId());
        queryWrapper.eq(setmeal.getStatus() != null,Setmeal::getStatus,setmeal.getStatus());
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        List<Setmeal> list = setmealService.list(queryWrapper);

        return R.success(list);
    }
}

购物车

需求分析

移动端用户可以将菜品或者套餐添加到购物车。对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;对于套餐来说,可以直接点击 4加号将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量也可以清空购物车

 代码开发-梳理交互过程

需要梳理一下购物车操作时前端页面和服务端的交互过程:

在开发代码之前,

1、点击加入购物车或者+ 按钮,页面发送ajax请求,请求服务端,将菜品或者套餐添加到购物车

2、点击购物车图标,页面发送ajax请求,请求服务端查询购物车中的菜品和套餐

3、点击清空购物车按钮,页面发送aiax请求,请求服务端来执行清空购物车操作

添加购物车

    /**
     * 将菜品添加到购物车
     * @param shoppingCart
     * @return
     */
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("菜品数据{}",shoppingCart);
        //设置用户id,指定当前是哪个用户的购物车数据
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);
        //查询当前菜品是否在购物车中
        Long dishId = shoppingCart.getDishId();
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        if (dishId!=null){
            //添加到购物车的是菜品
            queryWrapper.eq(ShoppingCart::getDishId,dishId);
        }else {
            queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);
        //如果已经存在,就在原来的数量基础上加一
        if (cartServiceOne!=null){
            Integer number = cartServiceOne.getNumber();
            cartServiceOne.setNumber(number+1);
            shoppingCartService.updateById(cartServiceOne);
        }else {
            //如果不存在,则添加到购物车,默认数量就是一
            shoppingCart.setNumber(1);
            shoppingCartService.save(shoppingCart);
            cartServiceOne=shoppingCart;

        }

        return R.success(shoppingCart);
    }

查看购物车

 /**
     * 查看购物车
     * @return
     */
    @GetMapping("/list")
    public R<List<ShoppingCart>> list(){
        log.info("查看购物车");
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        queryWrapper.orderByAsc(ShoppingCart::getCreateTime);
        List<ShoppingCart> list = shoppingCartService.list(queryWrapper);
        return  R.success(list);
    }

清空购物车

 @DeleteMapping("/clean")
    public R<String> clean(){
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        shoppingCartService.remove(queryWrapper);
        return R.success("清空成功");
    }

用户下单

需求分析

移动端用户将菜品或者套餐加入购物车后,可以点击购物车中去结算按钮,页面跳转到订单确认页面,点去支付按钮则完成下单操作。

 

 

代码开发-梳理交互过程

在开发代码之前,需要梳理一下用户下单操作时前端页面和服务端的交互过程

1、在购物车中点击按钮,页面跳转到订单确认页面去结算

2、在订单确认页面发送ajax请求,请求服务端获取当前登录用户的默认地址

3、在订单确认页面,发送ajax请求,请求服务端获取当前登录用户的购物车数据

4、在订单确认页面点击按钮,发送ajax请求,请求服务端完成下单操作去支付
开发用户下单功能,其实就是在服务端编写代码去处理前端页面发送的请求即可

 

代码开发

  @PostMapping("/submit")
    public R<String> sunmit(@RequestBody Orders orders){
        log.info("订单信息{}",orders);
        orderService.submit(orders);
        return R.success("下单成功");
    }
 /**
     * 提交订单
     * @param orders
     */
    @Override
    public void submit(Orders orders) {
        //获得当前用户id
        Long currentId = BaseContext.getCurrentId();
        //查询用户购物车数据
        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,currentId);
        List<ShoppingCart> shoppingCarts = shoppingCartService.list(queryWrapper);
        if (shoppingCarts==null||shoppingCarts.size()==0){
            throw new CustomException("购物车为空,不能下单");
        }
        //获取用户数据
        User user = userService.getById(currentId);
        //获取地址数据
        Long addressBookId = orders.getAddressBookId();
        AddressBook addressBook = addressBookService.getById(addressBookId);
        if (addressBook==null){
            throw new CustomException("地址为空,不能下单");
        }
        //向订单表插入一条数据

        long orderId = IdWorker.getId();//订单id
        AtomicInteger amount = new AtomicInteger(0);

        List<OrderDetail> orderDetails = shoppingCarts.stream().map((item) -> {
            OrderDetail orderDetail = new OrderDetail();
            orderDetail.setOrderId(orderId);
            orderDetail.setNumber(item.getNumber());
            orderDetail.setDishFlavor(item.getDishFlavor());
            orderDetail.setDishId(item.getDishId());
            orderDetail.setSetmealId(item.getSetmealId());
            orderDetail.setName(item.getName());
            orderDetail.setImage(item.getImage());
            orderDetail.setAmount(item.getAmount());
            amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
            return orderDetail;
        }).collect(Collectors.toList());


        orders.setId(orderId);
        orders.setOrderTime(LocalDateTime.now());
        orders.setCheckoutTime(LocalDateTime.now());
        orders.setStatus(2);
        orders.setAmount(new BigDecimal(amount.get()));//总金额
        orders.setUserId(currentId);
        orders.setNumber(String.valueOf(orderId));
        orders.setUserName(user.getName());
        orders.setConsignee(addressBook.getConsignee());
        orders.setPhone(addressBook.getPhone());
        orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
                + (addressBook.getCityName() == null ? "" : addressBook.getCityName())
                + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
                + (addressBook.getDetail() == null ? "" : addressBook.getDetail()));
        //向订单表插入数据,一条数据
        this.save(orders);

        //向订单明细表插入数据,多条数据
        orderDetailService.saveBatch(orderDetails);

        //清空购物车数据
        shoppingCartService.remove(queryWrapper);
    }

 

标签:queryWrapper,return,day7,addressBook,购物车,瑞吉,list,外卖,菜品
From: https://www.cnblogs.com/projectruiji/p/17417604.html

相关文章

  • day76(2023.5.22)
    1.Filter过滤器 运行结果: 2.在Filter中设置请求编码 运行结果: 3.FilterConfig对象的使用 运行结果: 4.FilterChain(过滤器链) 5.Filter执行顺序 6.基于注解式开发Filter 7.Filter的生命周期 8.Listener监听器 9.ServletCo......
  • MySQL学习基础篇Day7
    5.5自连接5.5.1自连接查询自连接查询,顾名思义,就是自己连接自己,也就是把一张表连接查询多次。我们先来学习一下自连接的查询语法:SELECT字段列表FROM表A别名AJOIN表A别名BON条件...; 而对于自连接查询,可以是内连接查询,也可以是外连接查询。 案例:A.查询员......
  • day75(2023.5.20)
    1.通过Cookie实现客户端与服务端会话的维持 运行结果: 2.Cookie总结3.HttpSession对象的特点 4.HttpSession对象的创建 运行结果: 5.HttpSession对象的使用 运行结果:  6.HttpSession的销毁方式 运行结果: 在IE浏览器中......
  • 瑞吉外卖day5
    套餐管理业务新增套餐需求分析套餐救赎菜品的集合,后台管理系统中可以管理套餐信息,通过新增套餐功能来添加一个新的套餐,在添加套餐时需要选择当前套餐所属的套餐分类和包含的菜品,并且需要上传套餐对应的图片,在移动端会按照套餐分类来展示对应的套餐数据模型所以在新增套餐时,涉......
  • day73(2023.5.17)
    1.资源访问路径 2.获取请求头信息 运行结果: 运行结果: 3.获取请求头案例 运行结果: 4.HttpServletRequest对象的生命周期 5.HttpServletResponse对象 6.设置响应类型设置字符类型响应: 运行结果: 运行结果: 略。设置......
  • day72(2023.5.13)
    1.Servlet技术详解 2.创建第一个Servlet案例 3.Tomcat运行过程 4.Servlet的生命周期 5.Servlet处理请求的原理 6.Servlet的作用 7.在Idea中创建Web工程 在Idea创建Web工程添加servlet-api.jar 在Idea中配置To......
  • 瑞吉外卖day4
    菜品管理业务开发文件上传与下载文件上传介绍 服务端要接收客户端页面上传的文件,通常都会使用Apache的两个组件1.commons-fileupload2.commons-ioSpring框架在spring-web包中对文件上传进行了封装。只需要在Controller的方法中声明一个MultipartFile类型的参数即可接受......
  • day71(2023.5.12)
    1.JavaEE简介 2.服务器 3.Tomcat的使用 4.Tomcat下载与安装 5.Tomcat目录结构与介绍 6.Tomcat启动与关闭输入后,小猫出来啦! 7.Tomcat配置文件介绍 8.解决控制台乱码以及修改Tomcat监听端口 9.配置TomcatManage......
  • day70(2023.5.11)
    1.计算机网络通信 2.TCP/IP协议群 3.TCP协议传输特点 4.服务端口 5.数据包与处理流程 6.HTTP协议简介 7.HTTP协议特点 8.HTTP协议发展和版本     9.HTTP协议中URI、URL、URN10.HTTP协议的......
  • 瑞吉外卖项目踩的几个小坑记录
    1.不知道前端发送过来的请求是以json格式还是以普通数据格式发送。这方面是用浏览器的调试工具查看,找到network选项卡,然后点击playload选项卡查看,如下图 如果数据是一行一行显示的,则是普通格式;如果是以{}括号引用起来的,则是JSON格式。2.在开发功能时,将菜品对应的名字起为:......