基站系统

一,mysql和Qt做的基站系统

Linux 中函数 -》tcgettr函数得到当前终端

这个项目的精华在界面间专递数据显示 使用QStandardItemModel一个二级指针

1,在mymysql.h的头文件中声明

int sql_open(const char *SQL, QStandardItemModel **p);

2,mymysql.cc文件使用

  *p = new QStandardItemModel(rowcount, filecount);   //数据Model

3,mainwindow.cc文件中使用

 */
void MainWindow::script_msg(const char *SQL)
{

    int res = 0;
    // 判断执行那个函数
    if (strncmp(SQL, "SELECT", 6) ==0)
    {
        QStandardItemModel *model = NULL;
       res = db.sql_open(SQL, &model); //如果是SELECT,那么执行sql_open这个函数

       QTableView *view1 = new QTableView;
       view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
       mdiArea->addSubWindow(view1);
       view1->setStyleSheet("border-image: url(3.jpg);");  //设置widget背景图片
       view1->setModel(model);
       view1->show();
       mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);


    }
    else{
        res = db.sql_exec(SQL);
    }

    if (res == -1)
    {
        QMessageBox::information(this,"exec 执行失败", db.geterror());
    }else
    {
         QMessageBox::information(this,"exec 执行成功", db.geterror());
    }

}

2,下面是完整的代码

1.logindlg.h头文件

#ifndef LOGINDLG_H
#define LOGINDLG_H

#include <QDialog>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>

class loginDlg : public QDialog
{
    Q_OBJECT
public:
    explicit loginDlg(QWidget *parent = 0);

signals:

public slots:
private:
    QLabel *lable0, *lable1, *lable2, *lable3;
    //输入框
    QLineEdit *lineEditUserID, *lineEditPassWd, *lineEditDbName, *lineEditHostIP;


    QPushButton *loginBtn, *logoutBtn;

private slots:
    void    loginBtnOnclick();
    void    logoutBtnOnclick();
public:
    QString userid;
    QString passwd;
    QString dbname;
    QString hostip;
    bool islogin;

};

#endif // LOGINDLG_H

2,logindlg.cc实现

#include "logindlg.h"
#include <QDialog>
#include <QGridLayout>
#include <QPalette>
#include <QMessageBox>

loginDlg::loginDlg(QWidget *parent) :
    QDialog(parent)
{
    islogin = false;
    //文本
    lable0 = new QLabel;
    lable0->setText(tr("用户名"));

    lable1 = new QLabel;
    lable1->setText(tr("密码"));

    lable2 = new QLabel;
    lable2->setText(tr("数据库名称"));

    lable3 = new QLabel;
    lable3->setText(tr("服务器IP"));



    //输入框
    lineEditUserID = new QLineEdit;
    lineEditPassWd = new QLineEdit;
    lineEditPassWd->setEchoMode(QLineEdit::Password);  //设置为密码框
    lineEditDbName = new QLineEdit;
    lineEditHostIP = new QLineEdit;


    loginBtn = new QPushButton;
    logoutBtn = new QPushButton;
    loginBtn->setText("登录");
    logoutBtn->setText("取消");


    QGridLayout *layout = new QGridLayout(this);
    layout->addWidget(lable0, 0, 0);
    layout->addWidget(lineEditUserID, 0, 1);
    layout->addWidget(lable1, 1, 0);
    layout->addWidget(lineEditPassWd, 1, 1);
    layout->addWidget(lable2, 2, 0);
    layout->addWidget(lineEditDbName, 2, 1);
    layout->addWidget(lable3, 3, 0);
    layout->addWidget(lineEditHostIP, 3, 1);

    layout->addWidget(loginBtn, 4, 0);
    layout->addWidget(logoutBtn, 4, 1);

    //设置列
    /**
      -------------------
      |                   |
      |                   |
      |                   |
      |                   |
      |___________________|
      */
    layout->setColumnStretch(0, 1);
    layout->setColumnStretch(1, 1);

    //设置layout边框
    layout->setMargin(15);
    layout->setSpacing(10);  //设置layout控件间
      //设置对话框大小不可改变
    layout->setSizeConstraint(QLayout::SetFixedSize);  //设置对话框大小不可改变


    setWindowTitle("登录");
    //设置背景图片
    this->setAutoFillBackground(true);
    QPalette palette;
    //图片的
    palette.setBrush(QPalette::Background, QBrush(QPixmap("2.jpg")));
    setPalette(palette);

    connect(loginBtn, SIGNAL(clicked()), this, SLOT(loginBtnOnclick()));

    connect(logoutBtn, SIGNAL(clicked()), this, SLOT(logoutBtnOnclick()));

}


