大學生都經歷過的圖書管理系統(Mysql+MyEclipse+Struts2+Hibernate)--附帶原始碼喲!
圖書管理系統(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整體總結
整體開發不夠高效,還是因為前期開發中的思路不夠明確,技術難點、重點不夠清晰。需求分析、系統分析必不可少不能偷懶,好的前期分析,將事半功倍。總體上頁面互動性不夠好、頁面友好型不夠好,因為本人不喜歡前端設計,但是頁面還是需要稍微優化一下,才能拿的出手!
謝謝閱讀! ----知飛翀