网站整合discuz!nt论坛 -从论坛同步到网站的应用-同步注册/登录/退出/修改

分类:性能优化_架构设计| 发布:camnprbubuol| 查看: | 发表时间:2011/5/4

 

在网上参考了很多资料后,终于完美实现了网站和discuz!nt论坛的双向整合,整合后网站和论坛之间可以同步注册、登录、退出和修改登录密码操作。

本系统的实现形式是新云CMS网站(ASP)和Discuz!NT3.1论坛(ASP.NET)的同步,使用的API(应用程序编程接口)是新云CMS提供的api(做较大修改)和Discuz!NT提供的API(不做修改)。API使用REST形式的接口,这就意味着Discuz!NT API方法可以用HTTP GET 或 POST方式来调用,几乎每一种计算机语言都可以通过HTTP来与REST服务器进行通讯,REST Server的地址是 [论坛地址/services/restserver.aspx]

如果主网站是ASP.NET做的,参考本文方法也能轻松实现ASP.NET网站和Discuz!NT论坛的同步。

第一节 从网站同步到论坛的实现

主要功能:

用户在网站注册会员、登录、注销或修改登录密码后,将相关数据以HTTP方式传递到论坛API中,然后论坛执行相应的操作与网站同步(反过来的操作在第二节)。

实现步骤:

一、在论坛后台“扩展”项的“通行证设置”中添加整合程序设置,可参考http://nt.discuz.net/showtopic-62656.html

二、在论坛后台“全局”项的“基本设置”-“身份验证Cookie域”中设置域名。

三、添加实现同步的代码。

md5_utf8文件:md5的UTF-8版本加密函数,这个网上很多,注意生成的是32为的MD5密码

RestClient.asp文件:

该文件详细代码见:http://www.cnblogs.com/glaivelee/archive/2010/09/13/1824674.html

api_bbs.asp文件:

该文件详细代码见:http://www.cnblogs.com/glaivelee/archive/2010/09/13/1824674.html

最后在网站相关的代码文件中加入如下代码即可:

’同步注册论坛会员 rabtor2010-9-7添加
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=register&username="&Server.URLEncode(strUserName)&"&password="&Server.URLEncode(UserPassWord)&"&email="&Server.URLEncode(usermail)&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")

’同步登录论坛
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=login&username="&Server.URLEncode(username)&"&password="&Server.URLEncode(Request("password"))&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")

’同步退出论坛
’response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=logout&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")

’同步更新论坛用户的密码
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=updatepwd&username="&Server.URLEncode(username)&"&password="&Server.URLEncode(Trim(Request.Form("password")))&"&password1="&Server.URLEncode(Trim(Request.Form("password1")))&"&password2="&Server.URLEncode(Trim(Request.Form("password2")))&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")

第二节 从论坛同步到网站的应用

主要步骤:

一、开启Discuz!NT论坛的“同步数据模式”功能

在Discuz!NT论坛的后台“扩展”菜单项里单击[通行证设置],设置如下:

应用程序类型:web

应用程序:Url 地址:http://www.Discuz!NT.com/bbs/services/restserver.aspx

同步数据模式:开启

同步数据的 URL 地址:http://www.Discuz!NT.com/api/api_reponse.asp

(红色网址部分改成你自己的)。

操作界面图:

二、编写处理同步数据文件

这里以asp网站程序为例,其他语言与此类似。本系统中用到的处理论坛同步数据文件为改写新云CMS的api_reponse.asp以便与已有的asp网站整合。

api_reponse.asp主要代码部分:

(由于本系统要求会员注册比较严格,论坛的注册跳转至主网站的会员注册页面)

If Request.QueryString<>"" Then
    Act=Request.QueryString("action")
Select Case Act
   Case "login" ‘同步会员登录
    SaveUserCookie()
   Case "logout" ’同步会员退出
    LogoutUser()
   Case "updatepwd" ’同步更改会员修改密码
    UpdatePWD()
End Select
Else

Sub SaveUserCookie()
Dim S_syskey,Password,usercookies,TruePassWord,userclass,Userhidden
Dim sig

sig = Request.QueryString("sig")
UserName = Inen.CheckBadstr(Request.QueryString("user_name"))
usercookies = Request.QueryString("savecookie")

If UserName="" or sig="" Then Exit Sub
If usercookies="" or Not IsNumeric(usercookies) Then usercookies = 0

ChkUserLogin username,usercookies
End Sub

Function ChkUserLogin(username,usercookies)
ChkUserLogin = False
Dim Rs,SQL,Group_Setting

