# 基于JavaSwing的商品管理系统开发 **Repository Path**: waqwb/ProductManagement ## Basic Information - **Project Name**: 基于JavaSwing的商品管理系统开发 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 2 - **Created**: 2025-12-06 - **Last Updated**: 2026-01-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于JavaSwing的商品管理系统开发步骤文档(教学案例) ## 1. 项目概述 ### 1.1 项目背景 本项目是一个基于JavaSwing的商品管理系统,旨在教学Java GUI编程、数据库操作、HTTP请求处理、第三方API集成等技术。系统使用Oracle数据库存储数据,实现了商品的增删改查功能,并添加了购物车和支付宝沙箱支付功能,集成了前端技术进行数据可视化展示。 ### 1.2 功能需求 - **商品管理**:增删改查商品信息 - **购物车**:添加、修改、删除购物车商品,结算生成订单 - **订单管理**:查看订单、支付订单、查看订单详情 - **地址管理**:添加、编辑、删除地址,省市区三级联动,地图定位 - **支付功能**:支付宝沙箱支付 - **数据可视化**:商品分类统计图表,地图展示 ### 1.3 技术选型 | 技术 | 版本 | 用途 | |------|------|------| | Java | 8+ | 开发语言 | | JavaSwing | JDK内置 | GUI框架 | | Oracle | 11g/19c | 数据库 | | JDBC | JDK内置 | 数据库连接 | | Log4j 2 | 2.20.0 | 日志框架 | | Jackson | 2.15.0 | JSON处理 | | Apache HttpClient | 4.5.13 | HTTP请求 | | Ehcache | 3.10.8 | 缓存 | | 支付宝SDK | 4.38.0 | 支付处理 | | Chart.js | 3.9.1 | 数据可视化 | | 百度地图API | - | 地图定位 | | Docker | - | 可选,快速部署Oracle | ## 2. 项目结构设计 ``` Project1/ ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── example/ │ │ │ └── productmanager/ │ │ │ ├── Main.java # 主入口类 │ │ │ ├── ui/ # UI组件包 │ │ │ │ ├── MainFrame.java # 主窗口 │ │ │ │ ├── ProductPanel.java # 商品管理面板 │ │ │ │ ├── AddProductDialog.java # 添加商品对话框 │ │ │ │ ├── EditProductDialog.java # 编辑商品对话框 │ │ │ │ ├── CartPanel.java # 购物车面板 │ │ │ │ ├── OrderPanel.java # 订单面板 │ │ │ │ ├── AddressDialog.java # 地址管理对话框 │ │ │ │ └── PaymentDialog.java # 支付对话框 │ │ │ ├── model/ # 实体类包 │ │ │ │ ├── Product.java # 商品实体 │ │ │ │ ├── CartItem.java # 购物车项实体 │ │ │ │ ├── Order.java # 订单实体 │ │ │ │ ├── OrderItem.java # 订单项实体 │ │ │ │ └── Address.java # 地址实体 │ │ │ ├── dao/ # 数据访问层 │ │ │ │ ├── ProductDAO.java # 商品DAO │ │ │ │ ├── OrderDAO.java # 订单DAO │ │ │ │ ├── AddressDAO.java # 地址DAO │ │ │ │ └── DBUtil.java # 数据库工具类 │ │ │ ├── service/ # 业务逻辑层 │ │ │ │ ├── ProductService.java # 商品服务 │ │ │ │ ├── CartService.java # 购物车服务 │ │ │ │ ├── OrderService.java # 订单服务 │ │ │ │ └── PaymentService.java # 支付服务 │ │ │ ├── util/ # 工具类包 │ │ │ │ ├── LogUtil.java # 日志工具 │ │ │ │ └── JsonUtil.java # JSON工具 │ │ └── resources/ # 资源文件 │ │ ├── log4j2.xml # 日志配置 │ │ ├── alipay.properties # 支付宝配置 │ │ └── html/ # HTML资源 │ │ ├── index.html # 数据可视化页面 │ │ ├── styles.css # CSS样式 │ │ └── script.js # JavaScript脚本 │ └── lib/ # 第三方库 │ ├── ojdbc8.jar # Oracle JDBC驱动 │ ├── log4j-core-2.20.0.jar │ ├── log4j-api-2.20.0.jar │ ├── jackson-databind-2.15.0.jar │ ├── jackson-core-2.15.0.jar │ ├── jackson-annotations-2.15.0.jar │ ├── httpclient-4.5.13.jar │ ├── httpcore-4.4.15.jar │ ├── commons-logging-1.2.jar │ ├── commons-codec-1.15.jar │ ├── ehcache-3.10.8.jar │ ├── slf4j-api-1.7.36.jar │ ├── slf4j-log4j12-1.7.36.jar │ ├── alipay-sdk-java-4.38.0.jar │ └── fastjson-1.2.83.jar ├── scripts/ # 脚本文件 │ ├── create_tables.sql # 创建表结构 │ ├── insert_sample_data.sql # 插入示例数据 │ └── docker-oracle-start.sh # Docker启动Oracle ├── docker-compose.yml # Docker配置 └── README.md # 项目说明 ``` ## 3. 开发环境搭建 ### 3.1 JDK安装 1. 下载JDK 8或更高版本 2. 安装JDK,配置环境变量 3. 验证安装:`java -version` ### 3.2 IDE配置 1. 推荐使用IntelliJ IDEA或Eclipse 2. 创建Java项目,配置项目结构 3. 添加lib目录下的所有JAR文件到项目依赖 ### 3.3 Oracle数据库配置 #### 3.3.1 本地已有Oracle 1. 创建数据库用户和表空间 2. 分配权限 3. 记录连接信息(URL、用户名、密码) #### 3.3.2 本地无Oracle(Docker部署) 1. 安装Docker 2. 使用提供的docker-compose.yml启动Oracle容器 3. 执行SQL脚本初始化数据库 ## 4. 详细开发步骤 ### 4.1 步骤1:创建基础工具类 #### 4.1.1 日志工具类(LogUtil.java) **目标**:实现日志记录功能,方便调试和系统监控 **代码实现**: ```java package com.example.productmanager.util; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * 日志工具类 * 封装Log4j2,提供静态日志记录方法 */ public class LogUtil { /** * 获取日志记录器 * @param clazz 类对象 * @return 日志记录器 */ public static Logger getLogger(Class clazz) { return LogManager.getLogger(clazz); } /** * 获取日志记录器 * @param name 日志名称 * @return 日志记录器 */ public static Logger getLogger(String name) { return LogManager.getLogger(name); } } ``` **解释**: - 使用Log4j2框架记录日志 - 提供静态方法获取日志记录器 - 支持按类或名称获取日志记录器 #### 4.1.2 JSON工具类(JsonUtil.java) **目标**:实现JSON字符串与Java对象的相互转换 **代码实现**: ```java package com.example.productmanager.util; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; /** * JSON工具类 * 封装Jackson,提供JSON与Java对象的转换方法 */ public class JsonUtil { // Jackson ObjectMapper实例,用于JSON转换 private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); /** * 将Java对象转换为JSON字符串 * @param obj Java对象 * @return JSON字符串 * @throws IOException 转换异常 */ public static String toJson(Object obj) throws IOException { return OBJECT_MAPPER.writeValueAsString(obj); } /** * 将JSON字符串转换为Java对象 * @param json JSON字符串 * @param clazz 目标类 * @param 泛型类型 * @return Java对象 * @throws IOException 转换异常 */ public static T fromJson(String json, Class clazz) throws IOException { return OBJECT_MAPPER.readValue(json, clazz); } } ``` **解释**: - 使用Jackson库处理JSON转换 - 提供静态方法实现Java对象到JSON字符串的转换 - 提供静态方法实现JSON字符串到Java对象的转换 ### 4.2 步骤2:实现数据库工具类 #### 4.2.1 DBUtil.java **目标**:实现数据库连接的获取和关闭,简化数据库操作 **代码实现**: ```java package com.example.productmanager.dao; import com.example.productmanager.util.LogUtil; import org.apache.logging.log4j.Logger; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 数据库工具类 * 提供数据库连接的获取和关闭功能 */ public class DBUtil { // 日志记录器 private static final Logger logger = LogUtil.getLogger(DBUtil.class); // Oracle数据库驱动类名 private static final String DRIVER = "oracle.jdbc.OracleDriver"; // Oracle数据库连接URL private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL"; // 数据库用户名 private static final String USERNAME = "scott"; // 数据库密码 private static final String PASSWORD = "tiger"; static { try { // 加载数据库驱动 Class.forName(DRIVER); logger.info("Oracle JDBC驱动加载成功"); } catch (ClassNotFoundException e) { logger.error("Oracle JDBC驱动加载失败", e); throw new RuntimeException("Oracle JDBC驱动加载失败", e); } } /** * 获取数据库连接 * @return 数据库连接对象 * @throws SQLException SQL异常 */ public static Connection getConnection() throws SQLException { Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); logger.info("数据库连接获取成功"); return conn; } /** * 关闭数据库连接 * @param conn 数据库连接对象 */ public static void closeConnection(Connection conn) { if (conn != null) { try { conn.close(); logger.info("数据库连接关闭成功"); } catch (SQLException e) { logger.error("数据库连接关闭失败", e); } } } } ``` **解释**: - 静态块加载Oracle JDBC驱动 - 提供静态方法获取数据库连接 - 提供静态方法关闭数据库连接 - 使用日志记录数据库操作状态 ### 4.3 步骤3:实现实体类 #### 4.3.1 Product.java(商品实体类) **目标**:定义商品的属性和方法,映射数据库中的PRODUCT表 **代码实现**: ```java package com.example.productmanager.model; import java.util.Date; /** * 商品实体类 * 映射数据库中的PRODUCT表 */ public class Product { /** * 商品ID,主键 */ private Long productId; /** * 商品名称 */ private String productName; /** * 商品价格 */ private Double price; /** * 商品数量 */ private Integer quantity; /** * 商品分类 */ private String category; /** * 商品描述 */ private String description; /** * 创建时间 */ private Date createTime; /** * 更新时间 */ private Date updateTime; // 构造方法 public Product() { } public Product(String productName, Double price, Integer quantity, String category, String description) { this.productName = productName; this.price = price; this.quantity = quantity; this.category = category; this.description = description; this.createTime = new Date(); this.updateTime = new Date(); } // getter和setter方法 public Long getProductId() { return productId; } public void setProductId(Long productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } public Integer getQuantity() { return quantity; } public void setQuantity(Integer quantity) { this.quantity = quantity; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public Date getUpdateTime() { return updateTime; } public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } @Override public String toString() { return "Product{" + "productId=" + productId + ", productName='" + productName + '\'' + ", price=" + price + ", quantity=" + quantity + ", category='" + category + '\'' + '}'; } } ``` **解释**: - 定义了商品的基本属性:ID、名称、价格、数量、分类、描述、创建时间、更新时间 - 提供了默认构造方法和带参数的构造方法 - 提供了getter和setter方法 - 重写了toString方法,方便调试 ### 4.4 步骤4:实现DAO层 #### 4.4.1 ProductDAO.java(商品数据访问类) **目标**:实现商品的CRUD操作,与数据库交互 **代码实现**: ```java package com.example.productmanager.dao; import com.example.productmanager.model.Product; import com.example.productmanager.util.LogUtil; import org.apache.logging.log4j.Logger; import java.sql.*; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 商品DAO类 * 实现商品的CRUD操作 */ public class ProductDAO { // 日志记录器 private static final Logger logger = LogUtil.getLogger(ProductDAO.class); /** * 添加商品 * @param product 商品对象 * @return 添加成功返回true,否则返回false */ public boolean addProduct(Product product) { Connection conn = null; PreparedStatement pstmt = null; try { conn = DBUtil.getConnection(); String sql = "INSERT INTO PRODUCT (PRODUCT_NAME, PRICE, QUANTITY, CATEGORY, DESCRIPTION, CREATE_TIME, UPDATE_TIME) VALUES (?, ?, ?, ?, ?, ?, ?)"; pstmt = conn.prepareStatement(sql); pstmt.setString(1, product.getProductName()); pstmt.setDouble(2, product.getPrice()); pstmt.setInt(3, product.getQuantity()); pstmt.setString(4, product.getCategory()); pstmt.setString(5, product.getDescription()); pstmt.setDate(6, new java.sql.Date(product.getCreateTime().getTime())); pstmt.setDate(7, new java.sql.Date(product.getUpdateTime().getTime())); int rows = pstmt.executeUpdate(); logger.info("添加商品成功,影响行数:{}", rows); return rows > 0; } catch (SQLException e) { logger.error("添加商品失败", e); return false; } finally { if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { logger.error("关闭PreparedStatement失败", e); } } DBUtil.closeConnection(conn); } } /** * 查询所有商品 * @return 商品列表 */ public List getAllProducts() { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; List products = new ArrayList<>(); try { conn = DBUtil.getConnection(); String sql = "SELECT * FROM PRODUCT ORDER BY PRODUCT_ID"; pstmt = conn.prepareStatement(sql); rs = pstmt.executeQuery(); while (rs.next()) { Product product = new Product(); product.setProductId(rs.getLong("PRODUCT_ID")); product.setProductName(rs.getString("PRODUCT_NAME")); product.setPrice(rs.getDouble("PRICE")); product.setQuantity(rs.getInt("QUANTITY")); product.setCategory(rs.getString("CATEGORY")); product.setDescription(rs.getString("DESCRIPTION")); product.setCreateTime(rs.getDate("CREATE_TIME")); product.setUpdateTime(rs.getDate("UPDATE_TIME")); products.add(product); } logger.info("查询所有商品成功,共{}条记录", products.size()); return products; } catch (SQLException e) { logger.error("查询所有商品失败", e); return products; } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { logger.error("关闭ResultSet失败", e); } } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { logger.error("关闭PreparedStatement失败", e); } } DBUtil.closeConnection(conn); } } // 其他CRUD方法(更新、删除、根据ID查询)的实现类似,此处省略 } ``` **解释**: - 实现了商品的添加和查询所有商品功能 - 使用PreparedStatement防止SQL注入 - 处理数据库连接的获取和关闭 - 使用日志记录DAO操作 ### 4.5 步骤5:实现服务层 #### 4.5.1 ProductService.java(商品服务类) **目标**:实现商品的业务逻辑,调用DAO层完成数据操作 **代码实现**: ```java package com.example.productmanager.service; import com.example.productmanager.dao.ProductDAO; import com.example.productmanager.model.Product; import com.example.productmanager.util.LogUtil; import org.apache.logging.log4j.Logger; import java.util.List; /** * 商品服务类 * 实现商品的业务逻辑 */ public class ProductService { // 日志记录器 private static final Logger logger = LogUtil.getLogger(ProductService.class); // 商品DAO实例 private ProductDAO productDAO = new ProductDAO(); /** * 添加商品 * @param product 商品对象 * @return 添加成功返回true,否则返回false */ public boolean addProduct(Product product) { logger.info("开始添加商品:{}", product.getProductName()); boolean result = productDAO.addProduct(product); if (result) { logger.info("商品添加成功:{}", product.getProductName()); } else { logger.error("商品添加失败:{}", product.getProductName()); } return result; } /** * 查询所有商品 * @return 商品列表 */ public List getAllProducts() { logger.info("开始查询所有商品"); List products = productDAO.getAllProducts(); logger.info("查询所有商品完成,共{}条记录", products.size()); return products; } // 其他业务方法(更新、删除、根据ID查询)的实现类似,此处省略 } ``` **解释**: - 调用ProductDAO完成数据操作 - 实现业务逻辑,如参数校验、日志记录等 - 提供面向UI层的服务接口 ### 4.6 步骤6:实现UI层 #### 4.6.1 MainFrame.java(主窗口) **目标**:创建系统的主窗口,包含菜单、工具栏和内容面板 **代码实现**: ```java package com.example.productmanager.ui; import com.example.productmanager.util.LogUtil; import org.apache.logging.log4j.Logger; import javax.swing.*; import java.awt.*; /** * 主窗口类 * 系统的主界面 */ public class MainFrame extends JFrame { // 日志记录器 private static final Logger logger = LogUtil.getLogger(MainFrame.class); // 商品管理面板 private ProductPanel productPanel; /** * 构造方法 */ public MainFrame() { super("商品管理系统"); initComponents(); logger.info("主窗口初始化完成"); } /** * 初始化组件 */ private void initComponents() { // 设置窗口大小 setSize(1000, 700); // 设置窗口居中显示 setLocationRelativeTo(null); // 设置窗口关闭操作 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建菜单栏 JMenuBar menuBar = new JMenuBar(); // 创建商品菜单 JMenu productMenu = new JMenu("商品管理"); JMenuItem addProductItem = new JMenuItem("添加商品"); JMenuItem manageProductItem = new JMenuItem("管理商品"); productMenu.add(addProductItem); productMenu.add(manageProductItem); // 创建购物车菜单 JMenu cartMenu = new JMenu("购物车"); JMenuItem viewCartItem = new JMenuItem("查看购物车"); cartMenu.add(viewCartItem); // 添加菜单到菜单栏 menuBar.add(productMenu); menuBar.add(cartMenu); // 设置菜单栏 setJMenuBar(menuBar); // 创建工具栏 JToolBar toolBar = new JToolBar(); JButton addProductBtn = new JButton("添加商品"); JButton refreshBtn = new JButton("刷新"); toolBar.add(addProductBtn); toolBar.add(refreshBtn); // 添加工具栏到窗口 add(toolBar, BorderLayout.NORTH); // 创建商品管理面板 productPanel = new ProductPanel(); // 创建滚动面板 JScrollPane scrollPane = new JScrollPane(productPanel); // 添加滚动面板到窗口 add(scrollPane, BorderLayout.CENTER); // 添加事件监听器 addProductItem.addActionListener(e -> showAddProductDialog()); addProductBtn.addActionListener(e -> showAddProductDialog()); refreshBtn.addActionListener(e -> refreshProductList()); } /** * 显示添加商品对话框 */ private void showAddProductDialog() { AddProductDialog dialog = new AddProductDialog(this, true); dialog.setVisible(true); refreshProductList(); } /** * 刷新商品列表 */ private void refreshProductList() { productPanel.refreshProductList(); } } ``` **解释**: - 创建了主窗口,包含菜单栏、工具栏和内容面板 - 初始化了商品管理面板 - 添加了菜单和按钮的事件监听器 - 实现了显示添加商品对话框和刷新商品列表的方法 ### 4.7 步骤7:实现主入口类 #### 4.7.1 Main.java **目标**:系统的主入口,启动应用程序 **代码实现**: ```java package com.example.productmanager; import com.example.productmanager.ui.MainFrame; import com.example.productmanager.util.LogUtil; import org.apache.logging.log4j.Logger; import javax.swing.SwingUtilities; /** * 主入口类 * 系统的启动类 */ public class Main { // 日志记录器 private static final Logger logger = LogUtil.getLogger(Main.class); /** * 主方法 * @param args 命令行参数 */ public static void main(String[] args) { logger.info("商品管理系统启动"); // 使用SwingUtilities.invokeLater确保UI组件在事件调度线程中创建 SwingUtilities.invokeLater(() -> { MainFrame mainFrame = new MainFrame(); mainFrame.setVisible(true); logger.info("主窗口显示成功"); }); } } ``` **解释**: - 系统的主入口方法 - 使用SwingUtilities.invokeLater确保UI组件在事件调度线程中创建 - 启动主窗口 - 记录系统启动日志 ## 5. 开发文档生成 ### 5.1 代码注释规范 1. **类注释**:使用Javadoc格式,包含类的描述、作者、版本等信息 2. **方法注释**:使用Javadoc格式,包含方法的功能、参数、返回值、异常等信息 3. **属性注释**:使用单行注释,描述属性的用途 4. **代码块注释**:对复杂的代码块添加注释,解释实现逻辑 ### 5.2 开发步骤文档 1. **项目概述**:项目背景、功能需求、技术选型 2. **环境搭建**:JDK、IDE、数据库配置 3. **详细开发步骤**: - 每个步骤的目标 - 实现代码(带详细注释) - 代码解释和说明 - 截图(如果适用) 4. **测试和运行**:测试方法、运行步骤 5. **部署说明**:本地部署、Docker部署 6. **扩展功能**:如何扩展系统功能 ### 5.3 教学使用建议 1. **分阶段教学**:按照开发步骤逐步讲解,每个阶段完成后进行测试 2. **重点讲解**: - JavaSwing UI设计 - 数据库连接和操作 - 分层架构设计 - 第三方API集成 3. **实践练习**: - 让学生完成缺失的功能(如更新、删除商品) - 让学生扩展新功能(如用户管理、权限控制) 4. **项目实战**:让学生基于此项目进行二次开发,实现自己的需求 ## 6. 测试和运行 ### 6.1 编译和运行 1. **编译命令**: ``` javac -cp "src/main/java;lib/*" -d out src/main/java/com/example/productmanager/Main.java ``` 2. **运行命令**: ``` java -cp "out;lib/*;src/main/resources" com.example.productmanager.Main ``` 3. **IDE运行**:直接在IDE中运行Main.java类 ### 6.2 功能测试 1. **商品管理**:测试添加、查询、更新、删除商品 2. **购物车**:测试添加商品到购物车、修改数量、删除商品、结算 3. **订单管理**:测试生成订单、支付订单、查看订单详情 4. **地址管理**:测试添加地址、省市区三级联动、地图定位 5. **支付功能**:测试支付宝沙箱支付 6. **数据可视化**:测试商品分类统计图表、地图展示 ## 7. Docker部署Oracle(可选) ### 7.1 docker-compose.yml ```yaml version: '3.8' services: oracle: image: "gvenzl/oracle-xe:11" container_name: oracle-xe environment: - ORACLE_PASSWORD=tiger - APP_USER=scott - APP_USER_PASSWORD=tiger ports: - "1521:1521" - "5500:5500" volumes: - oracle-data:/opt/oracle/oradata restart: unless-stopped volumes: oracle-data: ``` ### 7.2 启动Oracle容器 ```bash docker-compose up -d ``` ### 7.3 初始化数据库 ```bash docker exec -i oracle-xe sqlplus scott/tiger@XE < scripts/create_tables.sql docker exec -i oracle-xe sqlplus scott/tiger@XE < scripts/insert_sample_data.sql ``` ## 8. 总结 本项目是一个功能完整的JavaSwing商品管理系统,包含了商品管理、购物车、订单管理、地址管理、支付功能和数据可视化等模块。系统采用分层架构设计,使用了Oracle数据库、Log4j 2、Jackson、Apache HttpClient等技术,集成了支付宝沙箱支付和前端技术进行数据可视化展示。 本项目适合作为Java教学案例,涵盖了Java GUI编程、数据库操作、HTTP请求处理、第三方API集成等多个知识点。通过详细的开发步骤文档,学生可以逐步学习和实践,掌握Java企业级应用开发的基本技能。