ExtJS EditorGridPanel 控制每一个单元格是否可以编辑

保姆级教程:用rosbag录制和回放你的第一个ROS机器人数据(附C++/Python代码) 本文提供了一份详细的ROS机器人数据录制与回放教程,涵盖从命令行操作到C++/Python编程实现的全流程。通过rosbag工具,开发者可以高效记录和回放机器人运行时的传感器数据和控制指令,适用于故障复现、算法调试等多种场景。教程还包含高级技巧如时间同步和大文件处理,帮助用户快速掌握ROS数据管理核心技能。 阅读详情


//loginUser 为当前登录人 

//loginUser = '6651';
Ext.onReady(function() {
Ext.QuickTips.init();
//空或零 返回 true
function isNullORZero(value){
return (value == 0 || value == '')?true:false;
}
//将输入分数保存为只有两位小数
function checkFloat(v) {
var rg = /^\d+(\.\d{1,2})?$/;
var value = v;
if ((Number(value) == 0)) {
return formaFloat(value);
} else if (!rg.test(value)) {
value = Math.round(value * Math.pow(10, 2)) / Math.pow(10, 2);
}
return value;
}
// 自动格式化为float类型数据
function formaFloat(s) {
if (/[^0-9\.]/.test(s))
return "0.0";
if (/^[0-9]+$/.test(s))
s += '.';
if (/^[0-9]+\.$/.test(s))
s = s + '0';
if (/^\.[0-9]/.test(s))
s = '0' + s;
return s;
}
var ajaxMask = new Ext.LoadMask(Ext.get('mainfrom'), {
msg : "数据发送中,请稍后..."
});


/*
* 当前打分领导            stepCode                打分                     当前登录人                   
* A             ManAuditEval1           score2           A                
* B             ManAuditEval2           score3           B
* C             ManAuditEval3           score4           C
* D             ManAuditEval4           score            D

* 满足以上条件才能选中
*/
function onRowSelected(o, rowIndex, r) {
var score;
switch(r.get('stepCode')){
case 'ManAuditEval1' : score = r.get('score2'); break;
case 'ManAuditEval2' : score = r.get('score3'); break;
case 'ManAuditEval3' : score = r.get('score4'); break;
default : score = r.get('score');
}
if(r.get('currentUser') != loginUser || isNullORZero(score)){
o.deselectRow(rowIndex);
}
};


function onRowDeSelected(o, rowIndex, r) {
};


var sm = new Ext.grid.CheckboxSelectionModel({
handleMouseDown : Ext.emptyFn,
listeners : {
"rowselect" : onRowSelected,
"rowdeselect" : onRowDeSelected
}
});


var jsonData = {"totalProperty":4,"dataList":[
            {"auditEmpNumber":"48210127","empId":"6528","position":"蜀汉昭烈帝","status":"",
                "score4":"0.0","score3":"0.0","score2":"0.0","score1":"98.0","score":"0.0","stepCode":"ManAuditEval1",
                "empNumber":"48210037","selfScore":"98.0","caseId":"414053","prevAudit":"6651","empName":"刘备","currentUser":"6651"}
                
           ,{"auditEmpNumber":"48210127","empId":"6645","position":"东汉丞相","status":"未确认",
"score4":"0.0","score3":"0.0","score2":"97.0","score1":"98.0","score":"0.0","stepCode":"ManAuditEval2",
"empNumber":"48210121","selfScore":"98.0","caseId":"414078","prevAudit":"6651","empName":"曹操","currentUser":"6651"}

,{"auditEmpNumber":"48210127","empId":"6670","position":"东吴太祖大皇帝","status":"未确认",
"score4":"96.0","score3":"91.0","score2":"94.0","score1":"97.0","score":"0.0","stepCode":"ManAuditEval4",
"empNumber":"48210146","selfScore":"97.0","caseId":"414030","prevAudit":"6651","empName":"孙权","currentUser":"6652"}

,{"auditEmpNumber":"48210127","empId":"8072","position":"曹魏高祖文皇帝","status":"",
"score4":"92.0","score2":"96.0","score1":"95.0","score":"0.0","score3":"90.0","stepCode":"ManAuditEval4",
"empNumber":"48520003","selfScore":"95.0","caseId":"414060","prevAudit":"6651","empName":"曹丕","currentUser":"6651"}]
};
var cm = new Ext.grid.ColumnModel([sm, {
header : 'empId',
dataIndex : 'empId',
hidden : true
}, {

header : 'caseId',
dataIndex : 'caseId',
hidden : true
}, {
header : 'stepCode',
dataIndex : 'stepCode',
hidden : true
}, {
header : '员工编号',
dataIndex : 'empNumber'
}, {
header : '员工姓名',
dataIndex : 'empName',
sortable : true
}, {
header : '员工职位',
dataIndex : 'position',
sortable : true,
width : 180
}, {
id : 'selfScore',
header : '员工自评分',
dataIndex : 'selfScore',
renderer : function(v, c, r, ri, ci, str) {
return checkFloat(v);
}
//多个领导打分,并展示结果 
/*
* 当前打分领导            stepCode                打分                     当前登录人                   
* A             ManAuditEval1           score2           A                
* B             ManAuditEval2           score3           B
* C             ManAuditEval3           score4           C
* D最终                        ManAuditEval4           score            D

* 满足以上条件才能打分
*/
}, {
id : 'score2',
dataIndex : 'score2',
header : '领导打分一',
editable : false,
editor : new Ext.form.TextField({
allowBlank : false,
name : 'score1',
regex : /^(?:\d?\d(\.\d{1,2})?|100|0.0|100.0|0.00|100.00)$/,
regexText : '请输入0~100的数字!'
}),
renderer : function(v, m, r, ri, ci, str) {
var isUser = r.get('currentUser') != loginUser;
if(r.get('stepCode') == 'ManAuditEval1'){
cm.setEditable(ci,true);
if(isUser){
m.css += "x-item-disabled";
}
} else {
m.css += " x-item-disabled";
}
return checkFloat(v);
},
hidden : false
}, {
id : 'score3',
dataIndex : 'score3',
header : '领导打分二',
editable : false,
editor : new Ext.form.TextField({
allowBlank : false,
name : 'score3',
regex : /^(?:\d?\d(\.\d{1,2})?|100|0.0|100.0|0.00|100.00)$/,
regexText : '请输入0~100的数字!'
}),
renderer : function(v, m, r, ri, ci, str) {
var isUser = r.get('currentUser') != loginUser;
if(r.get('stepCode') == 'ManAuditEval2'){
cm.setEditable(ci,true);
if(isUser){
m.css += "x-item-disabled";
}
} else {
m.css += "x-item-disabled";
}
return checkFloat(v);
},
hidden : false
}, {
id : 'score4',
dataIndex : 'score4',
header : '领导打分三',
editable : false,
editor : new Ext.form.TextField({
allowBlank : false,
name : 'score3',
regex : /^(?:\d?\d(\.\d{1,2})?|100|0.0|100.0|0.00|100.00)$/,
regexText : '请输入0~100的数字!'
}),
renderer : function(v, m, r, ri, ci, str) {
var isUser = r.get('currentUser') != loginUser;
if(r.get('stepCode') == 'ManAuditEval3'){
cm.setEditable(ci,true);
if(isUser){
m.css += "x-item-disabled";
}
} else {
m.css += "x-item-disabled";
}
return checkFloat(v);
},
hidden : false
}, {
id : 'score',
header : '部门领导打分',
dataIndex : 'score',
editable : false,
editor : new Ext.form.TextField({
allowBlank : false,
name : 'score',
regex : /^(?:\d?\d(\.\d{1,2})?|100|0.0|100.0|0.00|100.00)$/,
regexText : '请输入0~100的数字!'
}),
renderer : function(v, m, r, ri, ci, str) {
//alert(r.get('stepCode'));
var isUser = r.get('currentUser') != loginUser;
if(r.get('stepCode') == 'ManAuditEval4'){
cm.setEditable(ci,true);
if(isUser){
m.css += "x-item-disabled";
}
} else {
m.css += "x-item-disabled";
}
return checkFloat(v);
},
hidden : false
}, {
header : '考核状态',
dataIndex : 'status',
renderer : function(v, c, r, ri, ci, str) {
var isUser = r.get('currentUser') == loginUser;
//alert(isUser); isNullORZero 
var str;
switch(r.get('stepCode')){
case 'ManAuditEval1' : (isNullORZero(r.get('score2'))&& isUser)?str = '考核尚未打分':str = '考核已打分'; break;
case 'ManAuditEval2' : (isNullORZero(r.get('score3'))&& isUser)?str = '考核尚未打分':str = '考核已打分'; break;
case 'ManAuditEval3' : (isNullORZero(r.get('score4'))&& isUser)?str = '考核尚未打分':str = '考核已打分'; break;
default : (isNullORZero(r.get('score')) && isUser)?str = '考核尚未打分':str = '考核已打分';
}
//alert('考核状态:' + str);
return str;
}
}, {
header : 'auditEmpNumber',
dataIndex : 'auditEmpNumber',
hidden : true
}, {
header : '当前审批人',
dataIndex : 'currentUser',
hidden : true
}]);


// 页面数据加载
var store = new Ext.data.Store({
url : '/gatherEMPAppraisalAction.do?method=gatherAppraisalByMa',
reader : new Ext.data.JsonReader({
totalProperty : 'totalProperty',
root : 'dataList',
fields : ['empId', 'caseId', 'empNumber',
'empName', 'position', {
name : 'selfScore',
type : 'float'
}, {
name : 'score',
type : 'float'
}, 'score1','score2', 'score3', 'score4', 'status','isCellEditable',
'grade', 'auditEmpNumber', 'currentUser',
'stepCode', 'nextStepId', 'nextStepName']
})
});


// 改成可编辑的grid
var grid = new Ext.grid.EditorGridPanel({
//title : '考核汇总打分',
bodyStyle : 'width:100%',
height : document.body.clientHeight - 240,
loadMask : {
msg : '正在加载数据,请稍候!'
},
frame : true,
autoScorll : true,
cm : cm,
sm : sm,
store : store,
renderTo : 'mainfrom',
buttonAlign : 'center',
clicksToEdit : 1,
buttons : [{
cls : 'x-btn-text-icon blist',
icon : '/style/default/images/button_ok.png',
text : '提交审批结果',
handler : submitEval
}],
tbar : [{
text:'结束考核任务',
cls : 'x-btn-text-icon blist',
icon : '/style/default/images/button_ok.png',
tabTip : '全部人员审批完成,才能结束考核任务' ,
handler : finish
}]
});
grid.getStore().loadData(jsonData,true);

//当前单元格是否可以编辑  
/*
* 当前打分领导            stepCode                打分                     当前登录人                   
* A             ManAuditEval1           score2           A                
* B             ManAuditEval2           score3           B
* C             ManAuditEval3           score4           C
* D             ManAuditEval4           score            D

* 满足以上条件才能编辑
*/
grid.on('beforeedit',function(e){
var isUser = e.record.get('currentUser') != loginUser;
//alert(e.record.get('currentUser') != loginUser);
//alert("field: " + e.field + "  ,stepCode: " + e.record.data.stepCode);
   var _field;
switch(e.record.get('stepCode')){
case 'ManAuditEval1' : _field = 'score2'; break;
case 'ManAuditEval2' : _field = 'score3'; break;
case 'ManAuditEval3' : _field = 'score4'; break;
default : _field = 'score';
}
/* alert("_field: " + _field.toString());
alert("e.field: " + e.field.toString());
alert(_field.toString() == e.field.toString());*/
if(_field.toString() != e.field.toString() || isUser){
e.cancel = true;
}
});
function loadCallback(store, rd, op) {
var records = new Array();
var index = 0;
for (var i = 0, j = rd.length; i < j; i++) {
records[index++] = rd[i]
}
}
// 是否可以结束当前汇总任务
/*
*   流程状态stepCode    打分保存字段
*    ManAuditEval1       score2
*    ManAuditEval2       score3
*    ManAuditEval3       score4
*    ManAuditEval4       score
*  说明:提交打分后状态会变,所以要取值为上一个状态的打分值
*/
function finish(){
var o = {};
var m = '';
var count = 0;
for (var i = 0; i < store.getCount(); i++) {
var r = store.getAt(i);
var _score;
var _isUser = r.get('currentUser') == loginUser;
switch(r.get('stepCode')){
case 'ManAuditEval1' : _isUser?_score = r.get('score2'):_score = r.get('score'); break;
case 'ManAuditEval2' : _isUser?_score = r.get('score3'):_score = r.get('score2'); break;
case 'ManAuditEval3' : _isUser?_score = r.get('score4'):_score = r.get('score3'); break;
default : _isUser?_score = r.get('score'):_score = r.get('score4');
   }
   //isNullORZero
   //if (r.get('selfScore') == '' || _score == '' || r.get('selfScore') == 0 || _score == 0) {
   if(isNullORZero(r.get('selfScore')) || isNullORZero(_score)){
o.msg = (o.msg || '') + '、' + r.data['empName'];
}
if ((_score != '' && _score != 0) && r.get('currentUser') == loginUser) {
m = m + '、' + r.data['empName'];
o.msg = (o.msg || '') + '、' + r.data['empName'];
}
}
//alert('o.msg : '+o.msg);
//alert('m :'+m+'@@');
if (m != '') {
o.msg = '员工:' + m.substring(1) + '的考核尚未提交!'
} else {
o.msg = '员工:' + o.msg.substring(1) + '的考核尚未打分!'
}
alert(o.msg);
}

var normal = [];
var tmp = [];
// 提交
function submitEval() {
var canSubmit;
var res = sm.getSelections();
var nextAuditor = [];
var nextStep = [];


if (res.length == 0) {
Ext.Msg.alert("提示", "请选择一条记录进行提交!");
return;
} else {
batchAudit();
}
}
// 提交方法
function batchAudit() {
var loadingCtr = Ext.Msg.wait("数据提交中,请稍等");
var res = sm.getSelections();
var evl = []; // 需要选择提交的Id
for (var i = 0; i < res.length; i++) {
var r = res[i];
var o = {};
o.empId = r.data['empId'];
o.caseId = r.data['caseId'];
o.empNumber = r.data['empNumber'];
o.empName = r.data['empName'];
o.position = r.data['position'];
o.selfScore = checkFloat(r.data['selfScore']);
o.score = checkFloat(r.data['score']);
o.auditEmpNumber = r.data['auditEmpNumber'];
o.grade = r.data['grade'];// add 9-8-26
o.stepCode = r.data['stepCode'];
o.nextStepId = r.data['nextStepId'];
// o.nextStepName = r.data['nextStepName'];
evl.push(o);
}


var json = encodeArray(evl);
ajaxMask.show();
Ext.Ajax.request({
url : '/Action.do?method=method',
method : 'POST',
params : {
periodId : periodId,
json : json
},
success : function(response, options) {
var rst = Ext.decode(response.responseText);
if (rst.success == 'false') {
Ext.Msg.alert('提示', rst.message);
} else {
store.reload();
}


if (nextAuditor_win && nextAuditor_win.isVisible())
nextAuditor_win.hide();
if (nextStep_win && nextStep_win.isVisible())
nextStep_win.hide();
loadingCtr.hide();
ajaxMask.hide();
},
failure : function() {
loadingCtr.hide();
ajaxMask.hide();
}
});
}


var vp = new Ext.Viewport({
layout : 'fit',
items :  [grid]
});


})
Silvaco Atlas(五)——物理模型总结 物理模型总结 阅读详情

