设为首页 收藏本站
查看: 997|回复: 0

[经验分享] SharePoint 2010 类似人人网站内信功能实施

[复制链接]

尚未签到

发表于 2015-9-27 12:34:29 | 显示全部楼层 |阅读模式
  
    简介:用SharePoint代码加实施的方式,完成类似人人网站内信功能,当然,实现的比较简单,样式也比较难看,只为给大家一个实施的简单思路,如有谬误,还请见谅。当然,还有就是截图比较长,当然为了让大家清晰了解每一步,并不是博主啰嗦,事先声明。
  一、展示效果一,李四发送站内信给张三:
  1、李四发站内信,给张三,如下图所示:
DSC0000.png
  2、发送完毕后,查看李四的收件箱,为空,如下图:
DSC0001.png
  3、发送完毕后,查看李四的发件箱,有李四给张三发送的站内信,如下图:
DSC0002.png
  4、切换账号,张三登陆,查看右上角登录信息,张三;右上角有一天未读信息提示,是个WebPart,把鼠标放在上面,看到状态栏有链接,是查看站内信的链接,点击进入;
DSC0003.png
  5、进入收件箱,发现张三的收件箱里,有李四发给张三的站内信,如下图:
DSC0004.png
  6、进入发件箱,发现没有任何站内信,如下图:
DSC0005.png
  7、切换回来收件箱,然后点击那条收到的站内信,如下图:

  8、点击查看站内信,站内信的标题、内容、接受者、发送者、是否阅读,样式有点难看,其实可以稍微美化下,时间仓促,也没做,凑合见人吧,如下图:
DSC0006.png
  9、查看以后,返回http://mytravels/SitePages/MyMessage.aspx页面,发现阅读过的那条信息,上面的加粗没有了,如下图(对比7,可能看不很清楚,可以点击大图):
DSC0007.png
  二、展示效果二,张三发送站内信给联系人组
  1、发送站内信,Receiver接受者输入联系人组“联系人”,如下图;
DSC0008.png
  2、特别说明,联系人组,有张三和李四两个人,如下图:
DSC0009.png
  3、站内信发送完毕后,张三的站内信收件箱有一条新站内信,因为他也在联系人组,如下图:
DSC00010.png
  4、张三查看自己的发件箱,只有刚刚发送给联系人组的站内信,如下图:
DSC00011.png
  5、切换李四账号,进入首页,发现提示有一条站内信,如下图:
DSC00012.png
  6、进入收件箱,看到张三发给联系人组的站内信,如下图;至此,张三发给联系人组的站内信,张三、李四都收到了;
DSC00013.png
  三、结构简单介绍
  有两张列表,一张是发件箱,一张是收件箱如下图介绍:
  1、 发件箱列表,如下图所示,包括字段标题、内容、收件人(用户/用户组)
DSC00014.png
  2、收件箱列表,通过Sender字段(类型:用户/用户组),确定这条站内信是谁的
DSC00015.png
  原理简介:
  发件箱里每加入一条信息,通过一个事件触发器来发送站内信,如果是用户,就往收件箱里add一条Item,sender字段就是收件人;如果是用户组,就把用户组里的人员读出来,往收件箱里为每个用户add一条Item。
  发件箱创建一个视图,就是创建者=本人,也就是所有登陆用户发送的站内信,都显示出来了;收件箱通过一个WebPart进行展示,把所有Sender字段是登陆用户的,全部显示出来,如果IsRead是否阅读字段为否,也就是没有阅读的,加粗显示,IsRead是否阅读字段为是,也就是已经阅读的,正常显示。
  然后,在阅读页面上,添加一个WebPart,功能是每当登陆用户点进去查看这个站内信,就用Item.SystemDate()把是否阅读字段,更新为是,也就是已经阅读,这样,返回站内信列表的时候,加粗显示就会消失。
  首先的站内信提示,是读取Sender==本人,且是否阅读为否,也就是登陆账号没有阅读的站内信数量,通过Div浮动显示在右上角,加关闭js脚本实现。
  四、示例代码:
  1、 解决方案结构,如下图所示:
DSC00016.png
  2、发件箱的事件触发器代码
  1、 public static string url = "http://mytravels";
  2、 /// <summary>
  3、 /// 已°?添&not;&uml;&ordf;加&uml;&reg;项?.
  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;
  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 == "系|&Igrave;统&ordf;3帐&uml;&ordm;户&iexcl;&igrave;")
  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>站?内&uml;&sup2;信?标&Agrave;&uml;&ordm;题&not;a</td><td>创&auml;&iexcl;&auml;建&iexcl;§时&ordm;&iexcl;&Agrave;间?</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 = "未&iexcl;&auml;读&uml;¢站?内&uml;&sup2;信?:&ecirc;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,是一件乐事。
  特别地说,实施过程由于时间仓促,代码写的比较简单,更多为了实施功能,很多需要注意的地方,都没有考虑太多;再有就是对于列表性能方面,也没有涉及太多考虑,只是给予大家一个简单思路,如有参考,慎行。还有,就是每个人的技术不一样,如果觉得本文过于简单请绕行,老鸟勿喷,谢谢。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119484-1-1.html 上篇帖子: SharePoint 2007 Form 验证 下篇帖子: 在Sharepoint中如何共享其他网站中的列表?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表