国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā)

這篇具有很好參考價值的文章主要介紹了【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

一、導入用戶地址簿相關功能代碼

1 需求分析

2 數(shù)據(jù)模型

3 導入功能代碼

?3.1 實體AddressBook?

3.2 Mapper接口AddressBookMapper?

?3.3 業(yè)務接口層AddressBookService

3.4 業(yè)務接口實現(xiàn)類AddressBookServiceImpl

3.5 控制層AddressBookController

4 功能測試

二、菜品展示

1 需求分析

2 代碼開發(fā)

?2.1 main.js

2.2??DishController?

2.3?SetmealController?

3 功能測試

三、購物車

1 需求分析

2 數(shù)據(jù)模型

3 代碼開發(fā)

3.1 實體類ShoppingCart

3.2 Mapper接口ShoppingCartMapper

3.3 業(yè)務層接口ShoppingCartService

3.4 業(yè)務層實現(xiàn)類ShoppingCartServiceImpl

3.5 控制層ShoppingCartController

?3.6 main.js

3.7?ShoppingCartController 控制層

4 功能測試

四、用戶下單

1 需求分析

2 數(shù)據(jù)模型

3 代碼開發(fā)

3.1 訂單實體Orders

3.2 訂單詳細實體OrderDetail

3.3 Mapper接口類OrderMapper

3.4 Mapper接口類OrderDetailMapper

3.5 業(yè)務層接口OrderService

3.6 業(yè)務層接口OrderDetailService

3.7 業(yè)務層接口OrderServiceImpl

3.8 業(yè)務層接口OrderDetailServiceImpl

3.9 業(yè)務層接口OrderController

3.10?業(yè)務層接口OrderDetailController

3.11?OrderController?

?3.12?OrderService

3.13?OrderServiceImpl?

4 功能測試


前言:導入用戶地址簿相關功能代碼、菜品展示、購物車、下單

一、導入用戶地址簿相關功能代碼

1 需求分析

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

2 數(shù)據(jù)模型

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

3 導入功能代碼

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?3.1 實體AddressBook?

package com.runa.reggie.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 地址簿
 */
@Data
public class AddressBook implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;


    //用戶id
    private Long userId;


    //收貨人
    private String consignee;


    //手機號
    private String phone;


    //性別 0 女 1 男
    private String sex;


    //省級區(qū)劃編號
    private String provinceCode;


    //省級名稱
    private String provinceName;


    //市級區(qū)劃編號
    private String cityCode;


    //市級名稱
    private String cityName;


    //區(qū)級區(qū)劃編號
    private String districtCode;


    //區(qū)級名稱
    private String districtName;


    //詳細地址
    private String detail;


    //標簽
    private String label;

    //是否默認 0 否 1是
    private Integer isDefault;

    //創(chuàng)建時間
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;


    //更新時間
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;


    //創(chuàng)建人
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;


    //修改人
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;


    //是否刪除
    private Integer isDeleted;
}

3.2 Mapper接口AddressBookMapper?

package com.runa.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runa.reggie.entity.AddressBook;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface AddressBookMapper extends BaseMapper<AddressBook> {
}

?3.3 業(yè)務接口層AddressBookService

package com.runa.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runa.reggie.entity.AddressBook;

public interface AddressBookService extends IService<AddressBook> {
}

3.4 業(yè)務接口實現(xiàn)類AddressBookServiceImpl

package com.runa.reggie.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runa.reggie.entity.AddressBook;
import com.runa.reggie.mapper.AddressBookMapper;
import com.runa.reggie.service.AddressBookService;
import org.springframework.stereotype.Service;

@Service
public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements AddressBookService {
}

3.5 控制層AddressBookController

