【Java 基础篇】Java 图书管理系统详解

在这里插入图片描述

介绍

图书管理系统是一种用于管理图书信息、借阅记录、用户信息等的软件系统。它可以帮助图书馆、书店或个人管理和组织图书资源,提供了方便的借阅和查询功能。在这篇博客中,我们将详细介绍如何使用Java编程语言创建一个简单的图书管理系统。

功能需求

在设计图书管理系统之前,我们首先需要明确系统应该具备的功能需求。以下是一个简单的功能列表:

  1. 添加图书:管理员可以添加新的图书信息,包括书名、作者、出版社、ISBN号等。
  2. 删除图书:管理员可以删除已有的图书信息。
  3. 查询图书:用户可以通过关键字搜索图书,系统将返回匹配的图书列表。
  4. 借阅图书:用户可以借阅图书,并记录借阅时间。
  5. 归还图书:用户可以归还已借阅的图书,并记录归还时间。
  6. 查看借阅记录:用户可以查看自己的借阅记录,包括借阅时间、归还时间等。
  7. 用户管理:管理员可以管理用户信息,包括添加、删除用户。
  8. 权限管理:管理员可以设置用户的权限,例如普通用户和管理员用户。

数据模型

在设计图书管理系统时,首先需要考虑数据模型,即如何存储和管理图书信息、用户信息、借阅记录等数据。以下是一个简化的数据模型示意图:

Book
- ID
- Title
- Author
- Publisher
- ISBN
- Status (Available, Checked Out)
- Borrower ID (if checked out)
- Due Date (if checked out)User
- ID
- Name
- Email
- Password
- Role (Admin, User)BorrowRecord
- ID
- Book ID
- User ID
- Borrow Date
- Return Date

数据模型包括三个主要实体:图书(Book)、用户(User)和借阅记录(BorrowRecord)。图书实体包括图书的基本信息和当前状态,用户实体包括用户的基本信息和角色,借阅记录实体用于记录图书的借阅和归还情况。

架构设计

在开始编写代码之前,我们需要考虑系统的架构设计。通常,一个图书管理系统可以分为以下几个模块:

  1. 用户管理模块:负责用户的注册、登录和权限管理。
  2. 图书管理模块:负责图书的添加、删除、查询和状态管理。
  3. 借阅管理模块:负责借阅和归还图书,以及记录借阅记录。
  4. 数据存储模块:负责将数据存储到数据库或文件中,以及从数据库或文件中检索数据。

接下来,我们将逐步实现这些模块。

开发环境和工具

在开始编写代码之前,确保您已经准备好了以下开发环境和工具:

  • Java开发工具(例如Eclipse、IntelliJ IDEA或VS Code)
  • 数据库(可以选择关系型数据库如MySQL或SQLite,也可以选择文件存储)
  • Java数据库连接库(例如JDBC)
  • 项目构建工具(例如Maven或Gradle)

用户管理模块

用户实体类

首先,让我们创建一个用户实体类,用于表示系统中的用户信息。用户实体包括ID、用户名、密码、邮箱和角色。

public class User {private int id;private String username;private String password;private String email;private UserRole role;// 构造函数、getter和setter方法
}

UserRole是一个枚举类型,表示用户的角色,可以定义为管理员和普通用户。

public enum UserRole {ADMIN,USER
}

用户数据访问对象(DAO)

接下来,创建一个用户数据访问对象(DAO),用于与数据库或文件进行用户的数据交互。我们将使用JDBC(Java Database Connectivity)来连接数据库并执行数据库操作。

首先,我们需要建立数据库连接。假设我们选择MySQL数据库,以下是建立数据库连接的示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DatabaseConnection {private static final String URL = "jdbc:mysql://localhost:3306/library";private static final String USERNAME = "root";private static final String PASSWORD = "password";public static Connection getConnection() throws SQLException {return DriverManager.getConnection(URL, USERNAME, PASSWORD);}
}

在上面的示例中,我们使用JDBC连接了名为"library"的MySQL数据库,使用用户名"root"和密码"password"。请根据您的实际数据库配置进行更改。

