图书管理系统(Mysql+MyEclipse+Struts2+Hibernate)
1、数据库与数据表的设计
1.1设计数据表(由于操作失误数据表重构略有差异)
1. 读者类别表(tb_reader_type)
序号 | 字段名 | 数据类型 | 说明 |
1 | type_id | SmallInt | 读者类别【主键】 |
2 | type_name | varchar(20) | 读者类别名称【唯一、非空】 |
3 | type_canLendQty | Int | 可借书数量 |
4 | type_canLendDay | Int | 可借书天数 |
5 | type_canContinueTimes | Int | 可续借的次数 |
6 | type_punishRate | Float | 罚款率(元/天) |
7 | type_dateValid | SmallInt | 证书有效期(年)【非空,0表示永久有效】 |
2. 读者信息表(tb_reader)
序号 | 字段名 | 数据类型 | 说明 |
1 | rd_id | Int | 读者编号/借书证号【主键】 |
2 | rd_name | nvarchar(20) | 读者姓名 |
3 | rd_sex | nchar(1) | 性别,男/女 |
4 | rd_type | SmallInt | 读者类别【外键tb_reader_type】【非空】 |
5 | rd_dept | nvarchar (20) | 单位代码/单位名称 |
6 | rd_phone | nvarchar(25) | 电话号码 |
7 | rd_email | nvarchar(25) | 电子邮箱 |
8 | rd_dateReg | datetime | 读者登记日期/办证日期 |
9 | rd_photo | image | 读者照片 |
10 | rd_status | nchar(2) | 证件状态,3个:有效、挂失、注销 |
11 | rd_borrowQty | Int | 已借书数量(缺省值0) |
12 | rd_pwd | nvarchar (20) | 读者密码(初值123456),可加密存储 |
13 | rd_adminRoles | SmallInt | 管理角色,0-读者、1-借书证管理、2-图书管理、4-借阅管理、8-系统管理,可组合 |
分析提示:(1)可将管理员另外建表,与读者信息分开单独进行设计。(2)单位rdDept可以采用名称,若采用代码则需另建一张表:单位代码与名称对照表,这样便于按单位统计。(3)管理角色(rdAdminRoles)也可设计为4个bit类型字段。
3. 图书信息表(tb_book)
序号 | 字段名 | 数据类型 | 说明 |
1 | bk_id | Int | 图书序号【标识列,主键】 |
2 | bk_code | Nvarchar (20) | 图书编号或条码号(前文中的书号) |
3 | bk_name | Nvarchar(50) | 书名 |
4 | bk_author | Nvarchar(30) | 作者 |
5 | bk_press | Nvarchar(50) | 出版社 |
6 | bk_datePress | datetime | 出版日期 |
7 | bk_ISBN | Nvarchar (15) | ISBN书号 |
8 | bk_catalog | Nvarchar(30) | 分类号(如:TP316-21/123) |
9 | bk_language | SmallInt | 语言,0-中文,1-英文,2-日文,3-俄文, 4-德文,5-法文 |
10 | bk_pages | Int | 页数 |
11 | bk_price | Money | 价格 |
12 | bk_dateIn | DateTime | 入馆日期 |
13 | bk_brief | Text | 内容简介 |
14 | bk_cover | image | 图书封面照片 |
15 | bk_status | NChar(2) | 图书状态,在馆、借出、遗失、变卖、销毁 |
说明:bk_code为前文中的书号,这里没有设计为关键字,而增加bkID字段作为表关键字,其原因为:防止新书入库时起始书号输入错误时,因关键字而不易修改。
4. 借阅信息表(tb_borrow)
序号 | 字段名 | 数据类型 | 说明 |
1 | bw_id | int | 借书顺序号【主键】 |
2 | bw_rd_id | Int | 读者序号【外键tb_reader】 |
3 | bw_bk_id | Int | 图书序号【外键tb_book】 |
4 | bw_idContinueTimes | Int | 续借次数(第一次借时,记为0) |
5 | bw_idDateOut | DateTime | 借书日期 |
6 | bw_idDateRetPlan | DateTime | 应还日期 |
7 | bw_idDateRetAct | DateTime | 实际还书日期 |
8 | bw_idOverDay | Int | 超期天数 |
9 | bw_idOverMoney | Decimal(5,2) | 超期金额(应罚款金额) |
10 | bw_idPunishMoney | Decimal(5,2) | 罚款金额 |
11 | bw_isHasReturn | Varchar(2) | 是否已经还书,缺省为0-未还 |
12 | bw_operatorLend | Nvarchar(20) | 借书操作员 |
13 | bw_operatorRet | Nvarchar(20) | 还书操作员 |
分析提示:借阅信息即用于图书的借还管理,同时又是统计分析的主要信息来源,故要求保持其历史信息。设计时不能以(读者序号+图书序号)为关键字,否则读者不能第二次借阅同一本书了。
1.2 创建数据库
(1) 创建数据库:db_library;
(2) 创建登录名:root,密码:123456;
(3) 创建上述4张数据表及约束;
(4) 表结构架构图如下:
(5) 具体sql语句如下:
CREATE TABLE `tb_book` (
`bk_id` int(11) NOT NULL AUTO_INCREMENT,
`bk_code` varchar(20) NOT NULL,
`bk_name` varchar(50) NOT NULL,
`bk_author` varchar(30) NOT NULL,
`bk_press` varchar(50) DEFAULT NULL,
`bk_datePress` date DEFAULT NULL,
`bk_ISBN` varchar(15) DEFAULT NULL,
`bk_language` varchar(20) DEFAULT NULL,
`bk_pages` int(11) DEFAULT NULL,
`bk_price` decimal(5,2) DEFAULT NULL,
`bk_dateIn` datetime DEFAULT NULL,
`bk_brief` text,
`bk_cover` longblob,
`bk_status` char(2) NOT NULL,
`bk_catalog` varchar(255) DEFAULT NULL,
PRIMARY KEY (`bk_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
CREATE TABLE `tb_borrow` (
`bw_id` bigint(20) NOT NULL AUTO_INCREMENT,
`bw_rd_id` int(11) NOT NULL,
`bw_bk_id` int(11) NOT NULL,
`bw_idContinueTimes` int(11) DEFAULT NULL,
`bw_idDateOut` datetime DEFAULT NULL,
`bw_idDateRetPlan` datetime DEFAULT NULL,
`bw_idDateRetAct` datetime DEFAULT NULL,
`bw_idOverDay` int(11) DEFAULT NULL,
`bw_idOverMoney` decimal(19,2) DEFAULT NULL,
`bw_idPunishMoney` decimal(19,2) DEFAULT NULL,
`bw_isHasReturn` varchar(255) DEFAULT NULL,
`bw_operatorLend` varchar(255) DEFAULT NULL,
`bw_operatorRet` varchar(255) DEFAULT NULL,
PRIMARY KEY (`bw_rd_id`,`bw_bk_id`),
KEY `FKq20ewrvrofdxm6idxd6ldf64d` (`bw_bk_id`),
KEY `bw_id` (`bw_id`),
CONSTRAINT `FKcrf0u8bx7oa6ggwd1fm1wsc2c` FOREIGN KEY (`bw_rd_id`) REFERENCES `tb_reader` (`rd_id`),
CONSTRAINT `FKq20ewrvrofdxm6idxd6ldf64d` FOREIGN KEY (`bw_bk_id`) REFERENCES `tb_book` (`bk_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `tb_reader` (
`rd_id` int(11) NOT NULL AUTO_INCREMENT,
`rd_name` varchar(255) DEFAULT NULL,
`rd_sex` varchar(255) DEFAULT NULL,
`rd_dept` varchar(255) DEFAULT NULL,
`rd_phone` varchar(255) DEFAULT NULL,
`rd_email` varchar(255) DEFAULT NULL,
`rd_dateReg` datetime DEFAULT NULL,
`rd_photo` longblob,
`rd_status` varchar(255) DEFAULT NULL,
`rd_borrowQty` int(11) DEFAULT NULL,
`rd_pwd` varchar(255) DEFAULT NULL,
`rd_adminRoles` int(11) DEFAULT NULL,
`rd_type` int(11) DEFAULT NULL,
PRIMARY KEY (`rd_id`),
KEY `FKfw03j67ou6push07rmr9x9erw` (`rd_type`),
CONSTRAINT `FKfw03j67ou6push07rmr9x9erw` FOREIGN KEY (`rd_type`) REFERENCES `tb_reader_type` (`type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
CREATE TABLE `tb_reader_type` (
`type_id` int(11) NOT NULL AUTO_INCREMENT,
`type_name` varchar(255) DEFAULT NULL,
`type_canLendQty` int(11) DEFAULT NULL,
`type_canLendDay` int(11) DEFAULT NULL,
`type_canContinueTimes` int(11) DEFAULT NULL,
`type_punishRate` decimal(19,2) DEFAULT NULL,
`type_dateVaild` int(11) DEFAULT NULL,
PRIMARY KEY (`type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
1.3 系统实现
1.3.1 创建持久层类
ReaderType类:
Reader类:
Book类:
Borrow类:
其中构造方法、get/set方法省略。
1.3.2 建立Hibernate5的映射关系
包含一个hibernate5的核心映射,4个对应实体类的文件映射,共5个映射文件。
1.3.3 构建基本的页面结构
1.3.4 建立Struts2框架WEB层/Action&Interceptor
1.3.5 创建Service层控制前端/后端数据
1.3.6 创建DAO层进行数据服务端数据交互
1.3.7 创建WEB层/Interceptor权限管理模块
按照流程这一步才实现Interceptor,具体结构见3.4.
1.4 总结
1.4.1 局部问题总结
在对Borrow表进行操作的时候一定要注意Borrow的特殊身份(Reader与Book的中间表),在Hibernate配置文件中中设置了Reader的inverse为false使的Reader拥有管理Book的权限,但是如果删除Reader下的Book就会导致Borrow表中的记录同时删除,也就不能再对这个Borrow操作了,最开始没有注意一直报空指针错误,找了半天还抽出模块测试都没有用,最后仔细分析报错和代码想到了这一点,在此列出警醒自己。
由于之前对Mysql存储图片/text文件不够熟悉,这次做起来很是棘手;在百度上找了好久,各数不同很是苦恼,最后在大量资料下发现图片文件在Mysql下对应longblob对应java中的byte[]然后在图片文件转byte[]过程中一直出错再加上个人对文件流传输的不够理解走了很多弯路,具体的方法这里就不做过多介绍可以从源代码中得知,上传后的图片采用Tomcat的相对路径的形式存储再Tomcat中的指定文件夹image/下。
1.4.2整体总结
整体开发不够高效,还是因为前期开发中的思路不够明确,技术难点、重点不够清晰。需求分析、系统分析必不可少不能偷懒,好的前期分析,将事半功倍。总体上页面交互性不够好、页面友好型不够好,因为本人不喜欢前端设计,但是页面还是需要稍微优化一下,才能拿的出手!
GitHub源码:https://github.com/SCAsMessi/AdminLibrary
谢谢阅读! ----知飞翀