Extjs 使用技巧接龙

Ext 根据数据库返回json动态生成grid列表实例 Ext 根据数据库返回json动态生成grid列表实例 完整代码 立即下载
extjs Ext.form.ComboBox 的设置默认值的问题
Ext.onReady(function(){
var dbConnectionRecord = Ext.data.Record.create([
    {name: 'dbConnectionKey',type:"string",mapping:"dbConnectionKey"},
    {name: 'name',type:"string",mapping:"name"}
]);
var dataProxy=new Ext.data.HttpProxy({url:"<%=basePath%>getDBConnection.action"});
var theReader=new Ext.data.JsonReader({totalProperty: 'totalProperty',root:'root',id:"ecname"},dbConnectionRecord);
var dbstore=new Ext.data.Store({proxy:dataProxy,reader:theReader});
dbstore.load();
var dbcombo = new Ext.form.ComboBox({
id:'dbCombo',
renderTo:Ext.getBody(),
    store: dbstore,
    valueField:'dbConnectionKey',
   displayField:'name',
    typeAhead: true,
    emptyText:'请选择',
    readOnly : true,
    mode: 'local',
    name:"dbkey",
    hiddenName:'dbkey',
    editable: false,
    triggerAction: 'all',
    selectOnFocus:true
});
////dbcombo.setValue("4"); 肯定不行,参见后面的代码

});
 
实现:
写在store load的callback里

dbstore.load({
    callback : function(records) {
    dbcombo.setValue("4");
    }
    });
//在分页组件前面添加组件
var page = new Ext.PagingToolbar({
store: store,
displayInfo: true,
pageSize: 10
});
page.insert(0, '-');
page.insert(0, { //添加一个日期组件
xtype: 'datefield',
name: 'chatdate',
format: 'Y-m-d',
value: new Date()
});
//树节点(TreeNode)图标动态修改 2009-11-22 15:36:52
var ui = node.getUI();
ui.removeClass('x-tree-node-leaf'); //去掉之前的根节点样式
ui.addClass('x-tree-node-expanded'); //设定已展开文件夹样式
//ui.addClass('x-tree-node-collapsed');//设定合并的文件夹样式

使用Ext.Ajaxt对象完成异步请求的交互,Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)。
注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件。在该事件的回调函数里面判断
访问请求是否超时。使用Ext.Ajax对象的好处是,只需要引入一个包含了几行超时处理代码的js文件,就可以
为当前应用增加超时处理功能,原有代码不需要做任何修改。


使用Ext.Ajaxt对象完成异步请求交互,假如checkUserSessionStatus是你的回调方法,每个页面引用:

Js代码
Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this);
function checkUserSessionStatus(conn,response,options){
//Ext重新封装了response对象
if(typeof response.getResponseHeader.sessionstatus != 'undefined'){
//发现请求超时,退出处理代码...
}
}
Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); function checkUserSessionStatus(conn,response,options){ //Ext重新封装了response对象 if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ //发现请求超时,退出处理代码... } }可以利用的几个特*:
a)所有的ajax请求均带有x-requested-with:XMLHttpRequest头信息
b)Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)
c)注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件(概念类似spring的aop拦截)。


对于其他的ajax框架,解决用户访问请求超时这个问题的思路是类似的。

二、如何设置DateField的默认值。

设置DateField的默认值,可以直接给value属性赋值,如:value: '01/01/2009',如果要设置默认值为当天的日期,可以如下设置:value: new Date

1 new Ext.form.DateField({
2 id: 'df',
3 fieldLabel: '日期',
4 format: 'Y年m月d日',
5 width: 150,
6 //value: '01/01/2009'
7 value: new Date
8 })
如何禁用或者启用某个菜单
有的时候,有时会根据需要,启用或者禁用某个菜单项,在ExtJS中,可以通过如下的操作进行。





