一、项目需求和计划
项目需求和计划
二、项目设计
项目设计
三、设备要求
根据图书馆管理系统项目的需求背景陈述,可以确定本项目分为客户端和管理端,客户端主要功能是提供借阅者的图书信息查询、借阅图书、归还图书等。管理端的功能提供图书管理员和系统管理员两类人使用。图书管理员能更好的对于读者信息、图书信息进行查看、增加、修改、删除。系统管理员能更好的管理图书馆信息和图书管理员信息。它们的关系如图45所示。
3.1 系统运行的网络环境要求
本系统的网络拓扑结构图如图46所示,无论是客户端的借阅者还是管理端的管理用户都可以通过网络登录到本系统中。借阅者可以通过网络查询图书的相关信息,进行借阅图书或者归还图书等功能,图书管理员通过网络对于借阅者借阅信息进行管理。管理端的系统管理员需要设置管理端的用户以及相应的权限。
图46网络拓扑结构图
3.2 系统运行的硬件环境要求
本系统的硬件环境如下:
借阅者使用的电脑:
普通PC | |
CPU | P100GHz |
内存 | 256MB以上 |
支持版本 | 能够运行IE5.0以上或者Netscape4.0以上版本的机器 |
分辨率 | 推荐使用1024×768像素 |
管理员使用电脑:
普通电脑 | |
CPU | P100GHz |
内存 | 512MB以上 |
支持版本 | 能够运行IE5.0以上或者Netscape4.0以上版本的机器 |
分辨率 | 推荐使用1024×768像素 |
Web服务器 | |
CPU | P100GHz |
内存 | 2G以上 |
硬盘 | 100GB以上 |
网卡 | KMb/s速度 |
数据库服务器 | |
CPU | P100GHz |
内存 | 2GB以上 |
硬盘
硬盘 | 100GB以上 |
3.3 系统运行软件环境要求
本系统的软件环境如下:
操作系统 | 中文Windows10 |
数据库 | SQL Server 2000 |
开发工具包 | JDK,java |
Web服务器 | Tomcat |
浏览器 | Windows |
四、项目实现过程
4.1 基于Java环境的系统功能分析以及其代码实现
第一步:创建一个BOOK类来定义图书 public class Book { private String bookName; private String authorName; private double price; private String type; private boolean isBorrowed; public Book(String bokName, String authorName, double price, String type) { this.bookName = bokName; this.authorName = authorName; this.price = price; this.type = type; } public String getBookName() { return bookName; } public void setBookName(String bokName) { this.bookName = bokName; } public String getAuthorName() { return authorName; } public void setAuthorName(String authorName) { this.authorName = authorName; } public double getPrice() { return price; } public void setPrice(double 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; } @Override public String toString() { return "Book{" + "bookName='" + bookName + '\'' + ", authorName='" + authorName + '\'' + ", price=" + price + ", type='" + type + '\'' + (isBorrowed ? " 已借出" : " 未借出") + '}'; } 第二步:创建一个BookList类来定义具体有什么图书 public class BookList { private Book[] books; private int BookUseSize; public BookList() { books = new Book[5]; books[0] = new Book("三国演义", "施耐庵", 68.8, "小说"); books[1] = new Book("水浒传", "罗贯中", 56.6, "小说"); books[2] = new Book("西游记", "吴承恩", 60, "小说"); this.BookUseSize = 3; } public void setBooks(int i, Book book) { if (i >= books.length) { expansion(); } books[i] = book; } public Book getPosBooks(int i) { return books[i]; } public void setBooksUseSize(int i) { this.BookUseSize = i; } public int getBooksUseSize() { return this.BookUseSize; } public void expansion() { books = Arrays.copyOf(books, 2 * books.length); } 第三步:创建和用户相关的类(也就是使用者) 创建User也就是父类的特征 public abstract class User { protected String userName; public User(String userName) { this.userName = userName; } } 创建管理员,来管理图书书籍 public class Administrator extends User { public Administrator(String userName) { super(userName); } } 创建普通用户,继承父类Users public class GeneralUser extends User { public GeneralUser(String userName) { super(userName); } } 第四步:创建一切程序的入口,也就是我们系统的主类 import Book.BookList; import User.User; import User.Administrator; import User.GeneralUser; import java.util.Scanner; public class Main { public static User login() { System.out.println("请输入你的姓名:>"); Scanner scanner = new Scanner(System.in); String userName = scanner.nextLine(); while (true) { System.out.println("请输入你的身份:> 1,管理员 0,普通用户"); int choice = scanner.nextInt(); if (choice == 1) { return new Administrator(userName);//发生多态 } else if (choice == 0) { return new GeneralUser(userName);//发生多态 } else { System.out.println("选择错误,请重新选择:>"); } } } public static void main(String[] args) { User user = login(); } 第五步:创建菜单包实现抽象类定义的接口 public class Administrator extends User { public Administrator(String userName) { super(userName); } public int menu() { System.out.println("====hello," + super.userName + " welcome===="); System.out.println("1,查找图书"); System.out.println("2,新增图书"); System.out.println("3,删除图书"); System.out.println("4,显示图书"); System.out.println("0,退出系统"); System.out.println("请输入你的操作:>"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } } 2、GeneralUser类(2/3) public class GeneralUser extends User { public GeneralUser(String userName) { super(userName); } public int menu() { System.out.println("====hello," + super.userName + " welcome===="); System.out.println("1,查找图书"); System.out.println("2,借阅图书"); System.out.println("3,归还图书"); System.out.println("0,退出系统"); System.out.println("请输入你的操作:>"); Scanner scanner = new Scanner(System.in); return scanner.nextInt(); } } 3、User类 public abstract class User { protected String userName; public User(String userName) { this.userName = userName; } public abstract int menu()} 最后一步:函数针对我们系统实现其六大功能 1、新增图书AddOperation类 package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class AddOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==新增图书=="); addBookOperation(bookList); } public void addBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入书名:>"); String bookName = scanner.nextLine(); System.out.println("请输入作者名:>"); String authorName = scanner.nextLine(); System.out.println("请输入书的类型:>"); String type = scanner.nextLine(); System.out.println("请输入书的单价:>"); Double price = scanner.nextDouble(); Book book = new Book(bookName, authorName, price, type); int currentSize = bookList.getBooksUseSize(); bookList.setBooks(currentSize, book); bookList.setBooksUseSize(currentSize + 1); System.out.println("新增成功!"); } } 2、展示图书DisplayOperation类 package Operation; import Book.BookList; public class DisplayOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==展示图书=="); displayBooksOperation(bookList); } public void displayBooksOperation(BookList bookList) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { System.out.println(bookList.getPosBooks(i)); } } } 3、查找图书FindOperation类 package Operation; import Book.Book; import Book.BookList; import java.util.Scanner; public class FindOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==查找图书=="); Scanner scan = new Scanner(System.in); System.out.println("请输入查找的方式:> 1,按书名查找 0,按作者查找"); int find = scan.nextInt(); scan.nextLine(); String[] howToFind = new String[] {"作者名", "书名"}; System.out.println("请输入你要查找的" + howToFind[find] +":>"); String bookName = scan.nextLine(); int result = findBooksOperation(bookList, bookName, find); if (result == -1) { System.out.println("未找到该书!"); return; } System.out.println(bookList.getPosBooks(result)); } public int findBooksOperation(BookList bookList, String bookName, int mark) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { Book book = bookList.getPosBooks(i); if (mark == 1 && book.getBookName().equals(bookName)) { return i; } if (mark == 0 && book.getAuthorName().equals(bookName)) { return i; } } return -1; } public int findBooksOperation(BookList bookList, String bookName) { int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { Book book = bookList.getPosBooks(i); if (book.getBookName().equals(bookName)) { return i; } } return -1; } } 4、借阅图书BorrowOperation类和归还图书ReturnOperation类 package Operation; import Book.BookList; import BookBook; import java.util.Scanner; public class BorrowOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==借阅图书=="); borrowBookOperation(bookList); } public void borrowBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要借阅的书名:>"); String borrowBookOperation = scanner.nextLine(); FindOperation findOperation = new FindOperation(); int findResult = findOperation.findBooksOperation(bookList, borrowBookOperation); if (findResult == -1) { System.out.println("没有此书信息!"); return; } Book book = bookList.getPosBooks(findResult); book.setBorrowed(true); System.out.println("已借出!"); } } import Book.Book; import Book.BookList; import java.util.Scanner; public class ReturnOperation implements IOperation { @Override public void work(BookList bookList) { System.out.println("==归还图书=="); returnBookOperation(bookList); } public void returnBookOperation(BookList bookList) { Scanner scanner = new Scanner(System.in); System.out.println("请输入要归还的书名:>"); String returnBookOperation = scanner.nextLine(); FindOperation findOperation = new FindOperation(); int findResult = findOperation.findBooksOperation(bookList, returnBookOperation); if (findResult == -1) { System.out.println("没有此书信息!"); return; } Book book = bookList.getPosBooks(findResult); book.setBorrowed(false); System.out.println("已归还!"); } } 5、删除图书DelOperation类 package Operation; import Book.BookList; import Book.Book; import java.util.Scanner; public class DelOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("删除图书"); delBookOperation(bookList); } public void delBookOperation(BookList bookList) { Scanner scan = new Scanner(System.in); System.out.println("请输入要删除的书名:>"); String delName = scan.nextLine(); FindOperation find = new FindOperation(); int result = find.findBooksOperation(bookList, delName); if (result == -1) { System.out.println("没有此书信息!"); return; } int currentSize = bookList.getBooksUseSize(); int i = 0; for (i = result; i < currentSize - 1; i++) { Book book = bookList.getPosBooks(i + 1); bookList.setBooks(i, book); } bookList.setBooks(i,null); bookList.setBooksUseSize(currentSize - 1); System.out.println("已删除!"); } } 6、退出系统ExitOperation类 package Operation; import Book.BookList; public class ExitOperation implements IOperation{ @Override public void work(BookList bookList) { System.out.println("==退出系统=="); System.out.println("你已经退出"); System.exit(0); int currentSize = bookList.getBooksUseSize(); for (int i = 0; i < currentSize; i++) { bookList.setBooks(i, null); } } }
4.2 基于SQLSERVER环境的系统功能分析以及其数据库的搭建
图书信息表t_book
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Book_id | 图书编号 | varchar(15) | 主键 | 否 |
Type_id | 类别编号 | varchar(10) | 外键 | 否 |
Type_name | 类别名称 | varchar(20) | 外键 | 否 |
Book_name | 书名 | varchar(20) | 否 | |
Book_writer | 作者 | varchar(10) | 否 | |
Book_company | 出版社 | varchar(20) | 是 | |
Book_date | 出版日期 | datetime | 是 | |
Book_brief | 简介 | varchar(100) | 是 |
学生信息表t_student
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Stu_id | 学号 | varchar(15) | 主键 | 否 |
Stu_name | 姓名 | varchar(10) | 否 | |
Stu_pwd | 密码 | varchar(20) | 否 | |
Stu_sex | 性别 | varchar(2) | 否 | |
Stu_tel | 联系电话 | varchar(15) | 是 | |
Borrow_num | 借书数量 | number(2) | 默认为0 | 否 |
Stu_Depart | 所在院系 | varchar(10) | 否 |
管理员信息表t_admin
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Admin_id | 工作号 | number(5) | 主键 | 否 |
Admin_name | 姓名 | varchar(10) | 否 | |
Admin_pwd | 密码 | varchar(20) | 否 |
借阅信息表 t_borrow_student
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Book_id | 图书编号 | varchar(15) | 外主键 | 否 |
Stu_id | 学生学号 | varchar(15) | 外主键 | 否 |
Borrow_date | 借阅日期 | datetime | 否 | |
Return_date | 还书日期 | datetime | 否 | |
renew | 是否续借 | varchar(2) | 否 |
图书类别信息表 t_book_type
字段英文名称 | 列名 | 数据类型 | 字段约束 | 可否为空 |
Type_id | 类别编号 | varchar(10) | 外主键 | 否 |
Type_name | 类别名称 | varchar(20) | 外主键 | 否 |
SQL语句创建表
代码如下:
create table t_book_type(--图书类别信息表 t_book_type Type_id varchar(10) not null, --类别编号 Type_name varchar(20) not null, --类别名称 primary key(Type_id ,type_name) ) create table t_book(--图书信息表t_book Book_id varchar(15) not null primary key, --图书编号 Type_id varchar(10) not null, --类别编号 Type_name varchar(20) not null, --类别名称 Book_name varchar(20) not null, --书名 Book_writer varchar(10) not null, --作者 Book_company varchar(20), --出版社 Book_date datetime, --出版日期 Book_brief varchar(100), --简介 Book_price float not null, --价格 foreign key(Type_id,Type_name) references t_book_type(Type_id,Type_name) ) create table t_student(--学生信息表t_student Stu_id varchar(15) not null, --学号 Stu_name varchar(10) not null, --姓名 Stu_pwd varchar(20) not null, --密码 Stu_sex varchar(2) not null check(Stu_sex='男' or Stu_sex='女'), --性别 Stu_tel varchar(15), --联系电话 Borrow_num numeric(2,0) not null default 0 , --表示默认值为0--借书数量 Stu_Depart varchar(10) not null, --所在院系 Stu_liberty_id varchar(6) not null, --借书证号 primary key(Stu_id,Stu_liberty_id) ) create table t_admin(--管理员信息表t_admin Admin_id numeric(5,0) not null primary key, --工作号 Admin_name varchar(10) not null, --姓名 Admin_pwd varchar(20) not null --密码 ) create table t_borrow_student(--借阅信息表 t_borrow_student Book_id varchar(15) not null, --图书编号 Stu_id varchar(15) not null, --学生学号 Borrow_date datetime not null, --借阅日期 Return_date datetime not null, --还书日期 renew varchar(2) not null, --是否续借 Stu_liberty_id varchar(6) not null, --借书证号 primary key(Book_id,Stu_id), foreign key(Book_id) references t_book(Book_id), foreign key(Stu_id,Stu_liberty_id) references t_student(Stu_id,Stu_liberty_id) )
图47图书信息管理系统数据库里面创建的表
insert into t_book_type(Type_id,Type_name)--图书类别信息表 values ('T00001','计算机类'), ('T00002','中国文学'), ('T00003','外国文学'), ('T00004','数学类'), ('T00005','外国语类'), ('T00006','政治类'), ('T00007','天文类'), ('T00008','体育类'), ('T00009','自然科学类'), ('T00010','其他') insert into t_book(Book_id,Type_id,Type_name,Book_name,Book_writer,Book_company,Book_date,Book_brief,Book_price,Book_num)--图书信息表 values ('B00001','T00001','计算机类','数据库系统原理','邓丽','广东电子出版社','2018-08-05','数据库介绍。',40,100), ('B00002','T00001','计算机类','java程序设计','周绍斌','广东电子出版社','2018-07-25','java学习',45,200), ('B00003','T00002','中国文学','文化苦旅','余秋雨','作家出版社','2012-06-01','探索中国文化的历史命运',34.5,100), ('B00004','T00002','中国文学','朝花夕拾','鲁迅','长江文艺出版社','2015-12-29','饱含着浓烈的抒情气息',20.39,100), ('B00005','T00003','外国文学','人间失格','太宰治','现代出版社','2016-10-05','人间失格。',45,100), ('B00006','T00003','外国文学','老人与海','海明威','国际文化出版公司','2016-11-05','外国文学。',20.5,100), ('B00007','T00004','数学类','高等数学','杨爱珍','上海财经大学出版社','2015-10-01','大学生必备数学知识。',29,100), ('B00008','T00005','外国语类','大学英语','陆琳','人民邮电出版社','2016-06-02','大学生必备英语知识。',35.6,100), ('B00009','T00006','政治类','毛泽东思想','刘琳','机械工业出版社','2014-05-09','学习新思想',45,100), ('B00010','T00004','数学类','线性代数','李黎','高等教育出版社','2016-07-28','大学生必备线性知识。',30.5,100) insert into t_admin(Admin_id,Admin_name,Admin_pwd)--管理员信息表 values (1,'李恺','001'), (2,'李军','002'), (3,'张鸿涛','003'), (4,'文章','004'), (5,'詹文海','005'), (6,'李志勇','006'), (7,'梁宇飞','007'), (8,'周永波','008'), (9,'谢玉玉','009'), (10,'范文昊','010'), (11,'刘景页','011') insert into t_student(Stu_id,Stu_name,Stu_pwd,Stu_sex,Stu_tel,Borrow_num,Stu_Depart,Stu_liberty_id)--学生信息表 values ('S00001','张羽','S00001','男','15620354789',0,'计算机学院','R00001'), ('S00002','李飞','S00002','女','13856214521',0,'计算机学院','R00002'), ('S00003','张三','S00003','男','14235689526',0,'外国语学院','R00003'), ('S00004','刘泳景','S00004','男','14785623584',0,'机械学院','R00004'), ('S00005','曹家俊','S00005','男','15623785123',0,'商管学院','R00005'), ('S00006','余大兔','S00006','女','17856241254',0,'法学院','R00006'), ('S00007','刘小青','S00007','女','14562358971',0,'医学院','R00007'), ('S00008','徐俊瑞','S00008','男','18554235561',0,'计算机学院','R00008'), ('S00009','刘千秋','S00009','男','15478620146',0,'计算机学院','R00009'), ('S00010','孙浩楠','s00010','男','14862395209',0,'数媒学院','R00010') insert into publish(p_name,p_id)--出版社信息表 values ('现代出版社','10001'), ('作家出版社','10002'), ('长江文艺出版社','10003'), ('广东电子出版社','10004'), ('人民邮电出版社','10005'), ('高等教育出版社','10006'), ('机械工业出版社','10007'), ('国际文化出版公司','10008'), ('上海财经大学出版社','10009') insert into t_borrow_student(Book_id,Stu_id,Borrow_date,Return_date,renew,Stu_liberty_id,overdue)--借阅信息表 values ('B00001','S00005','2018-10-15','2018-11-10','否','R00005','否'), ('B00002','S00009','2021-06-02','2021-07-01','否','R00009','否'), ('B00003','S00001','2018-09-10','2018-10-05','否','R00001','否'), ('B00004','S00007','2019-10-06','2019-11-05','否','R00007','否'), ('B00005','S00010','2016-05-25','2016-06-20','否','R00010','否'), ('B00006','S00002','2017-10-09','2017-11-06','是','R00002','否'), ('B00006','S00004','2017-11-06','2017-12-06','否','R00004','否'), ('B00007','S00008','2020-09-01','2020-10-01','否','R00008','否'), ('B00010','S00003','2019-11-15','2019-12-09','否','R00003','否'), ('B00010','S00006','2018-08-06','2018-09-06','否','R00006','否')
结果如下:
出版社信息表(Publish):
管理员信息表(t_admin):
图书类别信息表(t_book_type):
借阅信息表(t_borrow_student):
学生信息表(t_student):