前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ExtJs九(ExtJs Mvc用户管理之一)

ExtJs九(ExtJs Mvc用户管理之一)

作者头像
aehyok
发布于 2018-09-11 04:26:16
发布于 2018-09-11 04:26:16
4.9K00
代码可运行
举报
文章被收录于专栏:技术博客技术博客
运行总次数:0
代码可运行

首先要做的是为用户信息创建一个模型,在Scripts\app\model目录下创建一个名为User.js的文件,然后添加以下模型定义代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ext.define('ExtMVCOne.model.User', {
    extend: 'Ext.data.Model',
    fields: [
    "id",
    { name: "Username", defaultValue: "newuser" },
            { name: "Email", defaultValue: "newuser@email.com" },
        { name: "Roles", defaultValue: "普通用户" },
    { name: "Created", type: "date", dateFormat: "Y-m-d H:i:s", defaultValue: new Date() },
    { name: "LastLoginDate", type: "date", dateFormat: "Y-m-d H:i:s" },
        { name: "IsApproved", type: "bool", defaultValue: true }
    ],
    idProperty: "id"
});

Membership提供者中的字段很多,在这里只使用了用户编号、用户名、电子邮件、角色、创建日期、最后登录时间和是否禁用等7个字段。这只是一个示例,并不一定要按照这样去做,具体可根据自己需要修改。在字段定义中,可看到,很多字段都设置了defaultValue配置项,它的作用是在新建用户的时候,会使用该配置项的值作为默认值。这是ExtJS 4新添加的模型的功能,相当实用。

模型定义好以后,就要定义了Store了。Store除了要定义用户的外,因为要设置用户角色,所以还要定义用户角色的Store。先来定义用户的Store,因为全部操作是在Grid内完成的,因而直接使用api配置项功能定义好列表、添加、删除和编辑的地址,就可简单的实现这些功能的提交操作了,相当的方便。其它要注意的地方好定义好reader的格式,以及writer的格式。在Scripts\app\store\目录下创建Users.js文件,并在文件内添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ext.define("ExtMVCOne.store.Users", {
    extend: 'Ext.data.Store',
    model: 'ExtMVCOne.model.User',
    batchActions: false,
    autoLoad: true,
    proxy: {
        type: "ajax",
        api: {
            read: 'Users/List',
            destroy: 'Users/Delete',
            update: "Users/Edit",
            create: "Users/Add"
        },
        reader: {
            type: 'json',
            root: "data",
            messageProperty: "Msg"
        },
        writer: {
            type: "json",
            encode: true,
            root: "data",
            allowSingle: false
        }
   }
})

代码中,设置了batchActions配置项为true,表示不实现批量操作,而是每当执行一个操作就提交数据。配置项autoLoad表示自动去加载数据,不需要手动去加载了。

在proxy中的api配置项,为4个操作固定好了提交地址,提交的都是Users控制器的方法。在render配置项中,固定了返回数据的格式,数据都必须在data关键字内,也就是root配置项定义的值,这个可根据自己的习惯定义。而错误信息则在Msg关键字内。而在writer中,encode设置为true的作用就是使用习惯的提交方式提交数据,而不是以JSON流的方式提交,这个具体在笔者的书中有讲述。配置项root的与reader的作用是一样的,表示数据可通过读取data关键字获取。而配置项allowSingle的作用是提交的数据是否一个个提交,在这里设置为false,表示不允许一个个提交,也就是所有修改过的数据都会一次提交,在data关键字内可取到。

接着为角色定义Store,在这里为了简单起见,就不从服务器获取角色数据了,直接定义在Store里了。在Scripts\app\store\目录下创建Roles.js文件,并在文件内添加如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ext.define("ExtMVCOne.store.Roles", {
    extend: 'Ext.data.ArrayStore',
    fields: ["text"],
    data: [["普通用户"], ["系统管理员"]]
})

现在要为用户管理编写控制器,在Scripts\app\controller目录下创建Users.js文件,并添加控制器的基本定义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Ext.define('ExtMVCOne.controller.Users', {
    extend: 'Ext.app.Controller',
    init: function () {
        this.control({
        });
    }
});

好了,现在要考虑控制器需要什么了,因为它的视图需要用到用户模型和用户及角色的Store,因而需要添加models配置项和stores配置项,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    models: [
        'User'
    ],
    stores: [
        'Users',
        'Roles'
    ],

视图也是必不可少的,因而添加以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    views: [
        'Users.View'
    ],

