Java图书管理系统

目录

前言:

框架:

书: 

书架:

操作相关:

用户相关:

主类: 

细节完善:

Main、User和Bookshelf完善:

ShowOperation完善:

FindOperation完善:

AddOperation完善:

DelOperation完善:

ExitOperation完善:

BorrowOperation完善:

ReturnOperation完善:

全部代码: 

Main:

Book:

Bookshelf: 

IOperation接口:

AddOperation:

BorrowOperation:

DelOperation:

ExitOperation:

FindOperation:

ReturnOperation:

ShowOperation:

User:

AdminUser:

NormalUser:

总结:


前言:

        因为Java是面向对象的语言,所以相对C语言,实现一个图书管理系统是相对容易的,这一篇我们来讲解图书管理系统(当然是简易版的)。

        先介绍一下这个图书管理系统,它有两个身份,一个图书管理员,一个普通用户。每一个对应的操作权限不一样。并且这个系统有借阅和归还功能。

框架:

书: 

        我们先去创建一个包,这样分工并高效完成这个项目。 

        面向对象,第一个想到的肯定是书,所以我们要创建一个Book类,书就有书名,作者,价格,类型。因为我们这个会有借阅和归还,所以我们再加一个是否借阅的属性。

        在正式使用时,我们一般会考虑其安全性,所以我们令每一个成员变量为私有属性,通过get和set方法设置和获取(不要手敲,如果你用的是IDEA,可以右键点击Generate,点击Getter and Setter把属性全部选中一键生成)。

//书
public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }//这里构造方法没有isBorrow参数,是因为我们不能由输入而定

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
}

        这里我们使用了有参构造器,但是并没有传入isBorrow参数, 是因为我们初始化本身是未借出,不能根据用户输入而定(这些细节都不可忽略)。

        我为了方便打印,重写toString方法,但是要可能要稍作修改。

public String toString() {
    return "Book{" +
            "书名='" + name + '\'' +
            ", 作者='" + author + '\'' +
            ", 价格=" + price +
            ", 类型='" + type + '\'' +
            ", 是否被借出=" + isBorrowed +
            '}';
}

        此时就完成了书这个类。

书架:

        书应该放在书架上,所以在定义一个Bookshelf类,这里面会存放多本书。但是我们知道,这就相当于定义了一个Book的数组了,所以我们要记录容量和当前有多少本书,构造方法作为将书架生成10本书的空间。接下来给出代码: 

//书架
public class Bookshelf {
    private Book[] books;
    private int usedSize;//记录下标

    public Bookshelf() {
        this.books = new Book[10];
        //默认放10本书
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
    
    //获取一个下标的书
    public Book getBook(int pos) {
        return books[pos];
    }
    
    //放入pos下标的书
    public void setBooks(int pos, Book book) {
        books[pos] = book;
    }
}

         我们目前只是框架有很多细节先不要针对。

        这个类其实已经可以完成了所有操作了,但是这样可读性会很低。

操作相关:

        所以我们再创建一个和操作有关的包,这里面的类来完成有关书的各类操作。

         

        这些所有的类,都相当于操作书架,所以我们在每一个类中都写入操作书架的方法。

public void work(Bookshelf bookshelf) {

}

         因为所有操作都是要操作书架的,所以我们定义一个接口,接口中写一个抽象方法,这个方法就是操作书架。之后所有操作有关的类使用这个接口并重写方法

public interface IOperation {
    void work(Bookshelf bookshelf);
}

用户相关:

        我们因为每个使用的用户不用,操作权限也不同,所以我们再定义一个user包。 因为操作的都是人,所以我们先写一个大类User。这个里面的name我并不想让其他包非子类使用,所以我们使用protected修饰,其他包使用必须继承这个类并使用super关键字调用。

public class User {
    protected String name;
    //除非其他包继承该类并使用super调用,否则无法调用

    public User(String name) {
        this.name = name;
        //构造方法
    }
}

        之后创建AdminUser类和NormalUser类,都继承于User类。 

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
    }
}
public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }
}

        当我们确定身份完以后,就会直接打印出菜单,所以我们在里面写入menu方法,注意两个身份不同,对应菜单不同。

        因为不同身份对应操作权限不同,所以我们可以通过方法重写来是菜单展现不同。所以大家是否想到了多态?我们直接在User里面定义一个抽象menu方法,之后使继承User的类直接重写并通过向上转型就可以打印出不同菜单了。所以我们将User定义为抽象类,并往里面写入抽象menu方法。

public abstract class User {
    protected String name;

    public User(String name) {
        this.name = name;
        //构造方法
    }
    public abstract int menu();
}

        AdminUser中的菜单:

