Web应用程序系统的多用户权限控制设计及实现-栏目模块【8】

Web应用程序系统的多用户权限控制设计及实现-栏目模块【8】

    前五章均是从整体上讲述了Web应用程序的多用户权限控制实现流程,本章讲述Web权限管理系统的基本模块-栏目模块。栏目模块涉及到的数据表为目录表。

    1.1栏目域

    为了更规范和方便后期系统的二次开发和维护,对应特定的业务模块采用Area(域)的方式开发,栏目模块的开发域如下图所示:

    由于在Areas下还建立了一个新的目录SystemManage,故需要改变原来的路由。栏目模块的路由文件名称为pageGroupAreaRegistration。改变路由代码的文件名称为如下:

    using System.Web.Mvc;
    namespace CodeForMvcTest.Areas.pageGroup
    {
        public class pageGroupAreaRegistration : AreaRegistration
        {
            public override string AreaName
            {
                get
                {
                    return "SystemManage/pageGroup";
                }
            }
            public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "SystemManage_pageGroup_default",
                    "SystemManage/pageGroup/{controller}/{action}/{id}",  //"{controller}/{action}/{id}"
                    new { action = "PageGroupManage", id = UrlParameter.Optional }
                );
            }
        }
    }

     1.2Model

    栏目模块的Model可参看第三章项目架构的系统共有类,对应model为Catalog.cs。文件路径为Areas/SystemManage/Models。

     1.3视图

    栏目模块的视图包含在栏目域中,文件路径为Areas/SystemManage/OperatorManage/Views/PageGroupManage,视图名称为PageGroupMange.cshtml。视图的完整代码如下:

      1 @{
      2     ViewBag.Title = "栏目管理";
      3     Layout = "~/Views/Shared/_BaseLayout.cshtml";
      4 }
      5 
      6 <div class="easyui-layout" data-options="fit:true">
      7 
      8     <div data-options="region:'north',split:true" style="height: 50px;">
      9         @using (Ajax.BeginForm("PageGroupManage", "PageGroupManage", new AjaxOptions
     10         {
     11             HttpMethod = "POST",
     12             OnSuccess = "selectNode",
     13             OnBegin = "searchStart",
     14             OnFailure = "searchFailure"
     15         }))
     16         {
     17             <!--属性组筛选栏-->
     18             <table style="margin-left: 5px; margin-top: 5px;">
     19                 <tr>
     20                     <td><span style="margin-left: 10px;">栏目名称:</span></td>
     21                     <td>
     22                         <input id="groupName" name="groupName" />
     23                     </td>
     24                     <td>
     25                         <input type="submit" value="查找" id="btn_submit" style="margin-left: 10px; margin-right: 10px;" />
     26                     </td>
     27                 </tr>
     28             </table>
     29         }
     30     </div>
     31 
     32     <div data-options="region:'center',split:true" style="padding-bottom: 10px;">
     33         <ul id="catalogTree">
     34         </ul>
     35         <br />
     36         <br />
     37         <div id="mm" class="easyui-menu" style="width: 120px;">
     38             <div onclick="openCategoryEditWin()" iconcls="icon-edit">修改节点</div>
     39             <div onclick="openCategoryAddWin()" iconcls="icon-add">添加节点</div>
     40             <div onclick="deleteCatalog()" iconcls="icon-remove">删除节点</div>
     41         </div>
     42     </div>
     43 </div>
     44 
     45 
     46 <!--目录编辑窗体-->
     47 <div id="categoryWin"  title="修改栏目信息" style="width: 480px; height: 380px; padding: 20px; text-align: center;">
     48     <form id="categoryForm" method="POST" action="@Url.Action("UpdateCategory", "PageGroupManage")">
     49         <table style="margin: auto;">
     50             <tr>
     51                 <td style="text-align: right;"><span>名称:</span></td>
     52                 <td style="text-align: left;">
     53                     <input class="easyui-validatebox" id="e_categoryName" name="CatalogName" data-options="required:true" />
     54                 </td>
     55             </tr>
     56             <tr style="height: 40px;">
     57                 <td style="text-align: right;"><span>图标:</span></td>
     58                 <td style="text-align: left;">
     59                     <input class="easyui-validatebox" id="e_categoryPicurl" name="PictureUrl" />
     60                 </td>
     61             </tr>
     62             <tr style="height: 40px;">
     63                 <td style="text-align: right;"><span>备注:</span></td>
     64                 <td>                  
     65                     <input class="easyui-validatebox" id="e_categoryRemark" name="Remark" />
     66                 </td>
     67             </tr>
     68             <tr style="height: 40px;">
     69                 <td style="text-align: right;"><span>排序值:</span></td>
     70                 <td style="text-align: left;">
     71                 
     72                     <input class="easyui-numberbox" data-options="required:true" id="e_categoryShownum" name="ShowNo" />
     73                 </td>
     74             </tr>
     75             <tr style="height: 40px;">
     76                 <td style="text-align: right;"><span>状态:</span></td>
     77                 <td style="text-align: left;">
     78                     <select class="easyui-combobox" name="IsAvailable" id="e_categoryState" style="width: 150px;"
     79                         data-options="editable:false">
     80                         <option value="0">禁用</option>
     81                         <option value="1">启用</option>
     82                     </select>
     83                 </td>
     84             </tr>
     85             <tr style="height: 50px;">
     86                 <td colspan="2" style="text-align: center;">
     87                     <input type="hidden" id="parentId" name="ParentId" />
     88                     <input type="hidden" id="categoryId" name="CatalogId" />
     89                     <input type="reset" style="display: none" />
     90                     <input type="submit" value="提交" id="btn_editsubmit" style="margin-left: 10px; margin-right: 10px;" />
     91                     <input type="button" value="取消" id="btn_editCancel" onclick="javascript: return $('#categoryWin').window('close');"
     92                         style="margin-left: 10px; margin-right: 10px;" />
     93                 </td>
     94             </tr>
     95         </table>
     96     </form>
     97 </div>
     98 
     99 @section scripts
    100 {
    101     <script type="text/javascript"  src="/Areas/SystemManage/SystemJS/pageGroupManage.js"></script>
    102 }
    PageGorupManage.cshtml

     1.4JS文件

    栏目模块相关的JS文件路径为Areas/SystemManage/SystemJS,JS文件名称为pageGruopManage.js。JS的完整代码如下:

      1 //打开目录添加窗体
      2 function openCategoryAddWin() {
      3     var selectedNode = $("#catalogTree").tree('getSelected');
      4     if (selectedNode != null) {
      5         $("#parentId").val(selectedNode.id);
      6     } else {
      7         $("#parentId").val(0);
      8     }
      9 
     10     $("#e_categoryName").val("");
     11     $("#e_categoryRemark").val("");
     12     $("#e_categoryPicurl").val("");
     13     $("#categoryId").val("-1");
     14     $('#categoryWin').window('open');
     15 };
     16 
     17 //打开目录编辑窗体
     18 function openCategoryEditWin() {
     19     var selectedNode = $("#catalogTree").tree('getSelected');  //获取选中的节点
     20     if (selectedNode != null) {
     21         var parentNode = $("#catalogTree").tree('getParent', selectedNode);
     22         if (parentNode != null) {
     23             $("#parentId").val(parentNode.id);
     24         } else {
     25             $("#parentId").val(0);
     26         }
     27         $("#e_categoryName").val(selectedNode.text);
     28         $("#e_categoryPicurl").val(selectedNode.attributes.picurl);
     29         $("#e_categoryRemark").val(selectedNode.attributes.remark);
     30         $("#e_categoryShownum").numberbox("setValue", selectedNode.attributes.showno);
     31         $("#e_categoryState").combobox("setValue", selectedNode.attributes.isavailable);
     32         $("#categoryId").val(selectedNode.id);
     33     }
     34     $('#categoryWin').window('open');
     35 };
     36 
     37 
     38 function selectNode(data) {
     39     if (data.indexOf("/Login/Login") >= 0) {
     40         window.parent.location.href = '/Login/Login';
     41     }
     42 
     43     if (data != "1") {
     44         var node = $('#catalogTree').tree('find', data);
     45         if (node) {
     46             $('#catalogTree').tree('select', node.target);
     47         } else {
     48             alert("未找到相关栏目!");
     49         }
     50     } else {
     51         alert("查找栏目出错!");
     52     }
     53     HideMask();
     54 };
     55 
     56 
     57 function searchStart() {
     58     LoadMask("正在查找,请稍等... ...");
     59 };
     60 
     61 
     62 function searchFailure(data) {
     63     if (data.responseText.indexOf("/Login/Login") >= 0) {
     64         window.parent.location.href = '/Login/Login';
     65     }
     66     HideMask();
     67     alert("操作失败!");
     68 };
     69 
     70 //删除目录
     71 function deleteCatalog() {
     72     var node = $('#catalogTree').tree('getSelected');
     73     if (node.id == 0) {
     74         alert("不能删除根节点!");
     75     } else {
     76         if (window.confirm("删除该目录,将删除该目录下的所有子目录以及包含的页面,确定删除吗?")) {
     77             LoadMask("正在删除,请稍等... ...");
     78 
     79             $.ajax({
     80                 url: "/SystemManage/pageGroup/PageGroupManage/DeleteCategory",
     81                 type: 'POST',
     82                 data: { categoryId: node.id },
     83                 dataType: 'TEXT',
     84                 success: function (data) {
     85                     if (data.indexOf("/Login/Login") >= 0) {
     86                         window.parent.location.href = '/Login/Login';
     87                     }
     88                     InitTree();
     89                     alert(data);
     90                     HideMask();
     91                 },
     92                 error: function (data) {
     93                     if (data.responseText.indexOf("/Login/Login") >= 0) {
     94                         window.parent.location.href = '/Login/Login';
     95                     }
     96                     HideMask();
     97                     alert("操作失败!");
     98                 }
     99             });
    100         }
    101 
    102     }
    103 };
    104 
    105 
    106 //添加节点
    107 function appendNode(newNode) {
    108     var parentNode = $('#catalogTree').tree('getSelected');
    109     if (parentNode != null) {
    110         $('#catalogTree').tree('append', {
    111             parent: parentNode,
    112             data: [newNode]
    113         });
    114     }
    115 };
    116 
    117 //修改节点信息
    118 function updateNode(newNode) {
    119     var node = $('#catalogTree').tree('getSelected');
    120     if (node) {
    121         node.text = newNode.text;
    122         node.attributes.picurl = newNode.attributes.picurl;
    123         node.attributes.remark = newNode.attributes.remark;
    124         node.attributes.showno = newNode.attributes.showno;
    125         node.attributes.isavailable = newNode.attributes.isavailable;
    126         $('#catalogTree').tree('update', node);
    127     }
    128 };
    129 
    130 
    131 function InitTree() {
    132     $('#catalogTree').tree({
    133         url: '/SystemManage/pageGroup/PageGroupManage/InitCatalogTree',
    134         method: 'GET',
    135         onContextMenu: function (e, node) {
    136             e.preventDefault();
    137             $('#catalogTree').tree('select', node.target);
    138             $('#mm').menu('show', {
    139                 left: e.pageX,
    140                 top: e.pageY
    141             });
    142         }
    143     });
    144 };
    145 
    146 
    147 $(function () {
    148     //初始化栏目树
    149     InitTree();
    150 
    151     //目录编辑窗体初始化
    152     $('#categoryWin').window({
    153         modal: true,
    154         collapsible: false,
    155         minimizable: false,
    156         maximizable: false,
    157         draggable: true,
    158         resizable: false,
    159         closable: false,
    160         closed: true
    161     });
    162 
    163 
    164     $("#categoryForm").submit(function (event) {
    165         //中断当前的提交事件
    166         event.preventDefault();
    167         //数据验证
    168         var categoryName = $("#e_categoryName").val();
    169         if (categoryName == "") {
    170             alert("请输入名称!");
    171             return false;
    172         }
    173         var showNum = $("#e_categoryShownum").numberbox("getValue");
    174         if (showNum == "") {
    175             alert("请输入排序值!");
    176             return false;
    177         }
    178 
    179         $('#categoryWin').window('close');
    180         LoadMask("正在操作,请稍等... ...");
    181 
    182         //提交的URL,默认为属性组修改或添加路径
    183         var url = "/SystemManage/pageGroup/PageGroupManage/UpdateCategory";
    184         var categoryId = $("#categoryId").val();
    185         if (categoryId == "-1") {
    186             url = "/SystemManage/pageGroup/PageGroupManage/AddCategory";
    187         }
    188 
    189         //表单序列化数据
    190         var formData = $("#categoryForm").serializeJson();
    191 
    192         $.ajax({
    193             url: url,
    194             type: 'POST',
    195             data: { categoryJsonStr: JSON.stringify(formData) },
    196             dataType: 'JSON',
    197             traditional: true,
    198             success: function (data) {
    199                 if (data.text != "-1") {
    200                     InitTree();
    201                     alert(data.text);
    202                 } else {
    203                     alert("后台操作出错!");
    204                 }
    205                 HideMask();
    206 
    207             },
    208             error: function (data) {
    209                 if (data.responseText.indexOf("/Login/Login") >= 0) {
    210                     window.parent.location.href = '/Login/Login';
    211                 }
    212                 HideMask();
    213                 alert("操作失败!");
    214             }
    215         });
    216 
    217     });
    218 
    219 });
    220 
    221 //显示遮罩层
    222 function LoadMask(msg) {
    223     var panel = $("body");
    224     if (msg == undefined) {
    225         msg = "正在加载,请稍候...";
    226     }
    227     $("<div class=\"datagrid-mask\"></div>").css({ display: "block", width: panel.width(), height: panel.height() }).appendTo(panel);
    228     $("<div class=\"datagrid-mask-msg\"></div>").html(msg).appendTo(panel).css({ display: "block", left: (panel.width() - $("div.datagrid-mask-msg", panel).outerWidth()) / 2, top: (panel.height() - $("div.datagrid-mask-msg", panel).outerHeight()) / 2 });
    229 };
    230 
    231 //隐藏遮罩层
    232 function HideMask() {
    233     var panel = $("body");
    234     panel.find("div.datagrid-mask-msg").remove();
    235     panel.find("div.datagrid-mask").remove();
    236 };
    pageGroupManage.js

    1.5控制器

    栏目模块的控制器包含在栏目域中,文件路径为Areas/SystemManage/PageGroup/Controllers,控制器名称为PageGroupManageController.cs。控制器的完整代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Web.Mvc;
      6 using Session;
      7 using OdbcDbAccess;
      8 using System.Data;
      9 using Models;
     10 using Controllers;
     11 using System.Data.SqlClient;
     12 using Newtonsoft.Json;
     13 using LogInfo;
     14 
     15 namespace CodeForMvcTest.Areas.pageGroup.Controllers
     16 {
     17     //|++++++++++++++++++++++++++++++
     18     /// 功能:栏目信息类
     19     /// 作者:王令
     20     /// 时间:2015-7-20
     21     /// 邮箱:1129137758@qq.com
     22     //|+++++++++++++++++++++++++++++
     23 
     24     public class PageGroupManageController : BaseController
     25     {
     26         public ActionResult PageGroupManage()
     27         {
     28             return View();
     29         }
     30 
     31         /// <summary>
     32         /// 初始化栏目树
     33         /// </summary>
     34         /// <returns></returns>
     35         public ActionResult InitCatalogTree()
     36         {
     37             IList<TreeModel> resultList = new List<TreeModel>();
     38             TreeModel rootNode=new TreeModel();
     39             try
     40             {
     41                 //获取栏目信息
     42                 string strSql = "select * from catalog order by catalogid,showno";
     43                 DataSet categoryDt = SqlHelper.ExecuteQuery(SqlSeverConnectionName, strSql);
     44                 if (categoryDt != null && categoryDt.Tables.Count > 0)
     45                 {
     46                     DataTable table = categoryDt.Tables[0];
     47                     resultList = TreeModel.BuildTreeNodeList(table.Rows, "catalogid", "catalogname",
     48                         "parentid", true);
     49                 }
     50             }
     51             catch (Exception)
     52             {
     53             }
     54 
     55             return Json(resultList, JsonRequestBehavior.AllowGet);
     56         }
     57 
     58         /// <summary>
     59         /// 通过栏目名称返回栏目列表
     60         /// </summary>
     61         /// <param name="groupName">栏目名称</param>
     62         /// <returns></returns>
     63         [HttpPost]
     64         public ActionResult PageGroupManage(string groupName)
     65         {
     66             try
     67             {
     68                 string sql = "select top 1 catalogid from catalog where catalogname='" + groupName + "'";
     69                 int catalogId = SqlHelper.ExecuteScalar<int>(SqlSeverConnectionName, sql);
     70                 return Content(catalogId.ToString());
     71             }
     72             catch (Exception ex)
     73             {
     74               Log.SaveErrorLog(ex.ToString(), "栏目筛选出错");
     75                 return Content("-1"); ;
     76             }
     77           
     78         }
     79 
     80         /// <summary>
     81         /// 修改一级目录
     82         /// </summary>
     83         /// <param name="categoryJsonStr">ReportClassify对应json字符串</param>
     84         /// <returns></returns>
     85         [HttpPost]
     86         public ActionResult UpdateCategory(string categoryJsonStr)
     87         {
     88             var category = JsonConvert.DeserializeObject<Catalog>(categoryJsonStr);
     89             string sql = "update catalog set catalogname='" + category.CatalogName + "',picurl='" + category.PictureUrl + "',remark='" + category.Remark + "',isavailable='" + category.IsAvailable + "',showno='" + category.ShowNo + "' where catalogid='" + category.CatalogId + "'";
     90             try
     91             {
     92                 SqlHelper.ExecuteNonQuery(SqlSeverConnectionName , sql);
     93                 var node = new TreeModel
     94                 {
     95                     id = category.CatalogId,
     96                     text = category.CatalogName,
     97                     state = "open",
     98                     attributes = new CatalogAttributes
     99                     {
    100                         isavailable = category.IsAvailable,
    101                         remark = category.Remark,
    102                         showno = category.ShowNo
    103                     }
    104                 };
    105                 Log.SaveOperatorLog(sql, 1, "修改目录信息");
    106                 object result = new
    107                 {
    108                     text = "修改成功!",
    109                     node = node
    110                 };
    111                 return Json(result);
    112             }
    113             catch (Exception ex)
    114             {
    115                 Log.SaveErrorLog(ex.ToString(), "修改目录出错");
    116                 object result = new
    117                 {
    118                     text = "-1"
    119                 };
    120                 return Json(result);
    121             }
    122         }
    123 
    124 
    125 
    126         /// <summary>
    127         /// 添加目录
    128         /// </summary>
    129         /// <param name="categoryJsonStr">ReportClassify对应json字符串</param>
    130         /// <returns></returns>
    131         [HttpPost]
    132         public ActionResult AddCategory(string categoryJsonStr)
    133         {
    134             var category = JsonConvert.DeserializeObject<Catalog>(categoryJsonStr);
    135             string sql = "insert into catalog (parentid,catalogname,picurl,isavailable,showno,remark)"
    136                 + " values ('" + category.ParentId + "','" + category.CatalogName + "','" + category.PictureUrl + "','" + category.IsAvailable + "','" + category.ShowNo + "','" + category.Remark + "')";
    137             try
    138             {
    139                 SqlHelper.ExecuteNonQuery(SqlSeverConnectionName, sql);
    140                 var node = new TreeModel
    141                 {
    142                     id = category.CatalogId,
    143                     text = category.CatalogName,
    144                     state = "open",
    145                     attributes = new CatalogAttributes
    146                     {
    147                         isavailable = category.IsAvailable,
    148                         remark = category.Remark,
    149                         showno = category.ShowNo
    150                     }
    151                 };
    152 
    153              Log.SaveOperatorLog(sql, 1, "添加目录信息");
    154 
    155                 object result = new
    156                 {
    157                     text = "添加成功!",
    158                     node = node
    159                 };
    160 
    161                 return Json(result);
    162             }
    163             catch (Exception ex)
    164             {
    165               Log.SaveErrorLog(ex.ToString(), "添加目录出错");
    166                 object result = new
    167                 {
    168                     text = "-1"
    169                 };
    170 
    171                 return Json(result);
    172             }
    173         }
    174 
    175 
    176         /// <summary>
    177         /// 删除目录
    178         /// </summary>
    179         /// <param name="categoryId">目录ID</param>
    180         /// <returns></returns>
    181         [HttpPost]
    182         public ActionResult DeleteCategory(int categoryId)
    183         {
    184             try
    185             {           // 删除需要执行事务操作
    186                         string sql = "delete from pageinfo where catalogid in (select catalogid from catalog where catalogid={0} or parentid={0})";
    187                         sql += ";delete from rightlist where categoryid in (select catalogid from catalog where catalogid={0} or parentid={0})";
    188                         sql += ";delete from catalog where catalogid={0} or parentid={0}";
    189                         sql = string.Format(sql, categoryId);
    190                       int result=  SqlHelper.ExecuteTran(SqlSeverConnectionName,sql);
    191                       if (result > 0)
    192                           return Content("删除成功!");
    193                       else
    194                       {
    195                           return Content("删除失败!");
    196                       }
    197             }
    198             catch (Exception ex)
    199             {
    200                 Log.SaveErrorLog(ex.ToString(), "删除目录出错!");
    201                 return Content("未能成功删除目录!");
    202             }
    203             
    204         }
    205 
    206 
    207     }
    208 }
    PageGroupManage.cs

    1.6界面运行截图

    栏目管理主界面如下图所示:

    编辑栏目界面如下图所示:

    添加栏目界面如下图所示:

     

    posted @ 2015-10-18 11:27  无涯Ⅱ  阅读(919)  评论(0编辑  收藏  举报