1. 程式人生 > >Java-單機版的書店管理系統(練習設計模組和思想_系列彙總)

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;