package com.runa.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.runa.reggie.common.BaseContext;
import com.runa.reggie.common.R;
import com.runa.reggie.entity.AddressBook;
import com.runa.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;

    /**
     * 新增
     */
    @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);
    }

    /**
     * 根據(jù)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));
    }
}

4 功能測試

登錄移動端

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

二、菜品展示

1 需求分析

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

2 代碼開發(fā)

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?2.1 main.js

修改記得清理瀏覽器緩存

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

//獲取所有的菜品分類
function categoryListApi() {
    return $axios({
      'url': '/category/list',
      'method': 'get',
    })
  }

//獲取菜品分類對應的菜品
function dishListApi(data) {
    return $axios({
        'url': '/dish/list',
        'method': 'get',
        params:{...data}
    })
}

//獲取菜品分類對應的套餐
function setmealListApi(data) {
    return $axios({
        'url': '/setmeal/list',
        'method': 'get',
        params:{...data}
    })
}

//獲取購物車內商品的集合
function cartListApi(data) {
    return $axios({
        // 'url': '/shoppingCart/list',
        'url': '/front/cartData.json',
        'method': 'get',
        params:{...data}
    })
}

//購物車中添加商品
function  addCartApi(data){
    return $axios({
        'url': '/shoppingCart/add',
        'method': 'post',
        data
      })
}

//購物車中修改商品
function  updateCartApi(data){
    return $axios({
        'url': '/shoppingCart/sub',
        'method': 'post',
        data
      })
}

//刪除購物車的商品
function clearCartApi() {
    return $axios({
        'url': '/shoppingCart/clean',
        'method': 'delete',
    })
}

//獲取套餐的全部菜品
function setMealDishDetailsApi(id) {
    return $axios({
        'url': `/setmeal/dish/${id}`,
        'method': 'get',
    })
}


2.2??DishController?

package com.runa.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.runa.reggie.common.R;
import com.runa.reggie.dto.DishDto;
import com.runa.reggie.entity.Category;
import com.runa.reggie.entity.Dish;
import com.runa.reggie.entity.DishFlavor;
import com.runa.reggie.service.CategoryService;
import com.runa.reggie.service.DishFlavorService;
import com.runa.reggie.service.DishService;
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.util.List;
import java.util.stream.Collectors;

/**
 * 菜品管理
 */
@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private DishFlavorService dishFlavorService;

    @Autowired
    private CategoryService categoryService;
    /**
     * 新增菜品
     * @param dishDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());
        dishService.saveWithFlavor(dishDto);
      return R.success("新增菜品成功");
    }

    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name){
        // 構造分頁構造器對象
        Page<Dish> pageInfo = new Page<>(page, pageSize);
        Page<DishDto> dishDtoPage = new Page<>();

        //條件構造器
        LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
        // 添加過濾條件
        queryWrapper.like(name != null,Dish::getName,name);
        // 添加排序條件
        queryWrapper.orderByDesc(Dish::getUpdateTime);

        //執(zhí)行分頁查詢
        dishService.page(pageInfo,queryWrapper);

        // 對象拷貝
        BeanUtils.copyProperties(pageInfo, dishDtoPage,"records");
        List<Dish> records = pageInfo.getRecords();
        List<DishDto> list = records.stream().map((item) -> {
            DishDto dishDto = new DishDto();

            BeanUtils.copyProperties(item,dishDto);
            Long categoryId = item.getCategoryId();// 分類id
            Category category = categoryService.getById(categoryId);
            String categoryName = category.getName();
            dishDto.setCategoryName(categoryName);
            return dishDto;
        }).collect(Collectors.toList());


        dishDtoPage.setRecords(list);
        return R.success(dishDtoPage);
    }


    /**
     * 根據(jù)ID 查詢菜品和對應口味信息 回顯
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R<DishDto> get(@PathVariable Long id){
        log.info("要查詢顯示的菜品信息是:{}",id);
        DishDto dishDto = dishService.getByIdWithFlavor(id);
        return R.success(dishDto);
    }

    /**
     * 修改菜品
     * @param dishDto
     * @return
     */
    @PutMapping
    public R<String> update(@RequestBody DishDto dishDto){
        log.info(dishDto.toString());
        dishService.updateWithFlavor(dishDto);
        return R.success("修改菜品成功");
    }




