1/2页12 跳转到查看:9641
发新话题 回复该主题
键盘左右键可以进行前后翻页操作
帮助

[] 实现Discuz!NT集成在其他开发的项目中

实现Discuz!NT集成在其他开发的项目中

实现Discuz!NT集成在其他开发的项目中:
修改目标:
目标1、让Discuz!NT使用其他域提交的用户信息;实现与其他域的统一登录,并屏蔽Discuz!NT的用户注册功能;
目标2、用户在Discuz!NT中活动积分影响其他域;
目标3、其他域调用Discuz!NT中最新贴、精华贴;

* Discuz!NT 下载地址:http://nt.discuz.net/product/download.aspx?id=7
* 先使用Reflector反编译所有dll,并重建Project。

目标1实现:
A、分析:为实现与其他域的统一登录,必须在用户访问Discuz!NT的每一个页面中检查该用户是否在其他域登录;
B、方法:找到Discuz.Forum.BasePage类,该类继承于Page基类,且Discuz!NT中的所有aspx页面继承与该类,我们可在Discuz.Forum.BasePage中的OnInit(EventArgs e)方法中直接加入判断用户是否在其他域中登录的判断处理代码;
C、代码:

      protected override void OnInit(EventArgs e)
      {
          ODUMASAuth(); //用户登录判断代码
          this.m_processtime = (Environment.TickCount - this.m_starttick) / 1000f;
          base.OnInit(e);
        }

        private void ODUMASAuth()
        {
            OnlineAuthHandle _Online = new ODUMASClient.OnlineAuthHandle();
            OnlineAuthHandle.ODUMAS_UserStat UserStat = _Online.UserOnlineAuth_NotRedirect();
            if (UserStat == OnlineAuthHandle.ODUMAS_UserStat.IsQuit || UserStat == OnlineAuthHandle.ODUMAS_UserStat.IsNullSession)
            {
                //如果该用户在其他域为退出状态 则退出
                SetUrl("index.aspx");
                SetShowBackLink(false);
                OnlineUserFactory.DeleteRows(this.olid);
                ForumUtils.ClearUserCookie();
                Utils.WriteCookie("dnttemplateid", "", -999999);
                return;
            }

            UserInfo User = UserFactory.GetUserInfo(uSession.ULoginName);
            if (User != null)
            {
                //该用户已在Discuz!NT中创建,则自动登陆该用户
                ... ...
            }
            else
            {
                //该用户在Discuz!NT未创建,则自动创建该用户,并自动登录
                ... ...

            }
        }


TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

目标2实现:
A、分析:为避免去修改或研究较为复杂的Discuz!NT积分功能代码片断,可在Discuz.Forum.UserCreditsFactory中修改UpdateUserCredits方法;

B、方法:找到Discuz.Forum.UserCreditsFactory类,该类所有方法均为对用户Credits及ExtCredits的操作;

C、代码: scoreset.config中定义extcredits2(影响其他域的积分设置)


        private static int UpdateUserCredits(int uid, int[] values)
        {
            UserInfo User = UserFactory.GetUserInfo(uid);
            if (User == null)
            {
                return 0;
            }
            if (values.Length < 8)
            {
                return -1;
            }
            SqlParameter[] parameterArray1 = new SqlParameter[] { Database.MakeInParam("@uid", SqlDbType.Int, 4, uid), Database.MakeInParam("@extcredits1", SqlDbType.Float, 8, values[0]), Database.MakeInParam("@extcredits2", SqlDbType.Float, 8, values[1]), Database.MakeInParam("@extcredits3", SqlDbType.Float, 8, values[2]), Database.MakeInParam("@extcredits4", SqlDbType.Float, 8, values[3]), Database.MakeInParam("@extcredits5", SqlDbType.Float, 8, values[4]), Database.MakeInParam("@extcredits6", SqlDbType.Float, 8, values[5]), Database.MakeInParam("@extcredits7", SqlDbType.Float, 8, values[6]), Database.MakeInParam("@extcredits8", SqlDbType.Float, 8, values[7]) };
            string text1 = "UPDATE [" + BaseConfigFactory.GetTablePrefix + "users] SET \t\t[extcredits1]=[extcredits1] + @extcredits1, \t\t[extcredits2]=[extcredits2] + @extcredits2, \t\t[extcredits3]=[extcredits3] + @extcredits3, \t\t[extcredits4]=[extcredits4] + @extcredits4, \t\t[extcredits5]=[extcredits5] + @extcredits5, \t\t[extcredits6]=[extcredits6] + @extcredits6, \t\t[extcredits7]=[extcredits7] + @extcredits7, \t\t[extcredits8]=[extcredits8] + @extcredits8 WHERE [uid]=@uid";
            Database.ExecuteNonQuery(CommandType.Text, text1, parameterArray1);
            try
            {
        //影响其他域的积分
                int integral = values[1];
        //修改其他域积分
                string HandleMsg = null;
                ODUMASClient.PowerHandle _PHandle = new ODUMASClient.PowerHandle();
                _PHandle.AddUserIntegral(User.Username, integral, out HandleMsg);
            }
            catch { }
            return UserCreditsFactory.UpdateUserCredits(uid);
        }


