该系列将记录一份完整的实战项目的完成过程,该篇属于第六天

案例来自B站黑马程序员Java项目实战《瑞吉外卖》,请结合课程资料阅读以下内容

该篇我们将完成以下内容:

  • 用户地址簿相关功能
  • 菜品展示
  • 购物车
  • 下单

用户地址簿相关功能

视频中将这部分代码直接给出,我们下面简单进行解释并给出代码

准备工作

首先我们需要知道用户地址簿的基本规则:

  • 地址簿用于记录用户的地址信息
  • 用户登录之后才可以操作自己的地址簿信息
  • 同一个用户可以拥有多个地址簿,但只能拥有一个默认地址

然后我们查看所使用的数据表:

最后我们需要创建一些简单的Java代码:

实体类AddressBook
数据层AddressBookMapper
业务层接口AddressBookService
业务层AddressBookServiceImpl
服务层AddressBookController

功能实现

下面我们会进行简单说明并给出代码展示,包含有地址簿的所有方法

查询指定用户的全部地址

功能用途:

查看该用户的所有地址

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 查询指定用户的全部地址
*/
@GetMapping("/list")
public Result<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 Result.success(addressBookService.list(queryWrapper));
}
}

新增用户地址

功能用途:

增加该用户的地址设置

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 设置默认地址
*/
@PutMapping("default")
public Result<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 Result.success(addressBook);
}
}

设置默认地址

功能用途:

设置用户的默认地址簿

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 设置默认地址
*/
@PutMapping("default")
public Result<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 Result.success(addressBook);
}
}

查看默认地址

功能用途:

购物车进行订单提交时直接展示默认地址并提交

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 查询默认地址
*/
@GetMapping("default")
public Result<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 Result.error("没有找到该对象");
} else {
return Result.success(addressBook);
}
}
}

查询特定地址

功能用途:

修改地址内容时将该地址回显

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 根据id查询地址
*/
@GetMapping("/{id}")
public Result get(@PathVariable Long id) {
AddressBook addressBook = addressBookService.getById(id);
if (addressBook != null) {
return Result.success(addressBook);
} else {
return Result.error("没有找到该对象");
}
}
}

修改地址内容

功能用途:

修改特定地址的内容

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 额外添加功能:修改地址内容
*/
@PutMapping
public Result<String> update(@RequestBody AddressBook addressBook) { LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(AddressBook::getId,addressBook.getId());
addressBookService.update(addressBook,queryWrapper); return Result.success("修改成功");
}
}

删除地址内容

功能用途:

删除特定地址的内容

图片展示:

代码展示:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.AddressBook;
import com.qiuluo.reggie.service.AddressBookService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController { @Autowired
private AddressBookService addressBookService; /**
* 额外添加功能:删除地址内容
* @param ids
* @return
*/
@DeleteMapping
public Result<String> remove(Long ids){ addressBookService.removeById(ids); return Result.success("修改成功"); }
}

补充内容

上述我们讲解了资料给出的用户簿全部功能并且补充了两个用户簿未实现的方法,想练手的小朋友可以动手尝试一下~

菜品展示

我们的功能开发通常分为三部分

需求分析

我们打开菜品展示页面会发现主页发送了两个请求

第一个请求是关于分类的请求:

第二个请求是关于购物车的请求:

我们的前端设置只有当两个均可实现时,页面才会展示,所以我们暂时将购物车请求更换一下:

// 该文件处于front/api/main.js下

//获取购物车内商品的集合
function cartListApi(data) {
return $axios({
// 原有代码:'url': '/shoppingCart/list',我们修改为下述代码,该代码指向一个默认购物车,注意需要在资料中导入该文件
'url': '/front/cartData.json',
'method': 'get',
params:{...data}
})
}

那么我们的界面只需要处理第一个关于分类的请求即可,我们注意请求路径就可以发现这个请求我们之前已经完成了

我们第一个处理点就已经完成了

我们查看第三个请求:

然后我们需要注意在菜品的选择中,如果菜品有口味,就要显示选择规格,如果没有口味,就直接是一个加号

所以我们在查看该分类的菜品的代码中需要将该菜品携带的口味也返回回来,我们这里就需要使用DTO实体类来完成

代码实现

我们将对原本的代码进行修改,利用DTO实体类来增加返回值:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.Category;
import com.qiuluo.reggie.domain.Dish;
import com.qiuluo.reggie.domain.DishFlavor;
import com.qiuluo.reggie.dto.DishDto;
import com.qiuluo.reggie.service.impl.CategoryServiceImpl;
import com.qiuluo.reggie.service.impl.DishFlavorServiceImpl;
import com.qiuluo.reggie.service.impl.DishServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.*; import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors; @Slf4j
@RestController
@RequestMapping("/dish")
public class DishController { @Autowired
private DishServiceImpl dishService; @Autowired
private DishFlavorServiceImpl dishFlavorService; @Autowired
private CategoryServiceImpl categoryService; /**
* 根据id查询菜品
* @param dish
* @return
*/
@GetMapping("/list")
public Result<List<DishDto>> list(Dish dish){ // 提取CategoryID
Long id = dish.getCategoryId(); // 判断条件
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(id != null,Dish::getCategoryId,id);
queryWrapper.eq(Dish::getStatus,1);
queryWrapper.orderByAsc(Dish::getSort); List<Dish> list = dishService.list(queryWrapper); // 创建返回类型
List<DishDto> dishDtoList = list.stream().map((item) -> { // 创建新的返回类型内部
DishDto dishDto = new DishDto(); // 将元素复制过去
BeanUtils.copyProperties(item,dishDto); // 设置CategoryName
Long categoryId = item.getCategoryId(); LambdaQueryWrapper<Category> categoryLambdaQueryWrapper = new LambdaQueryWrapper<>();
categoryLambdaQueryWrapper.eq(Category::getId,categoryId); Category category = categoryService.getOne(categoryLambdaQueryWrapper); String categoryName = category.getName(); dishDto.setCategoryName(categoryName); // 设置flavor
Long dishId = item.getId(); LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.eq(DishFlavor::getDishId,dishId); List<DishFlavor> dishFlavors = dishFlavorService.list(lambdaQueryWrapper); dishDto.setFlavors(dishFlavors); return dishDto;
}).collect(Collectors.toList()); return Result.success(dishDtoList); }
}

实际测试

我们点开主界面,可以查看到菜品分类界面以及相关菜品,部分菜品上使用选择规格即可

购物车

我们的功能开发通常分为三部分

需求分析

移动端用户将菜品或套餐添加到购物车中,菜品的不同口味也被判定为不同的购物车个体

如果是未加入购物车的菜品我们添加到购物车,如果是已添加购物车的菜品我们将数量叠加即可

首先我们需要将JavaScript代码修改过来:

// 该文件处于front/api/main.js下

//获取购物车内商品的集合
function cartListApi(data) {
return $axios({
'url': '/shoppingCart/list',
'method': 'get',
params:{...data}
})
}

这次我们要完成购物车的三种基本功能

第一次请求添加购物车:

第二次请求查看购物车信息:

第三次清除购物车:

然后我们查看相关数据表:

最后我们进行一些准备工作:

实体类ShoppingCart
数据层ShoppingCartMapper
业务层接口ShoppingCartService
业务层ShoppingCartServiceImpl
服务层ShoppingCartController

代码实现