//    /**
//     * 根據(jù)條件查詢對于菜品數(shù)據(jù)
//     * @param dish
//     * @return
//     */
//    @GetMapping("/list")
//    public R<List<Dish>> list(Dish dish){
//
//        // 構造查詢條件
//        LambdaQueryWrapper<Dish> queryWrapper =new LambdaQueryWrapper<>();
//        queryWrapper.eq(dish.getCategoryId() != null,Dish::getCategoryId,dish.getCategoryId());
//        // 添加條件,查詢狀態(tài)為1(起售狀態(tài))的菜品
//        queryWrapper.eq(Dish::getStatus,1);
//        // 天添加排序條件
//        queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
//        List<Dish> list = dishService.list(queryWrapper);
//        return R.success(list);
//    }
//}

    /**
     * 根據(jù)條件查詢對于菜品數(shù)據(jù)
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R<List<DishDto>> list(Dish dish){

        // 構造查詢條件
        LambdaQueryWrapper<Dish> queryWrapper =new LambdaQueryWrapper<>();
        queryWrapper.eq(dish.getCategoryId() != null,Dish::getCategoryId,dish.getCategoryId());
        // 添加條件,查詢狀態(tài)為1(起售狀態(tài))的菜品
        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
            //根據(jù)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);
            List<DishFlavor> dishFlavorList = dishFlavorService.list(lambdaQueryWrapper);
            dishDto.setFlavors(dishFlavorList);

            return dishDto;
        }).collect(Collectors.toList());


        return R.success(dishDtoList);
    }
}

2.3?SetmealController?

package com.runa.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.runa.reggie.common.R;
import com.runa.reggie.dto.SetmealDto;
import com.runa.reggie.entity.Category;
import com.runa.reggie.entity.Setmeal;
import com.runa.reggie.service.CategoryService;
import com.runa.reggie.service.SetmealDishService;
import com.runa.reggie.service.SetmealService;
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.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/setmeal")
@Slf4j
public class SetmealController {

    @Autowired
    private SetmealService setmealService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private SetmealDishService setmealDishService;

    /**
     * 新增套餐
     * @param setmealDto
     * @return
     */
    @PostMapping
    public R<String> save(@RequestBody SetmealDto setmealDto){
        log.info("套餐信息:{}",setmealDto);

        setmealService.saveWithDish(setmealDto);

        return R.success("新增套餐成功");
    }

    /**
     * 套餐分頁查詢
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> page(int page, int pageSize, String name){
        //分頁構造器對象
        Page<Setmeal> pageInfo = new Page<>(page,pageSize);
        Page<SetmealDto> dtoPage = new Page<>();

        LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
        //添加查詢條件,根據(jù)name進行l(wèi)ike模糊查詢
        queryWrapper.like(name != null,Setmeal::getName,name);
        //添加排序條件,根據(jù)更新時間降序排列
        queryWrapper.orderByDesc(Setmeal::getUpdateTime);

        setmealService.page(pageInfo,queryWrapper);

        //對象拷貝
        BeanUtils.copyProperties(pageInfo,dtoPage,"records");
        List<Setmeal> records = pageInfo.getRecords();

        List<SetmealDto> list = records.stream().map((item) -> {
            SetmealDto setmealDto = new SetmealDto();
            //對象拷貝
            BeanUtils.copyProperties(item,setmealDto);
            //分類id
            Long categoryId = item.getCategoryId();
            //根據(jù)分類id查詢分類對象
            Category category = categoryService.getById(categoryId);
            if(category != null){
                //分類名稱
                String categoryName = category.getName();
                setmealDto.setCategoryName(categoryName);
            }
            return setmealDto;
        }).collect(Collectors.toList());

        dtoPage.setRecords(list);
        return R.success(dtoPage);
    }

    /**
     * 刪除套餐
     * @param ids
     * @return
     */
    @DeleteMapping
    public R<String> delete(@RequestParam List<Long> ids){
        log.info("ids:{}",ids);

        setmealService.removeWithDish(ids);

        return R.success("套餐數(shù)據(jù)刪除成功");
    }

    /**
     * 根據(jù)條件查詢套餐數(shù)據(jù)
     * @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);

    }

}

3 功能測試

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

三、購物車

1 需求分析

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

2 數(shù)據(jù)模型

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

3 代碼開發(fā)

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

3.1 實體類ShoppingCart

package com.runa.reggie.entity;

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 購物車
 */
