1. 程式人生 > >大學生都經歷過的圖書管理系統(Mysql+MyEclipse+Struts2+Hibernate)--附帶原始碼喲!

大學生都經歷過的圖書管理系統(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整體總結

整體開發不夠高效,還是因為前期開發中的思路不夠明確,技術難點、重點不夠清晰。需求分析、系統分析必不可少不能偷懶,好的前期分析,將事半功倍。總體上頁面互動性不夠好、頁面友好型不夠好,因為本人不喜歡前端設計,但是頁面還是需要稍微優化一下,才能拿的出手!


GitHub原始碼:https://github.com/SCAsMessi/JavaStudy/tree/master/CSDN/Web%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/%E5%9B%BE%E4%B9%A6%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F

 

                                                                                                                                 謝謝閱讀!    ----知飛翀