接下来,创建一个用户DAO类,用于执行用户相关的数据库操作,包括用户的添加、删除、查询和权限管理。以下是一个简单的用户DAO示例:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class UserDao {private Connection connection;public UserDao() {try {connection = DatabaseConnection.getConnection();} catch (SQLException e) {e.printStackTrace();}}// 添加用户public void addUser(User user) {String sql = "INSERT INTO users (username, password, email, role) VALUES (?, ?, ?, ?)";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, user.getUsername());preparedStatement.setString(2, user.getPassword());preparedStatement.setString(3, user.getEmail());preparedStatement.setString(4, user.getRole().toString());preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 删除用户public void deleteUser(int userId) {String sql = "DELETE FROM users WHERE id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, userId);preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 根据用户名查询用户public User getUserByUsername(String username) {String sql = "SELECT * FROM users WHERE username = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, username);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()) {return extractUserFromResultSet(resultSet);}} catch (SQLException e) {e.printStackTrace();}return null;}// 查询所有用户public List<User> getAllUsers() {List<User> userList = new ArrayList<>();String sql = "SELECT * FROM users";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {userList.add(extractUserFromResultSet(resultSet));}} catch (SQLException e) {e.printStackTrace();}return userList;}// 从ResultSet提取用户信息private User extractUserFromResultSet(ResultSet resultSet) throws SQLException {User user = new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));user.setEmail(resultSet.getString("email"));user.setRole(UserRole.valueOf(resultSet.getString("role")));return user;}
}

上述示例中,我们创建了一个UserDao类,该类包含了添加用户、删除用户、查询用户和查询所有用户的方法。这些方法使用了预备语句(PreparedStatement)来执行SQL查询和更新操作,并将查询结果映射到User对象。

用户服务类

用户服务类用于处理用户管理模块的业务逻辑。它可以调用用户DAO来执行数据库操作,例如添加用户、删除用户、查询用户等。

以下是一个简单的用户服务类示例:

public class UserService {private UserDao userDao;public UserService() {userDao = new UserDao();}// 注册用户public void registerUser(String username, String password, String email, UserRole role) {User user = new User();user.setUsername(username);user.setPassword(password);user.setEmail(email);user.setRole(role);userDao.addUser(user);}// 删除用户public void deleteUser(int userId) {userDao.deleteUser(userId);}// 根据用户名查询用户public User getUserByUsername(String username) {return userDao.getUserByUsername(username);}// 查询所有用户public List<User> getAllUsers() {return userDao.getAllUsers();}
}

在上面的示例中,UserService类提供了注册用户、删除用户、查询用户和查询所有用户的方法,它通过调用UserDao来实现这些功能。

图书管理模块

接下来,让我们创建图书管理模块,包括图书实体、图书DAO和图书服务类。

图书实体类

首先,创建一个图书实体类,用于表示系统中的图书信息。图书实体包括ID、书名、作者、出版社、ISBN号、状态、借阅人ID和归还日期等属性。

public class Book {private int id;private String title;private String author;private String publisher;private String isbn;private BookStatus status;private int borrowerId;private LocalDate dueDate;// 构造函数、getter和setter方法
}

BookStatus是一个枚举类型,表示图书的状态,可以定义为“可借阅”和“已借出”。

public enum BookStatus {AVAILABLE,CHECKED_OUT
}

图书数据访问对象(DAO)

接下来,创建一个图书数据访问对象(DAO),用于执行图书相关的数据库操作,包括添加图书、删除图书、查询图书和更新图书状态。

