目录
前言
经过几个月的java基础学习我终于迎来了一个大项目,图书管理系统,这个项目可能学java的各位都会经历,也可能不会经历。接下来我就来说说我在做这个单独完成的大项目的时候我是怎么自己在跌跌撞撞中完成的。
一、项目说明
长期以来,人们使用传统的人工方式管理图书馆的日常业务,其操作流程比较烦琐。在借书时,读者首先将要借的书和借阅证交给工作人员,然后工作人员将每本书的信息卡片和读者的借阅证放在一个小格栏里,最后在借阅证和每本书贴的借阅条上填写借阅信息。在还书时,读者首先将要还的书交给工作人员,工作人员根据图书信息找到相应的书卡和借阅证,并填好相应的还书信息。太过于繁琐了!所以,我们需求设计一个图书管理系统来方便学生的借书和图书馆管理书籍。
二、项目功能结构
三、读者信息管理
模块要求:读者信息管理包括读者信息添加和读者信息查询与修改功能。用户登录成功之后,可以浏览所有读者的信息,也可以检索特定读者的信息;同时,可以对读者信息进行维护,包括增加、删除及修改。具体信息包括读者类型(读者的类型决定着他可以借到书的最大数量和最大归还天数)、读者姓名、出生日期、性别、电话、所在院系、注册日期等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
实际操作:在我的实际操作当中,我先是将读者的实体类写出来,在根据实体类来写了相关的实现类并且在最后还给这个模块写了个操作界面方便我们进行调试并且可以在串联整个项目的时候直接调用。方便修改等等。在最开始的时候我在存注册日期等Data类型的数据时发生了一些问题,先我能将它直接存进去结果后面发现,当我读取数据的时候不能在将其转换为日期类型,系统会报错,后面我将日期类先转为了String类再存储,再取出来的时候相应的格式就能被转换成日期类型了。
四、图书信息管理
模块要求:包括图书信息添加和图书信息查询与修改功能。用户登录成功之后,可以浏览所有图书信息和检索特定图书的信息;也可以对图书信息进行维护。包括添加图书、删除图书以及修改图书信息。具体信息包括:图书ISBN、图书名称、作者、出版社、出版日期、印刷次数、单价、图书类别等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)。
实际操作:在实际操作当中我也是和读者信息写得差不多的发现很多地方和写读者信息有很多的共通之处。在写这个模块的时候因为图书的类型标签很多,而我又是使用的list数组进行拼接来存储到文件中的,但是多了容易看错然后拼接出错,多拼接了不该拼接的东西导致最后读取出来的时候和存储进去的时候不一样,有个数据是重复的,还仔细看了好几遍才找到错在哪里。所以我觉得使用对象序列化更好,当标签多的时候就不用去考虑存储时候的顺序了,可以直接存,但是缺点是不能在文件之中查看是否有存储错误和修改之后有没有改变,只能通过对象反序列化来查看。
五、图书借阅管理
模块要求:包括图书借阅和图书归还功能。图书借阅功能,先输入读者的编号,然后输入要借阅的图书的信息,记录系统当前时间即借阅时间;图书归还功能,输入读者的编号,选择其名下已借阅的图书,判断当前日期即归还日期与借阅日期的差值是否超过了规定的期限,计算罚金,从而进行图书的归还操作。具体信息包括:借阅日期、归还日期、罚金。由于要计算罚金,故需要知道该读者的读者类型,根据类型判断其可借图书天数、可借图书数量等。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
实际操作:在我的实际操作当中我自己觉得我都写完前面两个模块了,应该不会再遇到什么问题了,结果还是出现了一些问题。首先就是在罚金计算的时候归还日期和借书日期怎么可以得到我们想要的之间的天数,最开始也是没有一点想法,当在求助度娘之后找到了我们需要的方法解决了相关问题。
六、基础信息维护
模块要求:包括图书类别设置、读者类别设置及罚金设置。图书类别设置,可以对图书的类别进行增加、删除、修改和查询;读者类别设置可以对读者的类别进行增加、删除、修改和查询;罚金设置,可以指定超期一天的罚金标准。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
实际操作:由于有了前面几个模块的设计经验,这个模块没有遇到什么特别的问题和前面的一些类的操作差不太多。
七、用户管理
模块要求:包括修改密码、用户添加和删除。修改密码,是指当前用户修改自己的密码;用户添加和删除,是对新增和去除系统用户时对用户信息的维护。(相关存储数据可通过I/O流直接存在文件,可也直接在文件里读的数据)
实际操作:这个模块的重点就是需要把密码和人匹配,其他和前面一样没有什么需要特别需要注意的。
八、代码展示
1、整个项目创的所有类和包
2、读者类和读者类的操作
读者类代码:
package team2.domain;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @title: Reader
* @Author 码小春
* @Date: 2021/10/21 9:39
* @Version 1.0
*/
public class Reader {//读者
private String readerid;//读者ID
private String name;//读者姓名
private String sex;//读者性别
private String age;//读者年龄
private String dept;//部门
private String phone;
private Date regdat;//日期
private String typename;//类型
public Reader() {
}
public String getReaderid() {
return readerid;
}
public void setReaderid(String readerid) {
this.readerid = readerid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Date getRegdat() {
return regdat;
}
public void setRegdat(Date regdat) {
this.regdat = regdat;
}
public String getTypename() {
return typename;
}
public void setTypename(String typename) {
this.typename = typename;
}
@Override
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return readerid+"\t"+name+"\t"+sex+"\t"+age+"\t"+phone+"\t"+typename+"\t"+dept+"\t"+sdf.format(regdat);
}
}
读者操作类的代码:
package team2.dao;
import team2.domain.Reader;
import team2.view.TSUtility;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
/**
* @title: ReaderDao
* @Author 码小春
* @Date: 2021/10/21 11:05
* @Version 1.0
*/
public class ReaderDao {
//读者添加
public static int insertReader(String id, String typename, String name, String age, String sex, String phone, String dept, Date reg) throws IOException {
boolean count;
List<Reader> rd = new ArrayList<>();
Reader reader = new Reader();
reader.setReaderid(id);
reader.setTypename(typename);
reader.setName(name);
reader.setAge(age);
reader.setSex(sex);
reader.setPhone(phone);
reader.setDept(dept);
reader.setRegdat(reg);
count = rd.add(reader);
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\study\\Text\\src\\team2\\file\\readers.txt", true));
for (Reader r : rd) {
//把学生对象的数据拼接成指定格式的字符串
StringBuilder sb = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sb.append(r.getReaderid()).append(",").append(r.getTypename()).append(",").append(r.getName()).append(",").append(r.getAge()).append(",").append(r.getSex()).append(",").append(r.getPhone()).append(",").append(r.getDept()).append(",").append(sdf.format(r.getRegdat()));
//调用字符缓冲输出流对象的方法写数据
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
if (count = true) {
return 1;
} else return 0;
}
//查询读者信息
public static List<Reader> selectReader() throws IOException, ParseException {
List<Reader> readers = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("D:\\study\\Text\\src\\team2\\file\\readers.txt"));
String line;
while ((line = br.readLine()) != null) {
//把读取到的字符串数据用split()进行分割,得到一个字符串数组
String[] strArray = line.split(",");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//创建学生对象
Reader r = new Reader();
//把字符串数组中的每一个元素取出来对应的赋值给学生对象的成员变量值
//itheima001,林青霞,30,西安
r.setReaderid(strArray[0]);
r.setTypename(strArray[1]);
r.setName(strArray[2]);
r.setAge(strArray[3]);
r.setSex(strArray[4]);
r.setPhone(strArray[5]);
r.setDept(strArray[6]);
r.setRegdat(sdf.parse(strArray[7]));
//把学生对象添加到集合
readers.add(r);
}
return readers;
}
//通过读者ID查询
public static List<Reader> selectReaderById(String id) throws IOException, ParseException {
List<Reader> readers = new ArrayList<>();
readers = selectReader();
List<Reader> readers1 = new ArrayList<>();
for (Reader r : readers) {
if (r.getReaderid().equals(id)) {
readers1.add(r);
}
}
return readers1;
}
//通过读者姓名查询
public static List<Reader> selectReaderByName(String name) throws IOException, ParseException {
List<Reader> readers = new ArrayList<>();
readers = selectReader();
List<Reader> readers1 = new ArrayList<>();
for (Reader r : readers) {
if (r.getName().equals(name)) {
readers1.add(r);
break;
}
}
return readers1;
}
//通过读者类型查询
public static List<Reader> selectReaderByType(String type) throws IOException, ParseException {
List<Reader> readers = new ArrayList<>();
readers = selectReader();
List<Reader> readers1 = new ArrayList<>();
for (Reader r : readers) {
if (r.getTypename().equals(type)) {
readers1.add(r);
}
}
return readers1;
}
//通过读者部门查询
public static List<Reader> selectReaderByDept(String dept) throws IOException, ParseException {
List<Reader> readers = new ArrayList<>();
readers = selectReader();
List<Reader> readers1 = new ArrayList<>();
for (Reader r : readers) {
if (r.getDept().equals(dept)) {
readers1.add(r);
}
}
return readers1;
}
//通过读者ID删除读者
public static int delete(String id) throws IOException, ParseException {
boolean a=false;
List<Reader> readers = selectReader();
for(int i=0;i<readers.size();i++){
if(readers.get(i).getReaderid().equals(id)){
readers.remove(i);
a=true;
}
}
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\study\\Text\\src\\team2\\file\\readers.txt", true));
for (Reader r : readers) {
//把学生对象的数据拼接成指定格式的字符串
StringBuilder sb = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sb.append(r.getReaderid()).append(",").append(r.getTypename()).append(",").append(r.getName()).append(",").append(r.getAge()).append(",").append(r.getSex()).append(",").append(r.getPhone()).append(",").append(r.getDept()).append(",").append(sdf.format(r.getRegdat()));
//调用字符缓冲输出流对象的方法写数据
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
if(a=true){
return 1;
}else return 0;
}
//修改
public static int updateReader(String id, String typename, String name, String age, String sex, String phone, String dept) throws IOException, ParseException {
boolean judgment;
Reader reader = new Reader();
reader.setReaderid(id);
reader.setTypename(typename);
reader.setName(name);
reader.setAge(age);
reader.setSex(sex);
reader.setPhone(phone);
reader.setDept(dept);
List<Reader> readers = selectReader();
for(int i=0;i<readers.size();i++){
if(readers.get(i).getReaderid().equals(id)){
reader.setRegdat(readers.get(i).getRegdat());
readers.remove(i);
}
}
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\study\\Text\\src\\team2\\file\\readers.txt", true));
for (Reader r : readers) {
//把学生对象的数据拼接成指定格式的字符串
StringBuilder sb = new StringBuilder();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sb.append(r.getReaderid()).append(",").append(r.getTypename()).append(",").append(r.getName()).append(",").append(r.getAge()).append(",").append(r.getSex()).append(",").append(r.getPhone()).append(",").append(r.getDept()).append(",").append(sdf.format(r.getRegdat()));
//调用字符缓冲输出流对象的方法写数据
bw.write(sb.toString());
bw.newLine();
bw.flush();
}
bw.close();
judgment = readers.add(reader);
if (judgment = true) {
return 1;
} else return 0;
}
//输出
public static void output(List<Reader> l) {
if (l.size() == 0) {
System.out.println("没有您所需要的东西!!!");
return;
}
System.out.println("\t" + "id" + "\t\t" + "姓名" + "\t" + "性别" + "\t" + "年龄" + "\t" + "电话" + "\t" + "类型" + "\t" + "所在部门" + "\t" + "注册时间");
for (int i = 1; i < l.size() + 1; i++) {
System.out.println(i + "\t" + l.get(i - 1).toString());
}
}
//判断
public static boolean judge(List<Reader> l) {
if (l.size() == 0) {
return false;
}
return true;
}
}
九、总结
当写完整个项目和改完相应的bug之后,感觉自己在前面的所学都利用了起来,让很多都快遗忘了的知识又重新加深了印象,把自己以前不熟练的知识点使用得熟练了,整个项目写下来的感觉就是增删改查的重复操作。但是往往是这种重复的知识才是让我们会犯错误的,当自己潜意识里面觉得这些东西简单之后就不会那么用心的去写代码,觉得自己写的代码都是对的但是,就是这种心态导致了我们一些自己容易忽视的错误,所以不管写什么代码我们都需要全神贯注的去写,这样才能尽可能的去规避一些比较简单的bug,而且我们一定要把每一个模块测试好了再来进行所以模块的调用不然出现的明明是一个小问题放到整个项目中了之后就是一个大问题。
以上就是我对我的项目二图书管理系统的全部总结,文字比较多希望对于看完的人有所帮助。感谢大家的阅读。
链接:https://pan.baidu.com/s/1SijLDqkQvwJs--jTkyWsxA
提取码:1234