七天学会NodeJS-第二天

node-echo:node.js回显服务器,将请求数据返回到响应 节点回声 node.js回显服务器,将请求数据返回到响应 立即下载

代码的组织和部署

有经验的C程序员在编写一个新程序时首先从make文件写起。同样的,使用NodeJS编写程序前,为了有个良好的开端,首先需要准备好代码的目录结构和部署方式,就如同修房子要先搭脚手架。本章将介绍与之相关的各种知识。

模块路径解析规则

我们已经知道,require函数支持斜杠(/)或盘符(C:)开头的绝对路径,也支持./开头的相对路径。但这两种路径在模块之间建立了强耦合关系,一旦某个模块文件的存放位置需要变更,使用该模块的其它模块的代码也需要跟着调整,变得牵一发动全身。因此,require函数支持第三种形式的路径,写法类似于foo/bar,并依次按照以下规则解析路径,直到找到模块位置。

  1. 内置模块

    如果传递给require函数的是NodeJS内置模块名称,不做路径解析,直接返回内部模块的导出对象,例如require('fs')。

  2. node_modules目录

    NodeJS定义了一个特殊的node_modules目录用于存放模块。例如某个模块的绝对路径是/home/user/hello.js,在该模块中使用require('foo/bar')方式加载模块时,则NodeJS依次尝试使用以下路径。


    1
    2
    3
    /home/user/node_modules/foo/bar
    /home/node_modules/foo/bar
    /node_modules/foo/bar
  3. NODE_PATH环境变量

    与PATH环境变量类似,NodeJS允许通过NODE_PATH环境变量来指定额外的模块搜索路径。NODE_PATH环境变量中包含一到多个目录路径,路径之间在*nix下使用:分隔,在Windows下使用;分隔。例如定义了以下NODE_PATH环境变量:


    1
    NODE_PATH=/home/user/lib:/home/lib

    当使用require('foo/bar')的方式加载模块时,则NodeJS依次尝试以下路径。


    1
    2
    /home/user/lib/foo/bar
    /home/lib/foo/bar

包(package)

我们已经知道了JS模块的基本单位是单个JS文件,但复杂些的模块往往由多个子模块组成。为了便于管理和使用,我们可以把由多个子模块组成的大模块称做包,并把所有子模块放在同一个目录里。

在组成一个包的所有子模块中,需要有一个入口模块,入口模块的导出对象被作为包的导出对象。例如有以下目录结构。


1
2
3
4
5
- /home/user/lib/
     - cat/
         head.js
         body.js
         main.js

其中cat目录定义了一个包,其中包含了3个子模块。main.js作为入口模块,其内容如下:


1
2
3
4
5
6
7
8
9
10
var head = require( './head' );
var body = require( './body' );
 
exports.create = function (name) {
     return {
         name: name,
         head: head.create(),
         body: body.create()
     };
};

在其它模块里使用包的时候,需要加载包的入口模块。接着上例,使用require('/home/user/lib/cat/main')能达到目的,但是入口模块名称出现在路径里看上去不是个好主意。因此我们需要做点额外的工作,让包使用起来更像是单个模块。

index.js

当模块的文件名是index.js,加载模块时可以使用模块所在目录的路径代替模块文件路径,因此接着上例,以下两条语句等价。


1
2
var cat = require( '/home/user/lib/cat' );
var cat = require( '/home/user/lib/cat/index' );

这样处理后,就只需要把包目录路径传递给require函数,感觉上整个目录被当作单个模块使用,更有整体感。

package.json

如果想自定义入口模块的文件名和存放位置,就需要在包目录下包含一个package.json文件,并在其中指定入口模块的路径。上例中的cat模块可以重构如下。


1
2
3
4
5
6
7
8
9
- /home/user/lib/
     - cat/
         + doc/
         - lib/
             head.js
             body.js
             main.js
         + tests/
         package.json

其中package.json内容如下。


1
2
3
4
{
     "name" : "cat" ,
     "main" : "./lib/main.js"
}

如此一来,就同样可以使用require('/home/user/lib/cat')的方式加载模块。NodeJS会根据包目录下的package.json找到入口模块所在位置。

命令行程序

使用NodeJS编写的东西,要么是一个包,要么是一个命令行程序,而前者最终也会用于开发后者。因此我们在部署代码时需要一些技巧,让用户觉得自己是在使用一个命令行程序。

例如我们用NodeJS写了个程序,可以把命令行参数原样打印出来。该程序很简单,在主模块内实现了所有功能。并且写好后,我们把该程序部署在/home/user/bin/node-echo.js这个位置。为了在任何目录下都能运行该程序,我们需要使用以下终端命令。


