彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 彩世界平台官方网址 2019-11-28 05:45 的文章
当前位置: 彩世界开奖app官网 > 彩世界平台官方网址 > 正文

extjs实现选择多表自定义查询功效 前台部分_ext

' ,valueField :'name' ,displayField :'chinese' ,mode : 'remote' ,forceSelection : true ,triggerAction : 'all' ,typeAhead : false ,selectOnFocus : true ,resizable:true ,width : 120 ,lazyInit:false ,listeners: { 'focus' : function; } } } )), renderer: function(value, cellmeta, record, row, col, store){ if(value == null || value == ""){ return ""; } return record.get; }} ,{header:'逻辑运算符',dataIndex:'relationsign',width:70,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: relationSignComboData }), mode: 'local', triggerAction: 'all', editable:false, valueField: 'value', displayField: 'text', readOnly:true, lazyInit:false, listeners: { 'focus' : function; } } })), renderer: function(value, cellmeta, record, row, col, store){ if(value == null || value == ""){ return; } return relationSignComboData[value][1]; },scope:this} ,{header:'查询条件值',dataIndex:'expressvalue',width:125,editor:new Ext.grid.GridEditor(new Ext.form.TextField , renderer: function(value, cellmeta, record, row, col, store){ if(value == null || value == ""){ return ""; } return record.get; } } ,{header:'括号',dataIndex:'rightbrackets',width:40,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: rightBracketsComboData }), mode: 'local', triggerAction: 'all', editable:false, valueField: 'value', displayField: 'text', readOnly:true, lazyInit:false, listeners: { 'focus' : function; } } })), renderer: function(value, cellmeta, record){ if(value == null || value == ""){ return ""; } return rightBracketsComboData[value][1]; },scope:this} ,{header:'关系运算符',dataIndex:'operatorsign',width:70,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: operatorSignComboData }), mode: 'local', triggerAction: 'all', editable:false, valueField: 'value', displayField: 'text', readOnly:true, lazyInit:false, listeners: { 'focus' : function; } } })), renderer: function(value, cellmeta, record){ if(value == null || value == ""){ return ; } return operatorSignComboData[value][1]; },scope:this} ,this.rowActions ]); 复制代码 代码如下: Ext.namespace; Ext.namespace('com.awd.advancedSearch'); com.awd.advancedSearch.tableGroup = Ext.extend(Ext.form.FormPanel, { initComponent : function() { Ext.apply(this, { border : true, buttonAlign:'right', bodyStyle : 'padding:5px;overflow-y:scroll;border-left:1px solid #8DB2E3' }); com.awd.advancedSearch.tableGroup.superclass.initComponent.apply; } ,loadTableField:function{ Ext.Ajax.request({ url : '../AdvancedSearch/getDisplayTables.do', method:'post', params:{tableNames:baseTableData.toString()}, success : function { var tables = Ext.decode; var myfieldset = null; if (this.items.length == 0) { for (var i = 0; i < tables.length; i ) { myfieldset = new Ext.form.FieldSet({ title : tables[i].tableString ,collapsible : true ,autoHeight : true ,layout : 'column' ,items : [ {xtype : 'remotecheckboxgroup', columns : 5, url : '../SearchTableColumns/extListAsFieldDisplay.do', baseParams : { dir : 'ASC', limit : '150', s_tablename : tables[i].tableName, selectedTableColumns:selectedTableColumns }, reader : new Ext.data.JsonReader({ totalProperty : 'totalProperty', root : 'list', fields : [{name : 'fieldId'},{name : 'fieldName'},{name : 'fieldLabel'},{name : 'fieldValue'},{name : 'fieldChecked'}] }), fieldId : 'fieldId', fieldName : 'fieldName', fieldLabel : 'fieldLabel', fieldValue : 'fieldValue', fieldChecked : 'fieldChecked' }] }); this.items.add; } }else{ for (var j = 0; j < tables.length; j ) { this.remove; } for (var i = 0; i < tables.length; i ) { myfieldset = new Ext.form.FieldSet({ title : tables[i].tableString ,collapsible : true ,autoHeight : true ,layout : 'column' ,items : [ {xtype : 'remotecheckboxgroup', columns : 5, url : '../SearchTableColumns/extListAsFieldDisplay.do', baseParams : { dir : 'ASC', limit : '150', s_tablename : tables[i].tableName, selectedTableColumns:selectedTableColumns }, reader : new Ext.data.JsonReader({ totalProperty : 'totalProperty', root : 'list', fields : [{name : 'fieldId'},{name : 'fieldName'},{name : 'fieldLabel'},{name : 'fieldValue'},{name : 'fieldChecked'}] }), fieldId : 'fieldId', fieldName : 'fieldName', fieldLabel : 'fieldLabel', fieldValue : 'fieldValue', fieldChecked : 'fieldChecked' }] }); this.items.add; } } this.doLayout; } ,scope : this ,failure : function() { alert; } }); } }); 复制代码 代码如下: Ext.apply(Ext, { isFirebug: (window.console && window.console.firebug) }); Ext.ns; app.getMetaGrid = function{ return new Ext.ux.grid.MetaGrid(Ext.apply({ baseParams: null, /** * @cfg {String} url Specify the url to the data object from which to load data through the HttpProxy. */ url: '../AdvancedSearch/extSearchResultList.do?ssid=' globalQueryString, // url: 'meta-data.js', renderChange: function { return '' val ''; } else if { return '' val ''; } return val; }, renderCombo: function(val, metadata, record, rowIndex, colIndex, store){ var data; /* // the field name: //var field = record.fields.items[colIndex].name; // unreliable since colIndex may be wrong var field = this.colModel.getDataIndex; // Use the Store Manager to get a reference to the ComboBox store. // The store that is passed as one of arguments to this renderer // function is the grid store. We need to cross reference the data // with the ComboBox store, not the grid store. //Get a registered Store using the id of the Store var storeId = field; var comboStore = Ext.StoreMgr.lookup; if { comboStore = new App.ComboStore; } var comboRecord = comboStore.getById; if { data = comboRecord.data.displayField; } else { data = data;//'missing data'; } */ // return the value that should be rendered into the grid cell return data; }, /** * Date renderer function * Renders a date */ renderDate: function{ return date ? date.dateFormat : ''; }, renderDateTime: function { return ''; } var now = new Date(); var d = now.clearTime; var notime = date.clearTime; if ) { return 'Today ' date.dateFormat; } d = d.add; if <= notime) { return date.dateFormat; } return date.dateFormat; }, /** * Italic Custom renderer function * takes val and renders it in italics * @param {Object} val */ renderItalic: function(data, metadata, record, rowIndex, columnIndex, store){ return '' data ''; }, /** * Percent Custom renderer function * takes 'data' and renders it red or green with % */ renderPctChange: function(data, metadata, record, rowIndex, columnIndex, store){ var p = * 100.0).toFixed; var qtip = '>'; if { //meta.css = 'green-cls'; qtip = " qtip='yeah'/>"; return ''; } else if { //meta.css = 'red-cls'; qtip = " qtip='woops'/>"; return ''; } //css: //.red-cls {color: red;} //.green-cls {color: green;} return data; }, /** * Red/Green Custom renderer function * takes val and renders it red if <0 otherwise renders it green * @param {Object} val */ renderPosNeg: function(data, metadata, record, rowIndex, columnIndex, store){ if { return '' data ''; } else if { return '' data ''; } return data; }, /** * Risk Custom renderer function * Renders according to risk level * @param {Object} val */ renderRisk: function(data, metadata, record, rowIndex, columnIndex, store){ switch { case "high": metadata.css = "redcell"; return "high";//display 'high' in the cell (could be //we could display anything here //"High","Hi","yup"...anything case "medium": return "medium"; case "low": return "low"; default: return data; } }, /** * Star Custom renderer function * Renders a picture according to value * @param {Object} val */ renderStars: function(data, metadata, record, rowIndex, columnIndex, store){ switch { case "1": metadata.css = "stars1"; return 1;//returns text over the background image case "2": metadata.css = "stars2"; return;//just shows the background image case "3": metadata.css = "stars3"; return; case "4": metadata.css = "stars4"; return; case "5": metadata.css = "stars5"; return; default: return data; } } ,renderQtip: function(data, metadata, record, rowIndex, columnIndex, store){ metadata.attr = 'ext:qtip="' data '"'; return data; } }, config)); }; Ext.onReady{ var vp = new Ext.Viewport({ layout:'fit', items: [app.getMetaGrid] }); }); 所有JS打包下载共享 advancedSearch.rar

 