public void menu() {
    System.out.println("*******************");
    System.out.println("1.查找图书");
    System.out.println("2.新增图书");
    System.out.println("3.删除图书");
    System.out.println("4.显示图书");
    System.out.println("0.退出图书");
    System.out.println("*******************");
}

        NormalUser中的菜单:

public void menu() {
    System.out.println("*******************");
    System.out.println("1.查找图书");
    System.out.println("2.借阅图书");
    System.out.println("3.归还图书");
    System.out.println("0.退出图书");
    System.out.println("*******************");
}

主类: 

        之后为了完成所有操作,我们写一个主方法。我们先调用登录方法(login):

public class Main {
    public static User login() {
        //先登录
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);

        String name = scanner.nextLine();
        System.out.println("请输入身份:1.管理员  2.普通用户");
        int choice = scanner.nextInt();
        if (choice == 1) {
            //管理员
            return new AdminUser(name);
        } else {
            //普通用户
            return new NormalUser(name);
        }


    }

    public static void main(String[] args) {
        User user = login();
    }
}

        此时就确定了用户类型(以上代码有Bug,但是可以跑,各位可以参考以后完善,但是不影响阅读),之后去调用menu方法。

public static void main(String[] args) {
    User user = login();
    user.menu();
}

        我们要一边运行一边写代码,这样可以及时发现错误。所以建议大家先运行一下。

        此时大框架就已经完成了,恭喜你已经完成了二分之一。那么接下来我们就进行其他具体细节的完善。

细节完善:

Main、User和Bookshelf完善:

        确定身份之后就需要进行操作了,我们在menu方法中写入。

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
    }
    public int menu() {
        System.out.println("******** 普通用户 ******");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出图书");
        System.out.println("***********************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();

        return choice;
    }
}

        注意我们改写了menu方法,进行了返回,所以此时就需要改写抽象User类中的方法。

//在抽象类User中,此时将void改为int
//public abstract void menu();
public abstract int menu();

        因为不同用户对应的操作不同,所以此时我们在User中再定义一个IOperation接口数组,确定都会使用哪些方法。

public abstract class User {
    protected String name;
    //除非其他包继承该类并使用super调用,否则无法调用
    protected IOperation[] iOperations;

    public User(String name) {
        this.name = name;
        //构造方法
    }
    public abstract int menu();
}

       之后在管理员和普通成员类中,我们确定完身份以后就执行了构造方法,所以我们在其构造方法中确定会有哪些操作即可(既定义IOperation数组又哪些操作)。

        此时已经确定了哪些用户会有哪些操作,但是如何调用呢?

        所以我们在User类中定义一个执行操作的方法,参数为choice和Bookshelf,这样就确定执行什么操作了。

//User类中
public void doOperation(int choice, Bookshelf bookshelf) {
    iOperations[choice].work(bookshelf);
}

        用户不止会操作一次,所以我们循环调用。而且因为书架只能有一个,所以我们在使用主方法时,就新创建一个书架。        此时放10本书,但是每一个引用都指向的是null。但是此时默认书架上有3本书。所以在Bookshelf中的构造方法里面写入:

public Bookshelf() {
    this.books = new Book[10];
    //默认放10本书
    this.books[0] = new Book("三国演义","罗贯中",10,"小说");
    this.books[1] = new Book("水浒传","施耐庵",13,"小说");
    this.books[2] = new Book("西游记","吴承恩",29,"小说");
    //默认三本书
    this.usedSize = 3;

}

        此时就差完善operation包中的类了。

ShowOperation完善:

public class ShowOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("展示图书");
        int curSize = bookshelf.getUsedSize();
        for (int i = 0; i < curSize; i++) {
            Book book = bookshelf.getBook(i);
            System.out.println(book);
        }
    }
}

        我们默认三本书,所以我们打印一下。 

        但是此时我们发现借出打印的并不符合预期,所以我们进行改写。 

//在Book类中的toString方法。
@Override
public String toString() {
    return "Book{" +
            "书名='" + name + '\'' +
            ", 作者='" + author + '\'' +
            ", 价格=" + price +
            ", 类型='" + type + '\'' +
            ((isBorrowed == true) ? ", 已被借出" : ", 未被借出") +
            /*", 是否被借出=" + isBorrowed +*/
            '}';
}

FindOperation完善:

