Java实操演练1——简单图书管理系统的设计与实现

笔者将记录每一步的具体操作,展示自己在实际开发过程中遇到的各种问题并提供解决思路。

目录

一、开发环境

二、开发过程

1、使用idea创建一个new project

2、项目具体设计

3、按照项目设计补全项目结构

4、按照项目设计补全代码

三、遇到的问题


一、开发环境

1、IDE:idea 2022.1

2、JDK:11.0.15

二、开发过程

1、使用idea创建一个new project

我的选项配置如下:

创建好的新项目结构如下:

2、项目具体设计

 (1)、5个类:

a)、Book

包含图书的必要属性(书名,作者,价格,分类,借阅状态);

包含图书属性的get和set方法;

b)、Library

包含俩种用户(管理员和普通用户)的登录函数和退出系统的方法;

c)、Person

包含人的属性(姓名,性别,年龄);

包含人属性的get和set方法;

手动定义了一些书;

d)、Root

对Person类的继承,实现了operate接口;

接口具体为:查阅书籍,删除书籍,增加书籍,显示书籍列表;

e)、User

对Person类的继承、实现了operate接口;

接口具体为:查询书籍、借阅书籍,返还书籍,显示书籍列表;

f)、Main

主函数入口,项目启动点;

(2)、1个接口:

a)、Operate

具体操作的接口:

操作方法包括:查阅书籍,查询书籍,删除书籍,增加书籍,借阅书籍,返还书籍,显示书籍列表;

3、按照项目设计补全项目结构

笔者补全后的项目结构如下:

4、按照项目设计补全代码

Book类

package dao;  //指明该类在包dao下

public class Book {  //定义了一个Book类
    private String name; //书籍名称
    private String author; //书籍作者
    public double price; //书籍价格
    private String category; //书籍分类
    private boolean state; //状态分类: true-未借出  false-已借出

    //通过构造函数给定书的属性
    public Book(String name,String author,double price,String category,boolean state){
        this.author = author;
        this.name = name;
        this.price = price;
        this.category = category;
        this.state = state;
    }

    public Book() {
        this(10);  //系统默认可存储10本书,可自行更改
    }
    public Book(int i) {
        Person.books = new Book[i];
    }

    //属性的获取和设置
    public String getName() {  //get()是取得属性值
        return name;
    }
    public void setName(String name) {  //set()是给属性赋值
        this.name = name;
    }
    public String getAuthor() {  //get()是取得属性值
        return author;
    }
    public void setAuthor(String author) { //set()是给属性赋值
        this.author = author;
    }
    public double getPrice() {  //get()是取得属性值
        return price;
    }
    public void setPrice(double price) { //set()是给属性赋值
        this.price = price;
    }
    public String getCategory() {  //get()是取得属性值
        return category;
    }
    public void setCategory(String category) { //set()是给属性赋值
        this.category = category;
    }
    public boolean getState() {  //get()是取得属性值
        return state;
    }
    public void setState(boolean state) { //set()是给属性赋值
        this.state = state;
    }
}

Library类

package dao;  //指明该类在包dao下

import java.util.Scanner;  //导入 java.util 包下的Scanner类,用来构建Scanner对象;

