知识大全 业务系统设计之系统菜单设计

Posted 菜单

篇首语:千磨万击还坚劲,任尔东西南北风。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 业务系统设计之系统菜单设计相关的知识,希望对你有一定的参考价值。

  很久没写文章了 前几天有几个朋友问了我很多关于业务系统(ERP DRP CRM等)设计里很多概念性东西 花了很长时间给他解释 最后他门还是知其然不知其所以然 这对于刚跨出学校大门的朋友来说 理解起确实有点枯燥 这里我以以前参与的用友ERP DRP产品项目里的部分设计为参考 通过几篇文章来和大家分享业务系统里的部门平台通用部分的设计应用

  本文主要介绍业务系统设计里的菜单设计 关注我博客的朋友或许以前见过一篇我写的关于菜单的文章 文章连接 使用RadControls的RadMenu控件开发系统菜单  这篇文章主要是介绍了RadControls的RadMenu控件的基本使用 没有详细介绍到菜单如何设计 为什么要那么设计 本文就以这片文章为基础 同样通过此文章的示例程序和示例数据库 结合业务系统设计的相关术语介绍业务系统的菜单设计

  

  首先看看上面的数据库设计结构 其中ID为自动编号的主键字段 Code为菜单编码(也称业务编码) Name为菜单名称  Url为单击菜单所导航的路径 ImageUrl为菜单上显示的图片地址 ShortCut为快捷键 Order为菜单项显示顺序 Grade为菜单级限 EndGrade为是否为末级菜单(既最后一菜单项) SupMenuCode为当前菜单项的父级菜单编码(对应于Code字段) 完整的还应该包括是否受权限控制等字段 这里不一一列出

  上面的数据库设计其实很简单 需要主要的字段有Code菜单编码(也称业务编码) 在业务系统里通常设计为每一菜单项都可以认为是一个业务操作 这里的Code非常重要 业务系统的后续工作都是从这里开始 通常与权限设计结合使用得最多

  系统菜单应该是多层次结构的 比如常见的Windows菜单 业务系统里的菜单设计同样如此 通过SupMenuCode字段来标记该菜单项属于那一项菜单的子菜单 如果没有父级菜单(系统顶层菜单)则标记为

  既然菜单有层次结构 那就一定有层次标识 通过Grade来标记 EndGrade则表示当前菜单项在该层次级别上的菜单项上是否为末级

  分析清楚了需求和菜单设计方案 下面我们着手代码开发 下图为项目解决方案截图

  

  如上图 Menu cs里封装了数据库查询功能 App_Data下存放的Access数据库 RadControls为RadMenu控件所需要的相关文件 Default aspx则为菜单UI界面

  首先需要配置数据库连串 如下

 private static string connectionString =  Provider=Microsoft jet OLEDB ;data Source=        + HttpContext Current Server MapPath(@ App_Data\\MenuDB mdb );

  接着我们需要一个执行SQL的方法 如下代码块

   private  DataTable ExecuteQuery(string cmdText)          using (OleDbConnection conn = new OleDbConnection(connectionString))                  using (OleDbDataAdapter oda = new OleDbDataAdapter(cmdText  conn))                          DataSet ds = new DataSet();               oda Fill(ds);               return ds Tables[ ];                  

  最后我们还需要写两个方法 一个是查询顶层菜单的方法 一个则是实现查询菜单下的子菜单方法(做法有很多种 我个人建议把所有的数据查询出然后在操作内存数据 这里为了方便理解我故采用多次查询数据库的方式来实现)

   public DataTable GetMenu()          string sql =  select * from menu where grade= ;       return ExecuteQuery(sql);         public DataTable GetMenuBySupCode(string supMenuCode)          string sql =  select * from menu where supmenucode=  + supMenuCode +  ;      return ExecuteQuery(sql);  

  OK 准备工作做好后 现在就是需要到UI层上去做菜单的展现工作了 菜单的展现我通过RadContrls的RadMenu控件来实现 此控件相对ASP NET的标准Menu控件功能强大 要使用RadMenu则需要注册控件的引用 如果你是通过RadContrls控件库安装包安装的则会自动注册到VS工具箱 和标准控件使用方法一样

 <%@ Register Assembly= RadMenu Net  Namespace= Telerik WebControls  TagPrefix= rad  %>      <% 菜单开始 %>      <rad:RadMenu ID= SystemMenu  runat= server  Skin= Vista >      </rad:RadMenu>      <% 菜单结束 %>

  上面准备好了顶层菜单的查询方法 直接通过该方法查询出顶层

  菜单项对菜单进行初始化

   protected void Page_Load(object sender  EventArgs e)          if (!IsPostBack)                  InitMenu();                Menu menu = new Menu();  private void InitMenu()        //查询出菜单配置信息      DataTable dtMenu = menu GetMenu();        for (int i =  ; i < dtMenu Rows Count; i++)                //Rad菜单项          RadMenuItem item = new RadMenuItem();            item ID = dtMenu Rows[i][ Code ] ToString();          item Text = dtMenu Rows[i][ Name ] ToString();          item Value = dtMenu Rows[i][ Url ] ToString();          item AccessKey = dtMenu Rows[i][ ShortCut ] ToString();            this SystemMenu Items Add(item);            //菜建子菜单          InitSubMenu(item  dtMenu Rows[i][ Code ] ToString());        

  我们设计为多层次菜单结构 那么在初始化顶层菜单的时候就应该判断该菜单项是否有子菜单 如果有则也初始化子菜单 如果是多级层次的结构 通过递归算法来完成多层次的初始化 如下代码块

      private void InitSubMenu(RadMenuItem item  string supMenuCode)          //根据父菜单编码查询出子菜单配置项       DataTable dtMenu = menu GetMenuBySupCode(supMenuCode);          if (dtMenu != null)                  foreach (DataRow dataRow in dtMenu Rows)                        RadMenuItem subItem = new RadMenuItem();                subItem ID = dataRow[ ID ] ToString();              subItem Text = dataRow[ Name ] ToString();              subItem Value = dataRow[ Url ] ToString();              subItem AccessKey = dataRow[ ShortCut ] ToString();                item Items Add(subItem);                if (Convert ToInt (dataRow[ EndGrade ]) !=  )                                InitSubMenu(subItem  Convert ToString(dataRow[ Code ]));                                 cha138/Article/program/net/201311/13398

