linux中mysql回滚重演_README.md

Centos7运维部署

=====================

# 1.更新系统

- `yum -y update`

升级所有包同时也升级软件和系统内核

- `yum -y upgrade`

只升级所有包,不升级软件和系统内核

#### 实验分别测试 yum -y upgrade和yum -y update

##### 升级前

系统版本 | centos5.5

----|------

内核版本 | 2.6.18-194.el5

升级前做过简单配置文件修改

##### yum -y upgrade 升级后

系统版本 | centos5.7

----|------

内核版本 | 2.6.18-194.el5

##### yum -y update 升级后

系统版本 | centos5.7

----|------

内核版本 | 2.6.18-238.el5

# 2.配置vim编辑器

### 设置 Vim编辑环境 配置 有两种方式:

- 1.是在`/etc/vimrc` 进行设置,这种设置方法会作用与所有登录到`Linux环境`下的用户。不建议使用。

- 2.在用户登录的 `~ `目录下创建一个` .vimrc`文件,在其中进行自己习惯的编程环境的设置,这样当别的用户使用实并不互相影响。

具体方法:

在文件中输入:

```

set nu // 这是设置显示行号

set showmode //设置在命令行界面最下面显示当前模式等。

set ruler // 在右下角显示光标所在的行数等信息

set autoindent // 设置每次单击Enter键后,光标移动到下一行时与上一行的起始字符对齐

syntax on // 即设置语法检测,当编辑C或者Shell脚本时,关键字会用特殊颜色显示

...

```

# 3.防火墙设置

### CentOS7默认的防火墙不是iptables,而是firewalle.

### 安装iptable iptable-service

- 1.先检查是否安装了iptables

`service iptables status`

- 2.安装iptables

`yum install -y iptables`

- 3.升级iptables

`yum update iptables`

- 4.安装iptables-services

`yum install iptables-services`

### 禁用/停止自带的firewalld服务

- 1.停止firewalld服务

`systemctl stop firewalld`

- 2.禁用firewalld服务

`systemctl mask firewalld`

### 设置规则

- 1.查看iptables现有规则

`iptables -L -n`

- 2.先允许所有,不然有可能会杯具

`iptables -P INPUT ACCEPT`

- 3清空所有默认规则

`iptables -F`

- 4清空所有自定义规则

`iptables -X`

- 5所有计数器归0

`iptables -Z`

- 6保存上述规则

`service iptables save`

### 开启iptables服务

```

注册iptables服务

相当于以前的chkconfig iptables on

systemctl enable iptables.service

开启服务

systemctl start iptables.service

查看状态

systemctl status iptables.service

```

### 解决vsftpd在iptables开启后,无法使用被动模式的问题

1.首先在/etc/sysconfig/iptables-config中修改或者添加以下内容

#### 添加以下内容,注意顺序不能调换

```

IPTABLES_MODULES="ip_conntrack_ftp"

IPTABLES_MODULES="ip_nat_ftp"

```

#### 重新设置iptables设置

`iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT`

### 命令行配置

~~~

#!/bin/bash

iptables -P INPUT ACCEPT

iptables -F

iptables -X

iptables -Z

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

service iptables save

systemctl restart iptables.service

~~~

备注:存放目录`/etc/sysconfig/iptables`

### 编辑配置

vim /etc/sysconfig/iptables

```

# Generated by iptables-save v1.4.7 on Sat Mar 18 11:09:29 2017

*filter

:INPUT DROP [0:0]

:FORWARD DROP [0:0]

:OUTPUT ACCEPT [10:1080]

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT

-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

COMMIT

# Completed on Sat Mar 18 11:09:29 2017

```

# 4.解压命名

~~~

(1)、*.tar 用 tar –xvf 解压

(2)、*.gz 用 gzip -d或者gunzip 解压

(3)、*.tar.gz和*.tgz 用 tar –xzf 解压

(4)、*.bz2 用 bzip2 -d或者用bunzip2 解压

(5)、*.tar.bz2用tar –xjf 解压

(6)、*.Z 用 uncompress 解压

(7)、*.tar.Z 用tar –xZf 解压

(8)、*.rar 用 unrar e解压

(9)、*.zip 用 unzip 解压

~~~

```

yum install zip unzip

```

# 5.传输文件

### 自定义scp命令

- `./scp.exp ``./local_file` `user@host:/xx/yy/`

