图书管理系统 数据库课程实验设计

article/2025/11/9 10:07:21

本课设系软件工程大二学生作,拙笔狂言,恭请斧正。
开发工具:Eclipse 2020-12,Microsoft SQL server 2012
程序语言:Java

引 言
选题题目:图书管理系统
选题背景:
(1)图书室有各种图书,共一万多册。
(2)每种图书都有书名、书号(ISBN)、一名或多名作者(译者)、出版社、定价和内容简介。
(3)借书证记录有借阅者的姓名、所在单位、职业等。
(4)凭借书证借书,每次最多能借8本书。借书期限最长为30天。
需求功能:
(1)图书基本情况的录入、修改、删除等基本操作。
(2)实现借书功能。
(3)实现还书功能。
(4)实现对所有购进图书的分类查询和分类统计。
(5)能够按书名、作者等分类查询现有的图书的数量。
(6)对超期的情况能自动给出提示信息。
(7)图书管理员与借书者权限有区分。
选题意义:能够加深我们对数据库系统原理及程序设计的理论知识的理解和应用,通过设计实际的数据库系统课题,进一步熟悉数据库管理系统的操作技术,提高动手能力、分析实际项目和解决实际问题的能力,学习基本的数据库编程方法。

  1. 数据库概念模型
    1.1 需求分析
    1.1.1 图书管理员:
    ⑴查询和修改个人信息,如联系电话等。
    ⑵能对图书进行查询录入、修改、删除、分类统计等操作。
    ⑶查询、修改借书者的个人信息,包括借阅信息等。
    ⑷增加、删除借书者
    1.1.2 借书者:
    ⑴查询和修改个人信息,如联系电话等。
    ⑵查询图书信息和图书状态,即空闲在册或已借出。
    ⑶借书和还书。
    ⑷已借书籍已超时需找管理员帮助还书。
    每次最多能借8本书。借书期限最长为30天。
    1.2 概念结构设计
    1.2.1抽象出实体
    根据分析,图书管理系统主要包含图书管理员、借书者、图书三个实体。
    图书管理员:工号,姓名,性别,职称,联系电话
    借书者:借书证号,姓名,性别,联系电话,职业,所在单位
    图书:书号,书名,作者,出版社,定价,内容简介,状态,分类

数据字典:
(6个表)
在这里插入图片描述
表名:借书者
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(该表的作用是:在用户登录成功时,将该登录的账号、登录时间写入数据库的“操作账号”表,表示当前正在使用该系统的是某某用户;例如某用户修改个人信息时,系统通过筛选最新登录时间,来保证用户修改的是自己的信息。)

1.2.2局部E-R图(图略)
图书管理员与借书者:一名图书管理员可以管理多名借书者,一名借书者可以被多名图书管理员管理。因此两者之间是多对多的联系。

借书者与图书:一名借书者一次最多可以借8本图书,一本图书可以多次借给不同的借书者。因此两者之间是多对多的联系。

图书管理员与图书:一名图书管理员可以管理多本图书,一本图书可以被多名图书管理员管理。因此两者之间是多对多的联系。

1.2.3整体E-R图(图略,将局部E-R图结合起来即得)

2 数据库逻辑模型
2.1将E-R图转化为关系模式
图书管理员(工号,姓名,性别,职称,联系电话)是图书管理员实体对应的关系模式,其中工号是图书管理员关系的主键。
借书者(借书证号,姓名,性别,联系电话,职业,所在单位)是借书者实体对应的关系模式,其中借书证号是借书者关系的主键。
图书(书号,书名,作者,出版社,定价,内容简介,状态,分类)是图书实体对应的关系模式,其中书号是图书关系的主键。
借书(借书证号,书号,借书时间,姓名,书名)为联系“借书”对应的关系模式。因为借书是图书管理员、借书者和图书之间的多对多联系,因此图书管理员、借书者和图书的主属性及借书本身的属性“借书时间”,共同构成了借书关系模式的属性,其中借书证号、书号、借书时间的组合是借书关系的主键。
还书(借书证号,书号,借书时间,还书时间,姓名,书名)为联系“还书”对应的关系模式,因为还书是图书管理员、借书者和图书之间的多对多联系,因此图书管理员、借书者和图书的主属性及借书本身的属性“还书时间”,共同构成了还书关系模式的属性,其中借书证号、书号、借书时间、还书时间的组合是还书关系的主键。