public class Library {
    Scanner sc = new Scanner(System.in);
    //登录函数:显示登录界面进行选择登录
    public void login() {
        int count = 0;
        Person P;
        while (count < 2) {
            System.out.println("===============欢迎来到图书管理系统===============");
            System.out.println("请登录:1.普通用户  2.管理员登录  3.退出系统");

            int n = sc.nextInt();
            //通过输入的值进行登录判断
            if (n == 3) {
                return;
            }
            switch (n) {
                case 1:
                    System.out.println("请输入姓名:");
                    String userName = sc.next();
                    System.out.println("请输入性别:");
                    String userSex = sc.next();
                    System.out.println("请输入借阅证编号:");
                    int libraryCardID = sc.nextInt();

                    P = new User(userName,userSex,libraryCardID); //构造普通用户对象

                    System.out.println("登录成功!");
                    System.out.println("当前普通用户:"+"姓名:" + P.getName() + " "+"性别:" + P.getSex() + " "+"借阅证编号:"+P.getLibraryCardId());
                    //普通用户循环操作
                    while (true) {
                        System.out.println("请输入你的操作: 1.查询书籍 2.借阅书籍 3.归还书籍 4.显示书籍列表 5.退出");
                        int i = sc.nextInt();
                        if (i == 5) {
                            System.out.println("您已成功退出!");
                            break;
                        }else {
                            P.operate();  //调用普通用户的操作方法
                        }
                    }
                    break;
                case 2:
                    System.out.println("请输入管理员姓名:");
                    String rootName = sc.next();
                    System.out.println("请输入性别:");
                    String rootSex = sc.next();
                    System.out.println("请输入员工证编号:");
                    String libraryCardId = sc.next();

                    P = new Root(rootName,rootSex,libraryCardId);//构造管理员对象

                    System.out.println("登录成功!");
                    System.out.println("当前管理员:"+"姓名:" + P.getName() + " "+"性别:" + P.getSex() + " "+"员工证编号:" + P.getLibraryCardId());
                    while (true) {
                        System.out.println("请输入你的操作: 1.整理书籍 2.查阅书籍 3.增加书籍 4.删除书籍 5.显示书籍列表 6.退出");
                        int j = sc.nextInt();
                        if (j == 6) {
                            System.out.println("您已成功退出!");
                            break;
                        }else{
                            P.operate();//调用管理员的操作方法
                        }
                    } break;
            }
        }
    }
}

Operate接口

package dao;  //指明该类在包dao下

public interface Operate {  //操作的接口
    void select(Book[] books); //查询,查阅
    void delete(Book[] books);//删除,借阅
    void add(Book[] books); //增加,还书
    void list(Book[] books); //显示书列表
}

Person类

package dao;  //指明该类在包dao下

abstract class Person {  //创建一个抽象类class
    public String name;
    public String sex;
    public int libraryCardId;
    public String employeeCardId;

    /**
     * 	默认定义10本书籍。(预留3本新书的buffer,可用来添加书籍)
     */
    public static Book[] books = new Book[]{
            new Book("西游记", "吴承恩", 50, "古典名著", true),
            new Book("红楼梦", "曹雪芹", 50, "古典名著", true),
            new Book("三国演义", "罗贯中", 50, "古典名著", true),
            new Book("水浒传", "施耐庵", 50, "古典", true),
            new Book("Java项目开发实战入门", "明日科技", 57, "计算机", true),
            new Book("Java开发实战经典", "李兴华", 108, "计算机", true),
            new Book("中国国家地理", "中国国家地理杂志社", 288, "杂志", true),
            new Book("故事会", "故事会编辑部", 12, "杂志", true),
            new Book("龙族", "江南", 245, "小说", true),
            new Book("娱乐至死", "尼尔波兹曼", 26, "小说", true),
            new Book(),
            new Book(),
            new Book(),
    };

    public Person(String name, String sex, String employeeCardId) {
        this.name = name;
        this.sex = sex;
        this.employeeCardId = employeeCardId;
    }

    public Person(String name, String sex, int libraryCardId) {
        this.name = name;
        this.sex = sex;
        this.libraryCardId = libraryCardId;
    }

    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 int  getLibraryCardId() {
        return libraryCardId;
    }
    public void setLibraryCardId(int libraryCardId) {
        this.libraryCardId = libraryCardId;
    }
    public void setEmployeeCardId(String employeeCardId) {
        this.employeeCardId = employeeCardId;
    }
    public String getEmployeeCardId() {
        return employeeCardId;
    }

    /**
     * 	抽象类中的抽象方法
     */
    public abstract void operate();
}

root类

package dao;  //指明该类在包dao下

import java.util.Arrays;
import java.util.Scanner;

public class Root extends Person implements Operate {
    //继承了人的类,需要重写它的抽象方法operate,实现了operate接口,需要重写接口内的方法

