Java图书管理系统(一)

7 篇文章 1 订阅

本文项目内容是Java图书管理系统(二)的另一版本,使用接口及其实现类,利用类的封装与实现,完成对图书的增删改查与借阅归还等。

一、项目需求

	完成一个图书管理系统,实现:
		1、查看所有书籍,展示所有书籍的类型 、书名、价格	、是否借出的情况
		
		2、添加书籍(两种情况)
		
    	2.1 新添加的书籍类型在数据集合bookMap中已存在,那么就直接将新书添加到对应类型的书籍List集合中
    	2.2 新添加的书籍类型在数据集合bookMap中不存在,那么需要新建键值对完成bookMap中的元素添加
    	
    	3、修改书籍信息
    	
    	3.1 修改书籍类型  
    	3.2 修改书籍名称及价格

		4、删除书籍信息,删除书籍后需要判断该书所在List集合长度是否为0,为0则该键值对一起移除

		5、退出系统

		6、借阅书籍

		7、归还书籍

二、项目结构

整体结构框架如图:

在这里插入图片描述

1、 dataBase层(数据层)

1.1 Database类
package myBookManage.cn.edu.just.dataBase;

import myBookManage.cn.edu.just.model.Book;

import java.util.ArrayList;
import java.util.HashMap;

public class Database {
    public static HashMap<String, ArrayList<Book>> initBookMap() {
        HashMap<String, ArrayList<Book>> bookMap = new HashMap<>();
        //创建书籍对象
        Book book1 = new Book("西游记", "名著", 69,false);
        Book book2 = new Book("水浒传", "名著", 79,true);
        Book book3 = new Book("红楼梦", "名著", 89,false);

        Book book5 = new Book("py入门", "it", 77,true);
        Book book6 = new Book("php入门", "it", 87,false);
        Book book7 = new Book("jsp入门", "it", 68,false);

        //创建书籍List集合
        ArrayList<Book> bookList1 = new ArrayList<>();
        ArrayList<Book> bookList2 = new ArrayList<>();

        // List集合添加书籍
        bookList1.add(book1);
        bookList1.add(book2);
        bookList1.add(book3);

        bookList2.add(book5);
        bookList2.add(book6);
        bookList2.add(book7);

        //HashMap添加键值对
        bookMap.put(book1.getType(), bookList1);
        bookMap.put(book6.getType(), bookList2);
        return bookMap;
    }

}

2、model层(或pojo层)

2.1 Book类
package myBookManage.cn.edu.just.model;

/**图书管理系统优化点

        1 在修改书籍功能中 如果要修改的书籍类型或书名不存在的情况下 直接进行提示操作
        2 在修改书籍功能中 增加修改已有书籍的类型的功能
        3 在删除书籍功能中 如果删除的书籍类型和或书名不存在的情况下 直接进行提示操作


        在优化完的基础上 新增两个功能

        1 借书功能
        2 还书功能

 */

public class Book {
    //书名
    private String name;
    //类型
    private String type;
    //价格
    private double price;
    //是否借出
    private boolean isBorrowed;

    public Book() {
    }

    public Book(String name, String type, double price) {
        this.name = name;
        this.type = type;
        this.price = price;
    }

    public Book(String name, String type, double price, boolean isBorrowed) {
        this.name = name;
        this.type = type;
        this.price = price;
        this.isBorrowed = isBorrowed;
    }

    public boolean isBorrowed() {
        return isBorrowed ;
    }

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

    public String getName() {
        return name;
    }

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

    public String getType() {
        return type;
    }

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

    public double getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", price=" + price +
                ", isBorrowed=" + (isBorrowed == true ? " 已借出 ":" 未借出 ") +
                '}';
    }
}

3、operation层(操作层)

一个操作接口( IOpreation接口):
对于每一个操作都有相近的一部分,刚好可以用接口,利用接口类型的数组来进行相关的操作。

七个操作实现类:
用于实现书籍增删改查以及借阅归还等操作。

用一个protected IOpreation[] iOpreations;即接口类型的数组,主要是在它的子类中,在构造函数中需要根据它们各自的功能实例化各个操作。IOpreation[] iOpreations数组实例化
在这里插入图片描述

3.1 AddBookInfoOperation类

