java大数据Linux环境搭建与Linux学习笔记一条龙

4 篇文章 0 订阅
3 篇文章 0 订阅

目录

安装VMware

安装CentOS

下载地址

具体安装

配置虚拟机系统

正式安装系统

虚拟机与主机之间的通信

bridged (桥接方式 , 默认使用vmnet0虚拟网卡)

net (网络地址转换模式 , 默认使用vmnet8虚拟网卡)

使用host-only方式,也就是仅主机模式(使用的)

Linux命令

Linux目录结构与用户概念

文件与文件夹操作

Linux用户与组的操作

Linux权限的操作与概念

shell脚本


安装VMware

我们要学习大数据必须要用到集群环境,那么个人如何搞集群呢,最简单就是安装虚拟机,我们使用VMware来安装我们的Linux集群

「VMware-workstation-full-15.5.2-15785246.exe」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载,极速在线查看享用。 链接:阿里云盘分享https://www.aliyundrive.com/s/Gq37w4FqCii

下载安装包,下一步下一步就行,需要在网上找到破解的秘钥,

安装CentOS

下载地址

「CentOS环境」,点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载,极速在线查看享用。 链接:阿里云盘分享https://www.aliyundrive.com/s/NvD54inAJHe

根据如下链接选择下载6.5或7.0的版本 下载好了镜像文件,我门着手可以安装CentOS了

具体安装

  1. 进入VMwear,选择新建虚拟机

  2. 选择自定义安装

  3. 选择稍后安装操作系统

  4. 选择CentOS的对应版本

  5. 配置虚拟机的文件在你的磁盘那个位置

  6. 选择CPU的核心数

  7. 选择虚拟机的内存

  8. 切记,网络类型要选择仅主机模式

  9. 之后一直默认下一步就可以

至此位置我们我们创建好了虚拟机的硬件,但是我们还有选他的系统是什么,所以我们还需要配置一下

配置虚拟机系统

  1. 双击CD来选择我们的IOS镜像文件

  2. 选择使用ISO文件,在磁盘指定我们的文件位置

  3. 开启虚拟机

正式安装系统

  1. 选择第一个

  2. 选择Skip跳过

  3. 下一步 选择英文然后下一步

  4. 选择基础的存储设备

  5. 选择不保存任何数据

  6. 下一步选择默认主机名

  7. 选择时区,只可以选择上海,没有北京

  8. 设置root密码,一定要记住,否则重开吧

  9. 选择桌面版安装,desktop

  10. 然后重启,继续,会让你同一一个协议,不同意会报错

  11. 然后下一步需要我们设置用户的名称与密码,选择forward会出现一个弹窗,选择yes就好

  12. 然后一直下一步就安装成功啦

虚拟机与主机之间的通信

vmware虚拟机下的三种上网方式bridged,nat,host-only

bridged (桥接方式 , 默认使用vmnet0虚拟网卡)

选择这种模式,虚拟机等同于网络内的一台物理主机,可对手动设置IP,子网掩码,DNS,且IP地址要和主机的IP在同一网段内。这样,虚拟机就和主机如同连在一个HUB上的两台计算机,只要主机能上网,虚拟机也会在这种模式下上网。但是这种方式如果主机的ip变化的话虚拟机就会上不了网,所以不推荐这种做法

net (网络地址转换模式 , 默认使用vmnet8虚拟网卡)

选择NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网,NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。但是我们大数据需要任何端到任何端都可以轻松访问,所以也不用这个

使用host-only方式,也就是仅主机模式(使用的)

选择host-only模式,所有的虚拟系统是可以相互通信的,但虚拟系统和真实的网络是被隔离开的,。同时,虚拟系统和宿主机是可以相互通信的。也就是说,主机与虚拟机中间被VMware阻隔,主机要先与VMware通信,然后在跟虚拟机通信,、

将Windows上的虚拟网卡改成跟Linux上的网卡在同一网段,注意:一定要将widonws上的WMnet1的IP设置和你的虚拟机在同一网段,但是IP不能相同且不能超出IP范围255值。

