zoukankan      html  css  js  c++  java
  • SharePoint 2010 类似人人网站内信功能实施

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

    一、展示效果一,李四发送站内信给张三:

    1、李四发站内信,给张三,如下图所示:

    clip_image001

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

    clip_image002

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

    clip_image003

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

    clip_image004

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

    clip_image005

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

    clip_image006

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

    clip_image005

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

    clip_image008

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

    clip_image007[1]

    二、展示效果二,张三发送站内信给联系人组

    1、发送站内信,Receiver接受者输入联系人组“联系人”,如下图;

    clip_image009

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

    clip_image010

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

    clip_image011

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

    clip_image012

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

    clip_image013

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

    clip_image014

    三、结构简单介绍

    有两张列表,一张是发件箱,一张是收件箱如下图介绍:

    1、 发件箱列表,如下图所示,包括字段标题、内容、收件人(用户/用户组)

    clip_image015

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

    clip_image016

    原理简介:

      发件箱里每加入一条信息,通过一个事件触发器来发送站内信,如果是用户,就往收件箱里add一条Item,sender字段就是收件人;如果是用户组,就把用户组里的人员读出来,往收件箱里为每个用户add一条Item。

      发件箱创建一个视图,就是创建者=本人,也就是所有登陆用户发送的站内信,都显示出来了;收件箱通过一个WebPart进行展示,把所有Sender字段是登陆用户的,全部显示出来,如果IsRead是否阅读字段为否,也就是没有阅读的,加粗显示,IsRead是否阅读字段为是,也就是已经阅读的,正常显示。

      然后,在阅读页面上,添加一个WebPart,功能是每当登陆用户点进去查看这个站内信,就用Item.SystemDate()把是否阅读字段,更新为是,也就是已经阅读,这样,返回站内信列表的时候,加粗显示就会消失。

      首先的站内信提示,是读取Sender==本人,且是否阅读为否,也就是登陆账号没有阅读的站内信数量,通过Div浮动显示在右上角,加关闭js脚本实现。

    四、示例代码:

    1、 解决方案结构,如下图所示:

    clip_image017

    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,是一件乐事。

      特别地说,实施过程由于时间仓促,代码写的比较简单,更多为了实施功能,很多需要注意的地方,都没有考虑太多;再有就是对于列表性能方面,也没有涉及太多考虑,只是给予大家一个简单思路,如有参考,慎行。还有,就是每个人的技术不一样,如果觉得本文过于简单请绕行,老鸟勿喷,谢谢。

  • 相关阅读:
    02 Hibernate错题分析
    08章 分组查询、子查询、原生SQL
    NHibernate的基本使用
    NHibernate与IbatisNet的简单比较
    NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
    NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
    NHibernate从入门到精通系列(1)——NHibernate概括
    SQL字符串操作汇总
    SVN (TortioseSVN) 版本控制之忽略路径(如bin、obj、gen)
    SVN服务器搭建和使用(三)
  • 原文地址:https://www.cnblogs.com/jianyus/p/3175737.html
Copyright © 2011-2022 走看看