添加书籍信息实现类

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class AddBookInfoOperation implements IOpreation {
    @Override
    public void work(HashMap<String, ArrayList<Book>> bookMap) {
        MyBookManageService user = new MyBookManageService();
        Scanner scanner = new Scanner(System.in);
        System.out.println("");
        System.out.println("请输入您要添加的书籍类型:");
        String bookType = scanner.next();

        System.out.println("请输入您要添加的书名:");
        String bookName = scanner.next();
        System.out.println("请输入您要添加的书籍价格:");
        double bookPrice = scanner.nextDouble();

        //创建书籍对象
        Book addBook = new Book (bookName, bookType, bookPrice);

        //添加书籍存在两种情况
        //1新添加的书籍类型在bookMap中已存在如果是这样那么就直接将新书添加到对应类型的书籍List集合中
        //2新添加的书籍类型在bookMap中不存在如果这样需要新建键值对完成bookMap中的元素添加
        //根据书籍类型查询是否有对应的书籍List集合

        ArrayList<Book>bookArrayList = bookMap.get(bookType) ;

        if (bookArrayList != null){
            // 情况1
            bookArrayList.add(addBook);
        }else {
            //情况2

            //新建List集合并添加书籍
            ArrayList<Book> bookList = new ArrayList<>();
            bookList.add(addBook);
            // bookMap新添加键值对
            bookMap.put (bookType,bookList);
        }
        System.out.println("添加"+bookName+"成功!");
        user.login( bookMap);
    }

}


3.2 BorrowOperation类

借阅书籍实现类

package myBookManage.cn.edu.just.operation;

/**
 * 借阅图书
 * 对于借阅图书只需要将图书信息中的布尔型变量isBorrowed变量变为true即可,首先还是要遍历booklist找到该书。
 */

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class BorrowOperation implements IOpreation {
    public void work( HashMap<String, ArrayList<Book>> bookMap){
        MyBookManageService user = new MyBookManageService();
        Scanner scan=new Scanner(System.in);
        System.out.println("--------借阅图书-----------");
        System.out.println("请输入要借阅的书籍类型:");
        String borrowType=scan.next();
        user.isExitByType(bookMap,borrowType);

        System.out.println("请输入要借阅的书籍名称:");
        String borrowBookName=scan.next();
        user.isExitByName(bookMap,borrowType,borrowBookName);

        ArrayList<Book> bookArrayList = bookMap.get(borrowType);

        //判断是否借出
        for (Book book : bookArrayList) {
            String name = book.getName();
            if (name.equals(borrowBookName)&&book.isBorrowed()==false) {
                book.setBorrowed(true);
                System.out.println("借阅成功");
                System.out.println("该书籍的最新信息为:");
                System.out.println(book.toString());
                break;
            }
            if (name.equals(borrowBookName) && book.isBorrowed()==true){
                System.out.println("该书已被借出");
                break;
            }
        }
        user.login( bookMap);
      }
    }


3.3 DeleteBookInfoOperation类

删除书籍信息实现类

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class DeleteBookInfoOperation implements IOpreation {
    @Override
    public void work(HashMap<String, ArrayList<Book>> bookMap) {
        MyBookManageService user = new MyBookManageService();
        Scanner scanner=new Scanner(System.in);
        System.out.println("");
        System.out.println("请输入要删除的书籍类型");
        String deleteBookType = scanner.next();
        user.isExitByType(bookMap,deleteBookType);

        System.out.println("请输入要删除的书名");
        String deleteBookName = scanner.next();
        user.isExitByName(bookMap,deleteBookType, deleteBookName);

        ArrayList<Book> bookArrayList = bookMap.get(deleteBookType);
        for (int i = 0; i < bookArrayList.size(); i++) {
            Book book = bookArrayList.get(i);
            String name = book.getName();
            if (name.equals(deleteBookName)) {
                //要删除的书名存在进行删除
                bookArrayList.remove(i);
                System.out.println("删除" + name + "成功!");

                //删除书籍后需要判断该书所在List集合长度是否为0
                if(bookArrayList.size() == 0) {
                    //移除该键值对
                    bookMap.remove(deleteBookType);
                }

                break;
            }

        }
        user.login( bookMap);
    }
}

3.4 ExitOperation类

退出系统实现类

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;

import java.util.ArrayList;
import java.util.HashMap;

public class ExitOperation implements IOpreation {
    @Override
    public void work(HashMap<String, ArrayList<Book>> bookMap) {
        //正在退出系统
        System.out.println("正在退出系统");
        System.exit(0);
    }
}

3.5 GetBooksInfoOperation类

查看所有书籍实现类

