javaSwing图书管理系统

一、 引言

图书管理系统是一个用于图书馆或书店管理图书信息、借阅记录和读者信息的应用程序。本系统使用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;

六、程序截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、代码

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(){@Overrideprotected 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() {@Overridepublic 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) {@Overridepublic boolean isCellEditable(int row, int column) {return false; //不可编辑,但可以选择}};//DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();//单元格渲染器dtcr.setHorizontalAlignment(JLabel.CENTER);//居中显示table.setDefaultRenderer(Object.class, dtcr);//设置渲染器ttable.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) {@Overridepublic boolean isCellEditable(int row, int column) {return false; //不可编辑,但可以选择}};//DefaultTableCellRenderer dtcr = new DefaultTableCellRenderer();//单元格渲染器dtcr.setHorizontalAlignment(JLabel.CENTER);//居中显示table.setDefaultRenderer(Object.class, dtcr);//设置渲染器ttable.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(){@Overrideprotected 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() {@Overridepublic void keyTyped(KeyEvent e) {char c = e.getKeyChar();if (c == KeyEvent.VK_ENTER) {jpf1.grabFocus();}}});jpf1.addKeyListener(new KeyAdapter() {@Overridepublic void keyTyped(KeyEvent e) {char c = e.getKeyChar();if (c == KeyEvent.VK_ENTER) {jpf2.grabFocus();}}});jpf2.addKeyListener(new KeyAdapter() {@Overridepublic 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、程序资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/370218.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matplotlib Artist 1 概览

Matplotlib API中有三层 matplotlib.backend_bases.FigureCanvas&#xff1a;绘制区域matplotlib.backend_bases.Renderer&#xff1a;控制如何在FigureCanvas上绘制matplotlib.artist.Artist&#xff1a;控制render如何进行绘制 开发者95%的时间都是在使用Artist。Artist有两…

【C语言】自定义类型:联合和枚举

前言 前面我们学习了一种自定义类型&#xff0c;结构体&#xff0c;现在我们学习另外两种自定义类型&#xff0c;联合 和 枚举。 目录 一、联合体 1. 联合体类型的声明 2. 联合体的特点 3. 相同成员联合体和结构体对比 4. 联合体大小的计算 5. 用联合体判断当前机…

常见算法和Lambda

常见算法和Lambda 文章目录 常见算法和Lambda常见算法查找算法基本查找&#xff08;顺序查找&#xff09;二分查找/折半查找插值查找斐波那契查找分块查找扩展的分块查找&#xff08;无规律的数据&#xff09; 常见排序算法冒泡排序选择排序插入排序快速排序递归快速排序 Array…

hdu物联网硬件实验2 GPIO亮灯

学院 班级 学号 姓名 日期 成绩 实验题目 GPIO亮灯 实验目的 点亮三个灯闪烁频率为一秒 硬件原理 无 关键代码及注释 const int ledPin1 GREEN_LED; // the number of the LED pin const int ledPin2 YELLOW_LED; const int ledPin3 RED…

githup开了代理push不上去

你们好&#xff0c;我是金金金。 场景 git push出错 解决 cmd查看 git config --global http.proxy git config --global https.proxy 如果什么都没有&#xff0c;代表没设置全局代理&#xff0c;此时如果你开了代理&#xff0c;则执行如下&#xff0c;设置代理 git con…

【深度学习】图形模型基础(5):线性回归模型第四部分:预测与贝叶斯推断

1.引言 贝叶斯推断超越了传统估计方法&#xff0c;它包含三个关键步骤&#xff1a;结合数据和模型形成后验分布&#xff0c;通过模拟传播不确定性&#xff0c;以及利用先验分布整合额外信息。本文将通过实际案例阐释这些步骤&#xff0c;展示它们在预测和推断中的挑战和应用。…

CSS中 实现四角边框效果

效果图 关键代码 border-radius:10rpx ;background: linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) left top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) right top,linear-gradient(#fff, #fff) left bottom,linear-gradient(…

12 Dockerfile详解

目录 1. Dockerfile 2. Dockerfile构建过程 2.1. Dockerfile编写规则&#xff1a; 2.2. Docker执行Dockerfile的大致流程 2.3. 总结 3. Dockerfile指令 3.1. FROM 3.2. MAINTAINER 3.3. RUN 3.4. EXPOSE 3.5. WORKDIR 3.6. USER 3.7. ENV 3.8. VOLUME 3.9. ADD …

电商利器——淘宝商品月销量API接口解析

在电商时代&#xff0c;数据就是金钱。对于淘宝商家而言&#xff0c;掌握商品的销量数据无异于掌握了市场的脉搏。如今&#xff0c;淘宝商品月销量API接口的出现&#xff0c;联讯数据让商家如虎添翼&#xff0c;能够更加精准地把握市场动态&#xff0c;优化商品策略。 淘宝商…

利用redis数据库管理代理库爬取cosplay网站-cnblog

爬取cos猎人 数据库管理主要分为4个模块&#xff0c;代理获取模块&#xff0c;代理储存模块&#xff0c;代理测试模块&#xff0c;爬取模块 cos猎人已经倒闭&#xff0c;所以放出爬虫源码 api.py 为爬虫评分提供接口支持 import requests import concurrent.futures import …

鸿蒙开发设备管理:【@ohos.vibrator (振动)】

振动 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 imp…

查询某个县区数据,没有的数据用0补充。

加油&#xff0c;新时代打工人&#xff01; 思路&#xff1a; 先查出有数据的县区&#xff0c;用县区编码判断&#xff0c;不存在县区里的数据。然后&#xff0c;用union all进行两个SQL拼接起来。 SELECTt.regionCode,t.regionName,t.testNum,t.sampleNum,t.squareNum,t.crop…

linux主机(A)通过私钥登录linux主机(B)

1.登录B主机&#xff0c;先在B主机执行 ssh-keygen 2.设置id_rsa的权限 chmod 600 id_rsa 3.将生成的id_rsa.pub导入到authorized_keys ssh-copy-id -i ./id_rsa.pub root127.0.0.1 4.将id_rsa复制到A主机 scp id_rsa_123 root1.1.1.A:/home/ 5.登录到A主机使用私钥登录 因…

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多&#xff0c;也很琐碎&#xff0c;特别是一些位、寄存器以及相关作用等&#xff0c;非常难以记忆。因此复习时将知识点整理在了一起做成思维导图&#xff0c;希望对大家有所帮助。内容不是很多&#xff0c;可能有些没覆盖全&…

PySide6 实现资源的加载:深入解析与实战案例

目录 1. 引言 2. 加载内置资源 3. 使用自定义资源文件&#xff08;.qrc&#xff09; 创建.qrc文件 编译.qrc文件 加载资源 4. 动态加载UI文件 使用Qt Designer设计UI 加载UI文件 5. 注意事项与最佳实践 6. 结论 在开发基于PySide6的桌面应用程序时&…

Qt 基础组件速学 事件过滤器

学习目标&#xff1a;理解事件过滤器 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; Qt 提供了事件过滤器的机制,允许我们在事件到达目标对象之前对事件进行拦截和处理。这在以下情况下非常有用: 全局事件处理: 我们可以在应用程序级别安装一个事件过…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序&#xff0c;并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样&#xff0c;预示着他除了运行监视、故障处理外&…

Android在framework层添加自定义服务的流程

环境说明 ubuntu16.04android4.1java version “1.6.0_45”GNU Make 3.81gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) 可能有人会问&#xff0c;现在都2024了怎么还在用android4版本&#xff0c;早都过时了。确实&#xff0c;现在最新的都是Android13、And…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果&#xff0c;因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测&#xff1a;人脸关键点检测…