
核心功能模块设计
外卖点餐系统需包含以下基础模块:
- 菜品管理(增删改查)
- 购物车功能
- 订单生成与状态管理
- 用户基础交互界面
数据库表结构设计
-- 菜品表
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>
`);
});
}
订单处理流程
- 客户端提交订单数据
{
"userId": 123,
"items": [
{"dishId": 1, "quantity": 2},
{"dishId": 3, "quantity": 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);
}
系统优化建议
- 数据库层面添加索引
CREATE INDEX idx_dish_name ON dishes(name);
CREATE INDEX idx_order_status ON orders(status);
- 实现分页查询
@GetMapping("/dishes")
public Page<Dish> getDishesByPage(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size) {
return dishRepository.findAll(PageRequest.of(page, size));
}
- 添加事务管理
@Transactional
public Order createOrderWithTransaction(OrderRequest request) {
// 订单创建逻辑
}
- 缓存热门菜品
@Cacheable(value = "hotDishes")
public List<Dish> getHotDishes() {
return dishRepository.findTop10ByOrderBySalesDesc();
}

被折叠的 条评论
为什么被折叠?