- 编辑`vim scp.exp`替换12行中set passwd `123456`

- 需要先安装 `expect`,

### Zmodem传输

```

yum -y install lrzsz

```

### sftp命令

sftp 是一个交互式文件传输程式。它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性。

- 1.常用登陆方式:

```

格式:sftp @

通过sftp连接,端口为默认的22,指定用户。

```

- 2.查看sftp支持的命令

```

使用help命令,查看支持的命令,如:

sftp>help

(其中命令前面有“l”表示本地执行,其他表示在所登录的远程主机上面执行)

```

- 3.基本的使用

```

sftp主要是用来传输文件的,包括上传文件(从本机到远程主机) ,下载文件(从远程主机到本机)。

(1)文件下载

get [-Ppr] remote [local]

如:get test.cpp ./Project/

将远程当前目录下的文件test.cpp下载到本地当前目录的Project文件夹中。

(2)文件上传

put [-Ppr] local [remote]

如:put /home/liu/Software/helloworld.c /root/blog/

将本地/home/liu/Software/目录下的ios文件传送到远程登陆主机的/root/blog/目录下。

(3)其他命令

可以使用命令还是有几个的,如ls、lls;cd、lcd;pwd、lpwd等。具体查看help输出吧。

```

# 6.数据库mysql操作

### 安装mysql

Here is your custom MariaDB YUM repository entry for CentOS. Copy and paste it into a file under `/etc/yum.repos.d/ `(we suggest naming the file `MariaDB.repo` or something similar).

```

# MariaDB 10.1 CentOS repository list - created 2017-03-08 06:38 UTC

# http://downloads.mariadb.org/mariadb/repositories/

[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/10.1/centos7-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

```

After the file is in place, install MariaDB with:

```

sudo yum install MariaDB-server MariaDB-client

```

### 配置msyql

#### 修改本地root用户密码,并开放root远程访问权限

- `set password for root@localhost = password('123456');`

- `grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;`

- `FLUSH PRIVILEGES;`

```

# systemctl start mariadb

# systemctl enable mariadb

# systemctl status mariadb

```

# 7.设置固定IP

参考链接地址:

# 8.配置Java开发环境

* 1.压缩jdk目录并上传`jdk.zip`文件到服务器`/root`目录,必须为`/root`

* 2.解压:`unzip jdk.zip `

* 3.跳入jdk目录:`cd jdk`

* 4.添加权限:`chmod +x AutoInstallJDK.sh`

* 5.执行配置文件:`./AutoInstallJDK.sh`

# 9.配置tomcat

* 1.压缩tomcat目录并上传`tomcat.zip`文件到服务器`/root`目录,必须为`/root`

* 2.解压:`unzip tomcat.zip `

* 3.跳入jdk目录:`cd tomcat`

* 4.添加权限:`chmod +x *.sh`

* 5.执行配置文件:`./AutoInstallTomcat.sh`

### 实际热部署

* 一键发布命令格式:`./deploy.sh 项目war包` 其中`项目war包`实际存放目录,具体无限制

##### 参考例子:

```

cd /usr/local/tomcat/bin

./deploy.sh /root/test.war # 一般我们上传到root下

```

说明:deploy.sh会先清空tomcat下的ROOT目录,再将指定的war包加压至ROOT目录,最后执行restart.sh重启tomcat。

* 一键需重启命令:`./restart.sh` 或 `./restart.sh -v` (参数-v表示启动时打印tomcat启动日志)

##### 参考例子:

```

cd /usr/local/tomcat/bin

./restart.sh

```

说明:restart.sh是用来重启tomcat的,如果tomcat没有启动则直接启动,如果已经启动就先shutdown再启动,如果shutdown之后3s没有停掉tomcat进程,则kill掉原来的进程再启动。

#### 解决tomcat启动慢

```

1.在Tomcat环境中解决

可以通过配置JRE使用非阻塞的Entropy Source。

在catalina.sh中加入这么一行:-Djava.security.egd=file:/dev/./urandom 即可。

2.在JVM环境中解决(*实测,真实好使)

打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容:

securerandom.source=file:/dev/urandom

替换成

securerandom.source=file:/dev/./urandom

```

# 10.忘记密码找回

### linux单用户找回