1
2
$ node /home/user/bin/node-echo.js Hello World
Hello World

这种使用方式看起来不怎么像是一个命令行程序,下边的才是我们期望的方式。


1
$ node-echo Hello World
*nix

在*nix系统下,我们可以把JS文件当作shell脚本来运行,从而达到上述目的,具体步骤如下:

  1. 在shell脚本中,可以通过#!注释来指定当前脚本使用的解析器。所以我们首先在node-echo.js文件顶部增加以下一行注释,表明当前脚本使用NodeJS解析。


    1
    #! /usr/bin/env node

    NodeJS会忽略掉位于JS模块首行的#!注释,不必担心这行注释是非法语句。

  2. 然后,我们使用以下命令赋予node-echo.js文件执行权限。


    1
    $ chmod +x /home/user/bin/node-echo.js
  3. 最后,我们在PATH环境变量中指定的某个目录下,例如在/usr/local/bin下边创建一个软链文件,文件名与我们希望使用的终端命令同名,命令如下:


    1
    $ sudo ln -s /home/user/bin/node-echo.js /usr/local/bin/node-echo

这样处理后,我们就可以在任何目录下使用node-echo命令了。

Windows

在Windows系统下的做法完全不同,我们得靠.cmd文件来解决问题。假设node-echo.js存放在C:\Users\user\bin目录,并且该目录已经添加到PATH环境变量里了。接下来需要在该目录下新建一个名为node-echo.cmd的文件,文件内容如下:


1
@node "C:\User\user\bin\node-echo.js" %*

这样处理后,我们就可以在任何目录下使用node-echo命令了。

工程目录

了解了以上知识后,现在我们可以来完整地规划一个工程目录了。以编写一个命令行程序为例,一般我们会同时提供命令行模式和API模式两种使用方式,并且我们会借助三方包来编写代码。除了代码外,一个完整的程序也应该有自己的文档和测试用例。因此,一个标准的工程目录都看起来像下边这样。


1
2
3
4
5
6
7
8
9
10
11
- /home/user/workspace/node-echo/   # 工程目录
     - bin/                          # 存放命令行相关代码
         node-echo
     + doc/                          # 存放文档
     - lib/                          # 存放API相关代码
         echo.js
     - node_modules/                 # 存放三方包
         + argv/
     + tests/                        # 存放测试用例
     package.json                    # 元数据文件
     README.md                       # 说明文件

其中部分文件内容如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* bin/node-echo */
var argv = require( 'argv' ),
     echo = require( '../lib/echo' );
console.log(echo(argv.join( ' ' )));
 
/* lib/echo.js */
module.exports = function (message) {
     return message;
};
 
/* package.json */
{
     "name" : "node-echo" ,
     "main" : "./lib/echo.js"
}

以上例子中分类存放了不同类型的文件,并通过node_moudles目录直接使用三方包名加载模块。此外,定义了package.json之后,node-echo目录也可被当作一个包来使用。

NPM

NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:

  • 允许用户从NPM服务器下载别人编写的三方包到本地使用。

  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。

  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

可以看到,NPM建立了一个NodeJS生态圈,NodeJS开发者和用户可以在里边互通有无。以下分别介绍这三种场景下怎样使用NPM。

下载三方包

需要使用三方包时,首先得知道有哪些包可用。虽然npmjs.org提供了个搜索框可以根据包名来搜索,但如果连想使用的三方包的名字都不确定的话,就请百度一下吧。知道了包名后,比如上边例子中的argv,就可以在工程目录下打开终端,使用以下命令来下载三方包。


1
2
3
$ npm install argv
...
argv@0.0.2 node_modules\argv

下载好之后,argv包就放在了工程目录下的node_modules目录中,因此在代码中只需要通过require('argv')的方式就好,无需指定三方包路径。

以上命令默认下载最新版三方包,如果想要下载指定版本的话,可以在包名后边加上@<version>,例如通过以下命令可下载0.0.1版的argv。


1
2
3
$ npm install argv@0.0.1
...
argv@0.0.1 node_modules\argv

如果使用到的三方包比较多,在终端下一个包一条命令地安装未免太人肉了。因此NPM对package.json的字段做了扩展,允许在其中申明三方包依赖。因此,上边例子中的package.json可以改写如下:


1
2
3
4
5
6
7
{
     "name" : "node-echo" ,
     "main" : "./lib/echo.js" ,
     "dependencies" : {
         "argv" : "0.0.2"
     }
}

