前提:

论坛的源码版本为dnt_3.9.913_sqlserver_beta.zip,以下例子都以这个版本为原型修改

dnt_3.9.913数据字典:下载

目前(2013年10月21日)官网的asp.net版本相关文件下载地址 http://download.comsenz.com/DiscuzNT/

一、云平台开通提示 One of the parameters specified was missing(开通qq登录)

1.修改根目录下 dnt.config 的 Founderuid 改为 1
2.重启应用程序池
3.登录你的后台点击开通
4.后台 -- 工具 -- 数据库 -- 执行SQL语句

DROP INDEX [dnt_userconnect].[uid]
CREATE INDEX [uid] ON [dnt_userconnect] ([uid])

后记:云平台还是有诸多问题,一直尝试不能成功,根据我的分析,可能是3.9的云平台代码太成就 不能和新的qq云台兼容的问题,我费了2-3天的功夫还是不行,还反射了discuz的dll,都未能解决。

后来决定在这个项目中放弃这个平台,应为客户指明需要qq登录功能,没办法,换php版本了,目前正在研究中,但是如果不实现这个功能discuzNT版还是很不错的。

以下是我的初步分析:

这是connect.aspx页面的代码节选(删除了部分代码):

 if (!(a == "access"))
  {} 

 else if (!this.CheckCallbackSignature(DNTRequest.GetString("con_sig")))
             {
                 base.AddErrLine("非法请求");
                 return;
             }

注意第4行的 CheckCallbackSignature方法,方法如下:

// Discuz.Web.connect
private bool CheckCallbackSignature(string sig)
{
    StringBuilder stringBuilder = new StringBuilder();
    List<DiscuzOAuthParameter> list = new List<DiscuzOAuthParameter>();
    string[] allKeys = HttpContext.Current.Request.QueryString.AllKeys;
    ; i < allKeys.Length; i++)
    {
        string text = allKeys[i];
        , ) == "con_" && text != "con_sig")
        {
            list.Add(new DiscuzOAuthParameter(text, DNTRequest.GetString(text)));
        }
    }
    list.Sort(new ParameterComparer());
    foreach (DiscuzOAuthParameter current in list)
    {
        stringBuilder.AppendFormat("{0}={1}&", current.Name, current.Value);
    }
    stringBuilder.Append(DiscuzCloudConfigs.GetConfig().Connectappkey);
    return sig == Utils.MD5(stringBuilder.ToString());
}

里面有个关键的方法MD5

// Discuz.Common.Utils
public static string MD5(string str)
{
    byte[] array = Encoding.UTF8.GetBytes(str);
    array = new MD5CryptoServiceProvider().ComputeHash(array);
    string text = "";
    ; i < array.Length; i++)
    {
        text += array[i].ToString(, ');
    }
    return text;
}

以上这些只要是验证qq跳转页面发送过来的链接字符串里面的参数,然后discuz在后台用这些算法进行匹配验证,当然验证不只在这一出。所以很头疼。希望有精力的大侠再接再厉哦,如能改写成功就造福我们这些c#er了。

反编译方法:使用工具ILSpy(这个很容易在网上下到,是开源免费的)

二、向Discuz!NT 3.9.913主页添加自定义内容

主页文件模板的地址:aspx--1--forumindex.aspx

要点:基本的形式为使用一个stringbuilder对象来动态生成aspx页的代码。

需要借助的工具:IEdevelopToolbar

比如我们要在公告的上面插入一个和页宽相同的不带超链接的图片广告栏为例来说明(复杂的例子不过是修改html和添加css、js而已):

步骤:

1、使用IE打开已经部署好的Discuz!NT 论坛的首页“http://localhost/index.aspx”

2、使用IEdevelopToolbar的“选择元素”工具(ctrl+b),选取你要插入广告的地方下方的DIV(公告DIV),我们就可以找到“wrap cl forum”这几个关键字

3、在VS里面打开aspx--1--forumindex.aspx,搜索(ctrl+f)“wrap cl forum”,会定位到代码的528行,将原有语句替换为:

templateBuilder.Append("script>\r\n<div id=\"BA_c_advertisementsDIV\" class=\"wrap cl forum BA_c_advertisements\"><img alt=\"\" src=\你广告的图片地址\"/></div><div class=\"wrap cl forum\">\r\n<div class=\"announcement cl\">\r\n <div onmouseout=\"annstop = 0\" onmouseover=\"annstop = 1\" id=\"announcement\">\r\n <span>公告:</span>\r\n <div id=\"announcementbody\">\r\n <ul> \r\n ");

4、添加CSS样式:

在IE里面展开index.aspx的html源码页,会发现主页引用了2个css文件