```

第一步:

1.开机启动按e进入CRGB引导界面

2.选择kernel行,按e键,回车

3.光标移动最后,输入1

4.按b键盘引导系统

第二步:

1.执行passwd命令,重新设置密码

```

### mysql管理员密码

```

1.vim /etc/mysql.cnf

添加skip-grant-tables

2.启动mysql并修改密码

3.修改完毕注释mysql.cnf 添加skip-grant-tables

```

# 11.Git操作指南

![git](./images/0.jpeg)

## Git的基础图解

### Git 图解剖析

git中文件内容并没有真正存储在索引(.git/index)或者提交对象中,而是以blob的形式分别存储在数据库中(.git/objects),并用SHA-1值来校验。 索引文件用识别码列出相关的blob文件以及别的数据。对于提交来说,以树(tree)的形式存储,同样用对于的哈希值识别。树对应着工作目录中的文件夹,树中包含的 树或者blob对象对应着相应的子目录和文件。每次提交都存储下它的上一级树的识别码。

如果用detached HEAD提交,那么最后一次提交会被the reflog for HEAD引用。但是过一段时间就失效,最终被回收,与git commit --amend或者git rebase很像。

git 模型可以抽象为 远程仓库——remote, 本地三级仓库: level1——working directory level2——stage(index) level3——repository(History)

git 各个命令可以理解为在各个仓库间转移数据,各个命令对应对每个仓库输入输出。

![](./images/1.png)

便于记忆可以简单分为 低level输入和 高level输入, 注意各level并不一定是相邻的level间转移,可以跨level转移,通过git命令的参数选项来实现,

如常见的 git checkout git reset git commit

| | 低level输入 | 高level 输入 |

|:-------------|:-------------|:-----|

| working directory | 手工创建 | git checkout/git stash |

| stage(index) | git add | git reset |

| History(repository) | git commit | git pull |

| remote | git push | - |

根据上述表格,结合git命令各种参数的结合,可以数据在各仓库间的转移,

需要注意的是不论参数如何变化,, 除了git reset 外,上述各命令目的仓库按照如上表所示是确定的,参数和选项来决定数据的来源

## 基本用法

![](./images/2.jpg)

上面的四条命令在工作目录、暂存目录(也叫做索引)和仓库之间复制文件。

- git add files 把当前文件放入暂存区域。

- git commit 给暂存区域生成快照并提交。

- git reset -- files 用来撤销最后一次git add files,你也可以用git reset 撤销所有暂存区域文件。(操作对象是HEAD)

- git checkout -- files 把文件从暂存区域复制到工作目录,用来丢弃本地修改。(目的是working Directory)

你可以用 git reset -p, git checkout -p, or git add -p进入交互模式。

也可以跳过暂存区域直接从仓库取出文件或者直接提交代码, 如下

![](./images/3.jpg)

- git commit -a 相当于运行 git add 把所有当前目录下的文件加入暂存区域再运行。git commit.

- git commit files 进行一次包含最后一次提交加上工作目录中文件快照的提交。并且文件被添加到暂存区域。

- git checkout HEAD -- files 回滚到复制最后一次提交。

![](./images/4.jpg)

### diff

有许多种方法查看两次提交之间的变动。下面是一些示例。

本质上就是在前言中表述的4个level中任意指定2个仓库进行比较

![](./images/5.jpg)

### commit

提交时,git用暂存区域的文件创建一个新的提交,并把此时的节点设为父节点。然后把当前分支指向新的提交节点。下图中,当前分支是master。 在运行命令之前,master指向ed489,提交后,master指向新的节点f0cec并以ed489作为父节点

![](./images/6.jpg)

下图中,在master分支的祖父节点maint分支进行一次提交,生成了1800b。 这样,maint分支就不再是master分支的祖父节点。此时,合并 (或者 衍合) 是必须的。

![](./images/7.jpg)

如果想更改一次提交,使用 git commit --amend。git会使用与当前提交相同的父节点进行一次新提交,旧的提交会被取消

![](./images/8.jpg)

### checkout

checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支。

当给定某个文件名(或者打开-p选项,或者文件名和-p选项同时打开)时,git会从指定的提交中拷贝文件到暂存区域和工作目录。比如,git checkout HEAD~ foo.c会将提交节点HEAD~(即当前提交节点的父节点)中的foo.c复制到工作目录并且加到暂存区域中。(如果命令中没有指定提交节点,则会从暂存区域中拷贝内容。)