以下是一个简单的图书DAO示例:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class BookDao {private Connection connection;public BookDao() {try {connection = DatabaseConnection.getConnection();} catch (SQLException e) {e.printStackTrace();}}// 添加图书public void addBook(Book book) {String sql = "INSERT INTO books (title, author, publisher, isbn, status, borrower_id, due_date) " +"VALUES (?, ?, ?, ?, ?, ?, ?)";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, book.getTitle());preparedStatement.setString(2, book.getAuthor());preparedStatement.setString(3, book.getPublisher());preparedStatement.setString(4, book.getIsbn());preparedStatement.setString(5, book.getStatus().toString());preparedStatement.setInt(6, book.getBorrowerId());preparedStatement.setDate(7, Date.valueOf(book.getDueDate()));preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 删除图书public void deleteBook(int bookId) {String sql = "DELETE FROM books WHERE id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, bookId);preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 根据ID查询图书public Book getBookById(int bookId) {String sql = "SELECT * FROM books WHERE id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, bookId);ResultSet resultSet = preparedStatement.executeQuery();if (resultSet.next()) {return extractBookFromResultSet(resultSet);}} catch (SQLException e) {e.printStackTrace();}return null;}// 查询所有图书public List<Book> getAllBooks() {List<Book> bookList = new ArrayList<>();String sql = "SELECT * FROM books";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {bookList.add(extractBookFromResultSet(resultSet));}} catch (SQLException e) {e.printStackTrace();}return bookList;}// 更新图书状态public void updateBookStatus(int bookId, BookStatus status, int borrowerId, LocalDate dueDate) {String sql = "UPDATE books SET status = ?, borrower_id = ?, due_date = ? WHERE id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setString(1, status.toString());preparedStatement.setInt(2, borrowerId);preparedStatement.setDate(3, Date.valueOf(dueDate));preparedStatement.setInt(4, bookId);preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 从ResultSet提取图书信息private Book extractBookFromResultSet(ResultSet resultSet) throws SQLException {Book book = new Book();book.setId(resultSet.getInt("id"));book.setTitle(resultSet.getString("title"));book.setAuthor(resultSet.getString("author"));book.setPublisher(resultSet.getString("publisher"));book.setIsbn(resultSet.getString("isbn"));book.setStatus(BookStatus.valueOf(resultSet.getString("status")));book.setBorrowerId(resultSet.getInt("borrower_id"));book.setDueDate(resultSet.getDate("due_date").toLocalDate());return book;}
}

上述示例中,我们创建了一个BookDao类,该类包含了添加图书、删除图书、查询图书、更新图书状态和查询所有图书的方法。这些方法使用了预备语句(PreparedStatement)来执行SQL查询和更新操作,并将查询结果映射到Book对象。

图书服务类

图书服务类用于处理图书管理模块的业务逻辑。它可以调用图书DAO来执行数据库操作,例如添加图书、删除图书、查询图书等。

以下是一个简单的图书服务类示例:

import java.util.List;public class BookService {private BookDao bookDao;public BookService() {bookDao = new BookDao();}// 添加图书public void addBook(String title, String author, String publisher, String isbn) {Book book = new Book();book.setTitle(title);book.setAuthor(author);book.setPublisher(publisher);book.setIsbn(isbn);book.setStatus(BookStatus.AVAILABLE); // 默认设置为可借阅状态bookDao.addBook(book);}// 删除图书public void deleteBook(int bookId) {bookDao.deleteBook(bookId);}// 根据ID查询图书public Book getBookById(int bookId) {return bookDao.getBookById(bookId);}// 查询所有图书public List<Book> getAllBooks() {return bookDao.getAllBooks();}// 借阅图书public void borrowBook(int bookId, int userId, LocalDate dueDate) {Book book = bookDao.getBookById(bookId);if (book.getStatus() == BookStatus.AVAILABLE) {book.setStatus(BookStatus.CHECKED_OUT);book.setBorrowerId(userId);book.setDueDate(dueDate);bookDao.updateBookStatus(bookId, book.getStatus(), book.getBorrowerId(), book.getDueDate());}}// 归还图书public void returnBook(int bookId) {Book book = bookDao.getBookById(bookId);if (book.getStatus() == BookStatus.CHECKED_OUT) {book.setStatus(BookStatus.AVAILABLE);book.setBorrowerId(0);book.setDueDate(null);bookDao.updateBookStatus(bookId, book.getStatus(), book.getBorrowerId(), book.getDueDate());}}
}

在上面的示例中,BookService类提供了添加图书、删除图书、查询图书、借阅图书和归还图书的方法,它通过调用BookDao来实现这些功能。

借阅管理模块

借阅管理模块负责处理用户借阅和归还图书的操作,并记录借阅记录。

借阅记录实体类

首先,创建一个借阅记录实体类,用于表示用户的借阅记录。借阅记录实体包括ID、图书ID、用户ID、借阅日期和归还日期。

public class BorrowRecord {private int id;private int bookId;private int userId;private LocalDate borrowDate;private LocalDate returnDate;// 构造函数、getter和setter方法
}

借阅记录数据访问对象(DAO)