3数据库物理设计与实施
3.1创建数据库
在这里插入图片描述
3.2创建和管理基本表
3.2.1创建基本表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 程序设计
4.1创建窗体
在这里插入图片描述

在这里插入图片描述
4.1.1管理员

在这里插入图片描述

在这里插入图片描述
图书查询
在这里插入图片描述
图书添加
1.操作失败一一书号与数据库已存的数据重复、状态非“已借出”或“空闲在册”、有空项
2.操作成功一一非上述情况
在这里插入图片描述
图书编辑
1.输入数据正常修改
2.输入非法的或不存在的书号一一“数据库中没有该图书”
3.书号置空一一“必填”
在这里插入图片描述
借书管理
1.管理员输入合法的、存在的书号,操作成功,将该图书的状态改为空闲在册,并移入还书记录
2.输入非法的、不存在的或空的书号,操作失败
3.点击“还书记录”,查看借记表
在这里插入图片描述
读者查询与编辑
删除
文本框输入的账号合法则“操作成功”,否则“操作失败”
在这里插入图片描述
修改/添加
修改
1.填合法借书证号可顺利执行;不填借书证号或填非法的借书证号则显示标签提示
2.性别限定“男”或“女”,出错无法执行显示标签提示
增加
1.操作成功–每个项目都填写,且性别限定了“男”或“女”
2.操作失败–有空项或性别没有限定,显示“每个项目都必填” 在这里插入图片描述

修改个人信息
在这里插入图片描述
修改密码
1.三个密码框都输入合法的密码一一“修改成功”
2.三个密码框任意一个输入非法的密码一一“输入错误,请校检”
在这里插入图片描述

	4.1.2借书者

在这里插入图片描述
图书查询
在这里插入图片描述

图书借阅
操作成功
1.输入“空闲在册”的书号,且在借图书不超过8本
操作失败
1.输入“已借出”的、不存在的或空的书号
2.在借图书已达到8本
在这里插入图片描述

图书归还
操作成功
1.输入在借的书号,且借书时间不超过30天
操作失败
1.输入不在借的、非法的或空的书号
2.输入在借的书号,但借书时间已超过30天
在这里插入图片描述

修改个人信息
在这里插入图片描述

修改密码
在这里插入图片描述

