一、系统描述
某电商平台需要管理平台的商品信息及销售信息,需要开发一套软件系统实现管理工作。
- 实现商品的基本管理。要求同一种商品能够由多家供货商供货,商品类别要分级,商品的规格能够自行定义,同类商品有相同的规格。能实现对商品品牌、商品供应商、商品分类、商品规格和商品基本信息的添加、删除和修改。能根据相关的查询条件完成商品品牌、商品供应商、商品分类和商品基本信息的查询。能根据商品品牌、商品供应商和商品分类进行统计。
- 实现商品销售管理。客户能根据需求线上下订单,包含选择商品、订购数量等。能根据相关条件查询订单详细信息及做订单的相关统计。
二、模型建立
逻辑模型设计
三、界面设计
-
登录界面
-
管理界面
四、系统实现
-
系统结构
在本次“商品信息管理系统”系统设计中,我主要使用集合的存储结构来存储数据
-
系统主要代码
管理主界面
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设计部分的时间较短,管理界面缺乏美观性,用户使用体验较差,需要在改进过程中多加打磨。