配置主机与VMware与虚拟机链接

  1. 首先我们将主机的防火墙关闭

  2. 打开网络链接界面

  3. 在主机可以访问网络的网卡上右击选择属性,选择共享

  4. 将允许..这一项打钩

  5. 在VMnet1右击属性,在ipv4的网络上查看自动配置好的ip,这个ip就是VMware的ip,到现在我们做好了主机与VMwear的链接

  6. 接下来需要配置虚拟机上的网络链接,需要与VMwear在同一网段上,

    1. 使用命令方式修改,命令修改后需要重启网卡服务

       临时修改IP地址:
       # ifconfig eth0 192.168.137.3
       永久修改ip地址
       #vi /etc/sysconfig/network-scripts/ifcfg-eth0
       重启网卡服务
       # service network restart 
    2. 图形方式修改ip

      右击右上角两个小电脑,选择editContents进入如下页面

      点击edi选择ipv4,在选择method为manual,使用手动模式设置ip,ip的网段与VMwear相同,但是网关与dns服务都必须是VMwear的ip

  7. 关闭虚拟机的防火墙

     查看 linux 防火墙状态:
     # chkconfig iptables --list 
     // 使用系统用户:root  命令: su root 
     ​
     #临时关闭防火墙服务:
     # service iptables stop
     #开启防火墙服务:
     #service iptables start;
     ​
     2: 永久关闭防火墙:
     # chkconfig iptables off 
     开启防火墙:
     #chkconfig iptables on 
    
  8. 至此,虚拟机就可以使用主机的网络了,用主机ping虚拟机也可以同,反过来也是可以的

设置虚拟机IP的别名(主机名与IP解析)

主机名与ip进行绑定,ping主机名就相当于ping这个ip了,我们做集群需要配置

修改主机名

 # vi /etc/sysconfig/network
 -进行主机名的修改
  Hostname=jy1611b

vi编辑器简单使用

     #vi   #vim   创建和修改文档的命令
      #a  #i 进入到编辑模式
      #Esc 退出编辑模式
      #:wq 保存退出
      #:q!   不保存退出 

进入配置文件将主机IP与名称绑定

   # vi  /etc/hosts
   ip                     名称+com         名称
   192.168.137.4         jy1611b.com      jy1611b
 这样配置只有Linux自己可以访问

Windows上匹配IP与名称

修改windows 的主机映射

   C:/windows/system32/drivers/etc/hosts
   192.168.137.4     jy1611b.com   jy1611b

Linux命令

Linux目录结构与用户概念

在linux中,拥有两种用户: 
         1:超级管理员: root
        [root@linux1 /]#    

[用户 @ 主机名  当前目录   ]# 管理员命令行
         2: 普通管理员: 我们安装时创建的管理员
         user1@localhost DespTop $
        user1@hadoop etc]$ 
         $ 表示临时用户 命令行
         # 表示超级用户 命令行

linux目录结构:是一个树形结构:
/   一个斜杠:Linux系统的根目录,一般只存放目录,使用cd / 可直接进入Linux的根目录
/bin和/usr/bin 命令:(二进制)文件目录,包含可供root用户和普通用户所使用的Linux命令和二进制文件,包含shell解析器等
/boot :系统引导和内核目录,存放引导装载文件
/dev  :设备目录,存放各个硬件设备的信息,例如光驱、硬盘等
/etc:    系统级别的配置文件存放的目录,一般由配置管理员来使用
/home:    所有普通用户的家目录,

当普通用户使用cd~命令时,进入到的就是这个文件夹下用户名称的文件夹,因此这个命令的含义就是直接跳转到当前用户文件夹

/lib、/usr/lib、
/usr/local/lib    系统使用的函数库的目录
/lost+fount    在ext2和ext3文件系统中,系统崩溃时记录信息的目录
/opt: 给主机额外安装软件所摆放的目录
/proc :  重要的需要放置在内存中的数据
/root    root用户的的根目录,同home类似
/sbin、/usr/sbin
/usr/local/sbin    放置的是系统管理员(root)才能使用的命令,普通用户只能进行查看,而/bin目录中的命令普通用户也可以使用
/tmp: 存放应用程序产生的临时数据不能在此目录下存放重要数据
/var :系统一般运行时需要改变的数据
/usr: 应用程序相关目录命令、函数库、共享包、内核源码