1 Ext.onReady(function() {
2 Ext.BLANK_IMAGE_URL = 'resources/images/default/s.gif';
3 Ext.QuickTips.init();
4 var tb = new Ext.Toolbar({
5 applyTo: 'tb',
6 width: 400
7 });
8 var styleMenu = new Ext.menu.Menu({
9 items: [{
10 text: '主题选择',
11 id: 'style',
12 menu: new Ext.menu.Menu({
13 items: [{
14 text: '红色主题',
15 checked: true,
16 group: 'theme'
17 }, {
18 text: '蓝色主题',
19 checked: false,
20 group: 'theme'
21 }, {
22 text: '黑色主题',
23 checked: false,
24 group: 'theme'
25 }]
26 })
27 }, {
28 text: '启用主题',
29 checked: true,
30 checkHandler: function() { Ext.getCmp('style').setDisabled(!this.checked) }
31 }]
32 });
33 tb.add({ text: '主题', menu: styleMenu });
34 });
一、从form中获取field的三个方法:

1、Ext.getCmp('id');

2、FormPanel.getForm().findField('id/name');

3、Ext.get('id/name');//前提是FormPanel在界面上显示出来了。



二、ExtJS如何给textfield赋值的三个方法:

var value="值";

1、 fs.form.findField(id/name).setValue(value);

2、 Ext.get(id/name).setValue(value);

3、 Ext.getCmp(id).setValue(value);



三、Ext grid中得到选择行的方法



在Ext grid中假设有一个名称为grid的对象。

(1)grid.getStore().getRange(0,store.getCount());//得到grid所有的行

(2)grid.getSelectionModel().getSelections()//得到选择所有行

(3)grid.selModel.selections.items;//得到选择所有行

(4)grid.getSelectionModel().getSelected();//得到选择行的第一行



四、formPanel组件load数据时combo的自动赋值

  combo有个hiddenName这个属*,这个属性是真正提交的值,在加载的时候你将这个属性的设置到reader中,就可以自动选择到指定的值了,比如说:hiddenName:'value',那么你的reader中就应该有一个{name:'value'}.

 

traceofsun 2010-07-26 14:08:33
8楼   

Grid 加入一个序号列

