Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Java 基础篇】Java 图书管理系统详解

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

作者头像
繁依Fanyi
发布于 2023-10-12 09:08:23
发布于 2023-10-12 09:08:23
2.2K01
代码可运行
举报
运行总次数:1
代码可运行

介绍

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

功能需求

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

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

数据模型

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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开发工具(例如EclipseIntelliJ IDEA或VS Code)
  • 数据库(可以选择关系型数据库MySQLSQLite,也可以选择文件存储
  • Java数据库连接库(例如JDBC)
  • 项目构建工具(例如Maven或Gradle)

用户管理模块

用户实体类

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User {
    private int id;
    private String username;
    private String password;
    private String email;
    private UserRole role;

    // 构造函数、getter和setter方法
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum UserRole {
    ADMIN,
    USER
}
用户数据访问对象(DAO)

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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来执行数据库操作,例如添加用户、删除用户、查询用户等。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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和归还日期等属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是一个枚举类型,表示图书的状态,可以定义为“可借阅”和“已借出”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum BookStatus {
    AVAILABLE,
    CHECKED_OUT
}
图书数据访问对象(DAO)

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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来执行数据库操作,例如添加图书、删除图书、查询图书等。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、借阅日期和归还日期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BorrowRecord {
    private int id;
    private int bookId;
    private int userId;
    private LocalDate borrowDate;
    private LocalDate returnDate;

    // 构造函数、getter和setter方法
}
借阅记录数据访问对象(DAO)

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 (SQLException
        e) {
            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来执行数据库操作,例如记录借阅和归还图书、查询用户的借阅记录以及查询图书的借阅记录。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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界面,具体实现方式取决于您的需求和技术栈。用户界面需要调用用户服务类、图书服务类和借阅记录服务类来实现用户注册、登录、添加图书、借阅图书、归还图书等功能。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 newline

                switch (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 newline

                switch (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 USER
        UserRole 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 newline
        LocalDate dueDate = LocalDate.now().plusWeeks(2); // Borrow period of 2 weeks

        bookService.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 newline

        bookService.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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Simulink建模与仿真(9)-动态系统模型及其Simulink表示(连续系统模型及表示)
与离散系统不同,连续系统是指系统输出在时间上连续变化,而非仅在离散的时刻采样取值。连续系统的应用非常广泛,下面给出连续系统的基本概念。
用户9925864
2023/09/19
9190
Simulink建模与仿真(9)-动态系统模型及其Simulink表示(连续系统模型及表示)
【Matlab】创建连续时间模型(控制系统工具箱)
控制系统工具箱™提供了用于创建线性时不变 (LTI) 模型的四个基本表示形式的函数:
DevFrank
2024/07/24
2230
【Matlab】创建连续时间模型(控制系统工具箱)
Matlab仿真PID控制(带M文件、simulink截图和参数分析)
线性定常系统的控制中,PID是个非常常见的控制方式,如果可以通过Matlab仿真出PID的控制效果图,那么对系统设计时的实时调试将会容易得多。在这里我们将会以一个利用系统辨识参数的PID设计为为例展示Matlab仿真PID的过程。 首先需要对一个未知的系统的参数进行辨识,以延迟环节可以忽略不计的电机调速系统为例。将时间戳导入xdata向量,对应的时刻转速导入ydata向量,进行系统辨识
全栈程序员站长
2022/09/06
5.2K0
Matlab仿真PID控制(带M文件、simulink截图和参数分析)
Simulink建模与仿真(10)-Simulink混合系统模型及表示
混合系统是由不同类型的系统共同构成的,因此混合系统的数学描述可以由不同类型系统描述共同构成。但是由于混合系统的复杂性,一般难以用单独的数学模型进行描述或表达,因此混合系统一般都是由系统各部分输入与输出间的数学方程所共同描述的,下面举例说明。
用户9925864
2023/11/15
4490
Simulink建模与仿真(10)-Simulink混合系统模型及表示
动态系统建模与仿真MATLAB Simulink的应用案例
动态系统建模与仿真是工程、控制、物理等领域中的重要研究方向。MATLAB Simulink提供了一种直观的图形化环境,使得建模与仿真变得更加高效。本文将深入探讨动态系统建模的基本概念,并通过具体的应用案例展示如何使用MATLAB Simulink进行动态系统的建模与仿真。
一键难忘
2025/01/08
4890
Scipy 高级教程——控制系统分析与设计
Scipy 提供了强大的控制系统分析与设计工具,可以用于设计和分析线性时不变系统。本篇博客将深入介绍 Scipy 中的控制系统工具,并通过实例演示如何应用这些工具。
Echo_Wish
2024/01/20
2150
现代控制理论(机器人方向)考核要求与Matlab(Octave)简明教程
版权声明:本文为zhangrelay原创文章,有错请轻拍,转载请注明,谢谢... https://blog.csdn.net/ZhangRelay/article/details/88654172
zhangrelay
2019/04/09
8030
现代控制理论(机器人方向)考核要求与Matlab(Octave)简明教程
现代控制理论习题解答与Matlab程序示例
http://download.csdn.net/detail/zhangrelay/9544934
zhangrelay
2019/01/23
1.6K0
【Matlab】创建离散时间模型(控制系统工具箱)
创建离散时间模型的语法与连续时间模型的语法类似,只是还必须提供采样时间(采样间隔以秒为单位)。
DevFrank
2024/07/24
2550
【Matlab】创建离散时间模型(控制系统工具箱)
滑模控制器理论推导和matlab/simulink实例分享
前天有个微信好友咨询了一些滑模控制器的设计和理论推导,故整理一下相关的资料和内容分享,
用户9925864
2023/09/05
1.7K0
滑模控制器理论推导和matlab/simulink实例分享
自动控制理论笔记
\(G(s) = \frac{a}{s+a}\) \(\frac{1}{a}\)是时间常数\(\tau\),对应上升为0.63 \(4\tau\)对应阶跃响应0.98
列夫托尔斯昊
2020/08/25
2K0
自动控制理论笔记
Simulink建模与仿真(7)-动态系统模型及其Simulink表示(简单系统模型及表示)
不同系统具有不同数量的输入与输出;一般来说,输入输出数目越多,系统越复杂。最简单的系统一般只有一个输入与一个输出,而且任意时刻的输出只与当前时刻的输入有关。首先介绍简单系统的基本概念以及简单系统的Simulink表示。
用户9925864
2023/09/18
3470
Simulink建模与仿真(7)-动态系统模型及其Simulink表示(简单系统模型及表示)
Simulink建模与仿真(1)-基本一些概念
为了能全面、正确地理解系统仿真,需要对系统仿真所研究的对象进行概要的了解。这里对与系统仿真相关的知识——系统与系统模型进行简单的介绍。
用户9925864
2023/09/05
4560
Simulink建模与仿真(1)-基本一些概念
【自动控制原理】数学模型:控制系统的运动微分方程、拉氏变换和反变换、传递函数
拉氏变换是一种线性变换,将变量从时间域变换到复数域,将微分方程变换为s 域中的代数方程来处理。
Qomolangma
2024/07/30
5180
【自动控制原理】数学模型:控制系统的运动微分方程、拉氏变换和反变换、传递函数
怎样利用 MATLAB 进行实时系统的建模与仿真?
需要注意的是,MATLAB可以进行离散时间仿真和连续时间仿真,对于实时系统的仿真,通常采用离散时间仿真。在进行离散时间仿真时,需要注意设置适当的采样时间,以保证仿真结果的准确性。
程序员阿伟
2024/12/09
3220
基于Simulink实现模糊PID仿真
        传统 PID 控制器自出现以来,凭借其控制原理简单、稳定性好、工作可靠、易于实现等优点成为工业控制主要技术,常被用于机器人驱动控制。但是传统 PID 参数整定异常麻烦,当被控对象的结构和参数具有一定的不确定性,无法对其建立精确的模型时,传统 PID 无法进行实时调节, 为了获得更好的速度控制性能和循迹动态响应,但常规PID 控制难以解决被控对象数学模型复杂、非线性以及时变不确定性等系统问题,而自适应模糊 PID 控制可以有效解决此问题。本文依靠 MATLAB/SIMULINK 的模糊逻辑工具箱的Fuzzy Logic Controller 与常规 PID Controller 结合,针对水下航行器控制系统进行PID仿真实验。
2024/12/15
1.3K0
基于Simulink实现模糊PID仿真
死磕带通滤波器
与陷波器类似,带通滤波器在数字电源控制领域有重要作用。比如在三相LCL逆变器的谐振抑制控制方面,通过带通滤波器可以提取谐振点附近的频谱做进一步的控制策略。在有源电力滤波器利用带通滤波器可以提取电网信号的基波频率从而做进一步的控制。
全栈程序员站长
2022/06/26
8990
死磕带通滤波器
Matlab滤波器设计:Z变换与Z逆变换原理及Matlab实现代码
Z变换在离散时间信号与系统中的地位相当于拉普拉斯变换在连续时间信号与系统中的地位。它可以求解常系数差分方程,进而估算一个线性时不变系统的响应及线性滤波器的设计。
用户1143655
2023/02/23
3.7K0
Matlab滤波器设计:Z变换与Z逆变换原理及Matlab实现代码
信号与系统实验四 LTI系统的时域分析
在连续时间LTI系统中,冲激响应和阶跃响应是系统特性的描述﹐对它们的分析是线性系统中极为重要的问题。输入为单位冲激函数àt)所引起的零状态响应称为单位冲激响应,简称冲激响应﹐用h(t)表示;输人为单位阶跃函数u(t)所引起的零状态响应称为单位阶跃响应,简称为阶跃响应﹐用g(t)表示。
timerring
2022/07/20
1.5K0
信号与系统实验四 LTI系统的时域分析
基于matlab的控制系统与仿真-2
image.png 试求其零极点模型和状态空间模型。 >> sys1=tf([2 18 40],[1 6 11 6 ]) sys1 = 2 s^2 + 18 s + 40 ---------------------- s^3 + 6 s^2 + 11 s + 6 Continuous-time transfer function. >> sys2=zpk(sys1) sys2 = 2 (s+5) (s+4) ----------------- (s+3)
AXYZdong
2020/10/30
4220
基于matlab的控制系统与仿真-2
推荐阅读
相关推荐
Simulink建模与仿真(9)-动态系统模型及其Simulink表示(连续系统模型及表示)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验