接下来,创建一个借阅记录数据访问对象(DAO),用于执行借阅记录相关的数据库操作,包括记录借阅和归还图书。

以下是一个简单的借阅记录DAO示例:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;public class BorrowRecordDao {private Connection connection;public BorrowRecordDao() {try {connection = DatabaseConnection.getConnection();} catch (SQLException e) {e.printStackTrace();}}// 记录借阅public void borrowBook(int bookId, int userId, LocalDate borrowDate) {String sql = "INSERT INTO borrow_records (book_id, user_id, borrow_date) VALUES (?, ?, ?)";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, bookId);preparedStatement.setInt(2, userId);preparedStatement.setDate(3, Date.valueOf(borrowDate));preparedStatement.executeUpdate();} catch (SQLException e) {e.printStackTrace();}}// 记录归还public void returnBook(int bookId, LocalDate returnDate) {String sql = "UPDATE borrow_records SET return_date = ? WHERE book_id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setDate(1, Date.valueOf(returnDate));preparedStatement.setInt(2, bookId);preparedStatement.executeUpdate();} catch (SQLExceptione) {e.printStackTrace();}}// 查询用户的借阅记录public List<BorrowRecord> getBorrowRecordsByUserId(int userId) {List<BorrowRecord> recordList = new ArrayList<>();String sql = "SELECT * FROM borrow_records WHERE user_id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, userId);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {recordList.add(extractBorrowRecordFromResultSet(resultSet));}} catch (SQLException e) {e.printStackTrace();}return recordList;}// 查询图书的借阅记录public List<BorrowRecord> getBorrowRecordsByBookId(int bookId) {List<BorrowRecord> recordList = new ArrayList<>();String sql = "SELECT * FROM borrow_records WHERE book_id = ?";try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {preparedStatement.setInt(1, bookId);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()) {recordList.add(extractBorrowRecordFromResultSet(resultSet));}} catch (SQLException e) {e.printStackTrace();}return recordList;}// 从ResultSet提取借阅记录信息private BorrowRecord extractBorrowRecordFromResultSet(ResultSet resultSet) throws SQLException {BorrowRecord record = new BorrowRecord();record.setId(resultSet.getInt("id"));record.setBookId(resultSet.getInt("book_id"));record.setUserId(resultSet.getInt("user_id"));record.setBorrowDate(resultSet.getDate("borrow_date").toLocalDate());if (resultSet.getDate("return_date") != null) {record.setReturnDate(resultSet.getDate("return_date").toLocalDate());}return record;}
}

上述示例中,我们创建了一个BorrowRecordDao类,该类包含了记录借阅和归还图书、查询用户的借阅记录以及查询图书的借阅记录等方法。这些方法使用了预备语句(PreparedStatement)来执行SQL查询和更新操作,并将查询结果映射到BorrowRecord对象。

借阅记录服务类

借阅记录服务类用于处理借阅管理模块的业务逻辑。它可以调用借阅记录DAO来执行数据库操作,例如记录借阅和归还图书、查询用户的借阅记录以及查询图书的借阅记录。

以下是一个简单的借阅记录服务类示例:

import java.util.List;public class BorrowRecordService {private BorrowRecordDao borrowRecordDao;public BorrowRecordService() {borrowRecordDao = new BorrowRecordDao();}// 记录借阅public void borrowBook(int bookId, int userId, LocalDate borrowDate) {borrowRecordDao.borrowBook(bookId, userId, borrowDate);}// 记录归还public void returnBook(int bookId, LocalDate returnDate) {borrowRecordDao.returnBook(bookId, returnDate);}// 查询用户的借阅记录public List<BorrowRecord> getBorrowRecordsByUserId(int userId) {return borrowRecordDao.getBorrowRecordsByUserId(userId);}// 查询图书的借阅记录public List<BorrowRecord> getBorrowRecordsByBookId(int bookId) {return borrowRecordDao.getBorrowRecordsByBookId(bookId);}
}

在上面的示例中,BorrowRecordService类提供了记录借阅和归还图书、查询用户的借阅记录以及查询图书的借阅记录的方法,它通过调用BorrowRecordDao来实现这些功能。

数据存储模块

数据存储模块负责将数据存储到数据库或文件中,以及从数据库或文件中检索数据。在本示例中,我们使用了数据库作为数据存储的方式。您可以根据需要选择适当的数据存储方式。