相关参考

知识大全 java设计模式之Command(菜单命令)

java设计模式之Command(菜单命令)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Co

电气工程信息化应用系统设计要求?

  1、信息化应用系统的功能应符合下列要求:  1)应提供快捷、有效的业务信息运行的功能。  2)应具有完善的业务支持辅助的功能。  2、信息化应用系统宜包括工作业务应用系统、物业运营管理系统、公共服

电气工程信息化应用系统设计要求?

  1、信息化应用系统的功能应符合下列要求:  1)应提供快捷、有效的业务信息运行的功能。  2)应具有完善的业务支持辅助的功能。  2、信息化应用系统宜包括工作业务应用系统、物业运营管理系统、公共服

电气工程电话交换系统设计要求应符合什么?

  1、宜采用本地电信业务经营者所提供的虚拟交换方式、配置远端模块或设置独立的综合业务数字程控用户交换机系统等方式,提供建筑物内电话等通信使用。  2、综合业务数字程控用户交换机系统设备的出入中继线数

电气工程电话交换系统设计要求应符合什么?

  1、宜采用本地电信业务经营者所提供的虚拟交换方式、配置远端模块或设置独立的综合业务数字程控用户交换机系统等方式,提供建筑物内电话等通信使用。  2、综合业务数字程控用户交换机系统设备的出入中继线数

电气工程综合布线系统设计应符合什么要求?

  1、应成为建筑物信息通信网络的基础传输通道,能支持语音、数据、图像和多媒体等各种业务信息的传输。  2、应根据建筑物的业务性质、使用功能、环境安全条件和其他使用的需求,进行合理的系统布局和管线设计

电气工程综合布线系统设计应符合什么要求?

  1、应成为建筑物信息通信网络的基础传输通道,能支持语音、数据、图像和多媒体等各种业务信息的传输。  2、应根据建筑物的业务性质、使用功能、环境安全条件和其他使用的需求,进行合理的系统布局和管线设计

电气工程信息网络系统设计应符合什么要求?

  1、应以满足各类网络业务信息传输与交换的高速、稳定、实用和安全为规划与设计的原则。  2、宜采用以太网等交换技术和相应的网络结构方式,按业务需求规划二层或三层的网络结构。  3、系统桌面用户接入宜

电气工程信息网络系统设计应符合什么要求?

  1、应以满足各类网络业务信息传输与交换的高速、稳定、实用和安全为规划与设计的原则。  2、宜采用以太网等交换技术和相应的网络结构方式,按业务需求规划二层或三层的网络结构。  3、系统桌面用户接入宜

知识大全 生产管理系统主窗口设计及实现代码[2]

    ——此文章摘自《Delphi数据库开发经典案例解析》定价¥ 特价¥ 购买>>    ()单击主菜单中