相关推荐

投研必备工具:Wind(万得)数据库快速入门

Wind数据库对于金融从业者来说是必不可少的一个软件,本文主要介绍了股票和债券的信息查找,帮助后续对数据进行分析,开始学习吧!

weixin_56581108的博客 10万+

extjs基础

Ext.Panel API翻译 activeItem : String/Number 用于设置当前活动的子组件,取值为此子组件的序号或者是id。但是它只能应用于那种一次只能显示一个子组件的布局类,例如:Ext.layout.Accordion, Ext.layout.CardLayout和Ext.layout.FitLayout。

zidasine的专栏 1458

innovus:addRepeaterByRule用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?addRepeaterByRule不管transition/timing violation,只根据约束的length/cap/fanout等等去给net 插buffer。

m0_61544122的博客 1047

ExtJS 动态设置Grid列是否编辑

Ext JS Library 2.2.1 正确: var cm = Ext.getCmp(‘Grid').getColumnModel(); cm.setEditor(cm.findColumnIndex('TestColumn'), new Ext.grid.GridEditor(new Ext.form.NumberField({ all...

weixin_34331102的博客 1170

extjs EditorGridPanel禁止某些单元格编辑

EditorGridPanel加上listeners 'cellclick' : function(grid, rowIndex, columnIndex, e) { var record = grid.getStore().getAt(rowIndex); if(record.get('editable') == 'N' && columnIndex == 2) return f

嘻嘻哈哈的专栏 1万+

ext 不能修改 输入框_ExtJs使得某一列不能编辑

可以编辑的gridvar grid = new Ext.grid.EditorGridPanel({autoHeight: true,renderTo: 'grid',store: store,cm: cm,tbar: new Ext.Toolbar(['-', {text: '添加一行',handler: function(){var initValue = {id:'',name:'',des...

weixin_39969006的博客 362

Extjs grid表格根据条件判断某行是否编辑

//grid编辑 var grid = Ext.getCmp('gridMain'); grid.addPlugin( Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ); //单元格禁止编辑 grid.addListener...

樱花园丁 2160

控制EditorGridPanel的某个单元格(cell)是否被禁用

gridpanel有一个beforeedit属性,可以实现对单元格的禁用 vargrid=newExt.grid.EditorGridPanel({ //gridpanel的内容 }); grid.on("beforeedit",function(e){ vardateUnit=e.record.d...

weixin_34212762的博客 252

Extjs EditorGridPanel 编辑时支持方向键

在用 extjs editorgridpanel 进行输入编辑的时候, 默认情况下只支持使用 tab 键可以实现焦点切换, 如果想让editorgridpanel编辑时通过方向键来实现焦点跳转切换,只需加上以下代码: //让grid支持方向键盘 by liongis@163.com Ext.override(Ext.grid.CellSelectionModel, { onE...

weixin_34206899的博客 207

EditorGridPanel中 根据行记录的值决定某行或者某行中的哪些列是否可以编辑

EditorGridPanel中 根据行记录的值决定某行或者某行中的哪些列是否可以编辑 参考源码,覆盖 isCellEditable 方法,如: [code="java"] cm = new Ext.grid.ColumnModel({ columns : [new Ext.grid.RowNumberer(), { header : '备注', width ...

ccxw1983 347

Extjs EditorGridPanel复选框实现单选, 同时锁住指定行

最近遇到一个问题, 就是如果在EditorGridePanel里加入一个复选组件, 这个组件只能实现单选, 同时满足, 某些行不可选. 代码如下: var sm = new Ext.grid.CheckboxSelectionModel({ singleSelect:true, checkOnly: true, header:'', listeners:{ ...

aqudgv83的博客 592

Extjs中的EditorGridPanel高级应用

摘要:在使用EditorGridPanel里,有时我们需要在不同的条件下,对不同的列才能进行编辑。比如:在OA应用中,在一个流程执行到第一步时,只允许对第一列进行编辑,其它列为只读状态,当流程执行到第二步时,可能允许对第三、四进行编辑。那么,我们可以通过ColumnModel的isCellEditable()函数来实现此功能。 实现方法: 1、首先,我们用一个变量来保存当前的可以编辑的步骤。 ...

weixin_34149796的博客 166

Ext.grid.EditorGridPanel联动设置单元格是否可以编辑和背景色

1 listeners:{ 2 "beforeedit":function(iEventobj){ 3 var col = iEventobj.row;//获取行 4 var record = iEventobj.record;//获取当前选中的这个单元格所在的一行数据 5 var isEdit = record.g...

weixin_33866037的博客 262

EditorGridPanel中ComboBox显示问题?

function getConsumerUnit(value){ var rd = houFct.EmptyStore.getAt(0); if(rd){ return rd ? rd.get('unitName') : '请选择..'; }; if(houFct.get('consumerGrid').getGrid...

天天开心 235

extjs学习笔记(五)可编辑的grid

 本文转载自:http://www.cnblogs.com/yage/archive/2009/10/22/1587786.html大多数时候,我们只是使用grid来显示信息,但有时也需要在grid中对信息进行编辑。在extjs中,构造一个编辑的grid非常方便。我们来看下Ext.grid.EditorGridPanel,该类从GridPanel继承而来,通过对列提供editor进行编辑

niuyongjie的专栏 1万+

extJs 2.0学习笔记(Ext.Panel篇二)

 这一篇翻译自extJs 2.0官方文档。花了我一个晚上加一个上午的时间才搞定。这篇是关于config的。  我在网上查了很久,关于ExtJs的core部分的中文文档还是有不少,但是关于panel,window这些呢就好像不大齐全,而且,在js堂,它的文档翻译还在1.1。所以呢想翻译出来,以后大家也好查阅。  本人js水平、英文水平都有限,还好,通过看源代码两相印证,终于还是搞出来了。

火焰雪人 5157

ExtJs表格控件(三)----单元格编辑与提交修改

ExtJs的EditorGrid控件提供了动态修改某个单元格的方法,首先如果要使用编辑插件,首先必须要在需要的列上添加editor属性,只有添加了editor属性的列才可以被编辑,否则无法编辑。同时我们可以在editor中添加一些限制或者约束条件,例如禁止编辑单元格为空,首先在定义列的时候使用如下方法定义: var columns = [{ header : '第一列', da

翻滚吧小牛 4862

[ExtJS] grid 可编辑表格 禁用部分单元格编辑

ExtJS Mordern版本中,grid的单元格编辑都是一整列的 但是,若是有时单元格无需编辑时,就没有相关配置项 看下效果: 这里需要手写逻辑,取消编辑 1.首先配置grid的单元格编辑插件 plugins: { gridcellediting: { selectOnEdit: true, triggerEvent...

拒绝成猿的程序员 5246

ExtJS中,可以使用`setVisible()`方法来动态修改表字段的隐藏状态

这段代码创建了一个名为"My Form"的Panel组件,并将其布局设置为FormLayout。然后,我们向该容器中添加了三个表单字段:文本框、日期选择框和数字输入框。方法来动态修改表字段的隐藏状态。该方法接受一个布尔值参数,如果为true,则显示字段;如果为false,则隐藏字段。请注意,以上只是一个简单的示例,你可以根据自己的需求进行更复杂的布局和配置。隐藏表单字段的标签可以通过设置相应的属性来实现。这样就可以在ExtJS中使用Grid布局来展示数据了。在ExtJS中,可以使用。请注意,上述示例中的。

[Blog][Domain] programb.blog.csdn.net 849

EditorGridPanel控制每一单元格是否编辑

EditorGridPanel,顾名思义,就是对GridPanel加入了编辑数据的功能,有了它,我们就可以像直接操作数据库表一样对其进行增删改。同时更改多条数据,一并提交至服务器,无论从效率上还是从用户体验上,都是一件很爽的事情。 EditorGridPanel实际上是GridPanel的子类,具有GridPanel的特性。不同之处在于他的ColumnModel中,多出一项editor 例如:

tswsoft的专栏 2192

ExtJS学习(四)EditorGrid可编辑表格

操作表格有一种需求,要操作表格需要动态的添加内容,删除内容以及双击的时候进入编辑状态。这个时候怎么办呢,看具体的实现吧。  双击点击的时候可以单元格的操作。  代码: "UTF-8"> "Content-Type" content="text/html; charset=UTF-8"> Hello Extjs4.2 "../ExtJS4.2/resources/css/ext-

Fupengyao的博客 1127

驱动程序:硬件SPI控制AD7124

本工程IDE基于Keil MDK5;硬件为STM32F103ZET6,所用SPI为SPI2,速率为140kHz;未使用AD7124的同步模式。经过本人实际验证,程序逻辑无误,可精确采集输入的模拟量,误差在10~20uV。因为是本人按照时序图,外加挂载逻辑分析仪,经过不断调试所完成的,故设置收费,希望自己的劳动成果得到肯定。

基于MATLAB的数字基带传输系统.pdf

上一篇: Extjs Grid 鼠标位置tip提示
下一篇: 常遇到的异常
faith789510
博客等级 码龄16年 3粉丝 20原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值