商品管理系统(C/S结构)——数据库&Java

一、系统描述

某电商平台需要管理平台的商品信息及销售信息,需要开发一套软件系统实现管理工作。

  1. 实现商品的基本管理。要求同一种商品能够由多家供货商供货,商品类别要分级,商品的规格能够自行定义,同类商品有相同的规格。能实现对商品品牌、商品供应商、商品分类、商品规格和商品基本信息的添加、删除和修改。能根据相关的查询条件完成商品品牌、商品供应商、商品分类和商品基本信息的查询。能根据商品品牌、商品供应商和商品分类进行统计。
  2. 实现商品销售管理。客户能根据需求线上下订单,包含选择商品、订购数量等。能根据相关条件查询订单详细信息及做订单的相关统计。

二、模型建立

逻辑模型设计
在这里插入图片描述

三、界面设计

  1. 登录界面
    在这里插入图片描述

  2. 管理界面
    在这里插入图片描述

四、系统实现

  1. 系统结构
    在本次“商品信息管理系统”系统设计中,我主要使用集合的存储结构来存储数据
    在这里插入图片描述

  2. 系统主要代码
    管理主界面

 package view;

import controller.*;
import util.GUIUtil;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public abstract class Admin extends JFrame{
    public JToolBar toolBar=new JToolBar();
    JButton adminBtn=new JButton();
    JButton supplyBtn=new JButton();
    JButton goodsBtn=new JButton();
    JButton billBtn=new JButton();
    JButton kehuBtn=new JButton();

    private JLabel tableName=new JLabel("品牌列表");

    public JScrollPane tablePane=new JScrollPane();
    public JTable table=new JTable();

    private JLabel brandNoLabel=new JLabel("品牌编号");
    private JLabel brandNameLabel=new JLabel("品牌名称");
    private JLabel brandURLLabel=new JLabel("品牌网址");
    private JLabel brandPictureLabel=new JLabel("品牌图片");

    public JTextField addbrandNoText=new JTextField(6);
    public JTextField addbrandNameText=new JTextField(6);
    public JTextField addbrandURLText=new JTextField(6);
    public JTextField addbrandPictureText=new JTextField(6);
    private JButton addBtn=new JButton("新增品牌");

    public JTextField updatebrandNoText=new JTextField(6);
    public JTextField updatebrandNameText=new JTextField(6);
    public JTextField updatebrandURLText=new JTextField(6);
    public JTextField updatebrandPictureText=new JTextField(6);
    private JButton updateBtn=new JButton("修改品牌");

    public JTextField delIdText=new JTextField(6);
    private JButton delBtn=new JButton("删除品牌");


    public Admin() {
        this.init();
        this.addComponent();
        this.addListener();
    }

    // 初始化窗口
    private void init() {
        this.setTitle("商品信息管理系统--品牌管理");

        Toolkit toolkit=Toolkit.getDefaultToolkit();
        Image icon = toolkit.getImage("img/titleIcon.JPG");
        this.setIconImage(icon);

        this.setSize(600,450);
        // 设置窗口大小不可变
        this.setResizable(false);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    }

    // 为窗口添加组件
    private void addComponent() {
       //通过GUIUtil类的setImageIcon()方法来设置图片按钮,并传入按钮对象,图片名和鼠标停留的提示信息
        GUIUtil.setImageIcon(adminBtn,"img/brand.jpg","品牌管理");
        GUIUtil.setImageIcon(supplyBtn,"img/supply.jpg","供应商管理");
        GUIUtil.setImageIcon(goodsBtn,"img/goods.jpg","商品管理");
        GUIUtil.setImageIcon(billBtn,"img/dingdan.jpg","订单管理");
        GUIUtil.setImageIcon(kehuBtn,"img/kehu.png","客户管理");
        //将按钮添加到工具栏
        toolBar.add(adminBtn);
        toolBar.add(supplyBtn);
        toolBar.add(goodsBtn);
        toolBar.add(billBtn);
        toolBar.add(kehuBtn);
        toolBar.setBounds(20,0,560,65);
        this.add(toolBar, BorderLayout.NORTH);
        //设置工具栏是否可以移动
        toolBar.setFloatable(true);

        this.setLayout(null);

        tableName.setBounds(250,80,100,25);
        // 设置字体样式
        tableName.setFont(new Font("华文隶书", Font.PLAIN, 23));
        tableName.setForeground(Color.BLACK.brighter());
        this.add(tableName);
        //设置用户是否可以拖动列头
        table.getTableHeader().setReorderingAllowed(false);
        //设置用户是否可以通过拖动调整列头大小
        table.getTableHeader().setResizingAllowed(false);
        //设置表格不可编辑
        table.setEnabled(false);
        // 使用setBounds()设置组件位置,但使用之前必须setLayout(null)清空布局管理器

        tablePane.setBounds(50,110,500,170);
        tablePane.setViewportView(table);
        this.add(tablePane);

        brandNoLabel.setBounds(50,290,70,25);
        brandNameLabel.setBounds(150,290,70,25);
        brandURLLabel.setBounds(250,290,70,25);
        brandPictureLabel.setBounds(350,290,70,25);
        brandNoLabel.setFont(new Font("隶书", Font.PLAIN, 17));
        brandNameLabel.setFont(new Font("隶书", Font.PLAIN, 17));
        brandURLLabel.setFont(new Font("隶书", Font.PLAIN, 17));
        brandPictureLabel.setFont(new Font("隶书", Font.PLAIN, 17));
        this.add(brandNoLabel);
        this.add(brandNameLabel);
        this.add(brandURLLabel);
        this.add(brandPictureLabel);


        addbrandNoText.setBounds(50,320,80,25);
        addbrandNameText.setBounds(150,320,80,25);
        addbrandURLText.setBounds(250,320,80,25);
        addbrandPictureText.setBounds(350,320,80,25);
        addBtn.setBounds(450,320,100,25);
        this.add(addbrandNoText);
        this.add(addbrandNameText);
        this.add(addbrandURLText);
        this.add(addbrandPictureText);
        addBtn.setBackground(Color.lightGray);
        addBtn.setFont(new Font("隶书", Font.PLAIN, 16));
        this.add(addBtn);


        updatebrandNoText.setBounds(50,350,80,25);
        updatebrandNameText.setBounds(150,350,80,25);
        updatebrandURLText.setBounds(250,350,80,25);
        updatebrandPictureText.setBounds(350,350,80,25);
        updateBtn.setBounds(450,350,100,25);
        this.add(updatebrandNoText);
        this.add(updatebrandNameText);
        this.add(updatebrandURLText);
        this.add(updatebrandPictureText);
        updateBtn.setBackground(Color.lightGray);
        updateBtn.setFont(new Font("隶书", Font.PLAIN, 16));
        this.add(updateBtn);


        delIdText.setBounds(50,380,80,25);
        delBtn.setBounds(450,380,100,25);
        this.add(delIdText);
        delBtn.setBackground(Color.lightGray);
        delBtn.setFont(new Font("隶书", Font.PLAIN, 16));
        this.add(delBtn);
        //为导航栏按钮添加监听器,实现导航功能
        supplyBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });

    }

    // 为按钮添加监听器
    private void addListener(){
        adminBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showBrandMa();
                dispose();
            }
        });
        supplyBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                showSupplyMa();
                dispose();

            }
        });
        goodsBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showGoodsMa();
                dispose();
            }
        });
        billBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showOrderMa();
                dispose();

            }
        });
        kehuBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                showClientMa();
                dispose();
            }
        });

        addBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                addBrand();

            }
        });
        updateBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                updateBrand();
            }
        });
        delBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                deleteBrand();
            }
        });
    }
    public void showSupplyMa(){
      new SupplyController().setVisible(true);
    }
    public void showGoodsMa(){
        new GoodsController().setVisible(true);
    }
    public void showOrderMa(){
        new OrdersController().setVisible(true);
    }
    public void showClientMa(){
        new ClientController().setVisible(true);
    }
    public void showDetailstMa(){
        new DetalisController().setVisible(true);
    }
    public void showBrandMa(){
        new BrandController().setVisible(true);
    }


    //查询方法
    public abstract void queryAll();

    //添加方法
    public abstract void addBrand();

    //修改方法
    public abstract void updateBrand();

    //删除方法
    public abstract void deleteBrand();

}

