图书管理系统

图书管理系统

本系统采用集合和IO来实现持久化保存

持久化可以暂时先不写, 先自己编写一个控制台版的。

基本业务就是增删改查

思路:

  1. 要写最基本的增删改查,需要利用list集合进行操作。ArrayList的泛型设置为Book类型,这个list集合就相当于图书馆。
  2. 当时add添加的就是每一个Book对象
  3. 展示图书,遍历list集合即可。
  4. 当你添加、删除、修改,需要一个主键来对他们进行操作,一般为id,此时我们要判断你的图书馆里是否已经存在为你传入的id的书,因此我们要写一个方法,来判断集合当中是否存在为id的书
  5. 当你删除或者修改的时候,同样判断是否存在这本书,如果存在,你还需要根据id获取到这本书在集合当中的索引,根据索引来进行删除或者修改
  6. 当实现完控制台版本后,你会发现,每次进来书库都是空的,这就不是我想要的结果,我想要的是每次进来,都可以直接查到一些书籍,在此基础上进行增删改查
  7. 那么就需要用到IO技术,从本地的txt文件中读取数据
  8. 注意点:
    • 当添加数据的时候,需要将文件续写功能打开
    • 查询集合就是按行进行读取,将读取的每行按照规律使用split进行切割,然后封装成对象,添加到集合当中
    • IO没有删除和修改某一行的方法,只能写和读,那么我们只能换种思路了,当删除或者修改时,我们可以先在集合中操作,先将book对象删除或者修改,然后将新建文件对象将它置空,不开启续写。然后遍历集合将每一个book对象重新写入文件当中。
  9. 新增了登录注册功能,原理同上面一样。以及密码校验(采用正则表达式)

接下来就是完整代码:

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();
    }
}

posted @ 2023-03-30 10:57  戒爱学Java  阅读(39)  评论(0编辑  收藏  举报