`
zbg1983
  • 浏览: 39339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Extjs4 总结

阅读更多
一 GRID组件

   1 普通的ext.grid.panel
       Ext.onReady(function(){
//创建表格数据
var datas = [
[100,'张三',24],
[200,'李四',30],
[300,'王五',29]
];
//创建Grid表格组件
Ext.create('Ext.grid.Panel',{
title : '简单Grid表格示例',
renderTo: Ext.getBody(),
width:200,
height:130,
frame:true,
viewConfig: {
forceFit : true,
            stripeRows: true//在表格中显示斑马线
        },
store: {//配置数据源
        fields: ['id','name','age'],//定义字段
        proxy: {
            type: 'memory',//Ext.data.proxy.Memory内存代理
            data : datas,//读取内嵌数据
            reader : 'array'//Ext.data.reader.Array解析器
        },
        autoLoad: true//自动加载
    },
columns: [//配置表格列
{header: "id", width: 30, dataIndex: 'id', sortable: true},
{header: "姓名", width: 80, dataIndex: 'name', sortable: true},
{header: "年龄", width: 80, dataIndex: 'age', sortable: true}
]
});
});

    2 分别有boolean,number,data,action等动作列
          columns: [//配置表格列
{header: "姓名", width: 50, dataIndex: 'name'},
{header: "组长", width: 50, dataIndex: 'leader',
xtype: 'booleancolumn',//Ext.grid.column.Boolean布尔列
trueText: '是',
falseText: '否'
},
{header: "生日", width: 100, dataIndex: 'birthday',
xtype : 'datecolumn',//Ext.grid.column.Date日期列
format : 'Y年m月d日'//日期格式化字符串
},
{header: "薪资", width: 50, dataIndex: 'salary',
xtype: 'numbercolumn',//Ext.grid.column.Number数字列
format:'0,000'//数字格式化字符串
}
]

   3 ACTION动作列,比如CRUD的按钮及相应的事件
      {header: "操作", width: 70,
xtype: 'actioncolumn',//Ext.grid.column.Action动作列
            items: [{
                icon: 'images/edit.gif',//指定编辑图标资源的URL
                handler: function(grid, rowIndex, colIndex) {
                //获取被操作的数据记录
                    var rec = grid.getStore().getAt(rowIndex);
                    alert("编辑 " + rec.get('name'));
                }
            },{
                icon: 'images/del.gif',//指定编辑图标资源的URL
                handler: function(grid, rowIndex, colIndex) {
                    var rec = grid.getStore().getAt(rowIndex);
                    alert("删除 " + rec.get('name'));
                }               
            },{
                icon: 'images/save.gif',//指定编辑图标资源的URL
                handler: function(grid, rowIndex, colIndex) {
                    var rec = grid.getStore().getAt(rowIndex);
                    alert("保存 " + rec.get('name'));
                }               
            }]
}

     4 自定义模版
        header: "描述", width: 100,
xtype: 'templatecolumn',//Ext.grid.column.Template数字列
tpl : '{name}<tpl if="leader == false">不</tpl>是组长'

      5 行号:  Ext.create('Ext.grid.RowNumberer',{text : '行号', width : 35}),
   
     6 表格渲染,自定义单元格中的值
      columns: [//配置表格列
{header: "id", width: 30, dataIndex: 'id'},
{header: "姓名", width: 50, dataIndex: 'name'},
{header: "性别", width: 50, dataIndex: 'sex',renderer:formatSex},
{header: "生日", width: 100, dataIndex: 'birthday',
//格式化生日显示
renderer:Ext.util.Format.dateRenderer('Y年m月d日')
},
{header: "年龄", width: 50, dataIndex: 'age',renderer:formatAge}
]
});
//定义渲染函数,格式化性别显示
function formatSex(value){
return value=='man'?'男':'<font color=red>女</font>';
}

二  GRID组件的选择模式
   1) ext.selection.cellmodel  选定其中一个单元格
      //创建Grid表格组件
var grid = Ext.create('Ext.grid.Panel',{
title : '单元格选择模式示例',
renderTo: Ext.getBody(),
width:200,
height:170,
frame:true,
selType: 'cellmodel',//设置为单元格选择模式Ext.selection.CellModel
tbar : [{
text : '取得所选单元格',
handler : function(){
var cell = grid.getSelectionModel().getCurrentPosition();
alert(Ext.JSON.encode(cell));
}
}],
              ....................................
   2 rowmodel
       var grid = Ext.create('Ext.grid.Panel',{
title : '行选择模式示例',
renderTo: Ext.getBody(),
width:200,
height:170,
frame:true,
simpleSelect : true,//启用简单选择功能
multiSelect : true,//支持多选
selType: 'rowmodel',//设置为单元格选择模式Ext.selection.RowModel
tbar : [{
text : '取得所选行',
handler : function(){
var msg = '';
var rows = grid.getSelectionModel().getSelection();
for(var i = 0; i < rows.length; i++){
msg = msg + rows[i].get('name') + '\n';
}
alert(msg);
}
}],

    3 复选框模式
         Ext.ClassManager.setAlias('Ext.selection.CheckboxModel','selection.checkboxmodel'); (必须有这行)
//创建Grid表格组件
var grid = Ext.create('Ext.grid.Panel',{
title : '复选框选择模式示例',
renderTo: Ext.getBody(),
width:230,
height:170,
frame:true,
multiSelect : true,//支持多选
selModel: {
selType : 'checkboxmodel'//复选框选择模式Ext.selection.CheckboxModel
},
tbar : [{
text : '取得所选行',
handler : function(){
var msg = '';
var rows = grid.getSelectionModel().getSelection();
for(var i = 0; i < rows.length; i++){
msg = msg + rows[i].get('name') + '\n';
}
alert(msg);
}
}],

三 表格特性
   1) ext.grid.feature.rowbody
   跨越了表格的所有列。
        Ext.onReady(function(){
//创建表格数据
var datas = [
['张三',2500,'张三的个人简历...'],
['李四',1500,'李四的个人简历...']
];
//创建Grid表格组件
Ext.create('Ext.grid.Panel',{
title : 'Ext.grid.feature.RowBody示例',
renderTo: Ext.getBody(),
width:300,
height:150,
frame:true,
store: {
        fields: ['name','salary','introduce'],
        proxy: {
            type: 'memory',
            data : datas,
            reader : 'array'//Ext.data.reader.Array解析器
        },
        autoLoad: true
    },
    features: [Ext.create('Ext.grid.feature.RowBody',{
        getAdditionalData: function(data, idx, record, orig) {
            var headerCt = this.view.headerCt,
                colspan  = headerCt.getColumnCount();//获取表格的列数

            return {
                rowBody: record.get('introduce'),//指定行体内容
                rowBodyCls: 'rowbodyColor',//指定行体样式
                rowBodyColspan: colspan//指定行体跨列的列数
            };
        }
    })],
columns: [//配置表格列
    Ext.create('Ext.grid.RowNumberer',{text : '行号', width : 35}),
{header: "姓名", flex: 1, dataIndex: 'name'},
{header: "薪资", flex: 1, dataIndex: 'salary'}
]
});
});

  2、汇总值
        Ext.onReady(function(){
//创建表格数据
var datas = [
['张三',2500],
['李四',1500]
];
//创建Grid表格组件
Ext.create('Ext.grid.Panel',{
title : 'Ext.grid.feature.Summary示例',
renderTo: Ext.getBody(),
width:300,
height:150,
frame:true,
store: {
        fields: ['name','salary','introduce'],
        proxy: {
            type: 'memory',
            data : datas,
            reader : 'array'//Ext.data.reader.Array解析器
        },
        autoLoad: true
    },
    features: [{
    ftype: 'summary'//Ext.grid.feature.Summary表格汇总特性
    }],
columns: [//配置表格列
{header: "姓名", flex: 1, dataIndex: 'name',
summaryType: 'count',//求数量
summaryRenderer: function(value){
return '员工总数:'+value
}
},
{header: "薪资", flex: 1, dataIndex: 'salary',
summaryType: 'average',//求平均值
summaryRenderer: function(value){
return '平均薪资:'+value
}
}
]
});
});
  //其中可以有count,sum,min,max,average等方法,在summarytype中。

3 表格分组
      Ext.onReady(function(){
//创建表格数据
var datas = [
['张三','男',29],['李四','女',30],
['王五','男',27],['赵六','女',31]
];
//创建Grid表格组件
Ext.create('Ext.grid.Panel',{
title : 'Ext.grid.feature.Grouping示例',
renderTo: Ext.getBody(),
width:300,
height:150,
frame:true,
store: {
        fields: ['name','sex','age'],
        groupField: 'sex',//设置分组字段
        proxy: {
            type: 'memory',
            data : datas,
            reader : 'array'//Ext.data.reader.Array解析器
        },
        autoLoad: true
    },
    features: [Ext.create('Ext.grid.feature.Grouping', {
    groupByText : '用本字段分组',
    showGroupsText : '显示分组',
        groupHeaderTpl: '性别: {name} ({rows.length})', //分组标题模版
        startCollapsed: true //设置初始分组是否收起
    })],
columns: [//配置表格列
{header: "姓名", flex: 1, dataIndex: 'name'},
{header: "性别", flex: 1, dataIndex: 'sex'},
{header: "年龄", width: 110, dataIndex: 'age',
summaryType: 'average',//求数量
summaryRenderer: function(value){
return '平均年龄:'+value
}
]
});
});

四 表格插件
  1) 单元格编辑插件
         plugins: [
Ext.create('Ext.grid.plugin.CellEditing', {
    clicksToEdit: 1//设置鼠标单击1次进入编辑状态
})
],

  2)行编辑模式
        plugins: [
        //行编辑模式
Ext.create('Ext.grid.plugin.RowEditing', {
            clicksToEdit: 1
        })
],
3) 表格分页
       Ext.onReady(function(){
var itemsPerPage = 2;//指定分页大小
  
var store = Ext.create('Ext.data.Store', {
    autoLoad: {start: 0, limit: itemsPerPage},
    fields:['id', 'name', 'age'],
    pageSize: itemsPerPage, //设置分页大小
    proxy: {
        type: 'ajax',
        url: 'jsonServer.jsp',  //请求的服务器地址
        reader: {
            type: 'json',
            root: 'rows',
            totalProperty: 'results'
        }
    }
});
//创建Grid表格组件
Ext.create('Ext.grid.Panel',{
title : 'Ext.toolbar.Paging示例',
renderTo: Ext.getBody(),
width:400,
height:150,
frame:true,
store: store,
columns: [//配置表格列
{header: "id", width: 30, dataIndex: 'id', sortable: true},
{header: "姓名", width: 80, dataIndex: 'name', sortable: true},
{header: "年龄", width: 80, dataIndex: 'age', sortable: true}
],
bbar: [{
xtype: 'pagingtoolbar',
store: store,   //这里需要指定与表格相同的store
displayInfo: true
}]
});
});

五  TREE组件
    1)ext.tree.panel
        Ext.onReady(function(){
var tree = Ext.create('Ext.tree.Panel', {
    title: '树面板简单示例',
    width : 150,
    height : 100,
    renderTo: Ext.getBody(),
    root: {
        text: '树根',//节点名称
        expanded: true,//默认展开根节点
        children: [{
            text: '节点一',//节点名称
            leaf: true//true说明为叶子节点
        }, {
            text: '节点二',//节点名称
            leaf: true//true说明为叶子节点
        }]
    }
});
});

    2 EXT JS 4中的多列树
        Ext.onReady(function(){
var tree = Ext.create('Ext.tree.Panel', {
    title: 'TreeGrid(多列树示例)',
    renderTo: Ext.getBody(),
    width : 200,
    height : 120,
    fields: ['name', 'description'],
    columns: [{
        xtype: 'treecolumn',//树状表格列
        text: '名称',
        dataIndex: 'name',
        width: 100,
        sortable: true
    }, {
        text: '描述',
        dataIndex: 'description',
        flex: 1,
        sortable: true
    }],
    root: {
        name: '树根',
        description: '树根的描述',
        expanded: true,
        children: [{
            name: '节点一',
            description: '节点一的描述',
            leaf: true
        }, {
            name: '节点二',
            description: '节点二的描述',
            leaf: true
        }]
    }
});
});

    3 带复选框的树
      Ext.onReady(function(){
var tree = Ext.create('Ext.tree.Panel', {
    title: '复选框示例',
    width : 150,
    height : 100,
    renderTo: Ext.getBody(),
    root: {
        text: '树根',//节点名称
        expanded: true,//默认展开根节点
        children: [{
            text: '节点一',//节点名称
            checked : true,//默认选中
            leaf: true//true说明为叶子节点
        }, {
            text: '节点二',//节点名称
            checked : false,//默认不选中
            leaf: true//true说明为叶子节点
        }]
    }
});
});

    4 分级加载树,可以分级加载大量的数据
        Ext.onReady(function(){
//定义用户User模型
Ext.regModel("OrgInfo", {
    fields: ['orgId','name', 'count']
});
var myStore = new Ext.data.TreeStore({
model : 'OrgInfo',
nodeParam : 'orgId',//指定节点参数名
proxy: {
            type: 'ajax',
            url: 'treeServer.jsp',
            reader: 'json'
        },
autoLoad: true,
        root: {
            name: '根节点',
            id: '-1'
        }
});

Ext.create('Ext.tree.Panel', {
    title: '分级异步加载树节点示例',
    renderTo: Ext.getBody(),
    width : 250,
    height : 150,
    columns: [{
        xtype: 'treecolumn',//树状表格列
        text: '公司名称',
        dataIndex: 'name',
        width: 150,
        sortable: true
    }, {
        text: '员工人数',
        dataIndex: 'count',
        flex: 1,
        sortable: true
    }],
    store : myStore,
    rootVisible: false
});
});
   服务端:
      <%
String orgId = request.getParameter("orgId");
String result="";
if("-1".equals(orgId)){
result = "[{name:'总公司',count:100,id:100}]";
}else if("100".equals(orgId)){
result = "[{name:'分公司一',count:20,id:110,leaf:true},{name:'分公司二',count:80,id:120}]";
}else if("120".equals(orgId)){
result = "[{name:'部门一',count:30,id:121,leaf:true},{name:'部门二',count:50,id:122,leaf:true}]";
}
response.getWriter().write(result);
%>

六  EXT JS与服务端整合
    1)XML与JSON的生成
      A 使用XTREAM
         先有POJO,比如Person类,phonenumber类
         public class Person {
private String name;
private int age;
private PhoneNumber homePhone;
private PhoneNumber officePhone;
        ......
      }
        public class PhoneNumber {
private String type;
private String number;
        ............}

       转换:
       PhoneNumber homePhone = new PhoneNumber("宅电","123456");
PhoneNumber officePhone = new PhoneNumber("办公电话","654321");
Person person = new Person("tom",20,homePhone,officePhone);
XStream xStream = new XStream(new DomDriver());
xStream.alias("person",Person.class);
String xml = xStream.toXML(person);
System.out.println(xml);
    2)EXT中定义工具类,将LIST转为XML的方法(包含JSON转换)
        public class Total {
private long results;

public long getResults() {
return results;
}
        

public void setResults(long results) {
this.results = results;
}
}

//主要是因为EXT JS前端中要读出记录数
      public class ExtHelper {
/**
* 通过List生成XML数据
* @param recordTotal 记录总数,不一定与beanList中的记录数相等
* @param beanList 包含bean对象的集合
* @return 生成的XML数据
*/
public static String getXmlFromList(long recordTotal , List beanList) {
Total total = new Total();
total.setResults(recordTotal);
List results = new ArrayList();
results.add(total);
results.addAll(beanList);
XStream sm = new XStream(new DomDriver());
for (int i = 0; i < results.size(); i++) {
Class c = results.get(i).getClass();
String b = c.getName();
String[] temp = b.split("\\.");
sm.alias(temp[temp.length - 1], c);
}
String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + sm.toXML(results);
return xml;
}
/**
* 通过List生成XML数据
* @param beanList 包含bean对象的集合
* @return 生成的XML数据
*/
public static String getXmlFromList(List beanList){
return getXmlFromList(beanList.size(),beanList);
}
/**
* 通过List生成JSON数据
* @param recordTotal 记录总数,不一定与beanList中的记录数相等
* @param beanList 包含bean对象的集合
* @return 生成的JSON数据
*/
public static String getJsonFromList(long recordTotal , List beanList){
TotalJson total = new TotalJson();
total.setResults(recordTotal);
total.setItems(beanList);
JSONObject JsonObject = JSONObject.fromObject(total);
return JsonObject.toString();
}
/**
* 通过List生成JSON数据
* @param beanList 包含bean对象的集合
* @return 生成的JSON数据
*/
public static String getJsonFromList(List beanList){
return getJsonFromList(beanList.size(),beanList);
}
/**
* 通过bean生成JSON数据
* @param bean bean对象
* @return 生成的JSON数据
*/
public static String getJsonFromBean(Object bean){
JSONObject JsonObject = JSONObject.fromObject(bean);
return JsonObject.toString();
}
}

  调用方法: String xml = ExtHelper.getXmlFromList(phoneList.size(), phoneList);

  3)JSONLIB和struts2的生成
      简单例子:
         PhoneNumber homePhone = new PhoneNumber("宅电","123456");
PhoneNumber officePhone = new PhoneNumber("办公电话","654321");
Person person = new Person("tom",20,homePhone,officePhone);
JSONObject json = JSONObject.fromObject(person);
String jsonStr = json.toString();
System.out.println(json);

        public class TotalJson {
private long results;
private List items;
       ......
          }
   由于struts2直接支持JSON形式,后端直接LIST返回即可,所以前端:
        store: {
        fields: ['name','age','sex','birthday'],
        proxy: {
            type: 'ajax',
            url : '/ExtJS4-Examples/extjs.action',
            reader: {
            type: 'json',//Ext.data.reader.Json解析器
            root: 'items'
        }
        },
        autoLoad: true
    },
    
七   主题
     EXT JS 4中采用了SAAS来支持CSS的生成,SAAS为CSS的扩展,可以在SAAS中定义变量,甚至运算;COMPASS是开源CSS框架
使用SAAS样式;compass=saas样式表+大量优秀的CSS模式
     gem install compass后
  在ext js 4中的resources目录中,包含三个目录 css:编译后的级联样式文件,SAAS用于存放主题定制的SAAS源文件
     在saas目录中有config.rb文件,可以写一个SCSS
       @import 'compass';
        $base-color: #FF6666;
        @import 'ext4/default/all';
....
   编译
       compass compile  resources/my_sass  //将SCSS文件放在my_sass下编译。
分享到:
评论

相关推荐

    ExtJs4.rar

    总结来说,ExtJS4作为ExtJS系列的一个重要版本,不仅增强了组件化、数据管理、事件处理、图表和表单等功能,还在性能和易用性上做了很多改进。对于需要构建复杂、交互性强的Web应用的开发者来说,ExtJS4无疑是一个...

    Extjs4 grid使用例子

    总结来说,"Extjs4 grid使用例子"是一个实践教程,展示了如何在MVC架构下利用ExtJS4的Grid组件处理数据,实现数据的增删改功能。通过这个例子,开发者可以学习到MVC的设计理念,以及如何有效利用Grid组件提升Web应用...

    extjs4环境搭建

    总结起来,搭建ExtJS4开发环境主要包括以下几个步骤: 1. 下载并解压ExtJS4的版本。 2. 选择需要的资源文件导入Eclipse项目。 3. 在HTML页面中引入ExtJS的样式和脚本文件。 4. 使用`Ext.onReady`初始化组件库并编写...

    在Eclipse中开发Extjs4代码

    总结起来,在Eclipse中开发Extjs4代码,我们需要: 1. 安装Eclipse并确保其支持JavaScript开发。 2. 安装Spket插件以获取代码提示和智能感知功能。 3. 导入`ext-40.jsb2`文件,使Spket理解ExtJS4的API。 4. 获取...

    extjs4 ComboBox 点击下拉框 出现grid效果

    总结来说,EXTJS4的ComboBox可以通过自定义事件处理和组件嵌套实现点击下拉框显示Grid的效果。这需要理解EXTJS的事件系统、组件创建和布局管理。同时,正确引用EXTJS库文件和资源对于应用的正常运行至关重要。

    EXTJS4开发的图片文章管理项目实例

    总结来说,这个EXTJS4开发的图片文章管理项目实例展示了前端EXTJS4的强大UI构建能力,后端JAVA的稳定处理性能,以及MYSQL数据库的数据存储功能。通过学习这个实例,开发者可以深入理解EXTJS4的MVC架构,JAVA的Web...

    extjs4 项目例子

    这个项目里面包含了本人从开始初学EXTJS4的全部事例:grid、tree、chart图表、文件上传、mvc、还有用户信息注册。里面的一些难点、要点都加了注释,还有一个file.txt文件是本人的小小总结,还没完整。我也是一个第一...

    ssh+extjs4整合开发

    总结来说,"ssh+extjs4整合开发"涉及到的技术栈是Java后端开发的强大组合,结合了Spring的灵活性、Struts2的MVC架构以及Hibernate的对象关系映射,再加上EXTJS4的富客户端能力。这种整合使得开发者能够构建出高效、...

    EXTJS开发总结.pdf

    EXTJS是一种专为Rich Internet Applications (RIA)设计的前端JavaScript框架,它的主要定位与Prototype、jQuery等轻量级库截然不同。EXTJS注重客户端的复杂应用开发,提供了丰富的组件和功能,使得开发者能够构建出...

    Extjs4 权威指南(中)

    ### Extjs4 权威指南知识点总结 #### 一、Extjs4简介与获取途径 - **概述**:Extjs4是一款基于JavaScript的企业级富客户端Web应用程序开发框架,旨在简化前端开发过程,提供丰富的UI组件和强大的数据处理能力。 - ...

    extjs 总结

    4. **主要属性** - `id`: 节点的ID。 - `attributes`: 节点的属性集合,可以包含任何与该节点相关的数据。 - `parentNode`: 节点的父节点对象。 - `childNodes`: 子节点数组,包含了当前节点的所有子节点。 - `...

    EXTJS 4 树形表格组件使用示例

    总结来说,EXTJS 4的树形表格组件是一个强大且灵活的工具,它集成了树状结构和表格的特性,为开发者提供了一种高效展示和操作层次数据的方式。无论是在桌面端还是移动端的应用开发中,EXTJS 4的TreeGrid都是一个值得...

    ExtJS4 2学习 21 动态菜单与表格数据展示操作总结篇

    在"ExtJS4 2学习 21 动态菜单与表格数据展示操作总结篇"中,我们将深入探讨两个核心组件:动态菜单(Dynamic Menus)和表格数据展示(Grid Data Display),以及如何在实际应用中进行操作。 动态菜单在Web应用中...

    Extjs4开发笔记(收集整理).pdf

    总结而言,Extjs4开发笔记提供了开发一个基于Extjs4框架和MVC模式的员工管理系统的过程和细节。作者从准备工作讲起,到环境配置、目录结构、文件分离,再到框架搭建,每个环节都详细记录了其开发经验和遇到的问题。...

    extjs4MVC实现

    总结,ExtJS4.0 的 MVC 实现为开发者提供了强大的工具来构建复杂的 Web 应用。通过理解并熟练运用 MVC 架构模式,我们可以创建出具有高效数据管理、灵活用户交互和易于维护的 ExtJS 应用程序。学习和掌握这些知识,...

    ExtJS 4 技术详解,全面解析ExtJS 4

    总结来说,ExtJS 4的Accordion布局和Border布局是两种非常实用的布局模式,它们能够帮助开发者创建出灵活多样的用户界面。Accordion布局适合有限的空间内展示多个面板,而Border布局则适用于需要分割屏幕并进行动态...

    Extjs4动态树的实现

    总结来说,这个例子展示了如何使用ExtJS4和Java实现一个动态树结构。前端通过TreeStore从后端动态获取数据,当用户点击树节点时,会触发新的数据请求。后端根据请求参数返回JSON数据,更新树结构。这种动态加载的...

    Extjs4Charts图表

    ExtJS 4 是一款强大的JavaScript框架,用于构建富客户端应用程序。...提供的"Extjs4Charts图表"压缩包文件应该包含了预设的图表示例,可以直接运行查看效果,对于初学者来说,这是一个很好的学习资源。

    Extjs4 + Asp.net MVC Demo

    总结来说,"Extjs4 + Asp.net MVC Demo"是一个很好的学习资源,它演示了如何利用这两种技术构建松耦合的Web应用,实现高效的页面交互和数据管理。通过学习这个Demo,开发者可以掌握前端MVC的组织方式,了解如何在...

    Extjs4登录功能+验证码+struts2

    总结起来,"Extjs4登录功能+验证码+struts2"涉及到的知识点有: 1. ExtJS4的表单组件和布局:如何使用`Ext.form.Panel`、`Ext.form.field.Text`和`Ext.button.Button`创建登录表单。 2. 验证码实现:前端展示和后端...

Global site tag (gtag.js) - Google Analytics