Java图书管理系统,课程设计必用(源码+文档)

Java图书管理系统,课程设计必用(源码+文档)”是一款Java语言编写的图书管理系统,它拥有完整的源码和开发文档,可供学生们作为课程设计的参考资料。下面将详细讲解该系统的开发和使用过程。

功能介绍

该系统主要实现了图书管理系统的基本功能,包括图书的添加、修改、删除和查询,读者的注册、借阅、归还和查询,管理员的登录和注销等。此外,该系统还实现了权限管理和数据统计功能,使管理员能够更加方便地管理图书馆。

开发环境

  • 操作系统:Windows 10
  • Java版本:jdk1.8.0_201
  • 数据库:MySQL 5.7.26
  • 开发工具:Eclipse 2019-03
  • 项目构建工具:Maven

开发过程

1. 数据库设计

该系统需要用到一个数据库来存储图书、读者和管理员的信息。下面是数据库设计:

CREATE TABLE `book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `author` varchar(100) NOT NULL,
  `publisher` varchar(100) NOT NULL,
  `price` float(10,2) NOT NULL,
  `num` int(11) NOT NULL,
  `total` int(11) NOT NULL,
  `intro` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `reader` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `sex` varchar(10) NOT NULL,
  `birth` date NOT NULL,
  `address` varchar(100) NOT NULL,
  `tel` varchar(20) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `admin` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `borrow` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `bookId` int(11) NOT NULL,
  `readerId` int(11) NOT NULL,
  `borrowDate` date NOT NULL,
  `returnDate` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `bookId` (`bookId`),
  KEY `readerId` (`readerId`),
  CONSTRAINT `borrow_ibfk_1` FOREIGN KEY (`bookId`) REFERENCES `book` (`id`),
  CONSTRAINT `borrow_ibfk_2` FOREIGN KEY (`readerId`) REFERENCES `reader` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2. 系统架构

系统采用MVC架构,分为数据模型、控制器和用户界面三部分。其中数据模型负责与数据库中的表进行交互,控制器负责将用户界面与数据模型联系起来,并实现系统的具体功能,用户界面则提供给用户进行操作的界面。

3. 实现代码

系统的具体实现涉及到很多代码,包括数据模型的实现、控制器的实现和用户界面的实现。这里只介绍部分代码,具体代码可参考源码。

3.1 数据模型

数据模型包括对数据库表的操作以及相关bean的定义。下面是Book表对应的bean定义和相关操作:

public class Book {
  private Integer id;
  private String name;
  private String author;
  private String publisher;
  private Float price;
  private Integer num;
  private Integer total;
  private String intro;
  //省略getter和setter方法
}

public class BookDao {
  //添加图书
  public boolean addBook(Book book) {
    String sql = "insert into book(name, author, publisher, price, num, total, intro) values(?,?,?,?,?,?,?)";
    return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro());
  }
  //修改图书信息
  public boolean modifyBook(Book book) {
    String sql = "update book set name=?, author=?, publisher=?, price=?, num=?, total=?, intro=? where id=?";
    return JDBCUtil.executeUpdate(sql, book.getName(), book.getAuthor(), book.getPublisher(), book.getPrice(), book.getNum(), book.getTotal(), book.getIntro(), book.getId());
  }
  //删除图书
  public boolean deleteBook(Integer id) {
    String sql = "delete from book where id=?";
    return JDBCUtil.executeUpdate(sql, id);
  }
  //查询所有图书
  public List<Book> queryAll() {
    String sql = "select * from book";
    return JDBCUtil.executeQuery(sql, Book.class);
  }
  //查询图书总数量
  public Integer getTotalNum() {
    String sql = "select sum(num) from book";
    return JDBCUtil.queryForInt(sql);
  }
  //查询图书总价值
  public Float getTotalPrice() {
    String sql = "select sum(price*total) from book";
    return JDBCUtil.queryForFloat(sql);
  }
  //借出图书
  public boolean lendOut(Integer bookId, Integer readerId) {
    //判断库存数量是否足够
    if (queryById(bookId).getNum() <= 0) {
      return false;
    }
    String sql = "insert into borrow(bookId, readerId, borrowDate) values(?,?,?)";
    boolean flag = JDBCUtil.executeUpdate(sql, bookId, readerId, new Date());
    if (flag) {
      //库存数量减1
      updateNum(bookId, -1);
    }
    return flag;
  }
  //归还图书
  public boolean returnBook(Integer bookId, Integer readerId) {
    String sql = "update borrow set returnDate=? where bookId=? and readerId=? and returnDate is null";
    boolean flag = JDBCUtil.executeUpdate(sql, new Date(), bookId, readerId);
    if (flag) {
      //库存数量加1
      updateNum(bookId, 1);
    }
    return flag;
  }
  //根据图书ID查询图书
  public Book queryById(Integer id) {
    String sql = "select * from book where id=?";
    return JDBCUtil.queryForOne(sql, Book.class, id);
  }
  //更新图书库存数量
  private boolean updateNum(Integer bookId, Integer num) {
    String sql = "update book set num=num+? where id=?";
    return JDBCUtil.executeUpdate(sql, num, bookId);
  }
}

3.2 控制器

控制器实现了系统的具体功能,它负责将用户的操作转化为对数据模型的具体操作,并将结果反馈给用户界面。下面是管理员登录的实现:

public class AdminServiceImpl implements AdminService {
  private AdminDao adminDao = new AdminDao();
  //管理员登录
  public boolean login(String name, String password) {
    Admin admin = adminDao.queryByName(name);
    if (admin == null) {
      //账号不存在
      return false;
    } else if (!admin.getPassword().equals(password)) {
      //密码错误
      return false;
    } else {
      //登录成功
      return true;
    }
  }
}

3.3 用户界面

用户界面提供了便捷的操作界面,使得用户的操作更加方便。下面是管理员登录界面的实现:

public class LoginFrame extends JFrame {
  private JTextField nameField;
  private JPasswordField passwordField;
  //登录按钮
  private ActionListener loginAction = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
      String name = nameField.getText();
      String password = new String(passwordField.getPassword());
      if (name.length() == 0 || password.length() == 0) {
        JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码不能为空!");
        return;
      }
      AdminService adminService = new AdminServiceImpl();
      if (adminService.login(name, password)) {
        JOptionPane.showMessageDialog(LoginFrame.this, "登录成功!");
        new MainFrame().setVisible(true);
        LoginFrame.this.dispose();
      } else {
        JOptionPane.showMessageDialog(LoginFrame.this, "用户名或密码错误!");
      }
    }
  };
  public LoginFrame() {
    setTitle("管理员登录");
    setSize(300, 200);
    setLocationRelativeTo(null);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //用户名
    JLabel nameLabel = new JLabel("用户名:");
    nameField = new JTextField(20);
    JPanel namePanel = new JPanel();
    namePanel.add(nameLabel);
    namePanel.add(nameField);
    //密码
    JLabel passwordLabel = new JLabel("密码:");
    passwordField = new JPasswordField(20);
    JPanel passwordPanel = new JPanel();
    passwordPanel.add(passwordLabel);
    passwordPanel.add(passwordField);
    //登录按钮
    JButton loginButton = new JButton("登录");
    JPanel buttonPanel = new JPanel();
    buttonPanel.add(loginButton);
    loginButton.addActionListener(loginAction);
    //整合所有组件
    JPanel panel = new JPanel(new GridLayout(3, 1, 5, 5));
    panel.add(namePanel);
    panel.add(passwordPanel);
    panel.add(buttonPanel);
    add(panel);
  }
}

使用说明

该系统可以通过以下步骤进行使用:

  1. 下载并导入源代码到Eclipse。
  2. 创建数据库,并修改/src/main/resources/jdbc.properties中的相关配置。
  3. 运行程序,登录管理员账号,开始进行图书管理。

示例

下面是两个示例,一个是添加图书,一个是借阅图书:

示例1:添加图书

  1. 登录管理员账号。
  2. 在主菜单中选择“添加图书”。
  3. 在弹出的对话框中填写图书信息,点击“确认”。
  4. 图书添加成功,返回主菜单。

示例2:借阅图书

  1. 登录读者账号。
  2. 在主菜单中选择“借阅图书”。
  3. 在弹出的对话框中选择需要借阅的图书,点击“确认借阅”。
  4. 借阅成功,返回主菜单。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java图书管理系统,课程设计必用(源码+文档) - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • php 目录与文件处理-郑阿奇(续)

    针对 “php 目录与文件处理-郑阿奇(续)” 这一主题,以下是一份完整的攻略: 一、概述 该篇文章主要讲解了PHP中如何进行目录及文件处理,包括如何创建、重命名、删除文件和目录,同时也介绍了如何读取目录中的文件等基本操作。 二、PHP中的文件处理 2.1 创建文件 使用 PHP 提供的 file_put_contents 函数可以快速的创建文件,示例如下:…

    Java 2023年6月15日
    00
  • Mybatis非配置原因,导致SqlSession was not registered for synchronization异常

    “Mybatis非配置原因,导致SqlSession was not registered for synchronization异常”是一个在Mybatis框架中常见的异常错误。具体原因可能是以下几个方面: 事务管理器没有配置正确; 对于Spring + Mybatis的项目,没有将SqlSession交给Spring容器管理; 没有正确使用Mybatis…

    Java 2023年5月19日
    00
  • 深入研究spring boot集成kafka之spring-kafka底层原理

    深入研究Spring Boot集成Kafka之Spring Kafka底层原理 简介 Kafka是一个高效、可伸缩的消息系统,而Spring Kafka则是Spring Framework旗下的一个开源库,它提供了对Kafka的集成支持。本文将深入讲解Spring Kafka的底层原理,并提供两个示例代码来帮助读者更好地理解。 Spring Kafka的核心…

    Java 2023年5月20日
    00
  • PHP5中MVC结构学习

    让我们先来介绍一下MVC结构。MVC是Model-View-Controller的缩写,它是一种常用的开发模式,可以将应用程序的逻辑、数据和外观分离。这种模式的基本思想是将应用分为三个部分: Model – 模型层,处理数据和业务逻辑 View – 视图层,展示数据给用户 Controller – 控制器层,处理用户交互和调度模型和视图 MVC模式的优势在于…

    Java 2023年5月20日
    00
  • 一文搞懂Spring循环依赖的原理

    一文搞懂Spring循环依赖的原理 Spring容器中的循环依赖是指两个或多个Bean彼此之间相互依赖。这种情况下,容器就无法完成Bean实例化,从而导致应用程序无法正常启动。因此,解决循环依赖问题是Spring框架中一个非常重要的问题。 循环依赖的概念 循环依赖是指两个或多个Bean之间出现了相互依赖的情况。例如:Bean1依赖于Bean2,而Bean2又…

    Java 2023年5月19日
    00
  • Spring.Net框架简介

    Spring.Net框架简介 Spring.Net 是一个开源的 .NET 应用程序框架,它是 Java Spring 框架的 .NET 版本。Spring.Net 提供了一种简单的方法来创建可测试、松散耦合的应用程序,它支持依赖注入、面向切面编程、配置管理等功能。本文将详细介绍 Spring.Net 框架的基本概念、核心组件和使用方法。 基本概念 在 Sp…

    Java 2023年5月18日
    00
  • 关于logBack配置日志文件及编码配置的问题

    关于logBack配置日志文件及编码配置的完整攻略如下: 1. 导入Logback依赖 首先需要在项目中导入Logback依赖,可以在pom.xml中进行配置: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic&…

    Java 2023年5月20日
    00
  • Java获得当前时间前指定几个小时具体时间的方法示例

    获取当前时间前几个小时的具体时间,可以用Java中的java.util.Calendar或java.time.LocalDateTime类。 用java.util.Calendar实现 import java.util.Calendar; import java.util.Date; public class GetTimeBeforeHours { pub…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部