注意当前分支不会发生变化(HEAD指向原处)。

![](./images/9.jpg)

当不指定文件名,而是给出一个(本地)分支时,那么HEAD标识会移动到那个分支(也就是说,我们“切换”到那个分支了),然后暂存区域和工作目录中的内容会和HEAD对应的提交节点一致。新提交节点(下图中的a47c3)中的所有文件都会被复制(到暂存区域和工作目录中);只存在于老的提交节点(ed489)中的文件会被删除;不属于上述两者的文件会被忽略,不受影响。

![](./images/10.jpg)

如果既没有指定文件名,也没有指定分支名,而是一个标签、远程分支、SHA-1值或者是像master~3类似的东西,就得到一个匿名分支,称作detached HEAD(被分离的HEAD标识)。这样可以很方便地在历史版本之间互相切换。比如说你想要编译1.6.6.1版本的git,你可以运行git checkout v1.6.6.1(这是一个标签,而非分支名),编译,安装,然后切换回另一个分支,比如说git checkout master。然而,当提交操作涉及到“分离的HEAD”时,其行为会略有不同,详情见在下面。

![](./images/11.jpg)

### HEAD标识处于分离状态时的提交操作

当HEAD处于分离状态(不依附于任一分支)时,提交操作可以正常进行,但是不会更新任何已命名的分支。(你可以认为这是在更新一个匿名分支。)

![](./images/12.jpg)

一旦此后你切换到别的分支,比如说master,那么这个提交节点(可能)再也不会被引用到,然后就会被丢弃掉了。注意这个命令之后就不会有东西引用2eecb。

![](./images/13.jpg)

但是,如果你想保存这个状态,可以用命令git checkout -b name来创建一个新的分支。

![](./images/14.jpg)

* 另外, checkout还有还有如下使用

* 当执行 "git checkout ." 或者 "git checkout -- " 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

* 当执行 "git checkout HEAD ." 或者 "git checkout HEAD " 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改 动。

* git checkout -f =等价=> git checkout HEAD . 特别注意,当git checkout -f 不带任何的commit 和文件时,会彻底删除 index 和 working tree未提交内容。

### reset

reset命令把当前分支指向另一个位置,并且有选择的变动工作目录和索引。也用来在从历史仓库中复制文件到索引,而不动工作目录。

如果不给选项,那么当前分支指向到那个提交。如果用--hard选项,那么工作目录也更新,如果用--soft选项,那么都不变。

![](./images/15.jpg)

如果没有给出提交点的版本号,那么默认用HEAD。这样,分支指向不变,但是索引会回滚到最后一次提交,如果用--hard选项,工作目录也同样。(=== checkout )

![](./images/16.jpg)

如果给了文件名(或者 -p选项), 那么工作效果和带文件名的checkout差不多,除了索引被更新。

![](./images/17.jpg)

### merge

merge 命令把不同分支合并起来。合并前,索引必须和当前提交相同。如果另一个分支是当前提交的祖父节点,那么合并命令将什么也不做。 另一种情况是如果当前提交是另一个分支的祖父节点,就导致fast-forward合并。指向只是简单的移动,并生成一个新的提交

![](./images/18.jpg)

否则就是一次真正的合并。默认把当前提交(ed489 如下所示)和另一个提交(33104)以及他们的共同祖父节点(b325c)进行一次三方合并。

结果是先保存当前目录和索引,然后和父节点33104一起做一次新提交。

![](./images/19.jpg)

### cherry Pick

cherry-pick命令"复制"一个提交节点并在当前分支做一次完全一样的新提交。

![](./images/20.jpg)

### rebase

衍合是合并命令的另一种选择。合并把两个父分支合并进行一次提交,提交历史不是线性的。衍合在当前分支上重演另一个分支的历史,提交历史是线性的。

本质上,这是线性化的自动的cherry-pick

![](./images/21.jpg)

上面的命令都在topic分支中进行,而不是master分支,在master分支上重演,并且把分支指向新的节点。注意旧提交没有被引用,将被回收。

要限制回滚范围,使用--onto选项。下面的命令在master分支上重演当前分支从169a6以来的最近几个提交,即2c33a。

![](./images/22.jpg)

### git-fsck --lost-found (file system check) 找回丢失的对象

