Java---设计模式---书店管理系统(单机版)①

做这个系统是为了加强对前面学习的设计模式的应用,该系统运用了MVC开发模式,工厂模式,值对象,单例等设计模式,并且遵守一定的设计原则。

体验:做这个系统花了我快两周的课余时间,在这半个月中认识到MVC开发模式的种种好处,在大二时,做过一个类似的课设,但是和这个书店管理系统相比较发现:采用MVC开发模式看起来需要分很多层,而且严格遵守层间交互原则和面向接口原则。虽然设计起来很繁琐,但是在图书模块发生变动时,我很欣然的发现进货模块,销售模块,库存模块的影响很小,只有在接口交接处才会发生问题,改起来特别方便。对比大二做的学生信息管理系统,那时学生信息模块发生变动时,基本上这个程序都出问题了,想要改动基本上可以说是要重做,可以说是很痛苦。

        感受:设计模式,设计思想确实很强大,向前人(大牛)致敬。

话不多说,下面开始介绍书店管理系统:

项目功能需求:

1、能进行操作用户的注册,修改基本信息,删除和查询。
2、能对图书的基本信息进行增加、删除、修改和查询操作。
3、能填写进货单,一张进货单带有多条具体的进货信息,进货的书籍必须是图书管理里面已经有的;进货的同时修改库存对应书籍的存货量。
4、能填写销售单,一张销售单带有多条具体的销售信息,销售的书籍必须是图书管理里面已经有的,而且销售的数量不能超过当前库存的数量;销售的同时修改库存对应书籍的存货量。
5、可以查看库存的明细,可以按照条件进行查找具体的图书的库存值。
6、权限方面进行简化,做固定的权限控制。把用户按照模块分成不同操作权限的人员,特设一个admin的用户,可以操作全部的功能。

项目基本设计:

        架构设计:

                    整体框架、模块划分

                    模块划分:用户、图书、进货、销售和库存5个模块

        系统功能结构设计:

                    每个功能模块的具体功能子模块

        数据库设计

                    采用文件存储,加强对文件IO的认识   

        项目框架实现:分模块、分层、分包、构建应用程序

数据库详细设计:

1.用户(因为是专用于书店管理,所有没有注册功能,会有个超级管理员的信息:账号:admin 密码:123)

用户管理(user.info)

Java---设计模式---书店管理系统(单机版)①_第1张图片

2.图书

图书管理(book.info)

Java---设计模式---书店管理系统(单机版)①_第2张图片

3.进货单

进货管理(inMain.info)

Java---设计模式---书店管理系统(单机版)①_第3张图片

4.进货明细

进货明细管理(inDetail.info)

Java---设计模式---书店管理系统(单机版)①_第4张图片

5.销售单

销售管理(outMain.info)

Java---设计模式---书店管理系统(单机版)①_第5张图片

6.销售明细

销售明细管理(outDetail.info)

Java---设计模式---书店管理系统(单机版)①_第6张图片

7.库存

库存管理(stock.info)

Java---设计模式---书店管理系统(单机版)①_第7张图片

项目分包:

Java---设计模式---书店管理系统(单机版)①_第8张图片

以in模块为例:

包:

Java---设计模式---书店管理系统(单机版)①_第9张图片

Java---设计模式---书店管理系统(单机版)①_第10张图片

数据层(展现接口,具体看各个模块细分,以及源码):

package cn.hncu.booksManagementSystem.in.dao.dao;

import java.util.Collection;

import cn.hncu.booksManagementSystem.in.vo.InMainModel;
import cn.hncu.booksManagementSystem.in.vo.InMainQueryModel;

/**
 * CreateTime: 2018年4月20日 下午11:04:18	
 * @author 宋进宇  Email:[email protected]
 * Description:
 *	InMainDAO进货管理DAO
 */
public interface InMainDAO {
	/**
	 * 添加一条进货单
	 * @param inMain 进货单
	 * @return true-添加成功 ,false-添加失败
	 */
	public boolean add(InMainModel inMain);
	/**
	 * 通过进货单的id删除一条信息
	 * @param id 进货单的id
	 * @return true-删除成功 ,false-删除失败
	 */
	public boolean detelte(String id);
	/**
	 * 更新一条进货单
	 * @param inMain 进货单
	 * @return true-更新成功 ,false-更新失败
	 */
	public boolean update(InMainModel inMain);
	
	/**
	 * 通过进货单的id获得一条进货单
	 * @param id 进货单的id
	 * @return null-没有对应的进货单,否则有
	 */
	public InMainModel getInMainInfoById(String id);
	/**
	 * 获得所有进货单
	 * @return 所有进货单的集合
	 */
	public Collection getAll();
	/**
	 * 通过查询条件获取符合条件的进货单集
	 * @param idqm 查询值对象
	 * @return 符合条件的进货单的集合
	 */
	public Collection getInMainsByCondition(InMainQueryModel imqm);
	
}

具体数据存放在该项目的子文件夹(data)中

Java---设计模式---书店管理系统(单机版)①_第11张图片

逻辑层(展现接口,具体看各个模块细分,以及源码):

package cn.hncu.booksManagementSystem.in.business.ebi;

import java.util.Collection;
import java.util.List;