public class FindOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("查找图书");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        
        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                System.out.println("找到了,信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}

AddOperation完善:

        我们添加图书,一般是先看书架满了没有,之后判断是否重复添加(不考虑有重复的书名),所以此时在书架中添加无参构造器,并添加一个返回最大容量的方法。

public class AddOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("增加图书");
        int cur = bookshelf.getUsedSize();

        //看看书架是否已经满了
        if (cur == bookshelf.getBooks().length) {
            System.out.println("书架已满");
        } else {
            Book book = new Book();
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入书的名称:");
            book.setName(scanner.nextLine());;
            System.out.println("请输入书的作者:");
            book.setAuthor(scanner.nextLine());;
            System.out.println("请输入书的价格:");
            book.setPrice(scanner.nextInt());
            //注意这里面有一个 回车 我们要将其消化掉
            scanner.nextLine();

            System.out.println("请输入书的类型");
            book.setType(scanner.nextLine());

            //检查数组中有没有这本书
            for (int i = 0; i < cur; i++) {
                Book book1 = bookshelf.getBook(i);
                if (book.getName().equals(book1)) {
                    System.out.println("这本书已经有了");
                    return;
                }
            }
            bookshelf.setBooks(cur,book);
            bookshelf.setUsedSize(cur++);
            System.out.println("添加成功!");
        }

    }


}

        注意此时在Book中添加无参构造器(大家真的完善时不要学我,否则private修饰则失去了意义):

//在Book中添加无参构造器
public Book() {

}

DelOperation完善:

        删除操作,我们进行对比,之后找到把后面内容先前覆盖,把最后一个置null。

public class DelOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("删除图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名:");
        String name = scanner.nextLine();
        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (book.getName().equals(name)) {
                //删除
                //后面的向前覆盖
                int j = i;
                for ( ; j < bookshelf.getUsedSize() - 1; j++) {
                    bookshelf.setBooks(j,bookshelf.getBook(j + 1));
                }
                System.out.println("删除成功");
                //最后把 j 位置置空
                bookshelf.setBooks(j,null);
                bookshelf.setUsedSize(cur - 1);
                return;
            }
        }

        System.out.println("没有这本书");
    }
}

ExitOperation完善:

        退出操作,直接进行强制退出。

public class ExitOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("退出系统");
        System.exit(0);
        //直接强制退出
    }
}

        之后我们来看看普通用户的操作。

BorrowOperation完善:

        借阅操作和查询操作很像。

public class BorrowOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("借阅图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅的书名");
        String name = scanner.nextLine();

        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                //查看借阅状态
                if (book.isBorrowed()) {
                    System.out.println("已被借阅,无法借阅");
                } else {
                    book.setBorrowed(true);
                    System.out.println("借阅成功");
                }
                return;
            }
        }

        //没有找到
        System.out.println("没有此书");
    }
}

ReturnOperation完善:

        归还图书和借阅图书逻辑一样。

public class ReturnOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("归还图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要归还的书名");
        String name = scanner.nextLine();

        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                //查看归还状态
                if (book.isBorrowed()) {
                    book.setBorrowed(false);
                    System.out.println("归还成功");

                } else {
                    System.out.println("已被归还,无法归还");
                }
                return;
            }
        }

        //没有找到
        System.out.println("没有此书");
    }
}

        注意它和BorrowOperation一样,就是看归还状态那里反了过来。

全部代码: 

        那么接下来相信你也看完了全部过程,附上全部代码:

Main:

public class Main {
    public static User login() {
        //先登录
        System.out.println("请输入你的姓名:");
        Scanner scanner = new Scanner(System.in);

        String name = scanner.nextLine();
        System.out.println("请输入身份:1.管理员  2.普通用户");
        int choice = scanner.nextInt();
        if (choice == 1) {
            //管理员
            return new AdminUser(name);
        } else {
            //普通用户
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        Bookshelf bookshelf = new Bookshelf();
        User user = login();
        while(true) {
            int choice = user.menu();

            //根据 choice 的选择 来决定调用的是哪个方法
            /*user.doOperation(choice,new Bookshelf());*/
            //这里不能每次都new
            user.doOperation(choice,bookshelf);
        }
    }
}

Book:

//书
public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }//这里构造方法没有isBorrow参数,是因为我们不能由输入而定

    public Book() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "书名='" + name + '\'' +
                ", 作者='" + author + '\'' +
                ", 价格=" + price +
                ", 类型='" + type + '\'' +
                ((isBorrowed == true) ? ", 已被借出" : ", 未被借出") +
                /*", 是否被借出=" + isBorrowed +*/
                '}';
    }
}

Bookshelf: 

//书架
public class Bookshelf {
    private Book[] books;
    private int usedSize;//记录下标

    public Bookshelf() {
        this.books = new Book[10];
        //默认放10本书
        this.books[0] = new Book("三国演义","罗贯中",10,"小说");
        this.books[1] = new Book("水浒传","施耐庵",13,"小说");
        this.books[2] = new Book("西游记","吴承恩",29,"小说");
        //默认三本书
        this.usedSize = 3;

    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    //获取一个下标的书
    public Book getBook(int pos) {
        return books[pos];
    }

    //放入pos下标的书
    public void setBooks(int pos, Book book) {
        books[pos] = book;
    }

    //为了获取最大容量
    public Book[] getBooks() {
        return books;
    }
}

IOperation接口:

public interface IOperation {
    void work(Bookshelf bookshelf);
}

AddOperation:

public class AddOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("增加图书");
        int cur = bookshelf.getUsedSize();