    public Root(String name, String sex, String employeeCardId) {
        //调用人基类的构造函数
        super(name, sex, employeeCardId);
    }

    Scanner sc = new Scanner(System.in);

    /**
     * 管理员的操作
     */
    @Override
    public void operate() {
        System.out.print("请输入确认操作:");
        int i = sc.nextInt();
        switch (i) {
            case 1:
                //整理
                sort(books);
                break;
            case 2:
                //查
                select(books);
                break;
            case 3:
                //加
                add(books);
                break;
            case 4:
                //删
                delete(books);
                break;
            case 5:
                //列表
                list(books);
                break;
            default:
                System.out.println("输入有误!");
                break;

        }
    }

    public void sort(Book[] books) {
        System.out.println("图书馆中的书按价格整理如下:" + "\n" + "【书名】—— 【作者】——【价格】——【分类】——状态");
        Arrays.sort(books, (o1, o2) -> (int) (o1.getPrice() - o2.getPrice()));
        //遍历数组打印书的列表
        for (Book book : books) {
            if (book.price != 0) {
                System.out.println(
                        "【" + book.getName() + "】—— 【" + book.getAuthor() + "】——【" + book.getPrice()
                                + "】——【" + book.getCategory() + "】——" + book.getState());
            }
        }
    }

    @Override
    public void select(Book[] books) {
        System.out.println("请输入书名进行查询:");
        String name = sc.next();
        if (name != null) {
            boolean flag = false;
            int bookNum = 0;
            for (int i = 0; i < books.length; i++) {
                if (books[i].getName() != null && name.equals(books[i].getName())) {
                    flag = true;
                    bookNum = i;
                    break;
                }
            }
            if (!flag) {
                System.out.println("未查询到此书籍!");
            } else {
                System.out.println("书籍信息为:" + "\n" + "【书名】—— 【作者】——【价格】——【分类】——状态");
                System.out.println(
                        "【" + books[bookNum].getName() + "】—— 【" + books[bookNum].getAuthor() + "】——【" + books[bookNum]
                                .getPrice() + "】——【" + books[bookNum].getCategory() + "】——" + books[bookNum]
                                .getState());
            }
        }
    }

    @Override
    public void delete(Book[] books) {
        System.out.println("请输入要删除的书名:");
        String str = sc.next();
        if (str != null) {
            for (int i = 0; i < books.length; i++) {
                if (books[i].getName().equals(str)) {
                    books[i] = null;
                    System.out.println("删除成功!");
                    break;
                }
            }
        }

    }

    @Override
    public void add(Book[] books) {
        System.out.println("请输入书名:");
        String name = sc.next();
        System.out.println("请输入作者:");
        String author = sc.next();
        System.out.println("请输入价格:");
        double price = sc.nextDouble();
        System.out.println("请输入分类:");
        String category = sc.next();

        boolean flag = false;
        for (Book book : books) {
            if (book.getName() == null) {
                flag = true;
                book.setName(name);
                book.setAuthor(author);
                book.setPrice(price);
                book.setCategory(category);
                book.setState(true);
                System.out.println("添加成功");
                break;
            }
        }
        if (!flag) {
            System.out.println("【警告】数组预留buffer最多只能添加3本新书,没有位置放置新书了,如需添加多余3本,需要在‘Person’类中添加buffer!" + "\n");
        }

    }

    @Override
    public void list(Book[] books) {
        System.out.println("图书列表如下:" + "\n" + "【书名】—— 【作者】——【价格】——【分类】——状态");  //打印Book数组
        for (Book book : books) {
            if (book != null) {
                if (book.price != 0) {
                    System.out.println(
                            "【" + book.getName() + "】—— 【" + book.getAuthor() + "】——【" + book.getPrice()
                                    + "】——【" + book.getCategory() + "】——" + book.getState());

                }
            }
        }
    }
}

user类

package dao;  //指明该类在包dao下

import java.util.Scanner;