void loginDlg::loginBtnOnclick()
{
    userid = lineEditUserID->text();
    passwd = lineEditPassWd->text();
    dbname = lineEditDbName->text();
    hostip = lineEditHostIP->text();

    islogin = true;
    close();
}

void loginDlg::logoutBtnOnclick()
{
    close();
}




3,mymysql.h头文件

#ifndef MYMYSQL_H
#define MYMYSQL_H

#include <QStandardItemModel>

//window下的aip
#include <windows.h>
#include <C:/mysql/include/mysql.h>
//linux   mysql
//#include <mysql/mysql.h>



/**
 * 创建这个类的目的是实现封装,封装sql
 * @brief The mymysql class
 */
class mymysql
{
public:
    mymysql();
    ~mymysql();
    //错误sql信息
    const char *geterror();
    //serverIP地址,  用户名,密码,
    int sql_connect(const char *Hostname, const char *User, const char *password, const char *DBName);
    void sql_disconnet();
    int sql_exec(const char *SQL);
    int sql_open(const char *SQL, QStandardItemModel **p);
private:
    MYSQL *connection;
    MYSQL mysql;
    char buf[1024];  //error 信息
};

#endif // MYMYSQL_H

4,mymysql.cc文件

#include "mymysql.h"
#include <QMessageBox>
#include <windows.h>
#include <C:/mysql/include/mysql.h>
#include <string.h>

/**
 *封装mysql数据库  所有sql处理
 * @brief mymysql::mymysql
 */
mymysql::mymysql()
{
    mysql_init(&mysql); //mysql数据库初始化
    connection = NULL;

    memset(buf, 0, sizeof(buf));
}

mymysql::~mymysql()
{

}
/**
 *错误的信息
 * @brief mymysql::geterror
 * @return
 */
const char *mymysql::geterror()
{
    return buf;
}

/**
 *  链接mysql数据
 * @brief mymysql::sql_connect
 * @param Hostname
 * @param User
 * @param password
 * @param DBName
 * @return
 */
int mymysql::sql_connect(const char *Hostname, const char *User, const char *password, const char *DBName)
{
    connection = mysql_real_connect(&mysql, Hostname, User, password, DBName, 0, 0, 0);

    if (connection == NULL)
    {
        //清空buf
        memset(buf, 0, sizeof(buf));
        strcpy(buf, mysql_error(&mysql));
        QMessageBox::information(0 , "", mysql_error(&mysql));
        return -1;
    }
    else
    {
        return 0;
    }
}

/**
 * 判断链接
 * @brief mymysql::sql_disconnet
 */
void mymysql::sql_disconnet()
{
    if (connection)
    {
        mysql_close(connection);
        connection = NULL;
    }
}

/**
 *  查询语句
 * @brief mymysql::sql_exec
 * @param SQL
 */
int mymysql::sql_exec(const char *SQL)
{
    if (mysql_query(connection, SQL) != 0)
    {
        //清空buf
        memset(buf, 0, sizeof(buf));
        strcpy(buf, mysql_error(&mysql));
        return -1;
    }
    else
    {
        //设置编码格式
        mysql_query(connection, "set names utf8");
        return 0;
    }
}

