SharePoint 2010 类似人人网站内信功能实施
简介:用SharePoint代码加实施的方式,完成类似人人网站内信功能,当然,实现的比较简单,样式也比较难看,只为给大家一个实施的简单思路,如有谬误,还请见谅。当然,还有就是截图比较长,当然为了让大家清晰了解每一步,并不是博主啰嗦,事先声明。
一、展示效果一,李四发送站内信给张三:
1、李四发站内信,给张三,如下图所示:

2、发送完毕后,查看李四的收件箱,为空,如下图:

3、发送完毕后,查看李四的发件箱,有李四给张三发送的站内信,如下图:

4、切换账号,张三登陆,查看右上角登录信息,张三;右上角有一天未读信息提示,是个WebPart,把鼠标放在上面,看到状态栏有链接,是查看站内信的链接,点击进入;

5、进入收件箱,发现张三的收件箱里,有李四发给张三的站内信,如下图:

6、进入发件箱,发现没有任何站内信,如下图:

7、切换回来收件箱,然后点击那条收到的站内信,如下图:

8、点击查看站内信,站内信的标题、内容、接受者、发送者、是否阅读,样式有点难看,其实可以稍微美化下,时间仓促,也没做,凑合见人吧,如下图:

9、查看以后,返回http://mytravels/SitePages/MyMessage.aspx页面,发现阅读过的那条信息,上面的加粗没有了,如下图(对比7,可能看不很清楚,可以点击大图):

二、展示效果二,张三发送站内信给联系人组
1、发送站内信,Receiver接受者输入联系人组“联系人”,如下图;

2、特别说明,联系人组,有张三和李四两个人,如下图:

3、站内信发送完毕后,张三的站内信收件箱有一条新站内信,因为他也在联系人组,如下图:

4、张三查看自己的发件箱,只有刚刚发送给联系人组的站内信,如下图:

5、切换李四账号,进入首页,发现提示有一条站内信,如下图:

6、进入收件箱,看到张三发给联系人组的站内信,如下图;至此,张三发给联系人组的站内信,张三、李四都收到了;

三、结构简单介绍
有两张列表,一张是发件箱,一张是收件箱如下图介绍:
1、 发件箱列表,如下图所示,包括字段标题、内容、收件人(用户/用户组)

2、收件箱列表,通过Sender字段(类型:用户/用户组),确定这条站内信是谁的

原理简介:
发件箱里每加入一条信息,通过一个事件触发器来发送站内信,如果是用户,就往收件箱里add一条Item,sender字段就是收件人;如果是用户组,就把用户组里的人员读出来,往收件箱里为每个用户add一条Item。
发件箱创建一个视图,就是创建者=本人,也就是所有登陆用户发送的站内信,都显示出来了;收件箱通过一个WebPart进行展示,把所有Sender字段是登陆用户的,全部显示出来,如果IsRead是否阅读字段为否,也就是没有阅读的,加粗显示,IsRead是否阅读字段为是,也就是已经阅读的,正常显示。
然后,在阅读页面上,添加一个WebPart,功能是每当登陆用户点进去查看这个站内信,就用Item.SystemDate()把是否阅读字段,更新为是,也就是已经阅读,这样,返回站内信列表的时候,加粗显示就会消失。
首先的站内信提示,是读取Sender==本人,且是否阅读为否,也就是登陆账号没有阅读的站内信数量,通过Div浮动显示在右上角,加关闭js脚本实现。
四、示例代码:
1、 解决方案结构,如下图所示:

2、发件箱的事件触发器代码
|
1、 public static string url = "http://mytravels"; 2、 /// <summary> 3、 /// 已°?添¬¨ª加¨®项?. 4、 /// </summary> 5、 public override void ItemAdded(SPItemEventProperties properties) 6、 { 7、 string strTitle = string.Empty; 8、 string strMessage = string.Empty; 9、 string strCreator = string.Empty; 10、 string strReceiver = string.Empty; 11、 12、 strTitle = properties.ListItem["Title"].ToString(); 13、 strMessage = properties.ListItem["Message"].ToString(); 14、 strCreator = properties.ListItem["Author"].ToString(); 15、 strReceiver = properties.ListItem["Receiver"].ToString(); 16、 17、 using (SPSite site = new SPSite(url)) 18、 { 19、 using (SPWeb web = site.OpenWeb()) 20、 { 21、 string str = GetUserString(strReceiver); 22、 if (str.IndexOf("$") > 0) 23、 { 24、 string[] strUser = str.Split('$'); 25、 for (int i = 0; i < strUser.Length; i++) 26、 { 27、 SPListItem item = web.Lists["ReceiveList"].Items.Add(); 28、 item["Title"] = strTitle; 29、 item["Message"] = strMessage; 30、 item["Sender"] = strUser[i]; 31、 item["Onwer"] = strCreator; 32、 item.Update(); 33、 } 34、 } 35、 else 36、 { 37、 SPListItem item = web.Lists["ReceiveList"].Items.Add(); 38、 item["Title"] = strTitle; 39、 item["Message"] = strMessage; 40、 item["Sender"] = strReceiver; 41、 item["Onwer"] = strCreator; 42、 item.Update(); 43、 } 44、 } 45、 } 46、 //base.ItemAdded(properties); 47、 } 48、 49、 public static string GetUserString(string str) 50、 { 51、 string Rs = string.Empty; 52、 string strID = string.Empty; 53、 if (str.IndexOf(";") > 0) 54、 { 55、 strID = str.Split(';')[0]; 56、 } 57、 int myID = Convert.ToInt32(strID); 58、 using (SPSite site = new SPSite(url)) 59、 { 60、 using (SPWeb web = site.OpenWeb()) 61、 { 62、 try 63、 { 64、 SPUser user = web.AllUsers.GetByID(myID); 65、 Rs = str; 66、 } 67、 catch 68、 { 69、 } 70、 try 71、 { 72、 SPGroup group = web.Groups.GetByID(myID); 73、 SPUserCollection usercol = group.Users; 74、 75、 foreach (SPUser user in usercol) 76、 { 77、 if (user.Name == "系¦Ì统ª3帐¨º户¡ì") 78、 continue; 79、 Rs += user.ID + ";#" + user.Name + "$"; 80、 } 81、 Rs = Rs.Substring(0, Rs.Length - 1); 82、 } 83、 catch 84、 { 85、 } } } return Rs; } |
3、收件箱展示代码:
|
protected override void Render(HtmlTextWriter writer) { SPSite site = SPContext.Current.Site; SPWeb web = site.OpenWeb(); SPList list = web.Lists["ReceiveList"]; SPQuery query = new SPQuery(); query.Query = @"<Where> <Eq> <FieldRef Name='Sender' LookupId='TRUE'/> <Value Type='User'>" + web.CurrentUser.ID.ToString() + @"</Value> </Eq> </Where>"; writer.Write("<script>function del(){alert('123');}</script>"); writer.Write("<table>"); writer.Write("<tr><td><a onclick='del()'>删¦?除y</a></td><td>站?内¨²信?标À¨º题¬a</td><td>创ä¡ä建¡§时º¡À间?</td></tr>"); foreach (SPListItem item in list.GetItems(query)) { string BoldFont = "style='text-decoration:none;color:#000000;'"; if (item["IsRead"].ToString() != "True") { BoldFont = "style='text-decoration:none;color:#000000;font-weight:bold;'"; } writer.Write("<tr><td><input type='checkbox' id='ID" + item["ID"].ToString() + "'/></td><td>"); writer.Write("<a " + BoldFont + " href='/Lists/ReceiveList/DispForm.aspx?ID=" + item["ID"].ToString() + "'>" + item["Title"].ToString() + "</a>"); writer.Write("</td><td>" + item["Created"].ToString() + ""); writer.Write("</td></tr>"); } writer.Write("</table>"); //base.Render(writer); } |
4、修改站内信为已读代码
|
protected override void Render(HtmlTextWriter writer) { try { SPSecurity.RunWithElevatedPrivileges(delegate() { using (SPSite site = new SPSite("http://mytravels")) { using (SPWeb web = site.OpenWeb()) { int ItemID = Convert.ToInt32(HttpContext.Current.Request.QueryString["ID"]); web.AllowUnsafeUpdates = true; SPListItem item = web.Lists["ReceiveList"].GetItemById(ItemID); item["IsRead"] = "True"; item.SystemUpdate(); web.AllowUnsafeUpdates = false; } } }); } catch { } //base.Render(writer); } |
5、首页未读站内信提示代码
|
protected override void Render(HtmlTextWriter writer) { SPSite site = SPContext.Current.Site; SPWeb web = site.OpenWeb(); SPList list = web.Lists["ReceiveList"]; SPQuery query = new SPQuery(); query.Query = @"<Where> <And> <Eq> <FieldRef Name='Sender' LookupId='TRUE'/> <Value Type='User'>" + web.CurrentUser.ID.ToString() + @"</Value> </Eq> <Eq> <FieldRef Name='IsRead' /> <Value Type='Boolean'>False</Value> </Eq> </And> </Where>"; SPListItemCollection itemcoll = list.GetItems(query); if (itemcoll.Count == 0) return; string content = "未¡ä读¨¢站?内¨²信?:êo" + itemcoll.Count.ToString(); writer.Write(@"<div id='divMessage' style='height:25px;position:absolute;z-index:1;float:right;top:15px;right:0px;background-color:#00CCFF'> <table width='200' border='0' cellspacing='0' cellpadding='0'> <tr> <td><a href='/SitePages/MyMessage.aspx'>" + content + @"</a></td> <td><a onclick='closediv()'>X</a></td> </tr> </table> <script type='text/javascript'> function closediv() { document.getElementById('divMessage').style.display='none'; } </script>"); } |
五、博主感言
利用半天的时间,实现这样一个功能,感觉这也是SharePoint比较方便的地方,简单的代码开发,页面定制,完成一个小功能,效率也不算很低。当然,我不是贬低net或者其他开发,笔者对于每一项技术,都很尊重。
在SharePoint的开发中,最大的感触就是无代码开发和代码开发相结合,这就需要我们对SharePoint现有功能的熟练掌握,和对于SharePoint平台的理解,当然,笔者从事SharePoint时间也不是很长,每个人都有自己的局限性,在利用业余时间,做点小东西共享给大家,一起学习探讨SharePoint,是一件乐事。
特别地说,实施过程由于时间仓促,代码写的比较简单,更多为了实施功能,很多需要注意的地方,都没有考虑太多;再有就是对于列表性能方面,也没有涉及太多考虑,只是给予大家一个简单思路,如有参考,慎行。还有,就是每个人的技术不一样,如果觉得本文过于简单请绕行,老鸟勿喷,谢谢。
SharePoint 2010 类似人人网站内信功能实施的更多相关文章
- ASP.NET 实现站内信功能(点对点发送,管理员群发)
正好这段时间在研究这个功能,还是得感谢这位大神,没有他的引路,我就不可能把站内信做出来. http://www.cnblogs.com/grenet/archive/2010/03/08/168065 ...
- 在SharePoint 2010中创建网站的权限级别
转:http://www.360sps.com/Item/CreatePermissionLevels.aspx 权限级别是SharePoint 2010新增加的功能,使我们对权限的设置又提高了一个层 ...
- sharepoint 2010 怎样在Ribbon区加入功能button
继续前面的一篇博客,sharepoint 2010 怎样在列表中加入功能菜单操作项.这次主要是记录下,在Ribbon区域加入功能button.比如加入收藏button.例如以下图所看到的: 1. 还是 ...
- SharePoint 2010 电子书下载网站推荐
最近一直搜集SharePoint2010的资料,偶尔发现一个网站还不错,推荐给大家,皮皮书屋http://www.ppurl.com/tag/sharepoint,里面有很多SharePoint201 ...
- ThinkPHP---thinkphp完善站内信功能
[一]收件箱 分析 控制器:EmailController.class.php 方法:recBox(全称receive box收件箱) 模板文件:recBox.html 分步操作: 第一步:创建方法r ...
- SharePoint 2010 Survey的Export to Spreadsheet功能怎么不见了?
背景信息: 最近用户报了一个问题,说他创建的Survey里将结果导出成Excel文件(Export to spreadsheet)的按钮不见了. 原因排查: 正常情况下,这个功能只存在于SharePo ...
- 在 SharePoint 2010 中访问数据
转:http://blog.banysky.net/?p=81001 数据访问的关键方法有哪些? | 使用查询类 | 使用 SPQuery | 使用 SPSiteDataQuery | 使用 LINQ ...
- 自定义和扩展 SharePoint 2010 Server 功能区
了解构成 SharePoint 2010 服务器功能区的组件以及如何通过演练两个功能区自定义项方案来自定义功能区. 适用范围: Microsoft SharePoint Foundation 2010 ...
- SharePoint 2010在win7 x64 安装
转:http://kaneboy.blog.51cto.com/1308893/328000 关于<SharePoint 2010应用程序开发指南>,我和杜伟同学正在撰写中,希望下半年早点 ...
随机推荐
- 提高Java代码质量:使用枚举定义常量(转)
一.分析 常量的声明是每一个项目中不可或缺的,在Java1.5之前,我们只有两种方式的声明:类常量和接口常量.不过,在1.5版之后有了改进,即新增了一种常量声明方式,枚举常量.代码如下: enum ...
- 一起做RGB-D SLAM 第二季 (二)
本节目标 我们要实现一个基本的文件IO,用于读取TUM数据集中的图像.顺带的,还要做一个参数文件的读取. 设计参数文件读取的类:ParameterReader 首先,我们来做一个参数读取的类.该类读取 ...
- Log4Net 手册
首先感慨下,现在的程序员做的工作因为高级语言的生产力,系统框架模式的成熟,开源大牛的贡献,已经成越来越偏向 “面向配置编程”了...... 详细使用指南见文章:http://blog.csdn.net ...
- Popup 显示阴影
WPF Popup: How to put a border around the popup? 通过设置 Border 的 margin 来为阴影留出位置,并设置 Popup: AllowsTran ...
- R包介绍
R语言的使用,很大程度上是借助各种各样的R包的辅助,从某种程度上讲,R包就是针对于R的插件,不同的插件满足不同的需求,截至2013年3月6日,CRAN已经收录了各类包4338个. 一. R语言包的安装 ...
- [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- Deep Learning 在中文分词和词性标注任务中的应用
开源软件包 SENNA 和 word2vec 中都用到了词向量(distributed word representation),当时我就在想,对于我们的中文,是不是也类似地有字向量(distribu ...
- [Python]同是新手的我,分享一些经验
本来想分享一些知识,但是发现,写着写着,感觉分享一些经验,或许会少让大家走一些弯路,索性就把标题一改. 我不是教给大家些什么,我没有资格,我也是摸着石头过河,我只是本着分享的精神,在这里分享自己的东西 ...
- 探索jdk8之ConcurrentHashMap 的实现机制
在介绍ConcurrentHashMap源码之前,很有必要复习下java并发编程中的一些基础知识,比如内存模型等. 存储模型 并发编程中的三个概念 1.原子性 2.可见性 3.重排序 对HashMap ...
- css中px,em和rem的区别
css中px,em和rem的区别 今天,突然间发现一个特别有意思的问题,就是无意间看到一个网站中的em并不是16px,下面展开了对于px和em以及rem的探究. 首先,px是绝对长度单位,是相对于显示 ...