Java测开面试准备第二天

http工作流程及特点、及报文格式

http工作流程

1.HTTP客户端与服务端建立一个TCP套接字连接

2.HTTP客户端通过TCP套接字,向服务器发送一个文本的请求报文

3.HTTP服务器解析请求,定位请求资源。服务器将处理结果写入TCP套接字,由客户端读取

4.HTTP客户端和服务端根据请求头connection决定关闭TCP套接字连接或保持连接

5.客户端解析状态行,如果响应成功。然后解析每一个响应头,显示响应数据

特点

  1. http协议是无连接的,每次请求都会断开
  2. http允许传输任意类型的数据
  3. http协议是无状态协议,对事务处理没有记忆能力,如果后续处理需要前面的信息,则它必须重传

报文格式

请求报文:

请求行(请求方法 请求URL 协议版本)、

请求头部(user-agent content-type cookie cache-control connection:keep-alive)、

空行

请求数据

响应报文:

状态行(http版本 状态码 状态信息)、

消息报头(content-type date …)、

空行、

响应正文

http(POST和GET)

幂等性,是指一次和多次请求某一个资源应该具有同样的副作用,同一个请求发送一次和发送N次的效果是一样的。(服务器生成一个唯一的处理号,它将用于标识后续的操作。)

  1. get方法用于资源获取,它不会有副作用,所以是幂等性的。
  2. delete、put删除、更新操作,这两个操作也具有幂等性。
  3. post相对于put不具备幂等性。当我们因为反复刷新浏览器导致多次提交表单,多次发出同样的 POST 请求,导致远端服务器重复创建出了资源。

所以,对于电商应用来说,

第一、对应的后端 WebService 一定要做到幂等性,

第二、服务器端收到 POST 请求,在操作成功后必须 302 跳转到另外一个页面,这样即使用户刷新页面,也不会重复提交表单。

GET和POST方法的区别

GET 和 POST 方法都是基于 TCP/IP 协议,两者的数据传输都是建立在 TCP 的连接

GET方法从服务器获取资源,POST是想服务器发送数据

GET 浏览器回退是无害的,而 POST 会再次提交请求。

GET 产生URL地址可以被书签收藏,并且被浏览器缓存,而POST不能书签收藏也不能缓存

GET 只能进行 URL 编码,而 POST 支持多种编码方式。

GET 参数通过 URL 传递,并且长度有限制,而 POST 放在 request body 并且长度没有限制。并且,正因为这个原因, GET 比 POST 更不安全,因为参数暴露在 URL 中。

二者还有一个显著区别:GET 产生一个 TCP 数据包;POST 产生两个 TCP 数据包。

对于 GET 方式的请求,浏览器会把 http header 和 data 一并发送出去,服务器响应 200(返回数据);

而对于 POST,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok(返回数据)。

http状态码

301 redirect: 301 代表永久性转移(Permanently Moved)

302 redirect: 302 代表暂时性转移(Temporarily Moved)

都代表重定向,浏览器的url栏都跳到了新的地址。

他们的不同在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。

100 - 客户端应重新发送初始请求,并在请求中附上第一次请求时未提供的表示

200 - 请求成功

301 - 资源(网页等)被永久转移到其它URL

404 - 请求的资源(网页等)不存在

410 - 服务器端知道客户端所请求的资源曾经存在,但现在已经不存在

409 - 当客户端试图执行一个“会导致一个或多个资源处于不一致状态”的操作时

500 - 内部服务器错误

1通知 2成功 3重定向 4客户端出错 5服务器出错

http1.0 1.1 2.0区别

http1.1和http1.1区别:

1.缓存处理:http1.0主要是用hearder里的if-modified-since,expires来做缓存判断标准,http1.1引入更多的缓存控制策略

2.带宽优化及网络连接的使用:http1.0,存在浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能;HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)

3.错误通知观管理:在HTTP1.1中新增了24个错误状态响应码

4.Host头处理:http1.0没有请求头没有host字段。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。

5.长连接:HTTP 1.1支持长连接,一个TCP连接可以传送多个请求和响应。支持请求的流水线处理。

http2.0

HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP1.1 大了好几个数量级。但是还不够承受,技术成本高,容易受到攻击,用得不多。

http和https的区别

1.http明文传输,https是在http下加入了ssl层,采用对称加密和非对称加密结合的方式保护通讯的安全;

