[DiscuzNt]整合DiscuzNt论坛目前所发现的小BUG及个人简单解决办法
???? 前段時間因為公司項目需要,需要在網站中整合BBS論壇,主要實現會員信息同步,經過目前市面上開源的BBS項目,最終認為還是DiscuzNt比較好,原因有以下幾點:
1、符合國人習慣,DiscuzNt是由PHP版的Discuz演化而來,市場占有率比較高,而且比較符合國人的習慣。
2、采用.NET語言編寫,源碼看起來不會因為跨語言而導致問題。
3、有官方支持,市面上的.NET語言編寫BBS論壇能比的上DiscuzNt還真的不多,官方會經常發布維護版及升級版,會根據廣大站長的需求進行版本升級,所以這點很重要。
在選擇完了需要整合的論壇后,就開始查看其源代碼,然后找資料,看看如何進行整合,不過由于本篇文章并不是介紹如何整合DiscuzNt,所以如果想了解整合DiscuzNt的朋友可以去官方論壇:DiscuzNt進行查詢。
今天主要介紹的還是在這次的項目整合過程中發現的問題及個人的簡單解決辦法。
首先聲明下,我整合的DiscuzNt是3.1的版本,是2010年3月16號發布的版本,并不一定適用于最新的版本。
?
一、使用第三方加密的后遺癥
這次的項目中會員密碼加密方式采用的是公司一直沿用的加密方式,和DiscuzNt默認的自帶方式不一樣,所以第一反應還是修改DiscuzNt中的加密方式,本來以為會很麻煩,后來看了一下DiscuzNt的源碼,發現其實很方便,只需要2步:
1、修改Discuz.Plugin.PasswordMode(第三方加密模式)中ThirdPartMode.cs,這個類是DiscuzNt為需要擴展開發需求的開發者預留的擴展插件接口,需要實現自定義加密方式的開發者只需修改這個類中的3個與密碼相關的方法中的密碼加密:CheckPwd、CreateUserInfo、SaveUserInfo。
2、修改Discuz.Web項目下Config目錄下的general.config配置文件中的Passwordmode為2。
本來以為修改好了就OK了,心中還在竊喜,真簡單,結果沒相當問題就來了:
?
在DiscuzNt論壇中,為了方便網友上傳文件采用的silverlight進行批量上傳附件,但是我修改了加密方式后點擊批量上傳總是會提示我:“當前用戶信息無效,請嘗試刷新頁面”,于是我就去查看silverlight上傳的源碼及老代寫的這篇文章:DiscuzNT使用Silverlight進行多文件上傳,發現報出這個問題是在Discuz.Web.Services.MixObjects.cs中的:
/// <summary> /// WEB權限認證 /// </summary> /// <param name="creinfo">認證信息</param> /// <returns>是否通過驗正</returns> private bool AuthenticateUser(CredentialInfo creinfo) {if (creinfo.ForumID > 0){int olid = Discuz.Forum.OnlineUsers.GetOlidByUid(creinfo.UserID);if (olid > 0){OnlineUserInfo oluserinfo = Discuz.Forum.OnlineUsers.GetOnlineUser(olid);if (oluserinfo.Userid == creinfo.UserID && Utils.UrlEncode(Discuz.Forum.ForumUtils.SetCookiePassword(oluserinfo.Password.Trim(), GeneralConfigs.GetConfig().Passwordkey)) == creinfo.Password &&//檢測用戶id和口令creinfo.AuthToken == DES.Encode(string.Format("{0},{1}", oluserinfo.Olid.ToString(), oluserinfo.Username.ToString()), oluserinfo.Password.Substring(0, 10)).Replace("+", "["))//檢查認證信息{return true;}}}return false; }這段代碼主要是對當前要進行上傳的用戶進行驗證,本來如果不對加密方式進行修改是不會進行出現這個問題,所以我單步調試了下代碼,果然發現問題:
Utils.UrlEncode(Discuz.Forum.ForumUtils.SetCookiePassword(oluserinfo.Password.Trim(), GeneralConfigs.GetConfig().Passwordkey))
主要還是這句代碼中的的oluserinfo.Password,由于我的加密方式生成的字符串長度相比discuznt的長度要短,所以后面會多出許多空格,然后再經過Utils.UrlEncode進行過URL編碼后,就會多出許多無用的字符所以導致了用戶信息驗證失敗。
找到問題修改起來就方便許多了,只需加上Trim()方法,將多余的空格清除掉就OK了。
?
二、多次引用導致引用內容被截斷
這個問題是在上線后發現的,在會員發帖的時候,如果多次引用了前面的內容會出現內容,如下圖:
?
可以看到在引用的內容明顯可以發現內容被截斷了,而且由于截斷了導致后面應該是鏈接的UBB標簽顯示了出來,當然如果再次引用這個帖子會導致內容變的更加亂,所以得想辦法解決,查看一下源碼,在Discuz.Web項目下的Aspx/1目錄下的postreply.aspx.cs類中的606行:
message = "[quote] 原帖由 [b]" + postinfo.Poster + "[/b] 于 " + postinfo.Postdatetime + " 發表\r\n" + UBB.ClearAttachUBB(Utils.GetSubString(postinfo.Message, 200, "......")) + " [/quote]";這句代碼是用來拼接引用的內容,但是由于頁面整體的考慮采用了截取:Utils.GetSubString(postinfo.Message, 200,”……”),截取前200個字符的內容,這樣就導致了截取的過程中把UBB標簽也一起給截斷了。
所以解決方法也很簡單,只要把這個截斷去除就OK了:
message = "[quote]" + postinfo.Message + "\r\n [color=#999999]" + postinfo.Poster + " 發表于 " + postinfo.Postdatetime + "[/color][url=" + DNTRequest.GetUrlReferrer() + "#" + postid + "][img]" + Utils.GetRootUrl(forumpath) + "images/common/back.gif[/img][/url][/size][/quote]";?
三、帖子名稱修改后,在論壇首頁的最新帖子名稱未修改
這個問題也是在使用中發生的,原因就是帖子名起錯了,后來修改了,但是回到論壇首頁看發現板塊中最新的帖子還是原來的名字,本來以為是緩存的,可是等了1天名字竟然還是原來的,所以繼續查源碼
在Discuz.Web項目的Aspx/1目錄下的forumindex.aspx,可以看到每個板塊下的最新帖子標題lasttitle及所鏈接的帖子ID都是從板塊的實體信息中獲取,到數據庫中對應的表dnt_forums中可以找個字段lasttitle和,所以可以認定論壇首頁的板塊列表的所有信息都來自于dnt_forums。
接著查看編輯帖子頁面EditPost.aspx的源碼,找到編輯帖子按鈕的操作,可以發現其最終是調用數據庫中的存儲過程:dnt_updatepost1:
CREATE PROCEDURE dnt_updatepost1@pid int,@title nvarchar(160),@message ntext,@lastedit nvarchar(50),@invisible int,@usesig int,@htmlon int,@smileyoff int,@bbcodeoff int,@parseurloff int AS UPDATE dnt_posts1 SET [title]=@title,[message]=@message,[lastedit]=@lastedit,[invisible]=@invisible,[usesig]=@usesig,[htmlon]=@htmlon,[smileyoff]=@smileyoff,[bbcodeoff]=@bbcodeoff,[parseurloff]=@parseurloff WHERE [pid]=@pid可以看到,這個存儲過程僅僅是更新了帖子信息,并沒有更新帖子所屬板塊的信息,所以我們只需要在這邊進行簡單修改既可:
declare @fid int,@tid int,@topictitle nvarchar(60) --查詢帖子所在板塊及帖子的標題 select @fid=a.fid,@tid=a.tid,@topictitle=b.title from dnt_posts1 a inner join dnt_topics b on b.tid=a.tid where [pid]=@pid --若最后回復的帖子是當前編輯的帖子則更新其最后回復帖子的標題 UPDATE dnt_forums set [lasttitle]=@topictitle where fid=@fid and lasttid=@tid在這個存儲過程的后面繼續添加上面一段代碼既可。
不過其實還有個不是辦法的辦法,就是在這個帖子名字改過后,再回個帖,這樣帖子的名字就會更新成最新的了。
?
四、后臺幫助管理列表的除數據后未重新綁定
這個問題是在維護論壇幫助的時候發現的,由于discuzNT默認已經幫我們維護好了許多常見的幫助,但是有些幫助在實際運用的過程中并沒有用,所以就想在后臺刪除掉,于是后臺人員就將無用的幫助刪除了,但是刪除后列表里還是原來那么多條數據,剛剛刪除的竟然還在列表中,于是我去數據庫查看了一下幫助表,發現數據庫中數據已經被刪除了,說明刪除功能沒問題,問題出在了刪除后的重新綁定上,我看了一下源碼在Discuz.Web.Admin項目下的global目錄下的global_helplist.aspx頁面中綁定列表的代碼如下:
helpInfoList = Helps.GetHelpList();
可以看出列表數據是通過調用Helps類下的GetHelpList方法,看下具體的代碼:
/// <summary> /// 幫助信息樹形列表 /// </summary> private static List<HelpInfo> helpListTree = null; /// <summary> /// 獲取幫助列表 /// </summary> /// <returns>幫助列表</returns> public static List<HelpInfo> GetHelpList() {//if (helpListTree == null)//{helpListTree = new List<HelpInfo>();List<HelpInfo> helpList = Discuz.Data.Help.GetHelpList();CreateHelpTree(helpList, 0);// }return helpListTree; }這個GetHelpList方法是靜態的,并且其返回列表樹helpListTree也是靜態的,在方法體內判斷helpListTree是否為空,則進行創建,不為空就直接返回列表,但是由于這個列表是靜態的,所以在實際運行過程中,這個helpListTree一直不為空,所以我這邊將判斷是否為空給注釋掉了,表示每次都重新獲取,這樣列表數據就更新了。
?
以上就是本篇文章的全部內容了,這些都是我在整合過程中發現的問題,不過都是些小BUG,自己花了點時間就能解決。
PS:1、本文并沒有說DiscuzNT不好,只是將現有的DiscuzNt的小BUG提出來,所以請勿以此為由進行評論。
2、可能這些解決方法不是最好的,也可能還有問題,不過目前沒發現,如果你有更好的建議歡迎評論,謝謝!
總結
以上是生活随笔為你收集整理的[DiscuzNt]整合DiscuzNt论坛目前所发现的小BUG及个人简单解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle实例无法启动也无法关闭
- 下一篇: 田志刚:为什么要尊重老师?