这里要注意视图类的名称结构,代码中使用了Users.View表示创建视图时,要在\Scripts\app\view目录下创建Users目录,然后在创建View.js文件。这个可根据自己需要创建,例如不想创建目录,那么视图的名称就直接使用UsersView。当项目小的时候,文件不多,这样命名没有任何问题,但是如果是大项目,文件很多,就要注意同名文件问题,因而习惯使用目录区分视图是好的方法,是一个好的习惯。

因为要在主面板的标签页面板内添加视图,因而需要引用标签页面板,因而要加入refs配置项,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    refs: [
        { ref: "UserPanel", selector: "#userPanel" }
    ],

代码中,ref配置项会生成引用的方法,例如当前代码,可通过getUserPanel获取面板。而selector配置项就是面板的选择器了,在这里使用它的id选择。

现在,要考虑怎么加载这个控制器了,并将视图添加到面板了。在定义控制器时,都有1个init方法,在这里可以执行一些初始化操作,因而可在这里将视图添加到面板,将init方法内的代码修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    init: function () {
        var me = this,
           panel = me.getUserPanel(),
           view = Ext.widget("usersview");
        panel.add(view);
        me.control({
        });
    }

代码调用的getUserPanel方法,就是refs配置项定义中自动生成的方法,通过该方法获取面板后,将创建的用户视图通过add方法添加到面板就行了。

现在切换到主面板控制器MainPanel.js,在用户管理的activate事件中,删除alert语句,调用getController方法加载控制器并调用控制器的init方法就行了,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            '#userPanel': {
                activate: {
                    single: true,
                    fn: function (panel) {
                        //Ext.Msg.alert("提示信息", panel.title);
                        this.application.getController('Users').init();
                    }
                }
            }

现在,创建视图,在Scripts\app\view目录下先创建目录Users,然后在该目录下创建View.js。要使用Grid显示用户信息,因而要从Grid面板派生出视图。定义的时候要注意视图的类名。还有就是一定要定义别名,因为在控制器中是使用widget方法创建的视图实例。如果不想定义别名,那就要修改创建实例的方式。具体的基本定义代码如下:

代码中的id可根据需要定义,在这里是不管有没有用,先定义。如果项目类太多,要注意避免id冲突。标题定义可有可无,因为是在标签页内,看自己需要。

Grid需要Store,因而先添加store配置项,使用的Store是Users,因而定义代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
store: "Users",

列的定义,可以直接使用配置项定义,也可以在initComponent方法内定义,具体看情况,例如当前例子,要为列添加编辑组件,因而在initComponent方法内定义比较合适,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        me.columns = [
        { text: '用户名', dataIndex: 'Username', flex: 1 },
        { text: '电子邮件', dataIndex: 'Email', flex: 1 },
        { text: '角色', dataIndex: 'Roles', flex: 1 },
        { xtype: "datecolumn", text: '创建时间', dataIndex: 'Created', format: "Y-m-d H:i:s", width: 150 },
        { xtype: "datecolumn", text: '最后登录时间', dataIndex: 'Created', format: "Y-m-d H:i:s", width: 150 },
        { xtype: 'checkcolumn', dataIndex: "IsApproved", text: "允许登录", winth: 150 }
    ]

现在定义都是一些基础代码,还没定义编辑组件,这样有个好处,先调试好显示,再进入下一阶段,可以减少错误。在最后一个字段,使用了扩展CheckColumn,因而要在Ext包中将CheckColumn.js文件复制到Ext\ux目录下,并添加requires配置项,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
requires:["Ext.ux.CheckColumn"],

接着要在顶部工具栏添加一个分页工具条,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    me.tbar = {
        xtype: "pagingtoolbar",
        pageSize: 50, displayInfo: true, store: me.store
    }

这里设置了每页显示的记录数为50条记录,可根据自己情况做调整。

最后要在底部工具栏添加一段说明文字,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
me.bbar = ["双击用户可进入编辑状态,用户密码默认为“123456”。重置密码可将用户密码重置为“123456”。"]

F5运行即可看到

现在还没有数据,而且我们添加的bbar紧贴在了Grid下面,说明了标签页的布局有点小问题,那就在VS中切换到主面板视图(MainPanel.js),在添加用户管理面板的地方加入以

下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
layout:"fit"

 再刷新一下页面