2.资源消耗不同,https通信会由于加密减密处理消耗更多的CPU和内存资源;

3.http端口80,https端口443;

4.https通信需要ssl证书,需要购买,个人网站,小网站一般不用。

https混合加密机制

(对称和非对称加密)

步骤1:客户端向服务器发送请求,建立SSL连接

步骤2:服务器发送发送非对称加密公钥A给浏览器

步骤3:浏览器生成随机数,作为密钥B

步骤4:客户端用公钥A加密密钥B,得到C

步骤5:发送C

步骤6:服务器使用自己的私钥D对密钥C解密,得到加密密钥B

步骤7:浏览器和服务器之间使用密钥B作为对称加密密钥,而不会被监听。

TCP协议(流量控制|拥塞控制)

对数据包进行排序、TCP 将保持它首部和数据的检验和、丢弃重复的数据、TCP 利用滑动窗口实现流量控制、ARQ、超时重传

流量控制(滑动窗口协议):

TCP流量控制主要使用滑动窗口协议

发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

接收窗口只有在前面所有的段都确认的情况下才会移动左边界。

拥塞控制:

慢启动,拥塞避免,快速重传,超时重传

TCP、UDP区别

TCP优点:可靠稳定,三次握手建立连接,有确认、窗口、重传、拥塞控制机制

TCP缺点:慢、效率低、占用系统资源高、易被攻击

仅支持点到点

UDP优点:快,比TCP稍安全、无状态的传输协议

UDP缺点:不可靠,不稳定,网络不好,容易丢包

支持一对一、一对多、多对一、多对多

三次握手

  1. 客户端发送给服务器一个序号为x的SYN包(SYN=1,seq=x);
  2. 服务器收到之后,知道你要给我建立连接。服务器就确认了你这个请求并发送了一个序号为y的SYN包(ACK=1,ack=x+1,SYN=1,seq=y);
  3. 这时候客户端收到之后需要回复一个ACK包(ACK=1,ack=y+1)。

能不能两次握手?

不能,为了防止已失效的链接请求突然又传到服务器上。

第三次握手失败会怎样?

  • 客户端发出的 ACK 丢失了,发出的 下一个数据包 没有丢失,则服务端接收到下一个数据包(这个数据包里也会带上 ACK 信息),能够进入正常的 ESTABLISHED 状态
  • 如果服务端和客户端都没有数据发送,或者服务端想发送数据(但是发不了,因为没有收到客户端的 ACK),服务器都会有定时器发送第二步 SYN+ACK 数据包,如果客户端再次发送 ACK 成功,建立连接。
  • 如果一直不成功,服务器肯定会有超时设置,超时之后会给客户端发 RTS 报文,进入 CLOSED 状态,防止 SYN 洪泛攻击。

四次挥手

因为TCP是全双工的,所以谁发起都行。

(1)第一次:主动方发送断开连接请求(Fin报文)给被动方,仅仅代表主动方不会再发送数据报文,但主动发可以接受数据报文。

(2)第二次:被动方此时有可能还有数据报文发送,因此需要先发送ack报文,告诉主动方“我知道了你想断开”。这样主动方就不会因为没收到应答而继续发送断开连难解的请求(fin报文)。

(3)第三次:被动发发送完数据报文后,便发送给主动方fin报文,这样保证数据通信正常可靠地完成,发送完fin报文后,被动方进入last_ack阶段(超时等待)

(4)第四次:主动发发送ack报文,进行连接中断确认,这样被动方释放连接,进入可用状态。

为什么要四次挥手?

TCP是全双工模式,关闭连接时,当主机B收到主机A的FIN报文时,仅仅表示主机A不再发送数据了但是还能接收数据。

ARP协议

第一步:首先,每个主机都会有自己的ARP缓存区中建立一个ARP列表,以表示IP地址和MAC地址之间的对应关系

第二步:当源主机要发送数据时,首先检测ARP列表中是否对应IP地址的目的主机的MAC地址,如果有,则直接发送数据。如果没有,就向本网段的所有主机发送ARP数据包,内容:我是IP地址,mac地址,谁是IP地址,mac?