@Data
public class ShoppingCart implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //名稱
    private String name;

    //用戶id
    private Long userId;

    //菜品id
    private Long dishId;

    //套餐id
    private Long setmealId;

    //口味
    private String dishFlavor;

    //數(shù)量
    private Integer number;

    //金額
    private BigDecimal amount;

    //圖片
    private String image;

    private LocalDateTime createTime;
}

3.2 Mapper接口ShoppingCartMapper

package com.runa.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runa.reggie.entity.ShoppingCart;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface ShoppingCartMapper extends BaseMapper<ShoppingCart> {

}

3.3 業(yè)務層接口ShoppingCartService

package com.runa.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runa.reggie.entity.ShoppingCart;

public interface ShoppingCartService extends IService<ShoppingCart> {

}

3.4 業(yè)務層實現(xiàn)類ShoppingCartServiceImpl

package com.runa.reggie.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runa.reggie.entity.ShoppingCart;
import com.runa.reggie.mapper.ShoppingCartMapper;
import com.runa.reggie.service.ShoppingCartService;
import org.springframework.stereotype.Service;

@Service
public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, ShoppingCart> implements ShoppingCartService {

}

3.5 控制層ShoppingCartController

package com.runa.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.runa.reggie.common.BaseContext;
import com.runa.reggie.common.R;
import com.runa.reggie.entity.ShoppingCart;
import com.runa.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 購物車
 */
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

 
}

?3.6 main.js

修改記得清理瀏覽器緩存

//獲取所有的菜品分類
function categoryListApi() {
    return $axios({
      'url': '/category/list',
      'method': 'get',
    })
  }

//獲取菜品分類對應的菜品
function dishListApi(data) {
    return $axios({
        'url': '/dish/list',
        'method': 'get',
        params:{...data}
    })
}

//獲取菜品分類對應的套餐
function setmealListApi(data) {
    return $axios({
        'url': '/setmeal/list',
        'method': 'get',
        params:{...data}
    })
}

//獲取購物車內商品的集合
function cartListApi(data) {
    return $axios({
        'url': '/shoppingCart/list',
        // 'url': '/front/cartData.json',
        'method': 'get',
        params:{...data}
    })
}

//購物車中添加商品
function  addCartApi(data){
    return $axios({
        'url': '/shoppingCart/add',
        'method': 'post',
        data
      })
}

//購物車中修改商品
function  updateCartApi(data){
    return $axios({
        'url': '/shoppingCart/sub',
        'method': 'post',
        data
      })
}

//刪除購物車的商品
function clearCartApi() {
    return $axios({
        'url': '/shoppingCart/clean',
        'method': 'delete',
    })
}

//獲取套餐的全部菜品
function setMealDishDetailsApi(id) {
    return $axios({
        'url': `/setmeal/dish/${id}`,
        'method': 'get',
    })
}


3.7?ShoppingCartController 控制層

package com.runa.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.runa.reggie.common.BaseContext;
import com.runa.reggie.common.R;
import com.runa.reggie.entity.ShoppingCart;
import com.runa.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 購物車
 */
@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {

    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 添加購物車
     * @param shoppingCart
     * @return
     */
    @PostMapping("/add")
    public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
        log.info("購物車數(shù)據(jù):{}",shoppingCart);

        //設置用戶id,指定當前是哪個用戶的購物車數(shù)據(jù)
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);

        Long dishId = shoppingCart.getDishId();

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,currentId);

        if(dishId != null){
            //添加到購物車的是菜品
            queryWrapper.eq(ShoppingCart::getDishId,dishId);

        }else{
            //添加到購物車的是套餐
            queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }

        //查詢當前菜品或者套餐是否在購物車中
        //SQL:select * from shopping_cart where user_id = ? and dish_id/setmeal_id = ?
        ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);

        if(cartServiceOne != null){
            //如果已經(jīng)存在,就在原來數(shù)量基礎上加一
            Integer number = cartServiceOne.getNumber();
            cartServiceOne.setNumber(number + 1);
            shoppingCartService.updateById(cartServiceOne);
        }else{
            //如果不存在,則添加到購物車,數(shù)量默認就是一
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartService.save(shoppingCart);
            cartServiceOne = shoppingCart;
        }

        return R.success(cartServiceOne);
    }

    /**
     * 查看購物車
     * @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);
    }

    /**
     * 清空購物車
     * @return
     */
    @DeleteMapping("/clean")
    public R<String> clean(){
        //SQL:delete from shopping_cart where user_id = ?

        LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());

        shoppingCartService.remove(queryWrapper);

        return R.success("清空購物車成功");
    }
}

