使用Extjs和PHP快速构建Web应用系统二

第二章 前端编码-app flow

使用ext-gen生成的Extjs应用文件夹结构如下:

 

任务一:在app.js中定义全局变量和全局函数

 

// 全局变量
var appTitle = '应用标题';
var baseUrl = 'http://localhost/back/';
var dict = {};
var oper = {};
var smxt = null;
var toastTimeout = 3000;

 

其中,baseUrl为后台应用的访问地址。可以和前台应用分开部署,支持跨域访问。

 

// 读取LocalStorage
function getLSItem(v) {
    try {
        smxt = JSON.parse(localStorage.getItem(v));
    } catch (err) {
        smxt = null;
    }
    return smxt;
}

getLSItem用于读取一些暂存于LocalStorage中的信息。

 

// #region 异步调用函数,支持跨域(需要服务器支持)
function pack(obj) {
    var sm = getLSItem("abcdefg");
    obj.params = obj.params || {};
    if (sm) {
        Ext.apply(obj.params, {
            uid: sm.id,
            session: sm.session
        });
    }
    Ext.apply(obj, {
        timeout: 3600000,
        url: baseUrl + obj.url,
        xhrFields: {
            withCredentials: true
        },
        crossDomain: true,
    });
}

function hii(obj) {
    pack(obj);
    Ext.apply(obj, {
        success: function (resp) {
            var s = resp.responseText;
            if (Ext.String.startsWith(s, 'var')) {
                eval(s);
            } else if (Ext.String.startsWith(s, '<iframe')) {
                obj.fn(s);
            } else {
                var ret = Ext.decode(s);
                if (ret.success == false && ret.message == 'EXPIRED') {
                    localStorage.removeItem('abcdefg');
                    Ext.Viewport.removeAll();
                    Ext.Viewport.add([{ xtype: 'loginview' }]);
                    Ext.toast('登录凭证已过期,请重新登录', toastTimeout);
                } else {
                    obj.fn(ret);
                }
            }
        },
        failure: function (resp) {
            console.log(resp);
        }
    });
    Ext.Ajax.request(obj);
}

function hjj(form, obj) {
    pack(obj);
    Ext.apply(obj, {
        success: function (f, result) {
            f.setMasked(false);
            obj.fn(result);
        },
        failure: function (f, result) {
            f.setMasked(false);
            obj.fe(result);
        }
    });
    form.setMasked({ xtype: 'loadmask' });
    form.submit(obj);
}
// #endregion

上述三个函数包装Extjs的Ajax,用于实现和后台应用的交互。

 

// 转换为数据字典(single)
function sdict(a, v) {
    if (v == null || v.length <= 0)
        return '-';
    var x = Ext.Array.findBy(a, function (o) {
        return o[0] == v;
    });
    return !x ? '-' : x[1];
}

// 转换为数据字典(mutli)
function mdict(a, v) {
    if (v == null || v.length <= 0)
        return '-';
    var x = v.split(',');
    var t = '';
    Ext.Array.each(x, function (v) {
        var m = Ext.Array.findBy(a, function (o) {
            return o[0] == v;
        });
        if (m) t = t.concat(t.length > 0 ? '|' : '', m[1]);
    });
    return t;
}

// 将数组转换为Json格式
function sconv(a) {
    var ret = [];
    Ext.Array.each(a, function (v) {
        ret.push({ value: v[0], text: v[1] });
    });
    return ret;
}

// 单元格着色
function acell(v, r) {
    var x = '<span style="color:red">';
    if (v == '正常') {
        x = '<span style="color:green">';
    }
    return x + v + '</span>';
}

// 将Item追加至TabBar中
function addChildTabBar(tab, obj) {
    var i = tab.child(obj.xtype);
    if (i && i.getInitialConfig('single')) {
        tab.setActiveItem(i);
    } else {
        tab.setActiveItem(tab.add({
            xtype: obj.xtype,
            title: obj.title || obj.text,
            single: obj.single || true,
            closable: obj.closable || true
        }));
    }
}

addChildTabBar用于将子窗口加入到主TabBar中,实现多页的效果。

 