也可直接在重写的toString函数中(toString函数在Object类中,它被认为是所有类的父类)用(isBorrowed == true ? " 已借出 “:” 未借出 ") 将true和false转换为文字。

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class GetBooksInfoOperation implements IOpreation {
    @Override
    public void work(HashMap<String, ArrayList<Book>> bookMap) {
        MyBookManageService user = new MyBookManageService();
        System.out.println("类型  \t书名\t\t价格\t\t是否借出");
        //对bookMap进行遍历并打印
        Set<Map.Entry<String, ArrayList<Book>>> entries = bookMap.entrySet();

        for (Map.Entry<String, ArrayList<Book>> book : entries) {
            //获取bookMap中的key(书籍类型)
            String bookType = book.getKey();
            System.out.println(bookType);
            //获取bookMap中的value(书籍List集合)
            ArrayList<Book> bookList = book.getValue();
            //对书籍List集合进行遍历
            for (Book bookInfo : bookList) {
                System.out.println("\t\t"+bookInfo.getName()+"\t\t"+bookInfo.getPrice()+"\t\t"+(bookInfo.isBorrowed()==true ? "已借出" : "未借出"));
            }

        }
        user.login( bookMap);
    }
}

3.6 IOpreation接口

操作接口(抽象)

对于每一个操作都有相近的一部分,刚好可以用接口,利用接口类型的数组来进行相关的操作。

package myBookManage.cn.edu.just.operation;


import myBookManage.cn.edu.just.dataBase.Database;
import myBookManage.cn.edu.just.model.Book;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * 操作接口
 * 对于每一个操作都有相近的一部分,刚好可以用接口,在User(使用者)中利用接口类型的数组来进行相关的操作。
 */
public interface IOpreation {

     void work( HashMap<String, ArrayList<Book>> bookMap);
}
3.7 ReturnOperation类

归还书籍实现类

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;


/**
 * 归还书籍
 * 和借阅图书进行对比可只,借阅图书是将isBorrowed变量由false变为true,那么归还图书就是将isBorrowed变量由true变为false.
 */
public class ReturnOperation implements IOpreation {

    @Override
    public void work( HashMap<String, ArrayList<Book>> bookMap) {
        Scanner scan=new Scanner(System.in);
        MyBookManageService user = new MyBookManageService();
        System.out.println("-----------归还图书--------------");

        System.out.println("请输入要归还的书籍类型:");
        String returnBookType=scan.next();
        user.isExitByType(bookMap,returnBookType);

        System.out.println("请输入要归还的书籍名称:");
        String returnBookName=scan.next();
        user.isExitByName(bookMap,returnBookType,returnBookName);

        ArrayList<Book> bookArrayList = bookMap.get(returnBookType);
        for (Book book : bookArrayList) {
            String name = book.getName();
            if (name.equals(returnBookName)&&book.isBorrowed()==true ) {
                book.setBorrowed(false);
                System.out.println("归还成功");
                System.out.println("该书籍的最新信息为:");
                System.out.println(book.toString());
                break;
            }

            if (name.equals(returnBookName)&&book.isBorrowed()==false){
                System.out.println("该书已被归还");
            }
        }
        user.login( bookMap);
    }

}



3.8 UpdateBookInfoOperation类

修改书籍信息实现类