cm = new Ext.grid.ColumnModel([
////////////序号列
new Ext.grid.RowNumberer({
header : "序号",
width : 40,
renderer:function(value,metadata,record,rowIndex){
return  1 + rowIndex;
}
}), 
{
header: "货物编号",
dataIndex: 'CARGONO',
width: 100
},
{
header: "货物名称",
width: 150,
sortable: true,
dataIndex: 'CARGONAME'
},

traceofsun 2010-07-27 08:53:06
9楼   

Extjs Panel 上放子Panel实例
Ext.onReady(function(){
Ext.BLANK_IMAGE_URL = '/images/s.gif';
//Ext.chart.Chart.CHART_URL = '/js/extjs/3.0/resources/charts.swf';
Ext.QuickTips.init();
var p2 = new Ext.Panel({
autoShow: true, html:'zzz',title:'zzz',id:'zzz'
})
var p = new Ext.Panel({
title:'Test',
height:300,
width:600,
renderTo:Ext.getBody(),
layout:'accordion',
layoutConfig:{
animate:false,
activeOnTop: false,
fill:true
},
items:[
{xtype:'panel',html:'xxx',title:'xxx'},
{xtype:'panel',html:'yyy',title:'yyy'}
],
buttons:[
{
text:'add',
handler:function(){
p.add(p2);
p.doLayout();
}
},{
text:'remove',
handler:function(){
p.remove(p2,false);
p.doLayout();
}
}
]
})
});

traceofsun 2010-07-27 08:54:35
10楼   

Extjs Panel的使用:
var panel = new Ext.Panel({
title : "面板",
renderTo:"testPanel"//Panel的外层容器一般是DIV或SPAN的
id : "testPanel"
collapsible : true,// 可收缩
collapsed:false,//收缩的
width : 500,
height : 200,
autoScroll : true,// 自动卷轴
frame:true,//渲染框架
border : true,//边框
margins : '0 0 0 0',//边缘
split : true,// 分割条面板组合是经常用到
minHeight : 100,// 最小高度
autoHeight : true,//自动高度以下参数用于Panel的各个部位工具栏
tools : [{// 标题栏按钮
/*
* id常用参数表//已经定义好的按钮id * - toggle
* - close
* - minimize
* - maximize
* - refresh
* - minus
* - plus - help - search - save - print */
id : "refresh",
qtip : 'Refresh form Data',// 快速提示// hidden : true,
handler : function(event, toolEl, panel) {
// close logic }
}],// 标题栏按钮
tbar : [//工具条按钮
{
/* xtype参数用与匿名类创建(非常重要)
-tbfill填充空白
-tbseparator分割线
-tbtext文本说明
*/
xtype : 'tbtext',
text : '工具条'
},{//不指定xtype属性则默认为按钮(Button)
pressed : true,
text : '删除'
}],//工具条按钮
bbar : [//底部工具条
{
/* xtype常用参数
* -tbfill//填充空白
* -tbseparator//分割线
* -tbtext//文本说明
*/
xtype : 'tbtext',
text : '底部工具'
},{//不指定xtype属性是默认为按钮

extjs Ext.form.ComboBox 的设置默认值的问题
Ext.onReady(function(){
var dbConnectionRecord = Ext.data.Record.create([
    {name: 'dbConnectionKey',type:"string",mapping:"dbConnectionKey"},
    {name: 'name',type:"string",mapping:"name"}
]);
var dataProxy=new Ext.data.HttpProxy({url:"<%=basePath%>getDBConnection.action"});
var theReader=new Ext.data.JsonReader({totalProperty: 'totalProperty',root:'root',id:"ecname"},dbConnectionRecord);
var dbstore=new Ext.data.Store({proxy:dataProxy,reader:theReader});
dbstore.load();
var dbcombo = new Ext.form.ComboBox({
id:'dbCombo',
renderTo:Ext.getBody(),
    store: dbstore,
    valueField:'dbConnectionKey',
   displayField:'name',
    typeAhead: true,
    emptyText:'请选择',
    readOnly : true,
    mode: 'local',
    name:"dbkey",
    hiddenName:'dbkey',
    editable: false,
    triggerAction: 'all',
    selectOnFocus:true
});
////dbcombo.setValue("4"); 肯定不行,参见后面的代码

});
 
实现:
写在store load的callback里

dbstore.load({
    callback : function(records) {
    dbcombo.setValue("4");
    }
    });
回帖列表
回帖(15) | 浏览(35)
traceofsun 2010-07-27 10:41:48
11楼   

1、确保[{
xtype:'textarea',
id:'steno_subText',
width:300 }的textarea被创建了


2、
在a之前
加上这句
Ext.ComponentMgr.all.each(function(r){alert(r.id)});


Ext.getCmp("控件ID").setValue('1');

traceofsun 2010-07-27 22:31:30
12楼   

Ext ContentPanel中javascript函数的执行问题2007-08-02 09:33方法1:
ContentPanel.setUrl({url: Rt+'/jsp/formAndResult/511Form.jsp', scripts: true, text: '正在加载...'});
contentPanel.refresh();
方法2:
ContentPanel.load({url: Rt+'/jsp/formAndResult/511Form.jsp', scripts: true, text: '正在加载...'});
没有认真看API的,找了半天才发现的。

----------------------------ContentPanel刷新--------------------------------------------------------------

traceofsun 2010-08-03 21:12:40
13楼   

Ext.ux.ThemeChange = Ext.extend(Ext.form.ComboBox,{
editable : false,
displayField : 'theme',
valueField : 'css',
typeAhead : true,
mode : 'local',
triggerAction : 'all',
selectOnFocus : true,
initComponent : function(){
//定义主题名和主题样式的对应关系
var themes = [
['默认','ext-all.css'],
['深蓝心情','xtheme-slate.css'],
['灰色回忆','xtheme-gray-extend.css'],
['银色勾红','xtheme-silverCherry.css'],
['黑色水晶','xtheme-slickness2.css'],
['靛蓝情怀','xtheme-indigo.css'],
['黑色物语','xtheme-black.css']
];
this.store = new Ext.data.SimpleStore({
fields : ['theme','css'],
data : themes
});
this.value = '默认';
},
initEvents : function(){
//初始化事件
this.on('collapse',function(){//绑定组合框下拉列表的收缩事件
Ext.util.CSS.swapStyleSheet('theme','extlib/resources/css/'+this.getValue());//切换样式表
});
}
});

在下拉列表中加入一个默认的字段,修改该列表的load事件:
listeners : {
beforeload : function(ds, option) {
var para = {
tableName : 'SD_ENUM',
queryColumns : 'ENUM_VALUE',
returnColumns : 'ENUM_KEY,ENUM_VALUE',
conds : 'ENUM_ATTR='' + ds.enumAttr + '''
};
Ext.apply(para, ds.baseParams);
Ext.apply(para, option.params);
option.params.para = "[" + Ext.encode(para) + "]";
},
load : function(ds, records, options) {
var rd = Ext.data.Record.create([{
name : 'id'
}, {
name : 'name'
}]);
var oo = new rd({
'id' : null,
'name' : '<--空-->'
});
ds.insert(ds.getCount(), oo);
records.push(oo);
}
},

store排序:加入属*,
sortInfo : {
field : "id",
direction : "ASC"
}





五、ExtJS 重置表单的方法:

有三种方法能实现form表单的重置,假设var fs=new Ext.form.FormPanel({...});
(1)fs.form.reset();//重置form
(2)fs.getForm().getEl().dom.reset();//重置form
(3)Ext.getCmp('fs').form.reset();

3D Slicer中文教程(三)—数据加载及保存方式 1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表。 请注意,仅部分支持列出的某些格式。 ——对于一些更复杂的格式(特别是DWI),建议首先使用DICOM到n... 阅读详情

相关推荐

稳压电源的隐形战场:动态特性如何影响你的嵌入式系统稳定性

本文深入探讨了稳压电源动态特性对嵌入式系统稳定性的关键影响,分析了HT7533和AMS1117等稳压芯片在输入阶跃响应和负载瞬态响应方面的性能差异。通过实测案例展示了不同场景下的动态特性表现,并提供了针对工业控制、IoT设备和射频系统的选型指南与优化策略,帮助工程师解决电源相关的隐蔽故障。

weixin_29204205的博客 609

Ext 布局 最小宽度 最小高度

在一些复杂的布局中要设置最小宽度和最小高度很难,可以采取用iframe的方式将主页面嵌入其中然后再将该iframe设置最小宽度 最小高度 // 为 ie 释放内存 function winClose() { if (contentIframe) { contentIframe.document.write(""); contentIframe.document.clear();...

kakarot_java的博客 754

Zlib1.2.11源码编译(Win10+VS2019)

下载 下载网址: zlib Home Site 得到文件: 解压缩到“D:\SourceCodes\zlib-1.2.11” 使用CMake配置、生成并打开项目 将CMakeLists.txt拖入CMake,配置(Configure): 生成(Generate) 打开项目(Open Project),CMake调用VS2019打开项目 生成debug版本 构建项目ALL_BUILD。成功生成debug版本 在“D:\Sourc...

Alexabc3000的专栏 1893

extjs学习笔记(四)带分页的grid

很多时候,我们需要显示在grid中的数据不是短短的几条或者几十条,而是成千上万条。如果让大量的数据一股脑全都显示在一个页面中,可以想象会造成什么样的用户体验。因此,现在几乎所有的grid控件都会支持分页功能。extjs也不例外,它对分页也提供了强大而方便的支持,使得我们在分页处理上可以得心应手。    在extjs中,类Ext.PagingToolbar封装了关于分页的操作,该类从Toolbar继...

iteye_3928的博客 208

Oracle 11g R2 RAC 到单实例 Data Guard 搭建(RMAN备份方式)

Oracle RAC集群到单机的dataguard搭建过程

驰兔的博客 1722

PHP项目实战:易宝支付SDK对接全流程(含回调处理与常见问题排查)

本文详细介绍了PHP项目中易宝支付SDK的对接全流程,包括环境准备、SDK配置、支付请求构建与发起、回调处理实战以及常见问题排查。特别针对回调处理环节的常见问题提供了解决方案,帮助开发者快速完成支付对接并优化性能。

weixin_29007809的博客 387

Extjs中获取grid数据

(1)grid.getStore().getRange(0,store.getCount());    //得到grid所有的行  (2)grid.getSelectionModel().getSelections();        //得到选择所有行    注:如果不声明var sm = new Ext.grid.CheckboxSelectionModel();则会报此句没有该对象或属性Va...

扶摇而上九万里 4811

XTDrone——ALOAM与3D激光雷达三维SLAM(处理没有点云和坐标系报错的问题)

本文介绍了XTDrone中配置如何在三维环境中使用A-LOAM算法配合velodyneHDL32激光雷达包括依赖包安装、代码修改和PX4系统配置,以及相关报错细节的注意事项。

weixin_45390670的博客 1326

extjs遇到的问题以及解决方式

控制值变化时候,用.setValue而不用value因为直接用value将导致此属性不可改变。 一个控件只能放到一个form当中。 不能直接reset()而是用form.getForm.reset(); 动态控制提交的位置 formPanel.getForm().submit({url: 'differenturl.html'}) is not a classic submit; it u

leixingbang的专栏 1634

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 587

2026 蓝牙技术趋势展望:信道探测、Auracast、高吞吐 HID 与 AI 融合引领行业变革

蓝牙技术2026年展望:信道探测、Auracast广播音频和AI融合将引领创新。蓝牙信道探测技术将实现亚米级精确定位,在工业资产追踪和汽车数字钥匙领域大显身手。Auracast广播音频将持续拓展公共场所应用,提升音频包容性体验。高数据吞吐量和超低延迟功能将支持AR/VR等新兴场景。AI与蓝牙的深度融合将推动可穿戴设备智能化发展,实现实时健康监测和个性化音频服务。蓝牙技术凭借其多功能性和创新力,正成为连接万物的关键技术,持续推动行业变革和生活品质提升。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 113

大模型技术演进与垂直应用实战解析

Transformer架构作为现代大模型的基石,通过自注意力机制实现了长距离依赖建模。基于混合专家系统(MoE)和分组查询注意力(GQA)等创新,模型在保持性能的同时显著降低推理成本。在工程实践中,量化压缩、LoRA微调等技术有效解决了部署难题,使百亿参数模型能在消费级GPU运行。当前技术价值凸显于医疗、法律等垂直领域,其中医疗大模型诊断准确率达90%,法律大模型能自动生成合规合同条款。随着多模态交互和小型化部署的成熟,这些技术正加速渗透到会议纪要生成、企业知识库问答等场景,推动AI从通用智能向领域专家演进

weixin_30312563的博客 350

高通平台开发系列讲解(USB篇)MBIM协议详解

📢本文主要介绍高通平台USB网卡MBIM协议。

内核笔记 5438

ExtJS给textfield赋值的方法

ExtJS 给textfield赋值的方法总结  (1) fs.form.findField(id/name).setValue(value);  (2) Ext.get(id/name).setValue(value); 内容来自www.00isp.com (3) Ext.getCmp(id).setValue(value);  (4) Ext.getDom(id).value=valu

David 2148

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

解析Sencha Touch中Ext常用函数

Sencha Touch中Ext常用函数是本文要介绍的内容,主要是来学习Sencha Touch中EXT的函数的使用方法,ext常用函数分类:sencha touch 在框架中,Ext的常用静态方法: 1、Ext.setup:启动程序,配置参数onReay函数,该函数为程序入口 Ext.setup({  icon:'icon.png',  tabletStartupScreen:'table

精彩人生 589

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

EXTJS动态载入组件定义文件并初始化组件,动态构造界面的方法.

声明:原创文章,转载请留出处 先声明,动态载入的是一个类定义文件,比如,你扩展的窗口或诸如此类,可以很复杂,比如像我这样,就是某个界面. 难点在于: 使和ajax.request请求得到的脚本文件,被eval后,再用new产生组件,但问题在于这个生成的组件,却是无法传递出Request范围的,这是很郁闷的事,不然的话,就顺理成章的多. Ext.ajax.request的返回值是无...

dianmeilan7150的博客 261

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

js、Extjs中函数的赋值和调用

在这里面,当不点击id='win'的元素时,也会调用scrollFun()这个函数。其实scrollFun()函数在页面加载时就已经执行了。当点击时id='win'的元素时,反而报错了。 为什么? 原因是:Ext.get('win').on('click',function(){});因为这句代码是重写Extjs中的click事件,我们把新的函数赋值给click事件。红色标记的地方是正确的,因

masterShaw的博客 3560

ext理解

1、ext组件初始化 [code="js"] --constructor,构造函数初始化 TsGrid = Ext.extend(Ext.grid.GridPanel, { constructor : function(){ TsGrid.superclass.constructor.call(this, { /*your code*/ ...

nicelife19的专栏 199

Extjs 组件查找

1. 全局查找方式 2. 容器内查找 3. form查找子组件 4. 通用组件查找方式1、全局查找方式

LilyXFan的博客 2586

Extjs2.2 获取store中的totalProperty属性的值

经过debug发现后台传的totalProperty的值会存在totalLength中,totalProperty只是确定关联了那个字段,而这个字段的值存在totalLength中. 在Stroe加载的callback中可以获取到这个属性的值 转载于:https://www.cnblogs.com/mr-level/p/4576683.html...

asdf19890920的博客 378

EXTJS4 另一种给textarea赋值的方式

{ xtype:'textarea', readOnly:true,//只读属性 value: [store11.getAt(0).get("name")+"\n"+store11.getAt(0).get("password")+'\n'], width:1000, height:200, id:'single_...

水木小僧 1697

Ext.data.JsonStore的配置项中root和totalProperty的作用

两个配置分别表示了两个参数 如: totalproperty: "results", root:"rows" 表示后台传过来的参数以results开始,计算数据的总条数 以rows里的数据表示真实的数据 对应后台数据json的表示为: {results:12,rows:[{id:1,name:chenjun198812},{id:2,name:chenjun1988121}]} ...

simon 1391

Ext开发指南

EXT开发指南 目 录 一、 EXTJS框架下载: 2 二、 EXTJS使用… 2 页面引用... 2 ExtJS 调用... 2 组件体系下图所示:... 3 组件的使用... 4 组件的配置属性... 5 三、 各功能组件使用方法及介绍… 10 面板Panel 10 窗口Ext.W...

prxhlirr的博客 1518

ExtJS 3.2.1使用学习

Ext.onReady(function(){ // 弹出框,第一个参数为标题,第二个参数为显示内容 // Ext.MessageBox.alert('Title','Content text !'); // 含内容的窗口 // var win = new Ext.Window({ ...

ningDr的博客 932
上一篇: Extjs 入门资料
下一篇: 学习ExtJS Panel常用方法
traceofsun
博客等级 码龄21年 26粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值