文件与文件夹操作

文件与文件夹增删改查等

Linux切换目录

 #cd命令.
 cd ../  表示跳转到上级目录   ../../../
 cd ./ 表示当前目录

文件夹的创建与删除

 #mkdir  创建目录   
 mkdir first
 #mkdir -p 创建多级目录多级目录
  mkdir -p ./aaa/bbb/ccc
 #删除目录: rm -rf 文件或目录路径
 rm -rf ./aaa

创建单个或多个文件

 #创建单个文件与多个
 touch a.txt
 touch a.txt b.txt c.txt

输出指令

echo就类似java中的输出语句,他会将echo 之后""里的内容输出出来,一般跟重定向操作符使用向文件中追加内容,

 #普通打印
 echo "要打印的内容"
 #打印变量,打印变量的值要加入$,否则就是变量名称
 a=10
 echo $a
 ehho a

Linux的重定向操作符

Linux的重定向与java的重定向不同,Linux的重定向就是>操作符,用来将左边的数据追加到右边

 #配合输出语句将指定字符覆盖到文件中
 echo "hello" > a.txt    覆盖内容
 echo "hello" > > a.txt  追加内容

文件或文件夹的复制

 #文件复制 : cp
 cp ./a.txt   ./first
 #文件夹的赋值需要加入-r参数
 cp -r ./second  ./first

文件或文件夹的剪切,移动,删除

 #移动文件并且移动时需要指定移动后的名称,文件夹同理
 mv a.txt  ../a.txt
 #重命名,就相当于见文件移动到当前目录且重新设置一个名字
 mv 旧文件名称 新文件名称
 #文件的删除,永久删除不可恢复
 rm -rf 删除的文件或文件夹名称

查看文件的多种方式

 #查看小文件,-n加上行号,太大的文件使用次命令会显示不全
 cat -n /home/a.txt
 #翻页查看,ctrl+f向下翻页 ctrl+b 向上翻页
 more /home/a.txt
 #翻页查看文件具备查找功能
 less /home/a.txt
 #查看文件末尾行 -100显示查看末100行
 tail -100 install.log
 # 查看文件首行
 head -100 install.log

vi、vim编辑器的使用

vi与vim是相同的,这个编辑器就类似与Windows的记事本,用来打开一些文件,让我们可以进行修改

   :q        //退出
   :w        //保存
   :wq       //保存退出
   :q!       //强制退出
   :set nu   //显示行号
  向右移动 --> l
 向左移动 --> h?
 向下移动 --> j
 向上移动 --> k?
 保存当前修改并退出 --> ZZ?
 撤销上一步操作 --> u //常用
 移动光标到行首 --> 0 (数字0) gg  //常用
 移动光标到行末 --> $ :G //常用
 移动光标到当前页最顶行 --> H
 移动光标到当前页最底行 --> L
 向前翻一页(Page Up) --> Ctrl + f
 向后翻一页(Page Down) --> Ctrl + b

