当前位置: 首页 > news >正文

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支持,数据能够实现增删改查

相关文章:

Java Swing + MySQL图书借阅管理系统

系列文章目录 Java Swing MySQL 图书管理系统 Java Swing MySQL 图书借阅管理系统 文章目录 系列文章目录前言一、项目展示二、部分代码1.Book2.BookDao3.DBUtil4.BookAddInternalFrame5.Login 三、配置 前言 项目是使用Java swing开发&#xff0c;界面设计比较简洁、适合作…...

ssm招聘信息管理系统-计算机毕业设计源码78049

摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的要求发生重大的变化。…...

eBPF可观测之网络流量控制和管理traffic control浅尝

目录 工程背景 环境准备 安装工具​​​ 安装依赖包 安装C依赖库 操作步骤 目录结构 代码展示 效果展示 拓展提升 工程背景 首先发表一个"暴论" eBPF在可观测方面的应用&#xff0c;就是各种google。 不需要学习内核&#xff0c;只要掌握ebpf开发套路。…...

Java技术精粹:高级面试问题与解答指南(二)

Java面试问题及答案 1. 什么是Java中的集合框架&#xff1f;请简述其主要接口和类。 答案&#xff1a; Java中的集合框架是一个设计用来存储和操作大量数据的统一架构。它主要由以下几个接口及其实现类组成&#xff1a; Collection: 它是最基本的集合接口&#xff0c;所有单列…...

地下停车场FM信号覆盖系统技术原理用与应用

随着我国城市化水平的快速推进与房地产的快速发展&#xff0c;城市停车场称为每栋建筑物的硬性配套建筑&#xff0c;尤其是商业综合体、医院、政府机关、机场、高铁站等场所出现了超大规模停车场&#xff0c;停放车辆可达数千辆&#xff0c;停车场的智能化与信息化水平也越来越…...

idea 出现 cpu占用100%

一、IDEA的CPU占用率过高 二、解决办法 idea安装路径bin目录 修改idea64.exe.vmoptions配置文件 原来的 -Xms128m -Xmx750m -XX:ReservedCodeCacheSize240m -XX:UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB50 修改为(IDEA优化内存配置) -Xms2048m -Xmx4096m -XX:Reser…...

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…...

安卓手机APP开发__Wi-Fi扫描概述

安卓手机APP开发__Wi-Fi扫描概述 目录 概述 Wi-Fi的扫描过程 限制 权限 Android 8.0 and Android 8.1: Android 9: Android 10 (API 级别 29) 和 更高版本: 扫描频率的限制 Android 8.0 and Android 8.1: Android 9: Android 10 and higher: 概述 你能使用Wi-Fi的…...

深入理解二叉树及其在C语言中的实现

一、引言 二叉树是数据结构中一种非常基础且重要的树形结构&#xff0c;它的每个节点最多有两个子节点&#xff0c;通常被称为左子节点和右子节点。二叉树在计算机科学中有着广泛的应用&#xff0c;如搜索、排序、存储数据等。本文将详细介绍二叉树的基本概念、特性以及在C语言…...

基于ssm+vue图书管理系统

基于ssmvue图书管理系统 ssm477图书管理系统 相关技术 javassmmysqlvueelementui...

高防ip能防护变异CC攻击吗

高防ip能防护变异CC攻击吗&#xff1f;随着互联网的不断发展&#xff0c;网络安全问题也日益突出&#xff0c;各类网络攻击层出不穷&#xff0c;其中CC攻击&#xff08;Challenge Collapsar攻击&#xff09;及其变种——变异CC攻击&#xff0c;更是让众多企业和个人网站头疼不已…...

从多站点到多活,XEOS 对象数据容灾能力再提升

近日&#xff0c; XSKY SDS V6.4 新版本发布&#xff0c;其中 XEOS V6.4 全新升级并完善了统一命名空间功能&#xff0c;更进一步增强和完善了异地容灾方案&#xff0c;配合强一致代理读&#xff0c;可以实现异地多活&#xff1b;同时大幅降低管理复杂度&#xff0c;有效降低容…...

3D开发工具HOOPS在BIM系统中的应用