{text}

JS4,用grid.plugin.CellEditing做高级查询: 写了90%,界面出来了,小兴奋就贴出来,还有细节要调整,基本能用。 代码: [javascript] Ext.define(c...

', mode: 'local', triggerAction: 'all', editable:false, valueField: 'value', displayField: 'text', lazyInit:false, listeners: { 'expand':function{ combo.clearValue(); combo.store.loadData; } ,'select':function(){ } ,'focus' :function; } } })), renderer: function(value, cellmeta, record, row, col, store){ if(value == null || value == ""){ return; } return record.get; }} ,{header:'查询条件列',dataIndex:'fieldname',width:90,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ id:'fieldnameID' ,store : new Ext.data.Store({ proxy : new Ext.data.HttpProxy({url : '../SearchTableColumns/extlistKV.do'}) ,reader : new Ext.data.JsonReader({}, ['name','chinese']) ,baseParams:{s_tablename:'0'} }) ,tpl: '

Ext JS4,用grid.plugin.CellEditing做高级查询:

{chinese}

写了90%,界面出来了,小兴奋就贴出来,还有细节要调整,基本能用。

EditGridPanel主要代码如下:复制代码 代码如下: {header:'括号',dataIndex:'leftbrackets',width:40,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: leftBracketsComboData }), mode: 'local', triggerAction: 'all', editable:false, valueField: 'value', displayField: 'text', readOnly:true // lazyInit:false, // listeners: { // 'focus' : // function; // } // } })), renderer: function(value, cellmeta, record){ if(value == null || value == ""){ return ""; } return leftBracketsComboData[value][1]; },scope:this} ,{header:'表名称',dataIndex:'tablename',width:80,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: baseTableData }), id:'baseTableNameID', tpl: '

