手动搭建koa+ts项目框架(基础篇)

1.4 koa2改造为TS项目 一、安装相关依赖 npm install tslint typescript -g npm install @types/koa-logger @types/koa-router @types/koa-views -g npm install nodemon ts-node -g 二、配置package.json的script "scripts": { "start": "npm run serve", "serve": "nodemon src/app.ts --config 阅读详情


前言

为什么要使用Node.js+TypeScript

  • TypeScript是一个JavaScript超集。它集成了JavaScript特性,并具有静态类型和类型检查等补充特性。
  • Node.js是非常流行的JavaScript框架。Node.js有一个强大的NPM(Node Package Manager)生态系统,提供开源代码(包),你可以在你的任何Node.js项目中使用。
  • Node.js非常适合制作服务器端应用程序,但它缺乏一些现代组件,如类型检查。Node.js的代码库也可能非常难以维护。
  • Typescript支持现代编码风格,如静态类型和类型检查。它是为构建广泛和高水平的应用程序而制作的。
  • 这使得你可以用强大的类型检查来编写基于服务器端的应用程序,这使得你可以避免运行时的类型错误和其他Typescript的优势,并充分利用Node.js的优势。

一、TS配置文件

1、全局安装TypeScript

安装typescript到全局

npm i typescript -g

查看安装版本

tsc --version

在这里插入图片描述

2、项目根目录创建Typescript配置文件

  • 新建./src/indexts文件
  • 初始化tsconfig.json文件
tsc --init
  • 根据实际需要修改配置文件

例如
rootDir:“/src”指定项目编译入口,实际指定./src/index.ts文件
outDir: "./dist"指定输出文件夹为dist
compilerOptions(编译器选项)同级新增exclude(排除)配置如下

{
	"compilerOptions": {
		...
		"module": "commonjs",                                /* Specify what module code is generated. */
	    "rootDir": "./src",                                  /* Specify the root folder within your source files. */
	    "moduleResolution": "node10",                     	 /* Specify how TypeScript looks up a file from a given module specifier. */
	    "outDir": "./dist",                                  /* Specify an output folder for all emitted files. */
	},
	"include": [
	   "src/**/**.ts",
	],
	"exclude":[
	    "./node_modules"
	  ]
}

在这里插入图片描述

二、项目初始化配置文件(package.json)

1、初始化配置文件

项目根目录执行命令npm init
在这里插入图片描述

2、安装依赖

koa框架

npm i koa -S
and
npm i @types/koa -D // 支持TS

使用es6的import导入模版

如果项目使用require需要安装@types/node让项目支持require导入模块

npm i @types/node -S

require与import的区别

  • 1、require是CommonJS规范的模块化语法,import是ECMAScript 6规范的模块化语法;
  • 2、require是运行时加载,import是编译时加载;
  • 3、require可以写在代码的任意位置,import只能写在文件的最顶端且不可在条件语句或函数作用域中使用;

在这里插入图片描述

三、开启简单的服务API

入口文件

/src/index.ts文件

import Koa from "koa";

const app = module.exports = new Koa();

app.use(async function (ctx: Koa.Context) {
  ctx.body = 'Hello World';
});
if (!module.parent) app.listen(3000);

新增脚本

  • package.json
    新增build脚本(先使用tsc转译TS为JS,然后使用node命令开启编译后的js文件)
{
  ...
  "scripts": {
    "build": "tsc && node ./dist/index.js",
    ...
  },
  ...
}
  • 执行npm run build
    在这里插入图片描述
  • 可看到成功生成dist文件
    在这里插入图片描述
  • 打开浏览器访问localhost:3000
    在这里插入图片描述

总结

按照上述步骤操作,即可开启TS+Koa项目啦~

如有启发,可点赞收藏哟~

koa-ts:使用 ts 和 Ioc 方式在 koa2 上完成服务开发 简介 使用 ts + koa2 + 装饰器 完成服务端功能开发 核心代码介绍 Reflect Metadata 资料介绍: Reflect Metadata 可以在声明的时候对对象添加元数据。通过这种方式添加对元数据,不会对对象原始对数据结构产生影响 一些基础库源码如 vue-class-component、Angular 均使用了 Reflect Metadata ,有兴趣的可以深入源码学习下。 在使用的时候必须安装此模块 npm i reflect-metadata --save 注意 TIPS: 实例方法与静态方法取元数据是不同的,实例方法需要在类的实例上取元数据,静态方法直接在类上取元数据。 完成功能 ts + koa 基础框架搭建和配置 中间件根据配置文件,自动化热加载 增加 controller,router 装饰器,实现通过装饰器配置路由地址 使用 git clone htt 立即下载

相关推荐

koa-ts-controllers:由Koa 2+驱动的轻型Typescript REST库。 使用类和装饰器定义您的API。 从ctx注入参数。 支持API版本控制。 将来对OpenAPI3的支持。 与koa-router一起使用

koa-ts-controllers koa-ts-controllers是用于KoaJS v2 +和Typescript的下一代路由和控制器系统。 使用ES8类和装饰器定义REST API端点。 将参数注入到端点处理程序中,从而有效地将控制器操作转变为服务操作。 这样可以创建干净的,具有自文档说明的API端点,并使其可以在其他地方重用这些服务操作。 这也使您的端点操作更易于测试。 支持Koa-ts控制器 Koa-ts-controllers是MIT许可的开源项目,其持续的开发完全有赖于这些出色的支持者的支持。 如果koa-ts-controllers帮助您构建了很棒的API,请考虑

koa +ts 搭建简单项目

Step 1 创建基础和安装依赖 mkdir <project-name> cd <project-name> git init // 初始化 git 配置文件 mkdir src // 安装依赖 npm init // 初始化 package.json npm i koa koa-router npm i --save-dev typescript ts-node nodemon npm i --save-dev @types/koa @types/koa-router

WJLcomeon的博客 4194

【R】非参数秩和检验(Kruskal-Wallis H)与事后多重比较邓肯检验(Dunn‘s Test)及自动字母标记

非参数检验-Kruskal-Wallis H检验-多个独立样本秩和检验-事后两两比较-邓肯检验(Duncan's test)

captain_keating的博客 6535

koa2改造为TS项目【优化版】

借鉴作者 LesStudy.在他的基础上,快速搭建自己node微服务。

qq_24937505的专栏 1212

Allegro17.2 出gerber文件详细流程 - 干货

Allegro17.2 出gerber文件详细流程 - 干货

u010614434的博客 1万+

使用YOLOv5进行工业检测(如裂纹、划痕、破损等)

本文将详细介绍如何使用YOLOv5实现工业检测项目,以检测生产线上的缺陷产品,如裂纹、划痕、破损等。我们将分步介绍数据准备、模型训练、模型优化和部署等过程。

a871923942的博客 2528

手动搭建koa+ts项目框架(mysql篇)

本文基于手动搭建koa+ts项目框架(路由篇)新增mysql使用TS版本需使用mysql2插件,mysql只支持js版本的还需安装插件,方便解析请求值(或者使用koa-body。

失眠时间的博客 967

在 ABAP SEGW OData 服务里,把 Function Import 参数长度校验真正跑起来

SAP Gateway服务中Function Import参数长度校验的实现机制解析:在SEGW中定义Max Length参数后,需通过模型特性USE_STRICT_FUNCTION_PARAM_CHK(7.52+版本支持)启用严格检查。该特性需在MPC_EXT的DEFINE方法中设置,框架会在URI解析阶段拦截超长参数,避免错误进入业务逻辑。对于低版本系统,建议在应用层手动添加校验。这种模型驱动的方式符合Clean Core原则,能有效提升接口健壮性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 493

手动搭建koa+ts项目框架(日志篇)

本文基于手动搭建koa+ts项目框架(路由篇)新增日志记录根据koa-logger依赖,可记录实际用户访问的接口记录~

失眠时间的博客 872

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 183

手把手教你学simulink(8.3)--实例:基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真

基于 Simulink 的自动驾驶汽车速度控制系统设计与仿真。

MHD0815的博客 1208

手动搭建koa+ts项目框架(路由篇)

本文基于手动搭建koa+ts项目框架(基础篇)配置接口路由根据不同模块拆分多个routes是的代码更加清晰,易于维护~

失眠时间的博客 1190

26届数字IC秋招笔试面试全攻略-UVM验证方法学精要

本文介绍了数字IC验证中UVM方法学的核心内容,包括组件架构、Sequence机制和寄存器模型。UVM提供env、agent、driver等组件构建验证环境;Sequence机制通过item、sequence和sequencer实现激励生成与控制;寄存器模型则通过reg_block、reg等组件管理DUT寄存器。文章详细说明了各模块的功能、交互关系和代码实现,为IC验证工程师提供了完整的UVM应用指南,重点突出了验证环境的搭建方法、激励生成流程和寄存器抽象技术。这些内容是数字IC秋招笔试面试中的高频考点。

2301_79143213的博客 725

Nodejs-Koa基于分层理念的框架搭建(附完整TS源码)

自己用Typescript搭建的分层式开发后端框架,分享给小伙伴们。附有源码哦!

PP的痛 1804

RK3568平台开发系列讲解(安卓篇)LED呼吸灯系统流程

1.app层封装后使用NotificationManager发出:NotificationManager.notify() 2.Android 系统架构中:一个manager类对应一个aidl接口,一个manager对应一个底层的服务,notification也是这个架构

内核笔记 3646

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Koa-TS 开源项目教程

Koa-TS 开源项目教程 项目介绍 Koa-TS 是一个基于 TypeScript 的 Koa 框架扩展项目,旨在提供更加现代化和类型安全的开发体验。Koa 本身是一个轻量级的 Node.js 框架,而 Koa-TS 通过引入 TypeScript 的支持,使得开发者可以在编写代码时享受到类型检查和代码提示的好处。 项目快速启动 环境准备 在开始之前,请确保你已经安装了 Node.js 和 np...

gitblog_00088的博客 918

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

手动搭建koa+ts项目框架(swagger文档篇)

文章目录一、安装依赖二、直接使用json文件生成三、根据对应api注释生成新建`swagger.ts`文件新建`./routes/users.ts`文件入口文件引入对应数据`如有启发,可点赞收藏哟~` 一、安装依赖 swagger-jsdoc 读取您的JSDoc带注释的源代码并生成OpenAPI (Swagger) 规范 koa2-swagger-ui 根据配置生成swagger界面 npm i swagger-jsdoc koa2-swagger-ui -S and npm i @types/swa

失眠时间的博客 1086

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ts+koa项目搭建

搭建步骤 1. 初始化项目 npm init npm i koa koa-router npm i --save-dev typescript ts-node nodemon npm i --save-dev @types/koa @types/koa-router 2. 新建 tsconfig.json 在项目根目录,新建tsconfig.json,并加入内容。 3. 创建server.ts 要使你的服务“跑”起来,在刚建立的src文件夹上新建server.ts,作为此应用的入口,在此文件中加入内容。

syy2668的博客 2954

手动搭建koa+ts项目框架(ts项目实现开发阶段实时查看)

上篇文章记录了手动简单搭建koa+ts项目步骤虽然可以直接编译后并开启服务,但如果修改./src内的文件,没法实时编译以下介绍使用其他方法实现实时效果。

失眠时间的博客 1042

探索TypeScript下的Koa之力 —— koa-ts项目深度解读

探索TypeScript下的Koa之力 —— koa-ts项目深度解读 在现代web开发领域,追求高效、安全和可维护的代码成为了一种趋势,特别是在Node.js生态系统中,Koa以其轻量灵活的特点受到了广大开发者喜爱。今天,让我们一同深入探索【koa-ts】——一个旨在提供使用TypeScript构建Koa2项目的最佳实践方案,让TypeScript的强大类型系统与Koa的优雅结合,引领您步入高效...

gitblog_01010的博客 593

koa ts kick off 搭建项目的基本架子

koa ts kick off 使用ts开发koa项目的基本架子,便于平时随手调研一些技术

问白的博客 848

手动搭建koa+ts项目框架(部署服务器使用pm2启动,并设置相关环境变量)

手动搭建koa+ts项目框架(部署服务器使用pm2启动,并设置相关环境变量)

失眠时间的博客 1025

搭建Koa+Typescript项目

1.搭建Koa+Typescript项目 1.创建Node项目 npm init --y 2.生成配置tsconfig.json: 为了在node中使用ts,首先安装ts,但是安装的ts代码不能直接执行,需要转换成js代码后才能执行,使用webpack可用webpack的ts-loader来转换,不使用webpack就用ts-node来转换;tsc --init用于生成tsconfig.json配置文件 npm install typescript ts-node --save-d tsc --init

qq_45189315的博客 1701

手动搭建koa+ts项目框架(apidoc文档篇)

详细可/*** example* example* example* example* example。

失眠时间的博客 953

使用TypeScript构建高效Koa应用:koa-ts

使用TypeScript构建高效Koa应用:koa-ts 项目介绍 koa-ts 是一个基于 TypeScript 和 Koa2 的现代化Web应用框架,致力于提供最佳实践和结构化的项目模板。这个项目旨在简化开发流程,使开发者能够快速地搭建、测试和部署高质量的应用程序。它包含了完整的目录结构、依赖注入系统以及强大的数据模型管理,让您的代码更加清晰和易于维护。 项目技术分析 koa-ts 引入了几个...

gitblog_00085的博客 754

Koa2 与 TypeScript 的最佳实践——koa-ts

Koa2 与 TypeScript 的最佳实践——koa-ts koa-ts 是一个开源项目,旨在展示如何使用 TypeScript 构建 Koa2 应用程序的最佳实践。该项目的主要编程语言是 TypeScript,它为 Koa2 框架提供了类型安全性和现代化的编程体验。 项目基础介绍 koa-ts 项目提供了一个结构化的起点,帮助开发者以 TypeScript 为基础,构建高效、可维护的 Koa...

gitblog_01071的博客 495
上一篇: Linux服务器mysql连接问题记录
下一篇: 手动搭建koa+ts项目框架(ts项目实现开发阶段实时查看)
失眠时间
博客等级 码龄7年 9134粉丝 113原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值