import cn.hncu.booksManagementSystem.in.vo.InDetailModel;
import cn.hncu.booksManagementSystem.in.vo.InDetailQueryModel;
import cn.hncu.booksManagementSystem.in.vo.InMainModel;
import cn.hncu.booksManagementSystem.in.vo.InMainQueryModel;

/**
 * CreateTime: 2018年4月23日 上午10:31:35	
 * @author 宋进宇  Email:[email protected]
 * @Description:
 *	InEbi
 */
public interface InEbi {
	/**
	 * 添加一条订单记录和多条订单明细
	 * @param inMain 一条订单记录
	 * @param details 多条订单明细
	 * @return true-成功,false-失败
	 */
	public boolean add(InMainModel inMain,List details);
	/**
	 * 通过查询值对象,筛选符合的进货单
	 * @param imqm 查询值对象1
	 * @param idqm 查询值对象2
	 * @return 进货单的集合
	 */
	public Collection getInMainsByCondition(InMainQueryModel imqm, InDetailQueryModel idqm );
}

表现层(展现接口,具体看各个模块细分,以及源码):

package cn.hncu.booksManagementSystem.in.ui;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collection;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;

import cn.hncu.booksManagementSystem.in.business.ebi.InMainEbi;
import cn.hncu.booksManagementSystem.in.business.factory.InMainEbiFactory;
import cn.hncu.booksManagementSystem.in.vo.InDetailQueryModel;
import cn.hncu.booksManagementSystem.in.vo.InMainModel;

public class ListPanel extends JPanel {
	private static final long serialVersionUID = 1L;
	
	private  JFrame mainFrame;
	private JList JList;
	public static Collection col	= null;
	public static InDetailQueryModel idqm = null;
	//注入inMainEbi
	InMainEbi inMainEbi = InMainEbiFactory.getInstanceOfInMainEbi();
	/**
	 * Create the panel.
	 */
	public ListPanel( JFrame mainFrame) {
		this.mainFrame = mainFrame;
		initContentPane();
		initJListData();
	}
	
	public ListPanel(JFrame mainFrame, Collection resCol, InDetailQueryModel idqm) {
		this.mainFrame = mainFrame;
		col = resCol;
		ListPanel.idqm = idqm;
		initContentPane();
		initJListData();
	}
	private void initJListData() {
		if (col==null) {
			JList.setListData(inMainEbi.getAll());
		}else {
			JList.setListData(col.toArray( new InMainModel[0]));
		}
	}
	
	private void initContentPane() {
		setLayout(null);
		
		JLabel label = new JLabel("进货管理");
		label.setHorizontalAlignment(SwingConstants.CENTER);
		label.setForeground(Color.RED);
		label.setFont(new Font("微软雅黑", Font.BOLD, 36));
		label.setBounds(310, 35, 145, 38);
		add(label);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(124, 103, 561, 220);
		add(scrollPane);
		
		JList = new JList();
		scrollPane.setViewportView(JList);
		JList.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount()==2) {
					InMainModel inMain = JList.getSelectedValue();
					if (inMain==null) {
						JOptionPane.showMessageDialog(mainFrame, "请选择您要查看的订单");
						return;
					}
					mainFrame.setContentPane(new DetailPanel(mainFrame, inMain,idqm));
					mainFrame.validate();
				}
			}
		});
		JList.setFont(new Font("微软雅黑", Font.PLAIN, 16));
		
		JButton btnToInPanel = new JButton("填写进货订单");
		btnToInPanel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				mainFrame.setContentPane(new InPanel(mainFrame));
				mainFrame.validate();
			}
		});
		btnToInPanel.setForeground(Color.BLUE);
		btnToInPanel.setFont(new Font("微软雅黑", Font.BOLD, 24));
		btnToInPanel.setBounds(169, 363, 190, 50);
		add(btnToInPanel);
		
		JButton btnToQueryPanel = new JButton("查询...");
		btnToQueryPanel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				mainFrame.setContentPane(new Querypanel(mainFrame));
				mainFrame.validate();
			}
		});
		btnToQueryPanel.setForeground(Color.BLUE);
		btnToQueryPanel.setFont(new Font("微软雅黑", Font.BOLD, 24));
		btnToQueryPanel.setBounds(465, 363, 128, 50);
		add(btnToQueryPanel);
		
		JLabel lblNewLabel = new JLabel("提示:");
		lblNewLabel.setForeground(Color.RED);
		lblNewLabel.setFont(new Font("微软雅黑", Font.PLAIN, 16));
		lblNewLabel.setBounds(476, 50, 61, 27);
		add(lblNewLabel);
		
		JLabel label_1 = new JLabel("双击进货单可以查看进货单明细");
		label_1.setFont(new Font("微软雅黑", Font.PLAIN, 16));
		label_1.setBounds(496, 74, 241, 27);
		add(label_1);
	}
	/**
	 * 初始化 静态属性 col和idqm
	 */
	public static void initStaticAttribute() {
		col = null;
		idqm = null;
	}
}

各个模块细分:

用户模块界面、包以及关键性代码

图书模块界面、包以及关键性代码

进货模块界面、包以及关键性代码

销售模块界面、包以及关键性代码

库存模块界面、包以及关键性代码

源码:

链接:点击打开链接 密码:rvdi


你可能感兴趣的:(2.Java,------④设计模式,Java)