Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)
介绍:
本软件系列到此,我已经全部写完了。
项目练习目标 :
1、Java应用程序基本分析
2、培养面向对象编程的基本思想
3、Java基本设计模式综合应用
4、掌握分层和接口的基本设计
5、构建合理的Java应用程序包结构
6、综合应用JSE所学习的知识
7、在应用中合理使用集合框架
8、在应用中综合使用swing的常用组件
9、基本的表现层的实现机制
10、IO流和文件的基本操作
11、培养良好的Java编程习惯
12、培养调试Java程序的能力,培养改错的能力
项目功能需求 :
1、能进行操作用户的注册,修改基本信息,删除和查询。
2、能对图书的基本信息进行增加、删除、修改和查询操作。
3、能填写进货单,一张进货单带有多条具体的进货信息,进货的书籍必须是图书管理里面已经有的;进货的同时修改库存对应书籍的存货量。
4、能填写销售单,一张销售单带有多条具体的销售信息,销售的书籍必须是图书管理里面已经有的,而且销售的数量不能超过当前库存的数量;销售的同时修改库存对应书籍的存货量。
5、可以查看库存的明细,可以按照条件进行查找具体的图书的库存值。
6、权限方面进行简化,做固定的权限控制。把用户按照模块分成不同操作权限的人员,特设一个admin的用户,可以操作全部的功能。
项目基本设计 :
★ 架构设计
整体框架、模块划分
模块划分:用户、图书、进货、销售和库存5个模块
★ 系统功能结构设计
每个功能模块的具体功能子模块
★ 数据库设计
项目框架实现:分模块、分层、分包、构建应用程序
自己的总结:
这可以说是自己的第一个项目吧。小项目。O(∩_∩)O哈哈~、
写到现在也有10多天了,自己比较享受写项目的这个过程,不过因为这个项目是跟着老师指导来做的,所以呢,自己的感触还不是很深,不过现在对分包啊,取名字啊,值对象封装啊,工厂方法,面向接口编程啊,表现层,逻辑层,数据层啊,这些以前用都没用过的,那时候完全不懂得怎么回事,不过在自己写了之后,感觉嘛、也就那么回事。
O(∩_∩)O~,这种项目开发,还是得自己多练练手,写得多了,自己就熟了。
以后就是手到擒来。
下面来看代码吧:
包含main方法的BookStore类:
/*
* BookStore.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import cn.hncu.bookStore.book.ui.BookListPanel;
import cn.hncu.bookStore.in.ui.InListPanel;
import cn.hncu.bookStore.login.ui.LoginPanel;
import cn.hncu.bookStore.out.ui.OutListPanel;
import cn.hncu.bookStore.stock.ui.StockListPanel;
import cn.hncu.bookStore.user.ui.ListPanel;
/**
*
* @author 陈浩翔
* @version 1.0 2016-4-20
*/
public class BookStore extends javax.swing.JFrame {
/** Creates new form BookStore */
public BookStore() {
super("书店管理系统---CHX---联系QQ——619699629");
initComponents();
this.setContentPane(new LoginPanel(this));
this.setResizable(false);//不能缩放
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();
this.setLocation(scr.width / 5, scr.height / 5);
}
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
menuBar = new javax.swing.JMenuBar();
fileMenu = new javax.swing.JMenu();
openMenuItem = new javax.swing.JMenuItem();
saveMenuItem = new javax.swing.JMenuItem();
saveAsMenuItem = new javax.swing.JMenuItem();
exitMenuItem = new javax.swing.JMenuItem();
editMenu = new javax.swing.JMenu();
cutMenuItem = new javax.swing.JMenuItem();
copyMenuItem = new javax.swing.JMenuItem();
pasteMenuItem = new javax.swing.JMenuItem();
deleteMenuItem = new javax.swing.JMenuItem();
helpMenu = new javax.swing.JMenu();
contentsMenuItem = new javax.swing.JMenuItem();
aboutMenuItem = new javax.swing.JMenuItem();
jMenu1 = new javax.swing.JMenu();
jMenuItemUser = new javax.swing.JMenuItem();
jMenuItemBook = new javax.swing.JMenuItem();
jMenuItemIn = new javax.swing.JMenuItem();
jMenuItemOut = new javax.swing.JMenuItem();
jMenuItemStock = new javax.swing.JMenuItem();
jMenuItem1 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setMinimumSize(new java.awt.Dimension(800, 600));
getContentPane().setLayout(null);
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 0, 0, 0);
fileMenu.setText("File");
openMenuItem.setText("Open");
fileMenu.add(openMenuItem);
saveMenuItem.setText("Save");
fileMenu.add(saveMenuItem);
saveAsMenuItem.setText("Save As ...");
fileMenu.add(saveAsMenuItem);
exitMenuItem.setText("Exit");
exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
exitMenuItemActionPerformed(evt);
}
});
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
editMenu.setText("Edit");
cutMenuItem.setText("Cut");
editMenu.add(cutMenuItem);
copyMenuItem.setText("Copy");
editMenu.add(copyMenuItem);
pasteMenuItem.setText("Paste");
editMenu.add(pasteMenuItem);
deleteMenuItem.setText("Delete");
editMenu.add(deleteMenuItem);
menuBar.add(editMenu);
helpMenu.setText("Help");
contentsMenuItem.setText("Contents");
helpMenu.add(contentsMenuItem);
aboutMenuItem.setText("About");
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
jMenu1.setForeground(new java.awt.Color(204, 0, 0));
jMenu1.setText("\u6a21\u5757");
jMenu1.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemUser.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_U,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItemUser.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemUser.setForeground(new java.awt.Color(0, 204, 0));
jMenuItemUser.setText("\u7528\u6237");
jMenuItemUser.setEnabled(false);
jMenuItemUser.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemUserActionPerformed(evt);
}
});
jMenu1.add(jMenuItemUser);
jMenuItemBook.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_B,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItemBook.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemBook.setForeground(new java.awt.Color(0, 204, 51));
jMenuItemBook.setText("\u56fe\u4e66");
jMenuItemBook.setEnabled(false);
jMenuItemBook.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemBookActionPerformed(evt);
}
});
jMenu1.add(jMenuItemBook);
jMenuItemIn.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_I,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItemIn.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemIn.setForeground(new java.awt.Color(0, 204, 0));
jMenuItemIn.setText("\u8fdb\u8d27");
jMenuItemIn.setEnabled(false);
jMenuItemIn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemInActionPerformed(evt);
}
});
jMenu1.add(jMenuItemIn);
jMenuItemOut.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_O,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItemOut.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemOut.setForeground(new java.awt.Color(0, 204, 0));
jMenuItemOut.setText("\u9500\u552e");
jMenuItemOut.setEnabled(false);
jMenuItemOut.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemOutActionPerformed(evt);
}
});
jMenu1.add(jMenuItemOut);
jMenuItemStock.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItemStock.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItemStock.setForeground(new java.awt.Color(0, 204, 0));
jMenuItemStock.setText("\u5e93\u5b58");
jMenuItemStock.setEnabled(false);
jMenuItemStock.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItemStockActionPerformed(evt);
}
});
jMenu1.add(jMenuItemStock);
jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_DELETE,
java.awt.event.InputEvent.CTRL_MASK));
jMenuItem1.setFont(new java.awt.Font("Dialog", 1, 14));
jMenuItem1.setForeground(new java.awt.Color(0, 204, 0));
jMenuItem1.setText("\u6ce8\u9500");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
menuBar.add(jMenu1);
setJMenuBar(menuBar);
pack();
}// </editor-fold>
//GEN-END:initComponents
/**
* 进入销售模块
* @param evt
*/
protected void jMenuItemOutActionPerformed(ActionEvent evt) {
this.setContentPane(new OutListPanel(this));
this.validate();
}
/**
* 进入库存模块
* @param evt
*/
protected void jMenuItemStockActionPerformed(ActionEvent evt) {
this.setContentPane(new StockListPanel(this));
this.validate();
}
/**
* 监听进入进货列表
* @param evt
*/
private void jMenuItemInActionPerformed(java.awt.event.ActionEvent evt) {
this.setContentPane(new InListPanel(this));
this.validate();
}
/**
* 注销菜单项
* @param evt
*/
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
this.setContentPane(new LoginPanel(this));
this.validate();
jMenuItemUser.setEnabled(false);
jMenuItemBook.setEnabled(false);
jMenuItemIn.setEnabled(false);
jMenuItemOut.setEnabled(false);
jMenuItemStock.setEnabled(false);
}
/**
* 监听进入图书模块
* @param evt
*/
private void jMenuItemBookActionPerformed(java.awt.event.ActionEvent evt) {
this.setContentPane(new BookListPanel(this));
this.validate();
}
/**
* 监听进入用户模块
* @param evt
*/
private void jMenuItemUserActionPerformed(java.awt.event.ActionEvent evt) {
this.setContentPane(new ListPanel(this));
this.validate();
}
private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
System.exit(0);
}//GEN-LAST:event_exitMenuItemActionPerformed
/**
* @param 主函数 args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new BookStore().setVisible(true);
}
});
}
public javax.swing.JMenuItem getjMenuItemBook() {
return jMenuItemBook;
}
public javax.swing.JMenuItem getjMenuItemIn() {
return jMenuItemIn;
}
public javax.swing.JMenuItem getjMenuItemOut() {
return jMenuItemOut;
}
public javax.swing.JMenuItem getjMenuItemStock() {
return jMenuItemStock;
}
public javax.swing.JMenuItem getjMenuItemUser() {
return jMenuItemUser;
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JMenuItem aboutMenuItem;
private javax.swing.JMenuItem contentsMenuItem;
private javax.swing.JMenuItem copyMenuItem;
private javax.swing.JMenuItem cutMenuItem;
private javax.swing.JMenuItem deleteMenuItem;
private javax.swing.JMenu editMenu;
private javax.swing.JMenuItem exitMenuItem;
private javax.swing.JMenu fileMenu;
private javax.swing.JMenu helpMenu;
private javax.swing.JLabel jLabel1;
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItemBook;
private javax.swing.JMenuItem jMenuItemIn;
private javax.swing.JMenuItem jMenuItemOut;
private javax.swing.JMenuItem jMenuItemStock;
private javax.swing.JMenuItem jMenuItemUser;
private javax.swing.JMenuBar menuBar;
private javax.swing.JMenuItem openMenuItem;
private javax.swing.JMenuItem pasteMenuItem;
private javax.swing.JMenuItem saveAsMenuItem;
private javax.swing.JMenuItem saveMenuItem;
// End of variables declaration//GEN-END:variables
}
登录模块的源代码:
逻辑层接口LoginEbi:
package cn.hncu.bookStore.login.business.ebi;
/**
* 用户登录模块的逻辑层接口
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public interface LoginEbi {
/**
* 用户登录的方法
* @param name 用户名
* @param pwd 密码
* @return 返回字符串,若登录成功则返回null,如果失败则返回相应的错误信息如用户名不存在或密码不正确
*/
public String login(String name,String pwd);
}
实现类LoginEbo:
package cn.hncu.bookStore.login.business.ebo;
import cn.hncu.bookStore.login.business.ebi.LoginEbi;
import cn.hncu.bookStore.user.business.ebi.UserEbi;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.vo.UserModel;
/**
* 登录模块的实现类
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class LoginEbo implements LoginEbi{
@Override
public String login(String name, String pwd) {
UserEbi ebi = UserEbiFactory.getUserEbi();
UserModel user = ebi.getUserByName(name);
if(user==null){
return "对不起,该用户不存在!";
}
if(!user.getPwd().equals(pwd)){
return "您输入的密码不正确!";
}
return null;
}
}
工厂类LoginEbiFactory:
package cn.hncu.bookStore.login.business.factory;
import cn.hncu.bookStore.login.business.ebi.LoginEbi;
import cn.hncu.bookStore.login.business.ebo.LoginEbo;
/**
* 登录模块的工厂类
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class LoginEbiFactory {
/**
* 工厂方法
* @return
*/
public static LoginEbi getLoginEbi(){
return new LoginEbo();
}
}
表现层登录界面LoginPanel:
/*
* LoginPanel.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore.login.ui;
import javax.swing.JOptionPane;
import cn.hncu.bookStore.BookStore;
import cn.hncu.bookStore.common.UserTypeEnum;
import cn.hncu.bookStore.login.business.factory.LoginEbiFactory;
import cn.hncu.bookStore.user.business.factory.UserEbiFactory;
import cn.hncu.bookStore.user.vo.UserModel;
/**
*
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class LoginPanel extends javax.swing.JPanel {
private BookStore mainFrame = null;
/** Creates new form LoginPanel */
public LoginPanel(BookStore mainFrame) {
this.mainFrame = mainFrame;
initComponents();
}
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
tfdName = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
tfpPwd = new javax.swing.JPasswordField();
btnLogin = new javax.swing.JButton();
btnHelp = new javax.swing.JButton();
setMinimumSize(new java.awt.Dimension(800, 600));
setLayout(null);
jLabel1.setFont(new java.awt.Font("Dialog", 1, 48));
jLabel1.setForeground(new java.awt.Color(255, 51, 0));
jLabel1.setText("\u767b\u5f55");
add(jLabel1);
jLabel1.setBounds(320, 20, 140, 120);
jLabel2.setFont(new java.awt.Font("宋体", 1, 24));
jLabel2.setForeground(new java.awt.Color(51, 0, 255));
jLabel2.setText("\u5bc6 \u7801:");
add(jLabel2);
jLabel2.setBounds(210, 330, 80, 40);
tfdName.setFont(new java.awt.Font("微软雅黑", 1, 24));
add(tfdName);
tfdName.setBounds(310, 220, 190, 40);
jLabel3.setFont(new java.awt.Font("宋体", 1, 24));
jLabel3.setForeground(new java.awt.Color(51, 0, 255));
jLabel3.setText("\u7528\u6237\u540d:");
add(jLabel3);
jLabel3.setBounds(200, 220, 120, 40);
tfpPwd.setFont(new java.awt.Font("宋体", 1, 24));
add(tfpPwd);
tfpPwd.setBounds(310, 330, 190, 40);
btnLogin.setFont(new java.awt.Font("Dialog", 1, 24));
btnLogin.setForeground(new java.awt.Color(51, 0, 255));
btnLogin.setText("\u767b\u5f55");
btnLogin.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnLoginActionPerformed(evt);
}
});
add(btnLogin);
btnLogin.setBounds(150, 440, 120, 70);
btnHelp.setFont(new java.awt.Font("Dialog", 1, 24));
btnHelp.setForeground(new java.awt.Color(0, 0, 255));
btnHelp.setText("\u5e2e\u52a9");
btnHelp.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnHelpActionPerformed(evt);
}
});
add(btnHelp);
btnHelp.setBounds(450, 440, 130, 70);
}// </editor-fold>
//GEN-END:initComponents
private void btnHelpActionPerformed(java.awt.event.ActionEvent evt) {
mainFrame.setContentPane(new LoginHelp(mainFrame));
mainFrame.validate();
}
private void btnLoginActionPerformed(java.awt.event.ActionEvent evt) {
//1收集
String name = tfdName.getText();
String pwd = new String(tfpPwd.getPassword());
if(name.equals("admin")&&pwd.equals("123456")){
mainFrame.getjMenuItemUser().setEnabled(true);
mainFrame.getjMenuItemBook().setEnabled(true);
mainFrame.getjMenuItemIn().setEnabled(true);
mainFrame.getjMenuItemOut().setEnabled(true);
mainFrame.getjMenuItemStock().setEnabled(true);
mainFrame.setContentPane(new LoginWelcomePanel());
mainFrame.validate();
}
//2组织---没有值对象,不组织了
//3调用逻辑层
String result = LoginEbiFactory.getLoginEbi().login(name, pwd);
//4返回到结果页面
if (result != null) {
JOptionPane.showMessageDialog(mainFrame, result);
return;
}
//接下来,登录成功的情况
//把该用户类型所对应的模块点亮
UserModel user = UserEbiFactory.getUserEbi().getUserByName(name);
//超级管理员,点亮所有模块
if (user.getType() == UserTypeEnum.ADMIN.getType()) {
mainFrame.getjMenuItemUser().setEnabled(true);
mainFrame.getjMenuItemBook().setEnabled(true);
mainFrame.getjMenuItemIn().setEnabled(true);
mainFrame.getjMenuItemOut().setEnabled(true);
mainFrame.getjMenuItemStock().setEnabled(true);
}
//图书管理员,点亮图书模块
if (user.getType() == UserTypeEnum.BOOK.getType()) {
mainFrame.getjMenuItemBook().setEnabled(true);
}
//进货管理员,点亮进货模块
if (user.getType() == UserTypeEnum.IN.getType()) {
mainFrame.getjMenuItemIn().setEnabled(true);
}
//销售管理员,点亮销售模块
if (user.getType() == UserTypeEnum.OUT.getType()) {
mainFrame.getjMenuItemOut().setEnabled(true);
}
//库存管理员,点亮库存模块
if (user.getType() == UserTypeEnum.STOCK.getType()) {
mainFrame.getjMenuItemStock().setEnabled(true);
}
mainFrame.setContentPane(new LoginWelcomePanel());
mainFrame.validate();
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JButton btnHelp;
private javax.swing.JButton btnLogin;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JTextField tfdName;
private javax.swing.JPasswordField tfpPwd;
// End of variables declaration//GEN-END:variables
}
表现层欢迎界面LoginWelcomePanel:
/*
* LoginWelcomePanel.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore.login.ui;
/**
*
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class LoginWelcomePanel extends javax.swing.JPanel {
/** Creates new form LoginWelcomePanel */
public LoginWelcomePanel() {
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
setMinimumSize(new java.awt.Dimension(800, 600));
setLayout(null);
jLabel1.setFont(new java.awt.Font("Dialog", 1, 36));
jLabel1.setForeground(new java.awt.Color(255, 0, 0));
jLabel1.setText("\u6b22\u8fce\u767b\u5f55\uff0c\u592a\u9633\u6bcf\u5929\u90fd\u662f\u65b0\u7684\uff01\uff01");
add(jLabel1);
jLabel1.setBounds(100, 190, 590, 170);
}// </editor-fold>
//GEN-END:initComponents
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
// End of variables declaration//GEN-END:variables
}
表现层帮助界面LoginHelp:
/*
* LoginHelp.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore.login.ui;
import javax.swing.JFrame;
import cn.hncu.bookStore.BookStore;
/**
*
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class LoginHelp extends javax.swing.JPanel {
private JFrame mainFrame = null;
/** Creates new form LoginHelp
* @param mainFrame */
public LoginHelp(JFrame mainFrame) {
this.mainFrame = mainFrame;
initComponents();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
setMinimumSize(new java.awt.Dimension(800, 600));
setLayout(null);
jLabel1.setFont(new java.awt.Font("Dialog", 1, 14));
jLabel1.setText("\u5982\u679c\u4f60\u4e0d\u5c0f\u5fc3\u628a\u7528\u6237\u6587\u4ef6\u5220\u9664\u4e86\uff0c\u53ef\u4ee5\u5229\u7528admin\u8d85\u7ea7\u7ba1\u7406\u5458\u767b\u5f55\uff0c\u5bc6\u7801\u4e3a:123456");
add(jLabel1);
jLabel1.setBounds(90, 250, 590, 80);
}// </editor-fold>
//GEN-END:initComponents
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
// End of variables declaration//GEN-END:variables
}
库存模块:Stock
数据层接口StockDao:
package cn.hncu.bookStore.stock.dao.dao;
import java.util.List;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
* 库存模块的数据层接口
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public interface StockDao {
/**
* 创建一个库存对象
* @param stock
* @return
*/
public boolean create(StockModel stock);
/**
*
* @return 返回所有的库存对象数据
*/
public List<StockModel> getAl();
/**
* 根据uuid -- 修改为传入的库存对象
* @param stock
* @return
*/
public boolean update(StockModel stock);
/**
* 查询 符合条件 的 库存对象集合
* @param sqm---查询条件
* @return---符合条件的库存对象集合
*/
public List<StockModel> getByCondition(StockQueryModel sqm);
/**
* 根据uuid查找当前的uuid对应的库存对象
* @param uuid
* @return
*/
public StockModel getSingle(String uuid);
}
数据层实现类StockDaoImpl:
package cn.hncu.bookStore.stock.dao.impl;
import java.util.ArrayList;
import java.util.List;
import cn.hncu.bookStore.stock.dao.dao.StockDao;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
import cn.hncu.bookStore.util.FileIoUtil;
import cn.hncu.bookStore.util.StringComparison;
/**
* 库存模块数据层的实现类
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockDaoImpl implements StockDao{
private final String FILE_NAME = "Stock.txt";
@Override
public boolean create(StockModel stock) {
List<StockModel> lists = FileIoUtil.readFormFile(FILE_NAME);
for(StockModel model :lists){
if(model.getUuid().equals(stock.getUuid())){
return false;
}
}
lists.add(stock);
FileIoUtil.write2file(lists, FILE_NAME);
return true;
}
@Override
public List<StockModel> getAl() {
return FileIoUtil.readFormFile(FILE_NAME);
}
@Override
public boolean update(StockModel stock) {
List<StockModel> lists = FileIoUtil.readFormFile(FILE_NAME);
for(int i=0;i<lists.size();i++){
if(lists.get(i).getUuid().equals(stock.getUuid())){
lists.set(i, stock);
FileIoUtil.write2file(lists, FILE_NAME);
return true;
}
}
return false;
}
@Override
public List<StockModel> getByCondition(StockQueryModel sqm) {
List<StockModel> lists = FileIoUtil.readFormFile(FILE_NAME);
List<StockModel> results = new ArrayList<StockModel>();
for(StockModel model : lists){
//卫条件
//比较库存ID
if(!StringComparison.stringEquals(model.getUuid(), sqm.getUuid())){
continue;
}
//比较图书ID
if(!StringComparison.stringEquals(model.getBookUuid(), sqm.getBookUuid())){
continue;
}
//库存查询最小数量
if(sqm.getSumNum()>0){
if(sqm.getSumNum()>model.getSumNum()){
continue;
}
}
//库存查询最大数量
if(sqm.getSumNum2()>0){
if(sqm.getSumNum2()<model.getSumNum()){
continue;
}
}
results.add(model);
}
return results;
}
@Override
public StockModel getSingle(String uuid) {
List<StockModel> lists = FileIoUtil.readFormFile(FILE_NAME);
for(StockModel model : lists){
if(model.getUuid().equals(uuid)){
//找到uuid相同,直接返回库存对象
return model;
}
}
return null;
}
}
数据层工厂方法StockDaoFactory:
package cn.hncu.bookStore.stock.dao.factory;
import cn.hncu.bookStore.stock.dao.dao.StockDao;
import cn.hncu.bookStore.stock.dao.impl.StockDaoImpl;
/**
* 工厂类-库存
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockDaoFactory {
/**
* 工厂方法
* @return --- new 一个数据层实例
*/
public static StockDao getStockDao(){
return new StockDaoImpl();
}
}
逻辑层接口StockEbi:
package cn.hncu.bookStore.stock.business.ebi;
import java.util.List;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
* 库存逻辑层的接口
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public interface StockEbi {
/**
* 得到所有的库存对象
* @return---所有的库存对象集合
*/
public List<StockModel> getAll();
/**
* 根据查询条件,查询所有符合条件的库存对象
* @param sqm---查询条件
* @return---所有符合条件的库存对象集合
*/
public List<StockModel> getByCondition(StockQueryModel sqm);
}
逻辑层实现类StockEbo:
package cn.hncu.bookStore.stock.business.ebo;
import java.util.List;
import cn.hncu.bookStore.stock.business.ebi.StockEbi;
import cn.hncu.bookStore.stock.dao.dao.StockDao;
import cn.hncu.bookStore.stock.dao.factory.StockDaoFactory;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
* 库存逻辑层实现类
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockEbo implements StockEbi{
//注入 dao
StockDao dao = StockDaoFactory.getStockDao();
@Override
public List<StockModel> getAll() {
return dao.getAl();
}
@Override
public List<StockModel> getByCondition(StockQueryModel sqm) {
return dao.getByCondition(sqm);
}
}
逻辑层工厂类StockEbiFactory:
package cn.hncu.bookStore.stock.business.factory;
import cn.hncu.bookStore.stock.business.ebi.StockEbi;
import cn.hncu.bookStore.stock.business.ebo.StockEbo;
/**
* 库存逻辑层工厂类
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockEbiFactory {
/**
* 工厂方法
* @return---new一个逻辑层实现类
*/
public static StockEbi getStockEbi(){
return new StockEbo();
}
}
值对象StockModel:
package cn.hncu.bookStore.stock.vo;
import java.io.Serializable;
/**
* 库存封装值对象
* @author 陈浩翔
*
* @version 1.0
*/
public class StockModel implements Serializable{
//库存编号
private String uuid;
//图书编号
private String bookUuid;
//库存数量
private int sumNum;
//为显示给用户看而补的
private String bookName;
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public String getBookUuid() {
return bookUuid;
}
public void setBookUuid(String bookUuid) {
this.bookUuid = bookUuid;
}
public int getSumNum() {
return sumNum;
}
public void setSumNum(int sumNum) {
this.sumNum = sumNum;
}
public String getBookName() {
return bookName;
}
public void setBookName(String bookName) {
this.bookName = bookName;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((uuid == null) ? 0 : uuid.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
StockModel other = (StockModel) obj;
if (uuid == null) {
if (other.uuid != null)
return false;
} else if (!uuid.equals(other.uuid))
return false;
return true;
}
@Override
public String toString() {
return "库存编号:"+uuid + ", 《" + bookName
+ "》, 库存数量:" + sumNum+"本";
}
}
查询值对象StockQueryModel:
package cn.hncu.bookStore.stock.vo;
/**
* 库存查询值对象封装
* @author 陈浩翔
*
* @version 1.0
*/
public class StockQueryModel extends StockModel{
//最大的图书库存数量
private int sumNum2;
public int getSumNum2() {
return sumNum2;
}
public void setSumNum2(int sumNum2) {
this.sumNum2 = sumNum2;
}
}
表现层库存列表StockListPanel:
/*
* StockListPanel.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore.stock.ui;
import java.util.List;
import javax.swing.JFrame;
import cn.hncu.bookStore.stock.business.factory.StockEbiFactory;
import cn.hncu.bookStore.stock.vo.StockModel;
/**
*
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockListPanel extends javax.swing.JPanel {
private JFrame mainFrame = null;
/** Creates new form StockListPanel */
public StockListPanel(JFrame mainFrame) {
this.mainFrame = mainFrame;
initComponents();
myInitData();
}
public StockListPanel(JFrame mainFrame, List<StockModel> results) {
this.mainFrame = mainFrame;
initComponents();
jListStocks.setListData(results.toArray());
}
private void myInitData() {
List<StockModel> lists = StockEbiFactory.getStockEbi().getAll();
jListStocks.setListData(lists.toArray());
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
jListStocks = new javax.swing.JList();
btnQuery = new javax.swing.JButton();
setMinimumSize(new java.awt.Dimension(800, 600));
setLayout(null);
jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 48));
jLabel1.setForeground(new java.awt.Color(255, 0, 0));
jLabel1.setText("\u5e93\u5b58\u5217\u8868");
add(jLabel1);
jLabel1.setBounds(280, 0, 220, 90);
jListStocks.setFont(new java.awt.Font("微软雅黑", 1, 18));
jListStocks.setForeground(new java.awt.Color(0, 0, 153));
jListStocks.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "" };
public int getSize() {
return strings.length;
}
public Object getElementAt(int i) {
return strings[i];
}
});
jScrollPane1.setViewportView(jListStocks);
add(jScrollPane1);
jScrollPane1.setBounds(120, 100, 520, 320);
btnQuery.setFont(new java.awt.Font("Dialog", 1, 36));
btnQuery.setForeground(new java.awt.Color(255, 0, 51));
btnQuery.setText("\u67e5\u8be2\u5e93\u5b58");
btnQuery.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnQueryActionPerformed(evt);
}
});
add(btnQuery);
btnQuery.setBounds(270, 440, 190, 90);
}// </editor-fold>
//GEN-END:initComponents
private void btnQueryActionPerformed(java.awt.event.ActionEvent evt) {
mainFrame.setContentPane(new StockQueryPanel(mainFrame));
mainFrame.validate();
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JButton btnQuery;
private javax.swing.JLabel jLabel1;
private javax.swing.JList jListStocks;
private javax.swing.JScrollPane jScrollPane1;
// End of variables declaration//GEN-END:variables
}
表现层库存查询StockQueryPanel:
/*
* StockQueryPanel.java
*
* Created on __DATE__, __TIME__
*/
package cn.hncu.bookStore.stock.ui;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import cn.hncu.bookStore.book.business.factory.BookEbiFactory;
import cn.hncu.bookStore.book.vo.BookModel;
import cn.hncu.bookStore.stock.business.factory.StockEbiFactory;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
*
* @author 陈浩翔
*
* @version 1.0 2016-4-20
*/
public class StockQueryPanel extends javax.swing.JPanel {
private JFrame mainFrame = null;
/** Creates new form StockQueryPanel
* @param mainFrame */
public StockQueryPanel(JFrame mainFrame) {
this.mainFrame = mainFrame;
initComponents();
myInitData();
}
/**
* 初始化图书box
*/
private void myInitData() {
List<BookModel> books = BookEbiFactory.getBookEbi().getAll();
for(BookModel book:books){
combBook.addItem(book.getName());
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
//GEN-BEGIN:initComponents
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jLabel1 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel();
tfdStockUuid = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel();
combBook = new javax.swing.JComboBox();
jLabel8 = new javax.swing.JLabel();
tfdStockNum = new javax.swing.JTextField();
jLabel11 = new javax.swing.JLabel();
tfdStockNum2 = new javax.swing.JTextField();
btnQuery = new javax.swing.JButton();
btnBack = new javax.swing.JButton();
setMinimumSize(new java.awt.Dimension(800, 600));
setLayout(null);
jLabel1.setFont(new java.awt.Font("Dialog", 1, 48));
jLabel1.setForeground(new java.awt.Color(255, 0, 0));
jLabel1.setText("\u5e93\u5b58\u67e5\u8be2");
add(jLabel1);
jLabel1.setBounds(270, 0, 230, 90);
jLabel7.setFont(new java.awt.Font("微软雅黑", 0, 18));
jLabel7.setText("\u5e93\u5b58\u7f16\u53f7:");
add(jLabel7);
jLabel7.setBounds(80, 160, 80, 30);
add(tfdStockUuid);
tfdStockUuid.setBounds(180, 160, 150, 30);
jLabel5.setFont(new java.awt.Font("微软雅黑", 0, 18));
jLabel5.setText("\u56fe\u4e66:");
add(jLabel5);
jLabel5.setBounds(430, 150, 50, 30);
combBook.setFont(new java.awt.Font("Dialog", 1, 18));
combBook.setModel(new javax.swing.DefaultComboBoxModel(
new String[] { "查询所有" }));
add(combBook);
combBook.setBounds(490, 150, 190, 30);
jLabel8.setFont(new java.awt.Font("微软雅黑", 0, 18));
jLabel8.setText("\u5e93\u5b58\u6700\u5c0f\u6570\u91cf:");
add(jLabel8);
jLabel8.setBounds(50, 270, 140, 30);
add(tfdStockNum);
tfdStockNum.setBounds(180, 270, 150, 30);
jLabel11.setFont(new java.awt.Font("微软雅黑", 0, 18));
jLabel11.setText("\u5e93\u5b58\u6700\u5927\u6570\u91cf:");
add(jLabel11);
jLabel11.setBounds(360, 270, 120, 30);
add(tfdStockNum2);
tfdStockNum2.setBounds(490, 270, 190, 30);
btnQuery.setFont(new java.awt.Font("Dialog", 1, 24));
btnQuery.setForeground(new java.awt.Color(255, 0, 51));
btnQuery.setText("\u67e5\u8be2");
btnQuery.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnQueryActionPerformed(evt);
}
});
add(btnQuery);
btnQuery.setBounds(140, 410, 120, 70);
btnBack.setFont(new java.awt.Font("Dialog", 1, 24));
btnBack.setForeground(new java.awt.Color(255, 0, 51));
btnBack.setText("\u8fd4\u56de");
btnBack.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnBackActionPerformed(evt);
}
});
add(btnBack);
btnBack.setBounds(490, 410, 120, 70);
}// </editor-fold>
//GEN-END:initComponents
private void btnQueryActionPerformed(java.awt.event.ActionEvent evt) {
// 1收集参数(且验证输入有效性)
//库存编号
String uuid = tfdStockUuid.getText();
//图书编号
String bookUuid = null;
if (combBook.getSelectedIndex() > 0) {
bookUuid = BookEbiFactory.getBookEbi()
.getBookByName(combBook.getSelectedItem().toString())
.getUuid();
}
//库存最小数量
int sumNum = 0;
if (tfdStockNum.getText() != null
&& tfdStockNum.getText().trim().length() > 0) {
try {
sumNum = Integer.parseInt(tfdStockNum.getText());
if (sumNum < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(mainFrame, "库存最小数量必须输入正整数!");
return;
}
}
//库存最大数量
int sumNum2 = 0;
if (tfdStockNum2.getText() != null
&& tfdStockNum2.getText().trim().length() > 0) {
try {
sumNum2 = Integer.parseInt(tfdStockNum2.getText());
if (sumNum2 < 0) {
throw new NumberFormatException();
}
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(mainFrame, "库存最大数量必须输入正整数!");
return;
}
}
// 2组织参数----StockQueryModel
StockQueryModel sqm = new StockQueryModel();
sqm.setUuid(uuid);
sqm.setBookUuid(bookUuid);
sqm.setSumNum(sumNum);
sqm.setSumNum2(sumNum2);
// 3调用逻辑层
List<StockModel> results = StockEbiFactory.getStockEbi()
.getByCondition(sqm);
// 4返回到结果页面
mainFrame.setContentPane(new StockListPanel(mainFrame, results));
mainFrame.validate();
}
private void btnBackActionPerformed(java.awt.event.ActionEvent evt) {
back();
}
private void back() {
mainFrame.setContentPane(new StockListPanel(mainFrame));
mainFrame.validate();
}
//GEN-BEGIN:variables
// Variables declaration - do not modify
private javax.swing.JButton btnBack;
private javax.swing.JButton btnQuery;
private javax.swing.JComboBox combBook;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JTextField tfdStockNum;
private javax.swing.JTextField tfdStockNum2;
private javax.swing.JTextField tfdStockUuid;
// End of variables declaration//GEN-END:variables
}
进货模块:
进货模块的逻辑层接口,在写了库存模块之后改了一点,增加了和库存模块的串接:
逻辑层接口InMainEbo:
package cn.hncu.bookStore.in.business.ebo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import cn.hncu.bookStore.book.business.ebi.BookEbi;
import cn.hncu.bookStore.book.business.factory.BookEbiFactory;
import cn.hncu.bookStore.common.UuidModelConstance;
import cn.hncu.bookStore.common.uuid.dao.dao.UuidDao;
import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory;
import cn.hncu.bookStore.in.business.ebi.InMainEbi;
import cn.hncu.bookStore.in.business.factory.InMainEbiFactory;
import cn.hncu.bookStore.in.dao.dao.InDetailDao;
import cn.hncu.bookStore.in.dao.dao.InMainDao;
import cn.hncu.bookStore.in.dao.factory.InDetailDaoFactory;
import cn.hncu.bookStore.in.dao.factory.InMainDaoFactory;
import cn.hncu.bookStore.in.vo.InDetailModel;
import cn.hncu.bookStore.in.vo.InDetailQueryModel;
import cn.hncu.bookStore.in.vo.InMainModel;
import cn.hncu.bookStore.in.vo.InMainQueryModel;
import cn.hncu.bookStore.stock.dao.dao.StockDao;
import cn.hncu.bookStore.stock.dao.factory.StockDaoFactory;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
*
* @author 陈浩翔
*
* @version 1.0
*/
public class InMainEbo implements InMainEbi{
//注入dao
InMainDao inMainDao = InMainDaoFactory.getInMainDao();
InDetailDao inDetailDao = InDetailDaoFactory.getInDetailDao();
UuidDao uuidDao = UuidDaoFactory.getUuidDao();
BookEbi bookEbi = BookEbiFactory.getBookEbi();
@Override
public boolean create(InMainModel inMain, List<InDetailModel> inDetails) {
//////////1存储inMain信息///////////
//补全inMain中的数据
//需要:inUuid,inDate,inUserUuid 已组织:inUserUuid
//还缺(需补):inUuid,inDate
String inUuid = uuidDao.getNextUuid(UuidModelConstance.IN_MAIN);
inMain.setUuid(inUuid);
inMain.setInDate(System.currentTimeMillis());
inMainDao.create(inMain);
//////////2存储inDetail信息///////////
for(InDetailModel model:inDetails){
//补全每一个inDetail中的数据
//需要:inDetailUuid,inMainUuid,bookUuid,sumNum,sumMoney 已组织:bookUuid,sumNum
//还缺(需补):inDetailUuid,inMainUuid,sumMoney
model.setUuid(uuidDao.getNextUuid(UuidModelConstance.IN_DETAIL));
model.setInId(inUuid);
double sumMoney = model.getSumNum() * bookEbi.getSingle(model.getBookId()).getInPrice();
model.setSumMoney(sumMoney);
inDetailDao.create(model);
//////////※※※3 图书入库--到库存表格///////////
putInStock(model.getBookId(),model.getSumNum());
}
return true;
}
/**
* 入库动作
* @param bookId
* @param bookName
*/
private void putInStock(String bookId, int sumNum) {
//注入Stock模块的dao
StockDao dao = StockDaoFactory.getStockDao();
//查询库存,看看是否已经存在该bookUuid所对应的书,如果没有则库存数据为sumNum,否则为在原有基础上再加上sumNum
StockQueryModel sqm = new StockQueryModel();
sqm.setBookUuid(bookId);
List<StockModel> lists = dao.getByCondition(sqm);
//库存中没有这种书
if(lists==null||lists.size()==0){
//表现层只负责组织进货模块的值对象,库存模块我们在逻辑层自己补
StockModel stock = new StockModel();
//补:库存编号 uuid
stock.setUuid(UuidDaoFactory.getUuidDao().getNextUuid(UuidModelConstance.STOCK));
//补: bookName 专为显示给用户看的书名
stock.setBookName(BookEbiFactory.getBookEbi().getSingle(bookId).getName());
stock.setBookUuid(bookId);
stock.setSumNum(sumNum);
dao.create(stock);
}else{//库存中已经存在该图书对应的库存记录
StockModel stock = lists.get(0);
stock.setSumNum( stock.getSumNum()+sumNum );
dao.update(stock);
}
}
@Override
public Map<InMainModel, List<InDetailModel>> getAll() {
Map<InMainModel,List<InDetailModel>> map = new TreeMap<InMainModel, List<InDetailModel>>();
List<InMainModel> inMains = inMainDao.getAll();
for(InMainModel inMain: inMains ){
//查询条件值对象的创建
InDetailQueryModel idqm = new InDetailQueryModel();
String inUuid = inMain.getUuid();
idqm.setInId(inUuid);
List<InDetailModel> details = inDetailDao.getbyCondition(idqm);
map.put(inMain, details);
}
return map;
}
@Override
public Map<InMainModel, List<InDetailModel>> getByCondition(
InMainQueryModel imqm, InDetailQueryModel idqm) {
Map<InMainModel, List<InDetailModel>> map = new TreeMap<InMainModel, List<InDetailModel>>();
List<InMainModel> list = inMainDao.getbyCondition(imqm);
for(InMainModel inMain : list){
idqm.setInId(inMain.getUuid());
List<InDetailModel> details = inDetailDao.getbyCondition(idqm);
if(details.size()!=0){
map.put(inMain, details);
}
}
return map;
}
}
销售模块:
销售模块的逻辑层接口也增加了和库存模块的串接:
逻辑层接口OutMainEbo:
package cn.hncu.bookStore.out.business.ebo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.swing.JOptionPane;
import cn.hncu.bookStore.book.business.ebi.BookEbi;
import cn.hncu.bookStore.book.business.factory.BookEbiFactory;
import cn.hncu.bookStore.common.UuidModelConstance;
import cn.hncu.bookStore.common.uuid.dao.dao.UuidDao;
import cn.hncu.bookStore.common.uuid.dao.factory.UuidDaoFactory;
import cn.hncu.bookStore.out.business.ebi.OutMainEbi;
import cn.hncu.bookStore.out.dao.dao.OutDetailDao;
import cn.hncu.bookStore.out.dao.dao.OutMainDao;
import cn.hncu.bookStore.out.dao.factory.OutDetailDaoFactory;
import cn.hncu.bookStore.out.dao.factory.OutMainDaoFactory;
import cn.hncu.bookStore.out.vo.OutDetailModel;
import cn.hncu.bookStore.out.vo.OutDetailQueryModel;
import cn.hncu.bookStore.out.vo.OutMainModel;
import cn.hncu.bookStore.out.vo.OutMainQueryModel;
import cn.hncu.bookStore.stock.business.factory.StockEbiFactory;
import cn.hncu.bookStore.stock.dao.dao.StockDao;
import cn.hncu.bookStore.stock.dao.factory.StockDaoFactory;
import cn.hncu.bookStore.stock.vo.StockModel;
import cn.hncu.bookStore.stock.vo.StockQueryModel;
/**
*
* @author 陈浩翔
*
* @version 1.0
*/
public class OutMainEbo implements OutMainEbi{
//注入dao
OutMainDao outMainDao = OutMainDaoFactory.getOutMainDao();
OutDetailDao outDetailDao = OutDetailDaoFactory.getOutDetailDao();
UuidDao uuidDao = UuidDaoFactory.getUuidDao();
BookEbi bookEbi = BookEbiFactory.getBookEbi();
@Override
public boolean create(OutMainModel outMain, List<OutDetailModel> outDetails) {
//※※※库存操作1:在添加销售信息之前要进行防护:检查库存,看是否可能库存不够。如果不够,本次添加直接失败,不进行数据存储---return false;
//检查库存----用明细单(outDetail)中的bookUuid
//注入Stock模块的dao
StockDao stockDao = StockDaoFactory.getStockDao();
for(OutDetailModel detail : outDetails){
StockQueryModel sqm = new StockQueryModel();
sqm.setBookUuid(detail.getBookId());
List<StockModel> lists = stockDao.getByCondition(sqm);
if(lists==null||lists.size()==0){//库存中没有该图书信息
JOptionPane.showMessageDialog(null, "库存中不存在《"+detail.getBookName()+"》,本次销售添加失败!");
return false;
}else {
StockModel sm = lists.get(0);
if(sm.getSumNum()<detail.getSumNum()){
JOptionPane.showMessageDialog(null, "库存中《"+detail.getBookName()+"》数量不足,本次销售添加失败!");
return false;
}
}
}
//////////1存储outMain信息///////////
//补全outMain中的数据
//需要:inUuid,inDate,inUserUuid 已组织:inUserUuid
//还缺(需补):inUuid,inDate
String outUuid = uuidDao.getNextUuid(UuidModelConstance.OUT_MAIN);
outMain.setUuid(outUuid);
outMain.setOutDate(System.currentTimeMillis());
outMainDao.create(outMain);
//////////2存储inDetail信息///////////
for(OutDetailModel model:outDetails){
//补全每一个inDetail中的数据
//需要:inDetailUuid,outMainUuid,bookUuid,sumNum,sumMoney 已组织:bookUuid,sumNum
//还缺(需补):inDetailUuid,outMainUuid,sumMoney
model.setUuid(uuidDao.getNextUuid(UuidModelConstance.OUT_DETAIL));
model.setOutId(outUuid);
double sumMoney = model.getSumNum() * bookEbi.getSingle(model.getBookId()).getSalePrice();
model.setSumMoney(sumMoney);
outDetailDao.create(model);
//※※※库存操作2:更新库存---把对应的每种图书的数量 减去 这次销售的数量
StockQueryModel sqm = new StockQueryModel();
sqm.setBookUuid(model.getBookId());
List<StockModel> stocks = StockEbiFactory.getStockEbi().getByCondition(sqm);
//经过之前的防护,list里面一定有一个值,而且库存一定可以更新成功
StockModel stock = stocks.get(0);
stock.setSumNum(stock.getSumNum()-model.getSumNum());
StockDaoFactory.getStockDao().update(stock);
}
return true;
}
@Override
public Map<OutMainModel, List<OutDetailModel>> getAll() {
Map<OutMainModel,List<OutDetailModel>> map = new TreeMap<OutMainModel, List<OutDetailModel>>();
List<OutMainModel> outMains = outMainDao.getAll();
for(OutMainModel outMain: outMains ){
//查询条件值对象的创建
OutDetailQueryModel odqm = new OutDetailQueryModel();
String inUuid = outMain.getUuid();
odqm.setOutId(inUuid);
List<OutDetailModel> details = outDetailDao.getbyCondition(odqm);
map.put(outMain, details);
}
return map;
}
@Override
public Map<OutMainModel, List<OutDetailModel>> getByCondition(
OutMainQueryModel imqm, OutDetailQueryModel odqm) {
Map<OutMainModel, List<OutDetailModel>> map = new TreeMap<OutMainModel, List<OutDetailModel>>();
List<OutMainModel> list = outMainDao.getbyCondition(imqm);
for(OutMainModel outMain : list){
odqm.setOutId(outMain.getUuid());
List<OutDetailModel> details = outDetailDao.getbyCondition(odqm);
if(details.size()!=0){
map.put(outMain, details);
}
}
return map;
}
}
展示图片:
登录界面:
菜单项,除了注销是点亮之外,其他的都是暗的。
帮助界面:
当用户文件被删除了之后,就只能通过这个账号登录了。
管理员登录后的欢迎界面:
这个是管理员登录的欢迎界面,可以看到所有的菜单项都被点亮了的。
库存管理用户登录后的库存界面:
可以看到,菜单项只有库存那一项是点亮的。
销售管理用户登录后的销售界面:
可以看到,菜单项只有销售那一项是点亮的。
其他的都是,一个模块的用户对应相应的模块!
本系列就到此结束啦。
可能有一些小bug,我也就没去改了,时间比较紧,O(∩_∩)O哈哈~,大家有兴趣的可以去改改,做做。
所有代码的百度云链接:
链接: http://pan.baidu.com/s/1c2ob5r6 密码: u6jv
Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)的更多相关文章
- java web 项目 图书管理系统的设计与实现
java web 项目 图书管理系统的设计与实现
- java进销存管理系统的设计与实现-springboot源码
开发环境: Windows操作系统 开发工具:MyEclipse/Eclipse + JDK+ Tomcat + MySQL 数据库 项目简介: 系统前段页面采用jsp + JavaScrip ...
- Java设计系列之书店管理系统单机版
书店管理系统: 项目练习目标 :1.Java应用程序基本分析2.培养面向对象编程的基本思想3.Java基本设计模式综合应用4.掌握分层和接口的基本设计5.构建合理的Java应用程序包结构6.综合应用J ...
- Java生鲜电商平台-订单配送模块的架构与设计
Java生鲜电商平台-订单配送模块的架构与设计 生鲜电商系统最终的目的还是用户下单支付购买, 所以订单管理系统是电商系统中最为复杂的系统,其作为中枢决定着整个商城的运转, 本文将对于生鲜类电商平台的订 ...
- Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍
本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...
- 课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统
课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架: ...
- 毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行
毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行 注意:该项目只展示部分功能,如需了解,评论区咨 ...
- Java开源生鲜电商平台-购物车模块的设计与架构(源码可下载)
ava开源生鲜电商平台-购物车模块的设计与架构(源码可下载) 说明:任何一个电商无论是B2C还是B2B都有一个购物车模块,其中最重要的原因就是客户需要的东西放在一起,形成一个购物清单,确认是否有问题, ...
- Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载)
Java开源生鲜电商平台-推荐系统模块的设计与架构(源码可下载) 业务需求: 对于一个B2B的生鲜电商平台,对于买家而言,他需要更加快速的购买到自己的产品,跟自己的餐饮店不相关的东西,他是不关心的,而 ...
随机推荐
- winserver2008下创建计划任务注意点
winserver2008下创建任务计划注意点: 1.建立独立用户,可以给其赋予administrator权限 2.起始于(可选):要填写exe文件所在路径 3.设置成“不管用户是否登录都运行”,同时 ...
- c++逆向 vector
最近弄Android c/c++方面的逆向,发现c++的类,stl模板,在逆向的时候相比c语言都带来了不小的困难. 今天自己写了个小程序,然后逆向分析了一下 vector<int> arr ...
- [转] 消息系统该Push/Pull模式分析
信息推拉技术简介 “智能信息推拉(IIPP)技术”是在网上信息获取技术中加入了智能成份,从而有助于用户在海量信息中高效.及时地获取最新信息,提高了信 息系统主动信息服务的能力.如果引入基于IIPP的主 ...
- Java NIO中核心组成和IO区别
1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...
- 体验Impress.js
用腻了ppt,prezi的风格看起来更酷一点儿,无意中得知有Impress.js这么一个H5版的prezi,nice,值得一试. 关于Impress.js,网上教程很多,但说实话就跟教小朋友一样,一步 ...
- (总结)Nginx配置文件nginx.conf中文详解 <转>
转自 http://www.ha97.com/5194.html #定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_proc ...
- codevs 2495 水叮当的舞步IDA*
/* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...
- HDU 2639 (01背包第k优解)
/* 01背包第k优解问题 f[i][j][k] 前i个物品体积为j的第k优解 对于每次的ij状态 记下之前的两种状态 i-1 j-w[i] (选i) i-1 j (不选i) 分别k个 然后归并排序并 ...
- CSS3简单的空调
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- .NET获取机器信息
/// <summary> /// using System.Web; /// using System.Management; /// </summary> public s ...