Java Swing + MySQL圖書借閱管理系統

系列文章目錄

Java Swing + MySQL 圖書管理系統
Java Swing + MySQL 圖書借閱管理系統


文章目錄

  • 系列文章目錄
  • 前言
  • 一、項目展示
  • 二、部分代碼
    • 1.Book
    • 2.BookDao
    • 3.DBUtil
    • 4.BookAddInternalFrame
    • 5.Login
  • 三、配置


前言

項目是使用Java swing開發,界面設計比較簡潔、適合作為Java課設設計以及學習技術使用。

  • 語言:Java
  • 界面:JavaSwing
  • 數據庫:MySQL 8.x

具體功能如下:
1、基礎功能
(1)系統登錄功能:用戶可以通過用戶名和密碼登錄系統。
(2)圖書分類管理功能:管理員可以對于圖書的類別進行增、刪、改、查操作。
(3)圖書信息管理功能:能夠增、刪圖書,修改圖書名稱、類別、價格等信息。
(4)圖書借閱管理功能:包括圖書借出和圖書歸還等操作,設計功能時需要考慮逾期情況的判別和處理。
2、可選加分功能
(1)借閱記錄查詢功能:學生可以查看自己在某時間段之內的借閱記錄;管理員可以按照學號查詢學生的借閱記錄。(ps:只有管理員能夠增刪改查圖書內容,用戶只有查找書的信息的權限)

一、項目展示

image-20240527010008617

image-20240527010154137

image

image-20240527010339195

image-20240527010419245

image-20240527010455653

image-20240527010518137

image-20240527010632545

image-20240527010649613
image-20240527011013968

二、部分代碼

1.Book

代碼如下(示例):

