以简求快 Java快速开发框架LML功能菜单管理

         无论你现在身处什么样的职位,一定要保持每天看书的好习惯。

         前面几集,让大家对LML能够有一个快速的预览和了解。以后几集我会简单的开发一些实例程序,管理功能等,向大家展现一下LML的简单,虽然不能做到完美,但是我觉得它总有它的用武之地。

         也可能,经过前几集的痛苦折磨,你已经烦透了这个山寨货。在这,我真诚的向您道歉,耽误了您的时间我很过意不去。不过,从我个人这方面来讲,还没有停止山寨行为的打算,因为我没有能力从头开始建造自己的框架,而又有建造框架的野心,最后就只能山寨了。我渴望进步,虽然我能力有限。

         接下来我大致讲解一下[功能菜单管理]开发过程:

         我一直没有形成自主的菜单思想,所以在LML中我只是把Castle MonoRail中的菜单概念,照搬照抄了过来。菜单即链接,LML中每一个Action中的任何一个方法都可以成为一个菜单,实际情况下我们从没有把一个没有返回视图的方法作为一个菜单,但是它可能对应着一个权限。

         复习了一下上一集说到的菜单和权限,下面开发功能:

         1,[功能菜单管理]隶属于[系统管理],所以先创建[系统管理]的菜单和权限

一级菜单
@SysMenu(MenuId = "System", MenuName = "系统管理", MenuPic = "sys.png", MenuParent = "", MenuLevel = 1, MenuSort = 1)
@SysPower(PowerId = "SystemPower", PowerMenu = "System", PowerName = "系统管理查看")
        public void System() {
        }

   2,新建一个Action类MenuPowerMangerAction 继承自PageBaseAction

Action代码
       package LML.Action.System;


import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import org.hibernate.HibernateException;

import LML.Core.Helper.DBHelper;
import LML.Core.Helper.SQLBuilderHelper;
import LML.Core.System.Area;
import LML.Core.System.Menu;
import LML.Core.System.PageBaseAction;
import LML.Core.System.Pager;
import LML.Core.System.Power;
import LML.Core.System.SysMenu;
import LML.Core.System.SysMenuPower;
import LML.Core.System.SysPower;
import LML.Model.Sysmenu;
import LML.Model.Syspower;
@Area("System")
public class MenuPowerMangerAction extends PageBaseAction{
    
    private String parentMenuId;
    private String menuName;
    public String getMenuName() {
        return menuName;
    }

    public void setMenuName(String menuName) {
        this.menuName = menuName;
    }

    public String getParentMenuId() {
        return parentMenuId;
    }

    public void setParentMenuId(String parentMenuId) {
        this.parentMenuId = parentMenuId;
    }

