首页 / C# / c#开发Mongo笔记第八篇
c#开发Mongo笔记第八篇
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#开发Mongo笔记第八篇,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3420字,纯文字阅读大概需要5分钟。
内容图文
![c#开发Mongo笔记第八篇](/upload/InfoBanner/zyjiaocheng/1079/89aa33787c1840b4992db14b605669be.jpg)
到今天为止,Mongo开发的权限管理系统功能就做完了,剩下的就是完善构架,优化结构,只是现在c#操作Mongo的各种操作基本都掌握了
说到权限管理系统,其实再简单不过了,在关系型数据的是时代,我们通常建一个菜单表,菜单用内建来管理子菜单,然后再建一个角色表(或用户表),然后再建一个角色和菜单的对应关系表,存上菜单id和角色id的对应关系。当然了,方法很多,我只是
举了一个相对比较常见的设计方式。
用上Mongo之后我本来照搬以前的设计思路,完成了权限管理,完成之后突然觉得这样不太好吧。比较Mongo是松散的文档结构,和面向对象的思想有异曲同工之妙,这么设计看着也太不尽人意了。于是乎,我决定尝试按照mongo的格式去重新设计。
首先第一步改造的是菜单,菜单不再使用内建,而是把子菜单当成一个字段存进父菜单那条数据里。然后修改的是角色,去掉了角色和菜单的对应表,把菜单直接存在了角色表里。
这么改造完成之后开始是有一些不适应,当时查询的时候确实方便了很多。
public class Menu { public ObjectId _id { get; set; } publicstring Name { get; set; } publicstring Url { get; set; } publicstring Icon { get; set; } publicint OrderNo { get; set; } publicstring Descr { get; set; } public List<Menu> Child = new List<Menu>(); }
public class Role { public ObjectId _id { get; set; } publicstring Name { get; set; } publicstring RootMenu { get; set; } publicstring ChildMenu { get; set; } public List<Menu> Menus = new List<Menu>(); }
这样改造之后,添加方法和查询方法没什么太大的变化,一开始不知道怎么添加和删除子项。
后来发现官方的驱动还是很强大的,我们可以直接修改Menu或者Role对象,然后保存这个对象的修改结构就可以了,感觉和ef很相似了。
还有现在点击菜单传回来一个id我无法知道它是一级菜单还是二级菜单了,因为二级菜单不是一条数据,所以也不能直接查询了。我目前采用的办法是先查询一下是不是一级菜单,如果不是的话再查询二级菜单。
这个办法都是挺好用,当然了,大家肯定还有更好的办法,希望大家不吝赐教啊。
贴一段修改菜单的方法,就当是抛砖引玉了
ObjectId menuid = ObjectId.Parse(Request.Form["menuid"]); var query = Query.And(Query.EQ("Child._id", menuid)); Menu menu = DAL.DALMenu.GetMenu(query); if (menu == null) { query = Query.And(Query.EQ("_id", menuid)); menu = DAL.DALMenu.GetMenu(query); } if (menu.Child.Count(m => m._id == menuid) > 0) { Menu child = menu.Child.FirstOrDefault(m => m._id == menuid); child.Name = Request.Form["name"]; child.Icon = Request.Form["icon"]; child.Url = Request.Form["url"]; child.OrderNo = Convert.ToInt32(Request.Form["orderno"]); child.Descr = Request.Form["descr"]; DALMenu.Update(menu); } else { menu.Name = Request.Form["name"]; menu.Icon = Request.Form["icon"]; menu.Url = Request.Form["url"]; menu.OrderNo = Convert.ToInt32(Request.Form["orderno"]); menu.Descr = Request.Form["descr"]; DAL.DALMenu.Update(menu); }
最后效果如如下
数据库的最终存储结构如下图,数据库中文显示乱码问题我也解决了,只要改一下命令窗口的编码就行了,默认的是gbk,改成utf-8的
虽然这样role表显的有些臃肿,但是用户每次登陆肯定是要显示菜单的,这些数据都是必须查询出来的,所以臃肿也无所谓了。
如果需要查找role下面的一个子菜单的话,我是先读出来它的一级菜单集合,然后再使用Linq的方式去查询它的二级和三级菜单。
Role role=DALRole.GetById(roleid); List<Menu> rolemenus = role.Menus;//该角色下一级菜单 集合foreach (var rolemenu in rolemenus)//循环一级菜单 { cstr += "<div id=\"m" + rolemenu._id + "\" style=\"width: 150px;\">"; List<Menu> childmenus = rolemenu.Child; if (childmenus.Count > 0)//有二级菜单 { str += "<a href=\"#\" class=\"easyui-menubutton\" data-options=\"menu:‘#m" + rolemenu._id + "‘,iconCls:‘" + rolemenu.Icon + "‘\">" + rolemenu.Name + "</a>"; foreach (var m in childmenus) { cstr += GetChildMenus(m.Child, roleid, m._id, m.Name, m.Url); } } else { str += "<a href=\"#\"onclick=\"addTab(‘" + rolemenu.Name+ "‘,‘" + rolemenu.Url+ "‘)\" class=\"easyui-linkbutton\" data-options=\"plain:true,iconCls:‘" + rolemenu.Icon + "‘\">" + rolemenu.Name+ "</a>"; } cstr += "</div>"; }
贴出来起到一个抛砖引玉的作用吧。
其实Mongo的官方驱动本身已经很强大了,比较符合大家的c#开发习惯了,所以操作起来还是比较简单的。顺便提一下,查出来的时间会比实际时间小,需要属性上加上标示
/// <summary> /// 默认时间比真实时间小8个小时 /// </summary> [BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime CreateTime { get; set; }
我把我遇到的问题基本上都总结出来了,我觉得可能大家在初次接触的时候也会遇到相同的问题,所以整理出来共享一下,也作为自己的一个学习笔记。
下一步就是整理框架了,如果整理之后有什么心得的话我也会拿出来分享的
原文:http://www.cnblogs.com/bjjjunjie/p/4091773.html
内容总结
以上是互联网集市为您收集整理的c#开发Mongo笔记第八篇全部内容,希望文章能够帮你解决c#开发Mongo笔记第八篇所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。