第三步:当本网络的所有主机收到该ARP数据包时,首先检查数据包中的IP地址是否是自己的IP地址,如果不是,则忽略该数据包。如果是,则首先从数据包中取出源主机的IP和mac地址写入到ARP列表中,如果以存在,则覆盖。然后将自己的mac地址写入arp响应包中,告诉源主机自己是它想要找的mac地址

第四步:源主机收到ARP响应包后,将目的主机的IP和mac地址写入arp列表,并利用此信息发送数据

如果源主机一直没有收到arp响应数据包,表示arp查询失败。

DNS如何解析为ip地址

浏览器先查询,自己缓存中有没有这个ip没有

再去hosts中查看,hosts中没有再去DNS查找

一、递归查询。主机向本地域名服务器的查询一般采用递归查询。如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询)。
二、迭代查询。本地域名服务器向根域名服务器的查询是迭代查询。迭代查询特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应该向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

计网每一层的作用

五层结构

物理层(physicallayer)

通过线路传送原始的比特(bit)流,只完成一个节点到另一个节点的传送(单跳)

数据链路层(data-link layer)PPP

通过物理网络传送包(package)这里的包是通过网络层交过来的数据报(datagram),只完成一个节点到另一个节点的传送(单跳)(hop-by-hop, node-to-node)

网络层(network layer) IP

把包里面的目的地址拿出来,进行路由选择(routing),决定要往哪个方向传输,负责从源(source)通过路由选择到目的地(destination)的过程,达到从源主机传输数据到目标主机的目的(host-to-host)

传输层(transportlayer) TCP UDP

网络层只把数据送到主机,但不会送到进程。传输层负责负责进程与主机(host)间的传输,主机到主机(host-to-host)的传输交由网络层负责–传输层也称为端到端送

应用层(application layer)HTTP HTTPS SMTP

专门针对某些应用提供服务

Java多态实现机制

编译看左边,运行看右边

A a = new B()//B是A的子类

当a.test(),编译的时候看的时候A的test方法,而运行时运行的是B中的test方法

Java同步机制

给定时间只允许一个线程访问共享资源,需要给资源上一道锁。

同步机制使用synchronized,将共享资源的操作放在synchronized区域中

Synchroized(可以放一个对象),也可以修饰一个方法

Java垃圾回收机制(还需完善)

如果说这个对象没有被其他对象所引用,该对象就是无用的,此对象就被称为垃圾

标记垃圾的算法:引用计数法、可达性分析法

引用计算法:每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的,可以当做垃圾收集。

可达性分析算法:这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。

Integer和int的区别

Integer是int的包装类,int则是java的一种基本数据类型

Integer变量必须实例化后才能使用,而int变量不需要

Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值

Integer的默认值是null,int的默认值是0

进程,线程区别

进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。

进程里面可能包含一个或多个线程,一个程序至少有一个进程,一个进程至少有一个线程

线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源。

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。

虚拟内存

若执行的程序占用太多内存,会导致内存耗尽,电脑就会自动调用硬盘充当内存,已缓解内存的紧张。当RAM运行速率缓慢时,它便将数据从RAM移动到称为“分页文件”的空间中。将数据移入分页文件可释放RAM,以便完成工作。

虚拟内存是硬盘的一部分,用来解决内存小的问题,它可以把硬盘作为内存使用,缺点是速度慢。如果内存大应该关闭虚拟内存。

虚拟内存和缓存的区别:

虚拟内存是简单说就是把硬盘当内存用。

缓存(Cache)是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快.

缓存是集成在cpu中的有一级缓存二级缓存,有的新cpu还有三级缓存,是用来临时放数据的,用来解决内存和cpu速度差异的办法。cpu速度快内存速度慢。

数据库acid

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

举例:A向B转账200

原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生。

A转账和B的收款是一个整体,不能分割。

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

AB账户之和前后不变,符合逻辑运算。

