From d98573b7772d8418d852876eab383131d801d19d Mon Sep 17 00:00:00 2001 From: lu <2066448475@qq.com> Date: Thu, 25 Sep 2025 17:08:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BA=93=E5=AD=98=E5=88=97=E8=A1=A8=E7=AD=9B?= =?UTF-8?q?=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/黑笔1758714930111.jpg | Bin 5846 -> 0 bytes .../com/example/SalesProductManagement.java | 1 - .../com/example/StockProductManagement.java | 235 ++++++------------ 3 files changed, 71 insertions(+), 165 deletions(-) delete mode 100644 images/黑笔1758714930111.jpg diff --git a/images/黑笔1758714930111.jpg b/images/黑笔1758714930111.jpg deleted file mode 100644 index 01a44d78d67d35afd238a4520fd6800e6579cf49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5846 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 H{~G@X+Rj7u diff --git a/src/main/java/com/example/SalesProductManagement.java b/src/main/java/com/example/SalesProductManagement.java index 4885783..1c65cde 100644 --- a/src/main/java/com/example/SalesProductManagement.java +++ b/src/main/java/com/example/SalesProductManagement.java @@ -2,7 +2,6 @@ package com.example; import javax.swing.*; import javax.swing.event.TableModelEvent; -import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; diff --git a/src/main/java/com/example/StockProductManagement.java b/src/main/java/com/example/StockProductManagement.java index 16aa889..080c48d 100644 --- a/src/main/java/com/example/StockProductManagement.java +++ b/src/main/java/com/example/StockProductManagement.java @@ -5,48 +5,55 @@ import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellRenderer; import java.awt.*; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; import java.sql.ResultSet; +import java.util.HashSet; +import java.util.Set; -public class StockProductManagement extends JFrame implements java.awt.event.ActionListener { +public class StockProductManagement extends JFrame { - JMenuBar menuBar; - JMenuItem menuItemAdd, menuItemDelete; private JTable table; private DefaultTableModel tableModel; - private String selectedImagePath = null; + private JTextField searchField; + private JComboBox categoryComboBox; + private JButton resetButton; // 新增:重置按钮 public StockProductManagement() { super("库存商品信息管理"); - menuBar = new JMenuBar(); - setJMenuBar(menuBar); - menuItemAdd = new JMenuItem("添加商品"); - menuItemDelete = new JMenuItem("删除商品"); - menuBar.add(menuItemAdd); - menuBar.add(menuItemDelete); - - menuItemAdd.addActionListener(this); - menuItemDelete.addActionListener(this); - - setSize(800, 500); + setSize(900, 550); setLocationRelativeTo(null); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - // 表头增加“商品类别”列 + // === 顶部工具面板 === + JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + + topPanel.add(new JLabel("搜索商品名称:")); + searchField = new JTextField(15); + topPanel.add(searchField); + + JButton searchButton = new JButton("搜索"); + topPanel.add(searchButton); + + topPanel.add(new JLabel("筛选类别:")); + categoryComboBox = new JComboBox<>(); + categoryComboBox.addItem("全部"); // 初始 + topPanel.add(categoryComboBox); + + resetButton = new JButton("重置"); // 新增 + topPanel.add(resetButton); + + add(topPanel, BorderLayout.NORTH); + + // === 表格 === String[] columnNames = {"商品照片","商品名称","商品类别","商品数量","进货单价","销售单价","单个利润","销售数量"}; tableModel = new DefaultTableModel(columnNames, 0){ @Override public boolean isCellEditable(int row, int column) { return column == 7; // 只有销售数量可编辑 } - @Override public Class getColumnClass(int column) { - if(column == 0) return Icon.class; // 图片列 + if(column == 0) return Icon.class; return super.getColumnClass(column); } }; @@ -64,11 +71,11 @@ public class StockProductManagement extends JFrame implements java.awt.event.Act } }); - // 销售数量编辑事件 + // 销售数量更新 table.getModel().addTableModelListener(e -> { int row = e.getFirstRow(); int column = e.getColumn(); - if(column == 7) { // 销售数量列 + if(column == 7) { String name = (String)tableModel.getValueAt(row, 1); Object value = tableModel.getValueAt(row, column); if(value != null && !value.toString().trim().isEmpty()) { @@ -87,154 +94,40 @@ public class StockProductManagement extends JFrame implements java.awt.event.Act JScrollPane scrollPane = new JScrollPane(table); add(scrollPane, BorderLayout.CENTER); - loadData(); + // === 事件绑定 === + searchButton.addActionListener(ev -> reloadData()); + categoryComboBox.addActionListener(ev -> reloadData()); + resetButton.addActionListener(ev -> { // 重置功能 + searchField.setText(""); + categoryComboBox.setSelectedItem("全部"); + reloadData(); + }); + + reloadData(); // 初次加载 setVisible(true); } - @Override - public void actionPerformed(java.awt.event.ActionEvent e) { - if(e.getSource() == menuItemAdd){ - showAddProductWindow(); - } else if(e.getSource() == menuItemDelete){ - deleteSelectedProduct(); - } - } + /** + * 按条件加载数据 + */ + private void reloadData(){ + String keyword = searchField.getText().trim(); + String category = (String) categoryComboBox.getSelectedItem(); - private void showAddProductWindow(){ - JFrame frame = new JFrame("添加商品"); - frame.setLayout(new GridLayout(7,2)); - - JLabel nameLabel = new JLabel("商品名称:"); - JTextField nameField = new JTextField(); - JLabel countLabel = new JLabel("商品数量:"); - JTextField countField = new JTextField(); - JLabel purchasePriceLabel = new JLabel("进货单价:"); - JTextField purchasePriceField = new JTextField(); - JLabel sellingPriceLabel = new JLabel("销售单价:"); - JTextField sellingPriceField = new JTextField(); - - JLabel typeLabel = new JLabel("商品类别:"); - String[] categories = {"食品","生活用品","娱乐物品","学习物品","其他物品"}; - JComboBox typeComboBox = new JComboBox<>(categories); - - JLabel imageLabel = new JLabel("商品图片:"); - JButton chooseImageButton = new JButton("选择图片"); - - JButton addButton = new JButton("添加"); - JButton cancelButton = new JButton("取消"); - - frame.add(nameLabel); frame.add(nameField); - frame.add(countLabel); frame.add(countField); - frame.add(purchasePriceLabel); frame.add(purchasePriceField); - frame.add(sellingPriceLabel); frame.add(sellingPriceField); - frame.add(typeLabel); frame.add(typeComboBox); - frame.add(imageLabel); frame.add(chooseImageButton); - frame.add(addButton); frame.add(cancelButton); - - chooseImageButton.addActionListener(ev -> { - JFileChooser fileChooser = new JFileChooser(); - fileChooser.setDialogTitle("选择商品图片"); - fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); - int result = fileChooser.showOpenDialog(frame); - if(result == JFileChooser.APPROVE_OPTION){ - File selectedFile = fileChooser.getSelectedFile(); - selectedImagePath = selectedFile.getAbsolutePath(); - JOptionPane.showMessageDialog(frame, "已选择图片: " + selectedFile.getName()); - } - }); - - addButton.addActionListener(ev -> { - String name = nameField.getText(); - int count; - double purchasePrice, sellingPrice; - String type = (String) typeComboBox.getSelectedItem(); - - try { - count = Integer.parseInt(countField.getText()); - purchasePrice = Double.parseDouble(purchasePriceField.getText()); - sellingPrice = Double.parseDouble(sellingPriceField.getText()); - } catch(NumberFormatException ex){ - JOptionPane.showMessageDialog(frame, "数量和价格必须为数字"); - return; - } - - String savedImageFileName = null; - if(selectedImagePath != null){ - try{ - File imageDir = new File("images"); - if(!imageDir.exists()) imageDir.mkdir(); - String extension = selectedImagePath.substring(selectedImagePath.lastIndexOf(".")); - savedImageFileName = name + System.currentTimeMillis() + extension; - Path targetPath = Paths.get("images", savedImageFileName); - Files.copy(Paths.get(selectedImagePath), targetPath, StandardCopyOption.REPLACE_EXISTING); - }catch(IOException ex){ - ex.printStackTrace(); - JOptionPane.showMessageDialog(frame, "图片保存失败: "+ex.getMessage()); - return; - } - } - - Jdbc jdbc = new Jdbc(); - try{ - String sql = "INSERT INTO commodity (name, count, purchase_price, selling_price, profit, quantity_sold, type, image_path) " + - "VALUES ('"+name+"', "+count+", "+purchasePrice+", "+sellingPrice+", "+(sellingPrice-purchasePrice)+", 0, '"+type+"', '"+(savedImageFileName!=null?savedImageFileName:"")+"')"; - jdbc.update(sql); - jdbc.close(); - loadData(); - frame.dispose(); - }catch(Exception ex){ - ex.printStackTrace(); - JOptionPane.showMessageDialog(frame, "添加商品失败: "+ex.getMessage()); - } - }); - - cancelButton.addActionListener(ev -> frame.dispose()); - - frame.setSize(450,400); - frame.setLocationRelativeTo(null); - frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); - frame.setVisible(true); - } - - private void deleteSelectedProduct() { - int selectedRow = table.getSelectedRow(); - if(selectedRow == -1){ - JOptionPane.showMessageDialog(this, "请先选中要删除的商品行"); - return; - } - - String name = (String)tableModel.getValueAt(selectedRow,1); // 商品名称 - int confirm = JOptionPane.showConfirmDialog(this,"确定删除商品 \"" + name + "\" 吗?","确认删除",JOptionPane.YES_NO_OPTION); - if(confirm != JOptionPane.YES_OPTION) return; - - // 删除数据库和图片 Jdbc jdbc = new Jdbc(); try{ - ResultSet rs = jdbc.query("SELECT image_path FROM commodity WHERE name='"+name+"'"); - String imagePath = null; - if(rs.next()) imagePath = rs.getString("image_path"); - rs.close(); - - jdbc.update("DELETE FROM commodity WHERE name='"+name+"'"); - jdbc.close(); - - if(imagePath != null && !imagePath.isEmpty()){ - File imgFile = new File("images/"+imagePath); - if(imgFile.exists()) imgFile.delete(); + StringBuilder sql = new StringBuilder("SELECT name,count,purchase_price,selling_price,profit,quantity_sold,type,image_path FROM commodity WHERE 1=1 "); + if(!keyword.isEmpty()){ + sql.append("AND name LIKE '%").append(keyword).append("%' "); + } + if(category != null && !"全部".equals(category)){ + sql.append("AND type='").append(category).append("' "); } - loadData(); - }catch(Exception ex){ - ex.printStackTrace(); - JOptionPane.showMessageDialog(this, "删除商品失败: "+ex.getMessage()); - } - } - - private void loadData(){ - Jdbc jdbc = new Jdbc(); - try{ - ResultSet rs = jdbc.query("SELECT name,count,purchase_price,selling_price,profit,quantity_sold,type,image_path FROM commodity"); + ResultSet rs = jdbc.query(sql.toString()); tableModel.setRowCount(0); + Set categories = new HashSet<>(); + while(rs.next()){ String name = rs.getString("name"); int count = rs.getInt("count"); @@ -245,6 +138,8 @@ public class StockProductManagement extends JFrame implements java.awt.event.Act String type = rs.getString("type"); String imagePath = rs.getString("image_path"); + categories.add(type); + ImageIcon icon = null; if(imagePath!=null && !imagePath.isEmpty()){ File imgFile = new File("images/"+imagePath); @@ -259,6 +154,18 @@ public class StockProductManagement extends JFrame implements java.awt.event.Act } rs.close(); jdbc.close(); + + // 更新类别下拉框 + String selected = (String) categoryComboBox.getSelectedItem(); + categoryComboBox.removeAllItems(); + categoryComboBox.addItem("全部"); + for(String c : categories){ + categoryComboBox.addItem(c); + } + if(selected != null && !selected.isEmpty()){ + categoryComboBox.setSelectedItem(selected); + } + }catch(Exception e){ e.printStackTrace(); JOptionPane.showMessageDialog(this,"加载数据失败: "+e.getMessage());