我们就把自定义的css样式追加写在/templates/red/dnt.css这个文件里面:

.BA_c_advertisements {
height: 100px;
}

实际我的自定义div使用了4个css样式类,为什么呢?因为为了和下面的区域保存样式一致我就使用了wrap cl forum这3个系统自带的样式,只在自己定义的样式BA_c_advertisements 里面定义了一个高度而已。

通过这个演示,相信对HTML和ASP.NET页面比较熟悉的朋友就很容易的实现在首页里面添加自己的DIY内容了。

三、添加广告升级版 从xml文件中动态态获取广告图片和连接地址

1、在根目录下创建xml文件“BA_advertisements.xml”

<?xml version="1.0" encoding="utf-8" ?>
<advertisements>
<BA_banner img_src="../BA_advertisements/banner.jpg" href="www.baidu.com">
</BA_banner>
</advertisements>

2、在根目录下创建文件夹“BA_advertisements”,并附加图片

3、在aspx--1--forumindex.aspx 页中适当位置插入以下代码:

templateBuilder.Append("<div id=\"BA_c_advertisementsDIV\" class=\"wrap cl forum BA_c_advertisements\">");
System.Xml.XmlDataDocument xmlDoc;
xmlDoc = new System.Xml.XmlDataDocument();
xmlDoc.Load(System.Web.HttpContext.Current.Server.MapPath("~/BA_advertisements.xml"));
string img_src = xmlDoc.SelectSingleNode("advertisements/BA_banner").Attributes["img_src"].Value;
string href = xmlDoc.SelectSingleNode("advertisements/BA_banner").Attributes["href"].Value;
templateBuilder.Append("<a href=\"" + href + "\" style=\"border:hidden\"><img alt=\"\" src=\"" + img_src + "\"/></a></div>");

 四、从数据库获取固定分类下的帖子列表

1、建立视图

与帖子列表有关的两个数据库表为 dbo.BA_forums和dbo.BA_topics,在数据库中建立一个视图:

CREATE VIEW [dbo].[View_forums_topics_onfid]
AS
SELECT   dbo.BA_forums.fid, dbo.BA_forums.name, dbo.BA_topics.tid, dbo.BA_topics.fid AS topics_fid,
                dbo.BA_topics.postdatetime, dbo.BA_topics.replies, dbo.BA_topics.views, dbo.BA_topics.title
FROM      dbo.BA_forums INNER JOIN
                dbo.BA_topics ON dbo.BA_forums.fid = dbo.BA_topics.fid

GO

2、新建三层项目,填写代码后,分项目诸葛生成,可采用我的代码生成器自动生成代码(下载)

如我的代码是获取官方活动这个分类下的所有帖子,BLL中的一段代码:

 public DataTable GetAllGuanFangHuoDong()
        {
            string path = ConfigurationManager.AppSettings["GuanFangHuoDong_forumsID"];
            return dal.getDataByname("官方活动");
        }

4、在aspx--1--forumindex.aspx 页中加入DLL引用

6、修改aspx--1--forumindex.aspx 页中的代码

      BLL.IndexBLL IB = new IndexBLL();
        DataTable dt = IB.GetAllGuanFangHuoDong();
        templateBuilder.Append("<div id=\"BA_AD_bannerDIV\" class=\"wrap cl forum BA_AD_banner\">");

        ;i<dt.Rows.Count;i++)
        {
            templateBuilder.Append("<a href=\"/showtopic-" + dt.Rows[i]["tid"] + ".aspx\" style=\"border:hidden\">" + dt.Rows[i]["title"] + "</a>");
        }
        templateBuilder.Append("</div>");

 五、Discuz!NT 附加到虚拟空间

1、下载Discuz!NT 源码,在ftp虚拟空间里面新建一个目录,比如BBSNew,然后先将所有解压后的Discuz!NT 源码都上传至这个目录下。

2、修改原有网站的Web.Config文件,即添加以下两处代码

a、configuration节点下的<system.webServer>

b、system.web节点下的<httpModules>

<system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules>
            <!--  注意:此节设置由Discuz!NT接管http请求。不会干涉对非Discuz!NT论坛路径下的请求。-->
            <add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
        </modules>
        <defaultDocument>
            <files>
                <clear />
                <add value="index.aspx" />
                <add value="forumindex.aspx" />
                <add value="spaceindex.aspx" />
                <add value="albumindex.aspx" />
            </files>
        </defaultDocument>
        <directoryBrowse enabled="true" />
    </system.webServer>
<httpModules>
      <add type="Discuz.Forum.HttpModule, Discuz.Forum" name="HttpModule" />
    </httpModules>