package entity;/*** BookManagementSystem* 圖書** @author PlutoCtx* @version 2024/5/26 1:07* @email ctx195467@163.com* @since JDK17*/public class Book {/*** 圖書id*/private int id;/*** 書名*/private String bookName;/*** 作者*/private String author;/*** 圖書數量*/private int number;/*** 價格*/private Float price;/*** 圖書類別*/private Integer bookTypeId;/*** 圖書類別*/private String bookTypeName;/*** 描述*/private String bookDesc;public Book(String bookName, String author, Integer number, Float price, Integer bookTypeId, String bookDesc) {super();this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book(int id, String bookName, String author, Integer number, Float price, Integer bookTypeId, String bookDesc) {super();this.id = id;this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookDesc = bookDesc;}public Book(String bookName, String author, Integer bookTypeId) {super();this.bookName = bookName;this.author = author;this.bookTypeId = bookTypeId;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getNumber() {return number;}public void setNumber(int number) {this.number = number;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}public Integer getBookTypeId() {return bookTypeId;}public void setBookTypeId(Integer bookTypeId) {this.bookTypeId = bookTypeId;}public String getBookTypeName() {return bookTypeName;}public void setBookTypeName(String bookTypeName) {this.bookTypeName = bookTypeName;}public String getBookDesc() {return bookDesc;}public void setBookDesc(String bookDesc) {this.bookDesc = bookDesc;}public Book() {}public Book(int id,String bookName,String author,Integer number,Float price,Integer bookTypeId,String bookTypeName,String bookDesc) {this.id = id;this.bookName = bookName;this.author = author;this.number = number;this.price = price;this.bookTypeId = bookTypeId;this.bookTypeName = bookTypeName;this.bookDesc = bookDesc;}}

2.BookDao

代碼如下(示例):

package dao;import entity.Book;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;/*** BookManagementSystem** @author PlutoCtx* @version 2024/5/26 9:27* @email ctx195467@163.com* @since JDK17*/public class BookDao {/*** 添加圖書* @param connection    連接數據庫* @param book  書籍* @return  preparedStatement.executeUpdate(),int* @throws Exception    how do I know*/public int add(Connection connection, Book book)throws Exception{String sql = "INSERT INTO book VALUES (null, ?, ?, ?, ?, ?, ?)";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, book.getBookName());preparedStatement.setString(2, book.getAuthor());preparedStatement.setInt(3, book.getNumber());preparedStatement.setFloat(4, book.getPrice());preparedStatement.setInt(5, book.getBookTypeId());preparedStatement.setString(6, book.getBookDesc());return preparedStatement.executeUpdate();}/*** 查找書籍* @param connection    連接數據庫* @param book  書籍* @return  preparedStatement.executeUpdate(), int* @throws Exception    how do I know*/public ResultSet list(Connection connection, Book book)throws Exception{StringBuilder stringBuffer = new StringBuilder("SELECT * FROM book b,bookType bt WHERE b.bookTypeId = bt.id");if(book.getBookName() != null &&!book.getBookName().equals("")){stringBuffer.append(" and b.bookName like '%").append(book.getBookName()).append("%'");}if(book.getAuthor() != null &&!book.getAuthor().equals("")){stringBuffer.append(" and b.author like '%").append(book.getAuthor()).append("%'");}if(book.getBookTypeId() != null && book.getBookTypeId()!=-1){stringBuffer.append(" and b.bookTypeId=").append(book.getBookTypeId());}PreparedStatement preparedStatement = connection.prepareStatement(stringBuffer.toString());return preparedStatement.executeQuery();}/*** 刪除書籍* @param connection    連接數據庫* @param id 書籍id號* @return  preparedStatement.executeUpdate(), int* @throws Exception    how do I know*/public int delete(Connection connection,String id)throws Exception{String sql = "DELETE FROM book " +"WHERE id = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, id);return preparedStatement.executeUpdate();}/*** 更新書籍* @param connection    連接數據庫* @param book  書籍* @return  preparedStatement.executeUpdate(),int* @throws Exception    how do I know*/public int update(Connection connection,Book book) throws Exception{String sql = "UPDATE book " +"SET bookName = ?, author = ?, number = ?, price = ?, bookDesc = ?, bookTypeId = ? " +"WHERE id = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, book.getBookName());preparedStatement.setString(2, book.getAuthor());preparedStatement.setInt(3, book.getNumber());preparedStatement.setFloat(4, book.getPrice());preparedStatement.setString(5, book.getBookDesc());preparedStatement.setInt(6, book.getBookTypeId());preparedStatement.setInt(7, book.getId());return preparedStatement.executeUpdate();}/*** 判斷書籍是否存在* @param connection    數據庫連接* @param bookTypeId    書類號* @return  存在與否* @throws Exception    異常多了什么都有可能*/public boolean existBookByBookTypeId(Connection connection,String bookTypeId)throws Exception{String sql = "SELECT * FROM book WHERE bookTypeId = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);preparedStatement.setString(1, bookTypeId);ResultSet rs = preparedStatement.executeQuery();return rs.next();}}

3.DBUtil

package utils;import java.sql.Connection;
import java.sql.DriverManager;/*** BookManagementSystem* 數據庫連接** @author PlutoCtx* @version 2024/5/26 8:06* @email ctx195467@163.com* @since JDK17*/public class DBUtil {/**數據庫*/private String url = "jdbc:mysql://localhost:3306/BookBorrowingManagementSystem";/*** 用戶名*/private String username = "root";/*** 密碼*/private String password = "Shangxiao111";/*** 驅動名稱*/private String jdbcName = "com.mysql.cj.jdbc.Driver";/*** 獲取數據庫連接* @return  返回連接* @throws Exception 沒連上*/public Connection getConnection() throws Exception{Class.forName(jdbcName);Connection connection = DriverManager.getConnection(url, username, password);return connection;}/*** 關閉數據庫連接* @param connection    數據庫連接* @throws Exception    異常*/public void closeConnection(Connection connection) throws Exception{if (connection != null){connection.close();}}}

4.BookAddInternalFrame

package view.adminOperation;import dao.BookDao;
import dao.BookTypeDao;
import entity.Book;
import entity.BookType;
import utils.DBUtil;import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.Objects;
import java.util.logging.Logger;/*** BookManagementSystem* 圖書添加界面** @author PlutoCtx* @version 2024/5/26 9:08* @email ctx195467@163.com* @since JDK17*/public class BookAddInternalFrame extends JInternalFrame {private final JTextField bookNameTxt;private final JTextField authorTxt;private final JTextField bookNumberTxt;private final ButtonGroup buttonGroup = new ButtonGroup();private final JTextField priceTxt;private final JComboBox bookTypeJcb;private final JTextArea bookDescTxt;private final DBUtil dbUtil = new DBUtil();private final BookTypeDao bookTypeDao = new BookTypeDao();private final BookDao bookDao = new BookDao();/*** Create the frame.*/public BookAddInternalFrame() {setClosable(true);setIconifiable(true);setTitle("圖書添加");setBounds(100, 100, 450, 467);JLabel label = new JLabel("圖書名稱:");bookNameTxt = new JTextField();bookNameTxt.setColumns(10);JLabel label1 = new JLabel("圖書作者:");authorTxt = new JTextField();authorTxt.setColumns(10);JLabel label2 = new JLabel("圖書數量:");bookNumberTxt = new JTextField();bookNumberTxt.setColumns(10);JLabel label3 = new JLabel("圖書價格:");priceTxt = new JTextField();priceTxt.setColumns(10);JLabel label4 = new JLabel("圖書描述:");bookDescTxt = new JTextArea();JLabel label5 = new JLabel("圖書類別:");bookTypeJcb = new JComboBox();JButton button = new JButton("添加");button.addActionListener(this::bookAddActionPerformed);button.setIcon(new ImageIcon(Objects.requireNonNull(BookAddInternalFrame.class.getResource("/add.png"))));JButton button1 = new JButton("重置");button1.addActionListener(this::resetValueActionPerformed);button1.setIcon(new ImageIcon(Objects.requireNonNull(BookAddInternalFrame.class.getResource("/reset.png"))));GroupLayout groupLayout = new GroupLayout(getContentPane());groupLayout.setHorizontalGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGap(42).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addComponent(button).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(button1).addGap(232)).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(label5).addGroup(groupLayout.createSequentialGroup().addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.TRAILING).addComponent(label4).addComponent(label2).addComponent(label)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).addComponent(bookNameTxt, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE).addComponent(bookNumberTxt, GroupLayout.PREFERRED_SIZE, 88, GroupLayout.PREFERRED_SIZE).addComponent(bookTypeJcb, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)).addGap(35).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING, false).addGroup(groupLayout.createSequentialGroup().addComponent(label1).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(authorTxt, GroupLayout.PREFERRED_SIZE, 91, GroupLayout.PREFERRED_SIZE)).addGroup(groupLayout.createSequentialGroup().addComponent(label3).addPreferredGap(LayoutStyle.ComponentPlacement.UNRELATED).addComponent(priceTxt)))).addComponent(bookDescTxt)).addContainerGap(44, Short.MAX_VALUE))))));groupLayout.setVerticalGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayout.createSequentialGroup().addGap(42).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label).addComponent(bookNameTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE).addComponent(label1).addComponent(authorTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(29).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label2).addComponent(bookNumberTxt).addComponent(label3).addComponent(priceTxt, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(33).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(label5).addComponent(bookTypeJcb, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(30).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(label4).addComponent(bookDescTxt, GroupLayout.PREFERRED_SIZE, 137, GroupLayout.PREFERRED_SIZE)).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED, 37, Short.MAX_VALUE).addGroup(groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(button).addComponent(button1)).addGap(42)));getContentPane().setLayout(groupLayout);/** 設置文本域邊框*/bookDescTxt.setBorder(new LineBorder(new java.awt.Color(127,157,185), 1, false));fillBookType();}/*** 重置事件處理* @param e event*/private void resetValueActionPerformed(ActionEvent e) {this.resetValue();}/*** 圖書添加事件處理* @param event event*/private void bookAddActionPerformed(ActionEvent event) {String bookName = this.bookNameTxt.getText();String author = this.authorTxt.getText();String price = this.priceTxt.getText();String bookDesc = this.bookDescTxt.getText();if(bookName == null || "".equals(bookName.trim())){JOptionPane.showMessageDialog(null, "圖書名稱不能為空");return;}if(author == null || "".equals(author.trim())){JOptionPane.showMessageDialog(null, "圖書作者不能為空");return;}if(price == null || "".equals(price.trim())){JOptionPane.showMessageDialog(null, "圖書價格不能為空");return;}String bookNumber = bookNumberTxt.getText();int numberOfBook = bookNumber.isEmpty() ? 0 : Integer.parseInt(bookNumber);BookType bookType = (BookType) bookTypeJcb.getSelectedItem();int bookTypeId = bookType.getId();Book book = new Book(bookName,author, numberOfBook, Float.parseFloat(price) , bookTypeId,  bookDesc);Connection con = null;try{con = dbUtil.getConnection();int addNum = bookDao.add(con, book);if(addNum == 1){JOptionPane.showMessageDialog(null, "圖書添加成功");resetValue();}else{JOptionPane.showMessageDialog(null, "圖書添加失敗");}}catch(Exception e){e.printStackTrace();JOptionPane.showMessageDialog(null, "圖書添加失敗");}finally{try {dbUtil.closeConnection(con);} catch (Exception e) {e.printStackTrace();}}}/*** 重置表單*/private void resetValue(){this.bookNameTxt.setText("");this.authorTxt.setText("");this.priceTxt.setText("");this.bookNumberTxt.setText("");this.bookDescTxt.setText("");if(this.bookTypeJcb.getItemCount()>0){this.bookTypeJcb.setSelectedIndex(0);}}/*** 初始化圖書類別下拉框*/private void fillBookType(){Connection con = null;BookType bookType = null;try{con = dbUtil.getConnection();ResultSet rs = bookTypeDao.list(con, new BookType());while(rs.next()){bookType = new BookType();bookType.setId(rs.getInt("id"));bookType.setBookTypeName(rs.getString("bookTypeName"));this.bookTypeJcb.addItem(bookType);}}catch(Exception e){e.printStackTrace();}finally{Logger.getGlobal().info("finished!");}}
}