建筑信息模型是一种革命性的建筑设计、施工和管理方法。它通过创建和利用数字信息来优化建筑项目的设计、施工和运营过程。在这个过程中&#xff0c;3D开发工具HOOPS扮演着至关重要的角色&#xff0c;为BIM系统提供了强大的技术支持和丰富的功能。HOOPS中文网http://techsoft3d…...

适合下班做的副业兼职、1天挣300,7天涨粉2万

最近小红书上有类视频火了&#xff01; 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 利用AI制作的漫画解说历史小说视频。视频以《明朝那些事儿》为蓝本&#xff0c;一上线就疯狂吸粉&#xff0c;多条视频内容都大爆了。 就是这个账号&#xff0c;仅仅…...

JS中getElementById与querySelector区别收录

JS中getElementById与querySelector区别收录 getElementById 和 querySelector 都是 JavaScript 中用于从文档中选取元素的方法&#xff0c;但两者之间存在一些关键区别&#xff1a; 选择器语法&#xff1a; getElementById&#xff1a;这个方法只接受一个参数&#xff0c;即元…...

Android:使用Kotlin搭建MVC架构模式

一、简介Android MVC架构模式 M 层 model &#xff0c;负责处理数据&#xff0c;例如网络请求、数据变化 V 层 对应的是布局 C 层 Controller&#xff0c; 对应的是Activity&#xff0c;处理业务逻辑&#xff0c;包含V层的事情&#xff0c;还会做其他的事情&#xff0c;导致 ac…...

delete原理

一 原理 new申请动态内存&#xff0c;delete释放内存&#xff0c;将内存的数据块标记为可覆盖&#xff0c;可再次使用。在调用delete时不会将内存块的数据&#xff0c;全部初始化为0。 二 new动态内存&#xff0c;不调用delete的后果&#xff1f; 造成内存泄漏。new申请的动…...

青少年 CTF 练习平台:Misc(一)

前言 当然&#xff0c;我可以更详细地介绍一下青少年CTF练习平台。 青少年CTF练习平台是一个专为青少年设计的网络安全竞赛和训练平台。该平台由思而听&#xff08;山东&#xff09;网络科技有限公司与克拉玛依市思而听网络科技有限公司共同建设&#xff0c;自2018年创建以来…...

展锐平台+Android系统开发概要

文章目录 一、缩略语二、系统分区1. UIS7885android13的系统分区 三、系统编译四、开发调试 一、缩略语 BBAT&#xff1a;Baseband Auto Test&#xff0c;基带自带测试CRC&#xff1a;Cyclic Redundancy Check&#xff0c;循环冗余检验SPL&#xff1a;Secondary Program Loade…...

unity开发Hololens 制作滑动框

一定要做到最后一步&#xff0c;才会有效果 1、创建空物体 ,并添加组件 创建空物体 命名ScrollingObjectCollection&#xff0c; 添加组件如下图 下面是各个组件展开的内容 2、在ScrollingObjectCollection 下面创建两个空物体&#xff0c;分别命名Container、Clipping…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)

UniApp 集成腾讯云 IM 富媒体消息全攻略&#xff08;地理位置/文件&#xff09; 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型&#xff0c;核心实现方式&#xff1a; 标准消息类型&#xff1a;直接使用 SDK 内置类型&#xff08;文件、图片等&#xff09;自…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

嵌入式面试常问问题

以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...

Easy Excel

Easy Excel 一、依赖引入二、基本使用1. 定义实体类&#xff08;导入/导出共用&#xff09;2. 写 Excel3. 读 Excel 三、常用注解说明&#xff08;完整列表&#xff09;四、进阶&#xff1a;自定义转换器&#xff08;Converter&#xff09; 其它自定义转换器没生效 Easy Excel在…...

第14节 Node.js 全局对象

JavaScript 中有一个特殊的对象&#xff0c;称为全局对象&#xff08;Global Object&#xff09;&#xff0c;它及其所有属性都可以在程序的任何地方访问&#xff0c;即全局变量。 在浏览器 JavaScript 中&#xff0c;通常 window 是全局对象&#xff0c; 而 Node.js 中的全局…...