        //看看书架是否已经满了
        if (cur == bookshelf.getBooks().length) {
            System.out.println("书架已满");
        } else {
            Book book = new Book();
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入书的名称:");
            book.setName(scanner.nextLine());;
            System.out.println("请输入书的作者:");
            book.setAuthor(scanner.nextLine());;
            System.out.println("请输入书的价格:");
            book.setPrice(scanner.nextInt());
            //注意这里面有一个 回车 我们要将其消化掉
            scanner.nextLine();

            System.out.println("请输入书的类型");
            book.setType(scanner.nextLine());

            //检查数组中有没有这本书
            for (int i = 0; i < cur; i++) {
                Book book1 = bookshelf.getBook(i);
                if (book.getName().equals(book1)) {
                    System.out.println("这本书已经有了");
                    return;
                }
            }
            bookshelf.setBooks(cur,book);
            bookshelf.setUsedSize(cur + 1);
            System.out.println("添加成功!");
        }

    }


}

BorrowOperation:

public class BorrowOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("借阅图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要借阅的书名");
        String name = scanner.nextLine();

        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                //查看借阅状态
                if (book.isBorrowed()) {
                    System.out.println("已被借阅,无法借阅");
                } else {
                    book.setBorrowed(true);
                    System.out.println("借阅成功");
                }
                return;
            }
        }

        //没有找到
        System.out.println("没有此书");
    }
}

DelOperation:

public class DelOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("删除图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名:");
        String name = scanner.nextLine();
        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (book.getName().equals(name)) {
                //删除
                //后面的向前覆盖
                int j = i;
                for ( ; j < bookshelf.getUsedSize() - 1; j++) {
                    bookshelf.setBooks(j,bookshelf.getBook(j + 1));
                }
                System.out.println("删除成功");
                //最后把 j 位置置空
                bookshelf.setBooks(j,null);
                bookshelf.setUsedSize(cur - 1);
                return;
            }
        }

        System.out.println("没有这本书");
    }
}

ExitOperation:

public class ExitOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("退出系统");
        System.exit(0);
        //直接强制退出
    }
}

FindOperation:

public class FindOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("查找图书");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();

        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                System.out.println("找到了,信息如下:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到这本书");
    }
}

ReturnOperation:

public class ReturnOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("归还图书");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要归还的书名");
        String name = scanner.nextLine();

        int cur = bookshelf.getUsedSize();
        for (int i = 0; i < cur; i++) {
            Book book = bookshelf.getBook(i);
            if (name.equals(book.getName())) {
                //查看归还状态
                if (book.isBorrowed()) {
                    book.setBorrowed(false);
                    System.out.println("归还成功");

                } else {
                    System.out.println("已被归还,无法归还");
                }
                return;
            }
        }

        //没有找到
        System.out.println("没有此书");
    }
}

ShowOperation:

public class ShowOperation implements IOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("展示图书");
        int curSize = bookshelf.getUsedSize();
        for (int i = 0; i < curSize; i++) {
            Book book = bookshelf.getBook(i);
            System.out.println(book);
        }
    }
}

User:

public abstract class User {
    protected String name;
    //除非其他包继承该类并使用super调用,否则无法调用
    protected IOperation[] iOperations;

    public User(String name) {
        this.name = name;
        //构造方法
    }
    public abstract int menu();

    public void doOperation(int choice, Bookshelf bookshelf) {
        iOperations[choice].work(bookshelf);
    }
}

AdminUser:

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        //在调用构造方法之后就确定会有哪些方法
        this.iOperations = new IOperation[] {new ExitOperation(),
                new FindOperation(),new AddOperation(),
                new DelOperation(),new ShowOperation()};
    }
    public int menu() {
        System.out.println("******* 管理员 *******");
        System.out.println("1.查找图书");
        System.out.println("2.新增图书");
        System.out.println("3.删除图书");
        System.out.println("4.显示图书");
        System.out.println("0.退出图书");
        System.out.println("*********************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();

        return choice;
    }


}

NormalUser:

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);
        this.iOperations = new IOperation[] {new ExitOperation(),
                new FindOperation(),new BorrowOperation(),
                new ReturnOperation()};
    }
    public int menu() {
        System.out.println("******** 普通用户 ******");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出图书");
        System.out.println("***********************");

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作:");
        int choice = scanner.nextInt();

        return choice;
    }
}

总结:

        我们想好整体框架以后,再去完善细节就会比较轻松。以上项目还有很多问题,比如我们输入身份时输入错误也会继续运行,而且每次都没有把改变的书记录下来,所以大家下来可以再完善一下,博主以后也会根据所学知识来改善,希望大家点点赞。

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值