咖啡店管理系统
一、项目背景与目标
大三上学期,为了将Java面向对象编程、数据库操作与分层架构设计的知识落地实践,我开发了这套咖啡店管理系统。当时的目标是解决小型咖啡店日常运营中的痛点:手工记账易出错、库存管理混乱、销售数据无法统计,因此设计了一套集点单、库存、员工、销售统计于一体的桌面管理系统,让门店运营更高效、数据更清晰。
二、技术选型与整体架构
1. 技术栈
开发语言:Java 8
架构模式:经典三层架构(表现层UI、业务逻辑层Service、数据访问层DAO)
数据库:MySQL 8.0
核心技术:JDBC、Swing(桌面UI)、面向对象编程(封装/继承/多态)
开发工具:IntelliJ IDEA、Navicat Premium
2. 三层架构设计详解
①表现层(UI)
提供用户交互界面,接收用户输入并展示处理结果 com.coffee.ui 包下的 LoginFrame.java 、 OrderFrame.java 等
②业务逻辑层(Service)
封装业务规则,处理核心业务逻辑,调用DAO层完成数据操作 com.coffee.service 包下的 OrderService.java 、 InventoryService.java 等
③数据访问层(DAO)
直接与MySQL交互,封装增删改查操作,为Service层提供数据支持 com.coffee.dao 包下的 OrderDAO.java 、 InventoryDAO.java 等
这种分层设计的优势非常明显:比如后续要把桌面版改成网页版,只需要重写表现层,Service和DAO层的代码几乎不用改动;修改数据库字段时,也只需要调整DAO层的SQL语句,不会影响上层业务逻辑
三、核心功能模块与代码片段
1. 数据访问层(DAO层)核心代码示例
以订单数据操作为例, OrderDAO.java 中封装了订单新增、查询的核心逻辑,使用JDBC完成数据库交互:
package com.coffee.dao;
import com.coffee.entity.Order;
import com.coffee.utils.DBUtil;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class OrderDAO {
// 新增订单
public boolean addOrder(Order order) {
String sql = "INSERT INTO orders(order_id, user_id, total_price, create_time, status) VALUES (?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 获取数据库连接
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
// 设置SQL参数
pstmt.setString(1, order.getOrderId());
pstmt.setInt(2, order.getUserId());
pstmt.setDouble(3, order.getTotalPrice());
pstmt.setTimestamp(4, new Timestamp(System.currentTimeMillis()));
pstmt.setInt(5, order.getStatus());
// 执行SQL
return pstmt.executeUpdate() > 0;
} catch (SQLException e) {
e.printStackTrace();
return false;
} finally {
// 关闭资源
DBUtil.close(conn, pstmt, null);
}
}
// 根据订单ID查询订单
public Order getOrderById(String orderId) {
String sql = "SELECT * FROM orders WHERE order_id = ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBUtil.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, orderId);
rs = pstmt.executeQuery();
if (rs.next()) {
Order order = new Order();
order.setOrderId(rs.getString("order_id"));
order.setUserId(rs.getInt("user_id"));
order.setTotalPrice(rs.getDouble("total_price"));
order.setCreateTime(rs.getTimestamp("create_time"));
order.setStatus(rs.getInt("status"));
return order;
}
return null;
} catch (SQLException e) {
e.printStackTrace();
return null;
} finally {
DBUtil.close(conn, pstmt, rs);
}
}
这里的 DBUtil.java 是工具类,封装了数据库连接与关闭操作,避免了重复代码,提升了代码复用率。
2. 业务逻辑层(Service层)核心代码示例
OrderService.java 调用DAO层的方法,同时封装订单业务逻辑,比如订单创建时的库存扣减、金额校验:
package com.coffee.service;
import com.coffee.dao.OrderDAO;
import com.coffee.dao.InventoryDAO;
import com.coffee.entity.Order;
import com.coffee.entity.OrderItem;
import java.util.List;
import java.util.UUID;
public class OrderService {
private OrderDAO orderDAO = new OrderDAO();
private InventoryDAO inventoryDAO = new InventoryDAO();
// 创建订单并扣减库存
public boolean createOrder(int userId, List<OrderItem> items) {
// 1. 生成唯一订单号
String orderId = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
double totalPrice = 0;
// 2. 校验库存并计算总金额
for (OrderItem item : items) {
// 检查商品库存是否充足
if (!inventoryDAO.checkStock(item.getProductId(), item.getQuantity())) {
throw new RuntimeException("商品" + item.getProductName() + "库存不足,无法下单!");
}
// 累加订单总金额
totalPrice += item.getPrice() * item.getQuantity();
}
// 3. 扣减库存
for (OrderItem item : items) {
inventoryDAO.reduceStock(item.getProductId(), item.getQuantity());
}
// 4. 封装订单对象并保存
Order order = new Order();
order.setOrderId(orderId);
order.setUserId(userId);
order.setTotalPrice(totalPrice);
order.setStatus(1); // 1表示待支付
return orderDAO.addOrder(order);
}
}
这里体现了业务逻辑层的核心作用:它不是简单地调用DAO层方法,而是把“库存校验-金额计算-扣减库存-创建订单”这一完整的业务流程串联起来,同时处理异常情况,确保数据一致性。
3. 表现层(UI层)核心代码示例
以订单结算按钮的事件监听为例, OrderFrame.java 中处理用户点击事件,调用Service层完成订单创建:
package com.coffee.ui;
import com.coffee.entity.OrderItem;
import com.coffee.service.OrderService;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
public class OrderFrame extends JFrame {
private OrderService orderService = new OrderService();
private List<OrderItem> selectedItems; // 已选商品列表
private int currentUserId; // 当前登录用户ID
// 结算按钮事件监听
private void initSubmitButton() {
JButton submitBtn = new JButton("结算订单");
submitBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (selectedItems == null || selectedItems.isEmpty()) {
JOptionPane.showMessageDialog(OrderFrame.this, "请先选择商品!", "提示", JOptionPane.WARNING_MESSAGE);
return;
}
try {
// 调用Service层创建订单
boolean success = orderService.createOrder(currentUserId, selectedItems);
if (success) {
JOptionPane.showMessageDialog(OrderFrame.this, "订单创建成功!", "成功", JOptionPane.INFORMATION_MESSAGE);
// 清空已选商品,刷新界面
selectedItems.clear();
refreshOrderList();
} else {
JOptionPane.showMessageDialog(OrderFrame.this, "订单创建失败,请重试!", "错误", JOptionPane.ERROR_MESSAGE);
}
} catch (RuntimeException ex) {
JOptionPane.showMessageDialog(OrderFrame.this, ex.getMessage(), "错误", JOptionPane.ERROR_MESSAGE);
}
}
});
}
// 刷新订单列表界面(省略具体实现)
private void refreshOrderList() {
// 清空界面上的商品列表,重新加载
}
}
表现层只负责处理用户交互,不包含任何业务逻辑,所有核心流程都交给Service层处理,这样的设计让界面和业务逻辑解耦,后续修改界面时不会影响业务代码。
四、项目功能与亮点
1. 核心功能清单
权限管理:区分管理员/员工角色,管理员可管理商品、库存、员工信息,员工仅能点单、查看订单
订单管理:支持点单、修改订单、结算、查询历史订单,自动生成订单编号
库存管理:商品库存实时监控,库存不足时弹出预警,支持商品新增/修改/删除
销售统计:按日/周/月统计销售额、订单量、热门商品排行,生成简易报表
员工管理:员工信息录入、账号管理、岗位分配,关联操作日志
2. 项目亮点
1. 分层架构实践:严格按照三层架构开发,代码解耦性强,后续维护和扩展非常方便,让我彻底理解了分层设计的思想。
2. 异常处理机制:在DAO、Service层都做了完善的异常捕获,比如库存不足、数据库连接失败等场景都有对应的提示,系统稳定性更高。
3. 面向对象应用:把商品、订单、员工等实体封装成Java类,通过封装和继承简化了代码结构,也让业务模型更清晰。
五、项目收获与反思
这次项目让我第一次完整经历了“需求分析-架构设计-代码实现-测试优化”的开发流程,收获远不止技术层面:
技术上,熟练掌握了JDBC数据库操作、Swing桌面开发,理解了三层架构的设计思想,也学会了如何把业务需求转化为技术实现方案。
问题解决上,遇到了很多实际问题,比如数据库连接池优化、多角色权限控制、订单和库存的数据一致性问题,通过查资料、调试代码,一步步解决了这些问题,debug能力提升了很多。
不足也很明显:当时的UI界面比较简陋,没有做界面美化;数据库没有使用连接池,高并发场景下性能较差;也没有做单元测试,代码的健壮性还有提升空间。如果后续优化,会引入数据库连接池、优化UI界面,并添加单元测试。