/**
 * 数据库查询
 * @brief mymysql::sql_open
 * @param SQL
 * @return
 */
int mymysql::sql_open(const char *SQL,  QStandardItemModel **p)
{
    if (mysql_query(connection, SQL) != 0)
    {
        //清空buf
        memset(buf, 0, sizeof(buf));
        strcpy(buf, mysql_error(&mysql));
        return -1;
    }
    else
    {
        //设置编码格式
        mysql_query(connection, "set names utf8");

        MYSQL_RES *result = mysql_store_result(connection);

        if (result == NULL)
        {
            //没有查询结果
            //清空buf
            memset(buf, 0, sizeof(buf));
            strcpy(buf, mysql_error(&mysql));
            return -1;
        }

            //mysql 提供一个函数
        int rowcount = mysql_affected_rows(connection);  //多少行
        int filecount = mysql_field_count(connection); //这个函数SQL语句有的多少列
            MYSQL_FIELD *field;
        *p = new QStandardItemModel(rowcount, filecount);   //数据Model
            int i = 0;
            int j = 0;
            for (i = 0; i < filecount; i++)
            {
                field = mysql_fetch_field(result);
                //if (field == NULL)   //如果读到最后循环退出
                //{
                    break;
                //}
                //QMessageBox::information(0, "",field->name);
                (*p)->setHeaderData(i, Qt::Horizontal, field->name);
            }


            for(i = 0; i < rowcount; i++)  //得到循环遍历每一行
            {
                MYSQL_ROW row = mysql_fetch_row(result);
                for(j = 0; j < filecount; j++)
                {
                       // QMessageBox::information(0, "",row[j]);
                    (*p)->setData((*p)->index(i, j, QModelIndex()), row[j]); //数据
                }

            }

            mysql_free_result(result);//释放mysql_stre_resut内存
        return 0;
    }
}

5,scriptdlg.h头文件

#ifndef SCRIPTDLG_H
#define SCRIPTDLG_H

#include <QDialog>
#include <QLabel>
#include <QTextEdit>
#include <QPushButton>

class scriptDlg : public QDialog
{
    Q_OBJECT
public:
    explicit scriptDlg(QWidget *parent = 0);
    QString SQL; //sql 查询语句
    bool islogin;

signals:
public slots:
    void okBtnOnclick();
    void cancelBtnOnclick();
private:
    QLabel *label0;
    QTextEdit *textEditSQL;

    QPushButton *okBtn;
    QPushButton *cancelBtn;


};

#endif // SCRIPTDLG_H

6,scriptdlg.cc 文件

#include "scriptdlg.h"
#include <QGridLayout>
#include <QHBoxLayout>


scriptDlg::scriptDlg(QWidget *parent) :
    QDialog(parent)
{
    islogin = false;
    label0 = new QLabel;
    label0->setText("请输入SQL");
    textEditSQL = new QTextEdit;

    okBtn = new QPushButton;
    okBtn->setText("执行");

    cancelBtn = new QPushButton;
    cancelBtn->setText("取消");


    QGridLayout *layout1 = new QGridLayout(this);
    layout1->addWidget(label0, 0, 0);
    layout1->addWidget(textEditSQL,0, 1);


    QHBoxLayout *layout2 = new QHBoxLayout;  //这个layout是要放到第一的layout中
    layout2->addWidget(okBtn);
    layout2->addWidget(cancelBtn);

    layout1->addLayout(layout2, 1, 1);

    connect(okBtn, SIGNAL(clicked()), this, SLOT(okBtnOnclick()) );
    connect(cancelBtn, SIGNAL(clicked()), this, SLOT(cancelBtnOnclick()));
}

/**

  * sql 是否查询按
 * @brief scriptDlg::okBtnOnclick
 */
void scriptDlg::okBtnOnclick()
{
    //TextEdit得到用户输入的字符
    SQL = textEditSQL->toPlainText(); //没有的
    islogin = true;
    close();
}

