• 瑞吉外卖Day06


    1.用户地址

    1.1实体类

    1. /**
    2. * 地址簿
    3. */
    4. @Data
    5. public class AddressBook implements Serializable {
    6. private static final long serialVersionUID = 1L;
    7. private Long id;
    8. //用户id
    9. private Long userId;
    10. //收货人
    11. private String consignee;
    12. //手机号
    13. private String phone;
    14. //性别 01
    15. private String sex;
    16. //省级区划编号
    17. private String provinceCode;
    18. //省级名称
    19. private String provinceName;
    20. //市级区划编号
    21. private String cityCode;
    22. //市级名称
    23. private String cityName;
    24. //区级区划编号
    25. private String districtCode;
    26. //区级名称
    27. private String districtName;
    28. //详细地址
    29. private String detail;
    30. //标签
    31. private String label;
    32. //是否默认 01
    33. private Integer isDefault;
    34. //创建时间
    35. @TableField(fill = FieldFill.INSERT)
    36. private LocalDateTime createTime;
    37. //更新时间
    38. @TableField(fill = FieldFill.INSERT_UPDATE)
    39. private LocalDateTime updateTime;
    40. //创建人
    41. @TableField(fill = FieldFill.INSERT)
    42. private Long createUser;
    43. //修改人
    44. @TableField(fill = FieldFill.INSERT_UPDATE)
    45. private Long updateUser;
    46. //是否删除
    47. private Integer isDeleted;
    48. }

    1.2mapper

    1. @Mapper
    2. public interface AddressBookMapper extends BaseMapper {
    3. }

    1.3service

    1. public interface AddressBookService extends IService {
    2. }
    1. @Service
    2. public class AddressBookServiceImpl extends ServiceImpl implements AddressBookService {
    3. }

    1.4controller

    1. /**
    2. * 地址簿管理
    3. */
    4. @Slf4j
    5. @RestController
    6. @RequestMapping("/addressBook")
    7. public class AddressBookController {
    8. @Autowired
    9. private AddressBookService addressBookService;
    10. /**
    11. * 新增
    12. */
    13. @PostMapping
    14. public R save(@RequestBody AddressBook addressBook) {
    15. Long userId = BaseContext.getCurrentId();
    16. /*
    17. * 这里留了个坑,我把数据库create_Id和更新时间等字段改成了非空了,算是遗留Bug
    18. * 不知道为什么BaseContext拿不到用户Id数据,所以拿不到create_Id
    19. *
    20. * */
    21. addressBook.setUserId(userId);
    22. log.info("addressBook:{}", addressBook);
    23. addressBookService.save(addressBook);
    24. return R.success(addressBook);
    25. }
    26. /**
    27. * 设置默认地址
    28. */
    29. @PutMapping("default")
    30. public R setDefault(@RequestBody AddressBook addressBook) {
    31. log.info("addressBook:{}", addressBook);
    32. LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>();
    33. wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    34. wrapper.set(AddressBook::getIsDefault, 0);
    35. //SQL:update address_book set is_default = 0 where user_id = ?
    36. addressBookService.update(wrapper);
    37. addressBook.setIsDefault(1);
    38. //SQL:update address_book set is_default = 1 where id = ?
    39. addressBookService.updateById(addressBook);
    40. return R.success(addressBook);
    41. }
    42. /**
    43. * 根据id查询地址
    44. */
    45. @GetMapping("/{id}")
    46. public R get(@PathVariable Long id) {
    47. AddressBook addressBook = addressBookService.getById(id);
    48. if (addressBook != null) {
    49. return R.success(addressBook);
    50. } else {
    51. return R.error("没有找到该对象");
    52. }
    53. }
    54. /**
    55. * 查询默认地址
    56. */
    57. @GetMapping("default")
    58. public R getDefault() {
    59. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    60. queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
    61. queryWrapper.eq(AddressBook::getIsDefault, 1);
    62. //SQL:select * from address_book where user_id = ? and is_default = 1
    63. AddressBook addressBook = addressBookService.getOne(queryWrapper);
    64. if (null == addressBook) {
    65. return R.error("没有找到该对象");
    66. } else {
    67. return R.success(addressBook);
    68. }
    69. }
    70. /**
    71. * 查询指定用户的全部地址
    72. */
    73. @GetMapping("/list")
    74. public R> list(AddressBook addressBook) {
    75. addressBook.setUserId(BaseContext.getCurrentId());
    76. log.info("addressBook:{}", addressBook);
    77. //条件构造器
    78. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    79. queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
    80. queryWrapper.orderByDesc(AddressBook::getUpdateTime);
    81. //SQL:select * from address_book where user_id = ? order by update_time desc
    82. return R .success(addressBookService.list(queryWrapper));
    83. }
    84. }

    2.购物车

    2.1实体类

    1. /**
    2. * 购物车
    3. */
    4. @Data
    5. public class ShoppingCart implements Serializable {
    6. private static final long serialVersionUID = 1L;
    7. private Long id;
    8. //名称
    9. private String name;
    10. //用户id
    11. private Long userId;
    12. //菜品id
    13. private Long dishId;
    14. //套餐id
    15. private Long setmealId;
    16. //口味
    17. private String dishFlavor;
    18. //数量
    19. private Integer number;
    20. //金额
    21. private BigDecimal amount;
    22. //图片
    23. private String image;
    24. private LocalDateTime createTime;
    25. }

    2.2mapper

    1. @Mapper
    2. public interface ShoppingCartMapper extends BaseMapper {
    3. }

    2.3service

    1. public interface ShoppingCartService extends IService {
    2. }
    1. @Service
    2. public class ShoppingCartServiceImpl extends ServiceImpl implements ShoppingCartService {
    3. }

    2.4controller 

    1. @Slf4j
    2. @RestController
    3. @RequestMapping("shoppingCart")
    4. public class ShoppingCartController {
    5. @Autowired
    6. private ShoppingCartService shoppingCartService;
    7. /**
    8. * 往购物车内部添加
    9. * @param shoppingCart
    10. * @return
    11. */
    12. @PostMapping("/add")
    13. public R add(@RequestBody ShoppingCart shoppingCart) {
    14. log.info("购物车数据:{}",shoppingCart.toString());
    15. //解析一下接受的对象不难发现没有用户ID,所以我们得设置一下用户Id,也就是当前购物车是谁的
    16. Long userId=BaseContext.getCurrentId();
    17. shoppingCart.setUserId(userId);
    18. //判断当前传来的Id是菜品还是套餐,这两个肯定会有一个是Null
    19. Long dishId=shoppingCart.getDishId();
    20. Long setmealId = shoppingCart.getSetmealId();
    21. LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
    22. lambdaQueryWrapper.eq(ShoppingCart::getUserId, userId);
    23. //动态拼接一下添加的查询条件
    24. if (dishId!=null){
    25. //传过来的是菜品而不是套餐
    26. lambdaQueryWrapper.eq(ShoppingCart::getDishId, dishId);
    27. }
    28. if (setmealId!=null){
    29. //传过来的是套餐而不是菜品
    30. lambdaQueryWrapper.eq(ShoppingCart::getSetmealId, setmealId);
    31. }
    32. /*
    33. SQL:select * from shopping_cart where user_Id=? and dish_Id=?/setmealId=?
    34. 如果可以查出来,说明购物车已经加入了相关菜品
    35. */
    36. ShoppingCart cartServiceOne=shoppingCartService.getOne(lambdaQueryWrapper);
    37. //已经存在在购物车里
    38. if (cartServiceOne!=null){
    39. //在数量原有基础上+1
    40. Integer count = cartServiceOne.getNumber();
    41. cartServiceOne.setNumber(count + 1);
    42. /*
    43. update shopping_cart set number=(更新后数量)
    44. */
    45. shoppingCartService.updateById(cartServiceOne);
    46. }else {
    47. //尚未存在购物车,就添加到购物车
    48. shoppingCart.setNumber(1);
    49. /*
    50. insert into shopping_cart (ShoppingCart解析出来的字段) values (ShoppingCart解析出来的数据)
    51. */
    52. shoppingCart.setCreateTime(LocalDateTime.now());
    53. shoppingCartService.save(shoppingCart);
    54. //因为这个分支的cartServiceOne是null,所以要覆盖一下
    55. cartServiceOne = shoppingCart;
    56. }
    57. return R.success(cartServiceOne);
    58. }
    59. /**
    60. * @return 购物车列表
    61. */
    62. @GetMapping("/list")
    63. public R> list(){
    64. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    65. queryWrapper.eq(BaseContext.getCurrentId()!=null,ShoppingCart::getUserId, BaseContext.getCurrentId());
    66. // 最晚下单的 菜品或套餐在购物车中最先展示
    67. queryWrapper.orderByDesc(ShoppingCart::getCreateTime);
    68. List list = shoppingCartService.list(queryWrapper);
    69. return R.success(list);
    70. }
    71. /**
    72. * 一次性清空购物车
    73. * @return
    74. */
    75. @DeleteMapping("/clean")
    76. public R clean(){
    77. //获取当前购物车用户Id
    78. Long userId = BaseContext.getCurrentId();
    79. LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper();
    80. lambdaQueryWrapper.eq(ShoppingCart::getUserId, userId);
    81. shoppingCartService.remove(lambdaQueryWrapper);
    82. return R.success("清空成功");
    83. }
    84. }

    3.用户下单

    3.1service

    1. @Service
    2. public class OrdersServiceImpl extends ServiceImpl implements OrdersService {
    3. @Autowired
    4. private ShoppingCartService shoppingCartService;
    5. @Autowired
    6. private ShoppingCartController shoppingCartController;
    7. @Autowired
    8. private UserService userService;
    9. @Autowired
    10. private AddressBookService addressBookService;
    11. @Autowired
    12. private OrderDetailService orderDetailService;
    13. /**
    14. * 订单提交(下单)
    15. *
    16. * @param orders
    17. */
    18. @Transactional
    19. @Override
    20. public void submit(Orders orders) {
    21. //获取用户Id
    22. Long userId = BaseContext.getCurrentId();
    23. //根据用户Id查询所对应的购物车内容
    24. LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>();
    25. lambdaQueryWrapper.eq(userId != null, ShoppingCart::getUserId, userId);
    26. List shoppingCartList = shoppingCartService.list(lambdaQueryWrapper);
    27. //如果订单是空就没必要下单了
    28. if (shoppingCartList == null || shoppingCartList.size() == 0) {
    29. throw new CustomException("购物车为空,不能下单");
    30. }
    31. //拿到用户数据
    32. User user = userService.getById(userId);
    33. //拿到用户的地址数据
    34. Long addressId = orders.getAddressBookId();
    35. AddressBook addressBook = addressBookService.getById(addressId);
    36. if (addressBook == null) {
    37. throw new CustomException("地址有误,不能下单");
    38. }
    39. long orderId = IdWorker.getId(); // 订单号
    40. //遍历购物车列表,来算一下总金额
    41. // 购物车中 商品 的总金额 需要保证在多线程的情况下 也是能计算正确的,故需要使用原子类
    42. AtomicInteger amount = new AtomicInteger(0);
    43. List orderDetails = shoppingCartList.stream().map((item) -> {
    44. OrderDetail orderDetail = new OrderDetail();
    45. orderDetail.setOrderId(orderId);
    46. orderDetail.setName(item.getName());
    47. orderDetail.setImage(item.getImage());
    48. orderDetail.setDishId(item.getDishId());
    49. orderDetail.setSetmealId(item.getSetmealId());
    50. orderDetail.setDishFlavor(item.getDishFlavor());
    51. orderDetail.setNumber(item.getNumber());
    52. orderDetail.setAmount(item.getAmount());
    53. amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
    54. return orderDetail;
    55. }).collect(Collectors.toList());
    56. //填充订单对象信息(CV的)
    57. orders.setId(orderId);
    58. orders.setOrderTime(LocalDateTime.now());
    59. orders.setCheckoutTime(LocalDateTime.now());
    60. orders.setStatus(2);
    61. orders.setAmount(new BigDecimal(amount.get()));//总金额,需要 遍历购物车,计算相关金额来得到
    62. orders.setUserId(userId);
    63. orders.setNumber(String.valueOf(orderId));
    64. orders.setUserName(user.getName());
    65. orders.setConsignee(addressBook.getConsignee());
    66. orders.setPhone(addressBook.getPhone());
    67. orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
    68. + (addressBook.getCityName() == null ? "" : addressBook.getCityName())
    69. + (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
    70. + (addressBook.getDetail() == null ? "" : addressBook.getDetail()));
    71. // 向订单表插入数据,一条数据,插入数据之前,需要填充如上属性
    72. this.save(orders); // --> ordersService.save(orders);
    73. // 向订单明细表插入数据,多条数据
    74. orderDetailService.saveBatch(orderDetails);
    75. //调用接口清空购物车
    76. shoppingCartController.clean();
    77. }
    78. }

    3.2controller

    1. @Slf4j
    2. @RestController
    3. @RequestMapping("/order")
    4. public class OrdersController {
    5. @Autowired
    6. private OrdersService ordersService;
    7. @PostMapping("/submit")
    8. public R submit(@RequestBody Orders orders){
    9. //比较繁琐,在service实现
    10. ordersService.submit(orders);
    11. return R.success("下单成功");
    12. }
    13. }

  • 相关阅读:
    iOS 面试题以及自我理解答案
    网络安全,下一个十年饭碗稳了!
    【树莓派不吃灰】Linux篇⑨ 学习 磁碟配额(Quota)与进阶文件系统管理(核心概念)
    Java获取数组最大值、Java8的Arrays.sort()原理
    Java 后端开发面试总结【25 个技术专题】
    Gartner 2023API管理市场指南重磅发布,得帆云iPaaS标杆入榜
    2022.8.11SAP目前为止学习总结
    软件包管理|npm【前端工具链】
    算法:(二)数组
    [随笔]Integer.parseInt转换二进制数为int整数异常
  • 原文地址:https://blog.csdn.net/dfdg345/article/details/134466175