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日

相关文章

  • js如何设置在iframe框架中指定div不显示

    使用JavaScript直接在iframe中指定div不显示的方法: 在iframe框架中使用JavaScript来控制指定div元素的display属性,让其不显示。可以使用以下的代码实现: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&…

    Java 2023年6月16日
    00
  • 使用SpringBoot配置https(SSL证书)

    使用 Spring Boot 配置 HTTPS (SSL 证书) 的完整攻略 在本文中,我们将详细介绍如何使用 Spring Boot 配置 HTTPS (SSL 证书)。我们将介绍 HTTPS 的概念、配置方式和提供两个示例。 HTTPS 概念 HTTPS (Hyper Text Transfer Protocol Secure) 是一种通过 SSL/TL…

    Java 2023年5月15日
    00
  • SpringMVC核心DispatcherServlet处理流程分步详解

    SpringMVC核心DispatcherServlet处理流程分步详解 SpringMVC是一个非常流行的Java Web开发框架,它提供了很多便捷的功能,其中包括DispatcherServlet。DispatcherServlet是SpringMVC框架中的一个核心组件,它负责接收HTTP请求并将请求分发给对应的处理器。本文将详细介绍Dispatche…

    Java 2023年5月17日
    00
  • SpringBoot框架集成token实现登录校验功能

    下面是详细讲解SpringBoot框架集成token实现登录校验功能的完整攻略。 一、什么是Token 在Web开发中,服务端不能直接拿到客户端的登录状态,而客户端又需要传递一些数据,这时就需要一种机制来帮助服务端识别客户端的身份,这种机制就是Token。 Token是一种令牌,本质上就是一个字符串,客户端在登录时通过身份验证后,服务端会返回给客户端一个To…

    Java 2023年5月19日
    00
  • Linux下Tomcat8如何修改JVM内存配置

    下面是详细的攻略: 准备工作 在修改Tomcat JVM内存配置之前,需要先确认是否已经安装了JDK。如果尚未安装,请先安装。安装JDK的详细步骤可以参考JDK安装指南。 修改JVM内存配置 打开Tomcat安装目录下的bin文件夹,并找到catalina.sh文件。 打开catalina.sh文件,在文件末尾添加以下代码: JAVA_OPTS=”-Xms5…

    Java 2023年5月20日
    00
  • Netty序列化深入理解与使用

    Netty序列化深入理解与使用 简介 Netty是基于NIO实现的Java网络编程框架,它也是目前使用最为广泛的Java网络编程框架之一。在进行远程通信时,往往需要将对象进行序列化、反序列化后再进行传输,Netty自带了一些序列化方式,比如JDK序列化、Protobuf等,使用Netty内置的序列化方式可以方便地实现对象的传输。本文将详细讲解Netty序列化…

    Java 2023年5月20日
    00
  • Java 8中字符串拼接新姿势StringJoiner详解

    Java 8中字符串拼接新姿势StringJoiner详解 在Java 8中,使用StringJoiner类可以更方便地进行字符串拼接。这个类可以让我们无需显式地使用字符串缓冲区或分隔符,并且支持指定开头和结尾的字符串,还可以在一些场景下避免空值引起的问题。 StringJoiner的用法 构造函数 首先,我们需要知道StringJoiner类的构造函数有如…

    Java 2023年5月26日
    00
  • java实现简单的学生信息管理系统代码实例

    针对“java实现简单的学生信息管理系统代码实例”的完整攻略,以下是详细讲解过程: 1.准备工作 首先,我们要在本地安装Java开发环境(Java Development Kit,简称JDK),可以从Oracle官网上下载并安装最新版JDK,安装过程中需要设置环境变量,以便于后续命令行操作。 2.创建项目 接下来,我们创建项目文件夹来存放程序代码和相关文件,…

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