void scriptDlg::cancelBtnOnclick()
{
    close();
}


7,mainwindow.h头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMenu>    //菜单
#include <QMenuBar>  //事件
#include <QAction>   //
#include <QMdiArea>
#include "mymysql.h"

#include <QCloseEvent>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    //是否退出
    void closeEvent(QCloseEvent *event);

private:

    mymysql db;
    //view
    void showview();

    //显示一个子窗口
    void showsub();

    //
    void createMenus();

    //
    void createAction();

    //四个菜单
    QMenu *adminMenu;
    QMenu *dataMenu; //数据
    QMenu *windowMenu;
    QMenu *helpMenu;

    QAction *loginAction;
    QAction *logoutAction;
    QAction *exitAction;  //退出

    QAction *scriptAction;


    QAction *cascadeAction;
    QAction *tileAction;

    QAction *helpAction;
    QAction *aboutAction;
    //主界面背景
    QMdiArea *mdiArea;



private slots:
    void on_login();
    void on_logout();
    void on_exit();
    void on_script();
    void on_help();
    void on_about();

    void script_msg(const char *SQL);

    void cascadeSubWindow();
    void tileSubWindows();

};

#endif // MAINWINDOW_H

8,mainwindow.cc 文件

#include "mainwindow.h"
#include <QMenu>    //菜单
#include <QMenuBar>  //事件
#include <QAction>   //
#include <QMdiSubWindow>
#include "logindlg.h"
#include <QIcon>
#include <QStandardItemModel>
#include <QTableView>
#include "scriptdlg.h"
#include "mymysql.h"

#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->setWindowTitle("CDMA无线基站管理系统");

    setWindowIcon(QIcon("main.png"));


    //主界面的设置
    mdiArea = new QMdiArea;
    setCentralWidget(mdiArea);

    //设置背景
    mdiArea->setBackground(Qt::NoBrush);
    mdiArea->setStyleSheet("background-image: url(1.jpg);");  //背景设置
    //mdiArea->setStyleSheet("border-image: url(1.jpg)");

    //当子窗口的范围父推动
    mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    //添加登录按键
    createAction();
    //调用
    createMenus();

    //改变文件的主窗口大小main函数中的改
}

MainWindow::~MainWindow()
{

}

/**
 *是否退出 closeEvent 函数是在widget退出之前被调用的
 * @brief MainWindow::CloseEvent
 * @param event
 */
void MainWindow::closeEvent(QCloseEvent *event)
{
    //通过question返回值得
    QMessageBox::StandardButton button ;
    button = QMessageBox::question(this, "提示", "是否退出程序", QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes)
    {
        //接受退出
        event->accept();
    }
    else
    {
        //不接受退出
        event->ignore();
    }

    /*
    event->accept();  //接受退出
    event->ignore();  //不接受退出
    QMessageBox::information(this, "","QCloseEvent" );*/
}

/**
 *显示数据
 * @brief MainWindow::showview
 */
void MainWindow::showview()
{
    QStandardItemModel *model = new QStandardItemModel(5, 3);

    // 行的表头
    model->setHeaderData(0, Qt::Horizontal, "姓名");
    model->setHeaderData(1, Qt::Horizontal, "性别");
    model->setHeaderData(2, Qt::Horizontal, "年龄");

    //显示数据的model
    model->setData(model->index(0, 0, QModelIndex()), "张三");
    model->setData(model->index(0, 1, QModelIndex()), "男");
    model->setData(model->index(0, 2, QModelIndex()), "22");

    model->setData(model->index(1, 0, QModelIndex()), "王蓉");
    model->setData(model->index(1, 1, QModelIndex()), "女");
    model->setData(model->index(1, 2, QModelIndex()), "22");

    model->setData(model->index(2, 0, QModelIndex()), "陈丽");
    model->setData(model->index(2, 1, QModelIndex()), "女");
    model->setData(model->index(2, 2, QModelIndex()), "22");


    QTableView *view1 = new QTableView;
    view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
    mdiArea->addSubWindow(view1);
    view1->setStyleSheet("border-image: url(3.jpg);");  //设置widget背景图片
    view1->setModel(model);
    view1->show();
    mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);

}

