目录
- 设计目的
通过项目驱动的学习和综合实训,熟练掌握运用Java语言进行桌面应用程序开发的基本知识和技能;熟练掌握JAVA的基本语法与JDBC数据库技术的应用;进一步熟悉MySQL Server数据库的数据库管理(数据库的创建、备份与恢复、函数与存储过程的应用、数据导入导出、作业的调度等)、表的设计(表的创建、修改、删除,字段的默认值、约束及关系等)、数据的查询处理(insert、update、delete、select语句的应用)等技术;并能结合数据库应用技术和软件工程技术进行桌面应用程序的开发。
- 设计形式
以图书管理员项目为载体,充分了解项目开发流程,采用前后端分离技术,将项目进行拆分,利用MySQL数据库保存相关数据,利用servlet技术实现前后端数据传输。从而实现通信,从而达成完整的项目。
1、设计任务与目的
设计出Java图书管理系统
基础框架搭建
功能要求
- 对系统登陆后进行增删改查功能
- 用主页面提供用户登录,包括用户名、密码,管理员可进行“登陆”和“修改”户名,密码登陆
- 管理员系统管理、基础管理、读者管理、图书查询管理、借阅以及归还管理
- 普通用户:图书查询管理、个人信息修改、密码、借阅以及归还管理
2、设计思路
由于我们本次管理系统主要采用面向对象的设计模式,将项目进行模块化拆分,做到将复杂问题简单化,其中本项目主要涉及到了几个模块,主要是管理员操作模块,普通用户操作模块,以及登录注册模块。其中管理员和普通用户是很多地方都可以复用的。登录模块是管理员和普通用户共有的,其中的登录,修改个人信息,修改密码这些操作都可以单独封装以供调用。然后因为数据量比较大,所以我们还需要数据库的支持,我们需要建造一个数据库去保存及被调用相关数据信息。同时为保证美观及后期迭代优化的简易性,我们将项目进行前后端分类,前端主要利用jsp,后端利用java配合上mysql数据库,利用利用servlet技术实现前后端通信,达到最终的实现效果。
设计模式
设计模式是面向对象的程序设计人员用来解决编程问题的一种形式化表示。本系统开发采用目前一种目前广泛流行的软件设计模式MVC。MVC(Model-View - Controller)应用程序结构被用来分析分布式应用程序的特征。这种抽象结构能有助于将应用程序分割成若干逻辑部件,使程序设计变得更加容易。把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。如下图所示:
3、概要设计
Java图书管理系统:
本图书管理系统总体上分为前台页面显示和后台管理
3.1系统结构图设计
3.2开发工具与运行环境
PC机 IDEA2020.1 JDK1.8 tomcat8.5.57 MySQL5.7.16 windows10
4、详细设计
4.1系统用户用例图
4.2用户登录用例图
4.3业务流程图
4.4数据流程图
4.5数据字典
4.5.1Admin 用户表
字段名 | 类型 | 说明 | 备注 |
aid | int(11) | 用户id | PRIMARY KEY NOTNULLAUTO_INCREMENT |
username | varchar(20) | 账号 | CHARACTERSETgbkCOLLATE gbk_bin NOT NULL |
name | varchar(20) | 读者的姓名 | DEFAULT NULL |
password | varchar(64) | 密码 | DEFAULT NULL |
| varchar(255) | 邮箱 | DEFAULT NULL |
phone | varchar(20) | 手机号 | DEFAULT NULL |
status | int(2) | 用来判断是管理员还是读者,读者的值为1,管理员为2 | DEFAULT '1' |
lend_num | int(11) | 可借阅天数 | DEFAULT NULL |
max_num | int(11) | 最大可借数 | DEFAULT NULL |
4.5.2 book书籍表
字段名 | 类型 | 说明 | 备注 |
bid | int(11) | Bookid | PRIMARY KEY NOTNULLAUTO_INCREMENT |
name | varchar(205) | 图书名称 | NOT NULL |
card | varchar(205) | 图书号 | CHARACTER SET utf8 NOT NULL UNIQUE KEY `ISBN` |
autho | varchar(205) | 作者 | DEFAULT NULL |
num | int(11) | 图书数量 | NOT NULL |
press | varchar(205) | 出版社 | DEFAULT NULL |
type | varchar(255) | 图书的分类 | DEFAULT NULL |
4.5.3 booktype书籍分类表
字段名 | 类型 | 说明 | 备注 |
tid | int(11) | 分类的id | PRIMARY KEY NOTNULLAUTO_INCREMENT |
name | varchar(20) | 分类的名称 | NOT NULL |
4.5.4 history借阅历史表
字段名 | 类型 | 说明 | 备注 |
hid | int(11) | 借阅记录的id | PRIMARY KEY NOTNULLAUTO_INCREMENT |
aid | int(11) | 读者的id | DEFAULT NULL |
bid | int(11) | 图书的id | DEFAULT NULL |
card | char(255) | 图书号 | DEFAULT NULL |
bookname | char(255) | 图书名称 | DEFAULT NULL |
adminname | char(255) | 读者的账号 | DEFAULT NULL |
username | char(255) | 读者的姓名 | DEFAULT NULL |
begintime | char(255) | 借阅时间 | DEFAULT NULL |
endtime | char(255) | 要还书的时间 | DEFAULT NULL |
status | int(11) | 表示借阅状态,1为正在借阅,2是已经还书 | DEFAULT NULL |
4.6数据库介绍
本数据库构建了四个表,分别是admin表,book表,booktype表,和history表。有数据自己表及其各表之间的关系可以得出:
- book和booktype是一对多的关系。
- Admin和history表是一对多的关系
- Book和history表是一对多的关系
- 由2,3可推出 admin表和book表是多对多的关系。
4.6.2数据库实现
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `admin`
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`aid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) CHARACTER SET gbk COLLATE gbk_bin NOT NULL,
`name` varchar(20) DEFAULT NULL,
`password` varchar(64) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`status` int(2) DEFAULT '1',
`lend_num` int(11) DEFAULT NULL,
`max_num` int(11) DEFAULT NULL,
PRIMARY KEY (`aid`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=gbk;
-- ----------------------------
-- Records of admin
-- ----------------------------
INSERT INTO `admin` VALUES ('1', '123', '12355678', '123', '12348', '1234558', '1', '0', '5');
INSERT INTO `admin` VALUES ('2', '13', '13', '13', '13', '13', '2', '13', '13');
INSERT INTO `admin` VALUES ('4', '456', '456', '456', '456', '456', '1', '30', '5');
INSERT INTO `admin` VALUES ('5', '543', '5', '5', '5', '5', '1', '5', '5');
-- ----------------------------
-- Table structure for `book`
-- ----------------------------
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`bid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(205) NOT NULL,
`card` varchar(205) CHARACTER SET utf8 NOT NULL,
`autho` varchar(205) DEFAULT NULL,
`num` int(11) NOT NULL,
`press` varchar(205) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL,
PRIMARY KEY (`bid`),
UNIQUE KEY `ISBN` (`card`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=gbk;
-- ----------------------------
-- Records of book
-- ----------------------------
INSERT INTO `book` VALUES ('4', '12', '12', '1', '1', '1', '3234');
INSERT INTO `book` VALUES ('2', '5', '5', '5', '5', '5', '323');
INSERT INTO `book` VALUES ('3', '6', '6', '4', '4', '4', '53');
INSERT INTO `book` VALUES ('5', '9', '9', '9', '9', '9', '3234');
-- ----------------------------
-- Table structure for `booktype`
-- ----------------------------
DROP TABLE IF EXISTS `booktype`;
CREATE TABLE `booktype` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
PRIMARY KEY (`tid`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=gbk;
-- ----------------------------
-- Records of booktype
-- ----------------------------
INSERT INTO `booktype` VALUES ('1', '3234');
INSERT INTO `booktype` VALUES ('2', '53');
INSERT INTO `booktype` VALUES ('4', '6');
-- ----------------------------
-- Table structure for `history`
-- ----------------------------
DROP TABLE IF EXISTS `history`;
CREATE TABLE `history` (
`hid` int(11) NOT NULL AUTO_INCREMENT,
`aid` int(11) DEFAULT NULL,
`bid` int(11) DEFAULT NULL,
`card` char(255) DEFAULT NULL,
`bookname` char(255) DEFAULT NULL,
`adminname` char(255) DEFAULT NULL,
`username` char(255) DEFAULT NULL,
`begintime` char(255) DEFAULT NULL,
`endtime` char(255) DEFAULT NULL,
`status` int(11) DEFAULT NULL,
PRIMARY KEY (`hid`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of history
-- ----------------------------
INSERT INTO `history` VALUES ('1', '1', '2', '5', '5', '123', '123', '2018-2-10', '2018-3-10', '0');
INSERT INTO `history` VALUES ('2', '1', '3', '6', '6', '123', '123', '2018-2-10', '2018-2-10', '0');
INSERT INTO `history` VALUES ('3', '1', '2', '5', '5', '123', '1235567', '2018-2-11', '2018-2-11', '0');
INSERT INTO `history` VALUES ('4', '4', '3', '6', '6', '456', '456', '2018-2-11', '2018-2-12', '0');
INSERT INTO `history` VALUES ('5', '1', '4', '1', '1', '123', '1235567', '2018-2-12', '2018-2-12', '0');
4.7 E-R实体图设计
5、软件需求
5.1系统登录模块
图 5-1登陆流程图
具体运行效果如图5-2所示。
图5-2登陆页面
5.2添加图书信息模块
其代码关键程序代码如下所录:
(1)添加图书类型:
@WebServlet("/AddBookTypeServlet")
public class AddBookTypeServlet extends HttpServlet{
public AddBookTypeServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String name = request.getParameter("name");
TypeDao typeDao= new TypeDao();
typeDao.addBookType(name);
response.sendRedirect("/admin_booktype.jsp");
}
}
addBookType方法实现:
public void addBookType(String name) {
Connection conn=DBUtil.getConnection();
String sql="insert into booktype(name) values(?)";
int rs=0;
PreparedStatement stm = null;
try {
stm = conn.prepareStatement(sql);
stm.setString(1,name);
rs = stm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
(2)添加图书:
@WebServlet("/AddBookServlet")
public class AddBookServlet extends HttpServlet {
public AddBookServlet() {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String card = request.getParameter("card");
String name = request.getParameter("name");
String type = request.getParameter("type");
String autho = request.getParameter("autho");
String press = request.getParameter("press");
int num = Integer.parseInt(request.getParameter("num"));
BookDao typeDao= new BookDao();
typeDao.addBook(card,name,type,autho,press,num);
response.sendRedirect("/admin_book.jsp");
}
}
addBook方法实现:
public void addBook(String card, String name, String type, String autho, String press, int num) {
Connection conn = DBUtil.getConnection();
String sql = "insert into book(card,name,type,autho,press,num) values(?,?,?,?,?,?)";
int rs = 0;
PreparedStatement stm = null;
try {
stm = conn.prepareStatement(sql);
stm.setString(1, card);
stm.setString(2, name);
stm.setString(3, type);
stm.setString(4, autho);
stm.setString(5, press);
stm.setInt(6, num);
rs = stm.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
5.3 查看图书借阅记录模块
其代码关键程序代码如下所录:
public ArrayList<BookBean> getLikeList(String name) {
ArrayList<BookBean> tag_ArrayList = new ArrayList<BookBean>();
Connection conn = DBUtil.getConnection();
String sql = "select * from book where name like '%" + name + "%'";
PreparedStatement stm = null;
ResultSet rs = null;
try {
stm = conn.prepareStatement(sql);
rs = stm.executeQuery();
while (rs.next()) {
BookBean tag = new BookBean();
tag.setBid(rs.getInt("bid"));
tag.setName(rs.getString("name"));
tag.setCard(rs.getString("card"));
tag.setAutho(rs.getString("autho"));
tag.setType(rs.getString("type"));
tag.setPress(rs.getString("press"));
tag.setNum(rs.getInt("num"));
tag_ArrayList.add(tag);
}
} catch (SQLException e) {
e.printStackTrace();
}
return tag_ArrayList;
}
6、参考文献
[1]李钟尉,《JAVA开发实战1200例》(第一卷),清华出版社,2011
[2]曲培新,《JAVA项目开发案例精粹》,电子工业出版社2010
[3]宛延周,《JAVA编程技巧》,机械工业出版社,2005