Discuz!NT 3.9.913 Beta DIY过程
前提:
论坛的源码版本为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过程的更多相关文章
- Discuz!NT 后台任意文件上传的源代码修补方法
相关的漏洞介绍: http://www.wooyun.org/bugs/wooyun-2013-035199 Discuz!NT 管理后台可以自定义文件类型,从而造成任意文件上传,测试过程中 aspx ...
- (转)Discuz!NT图文安装教程
不同目录下的安装方法根据目前大家对论坛的使用需求,在安装上面大致有三种情况,站点根目录下安装,站点虚拟目录下安装和站点子目录下安装. 1.根目录安装 根目录安装是最简单也是稳定系数最高的安装和使用方式 ...
- Discuz!NT 3.5.2正式版与Asp.net网站会员信息整合
Discuz!NT 提供了很多对外的接口利于与别的网站进行整合,经本人亲测,觉得开放的接口还是挺到位的.开发.测试一次通过,只不过api文档寻找无门,只能自己琢磨,费了不少周折,不过,功夫不负有心人, ...
- Discuz NT 架构剖析之Config机制
接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...
- 从Discuz!NT项目文件结构看如何给系统框架分层和类库分文件夹
以下为Discuz!NT的文件夹根目录: 类库图: 从上面两个图可以看出: 1.dnt对于类库的分层是通过名称的层级来区分的,如Discuz.Plugn和Discuz.Plugin.Spread 2. ...
- 对于Discuz!NT不允许新用户注册的解决办法
客户论坛用的是Discuz!NT,但是用户注册总是提示不允许新用户注册,对于这个问题,网上好多说的是管理员登录后台,在"用户与访问控制"里将允许新用户注册改为"是&quo ...
- Discuz!NT静态文件缓存(SQUID)
在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括: 1.Disc ...
- Discuz!NT中的Redis架构设计
在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案 ...
- Discuz!NT中集成Memcached分布式缓存
大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了 ...
随机推荐
- hdu2546 饭卡 01背包
link:http://acm.hdu.edu.cn/showproblem.php?pid=2546 也算一个贪心的想法吧. 先把总钱数减去5,再把价值最大的挑出来.然后用01背包.最终买下挑出来的 ...
- tiny4412SD启动盘的制作--1
一.使用SD-flasher工具烧写superboot到SD卡. 1.SD-Flasher.exe 会对 SD 卡进行分区,第一个分区为 130M 用于存放 Superboot4412, 剩下的空间格 ...
- 软件或jar包等名字里的GA意思
首页 > 转贴的文章 > 软件的版本"GA"代表什么意思?如MyEclipse 5.0 GA 软件的版本"GA"代表什么意思?如MyEclips ...
- hive 常见面试题
(笔者自己做记录) 1.Hive内外部表的区别删除表是否影响外部数据2.Hive如何做到权限管理hive下可以修改配置后创建用户管理,但是仅仅是为了防止误操而已,如果要真的为了安全操作建议使用 Ker ...
- hihoCoder#1055 : 刷油漆 (树形DP+01背包)
题目大意:给一棵带点权的树,现在要从根节点开始选出m个连通的节点,使总权值最大. 题目分析:定义状态dp(u,m)表示在以u为根的子树从根节点开始选出m个点连通的最大总权值,则dp(u,m)=max( ...
- AJAX保留浏览历史的解决方案——hashchange()
在ajax请求中,不能更新地址栏,地址栏上的“前进”和“后退”按钮就失效了,带来了另外一种糟糕的用户体验. 解决方案如下: 方案一:使用window. Onhashchange 事件 如下面Html片 ...
- js获取客户端操作系统
function detectOS() { var sUserAgent = navigator.userAgent; var isWin = (navigator.platform == " ...
- [原创]cocos2d-x研习录—前言
我认为很多开发者面对层出不穷的新技术.新思想和新理念,最为之苦恼的是找不到行之有效的学习方法,对于知识的本质缺乏认识,虽阅读了大量教材,却无法将其融入自己的知识体系,并搭建自己的知识树.不可否认,教材 ...
- X64相关文章
http://www.codemachine.com/article_x64deepdive.html https://software.intel.com/sites/default/files/m ...
- 在js自定义函数中使用$(event.target)代替$(this)
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...