/**
 * 子窗口
 * @brief MainWindow::showsub
 */
void MainWindow::showsub()
{
    QWidget *w = new QWidget;
    w->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
    mdiArea->addSubWindow(w);
    w->setWindowTitle("SDDFDJKF");
    w->setStyleSheet("border-image: url(3.jpg);");  //设置widget背景图片
    w->show();

    //mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);  // 设置widget窗口大小
    mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);
}

/**
 *  添加菜单
 * @brief createMenus
 */
void MainWindow::createMenus()
{
   adminMenu = this->menuBar()->addMenu(tr("管理"));
   //添加登录
   adminMenu->addAction(loginAction);

   //添加注销
   adminMenu->addAction(logoutAction);


    //添加分隔符
   adminMenu->addSeparator();

   //退出
   adminMenu->addAction(exitAction);


    dataMenu = this->menuBar()->addMenu(tr("数据"));
    dataMenu->addAction(scriptAction);


    windowMenu = this->menuBar()->addMenu(tr("窗口"));
    windowMenu->addAction(cascadeAction);
    //添加分隔符
    windowMenu->addSeparator();
    windowMenu->addAction(tileAction);

    //菜单
    helpMenu = this->menuBar()->addMenu(tr("帮助"));
    helpMenu->addAction(helpAction);
    helpMenu->addSeparator();
    helpMenu->addAction(aboutAction);
}

/**
 *登录菜单
 * @brief MainWindow::createAction
 */
void MainWindow::createAction()
{
    //登录菜单  快捷键 Ctrl+u
    loginAction = new QAction(tr("登录"), this);
    loginAction->setShortcut(tr("Ctrl+u"));


    //关联
    connect(loginAction, SIGNAL(triggered()), this, SLOT(on_login()));


    //注销 快捷键 Ctrl+b
    logoutAction = new QAction(tr("注销"), this);
    logoutAction->setShortcut(tr("Ctrl+b"));


    //关联
    connect(logoutAction, SIGNAL(triggered()), this, SLOT(on_logout()));

    //退出 快捷键 Ctrl+w
    exitAction = new QAction(tr("退出"), this);
    exitAction->setShortcut(tr("Ctrl+w"));


    //关联
    connect(exitAction, SIGNAL(triggered()), this, SLOT(on_exit()));


    scriptAction = new QAction(tr("执行脚本"), this);
    scriptAction->setShortcut(tr("Ctrl+p"));
    scriptAction->setEnabled(false);  //设置不好好用
    connect(scriptAction, SIGNAL(triggered()), this, SLOT(on_script()));


    //窗口
    cascadeAction = new QAction(tr("层叠"), this);
    cascadeAction->setShortcut(tr("Ctrl+Q"));
    connect(cascadeAction, SIGNAL(triggered()), this, SLOT(cascadeSubWindow()));

    tileAction = new QAction(tr("并列"), this);
    tileAction->setShortcut(tr("Ctrl+R"));
    connect(tileAction, SIGNAL(triggered()), this, SLOT(tileSubWindows()));

    //帮助
    helpAction = new QAction(tr("帮助"), this);
    helpAction->setShortcut(tr("Ctrl+s"));
    connect(helpAction, SIGNAL(triggered()), this, SLOT(on_help()));

    aboutAction = new QAction(tr("关于"), this);
    aboutAction->setShortcut(tr("Ctrl+T"));
    connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_about()));



}


/**
 * login
 * @brief MainWindow::on_login
 */