代码:

主要使用的技术: 1、extjs2.0,整体框架 2、RemoteCheckboxGroup.js ,用于动态生成表字段 3、Ext.ux.grid.RowActions.js,用于grid行扩展 4、Datetime.js,用于时间选择 5、MetaGrid.js 用于动态生成查询结果列表 6、ehcache 用于缓存自定表数据,比如表名称、字段描述、长度等固定信息 7、jxl.jar 用于查询结果输出,最后生成Excel文件 8、Java

[javascript]
Ext.define('chenghao.admin.SearchGrid', { 
        extend: 'Ext.grid.Panel', 
        requires: [ 
            'Ext.selection.*', 
            'Ext.grid.*', 
            'Ext.data.*', 
            'Ext.util.*', 
            'Ext.form.*' 
        ], 
        initComponent: function() { 
            this.cellEditing = new Ext.grid.plugin.CellEditing({ 
                clicksToEdit: 1 
            }); 
            //可用查询项  
            var fieldStore = new Ext.data.Store({ 
                fields: ['value', 'text'], 
                proxy: { 
                    type: 'ajax', 
                    url: CONF.CONN_URL, 
                    extraParams: { 
                        module: 'admin', 
                        action: 'get_search_field_list' 
                    }, 
                    reader: { 
                        type: 'json', 
                        root: CONF.JSON_READER_ROOT 
                    } 
                }, 
                folderSort: true, 
                autoLoad: false 
            }); 
            // 比较运算符数据源  
            var bijiaoStore = new Ext.data.Store({ 
                fields: ['value', 'text'], 
                proxy: { 
                    type: 'ajax', 
                    url: CONF.CONN_URL, 
                    extraParams: { 
                        module: 'admin', 
                        action: 'get_search_operator_list' 
                    }, 
                    reader: { 
                        type: 'json', 
                        root: CONF.JSON_READER_ROOT 
                    } 
                }, 
                folderSort: true, 
                autoLoad: false 
            }); 
            // 逻辑运算符数据源  
            var luojiStore = new Ext.data.Store({ 
                fields: ['value', 'text'], 
                proxy: { 
                    type: 'ajax', 
                    url: CONF.CONN_URL, 
                    extraParams: { 
                        module: 'admin', 
                        action: 'get_search_operator_list', 
                        key: 'logic_operator' 
                    }, 
                    reader: { 
                        type: 'json', 
                        root: CONF.JSON_READER_ROOT 
                    } 
                }, 
                folderSort: true, 
                autoLoad: false 
            }); 
             
            var me = this; 
            Ext.apply(this, { 
                title: '高级查询', 
                region: 'north', 
                //height: 120,  
                split: true, //自动伸展  
                collapsible: true, //可折叠  
 
 
                plugins: [me.cellEditing], 
                store: new Ext.data.Store({ 
                    fields: ['LeftParenthesis', 'QueryFieldNametext', 'QueryFieldName', 'QueryComparisonOperationtext', 'QueryComparisonOperation', 
                        'QueryText', 'QueryValue', 'RightParenthesis', 'QueryLogicOperator', 'QueryLogicOperatortext'], 
                    data: { 
                        'search': [{ 
                                "LeftParenthesis": "", 
                                "QueryFieldName": "", 
                                "QueryComparisonOperation": "", 
                                "QueryText": "", 
                                "RightParenthesis": "", 
                                "QueryLogicOperator": "" 
                            }] 
                    }, 
                    proxy: { 
                        type: 'memory', 
                        url: '', 
                        reader: { 
                            type: 'json', 
                            root: 'search' 
                        } 
                    } 
                }), 
                selType: 'cellmodel', //设置为单元格选择模式  
                columns: [{ 
                        header: '删除', 
                        //width: '5%',  
                        sortable: false, 
                        fixed: true, 
                        align: 'center', 
                        xtype: 'actioncolumn', 
                        items: [{ 
                                //icon: DeleteIcon,  
                                iconCls: 'icon-action icon-delete-record', 
                                handler: function(grid, rowIndex, colIndex) { 
                                    //alert(grid.getStore().getCount());  
                                    var rec = grid.getStore().getAt(rowIndex); 
                                    if (grid.getStore().getCount() != 1) { 
                                        Ext.Msg.confirm('提示', '确定要删除吗?', function(btn) { 
                                            if (btn == 'yes') { 
                                                grid.getStore().remove(rec); 
                                            } 
                                        }); 
                                    } else { 
                                        Ext.Msg.alert('错误提示','当前是最后一行,不能删除!'); 
                                    } 
                                } 
                            }] 
                    }, { 
                        header: '左括号', 
                        //width: '9%',  
                        dataIndex: 'LeftParenthesis', 
                        align: 'center', 
                        field: { 
                            xtype: 'combo', 
                            store: new Ext.data.SimpleStore({ 
                                fields: ['value', 'text'], 
                                data: [['1', '('], ['0', '无']] 
                            }), 
                            valueField: 'text', 
                            displayField: 'text', 
                            triggerAction: 'all', // 无论有没有内容,下拉列表全部显示,有内容会自动在该内容上高亮显示  
                            selectOnFocus: true, // 用户不能自己输入,只能选择列表中有的记录  
                            editable: false, 
                            emptyText: "--请选择--" 
                        } 
                    }, { 
                        header: '查询条件', 
                        dataIndex: 'QueryFieldNametext', 
                        //width: '23%',  
                        align: 'center', 
                        field: { 
                            xtype: 'combobox', 
                            hiddenname: 'value', 
                            store: fieldStore, 
                            valueField: 'text', 
                            displayField: 'text', 
                            triggerAction: 'all', // 无论有没有内容,下拉列表全部显示,有内容会自动在该内容上高亮显示  
                            selectOnFocus: true, // 用户不能自己输入,只能选择列表中有的记录  
                            editable: false, 
                            emptyText: "--请选择--", 
                            // 给查询条件加展开事件  
                            listeners: { 
                                expand: function() { 
                                    // 定义等待效果  
                                    if (this.value == "") { 
                                        fieldStore.load({ 
                                            callback: function(records, options, success) { 
                                            } 
                                        }); 
                                    } 
                                }, 
                                change: function(e, value, oldValue) { 
                                    var index = fieldStore.find('text', e.getValue()); 
 
                                    //me.getStore().getAt(0).data.QueryFieldName = "123";  
                                    var row = me.getSelectionModel().getCurrentPosition().row; 
                                    if (index != -1) { 
                                        fieldStore.each(function(rec) { 
                                            if (rec.get('text') == e.getValue()) { 
                                                //alert(rec.get('value'));  
                                                me.getStore().getAt(row).data.QueryFieldName = rec.get('value'); 
                                            } 
                                        }); 
                                    } 
                                    //alert(this.value);  
                                    //alert(Ext.JSON.encode(me.getSelectionModel().getCurrentPosition()));  
                                } 
                            } 
                        } 
                    }, { 
                        header: '查询条件', 
                        dataIndex: 'QueryFieldName', 
                        align: 'center', 
                        hideable: false, 
                        hidden: true 
                    }, { 
                        header: '比较运算符', 
                        dataIndex: 'QueryComparisonOperationtext', 
                        //width: '10%',  
                        align: 'center', 
                        field: { 
                            xtype: 'combobox', 
                            hiddenname: 'value', 
                            store: bijiaoStore, 
                            valueField: 'text', 
                            displayField: 'text', 
                            triggerAction: 'all', // 无论有没有内容,下拉列表全部显示,有内容会自动在该内容上高亮显示  
                            selectOnFocus: true, // 用户不能自己输入,只能选择列表中有的记录  
                            editable: false, 
                            emptyText: '', 
                            listeners: { 
                                change: function(e, value, oldValue) { 
                                    var index = bijiaoStore.find('text', e.getValue()); 
                                    var row = me.getSelectionModel().getCurrentPosition().row; 
                                    if (index != -1) { 
                                        bijiaoStore.each(function(rec) { 
                                            if (rec.get('text') == e.getValue()) { 
                                                me.getStore().getAt(row).data.QueryComparisonOperation = rec.get('value'); 
                                            } 
                                        }); 
                                    } 
                                } 
                            } 
                        } 
                    }, { 
                        header: '比较运算符', 
                        dataIndex: 'QueryComparisonOperation', 
                        align: 'center', 
                        hideable: false, 
                        hidden: true 
                    }, { 
                        header: '请输入查询条件', 
                        dataIndex: 'QueryText', 
                        width: 180, 
                        align: 'center', 
                        field:{ 
                            xtype: 'textfield', 
                            listeners: { 
                                click: function(e, h, rowIndex) { 
                                    var rec = me.getStore().getAt(rowIndex).data; 
                                    var fieldId = rec.QueryFieldNametext; 
 
                                    if (fieldId == "") { 
                                        Ext.Msg.alert("请选择查询条件"); 
                                        return; 
                                    } 
                                    if (rec.QueryComparisonOperation == "is null" || rec.QueryComparisonOperation == "is not null"){ 
                                        return; 
                                    } 
                                } 
                            } 
                        } 
                    }, { 
                        header: '右括号', 
                        //width: '9.6%',  
                        dataIndex: 'RightParenthesis', 
                        align: 'center', 
                        field: { 
                            xtype: 'combo', 
                            store: new Ext.data.SimpleStore({ 
                                fields: ['value', 'text'], 
                                data: [['1', ')'], ['0', '无']] 
                            }), 
                            valueField: 'text', 
                            displayField: 'text', 
                            triggerAction: 'all', // 无论有没有内容,下拉列表全部显示,有内容会自动在该内容上高亮显示  
                            selectOnFocus: true, // 用户不能自己输入,只能选择列表中有的记录  
                            editable: false, 
                            emptyText: "--请选择--" 
                        } 
                    }, { 
                        header: '逻辑运算符', 
                        dataIndex: 'QueryLogicOperatortext', 
                        //width: '10%',  
                        align: 'center', 
                        field: { 
                            xtype: 'combo', 
                            hiddenname: 'value', 
                            store: luojiStore, 
                            valueField: 'text', 
                            displayField: 'text', 
                            triggerAction: 'all', // 无论有没有内容,下拉列表全部显示,有内容会自动在该内容上高亮显示  
                            selectOnFocus: true, // 用户不能自己输入,只能选择列表中有的记录  
                            editable: false, 
                            emptyText: '', 
                            listeners: { 
                                change: function(e, value, oldValue) { 
                                    var index = luojiStore.find('text', e.getValue()); 
                                    var row = me.getSelectionModel().getCurrentPosition().row; 
                                    if (index != -1) { 
                                        luojiStore.each(function(rec) { 
                                            if (rec.get('text') == e.getValue()) { 
                                                me.getStore().getAt(row).data.QueryLogicOperator = rec.get('value'); 
                                            } 
                                        }); 
                                    } 
                                } 
                            } 
                        } 
                    }, { 
                        header: '逻辑运算符', 
                        dataIndex: 'QueryLogicOperator', 
                        align: 'center', 
                        hideable: false, 
                        hidden: true 
                    }, { 
                        header: '操作', 
                        //width: '5%',  
                        fixed: true, 
                        align: 'center', 
                        xtype: 'actioncolumn', 
                        items: [{ 
                                //icon: AddIcon,  
                                iconCls: 'add', 
                                handler: function(grid, rowIndex, colIndex) { 
                                    var rec = grid.getStore().getAt(rowIndex).data; 
                                    if (rec.QueryFieldName == "") { 
                                        Ext.Msg.alert('错误提示','请输入查询条件!'); 
                                        return; 
                                    } else if (rec.QueryComparisonOperation == "") { 
                                        Ext.Msg.alert('错误提示','请输入比较运算符!'); 
                                        return; 
                                    } else if (rec.QueryLogicOperator == "") { 
                                        Ext.Msg.alert('错误提示','请输入逻辑运算符!'); 
                                        return; 
                                    } 
                                    // 插入一行查询条件  
                                    me.getStore().insert(rowIndex 1, ''); 
                                } 
                            }] 
 
                    }], 
                dockedItems: [{ 
                        xtype: 'toolbar', 
                        items: [{ 
                                //icon: SearchIcon,  
                                text: '查询', 
                                handler: function() { 
                                    var SearchStore = me.getStore(); 
                                    var count = SearchStore.getCount(); 
                                  
                                    if (count == 1 && SearchStore.getAt(0).data.QueryFieldName == "") { 
                                        //alert(SearchStore.getAt(0).data.QueryFieldName);  
 
                                        var LeftParenthesis = SearchStore.getAt(0).data.LeftParenthesis; 
                                        var RightParenthesis = SearchStore.getAt(0).data.RightParenthesis; 
                                        if (LeftParenthesis == "" && RightParenthesis != "") { 
                                            Ext.Msg.alert('错误提示', '括号不匹配,请修改查询条件!'); 
                                            return; 
                                        } 
                                        if (LeftParenthesis != "" && RightParenthesis == "") { 
                                            Ext.Msg.alert('错误提示', '括号不匹配,请修改查询条件!'); 
                                            return; 
                                        } 
                                        me.getStore(); 
                                        return; 
                                    } 
                                     
for(var i = 0; i< count; i ){  
     var a = new Array(); 
     alert(Ext.JSON.encode(me.getStore().getAt(i).data)); 
     //alert(me.getStore().getAt(i).data.LeftParenthesis);  
     //record = grid.getStore().getAt(i);     
     //var colname = grid.getColumnModel().getDataIndex(i); //获取列名        
     //var celldata = grid.getStore().getAt(cell[0]).get(colname);   //获取数据     
     //Ext.MessageBox.alert("test",colname);     
     //for (var j = 0; j < colIndex; colIndex ) {     
         //Ext.MessageBox.alert("test",grid.getColumnModel().getDataIndex(j));     
    //}     
}  
                                     
                                    //var msg = dynamicPublicSearch(SearchStore);  
                                    //if (msg == "") {  
                                        //me.getStore();  
                                    //}  
                                } 
                            }] 
                    }] 
            }); 
 
            this.callParent(); 
        } 
    }); 

本文由彩世界开奖app官网发布于彩世界平台官方网址,转载请注明出处:extjs实现选择多表自定义查询功效 前台部分_ext

关键词: 脚本 自定义 之家 前台