目录
⛳️ 项目需求
⛳️ 覆盖知识
⛳️ 开发思路
⛳️ 开发步骤
❤️ 1、数据初始化
❤️ 2、BookMethod类中定义各种方法
⛳️ 代码展示
❤️ 1、Book类
❤️ 2、BookMethod类
❤️ 3、 MyBookSystem
⛳️ 项目需求
为某图书馆开发一个迷你图书管理系统,实现图书的管理,包括如下功能:
(1)新增图书
(2)查看图书
(3)删除图书
(4)借出图书
(5)归还图书
(6)退出图书系统
⛳️ 覆盖知识
程序基本概念、数据类型、流程控制、顺序、选择 、循环、跳转语句、变量、类、方法、XML等相关知识
⛳️ 开发思路
(1)明确需求
(2)编码顺序
1)、数据初始化
2)、循环完成各种图书管理操作
3)、菜单切换
(3)测试
⛳️ 开发步骤
❤️ 1、数据初始化
(1)设计一个包含图书信息的类:Book类
(2)设计一个图书信息操作的方法类:BookMethod类
(3)设计一个图书管理系统测试类:MyBookSystem类
(4)创建一个book.xml文件,并且初始化文件内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <Books> <Book count="15" data="0" name="罗马假日" state="0" /> <Book count="12" data="0" name="白雪公主" state="0" /> <Book count="30" data="0" name="葫芦兄弟" state="0" /> </Books>
❤️ 2、BookMethod类中定义各种方法
声明方法获得Document对象
// (1)声明方法获得Document对象 public static void getDocument(File file) { // 获取解析器工厂对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); // 从DOM工厂获得DOM解析器 try { DocumentBuilder db = dbf.newDocumentBuilder(); // 解析XML文档,得到一个Document对象,即DOM树 document = db.parse(file); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
声明保存XML的方法
// (2)声明保存XML的方法 public static void saveXml(String url){ //保存XML文件 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer; try { transformer = transformerFactory.newTransformer(); DOMSource domSource = new DOMSource(document); //设置编码类型 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); StreamResult result = new StreamResult(new FileOutputStream(url)); //把DOM转换为XML文件 transformer.transform(domSource, result); } catch (TransformerConfigurationException e) { e.printStackTrace(); } catch (TransformerException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); } }
欢迎使用迷你图书管理器方法
新增图书方法
查看图书方法
删除图书方法
借出图书方法
归还图书方法
退出图书方法
欢迎首界面:
//欢迎使用迷你图书管理器方法 public static void useBookSystem() { // 输出欢迎菜单 System.out.println("欢迎使用迷你图书管理器"); System.out.println("-------------------------"); System.out.println("1.新增图书"); System.out.println("2.查看图书"); System.out.println("3.删除图书"); System.out.println("4.借出图书"); System.out.println("5.归还图书"); System.out.println("6.退出图书"); System.out.println("-------------------------"); }
⛳️ 代码展示
❤️ 1、Book类
package cn.bdqn.demo01;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Book implements Serializable {
//定义属性
private String name;
private int state;
private int date;
private int count;
//添加无参构造
public Book() {
super();
}
//添加有参构造
public Book(String name, int state, int date, int count) {
super();
this.name = name;
this.state = state;
this.date = date;
this.count = count;
}
//添加get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public int getDate() {
return date;
}
public void setDate(int date) {
this.date = date;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
❤️ 2、BookMethod类
package cn.bdqn.demo01;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class BookMethod {
// 定义一个静态的Scanner
static Scanner inputsc = new Scanner(System.in);
static Document document;
// static String bookName;
// 欢迎使用迷你图书管理器方法
public static void useBookSystem() {
// 输出欢迎菜单
System.out.println("欢迎使用迷你图书管理器");
System.out.println("-------------------------");
System.out.println("1.新增图书");
System.out.println("2.查看图书");
System.out.println("3.删除图书");
System.out.println("4.借出图书");
System.out.println("5.归还图书");
System.out.println("6.退出图书");
System.out.println("-------------------------");
}
// (1)声明方法获得Document对象
public static void getDocument(File file) {
// 获取解析器工厂对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 从DOM工厂获得DOM解析器
try {
DocumentBuilder db = dbf.newDocumentBuilder();
// 解析XML文档,得到一个Document对象,即DOM树
document = db.parse(file);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// (2)声明保存XML的方法
public static void saveXml(String url){
//保存XML文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer;
try {
transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(document);
//设置编码类型
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
StreamResult result = new StreamResult(new FileOutputStream(url));
//把DOM转换为XML文件
transformer.transform(domSource, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// (3)查看图书方法:从book.xml文件中的读取全部图书信息
public static void printInfo() {
System.out.println("-->查看图书\n");
System.out.println("序号\t状态\t名称\t借出日期\t借出次数");
// 获取收藏信息.xml文件中所有的Book元素,可能会获取多个,所以将获取的元素存放在NodeList集合中
NodeList nl = document.getElementsByTagName("Book");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Element book = (Element)nl.item(i);
String nameVlue = book.getAttribute("name");
String stateVlue = (book.getAttribute("state").equals("0")) ? "可借阅" : "已借出";
String dataVlue = (book.getAttribute("data").equals("0")) ? "" : (book.getAttribute("data") + "日");
String countVlue = book.getAttribute("count");
System.out.println((i + 1) + "\t" + stateVlue + "\t"+ nameVlue + "\t" + dataVlue + "\t"+ countVlue + "次");
}
System.out.println("*****************************************");
}
// (4)新增图书方法:向XML文件中添加新的图书
public static void addBook(){
System.out.println("-->新增图书\n");
System.out.println("请输入图书名称:");
String bookName = inputsc.next();
//创建Book节点
Element brandElement = document.createElement("Book");
brandElement.setAttribute("name", bookName);
brandElement.setAttribute("state", "0");
brandElement.setAttribute("data", "0");
brandElement.setAttribute("count", "0");
Element phoneElement = (Element)document.getElementsByTagName("Books").item(0);
phoneElement.appendChild(brandElement);
System.out.println("新增《" + bookName + "》成功!");
//添加完毕之后要保存XML文件
saveXml("book.xml");
System.out.println("*****************************************");
}
// (5)删除图书方法:从XML文件中删除指定图书
public static void delBook(){
System.out.println("-->删除图书\n");
System.out.println("请输入要删除图书的名称:");
String delete = inputsc.next();
boolean flag3 = false;
NodeList nl = document.getElementsByTagName("Book");
for (int i = 0; i < nl.getLength(); i++) {
// 将节点集合中的元素取出来
Element book = (Element)nl.item(i);
String nameVlue = book.getAttribute("name");
String stateVlue = book.getAttribute("state");
// 删除的图书存在、状态处于可借阅状态
if (nameVlue != null&& delete.equals(nameVlue)&& stateVlue.equals("0")) {
flag3 = true;
book.getParentNode().removeChild(book);
System.out.println("图书删除成功!");
break;
} else if (nameVlue != null&& delete.equals(nameVlue)&& stateVlue.equals("1")) {
flag3 = true;
System.out.println("该图书已被借出,目前无法删除!");
break;
}
}
if (!flag3) {
System.out.println("没有找到匹配信息!");
}
//添加完毕之后要保存XML文件
saveXml("book.xml");
System.out.println("*****************************************");
}
// (6)借出图书方法:
public static void lendBook() {
System.out.println("-->借出图书\n");
System.out.print("请输入图书名称:");
String want = inputsc.next(); // 要借出的图书名称
NodeList nl = document.getElementsByTagName("Book");
if (nl.getLength() == 0) {
System.out.println("没有找到匹配信息!");
}else{
for (int i = 0; i < nl.getLength(); i++) {
Element book = (Element)nl.item(i);
if(want.equals(book.getAttribute("name"))&&book.getAttribute("state").equals("0")){
book.setAttribute("state", "1");
System.out.print("请输入借出日期:");
String inputscData = inputsc.next();
book.setAttribute("data", inputscData);
Integer ints=Integer.valueOf(inputscData);
while (ints < 1
|| ints > 31) { // 当输入借出的日期不满足1-31时
System.out.println("必须输入大于等于1且小于等于31的数字,请重新输入:");
inputscData = inputsc.next();
book.setAttribute("data", inputscData);
ints=Integer.valueOf(inputscData);
}
Integer countInt=Integer.valueOf(book.getAttribute("count"));
countInt++;
System.out.println("借出《" + want + "》成功!");
book.setAttribute("count", countInt+"");
break;
} else if (want.equals(book.getAttribute("name"))&&book.getAttribute("state").equals("1")) { // 找到匹配已被借出
System.out.println("《" + want + "》已被借出!");
break;
}
}
}
//添加完毕之后要保存XML文件
saveXml("book.xml");
System.out.println("*****************************************");
}
// (6)归还图书方法:
public static void returnBook() {
System.out.println("-->归还图书\n");
int charge = 0; // 租金
System.out.print("请输入归还图书名称:");
String want = inputsc.next(); // 要借出的图书名称
NodeList nl = document.getElementsByTagName("Book");
if (nl.getLength() == 0) {
System.out.println("没有找到匹配信息!");
}else{
for (int i = 0; i < nl.getLength(); i++) {
Element book = (Element)nl.item(i);
if(want.equals(book.getAttribute("name"))&&book.getAttribute("state").equals("1")){
book.setAttribute("state", "0");// 将借阅状态修改为可借阅
System.out.print("请输入归还日期:");
String inputscData = inputsc.next();
book.setAttribute("data", inputscData);
Integer redate=Integer.valueOf(inputscData);
// 当输入借出的日期不满足1-31时
while (redate < 1|| redate > 31) {
if(redate<1){
System.out.println("归还日期不能小于借出日期,请重新输入:");
} else {
System.out.println("一个月只有31天,请重新输入:");
}
inputscData = inputsc.next();
redate=Integer.valueOf(inputscData);
}
charge = redate - Integer.valueOf(book.getAttribute("data"));
System.out.println("\n归还《" + want + "》成功!");
System.out.println("借出日期为:" + Integer.valueOf(book.getAttribute("data")) + "日");
System.out.println("归还日期为:" + redate + "日");
System.out.println("应付租金(元):" + charge);
book.setAttribute("data", "0");
break;
} else if (want.equals(book.getAttribute("name"))&&book.getAttribute("state").equals("0")) {
System.out.println("该图书没有被借出!无法进行归还操作。");
break;
}
}
}
//添加完毕之后要保存XML文件
saveXml("book.xml");
System.out.println("*****************************************");
}
}
❤️ 3、 MyBookSystem
package cn.bdqn.demo01;
import java.io.File;
import java.util.Scanner;
/**
* 图书管理系统类MyBookMgr
*
* @author Administrator
*
*/
public class MyBookSystem {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// 是否退出系统,false代表退出系统
boolean flag = true;
File file = new File("book.xml");
//获取Document对象
BookMethod.getDocument(file);
int num = -1;
// 循环操作
do {
// 定义一个BookMethod操作类,将操作方法定义在BookMethod类中,然后调用
// 欢迎菜单方法
BookMethod.useBookSystem();
System.out.println("请选择:");
int choose = input.nextInt();
switch (choose) {
case 1:
// 新增图书
BookMethod.addBook();
break;
case 2:
// 查看图书
BookMethod.printInfo();
break;
case 3:
// 删除图书
BookMethod.delBook();
break;
case 4:
// 借出图书
BookMethod.lendBook();
break;
case 5:
// 归还图书
BookMethod.returnBook();
break;
case 6:
// 退出图书
flag = false;
break;
default:
flag = false;
break;
}
if (flag) {
System.out.println("输入0返回:");
num = input.nextInt();
} else {
break;
}
} while (num == 0);
System.out.println("谢谢使用!");
input.close();
}
}