JavaSe进阶项目——图书管理系统
一、图书管理系统需求分析
一、背景分析
一直以来人们使用传统的人工方式管理图书资料。这种方式存在着许多缺点,如效率低、保密性差且较为繁琐。图书管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高图书管理的效率。因此,开发一套能够为用户提供充足的信息和快捷的查询手段的图书管理系统,将是非常必要的,也是十分及时的。
二、功能模块分析

上图为图书馆管理系统的功能模块概览,该图书馆管理系统主要分为两大模块:
一、管理员模块
1.1、用户管理
| 模块功能 | 说明 |
|---|---|
| 管理员登录 | 用户输入用户名和密码进行登录,并作出相应提示,登录的同时需要对其身份进行验证,判断此用户为管理员还是普通账户,如果为管理员,则跳转到管理员界面,如果为普通用户则跳转到普通用户界面。 |
| 管理员添加 | 在管理员界面,管理员选择管理员添加操作,可进行管理员添加,添加时需要进行重名检测。 |
| 普通用户列表查询 | 选择普通用户列表查询,可查询所有已经注册的普通用户的基本信息列表(密码等隐私信息不可显示)。 |
| 用户账户禁用与开启 | 管理员可对指定的普通用户进行账号禁用和开启操作,用户账号禁用后则不能进行登录。 |
1.2、书籍管理
| 模块功能 | 说明 |
|---|---|
| 书籍添加 | 管理员在书籍管理界面进行书籍的添加,书籍添加时,书籍名可以重复,但是需要书籍编号作为主键。 添书籍基础信息时,要指定此书籍的类别编号,可单独定义一张书籍类别表和书籍表关联,但是此类别表事先定义好数据,不作任何修改。 |
| 书籍删除 | 管理员通过书籍编号可对指定的书籍进行删除,前提是这本书处于无人借阅状态,否则删除失败。 |
| 书籍修改 | 管理员通过书籍编号可对指定书籍的信息进修改。 |
| 书籍列表查询 | 进行书籍列表查询时,需要管理员选择要查询的字段(如书籍名、书籍作者、书籍类型),查询时都是进行模糊查询。 |
| 书籍详情查看 | 根据书籍编号进行书籍详细信息显示。 |
二、普通用户模块
2.1、用户个人信息管理
| 模块功能 | 说明 |
|---|---|
| 用户登录 | 用户输入用户名和密码进行登录,并作出相应提示,登录的同时需要对其身份进行验证,判断此用户为管理员还是普通账户,如果为管理员,则跳转到管理员界面,如果为普通用户则跳转到普通用户界面。 |
| 用户注册 | 普通使用此图书馆平台时,需要进行用户注册,注册时,需要对用户名进行重名检测。 |
| 个人基础信息查询 | 用户登录后,可查询当前用户的基础信息(不包含密码等敏感信息)。 |
| 个人基础信息修改 | 用户登录后,可对当前基础信息进行修改,用户名不可修改。 |
| 密码修改 | 修改密码等敏感信息,需要单独用页面进行,修改时,需要用输入原始密码进行验证。 |
2.2、书籍管理
| 模块功能 | 说明 |
|---|---|
| 书籍列表查询 | 进行书籍列表查询时,需要用户选择要查询的字段(如书籍名、书籍作者、书籍类型),查询时都是进行模糊查询。 |
| 书籍详细查询 | 用户通过输入书籍编号,查询当前书籍的详细信息。 |
| 书籍借阅 | 用户通过输入书籍编号进行相应书籍借阅,每次借阅行为只能借阅一本书籍。借阅时,如果此书籍状态为不可借阅,则借阅失败;如果此书籍库存数量为0,则借阅失败;借阅成功,则当前书籍库存数量为-1。 |
| 书籍归还 | 在书籍归还界面,用书输入要归还的书籍编号进行书籍归还,然后将相应书籍的借阅状态修改成已归还,并将相关书籍的库存数量+1。 |
| 个人借阅历史 | 通过此界面可查看自己借阅过的书籍列表,显示时按照借阅时间排序,并且显示此书籍的借阅状态(已归还、借阅中) |
三、表结构
1、用户表(t_user)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| user_id | int | 用户id,主键 |
| user_name | varchar | 用户名,唯一,非空 |
| password | varchar | 用户密码,非空 |
| age | int | 年龄 |
| gender | varchar | 性别 |
| phone | varchar | 电话号码 |
| address | varchar | 地址 |
| user_state | int | 用户账号状态: 0:正常 , 1:禁用 |
| role | int | 用户性质:0:管理员,1:普通用户 |
2、书籍表(t_book)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| book_id | int | 书籍编号,主键 |
| book_name | varchar | 书籍名,非空 |
| book_author | varchar | 书籍作者,非空 |
| book_num | int | 书籍库存数量,非空 |
| book_category | int | 书籍类别,该字段值和书籍类别表中的类别编号,非空 |
| book_state | int | 书籍是否可借阅状态: 0:可借阅 , 1:不可借阅 |
3、书籍类别表(book_category)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| category_id | int | 书籍类别编号,主键 |
| category_name | varchar | 书籍类别名,非空(如政治、军事、体育、经济等) |
4、借阅信息表(t_borrowing_info)
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| borrowing_info_id | int | 当前这条借阅数据的id,主键, 用户每借阅一本书籍时,会在当前借阅表中生成一条数据 |
| user_id | int | 发生借阅行为的用户id,非空 |
| book_id | int | 被借阅的书籍的id,非空 |
| borrowing_state | int | 借阅状态: 0:借阅中 1:已归还 |
| borrowing_time | datetime | 借阅时间 |
| giveback_time | datetime | 归还书籍时间,初始为空,归还书籍后,显示最后还书时间 |
二、MVC设计模式
MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,它把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
MVC 模式的目的是实现一种动态的程序设计,简化后续对程序的修改和扩展,并且使程序某一部分的重复利用成为可能。除此之外,MVC 模式通过对复杂度的简化,使程序的结构更加直观。软件系统在分离了自身的基本部分的同时,也赋予了各个基本部分应有的功能。专业人员可以通过自身的专长进行相关的分组:
- 模型(Model):程序员编写程序应有的功能(实现算法等等)、数据库专家进行数据管理和数据库设计(可以实现具体的功能);
- 控制器(Controller):负责转发请求,对请求进行处理;
- 视图(View):界面设计人员进行图形界面设计。
MVC 模式的图形描述如下:

MVC模式中三个组件的详细介绍如下:
- 模型(Model):用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“Model”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,由此,View 可以了解在数据 Model 上发生的改变。(比如:观察者模式(软件设计模式));
- 视图(View):能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册;
- 控制器(Controller):起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。
从MVC模式的一般理解来看,视图层与模型层是存在直接联系的,并且模型层的变化会通过视图层反映出来,这确实是MVC模式的标准理解,不过在我目前接触到的实际应用中,更多的情况时,视图层与模型层是通过控制层联系起来的,两者之间并无直接的联系,三者之间的关系更类似下图所示:

结合MVC模式的标准解释来看,上述模式可能是MVC模式的一种变型使用。
三、实际开发
一、项目结构介绍
首先先看一下我的项目结构:

项目各包作用:
| 包名 | 作用 |
|---|---|
| lib | 根据mysql版本下载的数据库连接器 具体下载地址为:https://mvnrepository.com/artifact/mysql/mysql-connector-java |
| util | 存放了工具包,此项目中具体存放了Jdbc工具类 |
| cn.egret | 存放所有项目文件的总包 |
| dao | 存放和数据库交互的Java文件 |
| entity | 存放实体类 |
| service | 进一步封装了dao包的工具函数,引用dao包的函数 |
| 各impl包 | 存放了各包接口的实现类 |
| controller | 存放了控制器类,具体封装了各功能函数(如登录、注册等) |
| page | 存放了各主要页面 |
| smallPage | 存放了小页面(面板) |
| smallPage.admin | 存放了管理员界面的小页面 |
| smallPage.common | 存放了普通用户界面的小页面 |
| test | 存放了dao包各函数的测试类 |
二、开发流程
一、创建数据库
利用Navicat Premium 15新建数据库library,然后根据需求设计各表,最终效果如下图所示:
以下是数据库设计代码,由Navicat Premium 15自动生成,可保存后在自己的数据库中运行,便可得到以上各表:
1 | /* |
二、添加数据库连接器
在项目中新建lib文件夹,然后在网上下载和自己mysql数据库相对应的连接器,放到lib文件夹中,然后右击连接器文件—>Build Path—>Add to Build Path
三、创建文件jdbc.properties
新建文件jdbc.properties,在里面填上以下内容:
1 | driver=com.mysql.cj.jdbc.Driver |
四、创建工具类JdbcUtil.java
在util包中新建工具类JdbcUtil.java,以下为代码:
1 | package cn.egret.util; |
五、创建各实体类
根据数据库表的需要在entity包中新建各实体类,以下为各实体类代码:
Book.java
1 | package cn.egret.entity; |
User.java
1 | package cn.egret.entity; |
BookCategory.java
1 | package cn.egret.entity; |
BorrowingInfo.java
1 | package cn.egret.entity; |
六、dao包各类的创建
各接口类
IBookDao.java
1 | package cn.egret.dao; |
IUserDao.java
1 | package cn.egret.dao; |
IBorrowInfoDao.java
1 | package cn.egret.dao; |
IBookCategoryDao.java
1 | package cn.egret.dao; |
各实现类:
BookDaoImpl.java
1 | package cn.egret.dao.impl; |
UserDaoImpl.java
1 | package cn.egret.dao.impl; |
BorrowInfoDaoImpl.java
1 | package cn.egret.dao.impl; |
BookCategoryDaoImpl.java
1 | package cn.egret.dao.impl; |
七、service包各类的创建
各接口类
IBookService.java
1 | package cn.egret.service; |
IUserService.java
1 | package cn.egret.service; |
IBorrowInfoService.java
1 | package cn.egret.service; |
IBookCategoryService.java
1 | package cn.egret.service; |
各实现类
BookServiceImpl.java
1 | package cn.egret.service.impl; |
UserServiceImpl.java
1 | package cn.egret.service.impl; |
BorrowInfoServiceImpl.java
1 | package cn.egret.service.impl; |
BookCategoryServiceImpl.java
1 | package cn.egret.service.impl; |
八、controller包各类创建
UserController.java
1 | package cn.egret.controller; |
BookController.java
1 | package cn.egret.controller; |
九、page包各类创建
各page页面均是利用ecplise的WindowsBuilder插件生成的,可自己从网上下载使用。
MainFrame.java
此类为整个应用程序的入口
1 | package cn.egret.controller.page; |
LoginPage.java
登录界面
1 | package cn.egret.controller.page; |
RegisterPage.java
注册界面
1 | package cn.egret.controller.page; |
AdminPage.java
管理员界面
1 | package cn.egret.controller.page; |
CommonUserPage.java
普通用户界面
1 | package cn.egret.controller.page; |
smallPage.admin包内各面板的创建
WelcomePage.java
欢迎面板
1 | package cn.egret.controller.page.smallPage.admin; |
AddAdmin.java
添加管理员面板
1 | package cn.egret.controller.page.smallPage.admin; |
AddAndDeleteBook.java
添加和删除书籍面板
1 | package cn.egret.controller.page.smallPage.admin; |
ChangeUserState.java
更改用户状态面板
1 | package cn.egret.controller.page.smallPage.admin; |
SearchBookList.java
查询书籍列表面板
1 | package cn.egret.controller.page.smallPage.admin; |
SearchUserList.java
查询用户列表面板
1 | package cn.egret.controller.page.smallPage.admin; |
UserInfoSearch.java
用户详细信息查询面板
1 | package cn.egret.controller.page.smallPage.admin; |
smallPage.common包内各面板的创建
WelcomePage.java
欢迎面板
1 | package cn.egret.controller.page.smallPage.common; |
BorrowAndGiveBackPage.java
借还书面板
1 | package cn.egret.controller.page.smallPage.common; |
SearchBookListPage.java
查询书籍列表面板
1 | package cn.egret.controller.page.smallPage.common; |
SearchUserBorrowInfoPage.java
查询用户借阅信息列表面板
1 | package cn.egret.controller.page.smallPage.common; |
UpdataPasswordPage.java
更改密码面板
1 | package cn.egret.controller.page.smallPage.common; |
UpdateBaseInfoPage.java
更改用户基本信息面板
1 | package cn.egret.controller.page.smallPage.common; |
UserInfoSearchPage.java
用户详细信息查询面板
1 | package cn.egret.controller.page.smallPage.common; |
十、Test包内测试类的创建
1 | package cn.egret.test; |
三、最终效果
一、登录界面

二、注册界面

三、普通用户界面
1、主界面

2、书籍列表查询

3、借还书籍

4、个人借阅历史查询

5、密码修改

6、个人基础信息修改

7、个人信息查询

四、管理员界面
1、主界面

2、管理员添加

3、用户列表查询

4、禁用与启用用户

5、书籍列表查询

6、书籍添加与删除

7、个人信息查询

终此!






