角色管理比前面几个页面都稍显复杂点。好吧,还是先看图。
左边是角色列表,右边是页面列表,它们也是多对多的关系,即一个角色可以访问多个页面,同时一个页面也可以被多个角色访问。
点击左边的角色,刷新右边页面列表,显示已为其分配的页面,若想取消某个页面,只要把前面的勾去掉,然后保存就可以了。
删除该角色下的用户这个有点麻烦,从ligerUI提供的demo及api来看是无法从子级往上找到父级元素的,于是我想到用Jquery,从当前点击这个元素往上找到父级,很遗憾,通过ligerUI grid生成的子级HTML元素完全是一样的,没有用于区别的id和属性,所以也就无法确定父级。后来,突然灵感一闪,既然可以通过父级的参数值来加载子级,那么就可以把这个父级参数值再返回绑定到子级上,只不过把它隐藏一下就可以了。OK,这个问题就解决了。
前端完整代码:
1 @section headerScripts{ 2 <style type="text/css"> 3 #grid { 4 margin: 5px 10px 0 10px; 5 } 6 </style> 7 8 <script type="text/javascript"> 9 var UrlRoleDataSource = '@Url.Action("RoleDataSource")'; 10 var UrlRoleDetail = '@Url.Action("RoleDetail")'; 11 var UrlAddRole = '@Url.Action("AddRole")'; 12 var UrlModifyRole = '@Url.Action("ModifyRole")'; 13 var UrlDeleteRole = '@Url.Action("DeleteRole")'; 14 var UrlMenuDataSource = '@Url.Action("MenuDataSource")'; 15 var UrlAttachRoleToMenu = '@Url.Action("AttachRoleToMenu")'; 16 var UrlGetMenuByRoleId = '@Url.Action("GetMenuByRoleId")'; 17 var UrlDeleteUserFromRole = '@Url.Action("DeleteUserFromRole")'; 18 19 20 var detailGrid; 21 var menugrid; 22 var rids = []; 23 24 var DeleteUser; 25 26 $(function () { 27 InitLayOut(); 28 InitGrid(); 29 InitMenuGrid(); 30 }); 31 32 function InitLayOut() { 33 $("#layout").ligerLayout({ 34 rightWidth: 452, 35 height: '100%', 36 heightDiff: 14, 37 space: 4, 38 allowRightCollapse: false 39 }); 40 } 41 42 43 function InitGrid() { 44 $("#grid").ligerGrid({ 45 columns: [ 46 { display: '角色ID', name: 'roleid', align: 'center', width: '48%' }, 47 { display: '角色名称', name: 'rolename', align: 'center', width: '48%' } 48 ], 49 width: '98%', 50 pageSizeOptions: [10, 30, 50], 51 height: '98%', 52 detailHeight: 'auto', 53 rowHeight: '30', 54 headerRowHeight: '33', 55 url: UrlRoleDataSource, 56 alternatingRow: true, 57 onSelectRow: selectedRow, 58 toolbar: { 59 items: [ 60 { text: '增加', click: AddRole, img: '@Url.Content("~/Content/LigerUI/icons/add.gif")' }, 61 { line: true }, 62 { text: '修改', click: ModifyRole, img: '@Url.Content("~/Content/LigerUI/icons/modify.gif")' }, 63 { line: true }, 64 { text: '删除', click: DeleteRole, img: '@Url.Content("~/Content/LigerUI/icons/delete.gif")' } 65 ] 66 }, 67 detail: { onShowDetail: DetailInit } 68 } 69 ); 70 71 72 function selectedRow() { 73 var grid = $("#grid").ligerGrid(); 74 var row = grid.getSelectedRow(); 75 $.get(UrlGetMenuByRoleId, { roleId: row.roleid }, function (data) { 76 rids = data; 77 menugrid.reload(); 78 }); 79 } 80 81 function DetailInit(row, detailPanel, callback) { 82 var grid = document.createElement('div'); 83 $(detailPanel).append(grid); 84 detailGrid = $(grid).css('margin', 10).ligerGrid({ 85 columns: [ 86 { display: '账号', name: 'userid' }, 87 { display: '姓名', name: 'name' }, 88 { display: '所属角色ID', name: 'roleid', hide: 'hide', width: 10 }, 89 { 90 display: '操作', isSort: false, width: 120, render: function (rowdata, rowindex, value) { 91 92 return "<a style=\"color:black;\" href='javascript:DeleteUser(\"" + rowdata.userid + "\",\"" + rowdata.roleid + "\")'>删除</a>"; 93 } 94 } 95 ], 96 isScroll: true, 97 showToggleColBtn: false, 98 width: '95%', 99 url: UrlRoleDetail, 100 parms: { roleId: row.roleid }, 101 showTitle: false, 102 columnWidth: 250, 103 rowHeight: '30', 104 headerRowHeight: '33', 105 onAfterShowData: callback, 106 frozen: false 107 }); 108 } 109 110 function AddRole() { 111 112 if (!window.addWin) { 113 window.addWin = $.ligerDialog.open({ 114 target: $("#winAdd"), 115 height: 260, 116 width: 400, 117 title: "增加角色", 118 isHidden: false 119 }); 120 121 $("#btnCancel").click(function () { 122 window.addWin.hide(); 123 }); 124 125 $("#btnConfirm").click(function () { 126 127 var roleId = $("#txtRoleId").val(); 128 var roleName = $("#txtRoleName").val(); 129 130 if (roleId == "" || roleName == "") { 131 alert("角色ID和名称不能为空!"); 132 return; 133 } 134 135 $.post(UrlAddRole, 136 { roleId: roleId, roleName: roleName }, 137 function (data) { 138 if (data.result) { 139 alert("操作成功!"); 140 $("#grid").ligerGrid().reload(); 141 } else { 142 alert(data.msg); 143 } 144 }); 145 }); 146 } else { 147 window.addWin.show(); 148 } 149 } 150 function ModifyRole() { 151 var grid = $("#grid").ligerGrid(); 152 var row = grid.getSelectedRow(); 153 if (row == null) { 154 alert("请选择一条数据"); 155 return; 156 } 157 $("#winModify").data("roleid", row.roleid); 158 $("#winModify").data("rolename", row.rolename); 159 160 if (!window.modifyWin) { 161 window.modifyWin = $.ligerDialog.open({ 162 target: $("#winModify"), 163 height: 250, 164 width: 400, 165 title: "修改角色" 166 }); 167 168 $("#txtModifyRoleId").val($("#winModify").data("roleid")); 169 $("#txtModifyRoleName").val($("#winModify").data("rolename")); 170 171 $("#btnModifyCancel").click(function () { 172 window.modifyWin.hide(); 173 }); 174 175 $("#btnModifyConfirm").click(function () { 176 177 var roleId = $("#txtModifyRoleId").val(); 178 var roleName = $("#txtModifyRoleName").val(); 179 180 if (roleName == "") { 181 alert("角色名称不能为空!"); 182 return; 183 } 184 185 $.post(UrlModifyRole, { roleId: roleId, roleName: roleName }, function (data) { 186 if (data.result) { 187 alert("操作成功!"); 188 $("#grid").ligerGrid().reload(); 189 } else { 190 alert(data.msg); 191 } 192 }); 193 }); 194 } else { 195 $("#txtModifyRoleId").val($("#winModify").data("roleid")); 196 $("#txtModifyRoleName").val($("#winModify").data("rolename")); 197 window.modifyWin.show(); 198 } 199 } 200 function DeleteRole() { 201 var grid = $("#grid").ligerGrid(); 202 var row = grid.getSelectedRow(); 203 if (row == null) { 204 alert("请选择一条数据"); 205 return; 206 } 207 if (confirm("是否确定删除?")) { 208 $.post(UrlDeleteRole, { roleId: row.roleid }, function (data) { 209 if (data.result) { 210 alert("删除成功!"); 211 $("#grid").ligerGrid().reload(); 212 } else { 213 alert(data.msg); 214 } 215 }); 216 } 217 } 218 219 DeleteUser = function (userid,roleid) { 220 221 if (confirm("是否确定删除?")) { 222 $.post(UrlDeleteUserFromRole, { userId: userid, roleId: roleid }, function (data) { 223 if (data.result) { 224 alert("删除成功!"); 225 detailGrid.reload(); 226 } else { 227 alert(data.msg); 228 } 229 }); 230 } 231 } 232 } 233 234 function InitMenuGrid() { 235 menugrid = $("#menugrid").ligerGrid({ 236 columns: [ 237 { display: '页面名称', name: 'name', align: 'center', width: '90%' }, 238 { display: '页面名称', name: 'rid', align: 'center', width: '2%', hide: 'hide' } 239 ], 240 width: '98%', 241 pageSizeOptions: [10, 30, 50], 242 height: '98%', 243 rowHeight: '30', 244 headerRowHeight: '33', 245 url: UrlMenuDataSource, 246 alternatingRow: true, 247 checkbox: true, 248 isChecked: function (rowdata) { 249 if (rids.length == 0) { 250 return false; 251 } 252 else { 253 var temp = 0; 254 for (var i = 0; i < rids.length; i++) { 255 if (rowdata.rid == rids[i]) { 256 break; 257 } 258 temp++; 259 } 260 if (temp == rids.length) { 261 return false; 262 } else { 263 return true; 264 } 265 } 266 }, 267 toolbar: { 268 items: [ 269 { text: '保存', click: Save, img: '@Url.Content("~/Content/LigerUI/icons/ok.gif")' }, 270 { line: true }, 271 ] 272 } 273 }); 274 275 function Save() { 276 if (confirm("是否确定保存?")) { 277 var grid = $("#grid").ligerGrid(); 278 var row = grid.getSelectedRow(); 279 if (row == null) { 280 alert("请选择角色"); 281 return; 282 } 283 var temp = menugrid; 284 var menurows = menugrid.getSelectedRows(); 285 if (menurows.length == 0) { 286 alert("请选择页面"); 287 return; 288 } 289 var menus = []; 290 for (var i = 0; i < menurows.length; i++) { 291 menus.push(menurows[i].rid); 292 } 293 var params = { roleId: row.roleid, menus: menus }; 294 295 $.ajax({ 296 type: "POST", 297 url: UrlAttachRoleToMenu, 298 data: params, 299 success: function (data) { 300 if (data.result) { 301 alert("操作成功!"); 302 } else { 303 alert(data.msg); 304 } 305 }, 306 dataType: "json", 307 traditional: true 308 }); 309 } 310 311 } 312 } 313 </script> 314 } 315 316 <div id="layout"> 317 <div position="center" title="角色列表"> 318 <div id="grid"></div> 319 </div> 320 <div position="right" title="页面列表"> 321 <div id="menugrid"></div> 322 </div> 323 </div> 324 325 326 327 328 <div id="winAdd" style="display: none;"> 329 <table class="tb" style="height: 170px;"> 330 <tr class="tr"> 331 <td class="td">角色ID:</td> 332 <td> 333 <input id="txtRoleId" /></td> 334 </tr> 335 <tr class="tr"> 336 <td class="td">角色名称:</td> 337 <td> 338 <input id="txtRoleName" type="text" /></td> 339 </tr> 340 <tr class="tr"> 341 <td colspan="2"> 342 <button id="btnConfirm" class="ui-button">确定</button> 343 <button id="btnCancel" class="ui-button">取消</button> 344 </td> 345 </tr> 346 </table> 347 </div> 348 349 <div id="winModify" style="display: none;"> 350 <table class="tb" style="height: 170px;"> 351 <tr class="tr"> 352 <td class="td">角色ID:</td> 353 <td> 354 <input id="txtModifyRoleId" readonly="true" /></td> 355 </tr> 356 <tr class="tr"> 357 <td class="td">角色名称:</td> 358 <td> 359 <input id="txtModifyRoleName" type="text" /></td> 360 </tr> 361 <tr class="tr"> 362 <td colspan="2"> 363 <button id="btnModifyConfirm" class="ui-button">确定</button> 364 <button id="btnModifyCancel" class="ui-button">取消</button> 365 </td> 366 </tr> 367 </table> 368 </div>
后端完整代码:
1 public class RoleController : Controller 2 { 3 // 4 // GET: /Role/ 5 6 private IRoleRepository _roleRepository; 7 private IOrgRepository _orgRepository; 8 private IMenuRepository _menuRepository; 9 10 public RoleController(IRoleRepository roleRepository, IOrgRepository orgRepository, IMenuRepository menuRepository) 11 { 12 13 this._roleRepository = roleRepository; 14 this._orgRepository = orgRepository; 15 this._menuRepository = menuRepository; 16 } 17 18 public ActionResult Index() 19 { 20 return View(); 21 } 22 23 public JsonResult RoleDataSource() 24 { 25 var data = _roleRepository.GetAll().ToList(); 26 27 return Json(new 28 { 29 Rows = data.Select(m => new 30 { 31 roleid = m.roleid, 32 rolename = m.rolename 33 34 }), 35 Total = data.Count() 36 }, JsonRequestBehavior.AllowGet); 37 } 38 39 public JsonResult RoleDetail(int roleId) 40 { 41 var data = _roleRepository.GetUserByRoleId(roleId).ToList(); 42 43 return Json(new 44 { 45 Rows = data.Select(m => new 46 { 47 userid = m.userid, 48 name = m.name, 49 roleid = roleId 50 }), 51 Total = data.Count() 52 }, JsonRequestBehavior.AllowGet); 53 } 54 55 public JsonResult AddRole(int roleId, string roleName) 56 { 57 var check = _roleRepository.GetRoleByConditon(roleId, roleName); 58 59 if (check.Count() > 1) 60 { 61 return Json(new { result = false, msg = "添加失败,不能重复添加相同的角色!" }, JsonRequestBehavior.AllowGet); 62 } 63 64 try 65 { 66 var role = new t_role 67 { 68 roleid = roleId, 69 rolename = roleName 70 }; 71 var result = _roleRepository.AddRole(role); 72 if (result) 73 { 74 return Json(new { result = true, msg = "" }, JsonRequestBehavior.AllowGet); 75 } 76 else 77 { 78 return Json(new { result = false, msg = "操作失败!" }, JsonRequestBehavior.AllowGet); 79 } 80 } 81 catch (Exception ex) 82 { 83 return Json(new { result = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); 84 } 85 } 86 87 public JsonResult ModifyRole(int roleId, string roleName) 88 { 89 var check = _roleRepository.GetRoleByConditon(roleId, roleName); 90 91 if (check.Count() > 1) 92 { 93 return Json(new { result = false, msg = "添加失败,不能修改为相同的角色!" }, JsonRequestBehavior.AllowGet); 94 } 95 96 try 97 { 98 var role = new t_role 99 { 100 roleid = roleId, 101 rolename = roleName 102 }; 103 var result = _roleRepository.ModifyRole(role); 104 if (result) 105 { 106 return Json(new { result = true, msg = "" }, JsonRequestBehavior.AllowGet); 107 } 108 else 109 { 110 return Json(new { result = false, msg = "操作失败!" }, JsonRequestBehavior.AllowGet); 111 } 112 } 113 catch (Exception ex) 114 { 115 return Json(new { result = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); 116 } 117 } 118 119 public JsonResult DeleteRole(int roleId) 120 { 121 var role = new t_role 122 { 123 roleid = roleId 124 125 }; 126 127 try 128 { 129 var result = _roleRepository.DeleteRole(role); 130 if (result) 131 { 132 return Json(new { result = true, msg = "" }, JsonRequestBehavior.AllowGet); 133 } 134 else 135 { 136 return Json(new { result = false, msg = "操作失败!" }, JsonRequestBehavior.AllowGet); 137 } 138 } 139 catch (Exception ex) 140 { 141 return Json(new { result = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); 142 } 143 } 144 145 public JsonResult MenuDataSource() 146 { 147 148 var data = _menuRepository.GetMenuAll().ToList(); 149 150 return Json(new { Rows = data.Select(m => new { name = m.name, rid = m.rid }), Total = data.Count() }, JsonRequestBehavior.AllowGet); 151 } 152 153 public JsonResult AttachRoleToMenu(int roleId, List<int> menus) 154 { 155 try 156 { 157 var result = _roleRepository.AttachRoleToMenu(roleId, menus); 158 if (result) 159 { 160 return Json(new { result = true, msg = "" }, JsonRequestBehavior.AllowGet); 161 } 162 else 163 { 164 return Json(new { result = false, msg = "操作失败!" }, JsonRequestBehavior.AllowGet); 165 } 166 } 167 catch (Exception ex) 168 { 169 return Json(new { result = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); 170 } 171 } 172 173 public JsonResult GetMenuByRoleId(int roleId) 174 { 175 var data = _roleRepository.GetMenuByRoleId(roleId).Select(m=>m.rid).ToArray(); 176 177 return Json(data,JsonRequestBehavior.AllowGet); 178 } 179 180 public JsonResult DeleteUserFromRole(string userId,int roleId) { 181 182 try 183 { 184 var result = _roleRepository.DeleteUserFromRole(userId,roleId); 185 if (result) 186 { 187 return Json(new { result = true, msg = "" }, JsonRequestBehavior.AllowGet); 188 } 189 else 190 { 191 return Json(new { result = false, msg = "操作失败!" }, JsonRequestBehavior.AllowGet); 192 } 193 } 194 catch (Exception ex) 195 { 196 return Json(new { result = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); 197 } 198 } 199 }