热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

做这个系统是为了加强对前面学习的设计模式的应用,该系统运用了MVC开发模式,工厂模式,值对象,单例等设计模式,

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

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

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

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


项目功能需求:

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


项目基本设计:


        架构设计:

                    整体框架、模块划分

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


        系统功能结构设计:

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


        数据库设计

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


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


数据库详细设计:


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


用户管理(user.info)


2.图书


图书管理(book.info)


3.进货单


进货管理(inMain.info)


4.进货明细


进货明细管理(inDetail.info)


5.销售单


销售管理(outMain.info)


6.销售明细


销售明细管理(outDetail.info)


7.库存


库存管理(stock.info)


项目分包:


以in模块为例:


包:


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

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:447441478@qq.com* 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)中


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

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:447441478@qq.com* @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;//注入inMainEbiInMainEbi 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() {@Overridepublic 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


注意

该项目没有使用到数据库,使用的是对象流进行数据的存储,所以data目录下的xxx.info文件中的数据都是乱码

有兴趣的小伙伴可以改dao包下持久化数据的接口,改为存储到数据库即可。

 


推荐阅读
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 从Oracle安全移植到国产达梦数据库的DBA实践与攻略
    随着我国对信息安全和自主可控技术的重视,国产数据库在党政机关、军队和大型央企等行业中得到了快速应用。本文介绍了如何降低从Oracle到国产达梦数据库的技术门槛,保障用户现有业务系统投资。具体包括分析待移植系统、确定移植对象、数据迁移、PL/SQL移植、校验移植结果以及应用系统的测试和优化等步骤。同时提供了移植攻略,包括待移植系统分析和准备移植环境的方法。通过本文的实践与攻略,DBA可以更好地完成Oracle安全移植到国产达梦数据库的工作。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
author-avatar
Fate丶灬小庆_926
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有