4.2连接数据库
package Testv1;import java.sql.*;public class Testv10 {public static void main(String[] args) {// TODO Auto-generated method stub{String driverName="com.microsoft.sqlserver.jdbc.SQLServerDriver";String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";//个人数据库名称String userName="sa";		//个人用户名String userPwd="QWEASDZXC000000";			//个人密码try{Class.forName(driverName);System.out.println("加载驱动成功!");}catch(Exception e){e.printStackTrace();System.out.println("加载驱动失败!");}try{Connection dbConn=DriverManager.getConnection(dbURL,userName,userPwd);System.out.println("连接数据库成功!");}catch(Exception e){e.printStackTrace();System.out.print("SQL Server连接失败!");}		}

完整演示视频
https://www.bilibili.com/video/BV1C34y1H7NH?share_source=copy_web&vd_source=532622d453c2953506dbf894f3498777
添加链接描述:系统使用演示

图书查询

package Testv1;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;public class BookFind extends JFrame {private JPanel contentPane;private JTextField textField_2;private JTextField textField_3;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {BookFind frame = new BookFind();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public BookFind() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 581, 391);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);textField_2 = new JTextField();textField_2.setBounds(23, 7, 139, 21);contentPane.add(textField_2);textField_2.setColumns(10);JButton btnNewButton_2 = new JButton("\u8FD4\u56DE");btnNewButton_2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {setVisible(false);}});btnNewButton_2.setBounds(462, 319, 93, 23);contentPane.add(btnNewButton_2);JLabel lblNewLabel = new JLabel("\u5171\u6709\uFF08\u672C\uFF09");lblNewLabel.setBounds(23, 323, 70, 15);contentPane.add(lblNewLabel);textField_3 = new JTextField();textField_3.setBounds(82, 320, 66, 21);contentPane.add(textField_3);textField_3.setColumns(10);JPanel panel = new JPanel();panel.setBounds(23, 38, 532, 271);contentPane.add(panel);JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(10, 46, 300, 150);panel.add(scrollPane);String []Name = {"书号", "书名", "作者", "出版社","定价","内容简介","状态","分类"};Object [][] rowData = new Object [100][8];           JTable table = new JTable(rowData, Name);table.setBounds(297, 179, -279, -124);table.setRowHeight(30);                          //设置行高table.getColumnModel().getColumn(0).setPreferredWidth(110); //第一列列宽table.setPreferredScrollableViewportSize(new Dimension(500 ,300));    //设置滚动面板视口大小(超过该大小的行数据需要拖动滚动条)scrollPane.setViewportView(table);//把数据库表的内容显示到页面的表格try {String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);state = dbConn.createStatement();String sql0 = "select * from 图书";ResultSet rs = state.executeQuery(sql0);Statement stateCnt = dbConn.createStatement();String sql1 = "select count(*) from 图书";ResultSet rs_1 = stateCnt.executeQuery(sql1);while(rs_1.next()) {textField_3.setText(rs_1.getString(1));}//统计int i = 0;while(rs.next() && i<rowData.length) {rowData[i][0] = rs.getString(1);rowData[i][1] = rs.getString(2);   rowData[i][2] = rs.getString(3);   rowData[i][3] = rs.getString(4);   rowData[i][4] = rs.getString(5);rowData[i][5] = rs.getString(6);rowData[i][6] = rs.getString(7);rowData[i][7] = rs.getString(8);i++;}dbConn.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}String []item = new String[] {"书号","书名","作者","出版社","定价","内容简介","状态","分类"};JComboBox comboBox = new JComboBox(item);comboBox.addItemListener(new ItemListener() {//不必要监听器public void itemStateChanged(ItemEvent e) {//textField_2.setText(e.getItem());}});comboBox.setBounds(172, 6, 139, 23);contentPane.add(comboBox);JButton btnNewButton = new JButton("\u67E5\u8BE2");btnNewButton.addActionListener(new ActionListener() {		//查询public void actionPerformed(ActionEvent e) {String str = new String(textField_2.getText());					//列元素String str_1 = new String((String) comboBox.getSelectedItem());//列名//从文本框下拉列表读取要查询的分类try {String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);state = dbConn.createStatement();String sql0 = "select * from 图书 where "+str_1+"='"+str+"'" ;ResultSet rs = state.executeQuery(sql0);		Statement stateCnt = dbConn.createStatement();String sql1 = "select count(*) from 图书 where "+str_1+"='"+str+"'"; //填入列名,	列元素ResultSet rs_1 = stateCnt.executeQuery(sql1);int n = 0;while(rs_1.next()) {textField_3.setText(rs_1.getString(1));n= Integer.parseInt(rs_1.getString(1));}//统计数量int i = 0;while(rs.next() && i<rowData.length) {	//显示到表格中rowData[i][0] = rs.getString(1);rowData[i][1] = rs.getString(2);   rowData[i][2] = rs.getString(3);   rowData[i][3] = rs.getString(4);   rowData[i][4] = rs.getString(5);rowData[i][5] = rs.getString(6);rowData[i][6] = rs.getString(7);rowData[i][7] = rs.getString(8);i++;}while(i>=n && i<rowData.length) {rowData[i][0] = null;rowData[i][1] = null;rowData[i][2] = null;rowData[i][3] = null;rowData[i][4] = null;rowData[i][5] = null;rowData[i][6] = null;rowData[i][7] = null;i++;}//刷新TableModel tml = new DefaultTableModel(rowData,Name);table.setModel(tml);dbConn.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});btnNewButton.setBounds(363, 6, 93, 23);contentPane.add(btnNewButton);JButton btnNewButton_1 = new JButton("\u53D6\u6D88");btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);state = dbConn.createStatement();String sql0 = "select * from 图书";ResultSet rs = state.executeQuery(sql0);Statement stateCnt = dbConn.createStatement();String sql1 = "select count(*) from 图书";ResultSet rs_1 = stateCnt.executeQuery(sql1);while(rs_1.next()) {textField_3.setText(rs_1.getString(1));}//统计int i = 0;while(rs.next() && i<rowData.length) {rowData[i][0] = rs.getString(1);rowData[i][1] = rs.getString(2);   rowData[i][2] = rs.getString(3);   rowData[i][3] = rs.getString(4);   rowData[i][4] = rs.getString(5);rowData[i][5] = rs.getString(6);rowData[i][6] = rs.getString(7);rowData[i][7] = rs.getString(8);i++;}TableModel tml = new DefaultTableModel(rowData,Name);table.setModel(tml);dbConn.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});btnNewButton_1.setBounds(462, 7, 93, 23);contentPane.add(btnNewButton_1);}
}
**4.1.2出现的问题及做法**1.用户通过个人账号使用该系统,则用户的操作都绑定在该账号,如修改信息时,只能修改本账号信息而不能修改他人信息。对此,我的做法是:在用户登录成功时,将登录的账号、登录时间写入数据库的“操作账号”表,表示当前正在使用该系统的是某某用户。