Verifies the connectivity and validity of the objects in the database

[找回丢失的对象]( http://gitbook.liuhui998.com/5_9.html)

### git reflog : 分支等引用变更记录管理

[Git reflog 机制](http://geeklu.com/2013/04/git-reflog)

# 安装DNS服务器

```

yum install bind-chroot bind -y

```

[DNS配置教程](http://blog.csdn.net/K_Zombie/article/details/50593743)

[DNS配置详细介绍](http://www.funet8.com/2282.html)

[bind-namedmanager安装说明](https://github.com/jethrocarr/namedmanager/wiki/Installation-Integration-Bind)

[namemanager安装指南](http://skypegnu1.blog.51cto.com/8991766/1751511/)

添加防火墙规则

vim /etc/sysconfig/iptables

```

-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT

```

修改用户属组

`chgrp users test.log`

# 配置nginx

[nginx配置详解](http://www.cnblogs.com/fanzhidongyzby/p/5194895.html)

```

server {

listen80;

server_name 192.168.0.18;

#access_log /var/log/nginx/pro.log;

location / {

proxy_pass http://127.0.0.1:8000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /static/ {

autoindex on;

alias /root/webapps/pro/static/;

}

error_page 500 502 503 504/50x.html;

location = /50x.html {

root html;

}

}

```

# 配置apache

局域网中无法访问到我的apache服务器,提示 `Forbidden You don’t have permission to access / on this server.`

解决办法 :

```

httpd.conf 下

AllowOverride none

#Require all denied //备注或去掉该段代码 拒绝所有请求

DocumentRoot "D:/wamp3/www"

Options +Indexes +FollowSymLinks

AllowOverride all

#Require local //关键 本地请求要去掉

```

其实就是 去掉 Require all denied 和 Require local

# 配置namedmanager整理

1.临时关闭selinux

`#setsebool -P httpd_can_network_connect 1`

2.改变文件数组

```

#chgrp named named.conf

#chown named:named /var/named/chroot/etc/named.namedmanager.conf

```

3.开起服务

`#systemctl restart named.service`

4.开机自启动

`#systemctl enable iptables.service`

5.查看hostname

```

#hostname

localhost.localdomain

```

6.下载bind时更新yum源

```

cd /etc/yum.repos.d/

# wget http://repos.amberdms.com/config/centos/6/amberdms-c6-public.repo

# wget https://repos.jethrocarr.com/config/centos/7/jethrocarr-c7-public.repo

# yum makecache

# yum -y install namedmanager-www namedmanager-bind bind-*

# yum -y install mysql mysql-server mysql-devel httpd php php-mysql

```

7.编辑:`/etc/namedmanager/config.php `

`#vim /etc/namedmanager/config-bind.php`

8.执行数据库

`#cd /usr/share/namedmanager/resources/`

`#./autoinstall.pl`

9.建立硬链接

`#ln /etc/named.namedmanager.conf   /var/named/chroot/etc/named.namedmanager.conf`

10.开启定时日志并开机自启动

```

#/etc/init.d/namedmanager_logpush restart

#chkconfig --level 345 namedmanager_logpush on

```

11.设置httpd远程权限

否则出现:You don't have permission to access /namedmanager on this server.

```

#vim /etc/httpd/conf/http.conf

AllowOverride none

#Require all denied //备注或去掉该段代码 拒绝所有请求

DocumentRoot "D:/wamp3/www"

Options +Indexes +FollowSymLinks

AllowOverride all

#Require local //关键 本地请求要去掉

```

其实就是 去掉 `Require all denied` 和 `Require local`

12.配置namedmanager的web后执行检测

`php -q /usr/share/namedmanager/bind/namedmanager_bind_configwriter.php`

13.添加防火墙规则:`#vim /etc/sysconfig/iptables`

```

-A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 953 -j ACCEPT

```

14.CentOS 7 安裝 Nginx、PHP7、PHP-FPM

[CentOS 7 安裝 Nginx、PHP7、PHP-FPM](http://www.tuicool.com/articles/Yn6bAnn)

`yum -y install php70w-fpm php70w-cli php70w-gd php70w-mcrypt php70w-mysql php70w-pear php70w-xml php70w-mbstring php70w-pdo php70w-json php70w-pecl-apcu php70w-pecl-apcu-devel`

一键复制

编辑

Web IDE

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值