现在,在服务器端创建Users控制器,为Grid提供数据。在Controllers目录创建一个名称为UsersController的控制器。加入必要的引用后,将Index方法修改为List方法,返回结果为JObject,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public JObject List()
        {
            try
            {
                //throw new Exception("发生错误了。");
                int pagesize = 50;
                int page = 0;
                int.TryParse(Request["page"], out page);
                if (page <= 0) page = 1;
                int total = 0;
                JArray ja = new JArray();
                foreach (MembershipUser c in Membership.GetAllUsers(page - 1, pagesize, out total))
                {
                    string[] rolesForUser = Roles.GetRolesForUser(c.UserName);
                    ja.Add(new JObject { 
                        new JProperty("id",c.ProviderUserKey),
                        new JProperty("Username",c.UserName),
                        new JProperty("Email",c.Email),
                        new JProperty("IsApproved",c.IsApproved),
                        new JProperty("LastLoginDate",c.LastLoginDate.ToString("yyyy-MM-dd hh:mm:ss")),
                        new JProperty("Created",c.CreationDate.ToString("yyyy-MM-dd hh:mm:ss")),
                        new JProperty("Roles",new JArray(rolesForUser.Select(m=>m)))
                    });
                }
                return MyFunction.WriteJObjectResult(true, total, "", ja);
            }
            catch (Exception e)
            {
                return MyFunction.WriteJObjectResult(false, 0, e.Message, null);
            }
        }

同时要在MyFunction中添加相应的方法,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        public static JObject WriteJObjectResult(bool success, int total, string message, JArray data)
        {
            return new JObject { 
                new JProperty("success",success),
                new JProperty("total",total),
                new JProperty("Msg",message),
                new JProperty("data",data)
            };
        }

现在再来运行一下,然后用admin登录后可查看到

数据就这样出来了哦。

示例代码下载链接http://files.cnblogs.com/aehyok/ExtJsUserView.rar

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2013-04-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ExtJs十(ExtJs Mvc用户管理之二)
为了防止意外情况,这里添加了try模块,在错误的时候会将错误信息作为Msg关键字的值返回。
aehyok
2018/09/11
6.7K0
ExtJs十(ExtJs Mvc用户管理之二)
ExtJs八(ExtJs Mvc创建ViewPort续)
现在要考虑的是如何加载标签页内的内容。虽然标签页默认是延迟渲染的(deferredRender值默认为true),但是它会预加载所有的类,因而当类文件很多的时候,加载时间就是一大问题了。这个,也可通过SDK打包的方式解决,不过在设计阶段还是要考虑的。另一种好的解决方法是,只使用标签页的标签,而不使用其主体加载内容,另外使用一个容器,内部使用CardLayout作为布局.
aehyok
2018/09/11
4.1K0
ExtJs八(ExtJs Mvc创建ViewPort续)
ExtJs十二(ExtJs Mvc图片管理之二)
接着图片管理一http://www.cnblogs.com/aehyok/archive/2013/04/27/3048278.html。
aehyok
2018/09/11
1.1K0
ExtJs十二(ExtJs Mvc图片管理之二)
ExtJs十四(ExtJs Mvc图片管理之四)
现在来实现排序的问题。要实现远程排序,首先要清楚的是排序信息是如何提交到服务器的,而这个,利用FireBug相当简单。
aehyok
2018/09/11
3.4K0
ExtJs十四(ExtJs Mvc图片管理之四)
ExtJs十三(ExtJs Mvc图片管理之三)
现在要完成目录的编辑操作。因为目录的编辑只是改变目录名称,因而使用Cellediting插件就可完成工作。要完成这个不难,首先在目录树的定义中加入以下语句隐藏列标题:
aehyok
2018/09/11
4K0
ExtJs十三(ExtJs Mvc图片管理之三)
Extjs MVC架构 (官方文档翻译)【带源码】
原文地址:http://docs.sencha.com/extjs/4.2.5/#!/guide/application_architecture
明明如月学长
2021/08/27
1.4K0
Extjs mvc
MVC的模式,模型(Models)和控制器(Controllers) Model模型 是字段和它们的数据的集合,例如User模型带有username和password字段,模型知道如何持久化自己的数据,并且可以和其他模型关联,模型跟ExtJS 3 中的Record类有点像(区别是,Record只是单纯的扁平结构,而Model可以nest),通常都用在Store中去展示grid和其他组件的数据 View视图 是组件的一种,专注于界面展示 - grid, tree, panel 都是view Controlle
用户1197315
2018/01/22
2.5K0
Extjs mvc
ExtJs十一(ExtJs Mvc图片管理之一)
图片管理要在两个地方使用:一是标签页内的图片管理,一是文章内容编辑时嵌套到插入图片的窗口内。因而,将图片管理做成一个扩展比较方便。当然,做成MVC模式也行,不争论,不讨论。
aehyok
2018/09/11
3.4K0
ExtJs七(ExtJs Mvc创建ViewPort)
在4.1的时候,要先创建一个扩展于Ext.app.Application的类,然后用create创建它的实例来开始应用程序的。而在4.1.1,则可直接调用application方法开始执行应用程序,简化了。调用application方法,其参数是一个配置对象,主要配置项有以下三个: name:用来定义应用程序的名称,在这里是ExtMVCOne。 appFolder:应用程序的路径,这里是scripts/app autoCreateViewport:默认值为false,在这里要设置为true,让它自动加载\Script\app\View目录下的Viewport.js文件。因为目录已经在Loader中配置好了,因而不用设置目录。
aehyok
2018/09/11
8.7K0
ExtJs七(ExtJs Mvc创建ViewPort)
ExtJs四(ExtJs MVC登录窗口的调试)
继上一节中实现了验证码http://www.cnblogs.com/aehyok/archive/2013/04/19/3030212.html,现在我们可以进行对登录界面进行整合调试了。
aehyok
2018/09/11
4.4K0
ExtJs四(ExtJs MVC登录窗口的调试)
[翻译]Ext JS 教程-MVC架构 原
大规模的客户端应用程序常常难于去编写、组织机构和维护。随着你加入更多的功能,并且投入更多的开发人员,它们渐渐趋向于失去控制。ExtJS 4 带来了一种新的不仅仅能规整你的代码组织结构,而且能限制你要编写的代码数量的应用程序架构。
LeoXu
2018/08/15
3.4K0
[翻译]Ext JS 教程-MVC架构
                                                                            原