管理员登录监听器

JButton btnNewButton_1 = new JButton("\u767B\u5F55");btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String strP = new String(passwordField.getPassword());//密码String strT = new String(textField.getText());//工号String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;String sql = "select 工号,密码 from 图书管理员";try {Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);state = dbConn.createStatement();ResultSet rs = state.executeQuery(sql);while (rs.next()) {//System.out.println(rs.getString(1)+" "+rs.getString(2));if(strT.equals(rs.getString(1)) && strP.equals(rs.getString(2))) {Calendar c = Calendar.getInstance();M_mainPage mPage = new M_mainPage();mPage.setVisible(true);lblNewLabel_3.setVisible(false);PreparedStatement pst = null;pst = dbConn.prepareStatement("insert into 操作账号 values(?,?)");//记录当前正在使用的用户pst.setString(1, strT);//插入账号pst.setTimestamp(2, new Timestamp(c.getTimeInMillis()));//插入时间戳pst.addBatch();pst.executeBatch();lblNewLabel_3.setVisible(false);}else {lblNewLabel_3.setVisible(true);}}dbConn.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});

修改个人信息监听器

JButton btnNewButton_1 = new JButton("\u4FDD\u5B58");		//保存修改信息btnNewButton_1.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String name = new String(textField.getText());//姓名String work = new String(textField_2.getText());//职称String sex = new String(textField_1.getText());//性别String phone = new String(textField_3.getText());//电话号码String num = new String();//工号String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;try {Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);state = dbConn.createStatement();//通过获得“操作账号”表的最后一行(最新一行)得到当前正在使用系统的用户是......String sql0 = "select top 1* from 操作账号 order by 时间 desc";ResultSet rs = state.executeQuery(sql0);		//最后一行String s1 = new String();while(rs.next()) {s1 = rs.getString(1);}num = s1;//工号PreparedStatement pst = null;//如果文本框内容不为空,则据此修改数据库表内容if (name.equals("") == false) {String sql = "update 图书管理员 set 姓名=? where 工号=?";pst = dbConn.prepareStatement(sql);pst.setString(1, name);pst.setString(2, num);//工号是当前登录的账号,来自“操作账号”表pst.executeUpdate();}if(sex.equals("") == false) {//性别限定在“男”、“女”,出错时通过标签显示告知使用者try {String sql = "update 图书管理员 set 性别=? where 工号=?";pst = dbConn.prepareStatement(sql);pst.setString(1, sex);pst.setString(2, num);pst.executeUpdate();lblNewLabel_4.setVisible(false);}catch(Exception ee) {// TODO Auto-generated catch blockee.printStackTrace();lblNewLabel_4.setVisible(true);lblNewLabel_5.setVisible(false);}}if(work.equals("") == false) {String sql = "update 图书管理员 set 职称=? where 工号=?";pst = dbConn.prepareStatement(sql);pst.setString(1, work);pst.setString(2, num);pst.executeUpdate();}if(phone.equals("") == false) {String sql = "update 图书管理员 set 联系电话=? where 工号=?";pst = dbConn.prepareStatement(sql);pst.setString(1, phone);pst.setString(2, num);pst.executeUpdate();}Statement stateCnt = dbConn.createStatement();String sql1 = "select * from 图书管理员 where 工号='"+num+"'";ResultSet rs_1 = stateCnt.executeQuery(sql1);int i = 0;while(rs_1.next() && i<rowData.length) {rowData[i][0] = rs_1.getString(1);rowData[i][1] = rs_1.getString(2);   rowData[i][2] = rs_1.getString(3);   rowData[i][3] = rs_1.getString(4);   rowData[i][4] = rs_1.getString(5);i++;}//刷新表格TableModel tml = new DefaultTableModel(rowData,Name);table.setModel(tml);pst.close();dbConn.close();if(lblNewLabel_4.isVisible()) {lblNewLabel_5.setVisible(false);}else {lblNewLabel_5.setVisible(true);}} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});
**4.3.0增删改查**