4 功能測試

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?文章來源地址http://www.zghlxwxcb.cn/news/detail-681793.html

四、用戶下單

1 需求分析

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?

2 數(shù)據(jù)模型

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?

3 代碼開發(fā)

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?

3.1 訂單實體Orders

package com.runa.reggie.entity;

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 訂單
 */
@Data
public class Orders implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //訂單號
    private String number;

    //訂單狀態(tài) 1待付款,2待派送,3已派送,4已完成,5已取消
    private Integer status;


    //下單用戶id
    private Long userId;

    //地址id
    private Long addressBookId;


    //下單時間
    private LocalDateTime orderTime;


    //結賬時間
    private LocalDateTime checkoutTime;


    //支付方式 1微信,2支付寶
    private Integer payMethod;


    //實收金額
    private BigDecimal amount;

    //備注
    private String remark;

    //用戶名
    private String userName;

    //手機號
    private String phone;

    //地址
    private String address;

    //收貨人
    private String consignee;
}

3.2 訂單詳細實體OrderDetail

package com.runa.reggie.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;

/**
 * 訂單明細
 */
@Data
public class OrderDetail implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //名稱
    private String name;

    //訂單id
    private Long orderId;


    //菜品id
    private Long dishId;


    //套餐id
    private Long setmealId;


    //口味
    private String dishFlavor;


    //數(shù)量
    private Integer number;

    //金額
    private BigDecimal amount;

    //圖片
    private String image;
}

3.3 Mapper接口類OrderMapper

package com.runa.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runa.reggie.entity.Orders;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderMapper extends BaseMapper<Orders> {
}

3.4 Mapper接口類OrderDetailMapper

package com.runa.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.runa.reggie.entity.OrderDetail;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderDetailMapper extends BaseMapper<OrderDetail> {
}

3.5 業(yè)務層接口OrderService

package com.runa.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runa.reggie.entity.Orders;

public interface OrderService extends IService<Orders> {
}

3.6 業(yè)務層接口OrderDetailService

package com.runa.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runa.reggie.entity.OrderDetail;

public interface OrderDetailService extends IService<OrderDetail> {
}

3.7 業(yè)務層接口OrderServiceImpl

package com.runa.reggie.service.impl;


import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runa.reggie.entity.*;
import com.runa.reggie.mapper.OrderMapper;
import com.runa.reggie.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;



@Service
@Slf4j
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Orders> implements OrderService {

}

3.8 業(yè)務層接口OrderDetailServiceImpl

package com.runa.reggie.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.runa.reggie.entity.OrderDetail;
import com.runa.reggie.mapper.OrderDetailMapper;
import com.runa.reggie.service.OrderDetailService;
import org.springframework.stereotype.Service;

@Service
public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailMapper, OrderDetail> implements OrderDetailService {
}

3.9 業(yè)務層接口OrderController

package com.runa.reggie.controller;

import com.runa.reggie.common.R;
import com.runa.reggie.entity.Orders;
import com.runa.reggie.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 訂單
 */
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;

}

3.10?業(yè)務層接口OrderDetailController

package com.runa.reggie.controller;

import com.runa.reggie.service.OrderDetailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 訂單明細
 */
@Slf4j
@RestController
@RequestMapping("/orderDetail")
public class OrderDetailController {

    @Autowired
    private OrderDetailService orderDetailService;

}

3.11?OrderController?

package com.runa.reggie.controller;

import com.runa.reggie.common.R;
import com.runa.reggie.entity.Orders;
import com.runa.reggie.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 訂單
 */
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private OrderService orderService;
    /**
     * 用戶下單
     * @param orders
     * @return
     */
    @PostMapping("/submit")
    public R<String> submit(@RequestBody Orders orders){
        log.info("訂單數(shù)據(jù):{}",orders);
        orderService.submit(orders);
        return R.success("下單成功");
    }

}

?3.12?OrderService

package com.runa.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.runa.reggie.entity.Orders;