void MainWindow::on_login()
{
    loginDlg dlg; //将对话实例化
    dlg.exec(); // 模式对话框
    //QMessageBox::information(this, "", "hello World!!!!!!");

    //链接服务器和拿到mysql用户名和密码等信息判断
    int res = db.sql_connect(dlg.hostip.toStdString().data(),
                             dlg.userid.toStdString().data(),
                             dlg.passwd.toStdString().data(),
                             dlg.dbname.toStdString().data());

    if (res == -1)
    {
        QMessageBox::information(this, "登录失败", db.geterror());

    }
    else
    {
        QMessageBox::information(this, "登录成功", db.geterror());
        scriptAction->setEnabled(true);  //设置可以用
    }

    /*
    if (dlg.islogin)
    {
        if (dlg.userid == "chensong" && dlg.passwd == "123456")
        {
            QMessageBox::information(this, "", "登录成功!!!");
        }
        else
        {
            QMessageBox::information(this, "",  "登录失败!!");
        }
    }
    */

}

/**
 *  注销
 * @brief MainWindow::on_logout
 */
void MainWindow::on_logout()
{
    //通过question返回值得
    QMessageBox::StandardButton button ;
    button = QMessageBox::question(this, "提示", "是否注销程序",
                                   QMessageBox::Yes | QMessageBox::No);

    if (button == QMessageBox::Yes)
    {
        db.sql_disconnet();
        scriptAction->setDisabled(false);
    }



    QMessageBox::information(this, "","注销" );
}

/**
 *退出
 * @brief MainWindow::on_exit
 */
void MainWindow::on_exit()
{
    close();
}

/**
 *   执行脚本
 * @brief MainWindow::on_script
 */
void MainWindow::on_script()
{
    /*
   if (  db.sql_exec("delete from table3 where where teacher = '老师'") == -1)
   {
       QMessageBox::information(this,"exec 执行失败", db.geterror());
   }
   else
   {
        QMessageBox::information(this,"exec 执行成功", db.geterror());
   }*/
    scriptDlg dlg;
    dlg.exec();
    // 判断是否成功输入的
    if (dlg.islogin)
    {
         script_msg(dlg.SQL.toStdString().data());
    }
    //showview();
}

void MainWindow::on_help()
{
    QMessageBox::information(this, "帮助", "自学C/C++");
}

void MainWindow::on_about()
{
    QMessageBox::about(this, "关于", "版权所有, 盗版@@@@");
}

/**
 *
 * @brief MainWindow::script_msg
 * @param SQL
 */
void MainWindow::script_msg(const char *SQL)
{

    int res = 0;
    // 判断执行那个函数
    if (strncmp(SQL, "SELECT", 6) ==0)
    {
        QStandardItemModel *model = NULL;
       res = db.sql_open(SQL, &model); //如果是SELECT,那么执行sql_open这个函数

       QTableView *view1 = new QTableView;
       view1->setAttribute(Qt::WA_DeleteOnClose); //代表关闭自动这个widget的时候 自动这个webget 释放
       mdiArea->addSubWindow(view1);
       view1->setStyleSheet("border-image: url(3.jpg);");  //设置widget背景图片
       view1->setModel(model);
       view1->show();
       mdiArea->activeSubWindow()->resize(width() - 100, height() - 100);


    }
    else{
        res = db.sql_exec(SQL);
    }

    if (res == -1)
    {
        QMessageBox::information(this,"exec 执行失败", db.geterror());
    }else
    {
         QMessageBox::information(this,"exec 执行成功", db.geterror());
    }

}

/**
 *层叠子窗口
 * @brief MainWindow::cascadeSubWindow
 */
void MainWindow::cascadeSubWindow()
{
    mdiArea->cascadeSubWindows();
}

/**
 *并列子窗口
 * @brief MainWindow::tileSubWindows
 */
void MainWindow::tileSubWindows()
{
    mdiArea->tileSubWindows();
}

main.cc文件

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    //改变窗口的大小
    w.resize(700, 500);

    w.show();

    return a.exec();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值