package myBookManage.cn.edu.just.operation;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class UpdateBookInfoOperation implements IOpreation {
    @Override
    public void work(HashMap<String, ArrayList<Book>> bookMap) {
        Scanner scan=new Scanner(System.in);
        MyBookManageService user = new MyBookManageService();

        System.out.println("");
        System.out.println("请选择:");
        System.out.println("1->修改书籍类型  2->修改书籍名称及价格  3->返回上一层");

        int choose=scan.nextInt();
        if(choose==1){
            System.out.println("请输入该书籍原类型");
            String originalBookType = scan.next();
            user.isExitByType(bookMap, originalBookType);

            System.out.println("请输入要修改的书名");
            String modifyBookName = scan.next();
            user.isExitByName(bookMap,originalBookType,  modifyBookName);

            System.out.println("请输入修改后的书籍类型");
            String newBookType = scan.next();
            double bookPrice=user.getBookPrice(bookMap,modifyBookName);
            boolean bookIsBorrowed=user.getBookIsBorrowed(bookMap,modifyBookName);
            Book addBook1 = new Book (modifyBookName, newBookType, bookPrice,bookIsBorrowed);

            ArrayList<Book> bookArrayList = bookMap.get(newBookType);
            if (bookArrayList != null){
                bookArrayList.add(addBook1);
                System.out.println("更改书籍类型"+modifyBookName+"成功!");

                ArrayList<Book> bookArrayListRemove = bookMap.get(originalBookType);

                for (int i = 0; i < bookArrayListRemove.size(); i++) {
                    Book book = bookArrayListRemove.get(i);
                    String name = book.getName();
                    if (name.equals(modifyBookName)) {
                        //要删除的书名存在进行删除
                        bookArrayListRemove.remove(i);

                        //删除书籍后需要判断该书所在ListJ集合长度是否为0
                        if (bookArrayListRemove.size() == 0) {
                            //移除该键值对
                            bookMap.remove(originalBookType);
                        }
                    }
                }

            }else {
                ArrayList<Book> bookList = new ArrayList<>();
                bookList.add(addBook1);
                // bookMap新添加键值对
                bookMap.put(newBookType, bookList);
                System.out.println("更改书籍类型"+modifyBookName+"成功!");

                ArrayList<Book> bookArrayListRemove = bookMap.get(originalBookType);

                for (int i = 0; i < bookArrayListRemove.size(); i++) {
                    Book book = bookArrayListRemove.get(i);
                    String name = book.getName();
                    if (name.equals(modifyBookName)) {
                        //要删除的书名存在进行删除
                        bookArrayListRemove.remove(i);
//                    System.out.println("删除" + name + "成功!");

                        //删除书籍后需要判断该书所在ListJ集合长度是否为0
                        if (bookArrayListRemove.size() == 0) {
                            //移除该键值对
                            bookMap.remove(originalBookType);
                        }
                    }
                }

            }

        }

        if (choose==2){
            System.out.println("请输入该书籍类型");
            String bookType = scan.next();
            user.isExitByType(bookMap, bookType);

            System.out.println("请输入要修改的书名");
            String oldBookName = scan.next();
            user.isExitByName(bookMap,bookType, oldBookName);

            System.out.println("请输入新的书名");
            String newBookName = scan.next();

            System.out.println("请输入新的价格");
            double newBookPrice = scan.nextDouble();

            ArrayList<Book> bookArrayList = bookMap.get(bookType);

            for (Book book : bookArrayList) {
                String name = book.getName();
                if (name.equals(oldBookName)) {
                    book.setName(newBookName);
                    book.setPrice(newBookPrice);
                    System.out.println("书籍<<"+newBookName+">>的名称及价格修改完成!");

                }
            }
        }
        if (choose==3){

            user.login(bookMap);
        }

//        else{
//            System.out.println("输入有误,重新输入");
//            Scanner scanner3= new Scanner(System.in);
//               user.updateBookInfo(bookMap,scan);
//        }
        user.login( bookMap);
    }
}

4、service层

4.1 MyBookManageService类
package myBookManage.cn.edu.just.service;

import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.operation.*;

import java.util.*;

/**图书管理系统优化点

 1 在修改书籍功能中 如果要修改的书籍类型或书名不存在的情况下 直接进行提示操作
 2 在修改书籍功能中 增加修改已有书籍的类型的功能
 3 在删除书籍功能中 如果删除的书籍类型和或书名不存在的情况下 直接进行提示操作

 在优化完的基础上 新增两个功能
 1 借书功能
 2 还书功能
 */

public class MyBookManageService {

    protected IOpreation[] iOpreations;

        public void doOperation(int choice, HashMap<String, ArrayList<Book>> bookMap) {
        this.iOpreations[choice].work(bookMap);
    }

    /**
     * IOpreation[] iOpreations,在这里就实例化了
     */
    public MyBookManageService() {
        this.iOpreations = new IOpreation[]{
                new GetBooksInfoOperation(),
                new AddBookInfoOperation(),
                new UpdateBookInfoOperation(),
                new DeleteBookInfoOperation(),
                new ExitOperation(),
                new BorrowOperation(),
                new ReturnOperation()

        };
    }

    public void login(HashMap<String, ArrayList<Book>> bookMap){

        //创建键盘录入对象
        Scanner scanner = new Scanner(System.in);

        int choice = menu(scanner,bookMap)-1;
        doOperation(choice, bookMap);//对图书进行相关的操作
    }

    public int menu( Scanner scanner,HashMap<String, ArrayList<Book>> bookMap) {

            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("7.归还书籍");
            System.out.println("请输入您的选择(输入1-7的数字):");

            //获取键盘录入的数字
            int chooseNum = scanner.nextInt();
            if(chooseNum >7 ||chooseNum <1){
                System.out.println("您的输入不合要求!");
                login(bookMap);
            }
            return chooseNum;

    }

