java图书管理系统

一、 引言

图书管理系统是一个用于图书馆或书店管理图书信息、借阅记录和读者信息的应用程序。本系统使用Java Swing框架进行开发,提供直观的用户界面,方便图书馆管理员或书店工作人员对图书信息进行管理。以下是系统的设计、功能和实现的详细报告。

二、系统设计

技术选型:

前端框架: Java Swing
后端语言: Java
数据库: 使用文件存储图书信息
系统架构:

MVC(Model-View-Controller)架构,以确保系统的可维护性和扩展性。
Model: 数据模型,包括图书、读者和借阅记录等类。
View: 用户界面,使用Swing组件实现各种窗口和表格。
Controller: 控制器,处理用户输入、调用业务逻辑和更新视图。

三、 系统功能

图书管理:

添加图书信息,包括书名、作者、出版社、出版日期等。
修改图书信息,支持编辑已有图书的属性。
删除图书,从系统中移除不需要的图书。
查询图书,根据书名、作者等条件进行搜索。
读者管理:

添加读者信息,包括姓名、学号(或工号)、联系方式等。
修改读者信息,更新读者的个人信息。
删除读者,从系统中注销读者账号。
查询读者,根据姓名、学号等条件进行搜索。
借阅管理:

借书,记录图书的借阅信息,包括借阅日期和应还日期。
还书,更新图书的借阅状态,计算逾期天数和罚金。
查询借阅记录,查看读者的借阅历史。

四、 用户界面

登录界面: 提供用户名和密码登录系统。
主界面: 显示图书管理、读者管理和借阅管理等功能按钮。
图书管理界面: 包括添加、修改、删除和查询图书的功能。
读者管理界面: 包括添加、修改、删除和查询读者的功能。
借阅管理界面: 包括借书、还书和查询借阅记录的功能。

五、数据库

1.book_admin表:存储管理员信息。