If Not IsObject(Conn) Then ConnectionDatabase
Set Rs = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM [IE_User] WHERE username=’" & UserName & "’"
Rs.Open SQL, Conn, 1, 3
If Not (Rs.BOF And Rs.EOF) Then
   If Rs("UserLock") <> 0 Then
    ChkUserLogin = False
    Exit Function
   End If
   Response.Cookies(Inen.Cookies_Name)("LastTimeDate") = Rs("LastTime")
   Response.Cookies(Inen.Cookies_Name)("LastTimeIP") = Rs("userlastip")
   Response.Cookies(Inen.Cookies_Name)("LastTime") = Rs("LastTime")
   Group_Setting=Split(Inen.UserGroupSetting(Rs("UserGrade")), "|||")
   If Rs("userpoint") < 0 Then
    Rs("userpoint") = CLng(Group_Setting(25))
   Else
    Rs("userpoint") = Rs("userpoint") + CLng(Group_Setting(25))
   End If
   If Rs("experience") < 0 Then
    Rs("experience") = CLng(Group_Setting(32))
   Else
    Rs("experience") = Rs("experience") + CLng(Group_Setting(32))
   End If
   If Rs("charm") < 0 Then
    Rs("charm") = CLng(Group_Setting(33))
   Else
    Rs("charm") = Rs("charm") + CLng(Group_Setting(33))
   End If
   Rs("LastTime") = Now()
   Rs("userlastip") = Inen.GetUserip
   Rs("UserLogin") = Rs("UserLogin") + 1
   Rs.Update
  
   Select Case usercookies
   Case 0
    Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
   Case 1
    Response.Cookies(Inen.Cookies_Name).Expires=Date+1
    Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
   Case 2
    Response.Cookies(Inen.Cookies_Name).Expires=Date+31
    Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
   Case 3
    Response.Cookies(Inen.Cookies_Name).Expires=Date+365
    Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
   End Select
   Response.Cookies(Inen.Cookies_Name).path = "/"
   Response.Cookies(Inen.Cookies_Name)("userid") = Rs("userid")
   Response.Cookies(Inen.Cookies_Name)("username") = Rs("username")
   Response.Cookies(Inen.Cookies_Name)("password") = Rs("password")
   Response.Cookies(Inen.Cookies_Name)("nickname") = Rs("nickname")
   Response.Cookies(Inen.Cookies_Name)("UserGrade") = Rs("UserGrade")
   Response.Cookies(Inen.Cookies_Name)("UserGroup") = Rs("UserGroup")
   Response.Cookies(Inen.Cookies_Name)("UserClass") = Rs("UserClass")
   Response.Cookies(Inen.Cookies_Name)("UserToday") = Rs("UserToday")
   ChkUserLogin = True
End If
Rs.Close
Set Rs = Nothing
End Function

Sub UpdatePWD()
Dim Rs,SQL
Dim UserName, UserPass
UserName = Inen.CheckBadstr(Request.QueryString("user_name"))
UserPass = mid(Inen.CheckBadstr(Request.QueryString("password")),9,16)
Status = 1

If UserName = "" or UserPass = "" Then Exit Sub
Set Rs = Server.CreateObject("Adodb.RecordSet")
SQL = "SELECT TOP 1 * FROM [IE_User] WHERE Username=’" & UserName & "’"
If Not IsObject(Conn) Then ConnectionDatabase
Rs.Open SQL,Conn,1,3
If Not Rs.Eof And Not Rs.Bof Then
   Rs("password") = UserPass
   Rs.update
   Status = 0
End If
Rs.Close
Set Rs = Nothing
If UserPass <> "" And Status = 0 Then
   Response.Cookies(Inen.Cookies_Name)("password") = UserPass
End If
End Sub


Sub LogoutUser()
Response.Cookies(Inen.Cookies_Name).path = "/"
Response.Cookies(Inen.Cookies_Name)("userid") = ""
Response.Cookies(Inen.Cookies_Name)("username") = ""
Response.Cookies(Inen.Cookies_Name)("password") = ""
Response.Cookies(Inen.Cookies_Name)("nickname") = ""
Response.Cookies(Inen.Cookies_Name)("UserGrade") = ""
Response.Cookies(Inen.Cookies_Name)("UserGroup") = ""
Response.Cookies(Inen.Cookies_Name)("UserClass") = ""
Response.Cookies(Inen.Cookies_Name)("UserToday") = ""
Response.Cookies(Inen.Cookies_Name)("usercookies") = ""
Response.Cookies(Inen.Cookies_Name)("LastTimeDate") = ""
Response.Cookies(Inen.Cookies_Name)("LastTimeIP") = ""
Response.Cookies(Inen.Cookies_Name)("LastTime") = ""
Response.Cookies(Inen.Cookies_Name) = ""
End Sub

 

在使用Discuz!NT 的ASP接口函数(API)-users_getid(user_name)文件时出现错误提示:未知方法或方法内部错误

需要修改Discuz.Data.SqlServer项目下UserManage.cs类文件中第2036行:

同样,该类文件中函数public IDataReader GetShortUserInfoToReader(int uid)、public IDataReader FindUserEmail(string email)和public IDataReader GetUserInfoByIP(string ip)都是类似的一样的错误

 

365据说看到好文章不转的人,服务器容易宕机
原创文章如转载,请注明:转载自郑州网建-前端开发 http://camnpr.com/
本文链接:http://camnpr.com/archives/286.html