网站和Discuz的整合
1、通过导入程序,将网站会员表导入到论坛会员表中
a) 读出网站会员表中UserName, Password, Email字段的全部数据
b) 将已经加过密的password字段再加上论坛的加密方法。
string newPass = Discuz.Common.Utils.MD5(password) ;
c) 将改好的数据更新到论坛表中,完成数据的整合。
2、论坛登录类
using Discuz.Common;
using Discuz.Forum;
using Discuz.Config;
using Discuz.Entity;
using Discuz.Toolkit;
public class DNT
{
/// <summary>
/// 论坛登录
/// </summary>
public static void Login(string username, string password, bool isMd5)
{
//是否需要论坛MD5加密
string forumMd5Pwd = "";
if (!isMd5)
{
forumMd5Pwd = Discuz.Common.Utils.MD5(password);
}
else
{
forumMd5Pwd = password;
}
//论坛登录
Discuz.Config.GeneralConfigInfo cfg= Discuz.Config.GeneralConfigs.GetConfig();
Discuz.Entity.OnlineUserInfo oluserinfo = Discuz.Forum.OnlineUsers.UpdateInfo(cfg.Passwordkey, cfg.Onlinetimeout);
int olid = oluserinfo.Olid;
int uid = Discuz.Forum.Users.CheckPassword(username, forumMd5Pwd , isMd5);
Discuz.Forum.ForumUtils.WriteCookie("userid", uid.ToString());
if (uid != -1)
{
ShortUserInfo forumUser = Discuz.Forum.Users.GetShortUserInfo(uid);
//删除之前的错误登录信息
Discuz.Forum.LoginLogs.DeleteLoginLog(DNTRequest.GetIP());
//根据积分公式刷新用户总积分
Discuz.Forum.UserCredits.UpdateUserCredits(uid);
//写入Discuz登陆后要用的cookie值
Discuz.Forum.ForumUtils.WriteUserCookie(uid, Utils.StrToInt(DNTRequest.GetString("expires"), -1), cfg.Passwordkey, DNTRequest.GetInt("templateid", 0), DNTRequest.GetInt("loginmode", -1));
//更新用户最后动作,如不需要可不执行
Discuz.Forum.OnlineUsers.UpdateAction(olid, UserAction.Login.ActionID, 0, cfg.Onlinetimeout);
//更新该用户最后访问时间
Discuz.Forum.Users.UpdateUserCreditsAndVisit(uid, DNTRequest.GetIP());
}
}
/// <summary>
/// 论坛登出
/// </summary>
public static void Logout()
{
string sUid = Discuz.Forum.ForumUtils.GetCookie("userid");
if (!String.IsNullOrEmpty(sUid))
{
int uid = Convert.ToInt32(sUid);
Discuz.Config.GeneralConfigInfo _cfg = Discuz.Config.GeneralConfigs.GetConfig();
Discuz.Entity.OnlineUserInfo oluserinfo = Discuz.Forum.OnlineUsers.UpdateInfo(_cfg.Passwordkey, _cfg.Onlinetimeout);
int olid = oluserinfo.Olid;
Discuz.Forum.OnlineUsers.UpdateOnlineTime(_cfg.Oltimespan, uid);
Discuz.Forum.OnlineUsers.DeleteRows(olid);
ForumUtils.ClearUserCookie();
ForumUtils.WriteCookie("userid", "");
}
}
/// <summary>
/// 论坛会员注册
/// </summary>
public static int Register(string username, string password, string email)
{
string forumMd5Pwd = Discuz.Common.Utils.MD5(password);
string apikey = System.Configuration.ConfigurationManager.AppSettings["DNT_APIKey"].ToString();
string secret = System.Configuration.ConfigurationManager.AppSettings["DNT_Secert"].ToString();
string forumUrl = System.Configuration.ConfigurationManager.AppSettings["DNT_Url"].ToString();
DiscuzSession ds = new DiscuzSession(apikey, secret, forumUrl);
int uid = ds.Register(username, forumMd5Pwd, email, true);
return uid;
}
/// <summary>
/// 修改密码
/// </summary>
public static bool ChangePassword(int uid, string password)
{
return Discuz.Forum.Users.UpdateUserPassword(uid, password , true);
}
}
----------------- 网站文件修改 ----------------------
3、在网站登录时,网站登录成功后,再加上论坛的登录
using Discuz.Common;
using Discuz.Forum;
using Discuz.Config;
using Discuz.Entity;
using Discuz.Data;
public bool Login(string userName, string password)
{
//网站登录时对password进行MD5加密
string webMd5Pwd = UserLoginM.HashCryptString(password+ "abcd#$%^xyz&$123", "MD5");
...... ...... //网站登录过程略
//网站登录成功后取出UserId的值,并设置登录状态Session值
HttpContext.Current.Session["UserId"] = dt.Rows[0]["UserId"].ToString();
HttpContext.Current.Session["UserName"] = userName;
//论坛登录
DNT.Login(userName, webMd5Pwd , true);
}
4、在网站登出时,加上论坛的登出。
public volid LoginOut()
{
Session.Abandon();
DNT.Logout();
}
5、整合网站会员注册系统与论坛统一,网站注册成功后,加入用户数据到论坛。
public void Regist()
{
... 网站注册成功...
//注册论坛用户
DNT.Register(userNmae, password, email);
}
-------------- 论坛文件修改 ------------
6、在_login.htm登录控件模版中添加登录转向的代码,确保论坛和网站的状态一致
<%csharp%>
if(Request["api_key"]==null&&Request.Form["username"]!="admin")
{
Response.Redirect("/member/userlogin.aspx");
}
<%/csharp%>
并在login.htm论坛登录模版中添加代码:
<%csharp%>
if(Request.QueryString["sys"]==null)
{
Response.Redirect("/member/userlogin.aspx");
}
<%/csharp%>
将admin和导入用户的登录口分开,论坛高级管理员登陆时打入:
/fourm/login.aspx?sys=1&reurl=/forum/login.aspx 进行管理登录
也可以在网站的某个地方加一个管理员连接,连接地址为:/forum/login.aspx?sys=1&reurl=/forum/index.aspx
还要修改本页的“会员注册”连接:
<a href="{rooturl}register.aspx?sys=1&reurl=/forum/index.aspx" >立即注册</a>
另外,还要改下登录错误时的连接 _errmsgbox.htm模版
<a href="forumindex.aspx">论坛首页</a>
<%if {usergroupid}==7%>
|
<a href="/forum/login.aspx?sys=1&reurl=/forum/login.aspx">登录</a> |
<a href="/forum/register.aspx?sys=1&reurl=/forum/login.aspx">注册</a>
<%/if%>
7、在logout.htm论坛登出模版中添加以下代码
<%csharp%>
Session.Abandon();
DNT.Logout();
Response.Redirect("/forum/forumindex.aspx");
<%/csharp%>
8、在register.htm会员注册模版中添加:
<%csharp%>
//会员注册只对公司内部管理人员开放
if (Request.QueryString["sys"] == null)
{
Response.Redirect("/member/join.html")
}
<%/csharp%>
9、在usercpnewpassword.htm修改密码模版中添加:
<%csharp%>
string sUid = Discuz.Forum.ForumUtils.GetCookie("userid");
if (!String.IsNullOrEmpty(sUid))
{
//根据UID获取用户的adminid
int uid = int.Parse(sUid);
Discuz.Entity.UserInfo uInfo = Discuz.Forum.Users.GetUserInfo(uid);
int adminId = uInfo.Adminid;
//不是管理员,转入网站后台修改密码,论坛的密码修改只对管理员开放
if(adminId <1)
{
Response.Redirect("/Member/Company_PassWord.aspx");
}
}
else
{
System.Web.HttpContext.Current.Session.Abandon();
HRb2b_Web.DNT.Logout();
Response.Redirect("/forum/forumindex.aspx");
}
<%/csharp%>
另外在修改密码的网站后台文件中,要同时修改论坛用户的密码。
DNT.ChangePassword(uid, newMD5Password);
----------------------
另外在修改模版时,要注意一个小细节:
在Discuz模版文件中 <%if {userid}==-1%> 和 <%if {userid}== -1%> 是不一样的。
多一个空格就会造成编译错误!