public interface OrderService extends IService<Orders> {
    /**
     * 用戶下單
     * @param orders
     */
    public void submit(Orders orders);
}

3.13?OrderServiceImpl?

package com.runa.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.runa.reggie.common.BaseContext;
import com.runa.reggie.common.CustomException;
import com.runa.reggie.entity.*;
import com.runa.reggie.mapper.OrderMapper;
import com.runa.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
     */
    @Transactional
    public void submit(Orders orders) {
        //獲得當前用戶id
        Long userId = BaseContext.getCurrentId();

        //查詢當前用戶的購物車數(shù)據(jù)
        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("購物車為空,不能下單");
        }

        //查詢用戶數(shù)據(jù)
        User user = userService.getById(userId);

        //查詢地址數(shù)據(jù)
        Long addressBookId = orders.getAddressBookId();
        AddressBook addressBook = addressBookService.getById(addressBookId);
        if(addressBook == null){
            throw new CustomException("用戶地址信息有誤,不能下單");
        }

        long orderId = IdWorker.getId();//訂單號

        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()));
        //向訂單表插入數(shù)據(jù),一條數(shù)據(jù)
        this.save(orders);

        //向訂單明細表插入數(shù)據(jù),多條數(shù)據(jù)
        orderDetailService.saveBatch(orderDetails);

        //清空購物車數(shù)據(jù)
        shoppingCartService.remove(wrapper);
    }

}

?

4 功能測試

【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā),java,java,mybatis,開發(fā)語言

?