    /**
     * 获取图书原价格
     *
     * @param bookMap
     * @param bookName
     * @return
     */
    public static double getBookPrice(HashMap<String, ArrayList<Book>> bookMap, String bookName) {

        Set<Map.Entry<String, ArrayList<Book>>> entries = bookMap.entrySet();
        double price = 88;
        for (Map.Entry<String, ArrayList<Book>> book : entries) {

            ArrayList<Book> bookList = book.getValue();
            //对书籍List集合进行遍历
            for (Book bookInfo : bookList) {
                if (bookInfo.getName().equals(bookName)) {

                    price = bookInfo.getPrice();
                    break;
                }

            }

        }
        return price;

    }

    /**
     * 判断书籍是否借出
     * @param bookMap
     * @param bookName
     * @return
     */

    public static boolean getBookIsBorrowed(HashMap<String, ArrayList<Book>> bookMap, String bookName) {

        Set<Map.Entry<String, ArrayList<Book>>> entries = bookMap.entrySet();
        boolean isBorrowed=false;
        for (Map.Entry<String, ArrayList<Book>> book : entries) {

            ArrayList<Book> bookList = book.getValue();
            //对书籍List集合进行遍历
            for (Book bookInfo : bookList) {
                if (bookInfo.getName().equals(bookName)) {

                    isBorrowed = bookInfo.isBorrowed();
                    break;
                }

            }

        }
        return isBorrowed;

    }

    /**
     * 判断书籍类型是否存在
     *
     * @param bookMap
     * @param bookType
     */
    public void isExitByType(HashMap<String, ArrayList<Book>> bookMap, String bookType) {

        ArrayList<Book> bookArrayList1 = bookMap.get(bookType);
        if (bookArrayList1 == null || bookArrayList1.size() == 0) {
            System.out.println("您要修改的书籍类型不存在");
//            Scanner scanner = new Scanner(System.in);
            login(bookMap);
        }
//        else {
//            return;
//        }
    }

    /**
     * 判断书籍名称是否存在
     *
     * @param bookMap
     * @param bookType
     * @param bookName
     */
    public void isExitByName(HashMap<String, ArrayList<Book>> bookMap, String bookType, String bookName) {

        //根据书籍类型获取书籍List集合
        ArrayList<Book> bookArrayList = bookMap.get(bookType);

        //判读要修改的书籍是否存在
        boolean isExist = false;

        for (Book book : bookArrayList) {
            String name = book.getName();
            if (name.equals(bookName)) {
                isExist = true;
                break;
            }
        }

        if (!isExist) {
            System.out.println("您要修改的书名:" + bookName + "在系统里不存在");
            Scanner scanner = new Scanner(System.in);

            login(bookMap);
             }
        }
    }

5、test层

5.1 Main类
package myBookManage.cn.edu.just.test;


import myBookManage.cn.edu.just.dataBase.Database;
import myBookManage.cn.edu.just.model.Book;
import myBookManage.cn.edu.just.service.MyBookManageService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Database database = new Database();
        MyBookManageService user = new MyBookManageService();

            HashMap<String, ArrayList<Book>> bookMap = database.initBookMap();

            //创建键盘录入对象
            Scanner scanner = new Scanner(System.in);

        int choice = user.menu(scanner,bookMap)-1;
        user.doOperation(choice, bookMap);//对图书进行相关的操作
        }
}

`

三、运行截图

1、查看所有书籍

在这里插入图片描述

2、添加书籍信息

情况一:新添加的书籍类型在数据集合bookMap中已存在,那么就直接将新书添加到对应类型的书籍List集合中

在这里插入图片描述
在这里插入图片描述

情況二:新添加的书籍类型在数据集合bookMap中不存在,那么需要新建键值对完成bookMap中的元素添加

在这里插入图片描述
在这里插入图片描述

3、修改书籍信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果要修改的书籍类型或书名不存在的情况下,直接进行提示操作

在这里插入图片描述
在这里插入图片描述

4、删除书籍信息

在这里插入图片描述
在这里插入图片描述

5、退出系统

在这里插入图片描述

6、借阅书籍

对于借阅图书只需要将图书信息中的布尔型变量isBorrowed变量变为true即可,首先还是要遍历ArrayList集合找到该书。

在这里插入图片描述

在这里插入图片描述

7、归还书籍

和借阅图书进行对比可知,借阅图书是将isBorrowed变量由false变为true,那么归还图书就是将isBorrowed变量由true变为false.
在这里插入图片描述
在这里插入图片描述

不使用接口及其实现类的另一版本:
Java图书管理系统(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值