隔离性时多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。(分别为:脏读,不可重复读(值读取不同),幻读(行集合不同),丢失更新

脏读:一个事务读取了另外一个事务未提交的数据

不可重复读:一个事务内读取表中的某一行数据,多次读取结果不同

幻读:一个事务内读取到了别的事务插入的数据,导致前后读取不一致

持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

数据库索引(B树 B+树 红黑树)

索引优点:提高查询速度。索引缺点:更新数据时效率低,因为要同时更新索引。

区别

红黑树

增加,删除,红黑树会进行频繁的调整,来保证红黑树的性质,浪费时间

B树也就是B-

B树,查询性能不稳定,查询结果高度不一致,每个结点保存指向真实数据的指针,相比B+树每一层每屋存储的元素更多,显得更高一点。

B+

B+树相比较于另外两种树,显得更矮更宽,查询层次更浅

红黑树性质:1节点都是黑色或红色2根结点黑色3空叶子节点是黑色4节点是红色,那么他的子节点必然是黑色5从一个节点到该节点的子孙节点路径上包含的黑节点数相同

 

Hash索引:等值查询效率高,不能排序,不能进行范围查询

B+索引:数据有序,范围查询

 

m阶B树:

1)每个节点至多m课子树 2)除了根结点,其他每个分支节点至少有m/2棵子树 3)根结点至少有两棵子树(除非B树只包含一个节点) 4)所有叶子节点在同一层,B树的叶子结点可以看成一种外部节点,不包含任何信息。5)有j个孩子的非叶节点恰好有j-1个关键码,关键码按递增次序排序。

B+树:

1)有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,

只用来索引,所有数据都保存在叶子节点。2)所有叶子结点中都包含全部元素信息,及指向含这些元素的指针,且叶子结点本身依关键字的大小,自小而大顺序链接。3)所有中间节点元素都同时存在于子节点,在子节点元素中是最大元素。

B+和B的区别:

(1)有 k 个子节点的节点必然有 k 个key;

(2)非叶子节点仅具有索引作用,跟记录有关的信息均存放在叶子节点中。

(3)树的所有叶子节点构成一个有序链表,可以按照key排序的次序遍历全部记录。

B+树的使用场景

B+树是在B树的基础上进行改造的,他的数据都在叶子节点,同时叶子节点之间还加了指针形成链表。B+树多用于数据库中的索引。

那么为什么B+树用于数据库中的索引呢?

原因:因为在数据库中select常常不只是查询一条记录,常常要查询多条记录。比如:按照id的排序的后10条。如果是多条的话,B树需要做中序遍历,可能要跨层访问。而B+树由于所有数据都在叶子结点,不用跨层,同时由于有链表结构,只需要找到首尾,通过链表就能够把所有数据取出来了

数据库三范式

级别

概念

1NF

属性不可分

2NF

非主键属性,完全依赖于主键属性

3NF

非主键属性无传递依赖

 

设计模式(单例模式)

单例模式:一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

public class Singleton {  //懒汉式

    private static Singleton instance; 

    private Singleton (){} 

    public static synchronized Singleton getInstance() { 

    if (instance == null) { 

        instance = new Singleton(); 

    } 

    return instance; 

    } 

}

public class Singleton {  //饿汉式

    private static Singleton instance = new Singleton(); 

    private Singleton (){} 

    public static Singleton getInstance() { 

    return instance; 

    } 

}

public class Singleton {  //双重校验锁

    private volatile static Singleton singleton; 

    private Singleton (){} 

    public static Singleton getSingleton() { 

    if (singleton == null) { 

        synchronized (Singleton.class) { 

        if (singleton == null) { 

            singleton = new Singleton(); 

        } 

        } 

    } 

    return singleton; 

    } 

}

设计模式(工厂模式)

创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。主要解决接口选择的问题。让其子类实现工厂接口,返回的也是一个抽象的产品。

创建一个接口,创建实现接口的实体类。创建一个工厂(里面有个方法Shape getShape(String shapeType)),生成基于给定信息的实体类的对象。

ShapeFactory shapeFactory = new ShapeFactory();

Shape shape1 = shapeFactory.getShape("CIRCLE");

shape1.draw();

设计模式(代理模式)

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。我们创建具有现有对象的对象,以便向外界提供功能接口。为其他对象提供一种代理以控制对这个对象的访问。

ProxyImage 是一个代理类,减少 RealImage 对象加载的内存占用。

创建一个接口。创建实现接口的实体类和一个代理类(代理类有一个实体类对象)

设计朋友圈测试用例

朋友圈测试用例

功能测试:

  1. 朋友圈发送功能
  1. 只发送文本 2)只发送图片 3)只发送视频 4)文本+图片…

5) 所在位置 6)设置谁可以看 7)提醒谁看 8)朋友圈内容是否有涉及黄赌毒内容

9)同步到QQ  10)朋友圈发送的次数当天是否有限制