Ext.application({
    extend: 'xt.Application',
    name: 'xt',
    requires: [
        'Ext.Toast',
        'Ext.layout.Fit',
        'Ext.panel.Collapser',
        'Ext.data.TreeStore',
        'Ext.grid.plugin.PagingToolbar',
        'Ext.grid.plugin.ViewOptions',
        'Ext.grid.plugin.RowOperations',
        'Ext.grid.rowedit.Plugin',
        'Ext.grid.filters.Plugin',
        'Ext.grid.plugin.filterbar.FilterBar',
        'Ext.form.FieldSet',
        'Ext.field.Hidden',
        'Ext.field.InputMask',
        'Ext.field.CheckboxGroup',
        'Ext.Label'
    ]
});

最后调用Ext的application函数,开始启动Web应用进程。

 

任务二:修改默认应用程序入口

app.js后会接着调用application.js,修改application.js如下:

Ext.define('xt.Application', {
    extend: 'Ext.app.Application',
    name: 'xt',
    requires: ['xt.*'],

    removeSplash: function () {
        Ext.getBody().removeCls('launching');
        var elem = document.getElementById("splash");
        elem.parentNode.removeChild(elem);
    },
    launch: function () {
        this.removeSplash();
        var sm = getLSItem("abcdefg");
        if (!sm) {
            Ext.Viewport.add([{ xtype: 'loginview' }]);
        } else {
            hii({
                url: 'user/verify',
                fn: function (data) {
                    if (data.success) {
                        var sec = {};
                        Ext.apply(sec, { session: data.session });
                        Ext.copy(sec, data.user, 'id');
                        localStorage.setItem('abcdefg', Ext.encode(sec));
                        Ext.apply(oper, data.user);
                        Ext.apply(dict, data.dict);
                        Ext.Viewport.add([{ xtype: 'mainview' }]);
                    } else {
                        Ext.Viewport.add([{ xtype: 'loginview' }]);
                        Ext.toast(data.message, toastTimeout);
                    }
                }
            });
        }
    }
});

在这里会调用后台user/verify接口,判断该用户是否可以免密登录,是则直接进入mainView,否则进入loginView登录界面。

 

application.scss是全局级的css设置,在这里主要用于一些窗口的颜色和对齐等。

@include tabbar-ui($ui: 'xt-tabbar-1',
    $background-color:gray,
    $border-style: solid,
    $horizontal-spacing:2px);

.x-layout-box {
    justify-content: left !important;
}

.x-toolbar-body-el {
    min-height: 40px;
}

.x-panelheader.x-horizontal {
    min-height: 40px;
}

.x-tab .x-inner-el {
    padding: 0 !important;
}

.x-innerhtml {
    margin: 0;
    padding: 0;
    height: 100%;
    width: 100%;
}

下一篇介绍如何实现登录窗口。

