• 12、ERP设计之 系统基础管理(BS)- 模块与菜单的关联


    ShareERP2013-10-03

             模块:具有功能设计、权限绑定,链接用户菜单与系统的重要桥梁。

             菜单:是用于显示与用户交互的重要入口,更是导航系统的舵手,所以它的设计直接影响到用户体验。

     

             菜单可能根据不同的用户会有不同的加载方式,特别是定制的系统,灵活性不必可少。并且,可扩展性,提供用户二次开发接口,可挂接用户自己的模块及调用菜单,当用户增加自己的模块或菜单后,能否进行权限控制,那么在权限设计时就要充分考虑到这些要素,详细请参看权限设计。

     

    在一般系统中,菜单和工具栏按钮是共享事件过程的,我们不太可能给每个Event绑定一个过程,那样的代码量不但大而且冗余,就笔者使用的Delphi为例,Delphi为我们提供了ActionList控件,它是能很好的链接菜单和工具栏按钮的控件,不光是Event能共享,就连快捷键、图像、标题、Hint都为我们做好了。有了它看似简单许多,但我们还要进一步简化操作,就算共享Event,但功能项太多,不能每项都去编写代码,并且每项功能还都是动态创建的,为此我们要做一个统一的Event过滤器来执行操作,将所有的功能项绑定到Event过滤器上,以功能编号来区别功能调用。

            

    为方便维护,笔者将各个子系统模块定义成DLL动态库,动态库里分若干子模块,每个子模块对应一菜单项,这样的映射关系需要做一个菜单模块映射表,用来记录它们,以便用户自定义自己的模块。

    菜单与模块映射表

         

    序号

    主键

    字段名

    字段说明

    数据类型

    长度

    1

    YES

    iAutoID

     

    int

    4

    2

     

    cMCode

    模块编号

    varchar

    20

    3

     

    cMenuName

    菜单名

    varchar

    20

    4

     

    cMenuCaption

    菜单标题

    varchar

    40

    5

     

    cParentName

    父级菜单

    varchar

    20

    6

     

    cRemark

    备注

    varchar

    20

    7

     

    bVisible

    菜单可见

    bit

    1

    有了菜单与模块映射表,就可以动态的为系统创建模块菜单和树形视图。

     

    前面提到,DLL动态库模块,动态库模块它本身也是一个树形结构。

     

    模块->

    子模块->

        功能项->

        功能项N…

    子模块N…->

     

    Delphi 为我们提供了TCollection对像,它非常方便管理这种结构,然后再将 TCollection转成菜单就OK。

     

    模块管理类的简单定义:

    TModuleMgr = class;
    
     
    
      //菜单项
    
    TModuleItem = class(TCollectionItem)
    
    public
    
       fTreeNode: TTreeNode;
    
       fMInfo: TModuleItemRec;
    
       procedure MenuOnClick(Sender: TObject); //菜单点击事件过滤
    
    end;
    
     
    
    TModules = class(TCollection)
    
    private
    
       fForms: TList;
    
       DLLHandle: Integer; //DLL句柄
    
       fSysHelper: TModuleMgr;
    
       procedure OnTimer(Sender: TObject);
    
       function GetItems(Index: Integer): TModuleItem;
    
       procedure SetItems(Index: Integer; Value: TModuleItem);
    
    public
    
       ModuleID: Integer;
    
       DLLFileName: string;
    
       function AddDLLFunction(const MenuCode: string): TModuleItem;
    
       constructor Create(ItemClass: TCollectionItemClass; ASysHelper:TModuleMgr);
    
       property Items[Index: Integer]: TModuleItem read GetItems writeSetItems;
    
       destructor Destroy; override;
    
       function GetActiveFunc: TModuleItem;
    
       procedure Execute(AItem: TModuleItem);
    
    end;
    
     
    
     
    
    TModuleItemRec = record
    
       ModuleDllName:    string;         //Dll Name
    
       ModuleParentCode: string;        //父项序号
    
       ModuleCode:       string;         //模块功能序号
    
       MenuCode: string;                //菜单编码
    
       ModuleFormTitle:  string;         //菜单标题
    
       ModuleTemplate:   string;         //模板名
    
       iShowType:        Byte;           //窗口显示类型
    
       ModuleType:      TTemplateType;  //模块类型 =TTemplateType单据模板类型
    
       ModuleEnabled:    Boolean;        //菜单是否有效
    
       RootAuth:         string;         //权限编码
    
       InfaceName:       string;         //接口名
    
     end;
    
     PModuleItemRec =^TModuleItemRec;
    
     
    
     


    下篇:系统基础管理(BS)- 栏目与查询  待续……

    来源:分享ERP  http://www.shareerp.com 联系QQ:908916944

  • 相关阅读:
    AcWing 1081. 度的数量
    CF584D Dima and Lisa
    [ABC130F] Minimum Bounding Box
    AT4289 [ABC133E] Virus Tree 2
    Arc of Dream HDU
    Reading comprehension HDU
    【洛谷 1541】乌龟棋
    【洛谷 4880】抓住czx
    【洛谷 1525】关押罪犯
    【洛谷 1040】加分二叉树
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3354321.html
Copyright © 2020-2023  润新知