vi编辑器的复制,黏贴,删除等操作(都要退出编辑模式才可以使用

  1. 首先要按使用v进入可视模式,使用光标选定内容

  2. 复制选定块到缓冲区,用y;复制整行,用yy

  3. 剪切选定块到缓冲区,用d;剪切整行用dd,也可以使用剪切来达到删除的目的

  4. 粘贴缓冲区中的内容,用p

  5. 删除后五行数据 使用 5dd,也就是将光标后五行剪切走,注意一定要使用键盘上方的数字按键,不能使用小键盘的数字按键

  6. 复制后五行数据 使用5yy,

Linux的打包,解包,解压缩的概念

首先打包,与打压缩包是不同的,打包就是将多个文件打成一个文件,类似于使用塑料袋将多个散件装在一起,打压缩包就是在这个基础上进行压缩,同样打包也对应这解包,打压缩包也对应着解压缩包

 #打包与解包使用tar命令,解压与压缩是基于打包还是解包,如果参数是解包,那就是解压缩包,如果是参数是打包就是打压缩包
   -z    压缩
   -c    打包
   -x    解包
   -f    必须要
   -C    指定解包位置
   -v    输出信息
   
 #将一个文件打包,.tar结尾的就是打包后的
  tar -cvf folder.tar file1.txt
 #将多个文件打成一个包
 tar -cvf folder.tar file1.txt file2.txt
 #将多个文件打成一个压缩包
 tar -zcvf folder.tar.gz file1.txt file2.txt
 ​
 #解包到当前目录
 tar -xvf file.tar ./
 tar -xvf folder.tar     (常用方法)
 #解包到指定目录,在-C的参数后边加入要解压到的目录
 tar -xvf folder.tar -C /home/sss
  
 #将文件解包并压缩
 tar -zxvf file.tar.gz        (常用方法)
 #解压缩包到指定目录
 tar -zxvy file.tar.gz -C ../

查找文件

 #从根目录/查找指定文件,find是查找命令,之后是查找的开始位置,-name是根据名字查找的参数, 之后是要查找的文件名称
 find / -name 文件名称

Linux用户与组的操作

用户的概念

Linux是多用户的操系统,我么可以为每一个用户都设置单独的权限,这个权限就是组,每个用户的uid都不同,root的uid=0 普通账户uid > = 500, 系统账户uid = 1 ~ 499,其中/etc/passwd 中保存的是用户信息,我们可以查看这个文件来查看系统中的用户信息,/etc/shadow 保存账户密码信息,

组的概念

Linux的组就是权限,怎么理解呢,Linux将权限通过组来管理,组是权限的实现,权限是一个比较抽象的概念,用组来规定具体可以做什么,将用户分配到组中就相当于这个用户有了权限,

用户与组的命令

 # 查看用户,也就是查看ETC下的passwd文件
 cat /etc/passwd
 #查看组,就是查看etc下的 group文件
 cat /etc/group
 #添加用户 刚添加的用户没有密码,需要设置密码
 useradd 用户名称
 #修改用户密码
 passwd 要修改的用户名称
 #删除用户 -r参数表明连带用户文件夹也删除
 userdel -r 用户名称
 ​
 #创建组
 groupadd 组名称
 #删除组
 groupdel 要删除的组名称
 ​
 #将用户添加到组
 gpasswd -a 用户名称 要添加的组称
 #将用户移除组
 gpasswd -d 用户名称 要移除的组名称

Linux权限的操作与概念

Linux有7中权限,分别对应了可读,可写,可执行三种权限一共的组合类型,数字1-7对应了这7中权限,只可读对应4,只可写对应2,只可执行对应1,

Linux的7种权限:

7 r+w+x 可读 可写可执行,权限最大

6 r+w 可读可写

5 r+x 可读可执行

4 r 只是可读

3 w+x 可写可执行

2 w 可写

1 x 可执行

当我们使用ll命令查看当前文件夹所有文件的详细信息时,最前边的就是这个文件或者文件夹的权限,

 #文件夹详细信息段,2代表修改了两次,第一个wxx代表文件所属人 第二个wxx代表文件所属的组
 drwxr-xr-x. 2 wxx wxx 4096 Nov 26 18:05 Desktop
 #权限段
 drwxr-xr-x

如同上边这一段,十位的字符串,第一个字符标识是文件还是文件夹,d就是文件夹,-一个杠代表是文件,之后以三个字符成为一段,第一段代表:文件夹所属人的权限,一般都是最大的,第二段:代表同组用户的权限,一般同组都是可以查看不可修改,第三段:非同组人用户的权限,一般都是最小的,

修改文件或文件夹权限命令

 #修改文件权限,760三位数组分别对应了三段权限,
 chmod 760 aa.txt
 #修改文件所有人信息
 chown 用户:组名 文件名称

 ​

shell脚本

shell被称为壳,他是Linux内核的壳,在Linux内核之上,直接控制Linux内核,Linux的工程师可以操作壳从而达到操作Linux的作用,shell也成为了脚本,将多个Linux的命令打包,并且使用shell程序来进行控制与附加操作从而增强普通的Linux命令,其实每一个Linux的命令都是shell,无非是系统给我们自带的方便管理Linux系统而默认存在的,在ETC的目录下,

起步

shell命令的开头都需要#!/bin/bash 声明在头部,否则编译器无法解析shell程序

变量

shell中的变量定义不需要声明类型,直接使用变量名=变量值得形式就可,但是中间不能有空格,变量的使用需要加$,这类似于C语言,不使用$则只是变量名称,我们通常使用${}来指定变量名称的范围,在字符串拼接中有可能变量名称与要添加的字符连在一起,导致无法获取变量的值

shell在运行时有三中变量 1. 局部变量,声明在shell脚本中,作用域是整个当前的shell脚本,2.环境变量,所有的shell程序都可访问到,3.shell变量,shell运行时需要的变量,用来保证shell的运行成功,shell的支持

 #!/bin/bash
 #声明变量
 a=10
 b=20
 str1="hello"
 str2="linux"
 #字符串拼接,直接拼接就行,不需要+号之类的,且随意添加其它的东西
 str3="${str1}/${str2}"#=hello/Linux

使用readonly修改的变量是只读变量,只读变量只可读,不可修改,修改会报错,只读变量的关键字与变量名称有空格

 str1="hello"
 readonly str1

使用unset修饰可以删除变量,被删除的变量不可在使用,不可删除只读变量

 unset str1

字符串变量

单引号声明的字符串不可以包含变量的使用,回原样输出,并且不可以单独出现单引号,转移也不可以,可以成对出现,用于字符串拼接,

双引号的字符串可以包含变量的使用,可以出现转义字符

 # 使用双引号拼接
 your_name="runoob"
 greeting="hello, "$your_name" !"
 greeting_1="hello, ${your_name} !"
 echo $greeting  $greeting_1
 # 使用单引号拼接
 greeting_2='hello, '$your_name' !'
 greeting_3='hello, ${your_name} !'
 echo $greeting_2  $greeting_3
 #结果
 hello, runoob ! hello, runoob !
 hello, runoob ! hello, ${your_name} !
 #字符串截取,从索引为0开始往后截取三位
 echo ${greeting:0:3}
 #获取字符串长度 输出4
 echo ${#greeting}

运算符

 ##### 算数运算符

原生bash不支持简单的数学运算,我们可以使用expr 表达式来实现,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。表达式需要使用``包起来键盘tab上边的,

或者使用(()),在括号中写表达式不需要转义*号,$((表达式))加入$可以返回表达式的值,$就是获值的意思,学过C语言很好理解

shell支持+ - * / % java支持的算数都可以,*需要使用\来转义,用来区分所有的意思

 a=10
 b=20
 val=`expr $a + $b`
 echo "a + b : $val"
 val=`expr $a - $b`
 echo "a - b : $val"
 val=`$(($a * $b))`
 echo "a * b : $val"
 val=`$(( $b / $a))`
 echo "b / a : $val"
 val=`$(( $b % $a))`
 echo "b % a : $val"

关系运算符

shell不只是<>尖括号的方式来表达变量之间的关系,但是他是支持!=,==的,任何用到尖括号的地方都需要使用转义字符来实现,

-eq == 判断是否相等

-ne != 判断不等

-gt >

-lt <

-ge >=

-le <=

!= !=

== ==

 if [ $a -eq $b ]
 then
    echo "$a -eq $b : a 等于 b"
 else
    echo "$a -eq $b: a 不等于 b"
 fi

逻辑运算符,布尔运算符

表达逻辑的写法有两种,一种是使用布尔运算符,一种是使用类似于java的逻辑运算符,两种的区别就是类java的if语句的表达式括号 需要写两个[[]]

布尔运算符

! 非

-o 或者 - or || 或者

-a 并且 -and && 并且

 a=10
 b=20
 #转义字符标识并且
 if [ $a -lt 100 -a $b -gt 15 ]
 then
    echo "$a 小于 100 且 $b 大于 15 : 返回 true"
 else
    echo "$a 小于 100 且 $b 大于 15 : 返回 false"
 fi
 #类java 表示或者
 if [[ $a -lt 100 || $b -gt 100 ]]
 then
    echo "返回 true"
 else
    echo "返回 false"
 fi

流程控制

if:

if与java的if不同,if的条件需要写在[]中,并且里边的条件要有空格相隔,并且要有fi作为if语句的结尾

 if condition
 then
     command1 
     command2
     ...
     commandN
 else
     command
 fi
 #多重ifelse
 if condition1
 then
     command1
 elif condition2 
 then 
     command2
 else
     commandN
 fi

for循环

与java的for不同,这更类似于Python的for循环,需要在in关键字后写循环变量的列表, n 列表可以包含替换、字符串和文件名。

 for var in item1 item2 ... itemN
 do
     command1
     command2
     ...
     commandN
 done
 #也可以跟这样一样 直接根据字符串来循环
 for str in This is a string
 do
     echo $str
 done

while循环

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。

 #以下是一个基本的 while 循环,测试条件是:如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1。运行上述脚本,返回数字 1 到 5,然后终止。
 int=1
 while(( $int<=5 ))
 do
     echo $int
     let "int++"
 done

case ... esac,

就是java中的switch case的格式, 是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记

 echo '输入 1 到 4 之间的数字:'
 echo '你输入的数字为:'
 read aNum
 case $aNum in
     1)  echo '你选择了 1'
     ;;
     2)  echo '你选择了 2'
     ;;
     3)  echo '你选择了 3'
     ;;
     4)  echo '你选择了 4'
     ;;
     *)  echo '你没有输入 1 到 4 之间的数字'
     ;;
 esac