实体类

package entiry;

public class Brand {
    private String brandNo;

    public Brand(String brandNo, String brandName, String brandURL, String brandPicture) {
        this.brandNo = brandNo;
        this.brandName = brandName;
        this.brandURL = brandURL;
        this.brandPicture = brandPicture;
    }

    private String brandName;
    private String brandURL;
    private String brandPicture;
    public Brand(){

    }


    public String getBrandNo() {
        return brandNo;
    }

    public void setBrandNo(String brandNo) {
        this.brandNo = brandNo;
    }

    public String getBrandName() {
        return brandName;
    }

    public void setBrandName(String brandName) {
        this.brandName = brandName;
    }

    public String getBrandURL() {
        return brandURL;
    }

    public void setBrandURL(String brandURL) {
        this.brandURL = brandURL;
    }

    public String getBrandPicture() {
        return brandPicture;
    }

    public void setBrandPicture(String brandPicture) {
        this.brandPicture = brandPicture;
    }


}

控制层controller

package controller;

import entiry.Brand;
import service.BrandService;

import view.Admin;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import java.util.ArrayList;

/**
 * BrandkController表示层
 *
 * 对数据库的访问通过业务逻辑层的方法调用来实现
 */
public class BrandController extends Admin {

    // 创建BrandService实例化对象
    private BrandService brandService=new BrandService();