首先实现添加购物车:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.CustomException;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.ShoppingCart;
import com.qiuluo.reggie.service.impl.ShoppingCartServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController { @Autowired
private ShoppingCartServiceImpl shoppingCartService; /**
* 添加菜品进购物车
* @param shoppingCart
* @return
*/
@PostMapping("/add")
public Result<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
// 1.设置用户
Long currentId = BaseContext.getCurrentId();
shoppingCart.setUserId(currentId); // 2. 判断是否是第一次加入,若第一次直接添加,若不是第一次number++ // 2.2 给部分判断条件
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(ShoppingCart::getUserId,currentId); Long dishId = shoppingCart.getDishId(); if(dishId != null){
// 购物车为菜品
queryWrapper.eq(ShoppingCart::getDishId,shoppingCart.getDishId());
}else {
// 购物车为套餐
queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
} ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper); // 2.3判断是否是第一次加入
if (cartServiceOne != null){
// 不是第一次加入,直接number++
Integer number = cartServiceOne.getNumber();
cartServiceOne.setNumber(number + 1);
shoppingCartService.updateById(cartServiceOne);
} else {
// 是第一次加入
shoppingCartService.save(shoppingCart);
cartServiceOne = shoppingCart;
} return Result.success(cartServiceOne);
}
}

然后是购物车回显:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.CustomException;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.ShoppingCart;
import com.qiuluo.reggie.service.impl.ShoppingCartServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController { @Autowired
private ShoppingCartServiceImpl shoppingCartService; /**
* 购物车回显
* @return
*/
@GetMapping("list")
public Result<List<ShoppingCart>> list(){ // 进行用户比对
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId()); // 查询并返回即可 List<ShoppingCart> list = shoppingCartService.list(queryWrapper); return Result.success(list); }
}

最后是购物车清除操作:

package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.CustomException;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.ShoppingCart;
import com.qiuluo.reggie.service.impl.ShoppingCartServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.util.List; @Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController { @Autowired
private ShoppingCartServiceImpl shoppingCartService; /**
* 购物车清除
* @return
*/
@DeleteMapping("/clean")
public Result<String> clean(){ // 进行用户比对
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId()); // 删除即可
shoppingCartService.remove(queryWrapper); return Result.success("清空成功"); }
}

实际测试

购物车添加测试:

当我们点击第一次加入购物车的菜品,菜品加入购物车

当我们点击已经加入购物车的菜品,购物车中的菜品数量增加

购物车回显测试:

点击提交后,相关菜品回显在页面中

购物车清除测试:

点击清除键后,购物车信息消失

用户下单

我们的功能开发通常分为三部分

需求分析

移动端用户点击购物车的去结算功能后进入结算界面,这时其实页面已经调用了两条回显请求,但我们前面已经完成,这里不再介绍

然后我们点击去支付,相当于用户下单操作,我们这一小节就是完成这个功能

首先给出页面展示:

我们这时需要注意我们的数据添加不仅仅是订单表的数据添加,订单表与菜品的关联表也需要添加数据

我们给出两张相关表的展示

订单表:

订单菜品关联表:

因为数据设计两张表,所以我们自定义方法来实现

代码实现

我们从头开始进行代码实现:

  1. 准备工作
实体类Orders,OrderDetail
数据层OrdersMapper,OrderDetailMapper
业务层接口OrdersService,OrderDetailService
业务层OrdersServiceImpl,OrderDetailServiceImpl
服务层OrdersController,OrderDetailController
  1. 业务层接口实现
package com.qiuluo.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.qiuluo.reggie.domain.Orders; public interface OrderService extends IService<Orders> { /**
* 提交订单
* @param orders
*/
public void submit(Orders orders);
}
  1. 业务层逻辑实现
package com.qiuluo.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.CustomException;
import com.qiuluo.reggie.domain.*;
import com.qiuluo.reggie.mapper.OrderMapper;
import com.qiuluo.reggie.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; @Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService { @Autowired
private ShoppingCartService shoppingCartService; @Autowired
private UserService userService; @Autowired
private AddressBookService addressBookService; @Autowired
private OrderDetailService orderDetailService; /**
* 提交订单
* @param orders
*/
public void submit(Orders orders){
//获得当前用户id
Long userId = BaseContext.getCurrentId(); //查询当前用户的购物车数据
LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ShoppingCart::getUserId,userId);
List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper); if(shoppingCarts == null || shoppingCarts.size() == 0){
// 购物车无数据
throw new CustomException("购物车为空,不能下单");
} //查询用户数据
User user = userService.getById(userId); //查询地址数据
Long addressBookId = orders.getAddressBookId();
AddressBook addressBook = addressBookService.getById(addressBookId);
if(addressBook == null){
// 下单地址错误
throw new CustomException("用户地址信息有误,不能下单");
} //订单号
long orderId = IdWorker.getId(); // 计算总金额(AtomicInteger原子int型,确保多线程内计算成功)
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(userId);
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(wrapper); }
}
  1. 服务层实现