这样处理后,在工程目录下就可以使用npm install命令批量安装三方包了。更重要的是,当以后node-echo也上传到了NPM服务器,别人下载这个包时,NPM会根据包中申明的三方包依赖自动下载进一步依赖的三方包。例如,使用npm install node-echo命令时,NPM会自动创建以下目录结构。


1
2
3
4
5
6
7
- project/
     - node_modules/
         - node-echo/
             - node_modules/
                 + argv/
             ...
     ...

如此一来,用户只需关心自己直接使用的三方包,不需要自己去解决所有包的依赖关系。

安装命令行程序

从NPM服务上下载安装一个命令行程序的方法与三方包类似。例如上例中的node-echo提供了命令行使用方式,只要node-echo自己配置好了相关的package.json字段,对于用户而言,只需要使用以下命令安装程序。


1
$ npm install node-echo -g

参数中的-g表示全局安装,因此node-echo会默认安装到以下位置,并且NPM会自动创建好*nix系统下需要的软链文件或Windows系统下需要的.cmd文件。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- /usr/local/               # *nix系统下
     - lib/node_modules/
         + node-echo/
         ...
     - bin/
         node-echo
         ...
     ...
 
- %APPDATA%\npm\            # Windows系统下
     - node_modules\
         + node-echo\
         ...
     node-echo.cmd
     ...
发布代码

第一次使用NPM发布代码前需要注册一个账号。终端下运行npm adduser,之后按照提示做即可。账号搞定后,接着我们需要编辑package.json文件,加入NPM必需的字段。接着上边node-echo的例子,package.json里必要的字段如下。


1
2
3
4
5
6
7
8
9
10
11
{
     "name" : "node-echo" ,           # 包名,在NPM服务器上须要保持唯一
     "version" : "1.0.0" ,            # 当前版本号
     "dependencies" : {              # 三方包依赖,需要指定包名和版本号
         "argv" : "0.0.2"
       },
     "main" : "./lib/echo.js" ,       # 入口模块位置
     "bin" : {
         "node-echo" : "./bin/node-echo"      # 命令行程序名和主模块位置
     }
}

之后,我们就可以在package.json所在目录下运行npm publish发布代码了。

版本号

使用NPM下载和发布代码时都会接触到版本号。NPM使用语义版本号来管理代码,这里简单介绍一下。

语义版本号分为X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号。当代码变更时,版本号按以下原则更新。


1
2
3
4
5
+ 如果只是修复bug,需要更新Z位。
 
+ 如果是新增了功能,但是向下兼容,需要更新Y位。
 
+ 如果有大变动,向下不兼容,需要更新X位。

版本号有了这个保证后,在申明三方包依赖时,除了可依赖于一个固定版本号外,还可依赖于某个范围的版本号。例如"argv": "0.0.x"表示依赖于0.0.x系列的最新版argv。NPM支持的所有版本号范围指定方式可以查看官方文档。

灵机一点

除了本章介绍的部分外,NPM还提供了很多功能,package.json里也有很多其它有用的字段。除了可以在npmjs.org/doc/查看官方文档外,这里再介绍一些NPM常用命令。

  • NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

  • 使用npm help <command>可查看某条命令的详细帮助,例如npm help install。

  • 在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

  • 使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

  • 使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

  • 使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

  • 使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。

小结

本章介绍了使用NodeJS编写代码前需要做的准备工作,总结起来有以下几点:

  • 编写代码前先规划好目录结构,才能做到有条不紊。

  • 捎大些的程序可以将代码拆分为多个模块管理,更大些的程序可以使用包来组织模块。

  • 合理使用node_modules和NODE_PATH来解耦包的使用方式和物理路径。

  • 使用NPM加入NodeJS生态圈互通有无。

  • 想到了心仪的包名时请提前在NPM上抢注。

http://www.open-open.com/lib/view/1392611872538


游戏开发实战:5种AOI算法对比(九宫格 vs 灯塔 vs 十字链表) 本文深入对比了游戏开发中五种主流AOI算法(九宫格、灯塔、十字链表等)的性能与适用场景,帮助开发者根据项目规模选择最优解决方案。通过详细的技术分析和实战数据,揭示不同算法在万人同屏等极端场景下的表现差异,为MMORPG等大型多人在线游戏提供关键性能优化指南。 阅读详情

相关推荐

在AutoDL的A100云服务器上,用Docker搞定Sapien+RobotWin环境(附完整conda list)

本文详细介绍了在AutoDL的A100云服务器上使用Docker构建Sapien+RobotWin环境的完整指南。通过配置Vulkan渲染管线、精确复现Conda环境以及解决常见问题,帮助研究人员高效搭建稳定的机器人仿真开发环境,特别适合需要高性能GPU加速的复杂仿真任务。