用户界面

最后,我们需要创建一个用户界面,允许用户与图书管理系统进行交互。用户界面可以是命令行界面、图形界面或Web界面,具体实现方式取决于您的需求和技术栈。用户界面需要调用用户服务类、图书服务类和借阅记录服务类来实现用户注册、登录、添加图书、借阅图书、归还图书等功能。

以下是一个简单的命令行用户界面示例:

import java.time.LocalDate;
import java.util.List;
import java.util.Scanner;public class LibraryManagementSystem {private UserService userService;private BookService bookService;private BorrowRecordService borrowRecordService;private User currentUser;public LibraryManagementSystem() {userService = new UserService();bookService = new BookService();borrowRecordService = new BorrowRecordService();}public void run() {Scanner scanner = new Scanner(System.in);while (true) {if (currentUser == null) {System.out.println("Welcome to the Library Management System!");System.out.println("1. Register");System.out.println("2. Login");System.out.println("3. Exit");System.out.print("Please select an option: ");int choice = scanner.nextInt();scanner.nextLine(); // Consume newlineswitch (choice) {case 1:registerUser(scanner);break;case 2:loginUser(scanner);break;case 3:System.out.println("Goodbye!");return;default:System.out.println("Invalid option. Please try again.");break;}} else {System.out.println("Welcome, " + currentUser.getUsername() + "!");System.out.println("1. Add Book");System.out.println("2. Borrow Book");System.out.println("3. Return Book");System.out.println("4. View Borrowed Books");System.out.println("5. Logout");System.out.print("Please select an option: ");int choice = scanner.nextInt();scanner.nextLine(); // Consume newlineswitch (choice) {case 1:addBook(scanner);break;case 2:borrowBook(scanner);break;case 3:returnBook(scanner);break;case 4:viewBorrowedBooks();break;case 5:currentUser = null;System.out.println("Logged out successfully.");break;default:System.out.println("Invalid option. Please try again.");break;}}}}private void registerUser(Scanner scanner) {System.out.print("Enter username: ");String username = scanner.nextLine();System.out.print("Enter password: ");String password = scanner.nextLine();System.out.print("Enter email: ");String email = scanner.nextLine();// Assume default role is USERUserRole role = UserRole.USER;userService.registerUser(username, password, email, role);System.out.println("Registration successful. You can now log in.");}private void loginUser(Scanner scanner) {System.out.print("Enter username: ");String username = scanner.nextLine();System.out.print("Enter password: ");String password = scanner.nextLine();currentUser = userService.getUserByUsername(username);if (currentUser != null && currentUser.getPassword().equals(password)) {System.out.println("Login successful. Welcome, " + currentUser.getUsername() + "!");} else {currentUser = null;System.out.println("Login failed. Please check your username and password.");}}private void addBook(Scanner scanner) {System.out.print("Enter book title: ");String title = scanner.nextLine();System.out.print("Enter author: ");String author = scanner.nextLine();System.out.print("Enter publisher: ");String publisher = scanner.nextLine();System.out.print("Enter ISBN: ");String isbn = scanner.nextLine();bookService.addBook(title, author, publisher, isbn);System.out.println("Book added successfully.");}private void borrowBook(Scanner scanner) {System.out.print("Enter book ID to borrow: ");int bookId = scanner.nextInt();scanner.nextLine(); // Consume newlineLocalDate dueDate = LocalDate.now().plusWeeks(2); // Borrow period of 2 weeksbookService.borrowBook(bookId, currentUser.getId(), dueDate);System.out.println("Book borrowed successfully.");}private void returnBook(Scanner scanner) {System.out.print("Enter book ID to return: ");int bookId = scanner.nextInt();scanner.nextLine(); // Consume newlinebookService.returnBook(bookId);System.out.println("Book returned successfully.");}private void viewBorrowedBooks() {List<BorrowRecord> borrowRecords = borrowRecordService.getBorrowRecordsByUserId(currentUser.getId());if (borrowRecords.isEmpty()) {System.out.println("You have not borrowed any books.");} else {System.out.println("Your borrowed books:");for (BorrowRecord record : borrowRecords) {Book book = bookService.getBookById(record.getBookId());System.out.println("Book Title: " + book.getTitle());System.out.println("Borrow Date: " + record.getBorrowDate
() + "   Due Date: " + record.getDueDate());System.out.println("------------------------------------------------");}}}public static void main(String[] args) {LibraryManagementSystem libraryManagementSystem = new LibraryManagementSystem();libraryManagementSystem.run();}
}

