图书管理系统(增删改查,附源码,包含数据库交互以及图形化界面)
前言本文旨在用面向对象的思想编程实现图书管理系统功能包括增删改查完整源码放在文末大家有需自取一共3个版本1.0版本基础的Java单机程序2.0版本提供了web图形化页面与数据库可以交互3.0版本在2.0的基础上采用了前后端分离的架构UI更美观功能也更多每个版本都免费给出了源码大家可以在文末按需自取。目录一.效果示例▐ LibrarySystem1.0▐ LibrarySystem2.0▐ LibrarySystem3.0二.LibrarySystem1.0分享▐ 设计与分析▐ 完整代码三.LibrarySystem2.0分享▐ 项目结构及使用注意事项▐ 完整代码三.LibrarySystem3.0分享一.效果示例▐LibrarySystem1.0因为是简单的单击程序所以是通过终端窗口进行增删改查的操作这里给出一些运行截图▐LibrarySystem2.0首先是登录界面在程序运行起来后我们访问浏览器的8080端口的login.html界面即localhost:8080/login.html默认用户名和密码都是adminhttp://localhost:8080/login.html登录完成后自动跳转到图书列表界面在这个界面我们可以进行书籍的增删改查当我们选择添加添加图书即可跳转到相对应的页面然后通过表单的提交我们就可以完成书籍的新增▐LibrarySystem3.0前端后端都启动后浏览器输入下面的网址即可进入系统http://localhost:5173/login登陆界面主要参考腾讯QQ的风格采用圆角阴影和渐变等元素先展示管理员端的页面吧这是管理员登录后首页显示包含图书管理借阅管理用户管理等功能借阅管理用户管理普通用户这方面包含最基础的借阅和查看图书等功能还有双端都有的个人信息的修改这是对应的前后端项目链接点击即可免费下载使用library-system3.0: library-system3.0前端后端项目 --整合介绍文档二.LibrarySystem1.0分享▐设计与分析这部分内容是面向于没有什么开发经验的小白如果你是有一定开发基础的完全跳过这部分即可我们采取面向对象的编程思想将整个图书管理系统抽象出多个对象然后通过各个对象之间的交互来完成我们的整体设计需求我们整体的设计框架如下图我们通过抽取他们的共性做出以下设计我们的书籍放在书架上因此他们处于同一个包内我们的增删查改的操作都是属于用户对图书的操作因此他们处于同一个包内这样也更方便不同用户来调用这些操作用户分为普通用户和管理员用户他们都是对于图书管理系统的直接操作者因此他们处于同一个包中对应我们上述结构图我们如下设计▐书籍和书架书籍(Book)我们应该提供书籍的相关信息书名作者价格书籍类型借阅状态为了体现面向对象的封装特性我们将这些字段信息设为private然后再设置一些public的方法以供给其他对象访问package BookRack; //书籍 public class Book { private String name;//书名 private String author;//作者名 private int price;//价格 private String type;//书的类型 private boolean isBorrowed;//是否已经被借出 public String getName() { return name; } public void setName(String name) { this.name name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author author; } public int getPrice() { return price; } public void setPrice(int price) { this.price price; } public String getType() { return type; } public void setType(String type) { this.type type; } public boolean isBorrowed() { return isBorrowed; } public void setBorrowed(boolean borrowed) { isBorrowed borrowed; } //构造方法初始化 public Book(String name, String author, int price, String type) { //图书默认没有借出所以isBorrowed默认false不需要初始化 this.name name; this.author author; this.price price; this.type type; } //方便我们打印整个书籍的全部信息 Override public String toString() { return Book.Book{ name name \ , author author \ , price price , type type \ }; } }书架(BookRack)书架主要是用来存放书籍的因此我们只需要提供以下俩个信息就可以已经存放的书籍也就是一个书籍数组数组中每一个元素都是一本书籍对象已经存放的书籍的数量为了体现面向对象的封装性我们还是将这些字段信息设为private然后再设置一些public的方法以供给其他对象访问在这里我们实现再书架上存放三本书因此在构造方法中做出相应的初始化package BookRack; //书架 public class BookRack { private Book[] books;//存放的所有的书 private int uesdSize;//书架上已经放的书的数量 public BookRack() { this.books new Book[10];//默认书架可以放10本书 this.books[0] new Book(三国演义,罗贯中,20,小说); this.books[1] new Book(西游记,吴承恩,9,小说); this.books[2] new Book(红楼梦,曹雪芹,19,小说); this.uesdSize 3;//默认书架上有3本书 } //拿到某个位置的书籍 public Book getBooks(int pos) { return books[pos]; } //设置某个位置的书籍 public void setBooks(Book book,int pos) { books[pos] book; } public int getUesdSize() { return uesdSize; } public void setUesdSize(int uesdSize) { this.uesdSize uesdSize; } }▐对书籍的相关操作操作接口(IOperation)所有的操作都是要对于书架进行操作的所以我们在这里提供一个接口供不同操作来实现并且给他们传入书架类的参数package Operation; import BookRack.BookRack; //操作接口 public interface IOperation { //我们的任何增删查改的操作都是对于书架进行操作的所以传入的参数是书架类 void work(BookRack bookRack); }新增图书(AddOperation)首先我们需要让用户输入想要添加的图书的相关信息然后我们为用户输入的图书新建一个对象接下来就是合法性判断我们拿刚才新建的图书对象和书架上的每一个图书对象进行遍历对比如果没有重复的图书就可以存入这本书要存入这本书就调用刚才书架类中提供的方法setBooks在新加一本书籍后对应的书籍数量也得增加也就是调用setUesdSize方法来增加书籍的数量package Operation; import BookRack.BookRack; import BookRack.Book; import java.util.Scanner; public class AddOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(新增图书操作进行中......); Scanner scanner new Scanner(System.in); System.out.println(请输入您要添加的图书的书名); String name scanner.nextLine(); System.out.println(请输入您要添加的图书的作者名); String author scanner.nextLine(); System.out.println(请输入您要添加的图书的价格); int price scanner.nextInt(); System.out.println(请输入您要添加的图书的类型); String type scanner.nextLine(); //因为我们的每一个书都是一个对象书架是一个对象数组我们新加图书的时候就应该新实例化一个对象 Book book new Book(name,author,price,type); //合法性判断 int usedSize bookRack.getUesdSize();//拿到当前书架内放了书的数量 for (int i 0; i usedSize; i) { //遍历书架中的图书挨个对比名字是否相同 Book tempbook bookRack.getBooks(i); if (tempbook.getName().equals(name)) { System.out.println(不能重复添加同一本书请重试); return; } } //可以添加新的图书 bookRack.setBooks(book,usedSize); bookRack.setUesdSize(usedSize1); } }借阅图书(BorrowOperation)首先我们需要让用户输入想要添加的图书的相关信息然后我们为用户输入的图书新建一个对象然后我们挨个遍历书架上的书如果有那就可以借将书籍的借阅状态改为true就可以如果没有就告诉用户没有此书无法借阅package Operation; import BookRack.BookRack; import BookRack.Book; import java.util.Scanner; public class BorrowOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(借阅图书操作进行中......); System.out.println(请输入您想借阅的书名); Scanner scanner new Scanner(System.in); String name scanner.nextLine(); //遍历整个书架 for (int i 0; i bookRack.getUesdSize(); i) { Book temp bookRack.getBooks(i); if (name.equals(temp.getName())) { temp.setBorrowed(true); System.out.println(借阅成功!); return; } } System.out.println(没有查询到您想要借阅的图书请重新尝试); } }删除图书(DeleteOperation)首先要删除图书的第一步应该是先找到这本书因此我们像刚才借阅图书一样先遍历整个书架找到这本书然后记录这本书的位置之后再利用书架提供的setBooks方法来存放这本书如果没有找到那就告诉用户并且退出这个操作package Operation; import BookRack.BookRack; import BookRack.Book; import java.util.Scanner; public class DeleteOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(删除图书操作进行中......); System.out.println(请输入您想删除的书名); Scanner scanner new Scanner(System.in); String name scanner.nextLine(); //要删除的前提是先找到这本书 int uesdSize bookRack.getUesdSize(); int flag -1; int i 0; for (; i uesdSize; i) { Book tempbook bookRack.getBooks(i); if (tempbook.getName().equals(name)) { //找到这本书 flag i; break; } } if (i uesdSize) { System.out.println(查无此书无法删除); return; } //存在这本书进行删除也就是将书架中的书从后向前依次覆盖 for (int j flag; j uesdSize; j) { Book tempbook bookRack.getBooks(j1);//拿到 j1 位置的书 bookRack.setBooks(tempbook,j);//和 j 位置的书交换 } bookRack.setBooks(null,uesdSize-1);//将最后一个位置的图书置为空 bookRack.setUesdSize(uesdSize-1);//图书数量减一 System.out.println(删除成功); } }查找图书(FindOperation)查找图书就非常简单了我们在刚才的删除图书操作中相当于已经完成了这部分操作了package Operation; import BookRack.BookRack; import BookRack.Book; import java.util.Scanner; public class FindOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(查找图书操作进行中......); System.out.println(请输入您想查找的书名); Scanner scanner new Scanner(System.in); String name scanner.nextLine(); int usedSize bookRack.getUesdSize(); for (int i 0; i bookRack.getUesdSize(); i) { Book temp bookRack.getBooks(i); if (name.equals(temp.getName())) { System.out.println(存在这本书信息如下); System.out.println(temp); return; } } System.out.println(没有你要找的这本书书名为 name); } }归还图书(ReturnOperation)和我们的借阅图书操作相同唯一不同的就是这里是将图书的借阅状态改为falsepackage Operation; import BookRack.BookRack; import BookRack.Book; import java.util.Scanner; public class ReturnOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(借阅图书操作进行中......); System.out.println(请输入您想借阅的书名); Scanner scanner new Scanner(System.in); String name scanner.nextLine(); //遍历整个书架 for (int i 0; i bookRack.getUesdSize(); i) { Book tempbook bookRack.getBooks(i); if (name.equals(tempbook.getName())) { tempbook.setBorrowed(false); System.out.println(归还成功!); return; } } System.out.println(没有你要归还的图书name); } }展示图书(ShowOperation)遍历整个书架然后挨个打印输出图书信息就可以了package Operation; import BookRack.Book; import BookRack.BookRack; public class ShowOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(图书列表如下); for (int i 0; i bookRack.getUesdSize(); i) { Book tempbook bookRack.getBooks(i); System.out.println(tempbook); } } }退出系统(ExitOperation)我们这里直接使用exit来结束整个程序就可以package Operation; import BookRack.BookRack; public class ExitOperation implements IOperation{ Override public void work(BookRack bookRack) { System.out.println(退出系统...); System.exit(0); } }▐用户部分用户抽象类(User)在普通用户和管理员用户中存在许多共性因此我们这里设置一个抽象类供普通用户和管理员用户来继承使用package Person; import BookRack.BookRack; import Operation.IOperation; public abstract class User { protected String name;//姓名 protected IOperation[] iOperations;//操作接口数组 public abstract int menu();//菜单 public User(String name) { this.name name; } //供用户来选择操作调用操作接口 public void doOperation(int choice, BookRack bookRack) { IOperation ioperation iOperations[choice]; ioperation.work(bookRack); } }管理员类(Administrator)我们设置管理用户的菜单再对应着菜单设置接口类型的数组的具体操作package Person; import Operation.*; import java.util.Scanner; public class Administrator extends User { public Administrator(String name) { super(name); iOperations new IOperation[]{ new ExitOperation(), new FindOperation(), new AddOperation(), new DeleteOperation(), new ShowOperation() }; } public int menu() { System.out.println(********管理员菜单********); System.out.println(1.查找图书); System.out.println(2.新增图书); System.out.println(3.删除图书); System.out.println(4.显示图书); System.out.println(0.退出系统); System.out.println(************************); System.out.println(请输入你的操作); //通过输入来调用对用的功能 Scanner scanner new Scanner(System.in); int choice scanner.nextInt(); return choice; } }普通用户(NormalUser)和管理员用户的设置一样我们对应的存放接口数组中的操作就可以package Person; import Operation.*; import Person.User; import java.util.Scanner; public class NormalUser extends User { public NormalUser(String name) { super(name); iOperations new IOperation[]{ new ExitOperation(), new FindOperation(), new BorrowOperation(), new ReturnOperation() }; } public int menu() { System.out.println(********普通用户菜单********); System.out.println(1.查找图书); System.out.println(2.借阅图书); System.out.println(3.归还图书); System.out.println(0.退出系统); System.out.println(***************************); System.out.println(请输入你的操作); //通过输入来调用对用的功能 Scanner scanner new Scanner(System.in); int choice scanner.nextInt(); return choice; } }▐main方法(Test)我们再这里设置一个登录程序登录管理员我们就新建一个管理员对象登录普通用户我们就新建一个普通用户对象然后我们根据用户的输入来调用我们菜单中的选项也就是我们刚才设置的接口操作数组中的操作import BookRack.BookRack; import Person.Administrator; import Person.NormalUser; import Person.User; import java.util.Scanner; public class Test { public static User login() { System.out.println(请输入您的名字); Scanner scanner new Scanner(System.in); String name scanner.nextLine(); System.out.println(请确认您的身份); System.out.println(1.管理员); System.out.println(2.普通用户); int choice scanner.nextInt(); if (choice 1) { return new Administrator(name); }else{ return new NormalUser(name); } } public static void main(String[] args) { BookRack bookRack new BookRack(); User user login();//向上转型 while (true) { int choice user.menu(); user.doOperation(choice, bookRack); } } }▐完整代码按照笔者这里对应的包和类的设置进行操作就可以每一个类和包在上文中都完整给出来了如果觉得麻烦的话笔者这里给出对应的源码大家有需要点击链接自取直接下载即可LibrarySystem1.0: 图书管理系统三.LibrarySystem2.0分享该部分内容是因许多粉丝后台私信想要可以和数据库交互并且有一个图形化界面为了满足这样的需求2.0版本应运而生。▐项目结构及使用注意事项该项目采用了SpringBoot MyBatis HTML CSS JavaScript的技术栈。HTML CSS JavaScript三者用来保证给用户提供一个图形化界面整个项目通过SpringBoot来进行搭建通过MyBatis来完成对数据库的增删改查。由于是一个Web项目因此在这里没法进行大篇幅的分析具体的业务逻辑实现故而只能简单的阐述一下基本业务逻辑controller层用来接收用户的信息并且调用service层进行具体的业务逻辑处理再通过调用mapper层进行对数据库的操作为了防止用户非法访问页面通过拦截器来对用户身份进行校验如果用户没有登录就直接操作图书馆则会直接跳转至用户登录界面进行登录操作。项目结构如下该项目是属于Maven的结构因此在使用前需要确保自己本地的Maven没有问题创建数据库表在运行项目之前需要将数据库表创建好笔者这里已经提供了对应的SQL语句只需要执行即可不管是在IDEA还是在Navicat里面运行这段SQL脚本都是可以的项目源码里面也有这个sql脚本直接执行就可以-- 1. 切换到 mysql 系统库 USE mysql; -- 2. 删除并重建数据库 DROP DATABASE IF EXISTS book_test; CREATE DATABASE book_test DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci; -- 3. 切换到新建的数据库 USE book_test; -- 4. 创建用户表优化字段注释、数据类型长度 DROP TABLE IF EXISTS user_info; CREATE TABLE user_info ( id INT NOT NULL AUTO_INCREMENT COMMENT 用户主键ID, user_name VARCHAR(128) NOT NULL COMMENT 用户名唯一, password VARCHAR(128) NOT NULL COMMENT 用户密码, delete_flag TINYINT(4) NULL DEFAULT 0 COMMENT 删除标记0-未删除 1-已删除, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), UNIQUE INDEX idx_user_name (user_name ASC) COMMENT 用户名唯一索引 ) ENGINE INNODB DEFAULT CHARACTER SET utf8mb4 COMMENT 用户信息表; -- 5. 创建图书表优化字段注释、索引 DROP TABLE IF EXISTS book_info; CREATE TABLE book_info ( id INT(11) NOT NULL AUTO_INCREMENT COMMENT 图书主键ID, book_name VARCHAR(127) NOT NULL COMMENT 图书名称, author VARCHAR(127) NOT NULL COMMENT 作者, count INT(11) NOT NULL COMMENT 库存数量, price DECIMAL(7,2) NOT NULL COMMENT 图书价格精确到分, publish VARCHAR(256) NOT NULL COMMENT 出版社, status TINYINT(4) DEFAULT 1 COMMENT 状态0-无效 1-正常 2-不允许借阅, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间, PRIMARY KEY (id), INDEX idx_book_name (book_name) COMMENT 图书名称索引优化查询 ) ENGINE INNODB DEFAULT CHARSET utf8mb4 COMMENT 图书信息表; -- 6. 插入用户初始化数据 INSERT INTO user_info (user_name, password) VALUES (admin, admin), (zhangsan, 123456); -- 7. 插入图书初始化数据批量插入更高效 INSERT INTO book_info (book_name, author, count, price, publish) VALUES (活着, 余华, 29, 22.00, 北京文艺出版社), (平凡的世界, 路遥, 5, 98.56, 北京十月文艺出版社), (三体, 刘慈欣, 9, 102.67, 重庆出版社), (金字塔原理, 麦肯锡, 16, 178.00, 民主与建设出版社); -- 8. 提示执行完成 SELECT 数据库、表创建及初始化数据插入完成 AS 执行结果;修改配置文件为了正确的连接到用户本地的数据库需要确认application.yml配置文件中的数据库连接信息正确即数据库名、数据库用户名以及数据库密码与你本地的一直其他的不需要进行修改补充一下之前很多同学反馈说报错“内部错误”原因就是项目没有连接上数据库基本都是自己这里的配置文件有问题项目环境javajdk17mysql8.3.0▐完整代码源代码在下发连接中给出需要的直接点击进行下载即可LibrarySystem2.0: 图书管理系统2025年12月19日补充很长一段时间没怎么关注过CSDN写过的文章和小项目了今天突然发现很多同学都提出了项目有bug诸如 “内部错误” 这样的今天抽空修改了一下之前会有报错内部错误是因为MySQL 8.0 版本的一个安全机制导致的连接问题核心原因是客户端在认证过程中无法获取服务器的公钥导致项目连接不上本地的数据库其实改一下配置文件 application.yml 中的连接信息就好了三.LibrarySystem3.0分享如果你不知道什么是前后端那就点击这个链接即可整合版本的下载链接library-system3.0: library-system3.0前端后端项目 --整合介绍文档当然如果想要分开下载前后端的应用的话也可以下面是对应的链接使用方法在俩个项目各自的readme.md文档里面都有说明这里就不再赘述了后端项目地址https://gitee.com/luming-02/library-system3.0前端项目地址https://gitee.com/luming-02/library-system-vue本次的分享就到此为止了希望我的分享能给您带来帮助创作不易也欢迎大家三连支持你们的点赞就是博主更新最大的动力如有不同意见欢迎评论区积极讨论交流让我们一起学习进步有相关问题也可以私信博主评论区和私信都会认真查看的我们下次再见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2483274.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!