到了這里,關于【java】【項目實戰(zhàn)】[外賣八]產(chǎn)品展示、購物車、下單開發(fā)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件實現(xiàn)產(chǎn)品列表信息的展示和選擇

    在DevExpress的GridView的列中,使用RepositoryItemSearchLookUpEdit控件實現(xiàn)產(chǎn)品列表信息的展示和選擇

    有時候,我們?yōu)榱朔奖?,我們往往使用擴展函數(shù)的代碼方式創(chuàng)建很多GridView的操作功能,如在隨筆《在DevExpress中使用BandedGridView表格實現(xiàn)多行表頭的處理》中介紹過多行表頭的創(chuàng)建及綁定處理,在《基于DevExpress的GridControl實現(xiàn)的一些界面處理功能》也介紹了一些特殊的展示效

    2024年02月07日
    瀏覽(21)
  • itheima蒼穹外賣項目學習筆記--Day7:緩存商品 / 購物車

    通過Redis來緩存菜品數(shù)據(jù),減少數(shù)據(jù)庫查詢操作。 緩存邏輯分析: 每個分類下的菜品保存一份緩存數(shù)據(jù) 數(shù)據(jù)庫中菜品數(shù)據(jù)有變更時清理緩存數(shù)據(jù) 修改用戶端接口 DishController 的 list 方法,加入緩存處理邏輯 修改管理端接口 DishController 的相關方法,加入清理緩存的邏輯,需要

    2024年02月16日
    瀏覽(23)
  • 【java】【項目實戰(zhàn)】[外賣九]項目優(yōu)化(緩存)

    【java】【項目實戰(zhàn)】[外賣九]項目優(yōu)化(緩存)

    目錄 一、問題說明 二、環(huán)境搭建 2.1 Git管理代碼 2.1.1 創(chuàng)建本地倉庫 2.1.2 創(chuàng)建遠程倉庫 2.1.3 創(chuàng)建分支--》推送到遠程倉庫 2.2 maven坐標 2.3 配置文件application.yml 2.4 配置類RedisConfig 三、緩存短信驗證碼 3.1 實現(xiàn)思路 3.2 代碼改造 3.2.1?UserController 3.3 功能測試 四、緩存菜品數(shù)據(jù) 4

    2024年02月09日
    瀏覽(21)
  • Java項目實戰(zhàn)筆記(瑞吉外賣)-4

    Java項目實戰(zhàn)筆記(瑞吉外賣)-4

    問題分析 前面已經(jīng)完成了后臺系統(tǒng)的員工管理功能開發(fā),在新增員工時需要設置創(chuàng)建時間、創(chuàng)建人、修改時間、修改人等字段,在編輯員工時需要設置修改時間和修改人等字段。這些字段屬于公共字段,也就是很多表中都有這些字段,如下: 能不能對于這些公共字段在某個

    2023年04月17日
    瀏覽(21)
  • 【java】【項目實戰(zhàn)】[外賣五]菜品管理業(yè)務開發(fā)

    【java】【項目實戰(zhàn)】[外賣五]菜品管理業(yè)務開發(fā)

    目錄 一、文件上傳與下載 1.1 文件上傳介紹 1.2 文件下載介紹 1.3 文件上傳代碼實現(xiàn) 1.3.1 新增upload.html 1.3.2 修改application.yml ?1.3.3?CommonController 1.3.4? 功能測試 1.4 文件下載代碼實現(xiàn) ?1.4.1? CommonController 1.4.2? 功能測試 二、新增菜品 2.1 需求分析 2.2 數(shù)據(jù)模型 2.3 代碼實現(xiàn) 2.3.

    2024年02月11日
    瀏覽(23)
  • 【java蒼穹外賣項目實戰(zhàn)三】nginx反向代理和負載均衡

    【java蒼穹外賣項目實戰(zhàn)三】nginx反向代理和負載均衡

    我們思考一個問題: 前端發(fā)送的請求,是如何請求到后端服務的? 前端請求地址:http://localhost/api/employee/login 后端接口地址:http://localhost:8080/admin/employee/login 很明顯,兩個地址不一致,那是如何請求到后端服務的呢? 1、nginx反向代理 nginx 反向代理 ,就是將前端發(fā)送的動態(tài)

    2024年02月21日
    瀏覽(27)
  • 《蒼穹外賣》電商實戰(zhàn)項目(java)知識點整理(P1~P65)【上】

    《蒼穹外賣》電商實戰(zhàn)項目(java)知識點整理(P1~P65)【上】

    史上最完整的《蒼穹外賣》項目實操筆記,跟視頻的每一P對應,全系列10萬字,涵蓋詳細步驟與問題的解決方案。如果你操作到某一步卡殼,參考這篇,相信會帶給你極大啟發(fā)。 《蒼穹外賣》項目實操筆記【中】:P66~P122《蒼穹外賣》項目實操筆記【中】 1. nginx反向代理好處

    2024年01月24日
    瀏覽(33)
  • Android App開發(fā)實戰(zhàn)項目之購物車(附源碼 超詳細必看)

    Android App開發(fā)實戰(zhàn)項目之購物車(附源碼 超詳細必看)

    需要源碼請點贊關注收藏后評論區(qū)留言~~~ 電商App的購物車可謂是司空見慣了,可以知道購物車除了底部有一個結算行,其余部分主要是已加入購物車的商品列表,然后每個商品左邊是商品小圖,右邊是商品名稱以及價格,第一次進入購物車頁面應該是空的,隨著加入東西的增

    2024年02月11日
    瀏覽(26)
  • 《蒼穹外賣》知識梳理6-緩存商品,購物車功能

    《蒼穹外賣》知識梳理6-緩存商品,購物車功能

    一.緩存菜品 ??可以使用redis進行緩存;另外,在實現(xiàn)緩存套餐時可以使用spring cache提高開發(fā)效率; ??通過緩存數(shù)據(jù),降低訪問數(shù)據(jù)庫的次數(shù); 使用的緩存邏輯: 1.每個分類下保存一份緩存數(shù)據(jù);就是一對key-value(dish_1表示屬于分類1的菜品列表) 2.數(shù)據(jù)庫中的菜品有變更

    2024年02月19日
    瀏覽(22)
  • 蒼穹外賣day07——緩存菜品套餐+購物車功能實現(xiàn)

    蒼穹外賣day07——緩存菜品套餐+購物車功能實現(xiàn)

    用戶訪問量過大帶來的一個直接效果就是響應速度慢,使用體驗下降。 使用redis緩存菜品數(shù)據(jù),減少數(shù)據(jù)庫查詢操作。 ?頁面展示上基本就是同一個分類在同一頁,所以key-value結構可以使用不同的分類來做key。 在小程序每一次點擊不同的分類,后端哪里都會刷刷刷的連接數(shù)據(jù)

    2024年02月14日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包