CREATE TABLE book_admin (
username varchar(20) NOT NULL COMMENT ‘用户名’,
password varchar(20) NOT NULL COMMENT ‘密码’,
PRIMARY KEY (username),
UNIQUE KEY UNIQUE (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.book_info表:存储图书信息。

CREATE TABLE book_info (
bookId int NOT NULL AUTO_INCREMENT COMMENT ‘图书id’,
bookName varchar(50) NOT NULL COMMENT ‘图书名称’,
author varchar(50) NOT NULL COMMENT ‘图书作者’,
– 其他字段…
PRIMARY KEY (bookId),
UNIQUE KEY UNIQUE (bookName)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

3.book_lend表:存储借阅信息。

CREATE TABLE book_lend (
lendId int NOT NULL AUTO_INCREMENT COMMENT ‘借阅id’,
bookName varchar(50) NOT NULL COMMENT ‘图书名称’,
userName varchar(20) NOT NULL COMMENT ‘借阅者名称’,
– 其他字段…
PRIMARY KEY (lendId)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

4.book_type表:存储图书类别信息。

CREATE TABLE book_type (
typeId int NOT NULL AUTO_INCREMENT COMMENT ‘类别id’,
typeName varchar(50) NOT NULL COMMENT ‘类别名称’,
typeDesc varchar(100) DEFAULT NULL COMMENT ‘类别描述’,
PRIMARY KEY (typeId),
UNIQUE KEY UNIQUE (typeName)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

5.book_user表:存储用户信息。

CREATE TABLE book_user (
username varchar(20) NOT NULL COMMENT ‘用户名’,
password varchar(20) NOT NULL COMMENT ‘密码’,
PRIMARY KEY (username),
UNIQUE KEY UNIQUE (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

六、程序截图

java图书管理系统_第1张图片
java图书管理系统_第2张图片
java图书管理系统_第3张图片
java图书管理系统_第4张图片
java图书管理系统_第5张图片
java图书管理系统_第6张图片
java图书管理系统_第7张图片
java图书管理系统_第8张图片
java图书管理系统_第9张图片

七、代码

InfoFrame.java

package com.wang.view.minorframe;

import com.wang.utils.ImageData;
import com.wang.view.baseview.MinorFrame;

import javax.swing.*;
import java.awt.*;

/**
 * 关于我们界面
 */
public class InfoFrame extends MinorFrame {

    public InfoFrame() {
        super("关于我们",840,590);
        initFrame();
    }

    private void initFrame(){
        JPanel jp = new JPanel(){
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                ImageData.info.paintIcon(this, g, 0, 0);
            }
        };
        jp.setLayout(null);
        JLabel jl1 = new JLabel("欢迎使用图书管理系统!");
        jl1.setBounds(20,20,600,50);
        jl1.setFont(new Font("方正舒体", Font.PLAIN, 40));
        JLabel jl2 = new JLabel("工作邮箱:xxx");
        jl2.setBounds(20,70,600,50);
        jl2.setFont(new Font("方正舒体", Font.PLAIN, 40));
        jp.add(jl1);
        jp.add(jl2);
        setContentPane(jp);
    }
}

LendBookFrame.java

package com.wang.view.minorframe;

import com.wang.bean.Book;
import com.wang.bean.LendInfo;
import com.wang.service.BookService;
import com.wang.service.LendInfoService;
import com.wang.service.TypeService;
import com.wang.service.impl.BookServiceImpl;
import com.wang.service.impl.LendInfoServiceImpl;
import com.wang.service.impl.TypeServiceImpl;
import com.wang.view.baseview.MinorFrame;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Date;
import java.util.*;
import java.util.List;

/**
 * 借阅图书界面
 */
public class LendBookFrame extends MinorFrame {

    private JTable table;
    private DefaultTableModel tdm;
    private final BookService bookService = new BookServiceImpl();
    private final TypeService typeService = new TypeServiceImpl();
    private final LendInfoService lendInfoService = new LendInfoServiceImpl();
    private  JRadioButton jrb1, jrb2;
    private  JComboBox<String> jcb1, jcb2;
    private  JTextField jtf1, jtf2, jtf3, jtf4, jtf5, jtf6;
    private  JTextArea jta;

    public LendBookFrame(String username) {
        super("图书借阅", 800, 650);
        initFrame(username);
    }

    private void initFrame(String username){
        JPanel jp = new JPanel() {
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawLine(120, 330, getWidth() - 50, 330);
                g.drawLine(50, 580, getWidth() - 50, 580);
                g.drawLine(50, 330, 50, 580);
                g.drawLine(getWidth() - 50, 330, getWidth() - 50, 580);
                g.drawLine(120, 30, getWidth() - 50, 30);
                g.drawLine(50, 100, getWidth() - 50, 100);
                g.drawLine(50, 30, 50, 100);
                g.drawLine(getWidth() - 50, 30, getWidth() - 50, 100);
            }
        };
        jp.setLayout(null);

        initTable();

        JLabel jl1 = new JLabel("搜索条件");
        JLabel jl2 = new JLabel("图书名称:");
        JLabel jl3 = new JLabel("图书作者:");
        JLabel jl4 = new JLabel("图书类别:");
        JLabel jl5 = new JLabel("表单操作");
        JLabel jl6 = new JLabel("图书名称:");
        JLabel jl7 = new JLabel("图书作者:");
        JLabel jl8 = new JLabel("作者性别:");
        JLabel jl9 = new JLabel("图书价格:");
        JLabel jl10 = new JLabel("图书库存:");
        JLabel jl11 = new JLabel("图书类别:");
        JLabel jl12 = new JLabel("图书描述:");
        jtf1 = new JTextField();
        jtf2 = new JTextField();
        jtf3 = new JTextField();
        jtf4 = new JTextField();
        jtf5 = new JTextField();
        jtf6 = new JTextField();
        jta = new JTextArea(20, 20);
        jta.setLineWrap(true);
        JScrollPane j = new JScrollPane();
        jrb1 = new JRadioButton("男");
        jrb2 = new JRadioButton("女");
        ButtonGroup bg = new ButtonGroup();
        bg.add(jrb1);
        bg.add(jrb2);
        jrb1.setSelected(true);
        jcb1 = new JComboBox<>();
        jcb2 = new JComboBox<>();
        JButton jb1 = new JButton("查询");
        JButton jb2 = new JButton("借阅");
        JScrollPane jsp = new JScrollPane(table);

        jtf3.setEnabled(false);
        jtf4.setEnabled(false);
        jtf5.setEnabled(false);
        jtf6.setEnabled(false);
        jta.setEnabled(false);
        jcb2.setEnabled(false);
        jrb1.setEnabled(false);
        jrb2.setEnabled(false);

        jl1.setBounds(57, 20, 70, 20);
        jl2.setBounds(60, 55, 70, 20);
        jl3.setBounds(237, 55, 70, 20);
        jl4.setBounds(385, 55, 70, 20);
        jl5.setBounds(57, 320, 70, 20);
        jtf1.setBounds(125, 57, 100, 20);
        jtf2.setBounds(302, 57, 70, 20);
        jb1.setBounds(657, 42, 60, 20);
        jb2.setBounds(657, 72, 60, 20);
        jsp.setBounds(50, 125, 686, 180);
        jcb1.setBounds(455, 57, 180, 20);
        jcb2.setBounds(510, 397, 180, 20);
        jl6.setBounds(100, 355, 70, 20);
        jl7.setBounds(310, 355, 70, 20);
        jl8.setBounds(520, 355, 70, 20);
        jtf3.setBounds(170, 357, 130, 20);
        jtf4.setBounds(380, 357, 130, 20);
        jrb1.setBounds(590, 355, 40, 20);
        jrb2.setBounds(640, 355, 40, 20);
        jl9.setBounds(100, 395, 70, 20);
        jl10.setBounds(270, 395, 70, 20);
        jl11.setBounds(440, 395, 70, 20);
        jtf5.setBounds(170, 397, 90, 20);
        jtf6.setBounds(340, 397, 90, 20);
        jl12.setBounds(100, 438, 70, 20);
        j.setBounds(170, 440, 522, 120);

        fillBookTypeName();

        j.setViewportView(jta);
        jp.add(jl1);
        jp.add(jl2);
        jp.add(jl3);
        jp.add(jl4);
        jp.add(jl5);
        jp.add(jl6);
        jp.add(jl7);
        jp.add(jl8);
        jp.add(jl9);
        jp.add(jl10);
        jp.add(jl11);
        jp.add(jl12);
        jp.add(jtf1);
        jp.add(jtf2);
        jp.add(jtf3);
        jp.add(jtf4);
        jp.add(jtf5);
        jp.add(jtf6);
        jp.add(j);
        jp.add(jrb1);
        jp.add(jrb2);
        jp.add(jcb1);
        jp.add(jcb2);
        jp.add(jb1);
        jp.add(jb2);
        jp.add(jsp);

        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                bookMousePressed();
            }
        });

        jb1.addActionListener(this::searchAction);
        jb2.addActionListener(actionEvent ->lendAction(username));

        setContentPane(jp);
    }

    //查询按钮
    private void searchAction(ActionEvent e) {
        //表格先清空选择
        table.removeRowSelectionInterval(0, table.getRowCount() - 1);
        //模糊查找
        String strOfName = jtf1.getText().trim();
        String strOfAuthor = jtf2.getText().trim();
        //
        String strOfType = (String) jcb1.getSelectedItem();
        if ("".equals(strOfName) && "".equals(strOfAuthor) && "请选择……".equals(strOfType)) {
            JOptionPane.showMessageDialog(null, "请输入查询信息!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        List<Book> list = new ArrayList<>();
        if (!"".equals(strOfName)) {
            list.addAll(bookService.getBookListByBookName(strOfName));
        }
        if (!"".equals(strOfAuthor)) {
            list.addAll(bookService.getBookListByAuthor(strOfAuthor));
        }
        if (!"".equals(strOfType)) {
            list.addAll(bookService.getBookListByTypeName(strOfType));
        }
        if (list.size() == 0) {
            JOptionPane.showMessageDialog(null, "未查询到指定结果!");
            return;
        }
        for (Book book : list) {
            for (int j = 0; j < tdm.getRowCount(); j++) {
                //将查询到的book根据书名得到表中行数选择得到的行数
                if (book.getBookId().equals(table.getValueAt(j, 0))) {
                    table.addRowSelectionInterval(j, j);
                    break;
                }
            }
        }
        //随机展出一个查询到的book对象的信息
        Book book = list.get((int) ((Math.random() * 100) % list.size()));
        jtf3.setText(book.getBookName());
        jtf4.setText(book.getAuthor());
        jtf5.setText(String.valueOf(book.getPrice()));
        jtf6.setText(String.valueOf(book.getBookNum()));
        jta.setText(book.getBookDesc());
        if ("男".equals(book.getGender())) {
            jrb1.setSelected(true);
        } else {
            jrb2.setSelected(true);
        }
        jcb2.setSelectedItem(book.getTypeName());
        JOptionPane.showMessageDialog(null, "共查询到" + table.getSelectedRowCount() + "条结果!");
    }

    //借阅按钮
    private void lendAction(String username) {
        if (table.getSelectedRowCount() > 1) {
            JOptionPane.showMessageDialog(null, "不支持同时借阅多本图书!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        //获取选中行
        int row = table.getSelectedRow();
        if (row == - 1) { //没有选择
            JOptionPane.showMessageDialog(null, "请选择待借阅图书!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        if (Integer.parseInt(String.valueOf(table.getValueAt(row, 5))) == 0) {
            JOptionPane.showMessageDialog(null, "该书无库存!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        int isFlag = JOptionPane.showConfirmDialog(null, "是否借阅?");
        if (isFlag > 0) {
            return;
        }
        String bookName = (String) table.getValueAt(row, 1);
        //执行借阅
        bookService.lendBook(bookName); //库存减一
        //填入借阅信息
        lendInfoService.lendBook(new LendInfo(null, bookName, username, new Date(System.currentTimeMillis()), "未归还"));
        //更新数量
        Long newNum = (Long) table.getValueAt(row, 5) - 1;
        table.setValueAt(newNum, row, 5);
        jtf6.setText(String.valueOf(newNum));
        JOptionPane.showMessageDialog(null, "借阅成功!");
    }

    //监听鼠标点击事件
    private void bookMousePressed() {
        int row = table.getSelectedRow();
        jtf3.setText(String.valueOf(table.getValueAt(row, 1)));
        jtf4.setText(String.valueOf(table.getValueAt(row, 2)));
        jtf5.setText(String.valueOf(table.getValueAt(row, 4)));
        jtf6.setText(String.valueOf(table.getValueAt(row, 5)));
        String gender = String.valueOf(table.getValueAt(row, 3));
        if ("男".equals(gender)) {
            jrb1.setSelected(true);
        } else {
            jrb2.setSelected(true);
        }
        String typeName = String.valueOf(table.getValueAt(row, 6));
        jcb2.setSelectedItem(typeName);
        jta.setText(String.valueOf(table.getValueAt(row, 7)));
    }

    //初始化表格
    private void initTable() {
        //创建表格
        String[] columnNames = {"编号", "图书名称", "作者", "作者性别", "图书价格","图书库存", "图书类别", "图书描述"};
        Object[][] rowType = bookService.getAllBookToArray();
        tdm = new DefaultTableModel(rowType, columnNames);
        table = new JTable(tdm) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false; //不可编辑,但可以选择
            }
        };
        //
        DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();//单元格渲染器
        dtcr.setHorizontalAlignment(JLabel.CENTER);//居中显示
        table.setDefaultRenderer(Object.class, dtcr);//设置渲染器t

        table.getColumnModel().getColumn(0).setPreferredWidth(30);
        table.getColumnModel().getColumn(1).setPreferredWidth(100);
        table.getColumnModel().getColumn(2).setPreferredWidth(100);
        table.getColumnModel().getColumn(3).setPreferredWidth(50);
        table.getColumnModel().getColumn(4).setPreferredWidth(50);
        table.getColumnModel().getColumn(5).setPreferredWidth(50);
        table.getColumnModel().getColumn(6).setPreferredWidth(100);
        table.getColumnModel().getColumn(7).setPreferredWidth(180);

        table.getTableHeader().setReorderingAllowed(false); //不可改变列的位置
    }

    //初始化类别下拉菜单
    private void fillBookTypeName() {
        jcb1.addItem("请选择……");
        jcb2.addItem("请选择……");
        List<com.wang.bean.Type> types = typeService.getAllTypeToList();
        for (com.wang.bean.Type type : types) {
            jcb1.addItem(type.getTypeName());
            jcb2.addItem(type.getTypeName());
        }
    }
}

OwnLendInfoFrame.java

package com.wang.view.minorframe;

import com.wang.bean.LendInfo;
import com.wang.service.BookService;
import com.wang.service.LendInfoService;
import com.wang.service.impl.BookServiceImpl;
import com.wang.service.impl.LendInfoServiceImpl;
import com.wang.view.baseview.MinorFrame;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.sql.Date;

/**
 * 个人借阅信息界面
 */
public class OwnLendInfoFrame extends MinorFrame {

    private JTable table;
    private DefaultTableModel tdm;
    private final LendInfoService lendInfoService = new LendInfoServiceImpl();
    private final BookService bookService = new BookServiceImpl();

    public OwnLendInfoFrame(String username, boolean isFlag) {
        super("个人借阅信息", 500, 350);
        initFrame(username,isFlag);
    }

    private void initFrame(String username,boolean isFlag) {
        JPanel jp = new JPanel();
        jp.setLayout(null);

        initTable(username, isFlag);

        JScrollPane j = new JScrollPane(table);
        j.setBounds(30, 30, 425, 220);
        jp.add(j);

        if (isFlag) {
            JButton jb = new JButton("归还");
            jp.add(jb);
            jb.setBounds(360, 260, 60, 20);

            jb.addActionListener(actionEvent -> returnAction(username));
        }

        setContentPane(jp);
    }

    //归还按钮
    private void returnAction(String username) {
        if (table.getSelectedRowCount() > 1) {
            JOptionPane.showMessageDialog(null, "不支持同时归还多本图书!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        //获取选中行
        int row = table.getSelectedRow();
        if (row == - 1) { //没有选择
            JOptionPane.showMessageDialog(null, "请选择待归还图书!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }
        int isFlag = JOptionPane.showConfirmDialog(null, "是否归还?");
        if (isFlag > 0) {
            return;
        }
        int lendId = (int) table.getValueAt(row, 0);
        String bookName = (String) table.getValueAt(row, 1);
        Date lendDate = (Date) table.getValueAt(row, 2);
        bookService.returnBook(bookName); //库存加一
        lendInfoService.returnBook(new LendInfo(lendId, bookName, username, lendDate, new Date(System.currentTimeMillis()).toString())); //填入归还日期
        tdm.removeRow(row);
        JOptionPane.showMessageDialog(null, "归还成功!");
    }

    //初始化表格
    private void initTable(String username,boolean isFlag) {
        //创建表格
        String[] columnNames = {"借阅编号", "图书名称", "借阅时间", "归还时间"};
        Object[][] rowType;
        if(isFlag) {
             rowType = lendInfoService.getOwnLendInfo(username);
        } else{
             rowType = lendInfoService.getOwnReturnInfo(username);
        }
        tdm = new DefaultTableModel(rowType, columnNames);
        table = new JTable(tdm) {
            @Override
            public boolean isCellEditable(int row, int column) {
                return false; //不可编辑,但可以选择
            }
        };

        //
        DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();//单元格渲染器
        dtcr.setHorizontalAlignment(JLabel.CENTER);//居中显示
        table.setDefaultRenderer(Object.class, dtcr);//设置渲染器t

        table.getColumnModel().getColumn(0).setPreferredWidth(60);
        table.getColumnModel().getColumn(1).setPreferredWidth(205);
        table.getColumnModel().getColumn(2).setPreferredWidth(80);
        table.getColumnModel().getColumn(3).setPreferredWidth(80);

        table.getTableHeader().setReorderingAllowed(false); //不可改变列的位置
    }
}

RegisterFrame.java

package com.wang.view.minorframe;

import com.wang.bean.User;
import com.wang.service.UserService;
import com.wang.service.impl.UserServiceImpl;
import com.wang.utils.ImageData;
import com.wang.view.baseview.MinorFrame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/**
 * 用户注册界面
 */
public class RegisterFrame extends MinorFrame {

    private  JTextField jtf;
    private  JPasswordField jpf1, jpf2;
    private  JButton jb1, jb3;
    private final UserService userService = new UserServiceImpl();

    public RegisterFrame() {
        super("注册框", 500, 380);
        initFrame();
    }

    private void initFrame(){
        JPanel jp = new JPanel(){
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                ImageData.bg.paintIcon(this, g, 0, 0);
            }
        };
        jp.setLayout(null);

        JLabel jl1 = new JLabel();
        JLabel jl2 = new JLabel();
        JLabel jl3 = new JLabel();
        jl1.setText(" 用  户  名:");
        jl1.setIcon(ImageData.un);
        jl2.setText(" 密        码:");
        jl2.setIcon(ImageData.pw);
        jl3.setText(" 确认密码:");
        jl3.setIcon(ImageData.pw);
        jl1.setBounds(60, 45, 165, 25);
        jl2.setBounds(60, 100, 165, 25);
        jl3.setBounds(60, 155, 165, 25);
        jl1.setFont(new Font("方正舒体", Font.PLAIN, 25));
        jl2.setFont(new Font("方正舒体", Font.PLAIN, 25));
        jl3.setFont(new Font("方正舒体", Font.PLAIN, 25));


        jtf = new JTextField();
        jpf1 = new JPasswordField();
        jpf2 = new JPasswordField();
        jtf.setBounds(225, 48, 200, 25);
        jtf.setFont(new Font("方正舒体", Font.PLAIN, 25));
        jpf1.setBounds(225, 103, 200, 25);
        jpf1.setFont(new Font("方正舒体", Font.PLAIN, 25));
        jpf1.setEchoChar('\u2605');
        jpf2.setBounds(225, 158, 200, 25);
        jpf2.setFont(new Font("方正舒体", Font.PLAIN, 25));
        jpf2.setEchoChar('\u2605');

        jb1 = new JButton("确认");
        JButton jb2 = new JButton("取消");
        jb3 = new JButton("重置");
        jb1.setBounds(70, 230, 80, 40);
        jb1.setFont(new Font("方正舒体", Font.PLAIN, 20));
        jb2.setBounds(200, 230, 80, 40);
        jb2.setFont(new Font("方正舒体", Font.PLAIN, 20));
        jb3.setBounds(330, 230, 80, 40);
        jb3.setFont(new Font("方正舒体", Font.PLAIN, 20));

        jtf.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if (c == KeyEvent.VK_ENTER) {
                    jpf1.grabFocus();
                }
            }
        });

        jpf1.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if (c == KeyEvent.VK_ENTER) {
                    jpf2.grabFocus();
                }
            }
        });

        jpf2.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                char c = e.getKeyChar();
                if (c == KeyEvent.VK_ENTER) {
                    jb1.doClick();
                }
            }
        });

        jp.add(jl1);
        jp.add(jl2);
        jp.add(jl3);
        jp.add(jtf);
        jp.add(jpf1);
        jp.add(jpf2);
        jp.add(jb1);
        jp.add(jb2);
        jp.add(jb3);

        jb1.addActionListener(this::registerAction);
        jb2.addActionListener(this::cancelAction);
        jb3.addActionListener(this::resetAction);

        setContentPane(jp);
    }

    //注册按钮
    private void registerAction(ActionEvent e) {
        String username = jtf.getText().trim();
        String password1 = String.valueOf(jpf1.getPassword()).trim();
        String password2 = String.valueOf(jpf2.getPassword()).trim();
        if ("".equals(username)) {
            JOptionPane.showMessageDialog(null, "用户名不能为空!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if ("".equals(password1)) {
            JOptionPane.showMessageDialog(null, "密码不能为空!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if ("".equals(password2)) {
            JOptionPane.showMessageDialog(null, "请确认你的密码!", "警告", JOptionPane.WARNING_MESSAGE);
            return;
        }

        if (!password1.equals(password2)) {
            JOptionPane.showMessageDialog(null, "两次输入的密码不一致!", "警告", JOptionPane.WARNING_MESSAGE);
            jb3.doClick();
            return;
        }

        if ("root".equals(username)) {
            JOptionPane.showMessageDialog(null, "用户名已存在!", "错误", JOptionPane.ERROR_MESSAGE);
            jb3.doClick();
            return;
        }

        User user = new User(username, password1);

        boolean isSuccess = userService.registerUser(user);
        if (isSuccess) {
            JOptionPane.showMessageDialog(null, "注册成功!");
            this.dispose();
        } else {
            JOptionPane.showMessageDialog(null, "用户名已存在!", "错误", JOptionPane.ERROR_MESSAGE);
            jb3.doClick();
        }
    }

    //取消按钮
    private void cancelAction(ActionEvent e) {
        this.dispose();
    }

    //重置按钮
    private void resetAction(ActionEvent e) {
        jtf.setText("");
        jpf1.setText("");
        jpf2.setText("");
    }
}

八、结论

图书管理系统采用Java Swing框架,实现了图书、读者和借阅记录的基本管理功能。通过清晰的系统设计、直观的用户界面和严谨的测试,确保了系统的可用性和稳定性。未来的改进方向可以考虑引入更复杂的数据库系统、增加图书推荐算法等功能,提升系统的智能化和用户体验。

九、交流与联系

q:969060742 文档、代码、sql、程序资源

你可能感兴趣的:(java课设,java,ui,python)