weixin_30689307的博客 433

七天入门node.js(01)

10.2 [拆分http模块的实现原理,对request和response对象详解]16.2 [讲解app.route和express.Router]16.3 [讲解request新增属性和response对象详解]15[express简单构建(基于nodejs的web框架)]20[配合express使用mongodb(案例)]19.3 [配合express使用mongodb]19.3 [使用nodejs连接mongodb]6.3 [讲解入口文件(index.js)]

weixin_45311714的博客 391

TortoiseGit提示No supported authentication methods available错误

一、问题 在使用TortoiseGit与远程仓库进行同步代码的时候提示如下错误,即:没有支持认证的方法可用。而GitBash却可以正常使用,不受影响。 通过调查,发现应该是TortoiseGit远程仓库的公匙无法和本地的密匙进行匹配认证造成的(主要是TortoiseGit缺少本地密匙)。由于TortoiseGit的默认网络SSH client是TortoiseGitPlink.exe,如下图所示。因此主要有两种方式来解决该问题: 不修改TortoiseGit的默认网络SSH client,此时需要为To

Jeffxu_lib的博客 2万+

在服务器部署Next.js、Node.js项目,并实现自动部署(伪CI\CD)超详细

​最近Vercel服务不稳定,经常被墙,还是得整一个自己的服务器呀😭😭😭习惯了vercel的自动部署,那么自己的服务器也得安排上,走起。nuxt项目部署、NextJS项目部署、本文使用Webhook来进行自动部署。本文将带你从0到1进行服务器的配置与项目部署。(next项目部署、nuxt项目部署、node项目部署)超详细

m0_64130892的博客 9488

使用 AFL++ 对 IoT 二进制文件进行模糊测试 - 第一部分

American fuzzy lop 是一款面向安全的模糊测试器,它采用一种新型的编译时插桩和遗传算法,可以自动发现干净、有趣的测试用例,从而触发目标二进制文件中新的内部状态。这显著提高了模糊测试代码的功能覆盖率。AFL 的地址是它已经有一段时间没有更新了。虽然 AFL 仍然运行良好,但有一个新项目 AFL++,它是 AFL 的一个分支,包含许多改进和新功能。AFL++ 的地址是,其源代码位于。在本文中,我们将研究如何使用 AFL++ 对 IoT 二进制文件进行模糊测试。

技术超强的网络安全平台 1091

从零开始掌握机械臂运动控制:原理、建模与实践

本文系统介绍了机械臂运动控制的核心原理与实践方法。从运动学与动力学建模的基础理论出发,详细解析了经典PID控制与现代MPC(模型预测控制)算法的应用,并通过ROS与MATLAB仿真案例,指导读者从零开始实现机械臂的轨迹规划与精准控制,为工业自动化应用提供完整的技术路径。

weixin_29099217的博客 570

NodeJS是什么?

nodejs一种javascript的运行环境,能够使得javascript脱离浏览器运行。 “node.js是什么?”。有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东西”。如果这种晦涩解释还没把你搞晕,你没准会接着问:“为什么我们要用node.js?”,别人一般会告诉你:node.js有非阻塞,事件驱动I/O等特性,从而让高并发(high concurrency)在...

echo_s 快乐de小媛~ 823

最优化问题——一维搜索(一)

最优化问题——一维搜索 1. 一维搜索的引入 1.1 从非线性规划问题到一维搜索 在前面的文章中,我们提到了基于迭代的非线性规划问题的求解思路。在求解过程中,我们提到了在每一步的迭代中都需要对计算步长因子,其计算公式为: λk=minλf(xk+λp)λ_k=min_{λ}f(x_k+λp)λk​=minλ​f(xk​+λp) 我们将f(xk+λp)f(x_k+λp)f(xk​+λp)视为λ的一元函数,我们的目标就是求这个一元函数的极小值。对于这个问题,我通常的求解方式为一维搜索。 1.2 一维搜索的基本形

hei653779919的博客 7362

【node.js从入门到精通】如何将文件进行拆分重新写入,使用http模块写一个简易的服务端

本篇主要使用了node.js里面的http模块进行了一个服务端的一个简易的实现,并且使用了readFile,writeFile等方法进行了一个文件的分割,最后将分割后的文件进行了一个外链式的使用

zhaochen1127的博客 1142

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 505

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

1294

【前端开发-----NodeJS】nodejs快速入门教程,想要快速入门nodejs就看这一篇文章就够了,基础部分特详细,按要点整理知识点