2.朋友圈浏览功能

    1)文字查看 2)图片查看 3)视频查看 4)分享动态浏览 5)点赞、取消点赞

6)评论 7)删除朋友圈动态 8)更换相册封面 9)刷新是否正常获取新动态

10)上划是否加载更多

3.界面/易用性测试

    1)技术人员角度:页面布局设计是否跟产品原型图/ui效果图一致

    2)用户角度:功能操作是否简便,页面是否美观

4.中断测试

    1)主要考虑:发朋友圈、浏览时 实行中断操作 看是否会出现崩溃

    2)中断包括:前后台切换、锁屏解锁、断网重连、app切换、来电话/来短信中断、插拔耳机线/数据线

5.网络测试

    1)三大运营商不同网络测试

    2)网络切换测试:WIFI/4G/3G/2G

    3)无网测试:对于缓存在本地的数据,部分朋友圈信息是否支持浏览

    4)弱网测试:延时、丢包、页面呈现完整性

6.兼容性测试

    1)Android 苹果 pad版功能界面是否显示正常

    2)各平台朋友圈是否展示一致

7.安全测试

    1)发送朋友圈时,文本输入脚本代码,是否出现异常

8.性能测试

    1)服务器性能测试:主要关注TPS(事务吞吐量)、响应时间、吞吐量、CPU、内存

    2)app客户端性能测试:关注cpu、内存、流量、电量等占用率

3)app压力稳定性测试:频繁发送朋友圈,浏览朋友圈请求,是否容易发生崩溃

设计杯子测试用例

杯子测试用例

1.功能测试

1)是否可以装液体,能否装其他液体

2)是否能正常喝水

3)是否有盖子,能否盖得住

4)是否有保温的功能,是否正常保温

5)是否漏水

6)能装多少水

7)能否泡茶

8)能否放冰箱,做冰块

9)什么材质

2.界面测试

    1)外观是否完整 2)是否舒适 3)颜色 4)大小是否适中 5)是否有图案 6)是否容易磨损 7)杯子质量

3.性能测试

    1)装满水是否漏水 2)杯子最大使用次数 3)保温性 4)耐寒性 5)耐热性 6)掉地上能否再正常使用 7)放置时间长 是否泄漏

4.兼容性测试

    1)是否能装果汁、汽油、酒精、甲醛等

5.易用性测试

    1)喝水时否方便 2)拿起放下是否方便 3)装水是否方便 4)携带是否方方便 5)是否有防滑功能 6)装有低温或者高温水时,是否会让手感到不适

6.可移植性测试

    1)水杯放在常温环境中 2)零下 3)高温

7.安全性测试

    1)当水杯装上水后,是否会产生有毒物质

    2)把水杯放在零下环境时,是否会产生有毒物质

    3)把水杯放在高温环境时,是否会产生有毒物质

单元测试、集成测试、系统测试

粒度不同:

单元测试粒度最小,集成测试粒度居中,系统测试粒度最大。

测试方式不同:

单元测试一般由开发小组采用白盒方式来测试,集成测试一般由开发小组采用白盒加黑盒的方式来测试,系统测试一般由独立测试小组采用黑盒方式来测试。

测试内容不同:

单元测试主要测试单元是否符合“设计”,集成测试既验证“设计”,又验证“需求”,系统测试主要测试系统是否符合“需求规格说明书”。

使用阶段不同:

单元测试为开发人员在开发阶段要做的事情,集成测试和系统测试为测试人员在测试周期内级层做的工作。

Python和Java的区别

1.Python比Java简单,学习成本低,开发效率高

2.Java运行效率高于Python,尤其是纯Python开发的程序,效率低

3.Java相关资料多,尤其是中文资料

6.Java偏向于商业开发,Python适合于数据分析

7.Java是一种静态类型语言,Python是一种动态类型语言

8.Java中的所有变量需要先声明(类型)才能使用,Python中的变量不需要声明类型

9.Java编译以后才能运行,Python直接就可以运行;

10.JAVA 里的块用大括号对包括,Python 以冒号 + 四个空格缩进表示。

11.JAVA 的类型要声明,Python 的类型不需要。

12.JAVA 每行语句以分号结束,Python 可以不写分号。

13.实现同一功能时,JAVA 要敲的键盘次数一般要比 Python 多。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值