public class User extends Person implements Operate {   //user类继承了人的类,  实现operate接口

    public User(String name, String sex, int libraryCardId ) {
        //调用人基类的构造函数(派生类不继承基类的构造函数)
        super(name, sex, libraryCardId);
    }

    Scanner sc = new Scanner(System.in);

    @Override
    public void operate() {  //普通用户的操作

        System.out.print("请输入确认操作:");
        int i = sc.nextInt();
        switch (i) {
            case 1:
                //查
                select(books);
                break;
            case 2:
                //借
                delete(books);
                break;
            case 3:
                //还
                add(books);
                break;
            case 4:
                //书列表
                list(books);
                break;
            default:
                System.out.println("输入有误!");
                break;
        }
    }

    @Override
    public void select(Book[] books) {
        System.out.println("请输入书名进行查询:");
        String name = sc.next();
        if (name != null) {
            boolean flag = false;
            int bookNum = 0;
            for (int i = 0; i < books.length; i++) {
                if (books[i].getName() != null && name.equals(books[i].getName())) {
                    flag = true;
                    bookNum = i;
                    break;
                }
            }
            if (!flag) {
                System.out.println("未查询到此书籍!");
            } else {
                System.out.println("书籍信息为:" + "\n" + "【书名】—— 【作者】——【价格】——【分类】——状态");
                System.out.println(
                        "【" + books[bookNum].getName() + "】—— 【" + books[bookNum].getAuthor() + "】——【" + books[bookNum]
                                .getPrice() + "】——【" + books[bookNum].getCategory() + "】——" + books[bookNum]
                                .getState());
            }
        }
    }

    @Override
    public void delete(Book[] books) {
        System.out.println("请输入要借阅的书名:");
        String name = sc.next();
        if (name != null) {
            for (int i = 0; i < books.length - 1; i++) {
                if (books[i].getName().equals(name)) {
                    //借走书时设置状态为false
                    if (!books[i].getState()) {
                        System.out.println("【" + name + "】" + "已经被借出!");
                    } else {
                        books[i].setState(false);
                        System.out.println("借阅成功!");
                    }
                    break;
                }
            }
        }
    }

    @Override
    public void add(Book[] books) {

        System.out.println("请输入要还的书名:");
        String name = sc.next();

        if (name != null) {
            boolean flag = true;
            int i = 0;
            while (flag) {
                if (books[i].getName().equals(name)) {
                    if (!books[i].getState()) {
                        books[i].setState(true);
                        System.out.println("还书成功!");
                        flag = false;
                    } else {
                        System.out.println("该书籍已经被还回!");
                        break;
                    }
                }
                i++;
            }
        }
    }


    @Override
    public void list(Book[] books) {
        System.out.println("图书列表如下:" + "\n" + "【书名】—— 【作者】——【价格】——【分类】——状态");  //打印Book数组
        for (Book book : books) {
            if (book != null) {
                if (book.price != 0) {
                    System.out.println(
                            "【" + book.getName() + "】—— 【" + book.getAuthor() + "】——【" + book.getPrice()
                                    + "】——【" + book.getCategory() + "】——" + book.getState());

                }
            }
        }
    }
}

Main类

import dao.Library;

public class Main {
    public static void main(String[] args) {
        Library library = new Library(); //构造Library对象
        library.login(); //调用对象的登录方法。
    }
}

正确运行结果如下:

普通用户登录功能

普通用户查询书籍功能

 普通用户借阅功能

 普通用户归还功能

 普通用户显示书籍列表功能

 退出系统

 管理员功能受限于篇幅不在一一展示,请自行下载调试学习。

三、遇到的问题

 上述问题的解决办法参考如下

1、Variable 'p' initializer 'null' is redundant

2、typo:in word

3、Employee(int,java.lang.String,java.lang.String,int,com.kuang.pojo.Department

4、Method setName() is never used

5、Duplicated code fragment

6、Scanner连续输入int, String 报错

7、java: 找不到符号

8、for loop can be replaced with enhanced"for"

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值