package com.qiuluo.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiuluo.reggie.common.BaseContext;
import com.qiuluo.reggie.common.Result;
import com.qiuluo.reggie.domain.OrderDetail;
import com.qiuluo.reggie.domain.Orders;
import com.qiuluo.reggie.domain.ShoppingCart;
import com.qiuluo.reggie.domain.User;
import com.qiuluo.reggie.dto.OrdersDto;
import com.qiuluo.reggie.service.OrderService;
import com.qiuluo.reggie.service.impl.OrderDetailServiceImpl;
import com.qiuluo.reggie.service.impl.ShoppingCartServiceImpl;
import com.qiuluo.reggie.service.impl.UserServiceImpl;
import com.sun.org.apache.xpath.internal.operations.Or;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; /**
* 订单
*/
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController { @Autowired
private OrderService orderService; /**
* 用户下单
* @param orders
* @return
*/
@PostMapping("/submit")
public Result<String> submit(@RequestBody Orders orders){
log.info("订单数据:{}",orders);
orderService.submit(orders);
return Result.success("下单成功");
}
}

实际测试

在界面提交订单后,在数据表可以看到相关信息即为功能开发成功

结束语

该篇内容到这里就结束了,希望能为你带来帮助~

SpringBoot 项目实战 | 瑞吉外卖 Day06的更多相关文章

  1. Centos8.3、docker部署springboot项目实战记录

    引言    目前k8s很是火热,我也特意买了本书去学习了一下,但是k8s动辄都是成百上千的服务器运维,对只有几台服务器的应用来说使用k8s就有点像大炮打蚊子.只有几台服务器的应用运维使用传统的tomc ...

  2. Vue+SpringBoot项目实战(一) 搭建环境

    GitHub 地址: https://github.com/dongfanger/sprint-backend https://github.com/dongfanger/sprint-fronten ...

  3. 数据量大了一定要分表,分库分表组件Sharding-JDBC入门与项目实战

    最近项目中不少表的数据量越来越大,并且导致了一些数据库的性能问题.因此想借助一些分库分表的中间件,实现自动化分库分表实现.调研下来,发现Sharding-JDBC目前成熟度最高并且应用最广的Java分 ...

  4. SpringBoot电商项目实战 — Redis实现分布式锁

    最近有小伙伴发消息说,在Springboot系列文第二篇,zookeeper是不是漏掉了?关于这个问题,其实我在写第二篇的时候已经考虑过,但基于本次系列文章是实战练习,在项目里你能看到Zookeepe ...

  5. SpringBoot电商项目实战 — ElasticSearch接入实现

    如今在一些中大型网站中,搜索引擎已是必不可少的内容了.首先我们看看搜索引擎到底是什么呢?搜索引擎,就是根据用户需求与一定算法,运用特定策略从互联网检索出制定信息反馈给用户的一门检索技术.搜索引擎依托于 ...

  6. SpringBoot电商项目实战 — 前后端分离后的优雅部署及Nginx部署实现

    在如今的SpringBoot微服务项目中,前后端分离已成为业界标准使用方式,通过使用nginx等代理方式有效的进行解耦,并且前后端分离会为以后的大型分布式架构.弹性计算架构.微服务架构.多端化服务(多 ...

  7. SpringBoot电商项目实战 — 商品的SPU/SKU实现

    最近事情有点多,所以系列文章已停止好多天了.今天我们继续Springboot电商项目实战系列文章.到目前为止,整个项目的架构和基础服务已经全部实现,分布式锁也已经讲过了.那么,现在应该到数据库设计及代 ...

  8. SpringBoot电商项目实战 — Zookeeper的分布式锁实现

    上一篇演示了基于Redis的Redisson分布式锁实现,那今天我要再来说说基于Zookeeper的分布式现实. Zookeeper分布式锁实现 要用Zookeeper实现分布式锁,我就不得不说说zo ...

  9. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_汇总

    2018年Spring Boot 2.x整合微信支付在线教育网站高级项目实战视频课程 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在 ...

  10. 小D课堂 - 零基础入门SpringBoot2.X到实战_第14节 高级篇幅之SpringBoot多环境配置_59、SpringBoot多环境配置介绍和项目实战

    笔记 1.SpringBoot多环境配置介绍和项目实战(核心知识)     简介:SpringBoot介绍多环境配置和使用场景 1.不同环境使用不同配置         例如数据库配置,在开发的时候, ...

随机推荐

  1. freeswitch设置多个execute_on_media

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. fs中有非常多的接口和通道变量,使用方式多变. 官方文档有时候也仅仅是介绍了最基本的使用方法和格式. 环境 centos:CentO ...

  2. Axure实战应用:Axure设计可视化大屏!

    Axure是一款功能强大的原型设计工具,可以用于设计可视化大屏.设计一个有效的可视化大屏需要考虑多个方面,包括布局规划.信息展示.交互设计等. 以下是一个详细的描述,希望对你有所帮助. 第一部分:可视 ...

  3. windows中MySQL忘记密码

    前言:   一直都是连接公司项目数据库,许久未连接本地的数据库,密码忘记了 步骤: 进入本机安装mysql的bin目录下 暂停mysql服务 net stop mysql 设置跳过密码授权登录  my ...

  4. Android OpenGL ES入门

    1.OpenGL 和OpenGL ES OpenGL(Open Graphics Library)是一种用于渲染2D和3D图形的跨平台编程接口.OpenGL提供了一套标准的函数和接口,使开发人员能够在 ...

  5. Codeforces Round 906 (Div. 2)A-E1

    A. Doremy's Paint 3 记数组中数的种类数为\(k\),当\(k=1\)时,答案为\(yes\):当\(k=2\)时,记两个种类的数的个数差为\(d\),当\(d≤1\)时,答案为\( ...

  6. [计蒜客20191103B] 饮料

    小 B 出门游玩,他现在走到了 \(n\) 家饮品店前,第 \(i\) 家买饮料的花费为$ cost_i$ ,他只能去花费不超过自己所带钱数额的店,但他现在不确定自己兜里有多少钱,所以现在给出 \(m ...

  7. [USACO2007FEB S]Silver Lilypad Pond

    题目描述 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成 了M行N列个方格(1 ≤ M, N ≤ 30).一些格子是坚固得令人惊讶的莲花,还有一些格子是 岩石,其余的只是 ...

  8. springMvc_快速入门

    概念:是一种基于Java实现mvc模型的轻量级web框架 优点:使用简单,开发便捷    灵活性强 总体来说springMvc就是来替代servlet的一种工具 快速入门: 1.创建maven-web ...

  9. 【UniApp】-uni-app-网络请求

    前言 经过上个章节的介绍,大家可以了解到 uni-app-pinia存储数据的基本使用方法 那本章节来给大家介绍一下 uni-app-网络请求 的基本使用方法 步入正题 首先我们打开官方文档,我先带着 ...

  10. 用python将卡尔曼滤波技术和统计套利应用在期货市场

    背景 根据当前中国的交易规则,股票不能做空.与更发达的市场相反,套利机会不容易实现.这表明那些寻找并能够利用它们的人可能会有机会. 因此,我决定使用统计套利和配对交易技术专注于中国的期货市场. 战略理 ...