PreparedStatement pst = null;
pst = dbConn.prepareStatement("insert into 图书 values(?,?,?,?,?,?,?,?)");
pst.setString(1, num);//书号
pst.setString(2, name);//书名
pst.setString(3, writer);//作者
pst.setString(4, publish);//出版社
pst.setString(5, price);//定价
pst.setString(6, intro);//内容简介
pst.setString(7, status);//状态
pst.setString(8, cla);//分类
pst.addBatch();
pst.executeBatch();
dbConn.close();

String sql0 = "delete from 图书 where 书号= ?";PreparedStatement pst = dbConn.prepareStatement(sql0);pst.setString(1, num);//书号pst.addBatch();pst.executeBatch();lblNewLabel_4.setVisible(true);//显示删除成功dbConn.close();

PreparedStatement pst = null;
if (name.equals("") == false) {String sql = "update 图书 set 书名=? where 书号=?";pst = dbConn.prepareStatement(sql);pst.setString(1, name);pst.setString(2, num);							pst.executeUpdate();
}

try {String dbURL="jdbc:sqlserver://localhost:1433;DatabaseName=LibraryManagement";String userName="sa";String userPwd="QWEASDZXC000000";Connection dbConn = null;Statement state = null;Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");dbConn = DriverManager.getConnection(dbURL,userName,userPwd);
//连接数据库state = dbConn.createStatement();String sql0 = "select * from 图书";ResultSet rs = state.executeQuery(sql0);Statement stateCnt = dbConn.createStatement();String sql1 = "select count(*) from 图书";ResultSet rs_1 = stateCnt.executeQuery(sql1);while(rs_1.next()) {textField_3.setText(rs_1.getString(1));}//统计总数int i = 0;//查询结果显示到Java表格组件while(rs.next() && i<rowData.length) {rowData[i][0] = rs.getString(1);rowData[i][1] = rs.getString(2);   rowData[i][2] = rs.getString(3);   rowData[i][3] = rs.getString(4);   rowData[i][4] = rs.getString(5);rowData[i][5] = rs.getString(6);rowData[i][6] = rs.getString(7);rowData[i][7] = rs.getString(8);i++;}dbConn.close();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}

完整源代码

通过百度网盘分享的文件:图书管理系统V1…
链接:https://pan.baidu.com/s/1NQczvOX0n0_g0pDx3iiIXw 提取码:po48复制这段内容打开「百度网盘APP 即可获取」


http://chatgpt.dhexx.cn/article/h7xhEnE5.shtml

相关文章

图书馆管理系统(数据库版)

图书馆管理系统&#xff08;数据库版&#xff09; 目录&#xff1a; 图书馆管理系统&#xff08;数据库版&#xff09;项目框架项目分包数据库列表代码分析工具包所用到的接口&#xff1a; 分享一波&#xff1a;总结&#xff1a; 项目框架 项目分包 上面为本次项目的分包建包示…

图书管理系统(数据库)

一、项目分析 1、项目功能分析 项目功能模块主要分为三个模块&#xff0c;登录模块、管理员模块、操作员模块。 登录模块包括登录功能&#xff0c;注册功能&#xff0c;登录日志功能&#xff0c;修改密码以及找回密码。 管理员模块包括工作日志功能、图书借阅金额设定、操作员…

数据库系统设计大作业:图书馆管理系统

数据库系统设计大作业&#xff1a;图书馆管理系统 参考https://blog.csdn.net/dimo__/article/details/84936685中的设计思路&#xff0c;设计了本系统 1 需求分析 针对图书馆的图书管理系统数据库设计&#xff0c;分别对图书馆的读者、一般工作人员和部门负责人进行详细地分…

简单用数据库实现图书管理系统

目录 一、摘要 2、基本功能 二、前言 三、主体 3.1需求分析 3.1.1 数据需求分析 3.1.2 功能需求分析 3.2概要设计 3.2.1 数据字典 3.2.2 ERD&#xff08;实体关系图&#xff09; 3.2.3 DFD数据流图 3.3 逻辑设计 3.3.1 E-R模型向关系模型的转换规则 3.3.2 E-R图转…

MySQL数据库期末项目 图书馆管理系统

1 项目需求分析 1.1 项目名称 图书馆管理系统 1.2 项目功能 在以前大多部分图书馆都是由人工直接管理&#xff0c;其中每天的业务和操作流程非常繁琐复杂&#xff0c;纸质版的登记信息耗费了大量的人力物力。因此图书馆管理系统应运而生&#xff0c;该系统采用智能化设计&#…

tar文件是什么?怎么解压?

例如在使用coco数据集的时候&#xff0c;下载下来是这样的两个文件&#xff1a; 恕我无知&#xff0c;之前完全没见过这种格式的文件。 经过一番咨询&#xff0c;原来是一种压缩文件&#xff0c;里面藏了很多内容&#xff0c;看它的大小就能猜到。 这种文件一般的压缩软件貌似…

常用的tar解压命令总结

&#xff8d;^ヽ&#xff64;  /⌒&#xff64;  ,   |  &#xffe3;7  (⌒r⌒7/   レ   &#xff3c;/&#xffe3;&#xff3c;&#xff63; &#xff3f;/         { _&#xff8c; ●       ゝ _人   ο  ●  ナ   ト&#xff64;&…

linux中.tar文件怎么解压

linux中.tar文件怎么解压 1、打包压缩tar -cvf etc.tar /app/etc #打包 tar -zcvf pack.tar.gz pack/ #打包压缩为一个.gz格式的压缩包 tar -jcvf pack.tar.bz2 pack/ #打包压缩为一个.bz2格式的压缩包 tar -Jcvf pack.tar.xz pack/ #打包压缩为一个.xz格式的压缩包 2、解…

Linux 解压tar

Linux系统中tar压缩包怎么解压&#xff1f;Linux系统中有一个tar压缩包格式的文件需要解压&#xff0c;但是linux系统中没有找到tar的命令&#xff0c;该怎么办呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 在Linux的默认的版本中不是所有的命令…

解压缩命令tar zip rar

文章目录 打包和压缩的概念tar常用独立命令打包压缩查阅tar包内有哪些文件解压缩到指定目录(默认是当前目录)只将tar内的部分文件解压出来其他命令(其他) zip和unziprar和unrar 打包和压缩的概念 tar命令可以为linux的文件和目录创建档案 利用tar&#xff0c;可以为某一特定文件…

【hardware】什么是H桥电路?

前言 初玩智能车的小伙伴肯定会涉及到驱动电机正反转的时候&#xff0c;那么该如何控制智能车呢&#xff1f;这就要讲到双H桥了&#xff0c;让我来给你们分析吧&#xff01; 1.三极管 讲到双H桥&#xff0c;那么首先得介绍两种三极管&#xff0c;S8550&#xff08;PNP型&#x…

关于H桥的理解和应用

很多用电器对电源极性要求不高&#xff0c;如点灯&#xff0c;正反接都可以工作&#xff0c;而且现象都差不多&#xff0c;也有的用电器对电源极性敏感&#xff0c;而且接反了就不工作&#xff0c;例如多数半导体器件&#xff0c;LED等&#xff1b;但也有的用电器对电源极性敏感…

H桥驱动电路原理【转】

H桥驱动电路原理 一、H桥驱动电路 图4.12中所示为一个典型的直流电机控制电路。电路得名于“H桥驱动电路”是因为它的形状酷似字母H。4个三极管组成H的4条垂直腿&#xff0c;而电机就是H中的横杠&#xff08;注意&#xff1a;图4.12及随后的两个图都只是示意图&#xff0c;而…

STM32F1基于H桥的电机控制程序分析

这里写自定义目录标题 N-MOS H桥结构控制原理MOS驱动调速的实现控制程序编写 N-MOS H桥结构 控制原理 N-MOS的G极与S级的电压差大于某一值的时候&#xff0c;D极和S极之间导通&#xff0c;DS电阻极小&#xff0c;可看作导线&#xff0c;否则DS之间视为断路。 因此有以下控制方…

一份很用心的H桥驱动扫盲教程

什么是H桥&#xff1f; H桥是一个比较简单的电路&#xff0c;通常它会包含四个独立控制的开关元器件&#xff08;例如MOS-FET&#xff09;,它们通常用于驱动电流较大的负载&#xff0c;比如电机&#xff0c;至于为什么要叫H桥&#xff08;H-Bridge&#xff09;&#xff0c;因为…

电机控制-H 桥电路 控制方式简单解析

声明&#xff1a;本片文章来自互联网&#xff0c;侵删 电机控制-H 桥电路 控制方式简单解析 什么是H桥一. 开关状态1.1、正转1.2、反转1.3、调速 二. 停止状态2.1 第一种停止方式2.1 第二种停止方式 什么是H桥 H桥是一个比较简单的电路&#xff0c;通常它会包含四个独立控制的…

PWM驱动MOS管H桥电路

H桥是一个典型的直流电机控制电路&#xff0c;因为它的电路形状酷似字母H&#xff0c;故得名与“H桥”。4个三极管组成H的4条垂直腿&#xff0c;而电机就是H中的横杠&#xff08;注意&#xff1a;图中只是简略示意图&#xff0c;而不是完整的电路图&#xff0c;其中三极管的驱动…

基于STM32的电机--直流有刷电机H桥驱动的不同模式分析

文章目录 直流电机驱动设计1.电机驱动硬件配置2.电机驱动电路分析简单正向电路最简单的电机正反转电路H桥电路分析受限单极模式单极模式双极模式 减速电机的重要参数 直流电机驱动设计 1.电机驱动硬件配置 直流电机旋转&#xff1a;给电机提供两根线&#xff0c;以提供电压正…

深入浅出H桥驱动电路

什么是H桥? H桥是一个比较简单的电路,通常它会包含四个独立控制的开关元器件(例如MOS-FET),它们通常用于驱动电流较大的负载,比如电机,至于为什么要叫H桥(H-Bridge),因为长得比较像字母H,具体如下图所示; 这里有四个开关元器件Q1,Q2,Q3,Q4,另外还有一个直流电机…

mos管h桥电机驱动电路与设计原理图-KIA MOS管 (kiaic.com)

来源&#xff1a; mos管h桥电机驱动电路与设计原理图-KIA MOS管 (kiaic.com) 一、mos管H桥电路 图1中所示为一个典型的直流电机控制电路。 电路得名于“H桥驱动电路”是由于它的外形酷似字母H。4个三极管组成H的4条垂直腿&#xff0c;而电机就是H中的横杠&#xff08;留意&…