3、在原有网站的根目录下添加DNT.config文件,并且修改里面的参数,   将<ForumPath>/</ForumPath> 修改为<ForumPath>/BBSNew/</ForumPath>。

4、将源码中Bin目录下的所有DLL文件上传到原有网站即根目录的Bin目录下。

5、在浏览器中,导航到XX/BBSNew/install/这个目录,运行安装流程。

Discuz!NT 3.9.913 Beta DIY过程的更多相关文章

  1. Discuz!NT 后台任意文件上传的源代码修补方法

    相关的漏洞介绍: http://www.wooyun.org/bugs/wooyun-2013-035199 Discuz!NT 管理后台可以自定义文件类型,从而造成任意文件上传,测试过程中 aspx ...

  2. (转)Discuz!NT图文安装教程

    不同目录下的安装方法根据目前大家对论坛的使用需求,在安装上面大致有三种情况,站点根目录下安装,站点虚拟目录下安装和站点子目录下安装. 1.根目录安装 根目录安装是最简单也是稳定系数最高的安装和使用方式 ...

  3. Discuz!NT 3.5.2正式版与Asp.net网站会员信息整合

    Discuz!NT 提供了很多对外的接口利于与别的网站进行整合,经本人亲测,觉得开放的接口还是挺到位的.开发.测试一次通过,只不过api文档寻找无门,只能自己琢磨,费了不少周折,不过,功夫不负有心人, ...

  4. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  5. 从Discuz!NT项目文件结构看如何给系统框架分层和类库分文件夹

    以下为Discuz!NT的文件夹根目录: 类库图: 从上面两个图可以看出: 1.dnt对于类库的分层是通过名称的层级来区分的,如Discuz.Plugn和Discuz.Plugin.Spread 2. ...

  6. 对于Discuz!NT不允许新用户注册的解决办法

    客户论坛用的是Discuz!NT,但是用户注册总是提示不允许新用户注册,对于这个问题,网上好多说的是管理员登录后台,在"用户与访问控制"里将允许新用户注册改为"是&quo ...

  7. Discuz!NT静态文件缓存(SQUID)

    在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括:      1.Disc ...

  8. Discuz!NT中的Redis架构设计

    在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...

  9. Discuz!NT中集成Memcached分布式缓存

    大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...

随机推荐

  1. linux安装sqlcmd登录sqlserver

    首先从微软网站下载sqlncli安装文件,link. 因为是在内网安装,首先手工下载unixODBC2.3.0.tar.gz,下载后上传到服务器. 将下载的tar文件文件,放在同build_dm.sh ...

  2. Ubuntu系统的修改Hosts

    1.修改hostssudo gedit /etc/hosts2.添加解析记录( . )完整案例:127.0.0.1 localhost.localdomain localhost简洁记录:127.0. ...

  3. Linux 线程--那一年, 我们一起忽视的pthread_join

    前言: 通过linux的pthread库, 相信大家对创建/销毁线程肯定很熟悉, 不过对pthread_join是否知道的更多呢?实验: 先编写一个常规的程序 #include <pthread ...

  4. poj3249 Test for Job ——拓扑+DP

    link:http://poj.org/problem?id=3249 在拓扑排序的过程中进行状态转移,dp[i]表示从起点到 i 这个点所得到的的最大值.比如从u点到v点,dp[v]=max(dp[ ...

  5. uva562 Dividing coins 01背包

    link:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. UVa 1583 Digit Generator --- 水题+打表

    UVa 1583 题目大意:如果x加上x的各个数字之和得到y,那么称x是y的生成元. 给定数字n,求它的最小生成元 解题思路:可以利用打表的方法,提前计算出以i为生成元的数,设为d,并保存在a[d]中 ...

  7. thinkphp 验证码的使用

    在thinkphp中使用验证码很容易,只要调用thinkphp现有的方法就可以.当然,php的GD库肯定是要开的(就是在php.ini中要加载gd模块). thinkphp 3.2 --------- ...

  8. 【BZOJ2013】【JSOI2008】球形空间产生器

    看chty代码 原题: BZOJ挂了--等好了补上题面 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这 ...

  9. kuangbin_ShortPath R (HDU 4370)

    出题人真是脑洞堪比黑洞 (然后自己也被吸进去了 理解一遍题意 三个条件可以转化为 1的出度是1, n的入度是1, 2~n-1的出度等于入度 不难发现1-n的最短路符合题意 然而其实还有另一种情况 1为 ...

  10. Android sdk 镜像服务器资源

    大连东软信息学院镜像服务器地址:- http://mirrors.neusoft.edu.cn 端口:80北京化工大学镜像服务器地址:- IPv4: http://ubuntu.buct.edu.cn ...