nodejs快速入门教程,想要快速入门nodejs就看这一篇文章就够了,特详细的保姆级教程;基础部分特详细,按要点整理知识点;内容包括文件操作,路径处理,模块化,中间件,路由,身份认证,数据库操作,数据校验等等;用express框架快速搭建自己的后端服务器。

m0_67844671的博客 3万+

分级 API Key 的使用案例

分级 API Key 的使用案例 1. 背景介绍 1.1 问题由来 随着网络服务的普及,API(Application Programming Interface,应用程序编程接口)成为了连接不同系统和应用的关键桥梁。API Key(API密钥)

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 1022

七天学会NodeJS项目常见问题解决方案

七天学会NodeJS项目常见问题解决方案 7-days-nodejs 七天学会NodeJS 项目地址: https://gitcode.com/gh_mirrors/7d/7-days-nodejs ...

gitblog_00001的博客 876

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【亲测免费】 《七天学会NodeJS》教程

《七天学会NodeJS》是一本面向NodeJS新手的入门教程,涵盖了使用NodeJS开发各种程序所必要的知识。本教程旨在帮助初学者快速掌握NodeJS的基础知识和开发技能。 ## 项目快速启动 以下是一个简单的NodeJS应用示例,展示了如何快速启动一个NodeJS项目。 ### 安装NodeJS 首先,确保你的系统上已经安装了NodeJS。如果没有安装,可以从[NodeJS官方网站](htt...

gitblog_00878的博客 551

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

《七天学会NodeJS》项目教程:从零到精通的NodeJS学习指南

《七天学会NodeJS》是一个专为NodeJS初学者设计的开源教程项目,旨在通过七天的系统学习,帮助开发者快速掌握NodeJS的核心概念和实用技能。本教程采用循序渐进的方式,从基础概念到高级应用,全面覆盖NodeJS开发的各个方面。 ## 项目结构分析 ```mermaid graph TD A[7-days-nodejs] --> B[README.md] A --> C[i...

gitblog_00090的博客 350

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

七天学会NodeJS

七天学会NodeJS

杨名天吓 1139

windows下《七天学会NodeJS》学习笔记之一--NodeJS基础

什么是NodeJS。浏览器可以解析JS,NodeJS也可以解析JS,它就是一个JS的解析器。浏览器利用JS操作DOM,而NodeJS利用JS操作磁盘文件或搭建HTTP服务器。NodeJS的作者创造NodeJS的目的是为了实现高性能的Web服务器,所以他首先看重的是事件机制和异步IO模型的优越性。

fm2005的专栏 9354

NodeJS入门文档推荐

我觉得下面文章讲的非常不错,适合nodejs入门学习。七天学会NodeJS

taoerchun的专栏 2726

nodejs 前端 返回数组给_七天学会NodeJS系列教程之【异步编程】(五)

来源 |阿里巴巴国际站前端技术部NodeJS最大的卖点——事件机制和异步IO,对开发者并不是透明的。开发者需要按异步方式编写代码才用得上这个卖点,而这一点也遭到了一些NodeJS反对者的抨击。但不管怎样,异步编程确实是NodeJS最大的特点,没有掌握异步编程就不能说是真正学会了NodeJS。本章将介绍与异步编程相关的各种知识。回调在代码中,异步编程的直接体现就是回调。异步编程依托于回调...

weixin_42364301的博客 298

七天学会Node.js(汇总)

七天学会Node.js(汇总) 文章目录七天学会Node.js(汇总)1. NodeJS基础什么是NodeJS有啥用处如何安装安装程序编译安装如何运行权限问题模块requireexportsmodule模块初始化主模块完整示例二进制模块小结2. 代码的组织和部署模块路径解析规则包(package)index.jspackage.json命令行程序LinuxWindows工程目录NPM下载三方包安装命令行程序发布代码版本号灵机一点小结3. 文件操作开门红小文件拷贝大文件拷贝API走马观花Buffer(数据块)

qq_43456781的博客 1186

七天学会NodeJS:从零开始的JavaScript服务器端开发完整指南

想要快速掌握NodeJS服务器端开发吗?这个七天学习计划为你提供了一条清晰的学习路径!NodeJS作为JavaScript的服务器端运行时环境,让前端开发者能够使用熟悉的语言构建高性能后端应用。通过这个精心设计的七天教程,你将系统学习NodeJS的核心概念和实用技能,从基础安装到实际项目开发,一步步成长为合格的NodeJS开发者。 ## 🚀 第一天:NodeJS基础入门 开始你的NodeJS

gitblog_00299的博客 669
上一篇: 七天学会NodeJS-第一天
下一篇: Firebug入门指南
dreamjava9213
博客等级 码龄16年 7粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值