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;