图书管理系统
图书管理系统
本系统采用集合和IO来实现持久化保存
持久化可以暂时先不写, 先自己编写一个控制台版的。
基本业务就是增删改查
思路:
- 要写最基本的增删改查,需要利用list集合进行操作。ArrayList的泛型设置为Book类型,这个list集合就相当于图书馆。
- 当时add添加的就是每一个Book对象
- 展示图书,遍历list集合即可。
- 当你添加、删除、修改,需要一个主键来对他们进行操作,一般为id,此时我们要判断你的图书馆里是否已经存在为你传入的id的书,因此我们要写一个方法,来判断集合当中是否存在为id的书
- 当你删除或者修改的时候,同样判断是否存在这本书,如果存在,你还需要根据id获取到这本书在集合当中的索引,根据索引来进行删除或者修改
- 当实现完控制台版本后,你会发现,每次进来书库都是空的,这就不是我想要的结果,我想要的是每次进来,都可以直接查到一些书籍,在此基础上进行增删改查
- 那么就需要用到IO技术,从本地的txt文件中读取数据
- 注意点:
- 当添加数据的时候,需要将文件续写功能打开
- 查询集合就是按行进行读取,将读取的每行按照规律使用split进行切割,然后封装成对象,添加到集合当中
- IO没有删除和修改某一行的方法,只能写和读,那么我们只能换种思路了,当删除或者修改时,我们可以先在集合中操作,先将book对象删除或者修改,然后将新建文件对象将它置空,不开启续写。然后遍历集合将每一个book对象重新写入文件当中。
- 新增了登录注册功能,原理同上面一样。以及密码校验(采用正则表达式)
接下来就是完整代码:
Book实体类:(重写toSting方法,按照自己的规则进行打印)
package cn.ketang.book3;
/**
* @author 戒爱学Java
* @date 2023/3/19 9:52
*/
public class Book{
private int id;
private String name;
private String author;
private double price;
private int bookSum;
public Book() {
}
public Book(int id, String name, String author, double price, int bookSum) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
this.bookSum = bookSum;
}
/**
* 获取
* @return id
*/
public int getId() {
return id;
}
/**
* 设置
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return author
*/
public String getAuthor() {
return author;
}
/**
* 设置
* @param author
*/
public void setAuthor(String author) {
this.author = author;
}
/**
* 获取
* @return price
*/
public double getPrice() {
return price;
}
/**
* 设置
* @param price
*/
public void setPrice(double price) {
this.price = price;
}
/**
* 获取
* @return bookSum
*/
public int getBookSum() {
return bookSum;
}
/**
* 设置
* @param bookSum
*/
public void setBookSum(int bookSum) {
this.bookSum = bookSum;
}
public String toString() {
return "id=" + id + "&name=" + name + "&author=" + author + "&price=" + price + "&bookSum=" + bookSum;
}
}
测试类
package cn.ketang.book3;
import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
/**
* @author 戒爱学Java
* @date 2023/3/29 16:50
*/
public class BookTest {
static Scanner sc = new Scanner(System.in);
static ArrayList<Book> list = new ArrayList<>();
static ArrayList<User> userList = new ArrayList<>();
public static void main(String[] args) throws IOException {
readList();
getUser();
//System.out.println(list);
//System.out.println(userList);
loginShow();
//show();
}
/**
* 登录展示
* @throws IOException IO异常
*/
public static void loginShow() throws IOException {
System.out.println("===============欢迎进入图书管理系统===============");
System.out.println("请输入您的选择:");
System.out.println("【1】登录 【2】注册 【3】退出");
int n = sc.nextInt();
if (n == 1) {
System.out.print("请输入您的专属Id:");
int id = sc.nextInt();
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
login(id,username, password);
} else if (n == 2) {
System.out.print("请输入您的专属Id:");
int id = sc.nextInt();
System.out.print("请输入用户名:");
String username = sc.next();
System.out.print("请输入密码:");
String password = sc.next();
registerUser(id,username,password);
loginShow();
}else if (n == 3){
System.out.println("===============感谢您的使用,再见===============");
System.exit(0);
}else {
System.out.println("您输入的数字不合法");
}
}
/**
* 判断 用户是否存在
* @param id id
* @return true 存在 否则 不存在
*/
public static boolean containsUser(int id){
for (User user : userList) {
if (user.getId() == id){
return true;
}
}
return false;
}
/**
* 获取user的索引
* @param id id
* @return 索引
*/
public static int getUserIndex(int id){
for (int i = 0; i < userList.size(); i++) {
int uid = userList.get(i).getId();
if (uid == id){
return i;
}
}
return -1;
}
/**
* 注册
* @param id 用户编号
* @param username 用户名
* @param password 密码
*/
public static void registerUser(int id,String username, String password) throws IOException{
BufferedWriter bw = new BufferedWriter(new FileWriter("..\\lian_xi\\src\\cn\\ketang\\book3\\user.txt",true));
if (!password.matches("\\d{3,10}")){
System.out.println("密码不合格,规则为数字3-10,请重新注册");
loginShow();
}
User user = new User(id,username,password);
userList.add(user);
bw.write(user.toString());
bw.newLine();
bw.close();
}
/**
* 读取本地文件存储的user对象
*
* @throws IOException 抛出IO异常
*/
public static void getUser() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("..\\lian_xi\\src\\cn\\ketang\\book3\\user.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] userArr = line.split("&");
int id = Integer.parseInt(userArr[0].split("=")[1]);
String username = userArr[1].split("=")[1];
String password = userArr[2].split("=")[1];
User user = new User(id,username, password);
userList.add(user);
}
br.close();
}
/**
* 登录功能
* @param id 编号
* @param username 用户名
* @param password 密码
*/
public static void login(int id,String username, String password) throws IOException {
if (!containsUser(id)){
System.out.println("用户不存在");
loginShow();
}
int userIndex = getUserIndex(id);
User u = userList.get(userIndex);
if (u.getUsername().equals(username) && u.getPassword().equals(password)){
System.out.println("登录成功");
show();
}else {
System.out.println("用户名或者密码错误");
loginShow();
}
}
/**
* 主页展示
*/
public static void show() throws IOException {
System.out.println("===============欢迎使用图书管理系统===============");
System.out.println("请输入您的选择");
System.out.println("【1】查看图书 【2】添加图书 【3】修改图书 【4】删除图书 【5】退出");
int n = sc.nextInt();
if (n == 1) {
getBook();
} else if (n == 2) {
addBook();
} else if (n == 3) {
update();
} else if (n == 4) {
deleteBook();
} else if (n == 5) {
System.out.println("===============感谢您的使用,再见===============");
System.exit(0);
} else {
System.out.println("你输入的选项不合法");
}
}
/**
* 删除图书
* @throws IOException IO异常
*/
public static void deleteBook() throws IOException {
System.out.print("请输入要删除的图书编号:");
int id = sc.nextInt();
if (!containsBookId(id)) {
System.out.println("你要删除的图书不存在");
show();
}
list.remove(getIndex(id));
System.out.println("删除成功");
File file = new File("..\\lian_xi\\src\\cn\\ketang\\book3\\book.txt");
FileWriter fw = new FileWriter(file);
fw.write("");
fw.close();
//System.out.println(list);
for (Book book : list) {
writeBook(book);
}
show();
}
/**
* 修改
*/
public static void update() throws IOException {
int id;
System.out.print("请输入要修改图书的编号:");
id = sc.nextInt();
if (!containsBookId(id)) {
System.out.println("要修改的图书不存在!!");
show();
}
System.out.print("请输入你要修改书的名字:");
String name = sc.next();
System.out.print("请输入你要修改书的作者:");
String author = sc.next();
System.out.print("请输入你要修改书的价格:");
double price = sc.nextDouble();
System.out.print("请输入你要修改书的数量:");
int bookSum = sc.nextInt();
Book book = new Book(id, name, author, price, bookSum);
list.set(getIndex(id), book);
System.out.println("修改成功");
File file = new File("..\\lian_xi\\src\\cn\\ketang\\book3\\book.txt");
FileWriter fw = new FileWriter(file);
fw.write("");
fw.close();
//System.out.println(list);
for (Book book2 : list) {
writeBook(book2);
}
show();
}
/**
* 添加图书
*/
public static void addBook() throws IOException {
Book book = new Book();
while (true) {
System.out.print("请输入要添加的图书的编号:");
int i = sc.nextInt();
if (containsBookId(i)) {
System.out.println("编号已经存在,请重新输入");
} else {
book.setId(i);
break;
}
}
System.out.print("请输入要添加的图书的名字:");
book.setName(sc.next());
System.out.print("请输入要添加的图书的作者:");
book.setAuthor(sc.next());
System.out.print("请输入要添加的图书的价格:");
book.setPrice(sc.nextDouble());
System.out.print("请输入要添加的图书的数量:");
book.setBookSum(sc.nextInt());
list.add(book);
System.out.println("添加成功");
writeBook(book);
show();
}
/**
* 查看图书
*/
public static void getBook() throws IOException {
if (list.size() == 0) {
System.out.println("图书馆图书为空");
} else {
for (Book book : list) {
System.out.println(book);
}
}
show();
}
/**
* @param id 查看是否已经存在编号为xx的图书
* @return true 存在 false 不存在
*/
public static boolean containsBookId(int id) {
for (Book book : list) {
if (book.getId() == id) {
return true;
}
}
return false;
}
/**
* @param id 要查询书的编号
* @return 查询某本出的索引
*/
public static int getIndex(int id) {
for (int i = 0; i < list.size(); i++) {
int bid = list.get(i).getId();
if (bid == id) {
return i;
}
}
return -1;
}
/**
* 读取文件,将文件的每一行读取然后进行切割封装,变成一个book对象添加到list集合当中
*
* @throws IOException IO操作抛出的异常
*/
public static void readList() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("..\\lian_xi\\src\\cn\\ketang\\book3\\book.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] bookArr = line.split("&");
int id = Integer.parseInt(bookArr[0].split("=")[1]);
String name = bookArr[1].split("=")[1];
String author = bookArr[2].split("=")[1];
double price = Double.parseDouble(bookArr[3].split("=")[1]);
int bookSum = Integer.parseInt(bookArr[4].split("=")[1]);
Book book = new Book(id, name, author, price, bookSum);
list.add(book);
}
br.close();
}
/**
* @param book 需要添加到本地文件的书
* @throws IOException IO异常
*/
public static void writeBook(Book book) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("..\\lian_xi\\src\\cn\\ketang\\book3\\book.txt", true));
bw.write(book.toString());
bw.newLine();
bw.close();
}
}