一、需求文档
【项目前提】
- 掌握java基本语法
- 熟悉使用流程控制
- 理解面向对象思想
- 熟练封装,继承,多态
- 熟悉使用接口,异常
- 熟悉使用集合
- 熟悉掌握I/o流相关操作
- 熟悉数据库操作
- 了解三层架构和常用设计模式
- 熟悉使用Git工具
【项目说明】
- 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
- 本系统在项目2基础上进行重构操作,调整了基本流程,增加了管理员和操作员不同角色的操作图书馆的功能。
- 本系统首先需要进行登录或者注册,根据不同身份操作不同的功能。
- 管理员主要负责对操作员的基本信息管理和相关逾期金额的设定和查看。
- 操作员主要负责对读者的信息进行管理和相关图书进行管理。
- 本项目还会利于数据库进行数据的读取和存储。
【项目内容】
项目功能流程结构图:
【项目功能】
(1)登录模块: 包括登录功能(根据两种身份(管理员或者操作员)进行登录),如果没有用户信息,则需要进入注册功能进行注册。(登录用户信息的读取和存储都应连通数据库表操作)还需要提供忘记密码,查看登录日志记录(日志可通过I/O流放在相对应的文件里),修改密码等基本功能。
(2)管理员模块: 管理员主要包含四大基本功能:员工工作日志记录(记录了每个操作员的登录时间和各种操作信息,日志可通过I/O流放在相对应的文件里),图书借阅金额设定,对操作员信息进行管理(增删改查),图书逾期罚金总账单查询(该账单记录了所有预期的图书的逾期金额明细和最后图书馆所有书的逾期总金额数)。
(3)操作员模块
(1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据,通过数据库存储,JDBC进行操作)
(2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据,通过数据库存储,JDBC进行操作)
(3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据,通过数据库存储,JDBC进行操作)
(4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据,通过数据库存储,JDBC进行操作)
二、数据库表的定义与创建
三、IDEA
接口定义
接口:Admin_Operator_PasswordInter
-
方法:
Add(String name,String password,long phone);UpdatePassword(String name,String oldpassword,String newpassword) throws Exception;
ForgetPassword(String name,long phone,String newpassword);
接口: Booklnter
-
方法:
Add(String isbn,String bookname,String author,String press,Date pressdate,int amount,float price,String typename);Delete(String isbn);
Update(String isbn,String bookname,String author,String press,Date pressdate,int amount,float price,String typename);
Query(String s);
接口:BooktypeInter
-
方法:
Add(String typename);Delete(int id);
Update(int id,String newtypename);
Query(int id);
接口:BorrowbookInter
-
方法:
selectBorrowBook();BorrowBook(int readerid, String isbn,Date date);
ReturnBook(int readerid, String isbn,Date date);
接口:OperatorInter
-
方法:
add(String oname,String opassword,long ophone);delete(String oname);
Uptate(String oname,String opassword,long ophone);
Query(String oname);
Query();
接口:ReaderInter
-
方法:
Add(String readername,Date birthday,String sex,long phone,String faculty,Date regdate,String typename);Delete(int readerid);
Update(int readerid,String readername,Date birthday,String sex,long phone,String faculty,Date regdate,String typename);
Query(int readerid);
Query(String readername);
接口:ReadertypeInter
-
方法:
Add(String typename,int days,float fine);Delete(int id);
Update(int id,String typename,int days,float fine);
Query(int id);
实体类
- 根据数据库建立各种对应数据表的实体类
工具类
配置文件
- 加载驱动并链接本地数据库
JDBCUtils
import java.io.InputStream;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class JDBCUtils{
public static Connection getConnection() throws Exception {
//读取配置文件中的4个基本信息
InputStream is1 = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.propertices");
// FileInputStream fis=new FileInputStream("src//jdbc.propertices");
Properties pro=new Properties();
pro.load(is1);
String user = pro.getProperty("user");
String url = pro.getProperty("url");
String password = pro.getProperty("password");
String driver = pro.getProperty("driver");
//加载驱动
Class.forName(driver);
//获取连接
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
public static void closeResource(Connection conn, Statement s){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
s.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
public static void closeResource(Connection conn, Statement s, ResultSet rs){
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
s.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
try {
rs.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
//通用增删改操作
public static void update(String sql, Object... args) {
Connection conn = null;
PreparedStatement ps = null;
try {
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.propertices");
Properties p = new Properties();
p.load(is);
//获取连接
conn = JDBCUtils.getConnection();
//预编译sql语句,返回Preparedstatement的实例
ps = conn.prepareStatement(sql);
//填充占位符
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
//执行
ps.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭资源
JDBCUtils.closeResource(conn, ps);
}
}
//对任意一个表进行任意行数的数据查询
public static <T> List<T> query(Class<T> clazz, String sql, Object...args){
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();//获取结果集
ResultSetMetaData rsmd = rs.getMetaData();//获取结果集的元数据
int columnCount = rsmd.getColumnCount();//通过ResultSetMetaData获取结果集中的列数
ArrayList<T> list = new ArrayList<>();
while (rs.next()) {//rs有值返回true
T t = clazz.newInstance();
//处理一行数据中的每一个列
for (int i = 0; i < columnCount; i++) {
Object value = rs.getObject(i + 1);//获取每一个列具体值
// String columnName = rsmd.getColumnName(i + 1);//获取每个列的列名。(不推荐使用)
String columnLabel = rsmd.getColumnLabel(i + 1);//获取每个列的别名,没起别名默认取到列名
//给book对象指定的columnName属性,赋值为columnValue:通过反射
Field field = clazz.getDeclaredField(columnLabel);
field.setAccessible(true);
field.set(t, value);
}
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
}