在上述示例中,我们创建了一个简单的命令行用户界面,允许用户注册、登录、添加图书、借阅图书、归还图书以及查看已借阅的图书。界面根据用户的登录状态显示不同的选项。

总结

通过本博客,我们详细介绍了如何使用Java编程语言创建一个简单的图书管理系统。系统包括用户管理模块、图书管理模块和借阅管理模块,以及相应的数据模型、数据访问对象和服务类。此外,我们还提供了一个简单的命令行用户界面,允许用户与系统进行交互。

要构建完整的图书管理系统,您可能需要进一步扩展和优化代码,包括添加异常处理、安全性、性能优化等方面的功能。希望本博客能够帮助初学者了解如何使用Java创建一个基本的图书管理系统,并为后续学习和开发提供参考。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

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

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

相关文章

HTML+VUE+element-ui通过点击不同按钮展现不同页面

完整源码可以私聊我&#xff0c;需要一点点费用~ 页面展示 方案一 方案二 代码解释 方案一&#xff1a;使用v-show 这种方案只适合有两种页面 现在form表单中设置好要展现的页面名&#xff08;此处的url没有作用不用管&#xff09; 通过一个两个for循环分别将form表单填入…

基于 Socket 网络编程

基于 Socket 网络编程 前言一、基于Socket的网络通信传输&#xff08;传输层&#xff09;二、UDP 的数据报套接字编程1、UDP 套接字编程 API2、使用 UDP Socket 实现简单通信 三、TCP 流套接字编程1、TCP 流套接字编程 API2、使用 TCP Socket 实现简单通信3、使用 Tcp 协议进行…

GIT 提交过滤非必要文件

1、git ls-files&#xff1a;该命令会列出Git仓库中管理的所有文件 2、git rm -r -f --cached . -f 是强制删除 最后的点 是删除所有 git rm -r --cached . 3、 进入Preferences->plugins 中下载一个(.ignore)插件  在项目本地new一个(.gitignore)的文件新增需要过滤文…

推荐一个AI人工智能技术网站(一键收藏,应有尽有)

1、Mental AI MentalAI&#xff08;https://ai.ciyundata.com/&#xff09;是一种基于星火大模型和文心大模型的知识增强大语言模型&#xff0c;专注于自然语言处理&#xff08;NLP&#xff09;领域的技术研发。 它具备强大的语义理解和生成能力&#xff0c;能够处理各种复杂的…

C语言自定义类型(下)

大家好&#xff0c;我们今天来学习C语言自定义类型剩下的内容。 目录 1.枚举 2.联合 1.枚举类型 枚举顾名思义就是一一列举。 把可能的取值一一列举。 一周的星期一到星期日是有限的7天&#xff0c;可以一一列举。 性别有&#xff1a;男、女、保密&#xff0c;也可以一一列…

windows Visual Studio 2022 opengl开发环境配置

1. 安装glew(GL), GLFW, glm, soil2-debug 还需要premake生成visual studio solution cmake for windows也要安装一个&#xff0c; 但是不用安装MinGW64, bug多 下载源码&#xff0c;找到xxx.sln文件用visual stidio打开solution编译代码&#xff0c;找到xxx.lib, xxx.dll文件…

python过滤敏感词

敏感词一般是指带有敏感政治倾向&#xff08;或反执政党倾向&#xff09;、暴力倾向、不健康色彩的词或不文明用语&#xff0c;论坛、网站管理员一般会设定一些敏感词&#xff0c;以防不当发言影响论坛、网站环境。若论坛、网站设置了敏感词&#xff0c;用户编辑的内容又含有敏…

Vue模板语法【下】事件处理器,表单、自定义组件、通信组件

目录 一、事件处理器 1.1常用的事件修饰符 1.2常用的按键修饰符 二&#xff0c;vue中的表单 三、自定义组件 四&#xff0c;通信组件 一、事件处理器 1.1常用的事件修饰符 Vue的事件修饰符是用来改变事件的默认行为或者添加额外的功能。以下是一些常用的事件修饰符及其…