    public BrandController() {
        queryAll();
    }

    // 将查询的数据转换成二维数组的格式,作为表格中表体的内容
    private String[][] list2Array(ArrayList<Brand> list){
        String[][] body=new String[list.size()][4];
        for(int i=0;i<list.size();i++){
            Brand brand=list.get(i);
            body[i][0]=brand.getBrandNo();
            body[i][1]=brand.getBrandName();
            body[i][2]=brand.getBrandURL();
            body[i][3]=brand.getBrandPicture();
        }
        return body;
    }

    @Override
    public void queryAll() {
        String[] head={"品牌编号","品牌名称","品牌网址","品牌图片"};
        // 将queryAll()方法返回的数据封装到集合中
        ArrayList<Brand> list=brandService.queryAll();
        // 定义一个String类型的二维数组存储list2Array()方法返回的二维数组,这个二位数组就是表格的表体内容
        String[][] body=list2Array(list);
        TableModel tableModel=new DefaultTableModel(body,head);
        table.setModel(tableModel);
    }

    @Override
    public void addBrand() {
        String brandNo=addbrandNoText.getText();
        String brandName=addbrandNameText.getText();
        String brandURL=addbrandURLText.getText();
        String brandPicture=addbrandPictureText.getText();
        boolean addSuccess=brandService.addBook(brandNo,brandName,brandURL,brandPicture);
        if(addSuccess){
            queryAll();
        }else{
            JOptionPane.showMessageDialog(this,"该品牌已存在!");
        }
    }

    @Override
    public void updateBrand() {
        String brandNo=updatebrandNoText.getText();
        String brandName=updatebrandNameText.getText();
        String brandURL=updatebrandURLText.getText();
        String brandPicture=updatebrandPictureText.getText();
        boolean updateSuccess=brandService.updateBook(brandNo,brandName,brandURL,brandPicture);
        if(updateSuccess){
            queryAll();
        }else{
            JOptionPane.showMessageDialog(this,"该品牌不存在!");
        }
    }

    @Override
    public void deleteBrand() {
        String id=delIdText.getText();
        boolean deleteSuccess=brandService.deleteBook(id);
        if(deleteSuccess){
            queryAll();
        }else{
            JOptionPane.showMessageDialog(this,"该品牌不存在!");
        }
    }


}

dao层

package dao;

import entiry.Brand;

import java.sql.*;
import java.util.ArrayList;