循环也支持 break与continue,且与java的一样

数组

shell中只支持一维数组,并且不需要指定数组的大小,使用空格来区分各个数组的元素

 #声明数组
 array_name=(value1 value2 ... valuen)
 #获取数组元素
 ${array_name[下标]}
 ​
 #使用@ 或 * 可以获取数组中的所有元素
 echo "数组的元素为: ${my_array[*]}"
 #获取数组长度
 echo "数组的元素为: ${#my_array[*]}"

传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

 #我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):
 echo "Shell 传递参数实例!";
 echo "执行的文件名:$0";
 echo "第一个参数为:$1";
 echo "第二个参数为:$2";
 echo "第三个参数为:$3";

函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。 函数返回值在调用该函数后通过 $? 来获得。 并且必须在函数调用的下一行,函数的参数传递,就是在函数调用之后 空格写要传入的参数

 #无返回值函数
 demoFun(){
     echo "这是我的第一个 shell 函数!"
 }
 echo "-----函数开始执行-----"
 demoFun
 echo "-----函数执行完毕-----"
 #有返回值函数
 funWithReturn(){
     echo "这个函数会对输入的两个数字进行相加运算..."
     echo "输入第一个数字: "
     read aNum
     echo "输入第二个数字: "
     read anotherNum
     echo "两个数字分别为 $aNum 和 $anotherNum !"
     return $(($aNum+$anotherNum))
 }
 funWithReturn #函数调用
 echo "输入的两个数字之和为 $? !" #获取函数返回值
 #函数传参
 funWithParam(){
     echo "第一个参数为 $1 !"
     echo "第二个参数为 $2 !"
     echo "第十个参数为 $10 !"
     echo "第十个参数为 ${10} !"
     echo "第十一个参数为 ${11} !"
     echo "参数总数有 $# 个!"
     echo "作为一个字符串输出所有参数 $* !"
 }
 funWithParam 1 2 3 4 5 6 7 8 9 34 73
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值