checksec使用

checksec Relro&#xff1a;Full Relro&#xff08;重定位表只读&#xff09; Relocation Read Only&#xff0c; 重定位表只读。重定位表即.got 和 .plt个表。 Stack&#xff1a;No Canary found&#xff08;能栈溢出&#xff09; 栈保护。栈溢出保护是一种缓冲区溢出攻击缓解…

Lostash同步Mysql数据到ElasticSearch(二)logstash脚本配置和常见坑点

1. logstash脚本编写&#xff08;采用单文件对应单表实例&#xff09; 新建脚本文件夹 cd /usr/local/logstash mkdir sql & cd sql vim 表名称.conf #如: znyw_data_gkb_logstash.conf 建立文件夹&#xff0c;保存资源文件更新Id mkdir -p /data/logstash/data/last_r…

深入理解 Swift 新并发模型中 Actor 的重入(Reentrancy)问题

问题现象 我们知道,Swift 5.5 引入的新并发模型极大简化了并行逻辑代码的开发,更重要的是:使用新并发模型中的 Actor 原语可以大大降低并发数据竞争的可能性。 不过,即便 Actor 有如此神奇之功效,它也不是“万能药”,仍不能防止误用带来的问题。比如:Actor 重入(Reen…

Centos7安装go解释器

Centos7安装go解释器 下载解压go压缩包编辑go变量结果验证 下载解压go压缩包 # 下载 wget -c https://go.dev/dl/go1.20.2.linux-amd64.tar.gz# 解压到指定目录 tar xvf go1.20.2.linux-amd64.tar.gz -C /usr/local/编辑go变量 /etc/profile.d/go.sh # 指定go执行程序位置 e…

【软件测试】资深测试聊,自动化测试分层实践,彻底打通高阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试的分层…

spring6概述

spring6 1、概述1.1、Spring是什么&#xff1f;1.2、Spring 的狭义和广义1.3、Spring Framework特点1.4、Spring模块组成1.5、Spring6特点1.5.1、版本要求 2.2、构建模块2.3、程序开发2.3.1、引入依赖2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序分…

LeetCode算法二叉树—144. 二叉树的前序遍历

目录 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&am…

Leetcode 386. 字典序排数

文章目录 题目代码&#xff08;9.22 首刷看解析&#xff09; 题目 Leetcode 386. 字典序排数 代码&#xff08;9.22 首刷看解析&#xff09; 迭代DFS class Solution { public:vector<int> lexicalOrder(int n) {vector<int> ret(n);int number 1;for(int i 0…

可视化工具Datart踩(避)坑指南(4)——丢失的精度

作为目前国内开源版本最好用的可视化工具&#xff0c;Datart无疑是低成本高效率可供二开的可视化神兵利器。当然&#xff0c;免费的必然要付出一些踩坑的代价。本篇我们来讲一讲可视化工具Datart踩&#xff08;避&#xff09;坑指南&#xff08;4&#xff09;之丢失的精度。 版…

麦肯锡:中国生成式AI市场现状和未来发展趋势

本文来自《麦肯锡中国金融业CEO季刊》&#xff0c;版权归麦肯锡所有。该季刊主要围绕生成式AI&#xff08;以下简称“GenAI”&#xff09;主题&#xff0c;通过4大章节共8篇文章&#xff0c;全面深入分析了GenAI对各主要行业的影响、价值链投资机会、中国GenAI市场现状和未来趋…

【QandA C++】内存泄漏、进程地址空间、堆和栈、内存对齐、大小端和判断、虚拟内存等重点知识汇总

目录 内存泄漏 内存模型 、进程地址空间 堆和栈的区别 内存对齐 大端小端及判断 虚拟内存有什么作用 内存泄漏 概念: 是指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况, 内存泄漏并不是指内存在物理上的消失, 而是应用程序分配了某段内存后, 因为设计错误…

Leetcode---363周赛

题目列表 2859. 计算 K 置位下标对应元素的和 2860. 让所有学生保持开心的分组方法数 2861. 最大合金数 2862. 完全子集的最大元素和 一、计算k置为下标对应元素的和 简单题&#xff0c;直接暴力模拟&#xff0c;代码如下 class Solution { public:int sumIndicesWithKS…