原文地址:https://www.cnblogs.com/yanshixin/p/16303418.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我有一个问题,我不知道如何解决.我有一个Indy10HTTP服务器.我在许多应用程序中使用过Indy9和Indy10HTTP服务器,从未遇到任何问题.但现在我使用带有ExtJSjavascriptRAI框架的Indy10HTTP服务器.问题是当我提交包含非ansi字符的数据时.例如,当我提交1250代码页中的字母“č”(
我正在使用sdk1.17开发一个Firefox附加组件.它包含一个带有按钮的面板(使用ExtJs开发),我想在用户单击按钮时拍摄当前页面的屏幕截图.在GoogleChrome中,有一个API(chrome.page-capture)就在那里.但我在Firefox中找不到类似的那个.在firefox中如何从main.js完成此任务.解决方法:哦
Ext.define('PhysicsEvaluationSystemV1.view.base.BaseCharts',{extend:'Ext.panel.Panel',xtype:'basecharts',html:'<divid="main"style="width:600px;height:400px;"></div&
默认所有列(假设列3最大3列,动态显示),使用headerRowsEx中的rowspan实现双表头,第一层表头的width也必须要设置正确。使用"grid.getColumnModel().setHidden"即可实现列的隐藏,也不需要动态设置colspan。{xtype:'filtergrid',id:'grid1',cm:newExt.grid.Colu
序言   1.ExtJs是一套很好的后台框架。现在很流行的,我们要会。    2.这是我写ExtJs的第一篇,以后会写很多直到把这框架运用的炉火纯青,走火入魔。ExtJs中的命名空间      我是做.net的,这命名空间名字一样,功能也一样,都是对项目中类进行有效的管理,区分类
我在ExtJs中有这个表单.如果field1不为空,则field2不能为空.但即使听众正在解雇,它也无法正常工作.{xtype:'panel',title:'title1',items:[{xtype:'fieldset',title:'fieldA',items:[{xtype:'t
我可以将HTML元素(如文本和图像)放在面板标题中,如下所示:vargrid=newExt.grid.GridPanel({region:'center',style:'margin:10px',store:newExt.data.Store({data:myData,reader:myReader}),headerCfg:{tag:
解决方案来至于https://www.sencha.com/forum/showthread.php?471410-Bug-in-VS-Code-Plugin-since-VS-Code-Update-(-gt-1-31)在C:\Users\你的用户名\.vscode\extensions\sencha.vscode-extjs-1.0.1\out\src文件下找到Logger.js,打开它。找到代码fs.writeFile(path.join(Platfo
<%@pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%><!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN"><html><head><title>MyJSP'index.jsp'
Ext.isEmpty(str,[allowEmptyString])如果str为nullundefinedazero-lengtharrayazero-lengthstring (UnlesstheallowEmptyStringparameterissettotrue)//意思如果第二个参数设为true,则是允许str对象为空字符串该方法返回true 如果不为上面条件则返回fal
以编程方式关闭ExtJS选项卡的正确方法是什么?我需要在IE6中完成这项工作;虽然从TabPanel删除选项卡有效,但我看到IE警告:此页面包含安全和不安全的项目……当我单击选项卡上的X时,我看不到此警告.所以,当我点击X时,显然会发生一些聪明的事情.注意:当我使用tabPanel.remove(aTab,true
1.链接1.1.零散知识链接https://blog.csdn.net/zhaojianrun/article/details/701410711.2.系统教程http://extjs.org.cn/1.3.视频教程1.4.官方网站 
ExtJS有Ext.each()函数,但是有一个map()也隐藏在某个地方吗?我努力了,但没有找到任何可以填补这个角色的东西.这似乎是一件简单而微不足道的事情,一个像Ext这样庞大的JS库显然必须拥有.或者当Ext真的不包含它时,将它添加到Ext的最佳方法是什么.当然,我可以写:Ext.map=function(
我在一家使用Ext-JS的公司工作.该产品目前过度扩展了Ext-JS组件并覆盖了父功能.这使升级变得困难.我们正在保留Ext-JS,但我们正在考虑以非标准的方式使用它.似乎有两个阵营.在一个阵营中,成员们认为我们应该在Ext-JS之上编写一个抽象,以防我们决定在几年内改变框架,希望这样我们不
我想计算今天和给定日期之间的天数,并检查截至今天剩余的天数或今天过去的天数.vartoday=newDate();vardate_to_reply=newDate('2012-10-15');vartimeinmilisec=today.getTime()-date_to_reply.getTime();console.log(Math.floor(timeinmilisec/(1000*60*
我将JSON格式结果发送回保存$quot符号的客户端.由于某些未知原因,代码中断了.这是来自ext-all-debug的代码:doDecode=function(json){returneval("("+json+")");FAILSHERE},这是我的JSON,因为它离开了服务器(据我所知,我希望服务器没有花时间解码这个&quot的
我创建了Ext.Window,里面有一些Ext.form字段.但是当我调整窗口窗体时,元素仍然具有初始宽度和高度.是否需要在窗口大小调整时显式调整表单字段的大小?或者有一些选项可以自动调整表单字段的大小?示例代码:varf_1=newExt.form.TextField({fieldLabel:'Label1'});varf_2=n
我有一个简单的案例,我有一个附加商店的网格.有2个按钮.一个带有修改所选记录的处理程序.一个具有提交所选记录的处理程序.当我选择一个记录并推送编辑时–>编辑发生选择(看起来丢失)如果你调用grid.geSelectionModel().getSelection()你会看到记录仍然被选中.它只是没有这样显
我有这种ajax代码重复了很多地方.如何将其重构为单个方法,以便在成功或失败时仍允许不同的行为.Ext.Ajax.request({url:'ajax.php',params:{action:'getDate'},method:'GET',success:function(result,request){Ext.MessageBox.alert(
Ext.define('JsApp.com.Util',{  /**   *显示新建视图   *title:新建界面显示的标题   *xtype:新建界面的别名   */  showCreatingView:function(title,xtype){    this.shrink.formType='create';    this.shrink