5.Login

package view;import dao.UserDao;
import entity.User;
import utils.DBUtil;import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.plaf.FontUIResource;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.sql.Connection;
import java.util.Enumeration;
import java.util.Objects;/*** BookManagementSystem* 登錄界面** @author PlutoCtx* @version 2024/5/26 8:17* @email ctx195467@163.com* @since JDK17*/public class Login extends JFrame {private JPanel contentPane;private final JTextField userNameText;private final JPasswordField passwordText;private final DBUtil dbUtil = new DBUtil();private final UserDao userDao = new UserDao();/*** Create the frame*/public Login(){//改變系統默認字體Font font = new Font("Dialog", Font.PLAIN, 12);Enumeration<Object> keys = UIManager.getDefaults().keys();while (keys.hasMoreElements()){Object key = keys.nextElement();Object value = UIManager.get(key);if (value instanceof FontUIResource){UIManager.put(key, font);}}setResizable(false);// 用戶登錄setTitle("用戶登錄");setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);setBounds(500,250,450,343);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));setContentPane(contentPane);JLabel lblNewLabel = new JLabel("圖書管理系統");lblNewLabel.setFont(new Font("宋體", Font.BOLD, 23));lblNewLabel.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/logo.png"))));JLabel lblNewLabel1 = new JLabel("用戶名:");lblNewLabel1.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/userName.png"))));JLabel lblNewLabel2 = new JLabel("密  碼:");lblNewLabel2.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/password.png"))));userNameText = new JTextField();userNameText.setColumns(10);passwordText = new JPasswordField();JButton btnNewButton1 = new JButton("登錄");btnNewButton1.addActionListener(this::loginActionPerformed);btnNewButton1.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/login.png"))));JButton btnNewButton2 = new JButton("重置");btnNewButton2.addActionListener(this::resetValueActionPerformed);btnNewButton2.setIcon(new ImageIcon(Objects.requireNonNull(getClass().getResource("/reset.png"))));GroupLayout groupLayoutContentPane = new GroupLayout(contentPane);groupLayoutContentPane.setHorizontalGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(111).addComponent(lblNewLabel)).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(101).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(lblNewLabel1).addComponent(lblNewLabel2).addComponent(btnNewButton1)).addGap(32).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addComponent(btnNewButton2).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING, false).addComponent(passwordText).addComponent(userNameText, GroupLayout.DEFAULT_SIZE, 128, Short.MAX_VALUE))))).addContainerGap(111, Short.MAX_VALUE)));groupLayoutContentPane.setVerticalGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addGap(30).addComponent(lblNewLabel).addGap(26).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.LEADING).addGroup(groupLayoutContentPane.createSequentialGroup().addComponent(lblNewLabel1).addGap(29).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(lblNewLabel2).addComponent(passwordText, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE))).addComponent(userNameText, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)).addGap(36).addGroup(groupLayoutContentPane.createParallelGroup(GroupLayout.Alignment.BASELINE).addComponent(btnNewButton1).addComponent(btnNewButton2)).addContainerGap(60, Short.MAX_VALUE)));contentPane.setLayout(groupLayoutContentPane);// 居中this.setLocationRelativeTo(null);}/*** 登錄事件處理* @param evt action*/private void loginActionPerformed(ActionEvent evt) {String userName = this.userNameText.getText();String password = new String(this.passwordText.getPassword());if (userName == null || userName.equals("")){JOptionPane.showMessageDialog(null, "用戶名不能為空");return;}if (password == null || password.equals("")){JOptionPane.showMessageDialog(null, "密碼不能為空");return;}// 調用dao層方法User user = new User(userName, password);Connection con = null;try {con = dbUtil.getConnection();User currentUser = userDao.login(con, user);if (currentUser != null){dispose();if (currentUser.getStatus() == 1) {new AdminMainFrame(currentUser).setVisible(true);JOptionPane.showMessageDialog(null, "登錄成功");} else {new UserMainFrame(currentUser).setVisible(true);JOptionPane.showMessageDialog(null, "登錄成功");}}else {JOptionPane.showMessageDialog(null, "用戶名或密碼錯誤");}} catch (Exception e) {e.printStackTrace();}finally {try {dbUtil.closeConnection(con);}catch (Exception e){e.printStackTrace();}}}/*** 重置事件處理* @param evt action*/private void resetValueActionPerformed(ActionEvent evt){this.userNameText.setText("");this.passwordText.setText("");}}

三、配置

1、idea直接導入解壓文件夾
2、打開navicat等數據庫可視化軟件,運行sql文件夾下的數據庫文件
3、修改DBUtil.java中的用戶名、連接、密碼(如果有必要的話)
4、運行Main

如有購買需求,請移步到 面包多 進行購買,CSDN的收費太黑了

面包多中提供了幾種不同的版本代碼:

  • JavaSwing+MySQL圖書管理系統 有數據庫版,提供MySQL支持,數據能夠實現增刪改查
  • JavaSwing+MySQL圖書管理系統 無數據庫版,僅提供界面和部分鼠標點擊事件,數據內容無法被修改
  • JavaSwing+MySQL圖書借閱管理系統 有數據庫版,提供MySQL支持,數據能夠實現增刪改查

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16573.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt中信號和槽解決了什么問題

信號和槽解決了什么問題 Qt 中的信號和槽機制是一種用于處理對象之間通信的重要機制,它解決了以下幾個問題: 對象之間的解耦(Decoupling): 問題: 在一個系統中,如果對象之間直接調用彼此的方法,就會形成緊密耦合的結構。這樣的耦合使得對象難以獨立地變更和維護,而且…

react-d3-tree:React組件創建交互式D3樹形圖

在這里插入代碼片import React from "react"; import ReactDOM from "react-dom"; import Tree from "react-d3-tree";import "./styles.css";const myTreeData [{name: "Gaurang Torvekar",attributes: {keyA: "val …

【軟考】2024年5月系統架構設計師考試感受

一 考試時間 5???25日上午: 8點30-12點30: 綜合知識和案例分析?? 5???25日下午: 14點30-16點30: 論文?? 二 考試感受 2024年5月25日早上5點多一點,我就起床了????。簡單洗漱后,就準備出門。可是,天吶,我的手機??忘記充電了,所以就趕緊應急充會電??…

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型對話聊天機器人

前面兩篇博文&#xff0c;我們分別在個人筆記本電腦部署了Llama 3 8B參數大模型&#xff0c;并使用Ollama搭建了基于 Web 可視化對話聊天機器人&#xff0c;可以在自己電腦上愉快的與Llama大模型 Web 機器人對話聊天了。但在使用過程中&#xff0c;筆者發現Llama大模型經常出現…

匯編一:匯編語言前的基礎知識

計算機的工作原理就是取址執行,在哪兒執行呢,在cpu里面執行,從哪里面去取址呢?從內存中去取址,內存又被叫做存儲器 可是,cpu和存儲器是2個分開的硬件設備,那么是怎么做到把存儲器里面的東西傳給cpu呢,這就需要總線了 1.總線 總線一共可以分為3種, 一種是數據總線,一種是控制總…

OpenWrt U盤安裝使用 詳細教程 x86/64平臺 軟路由實測 系列一

1 官方穩定 版:OpenWrt 23.05 OpenWrt Downloads #根據實際情況選擇 PC支持uefi,選擇版本&#xff1a;https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img.gz 2 rufus 制作U盤啟動 3 制作好的U盤,接入主…

Redux基礎

簡介 狀態管理工具&#xff0c;集中式管理react、vue、angular等應用中多個組件的狀態&#xff0c;是一個庫,使用之后可以清晰的知道應用里發生了什么以及數據是如何修改&#xff0c;如何更新的 在項目中添加 Redux 并不是必須的,根據項目需求選擇是否引入 Redux 三個原則 …

Linux部分漏洞處理

1、ICMP timestamp請求響應漏洞 ICMP timestamp請求響應漏洞是指&#xff0c;當網絡設備接收到ICMP timestamp請求時&#xff0c;它會返回當前時間戳作為響應&#xff0c;這可能導致設備的時間戳被暴露&#xff0c;進而可能被用于計算機時間戳協議&#xff08;TLS&#xff09;的…

PDF.js

什么是 PDF.js&#xff1f; PDF.js 是由 Mozilla 開發的一個用于呈現 PDF 文件的 JavaScript 庫。它允許開發者將 PDF 文件直接嵌入到網頁中&#xff0c;而無需使用插件或其他外部工具。PDF.js 使用 HTML5 技術&#xff0c;利用 Canvas 元素來呈現 PDF 內容&#xff0c;并提供…

基于集成經驗模態分解的心電信號降噪和基于希爾伯特變換的R峰檢測(MATLAB R2018)

近年來&#xff0c;心臟病已成為危害人類健康最常見的疾病。為了有效預防心臟疾病的發生&#xff0c;往往需要更加準確地采集與診斷心電信號&#xff0c;以便于更好地反映心臟情況。心電信號作為人體生理信號&#xff0c;對于識別心臟異常和心臟疾病具有重要的參考價值。心電信…

ubuntu如何安裝gitlab runner

一、什么是GitLab Runner GitLab Runner 是 GitLab 提供的一個開源工具,用于在構建、測試和部署過程中執行作業。它是 GitLab 持續集成和持續部署(CI/CD)工作流的核心組件之一。 GitLab Runner 有以下主要功能: 作業執行:GitLab Runner 會接收來自 GitLab 的作業請求,并在指定…

ROS基礎學習-ROS通信機制研究

研究ROS通信機制 研究ROS通信機制 0.前言1.話題通信1.1 理論模型1.2 話題通訊的基本操作1.2.1 C++1.2.2 Python0.前言 機器人是一種高度復雜的系統性實現,在機器人上可能集成各種傳感器(雷達、攝像頭、GPS…)以及運動控制實現,為了解耦合,在ROS中每一個功能點都是一個單獨的…

從File類開始,學習Java文件操作

哈嘍&#xff0c;各位小伙伴們&#xff0c;你們好呀&#xff0c;我是喵手。運營社區&#xff1a;C站/掘金/騰訊云&#xff1b;歡迎大家常來逛逛 今天我要給大家分享一些自己日常學習到的一些知識點&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相學習&#xff0c;一…

windows安裝SQL Server

1、下載 下載網頁&#xff1a;SQL Server 下載 | Microsoft 2022版下載地址&#xff1a;https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下載結果&#xff1a;SQL2022-SSEI-Dev.exe 打開選第三個&#xff0c;下載介質&…

自定義Linux命令,顯示docker鏡像、容器信息

1、修改環境變量&#xff08;僅對當前用戶有效&#xff09; vim ~/.bashrc2、給命令取別名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、讓配置重新生效 source ~/.bashrc4、測試&…

ChatGPT技術演進簡介

chatGPT&#xff08;chat generative pre-train transformer&#xff0c; 可以對話的預訓練trasformer模型&#xff09;&#xff0c;討論點&#xff1a; 1、chatGPT為什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o區別和特性&#xff0c;在不同應用場景中如何選對模型 3、未…

基于ESP8266的無線通信系統設計

本文介紹了一種基于ESP8266的無線通信系統設計方案。ESP8266是一款功能強大且成本低廉的WiFi模塊&#xff0c;非常適合用于構建無線通信系統。本設計主要圍繞ESP8266模塊的功能特點&#xff0c;闡述了系統的硬件組成、軟件設計以及實際應用示例。 關鍵詞&#xff1a;ESP8266&a…

【docker】倉庫harbor的部署

harbor介紹 Harbor 是一個用于存儲和管理 Docker 鏡像的開源倉庫。它提供了一系列的功能&#xff0c;比如用戶管理、訪問控制、鏡像管理、日志審計和安全掃描等。Harbor 可以作為私有倉庫來使用&#xff0c;也可以與公有倉庫&#xff08;如 Docker Hub&#xff09;集成使用。 …

python數據分析——apply 1

參考資料&#xff1a;活用pandas庫 apply是指把函數同時作用于DataFrame的每一行或每一列。類似于編寫一些跨每行或每列的for循環&#xff0c;并同時調用apply函數。 1、函數 函數是對python代碼進行分組和復用的一種方法。如果某段代碼會被多次使用&#xff0c;并且使用時是需…

JS Lab

如何用 JavaScript 在瀏覽器中彈窗如何在 JavaScript 中制作鼠標滑過按鈕改變背景顏色如何在 JS 中點擊按鈕使數字增加如何在 JS 中循環打印多少次 HTML <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title…