* 还有几个方法,均按此修改。

TOP

 

回复: 实现Discuz!NT集成在其他开发的项目中










目标3实现:
A、分析:其他域采用javascript代码调用最新发帖及精华贴,如:<script type="text/javascript" src="http://bbs.XXXX.com/TopPostInfoList.aspx?topnum=9&class=newpost"></script>
B、方法:找到Discuz.ForumPage.showtopiclist类,该类提供对最新发帖及精华贴的主题List调取;
C、新建\aspx\1TopPostInfoList.aspx文件:

<%@ Page Language="c#" AutoEventWireup="false" EnableViewState="false" Inherits="Discuz.ForumPage.showtopiclist" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="Discuz.Common" %>
<%@ Import Namespace="Discuz.Forum" %>
<script runat="server" type="text/C#">
    public string GetForumName(int Fid)
    {
        return Database.ExecuteScalarToStr(CommandType.Text, "SELECT [name] FROM [" + BaseConfigFactory.GetTablePrefix + "forums] WHERE fid = " + Fid.ToString());
    }
    private string classname
    {
        get
        {
            if (Request.QueryString["class"] != null && Request.QueryString["class"].Trim().Length > 0)
            {
                return " class='" + Request.QueryString["class"].Trim() + "'";
            }
            else
                return "";
        }
    }
    override protected void OnInit(EventArgs e)
    {
        base.OnInit(e);
        int topic__loop__id = 0;
        foreach (DataRow topic in topiclist.Rows)
        {
            topic__loop__id++;
            Response.Write("window.document.write(\"<div" + classname + ">\");\r\n");
            Response.Write("window.document.write(\"<a href='http://bbs.XXX.com/showtopic.aspx?topicid=" + topic["tid"].ToString().Trim() + "'>" + topic["title"].ToString().Trim().Replace("\"","'") + "</a>\");\r\n");
            Response.Write("window.document.write(\" [ \");\r\n");
            //Response.Write("window.document.write(\"<a href='http://bbs.XXX.com/userinfo.aspx?userid=" + topic["posterid"].ToString().Trim() + "'>" + topic["poster"].ToString().Trim() + "</a> by \");\r\n");
            Response.Write("window.document.write(\" <a href='http://bbs.XXX.com/showforum.aspx?forumid=" + topic["fid"].ToString().Trim() + "'>" + GetForumName(Int32.Parse(topic["fid"].ToString())).Trim() + "</a>\");\r\n");
            Response.Write("window.document.write(\" " + ((DateTime)topic["postdatetime"]).ToString("MM-dd") + "\");\r\n");
            Response.Write("window.document.write(\" ] \");\r\n");
            Response.Write("window.document.write(\"</div>\");\r\n\r\n");
        } //end loop
    }
</script>


D、在相关存储过程中增加返回(select) "fid" 字段值。

附件

1.gif ()

调用效果 (2007-1-15 16:27:55)

1.gif

最后编辑FixCood 最后编辑于 2007-01-15 16:31:50

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

:):)

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

mark
:)

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

写得真好,大力支持!

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

先顶了,再仔细看看。
http://bbs.hotzs.com

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

顶,准备以后再开发用!

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

不错,支持!

TOP

 

回复:实现Discuz!NT集成在其他开发的项目中

用Reflector反编译所有dll,重建Project时,有很多错呀!
[fly]我怎么飞不起来... [/fly]

TOP

 
1/2页12 跳转到
发表新主题 回复该主题