【实战入门】Java+MySQL开发简易外卖点餐系统 从菜管理到订单生成

核心功能模块设计

外卖点餐系统需包含以下基础模块:

  • 菜品管理(增删改查)
  • 购物车功能
  • 订单生成与状态管理
  • 用户基础交互界面

数据库表结构设计

-- 菜品表
CREATE TABLE dishes (
    dish_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    description TEXT,
    stock INT DEFAULT 0,
    image_url VARCHAR(255)
);

-- 订单表
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    total_amount DECIMAL(10,2) NOT NULL,
    status ENUM('pending','paid','delivered') DEFAULT 'pending',
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 订单明细表
CREATE TABLE order_items (
    item_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    dish_id INT,
    quantity INT NOT NULL,
    subtotal DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (dish_id) REFERENCES dishes(dish_id)
);

Java后端核心实现

Spring Boot 基础配置

@SpringBootApplication
public class FoodOrderingApp {
    public static void main(String[] args) {
        SpringApplication.run(FoodOrderingApp.class, args);
    }
}

菜品控制器示例

@RestController
@RequestMapping("/api/dishes")
public class DishController {
    
    @Autowired
    private DishRepository dishRepository;

    @GetMapping
    public List<Dish> getAllDishes() {
        return dishRepository.findAll();
    }

    @PostMapping
    public Dish createDish(@RequestBody Dish dish) {
        return dishRepository.save(dish);
    }
}

前端交互逻辑

AJAX获取菜品列表

function loadDishes() {
    $.ajax({
        url: '/api/dishes',
        method: 'GET',
        success: function(data) {
            renderDishList(data);
        }
    });
}

function renderDishList(dishes) {
    const $container = $('#dish-container');
    dishes.forEach(dish => {
        $container.append(`
            <div class="dish-card">
                <h3>${dish.name}</h3>
                <p>¥${dish.price.toFixed(2)}</p>
                <button onclick="addToCart(${dish.dish_id})">加入购物车</button>
            </div>
        `);
    });
}

订单处理流程

  1. 客户端提交订单数据
{
    "userId": 123,
    "items": [
        {"dishId": 1, "quantity": 2},
        {"dishId": 3, "quantity": 1}
    ]
}

  1. 服务端订单处理
@PostMapping("/orders")
public Order createOrder(@RequestBody OrderRequest request) {
    // 验证库存
    List<OrderItem> items = request.getItems().stream()
        .map(item -> {
            Dish dish = dishRepository.findById(item.getDishId())
                .orElseThrow(() -> new RuntimeException("菜品不存在"));
            if(dish.getStock() < item.getQuantity()) {
                throw new RuntimeException("库存不足");
            }
            return new OrderItem(dish, item.getQuantity());
        }).collect(Collectors.toList());

    // 计算总价
    BigDecimal total = items.stream()
        .map(OrderItem::getSubtotal)
        .reduce(BigDecimal.ZERO, BigDecimal::add);

    // 保存订单
    Order order = new Order(request.getUserId(), total);
    order.setItems(items);
    return orderRepository.save(order);
}

系统优化建议

  1. 数据库层面添加索引
CREATE INDEX idx_dish_name ON dishes(name);
CREATE INDEX idx_order_status ON orders(status);

  1. 实现分页查询
@GetMapping("/dishes")
public Page<Dish> getDishesByPage(
    @RequestParam(defaultValue = "0") int page,
    @RequestParam(defaultValue = "10") int size) {
    return dishRepository.findAll(PageRequest.of(page, size));
}

  1. 添加事务管理
@Transactional
public Order createOrderWithTransaction(OrderRequest request) {
    // 订单创建逻辑
}

  1. 缓存热门菜品
@Cacheable(value = "hotDishes")
public List<Dish> getHotDishes() {
    return dishRepository.findTop10ByOrderBySalesDesc();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值