    @SysMenu(MenuId="MenuPowerManger",MenuName=功能菜单管理",MenuPic="",MenuParent="System",MenuLevel=2,MenuSort=1)
    @SysPower(PowerId="MenuPowerMangerPower",PowerMenu="MenuPowerManger",PowerName="功能菜单管理查看")
    public String List()
    {
        Pager pager = null;
        try {
            pager = DBHelper.ShowPager(pageSize, page, "*", "sysmenu", GetStrWhere(), "order by sort");
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
            System.out.println(e.getMessage());
        }
        setPager(pager);
    
        return SUCCESS;
    }
    
    private String GetStrWhere()
    {
        String strWhere="";
        strWhere+=SQLBuilderHelper.QueryString(strWhere,"name","like","'%",ParamValue("menuName",menuName,true),"%'","and");
        if(parentMenuId!=null&&!parentMenuId.trim().equals(""))
        {
            strWhere+=SQLBuilderHelper.QueryString(strWhere,"parent","=","'",ParamValue("parentMenuId",parentMenuId,true),"'","and");
        }
        else
        {
            strWhere+=SQLBuilderHelper.QueryString(strWhere,"level","=","","1","","and");
            
        }

        return strWhere;
        
    }
    
    public String Init()
    {
        try {
            
            try {
                DBHelper.ExecuteNoneQuery("delete from sysmenu");
                DBHelper.ExecuteNoneQuery("delete from syspower");
            } catch (HibernateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            ArrayList<Menu> menuList=SysMenuPower.getMenu();
            ArrayList<Power> powerList=SysMenuPower.getPower();
            if(!menuList.isEmpty())
            {
                for(Menu m :menuList )
                {
                    Sysmenu sysMenu=new Sysmenu();
                    sysMenu.setId(m.MenuId);
                    sysMenu.setName(m.MenuName);
                    sysMenu.setPic(m.MenuPic);
                    sysMenu.setUrl(m.MenuUrl+".action");
                    sysMenu.setLevel((short) m.MenuLevel);
                    sysMenu.setSort((short)m.MenuSort);
                    sysMenu.setParent(m.MenuParent);
                    DBHelper.Create(sysMenu);
                }
            }
            
            if(!powerList.isEmpty())
            {
              for(Power p:powerList)
              {
                  Syspower sysPower=new Syspower();
                  sysPower.setId(p.PowerId);
                  sysPower.setMenu(p.PowerMenu);
                  sysPower.setName(p.PowerName);
                  DBHelper.Create(sysPower);
              }
            }
            return JavaScript("alert('初始化成功,请刷新!')");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            return JavaScript("alert('初始化失败,请重试!')");
            //e.printStackTrace();
        }
    }
    

}

         3,新建和Action对应的Views文件夹以及一个html模板,List.Html

View
    #set($layout="default_Pager.html")
<div class="articles">
    <div class="clear tabtext">
        <!--style="display:none;"-->
        <div class="tab1"  style="display:none;">
            <!--内容开始-->
            <form action="?" name="form1" id="form1">
          

          <input name="parentMenuId" value="$!parentMenuId" type="hidden" />
                <!--查询条件模块开始-->
                <div class="admin_search">
                    <div class="admin_search_top">
                        <span>查询方式</span></div>
                    <div class="admin_search_contant">
                    <div class="admin_search_contant_left">
                        <span>菜单名称:</span><input name="menuName" value="$!menuName" type="text" />
                    </div>
                    <div class="admin_search_contant_right">
                        <table border="0" cellspacing="0" cellpadding="0" onclick="DoSearch()" class="right">
                            <tr>
                                <td class="search_button bt1">
                                    <a id="seach">查询</a>
                                </td>
                                <td class="search_button_right">
                                    &nbsp;&nbsp;&nbsp;
                                </td>
                            </tr>
                        </table>
                        </div>
                        <div class="clear"></div>
                    </div>
                </div>
                <!--查询条件模块结束-->
            </form>
            <div class="table_name">
                <div class="table_name_left">
                    <img src="/Theme/1/base/images/dian1.png" /><span>功能菜单管理</span></div>
                <div class="table_name_right">
                    <div class="admin_page_left">
                        <ul>
                            #if("$!fatherMenuId"!=""&&"$!fatherMenuId"!="-1")
                            <li>
                                <table border="0" cellspacing="0" cellpadding="0" onclick="window.location.href='/System/MenuInfo/List.aspx?fatherMenuId=$!GrandId'">
                                    <tr>
                                        <td class="admin_page_left_left btn7">
                                            <a>返回</a>
                                        </td>
                                        <td class="admin_page_left_right">
                                        </td>
                                    </tr>
                                </table>
                            </li>
                             #end
                            <li>
                                <table border="0" cellspacing="0" cellpadding="0" onclick="Initialize()">
                                    <tr>
                                        <td class="admin_page_left_left btn8">
                                            <a>初始化</a>
                                        </td>
                                        <td class="admin_page_left_right">
                                        </td>
                                    </tr>
                                </table>
                            </li>
                        </ul>
                    </div>
                </div>
            </div>
            <!--表格列表开始-->
            <table width="100%" border="0" cellspacing="0" cellpadding="0" class="table" name="table" id="table">
                <tr>
                    <th width="15%">
                        菜单名称
                    </th>
                    <th width="15%">
                        菜单层级
                    </th>
                
                    <th width="15%">
                        父级菜单
                    </th>
                    <th width="20%">
                        链接地址
                    </th>
                    <th width="20%">
                        操作 
                    </th>
                </tr>
                #if($pager.result.rowCount==0)
                <tr>
                    <td colspan="7" align="center" style="color: Red; font-weight: bold;">
                        暂无记录
                    </td>
                </tr>
                #else 
                    #foreach($ItemRow in $pager.result.rows)
                <tr>
                    <td class="table_blue">
                        <a href="?parentMenuId=$!ItemRow.id" target="_self">$!{ItemRow.name}</a>
                    </td>
                    <td>
                        $!ItemRow.level
                    </td>
        
                    <td>
                        $!ItemRow.parent
                    </td>
                    
                    <td>
                        $!ItemRow.url
                    </td>
            
                    <td class="table_operating">
                    
                    </td>
                </tr>
                #end #end
            </table>
            <!--表格列表开始-->
            <!--内容结束-->
        </div>
    </div>
</div>
<script type="text/javascript">
    //查询提交form
    function DoSearch()
    {
        jQuery("#form1").submit();
    }

    //初始化
    function Initialize()
    {
        if (confirm('您确定要初始化吗?'))
        {
            window.open("MenuPowerManger_Init.action", "iframe_data");
        }
    }
</script>

         由于没有开发用户自定义菜单,所以整体上功能菜单管理只包括两块:列表和初始化。下面说说应该注意的几点:

     1,  域的概念。

   由于当前的Action类在System包下,所以我们要这样声明一个域:@Area("System"),关于域,LML做的挺脆弱,还有些牵强,以后有时间一定改正。当然,就目前来说,如果不这么声明,就会发生生成菜单后无法找到Action的情况了。

 

     2,  分页和查询条件

     这一块LML并没有像原生的SSH那样使用List来实现分页,至于我们分页方法的参数,还有生成查询条件的方法,我就不多说了。

     3,  初始化

     初始化大概思想就是先删除所有初始化进入数据库的菜单和权限,然后从SysMenuPower中调用相应的getMenu()和getPower()方法获取系统中包含的所有菜单  (ArrayList<Menu>)和权限(ArrayList<Power>),接着就可以迭代着两个方法的返回值,循环的插入数据库了。

        

         其他,应该没有什么需要特别注意的了。到此,LML的菜单权限管理就基本应用了。根据实际需求,应该还会有其他角色对应管理等等。就不多说了吧,从我提供的源码中也可以看到相应的模块。模块开发千篇一律,没有必要一一列举,那样太浪费大家的时间了。

         抱歉,我可能写的比较混乱,这貌似是我这种.net程序员的习惯。

         下集预告:一个基本的模块,CRUD。

posted @ 2012-08-17 23:03  李言  阅读(2401)  评论(0编辑  收藏  举报