public class BrandDao {
    /**
     * queryAll()方法
     * 查询所有品牌信息,返回一个集合
     * @return
     */
    public ArrayList<Brand> queryAll(){
        Connection conn=null;
        Statement stmt=null;
        ResultSet rs=null;
        ArrayList<Brand> list=new ArrayList<>();
        try{
            conn=DBUtil.getConnection();
            stmt=conn.createStatement();
            String sql="select*from brand order by brandNo";
            rs=stmt.executeQuery(sql);
            while(rs.next()){
                Brand brand=new Brand();
                // 将获取结果集的信息封装到Book实体类中
                brand.setBrandNo(rs.getString("brandNo"));
                brand.setBrandName(rs.getString("brandName"));
                brand.setBrandURL(rs.getString("brandURL"));
                brand.setBrandPicture(rs.getString("brandPicture"));

                // 将实体类中的信息封装到集合中
                list.add(brand);
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(rs,stmt,conn);
        }
        return list;
    }

    /**
     * addBrand()方法
     * 以实体Brand作为参数类型,实参封装了装备添加到数据库中的图书信息
     *
     * 使用PreparedStatement对象执行插入操作,防止SQL语句注入
     * @return
     */
    public void addBrand(Brand brand){
        Connection conn=null;
        PreparedStatement prestmt=null;
        try{
            conn=DBUtil.getConnection();
            String sql="insert into brand(brandNo,brandName,brandURL,brandPicture)values(?,?,?,?)";
            prestmt=conn.prepareStatement(sql);
            prestmt.setString(1,brand.getBrandNo());
            prestmt.setString(2,brand.getBrandName());
            prestmt.setString(3,brand.getBrandURL());
            prestmt.setString(4,brand.getBrandPicture());
            int num=prestmt.executeUpdate();
            if(num>0){
                System.out.println("插入数据成功!");
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(prestmt,conn);
        }
    }

    /**
     * deleteBrand方法
     * 删除记录deleteBrand()方法中的形参类型为String类型的bandNo,也可改为实体类Brand作为形参类型
     *
     * 使用PreparedStatement对象执行删除操作,防止SQL语句注入
     * @return
     */
    public void deleteBrand(String brandNo){
        Connection conn=null;
        PreparedStatement prestmt=null;
        try{
            conn=DBUtil.getConnection();
            String sql="delete from brand where brandNo=?";
            prestmt=conn.prepareStatement(sql);
            prestmt.setString(1,brandNo);
            int num=prestmt.executeUpdate();
            if(num>0){
                System.out.println("删除数据成功!");
            }
        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(prestmt,conn);
        }
    }
}

Service业务逻辑层

package service;

import dao.BrandDao;
import entiry.Brand;

import java.util.ArrayList;

/**
 * Service业务逻辑层
 *
 * 主要是调用Dao数据访问层的基本数据操作来完成业务逻辑处理
 */
public class BrandService {

    // 创建AdminDao实例化对象
    private BrandDao brandDao=new BrandDao();

    // 实现查询逻辑处理
    public ArrayList<Brand> queryAll(){
        ArrayList data=brandDao.queryAll();
        return data;
    }

    // 实现添加逻辑处理
    public boolean addBook(String brandNo, String brandName, String brandURL, String brandPicture){
        // 遍历数据,判断要插入的水果编号是否存在
        ArrayList<Brand> data=queryAll();
        for(int i=0;i<data.size();i++){
            Brand brand=data.get(i);
            if(brandNo.equals(brand.getBrandNo())){
                return false;
            }
        }
        Brand thisbook=new Brand(brandNo,brandName,brandURL,brandPicture);
        brandDao.addBrand(thisbook);
        return true;
    }

    /**
     * BrandDao中没有定义修改操作的方法,我们这个小项目中不是通过执行修改SQL语句来实现数据修改的,
     * 而是通过删除要修改的数据后,再添加新的数据的方式来实现数据修改的
     * @return
     */
    public boolean updateBook(String brandNo, String brandName, String brandURL, String brandPicture) {
        // 遍历数据,判断要插入的编号是否存在
        ArrayList<Brand> data=queryAll();
        for(int i=0;i<data.size();i++){
            Brand brand=data.get(i);
            System.out.println(brand.getBrandNo());
            System.out.println(brand.getBrandNo().getClass());
            System.out.println(brandNo);
            System.out.println(brandNo.equals(brand.getBrandNo()));
            if(brandNo.equals(brand.getBrandNo())){
                // 如果存在则删除
                brandDao.deleteBrand(brandNo);
                // 添加修改内容作为新的内容
                Brand thisbrand=new Brand(brandNo,brandName,brandURL,brandPicture);
                brandDao.addBrand(thisbrand);
                /**
                 * 这里不要使用BrandService类中的deleteBrand()和addBrand()方法来删除添加图书,
                 * 因为这两个方法都要遍历一次数据,如果数据量很大的话就会消耗很多时间,
                 * 所以应如上面三行代码这样,直接调用BookDao类中的方法来实现图书的删除添加
                 */

                return true;
            }
        }
        return false;
    }

    public boolean deleteBook(String brandNo) {
        // 遍历数据,判断要插入的水果编号是否存在
        ArrayList<Brand> data=queryAll();
        for(int i=0;i<data.size();i++){
            Brand brand=data.get(i);
            if(brandNo.equals(brand.getBrandNo())){
                brandDao.deleteBrand(brandNo);
                return true;
            }
        }
        return false;
    }

}

五、系统改进分析

5.1 用户权限

在对用户登录权限上本次系统设计未将管理员与用户的权限分开,这与实际应用是不匹配的,因此,在后续的系统改进工作中,我会将二者分离开来,使得用户和管理员登录后进入各自的界面,增强系统的可用性。

5.2 数据交互

本次系统的查重功能虽然较为完善,但是在数据交互方面做的较差,很多数据修改后会影响到其他数据的变化,但本次系统并未提供提示框给予用户或管理员,在该部分,此次系统的数据结构的完整性和用户使用的便捷性仍有待提高。

5.3 界面的美观性

由于自己安排系统完成的时间的不合理导致在ui设计部分的时间较短,管理界面缺乏美观性,用户使用体验较差,需要在改进过程中多加打磨。

  • 15
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值