多人开发使用Git工具实现远程仓库和本地仓库的连接在idea中使用,JDBC连接MySQL数据库实现的图书管理系统
项目前提
【项目前提】 ? 掌握java基本语法 ? 熟悉使用流程控制 ? 理解面向对象思想 ? 熟练封装,继承,多态 ? 熟悉使用接口,异常 ? 熟悉使用集合 ? 熟悉掌握I/o流相关操作 ? 熟悉数据库操作 ? 了解三层架构和常用设计模式 ? 熟悉使用Git工具
项目说明
? 长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。 ? 本系统在项目3基础上进行重构操作,调整了基本流程,增加了管理员和操作员不同角色的操作图书馆的功能。 ? 本系统首先需要进行登录或者注册,根据不同身份操作不同的功能。 ? 管理员主要负责对操作员的基本信息管理和相关逾期金额的设定和查看。 ? 操作员主要负责对读者的信息进行管理和相关图书进行管理。 ? 本项目还会利于数据库进行数据的读取和存储。
项目内容
项目功能流程结构图:
项目功能如下: (1) 登录模块:包括登录功能(根据两种身份(管理员或者操作员)进行登录),如果没有用户信息,则需要进入注册功能进行注册。(登录用户信息的读取和存储都应连通数据库表操作)还需要提供忘记密码,查看登录日志记录(日志可通过I/O流放在相对应的文件里),修改密码等基本功能。 (2) 管理员模块:管理员主要包含四大基本功能:员工工作日志记录(记录了每个操作员的登录时间和各种操作信息,日志可通过I/O流放在相对应的文件里),图书借阅金额设定,对操作员信息进行管理(增删改查),图书逾期罚金总账单查询(该账单记录了所有预期的图书的逾期金额明细和最后图书馆所有书的逾期总金额数)。 (3) 操作员模块 (基本功能来自于项目2,不同之处为数据的存储方式(I/O文件?数据库)) (1)读者信息管理:包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据,通过数据库存储,JDBC进行操作) (2)图书信息管理:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据,通过数据库存储,JDBC进行操作) (3)图书借阅管理:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据,通过数据库存储,JDBC进行操作) (4)基础信息维护:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据,通过数据库存储,JDBC进行操作)
项目的开发
接口
实体类
设计模式
我们这里用的是抽象工厂模式: 就给大家看看代码即可,首相需要 ManagerDao中的代码
OperatorDao: 然后有一个UserFanctory: 上面的相应有对应的service ManagerService 和OperatorService 以及UserFactoryService 然后怎么用呢?看代码: 用工厂创建对象 再调用方法 这就实现了抽象工厂
开发遇到的Bug调试
我觉的最最厉害bug就是再图书借阅里面,涉及的东西很多。比如:罚金设置里面,有读者类型,却未给此读者类型设置罚金,那么使用此读者类型创建的读者借书之后是不能归还图书,应当给出要求给此读者类型设置罚金后再归还图书。比如还有另外的,使用此读者类型创建读者后,此读者类型是不能被删除的。 当然也不能一一展示,下面就展示一两个,里面涉及的判断就是对bug的调试
@Override
public void bookReturn() throws SQLException, ParseException {
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection();
String sql9 = "select * from borrowbook where returndate is null";
BeanListHandler<BorrowBook> listHandle = new BeanListHandler<>(BorrowBook.class);
List<BorrowBook> list1 = runner.query(conn, sql9, listHandle);
if (list1 != null) {
list1.forEach(System.out::println);
System.out.println("请输入需要归还图书的读者的读者编号:");
int readerid = TSUtility.readInt();
String sql1 = "select * from reader where readerid =?";
BeanHandler<Reader> handler1 = new BeanHandler<>(Reader.class);
Reader reader = runner.query(conn, sql1, handler1, readerid);
if (reader != null) {
String sql = "select * from borrowbook where readerid = ? and returndate is null ";
BeanListHandler<BorrowBook> listHandler = new BeanListHandler<>(BorrowBook.class);
List<BorrowBook> list = runner.query(conn, sql, listHandler, readerid);
if (list.size() != 0) {
System.out.println("该读者的借书情况如下:");
String borrowDate = null;
for (int i = 0; i < list.size(); i++) {
borrowDate = list.get(i).getBorrowDate();
System.out.println(list.get(i));
}
int type1 = reader.getType();
String sql6 = "select * from readertype where id=?";
BeanHandler<ReaderType> handler6 = new BeanHandler<>(ReaderType.class);
ReaderType readerType1 = runner.query(conn, sql6, handler6, type1);
String typename = readerType1.getTypename();
String sql7 = "select * from fine where typename=?";
BeanHandler<Fine> handler7 = new BeanHandler<>(Fine.class);
Fine fine1 = runner.query(conn, sql7, handler7, typename);
if (fine1 != null) {
System.out.println("请输入需要归还图书的借阅编号:");
int id = TSUtility.readInt();
String sql5 = "select * from borrowbook where id=? and returndate is null and readerid=? ";
BeanHandler<BorrowBook> handler = new BeanHandler<>(BorrowBook.class);
BorrowBook query = runner.query(conn, sql5, handler, id, readerid);
if (query != null) {
System.out.println("请输入归还日期:(yyyy-MM-dd)");
String returndate = TSUtility.readKeyBoard(20, false);
boolean rqFormat = TSUtility.isValidDate(returndate);
if (rqFormat) {
Integer integer = dayBetween(borrowDate, returndate);
if (integer < 0) {
System.out.println("你输入的归还时间有误");
} else {
String sql2 = "select type from reader where readerid = ?";
BeanHandler<Reader> handler3 = new BeanHandler<>(Reader.class);
Reader reader2 = runner.query(conn, sql2, handler3, readerid);
int type = reader2.getType();
String sql3 = "select `limit` from readertype where id=?";
BeanHandler<ReaderType> handler2 = new BeanHandler<>(ReaderType.class);
ReaderType readerType = runner.query(conn, sql3, handler2, type);
int limit = readerType.getLimit();
int number = getNumber(readerid);
int fine = 0;
if (integer > limit) {
fine = (integer - limit) * number;
}
String sql4 = "update borrowbook set returndate = ? ,fine = ? where readerid = ? and id=?";
int count = runner.update(conn, sql4, returndate, fine, readerid, id);
System.out.println("还书成功");
JDBCUtils.closeResource1(conn, null);
IOUtils.storeWorkLog("添加了" + count + "条归还情况");
}
} else {
System.out.println("您输入的日期格式有误");
}
} else {
System.out.println("该借阅编号不存在或不是该读者的借阅编号或该读者已归还");
}
} else {
System.out.println("该读者的读者类型未设置罚金");
}
} else {
System.out.println("该读者无借阅信息");
}
} else {
System.out.println("该读者不存在");
}
} else {
System.out.println("无借阅信息");
}
}
诸如此类的判断很多
@Override
public void addBook() throws SQLException {
boolean flog = false;
System.out.println("所有图书类型编号以及名称如下:");
QueryRunner runner = new QueryRunner();
Connection conn = JDBCUtils.getConnection();
String sql = "select * from booktype ";
BeanListHandler<BookType> ListHandler = new BeanListHandler<>(BookType.class);
List<BookType> list = runner.query(conn, sql, ListHandler);
if (list.size() == 0) {
System.out.println("没有图书类型,请添加图书类型");
} else {
for (int i = 0; i < list.size(); i++) {
BookType bookType = list.get(i);
System.out.println("图书类型编号:" + bookType.getId() + "," + "图书类型名称:" + bookType.getTypeName());
}
System.out.println("请输入添加图书的图书类型编号:");
int typeid = TSUtility.readInt();
for (int i = 0; i < list.size(); i++) {
int id = list.get(i).getId();
if (typeid == id) {
flog = true;
break;
}
}
if (flog) {
System.out.println("请输入书名:");
String bookname = TSUtility.readKeyBoard(8, false);
String sql8 = "select bookname from book where bookname =?";
BeanHandler<Book> handler = new BeanHandler<>(Book.class);
Book book = runner.query(conn, sql8, handler, bookname);
if (book != null) {
System.out.println("该图书已存在");
} else {
System.out.println("请输入作者姓名:");
String author = TSUtility.readKeyBoard(6, false);
System.out.println("请输入出版社名字:");
String publish = TSUtility.readKeyBoard(9, false);
System.out.println("请输入出版日期:(格式:yyyy-MM-dd)");
String publishdate = TSUtility.readKeyBoard(20, false);
boolean validDate = TSUtility.isValidDate(publishdate);
if (validDate) {
System.out.println("请输入印刷次数:");
int publishtime = TSUtility.readInt();
System.out.println("请输入图书单价:");
int unitprice = TSUtility.readInt();
String sql1 = "insert into book(typeid,bookname,author,publish,publishdate,publishtime,unitprice)values(?,?,?,?,?,?,?)";
int count = runner.update(conn, sql1, typeid, bookname, author, publish, publishdate, publishtime, unitprice);
System.out.println("添加图书成功");
JDBCUtils.closeResource1(conn, null);
IOUtils.storeWorkLog("添加了" + count + "本图书");
} else {
System.out.println("输入日期格式有误");
}
}
} else {
System.out.println("你输入的图书类型编号不存在");
IOUtils.storeWorkLog("因为输入的图书类型编号不存在,导致添加一本图书失败");
}
}
}
以上有些判断会联系多张表。这就需要自己想清楚。代码只是辅助给大家,具体还是要自己想清楚。
开发后的经验
1. 首先这是一个多人项目开发,那么熟悉git工具 熟练的从远程仓库拉到本地,实现idea和远程仓库保持一致
2. 先从需求文档入手,理清开发思路 3. 完善各个文档 4. 分工开发模块
写的不是很多,希望对你有帮助!
|