抱歉,最近比較忙,更新的比較慢~
=========================分隔線====================================
流量系統,是開放給內部所有用戶使用,用於查詢網站相關流量數據。
Boss們需要能看到所有欄目的所有流量數據,而普通編輯們,則只能查看自己負責欄目的流量數據;
管理員需要給所有人設置權限的權限;
。。。。。。
對於普通的Web應用程序或MVC來說,可以通過控制html元素的顯示與否、可用與否來實現權限。
而對於ExtJs來說,如何實現就是另一回事了。
=========================分隔線====================================
先來看看有哪些地方需要配置權限吧。

左邊手風琴有三個部分,Accordion控件不像Tree一樣,可以從服務端加載數據生成控件,它只能手動的逐個添加子項。
所以要實現權限控制,只好從服務端加載完權限信息后,再來控制各部分顯示與否。
另外,如果手風琴的子項內,也就是內部的Tree控件,沒有任何節點的話,則自動將該子項隱藏。
Ext.define('Yiqi.Main.SysSetTree', {
extend: 'Ext.tree.Panel',
requires: ['Yiqi.Common.Model.FunctionMenu'],
parentId: 2,
loadUrl: '',
initComponent: function () {
this.loadMask = new Ext.LoadMask(this, { msg: '加載中...' });
this.buildStore();
var me = this;
Ext.apply(this, {
rootVisible: false,
lines: false,
store: this.dataStore,
listeners: {
itemclick: this.onItemClick,
beforeitemexpand: function () {
me.loadMask.show();
},
itemexpand: function () {
me.loadMask.hide();
},
load: function (store, obj, records, eOpts) {
if (!me.loadMask.isHidden()) {
me.loadMask.hide();
}
if (records.length <= 0) {
me.ownerCt.remove(me);//--如果沒有子項,則隱藏
}
}
}
});
this.callParent(arguments);
}
});
各部分里邊的內容,都是Tree控件,這個不用多說也能想到,直接在服務端返回可用的就行。
權限配置功能也比較簡單。


=========================分隔線====================================
左側手風琴比較簡單。
而下邊這個,就比較麻煩了。

這是哪?這是流量數據顯示界面頂部的工具條(Toolbar),用於切換數據顯示。
是的,並非所有欄目的功能都一樣。
比如:某些欄目才有地理信息統計,某些欄目才有訪問排行。。。。。。
如果在左側加一個Tree控件來顯示所有功能的話,那么就簡單多了,對吧。
但這樣的話,就嚴重擠壓了圖表的空間,對於這樣一個系統,圖表及數據的展示,才是重點。
而在頂部以一個工具條的方式顯示菜單的話,似乎就簡潔多了。。。
好吧,那就這么干吧。。。
=========================分隔線====================================
一般Toolbar都是固定的,而基於服務端數據的Toolbar則是靈活的。
對Toolbar子組件的類型,有三種要求:
1、純分組用,就像文件夾一樣;
2、帶功能的分組,即有子組件的按鈕,在ExtJs里,叫SplitButton。
3、就是純按鈕了。
先看一下用來加載Toolbar的數據是什么樣的。

功能地址:就是點擊按鈕后,會加載的功能地址,也是功能對應的js文件路徑。這個在之前的文章里也說過。
可以看到,有些項目的功能地址是空的,沒錯,就是用這個字段來區別類型。
有子項目,功能地址為空,則說明是純分組用的;有子項目,功能地址也不為空,則說明是帶分組的功能按鈕;沒有子項目的就是純按鈕咯。
=========================分隔線====================================
從服務端加載好這些數據后,逐一循環,根據這個規則來決定ExtJs需要創建的類型,創建完成,再add到Toolbar里。
當然,理論上支持無限級子菜單。
Ext.define('Yiqi.Show.Catagory.FunctionToolBar', {
extend: 'Ext.toolbar.Toolbar',
alias: 'widget.functionbar',
catagoryId: 1,
loadStatics: function (path, scope) { },
handlerScope: null,
initComponent: function () {
Ext.apply(this, {
items: [
//--一加載就顯示Loading,提高用戶體驗
{ xtype: 'displayfield', value: '<img src="/Scripts/ext4.2/resources/themes/images/default/grid/loading.gif"/> 菜單加載中......' }
]
});
this.callParent(arguments);
},
afterRender: function () {
//--渲染完成后,再從服務端加載數據,並創建Toolbar
this.loadEnabledMenu();
this.callParent(arguments);
},
loadEnabledMenu: function () {
var me = this;
Ext.Ajax.request({
url: '/FunctionMenu/GetEnabledList',
params: {
catagoryId: me.catagoryId
},
method: 'POST',
success: function (response, opts) {
Yiqi.Common.Tools.IsLogin(response);
var result = Ext.decode(response.responseText);
var menu = me.buildMenu(result);
me.removeAll(true);
me.add(menu);
},
failure: function (response, opts) {
Ext.Msg.alert("提示", "保存失敗(報錯)~!");
}
});
},
buildMenu: function (list) {
var me = this;
var menu = [];
//--循環所有
Ext.Array.each(list, function (m) {
menu.push(me.createSingle(m));
});
return menu;
},
createSingle: function (data) {
var me = this;
var menu = {};
//--功能地址不為空
if (!Ext.isEmpty(data.LoadPath, true) && Ext.String.trim(data.LoadPath).length > 0) {
if (data.Children.length > 0) {
menu.xtype = 'splitbutton';
}
if (me.handlerScope) {
menu.scope = me.handlerScope;
}
menu.handler = function () {
this.createItem(data.LoadPath, menu);
//me.loadStatics(data.LoadPath, menu);
}
}
menu.text = data.text;
menu.iconCls = data.iconCls;
//--有子菜單,則繼續循環
if (data.Children.length > 0) {
var childMenu = me.buildMenu(data.Children);
menu.menu = {
items: childMenu
};
}
return menu;
}
});