ExtJs二(实现登录)
  在上一次http://www.cnblogs.com/aehyok/archive/2013/04/17/3025957.html主要是搭建Ext环境,本次课程主要是通过Ext组件来实现登录。
aehyok
2018/09/11
2.1K0
ExtJs二(实现登录)
产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容。 公司期望把某一管理类信息系统从项目代码中抽取、重构为一个可复用的产品。该系统的前端是基于 ExtJs 5 进行构造的,
用户1172223
2018/01/29
1.9K0
产品前端重构(TypeScript、MVC框架设计)
extjs 基础部分
创建对象的方法:     使用new 关键字创建对象。       new  classname ([config])     使用Ext.create方法创建。       Ext.create(classname,[config])     new Ext.Viewport({})     修改为Ext.create('Ext.Viewport',{})   Ext.widget 或Ext.createWidget 创建对象     使用Ext.ns 或者Ext.namespace  定义命名
用户1197315
2018/01/22
5.4K0
Ext JS 4 架构你的应用 第2节 (官方文档翻译)
原文地址:http://docs.sencha.com/extjs/4.0.7/#!/guide/mvc_pt2
明明如月学长
2021/08/27
7630
ExtJs十四(ExtJs Mvc图片管理之五swfupload)
经过前几节系列文章,现在只剩下利用swfupload来上传图片的功能了,在ExtJs十一(ExtJs Mvc图片管理之一)中有它的下载地址和加入项目的说明。
aehyok
2018/09/11
4.2K0
ExtJs六(ExtJs Mvc首页展示)
要区分登录前和登录后,判断Request的IsAuthenticated方法就可以。因为要通过服务器段代码执行不同的脚本,因而要将Loder这些公共代码抽出来独立在一个Script块里,而不同的脚本在不同的代码里,最终代码如下:
aehyok
2018/09/11
7.8K0
ExtJs六(ExtJs Mvc首页展示)
Extjs4---Cannot read property 'addCls' of null 或者 el is null 关于tab关闭后再打开不显示或者报错
做后台管理系统时遇到的问题,关于tab关闭后再打开不显示,或者报错 我在新的tabpanel中加入了一个grid,当我关闭再次打开就会报错Cannot read property 'addCls' of null, 原因是我在定义grid的错误 这是错误代码: Ext.define('HT.view.Grid',{       extend:'Ext.grid.Panel',       title : '人员列表',       width:400,       height:170,       
hbbliyong
2018/03/05
9440
Extjs-lesson3
Ext.js 系列课程笔记「组件」更多精彩文章请关注公众号『Pythonnote』或者『全栈技术精选』
小闫同学啊
2020/06/28
1.4K0
extjs750 拖拽动态布局组件dashboard用法和样例
版本 7.5.0 classic 主要组件 Ext.dashboard.Dashboard 仪表板组件,可实现动态拖拽布局 主要配置项: parts 仪表板要使用的parts定义,使用键值对形式传入parts.id和psrts.config的映射 columnWidths 仪表板分列默认列宽数组 defaultContent 默认的项目配置. Ext.dashboard.Part 用于创建仪表板项目的组件工厂 主要配置项: viewTemplate 视图模板创建仪表板项目配置的模板,模板的绑定值通过配置
路过君
2022/04/13
3230
相关推荐
ExtJs十(ExtJs Mvc用户管理之二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文