1:网站和论坛的数据库不一样(网站是dujia数据库www.,论坛是bbs数据库bbs.),而且会员信息表字段也不一样,所以要保持会员在网站和论坛上的同步登陆,退出,和注册,并且资料修改也需要同步确实是一个难题。
2:考虑到以后公司不用这个论坛了,得很容易地分离网站和论坛。不能做很大修改。
通过学习社区动力的相关资料,确定如下的解决方案,并且测试成功(),^_^,兴奋之余,也写出来和大家一起分享。
一、数据库的整合,主要利用触发器技术实现两个数据库之间的会员表信息修改、添加、删除的同步,其中网站会员表:HotelUser;论坛相关的会员数据表有:dnt_users,dnt_userfields,dnt_statistics。论坛相关的数据表的作用可参考论坛官方网站说明,主要步骤如下:
1:修改dnt_users的数据设计,把uid的标识规范修改为否。如下图

01.gif (28.12 K)
2008-8-13 13:39:23
2:修改存储过程dnt_createuser。修改为(主要是修改udid的值)
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
。。。。中间的不变,节约篇幅。。。
AS
DECLARE @uid int
select @uid=max(UserId)+1 from dujia.[dbo].[HotelUser]
INSERT INTO [dnt_users]([uid],[username],[nickname], [password], [secques], [gender], [adminid], [groupid], [groupexpiry], [extgroupids], [regip], [joindate], [lastip], [lastvisit], [lastactivity], [lastpost], [lastpostid], [lastposttitle], [posts], [digestposts], [oltime], [pageviews], [credits], [extcredits1], [extcredits2], [extcredits3], [extcredits4], [extcredits5], [extcredits6], [extcredits7], [extcredits8], [avatarshowid], [email], [bday], [sigstatus], [tpp], [ppp], [templateid], [pmsound], [showemail], [newsletter], [invisible], [newpm], [accessmasks]) VALUES(@uid,@username,@nickname, @password, @secques, @gender, @adminid, @groupid, @groupexpiry, @extgroupids, @regip, @joindate, @lastip, @lastvisit, @lastactivity, @lastpost, @lastpostid, @lastposttitle, @posts, @digestposts, @oltime, @pageviews, @credits, @extcredits1, @extcredits2, @extcredits3, @extcredits4, @extcredits5, @extcredits6, @extcredits7, @extcredits8, @avatarshowid, @email, @bday, @sigstatus, @tpp, @ppp, @templateid, @pmsound, @showemail, @newsletter, @invisible, @newpm, @accessmasks)
IF @@ERROR=0
BEGIN
UPDATE [dnt_statistics] SET [totalusers]=[totalusers] + 1,[lastusername]=@username,[lastuserid]=@uid
END
INSERT INTO dnt_userfields
([uid],[website],[icq],[qq],[yahoo],[msn],[skype],[location],[customstatus],[avatar],[avatarwidth],[avatarheight],[medals],[bio],[signature],[sightml],[authstr],[realname],[idcard],[mobile],[phone])
VALUES
(@uid,@website,@icq,@qq,@yahoo,@msn,@skype,@location,@customstatus,@avatar,@avatarwidth,@avatarheight,@medals,@bio,@signature,@sightml,@authstr,@realname,@idcard,@mobile,@phone)
3:增加触发器,保持会员信息的同步,首先得在自己的会员表信息增加触发器,

02.gif (11.21 K)
2008-8-13 13:39:23
然后在论坛上dnt_users,dnt_userfields分别增加触发器,

03.gif (11.60 K)
2008-8-13 13:39:23

04.gif (10.11 K)
2008-8-13 13:39:23
由于不同的用户表的设计不一样,我只把网站增加会员的触发器发出来,供参考
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[user_insert] on [dbo].[HotelUser]
for Insert
as
---使论坛中的触发器暂时失效
ALTER table bbs.[dbo].[dnt_users] DISABLE TRIGGER dnt_users_insert
---取得插入用户数据的ID和用户名
Declare @uid int
select @uid=max(UserID) from HotelUser
declare @username nchar(20)
select @username=UserName from HotelUser
---插入论坛用户基本数据
insert into bbs.[dbo].[dnt_users]([uid],[username],[password],[gender],[email])
select HotelUser.UserID,i.UserName,i.UserPassword,
case i.UserSex
when 'f' then 2
when 'm' then 1
when 's' then 0
end
,i.UserEmail from inserted as i inner join HotelUser on HotelUser.UserName=i.UserName
--用户身份变成注册会员
update bbs.[dbo].[dnt_users] set [groupid]=10 where uid=@uid
---插入论坛用户详细数据
INSERT INTO bbs.[dbo].dnt_userfields
([uid],[qq],[msn],[location],[realname],[idcard],[mobile],[phone])
select HotelUser.UserID,i.UserQQ,i.UserMSN,i.UserAddress,i.UserRealName,i.UserIdCard,i.UserMobile,i.UserTel
from inserted as i inner join HotelUser on HotelUser.UserName=i.UserName
---修改论坛状态
UPDATE bbs.[dbo].[dnt_statistics] SET [totalusers]=[totalusers] + 1,[lastusername]=@username,[lastuserid]=@uid
---使论坛中的触发器生效
ALTER table bbs.[dbo].[dnt_users] ENABLE TRIGGER dnt_users_insert
---发放积分
insert into dujia.[dbo].[HotelUserPoint](PointAction,PointChange,PointUser) values('注册会员',500,@uid)
经过上面的三步,数据的整合已经完成,会员的信息可以保持同步修改,删除,增加,哈哈。一大功劳吧。下面主要是程序上的整合。
二、程序上的整合:程序上的整合主要依据了论坛的登陆,判断是否登陆,退出的原理。论坛的登陆采用了自己的cookies 验证。对密码的加密先md5加密.然后采用DES加密,其中加密密钥是在论坛安装时随机生成给每位用户的,该加密密钥在文件general.config里面. <Passwordkey>AAAAAAAAAA</Passwordkey>.这样其实保证了用户密码的安全性。
废话不多说,现在就开始程序上的整合。
1:由于是跨域验证,先在论坛后台设置如下:

05.gif (3.52 K)
2008-8-13 13:39:23
2:从论坛的DES加密文件中提取自己所需要的 DES加密函数
namespace dujia.DBUtility
{
///论坛加密算法
public class dntDES
{
//默认密钥向量
private static byte[] Keys = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
/// <summary>
/// DES加密字符串
/// </summary>
/// <param name="encryptString">待加密的字符串</param>
/// <param name="encryptKey">加密密钥,要求为8位</param>
/// <returns>加密成功返回加密后的字符串,失败返回源串</returns>
public static string Encode(string encryptString, string encryptKey)
{
encryptKey = "你论坛加密密钥";
encryptKey = GetSubString(encryptKey, 8, "");
encryptKey = encryptKey.PadRight(8, ' ');
byte[] rgbKey = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8));
byte[] rgbIV = Keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
}
3:会员登陆,先在网站的数据库验证用户的合法性,再写模仿论坛写cookies
if (bllHotelUser.checkUserLogin(userLogin, md5Password, out userId))//网站用户验证
{
string dntPassword = HttpUtility.UrlEncode(dujia.DBUtility.dntDES.Encode(md5Password, ""));
HttpCookie cookie = new HttpCookie("dnt");
cookie.Values["userid"] = userId.ToString();
cookie.Values["password"] = dntPassword;
cookie.Values["tpp"] = "0";
cookie.Values["ppp"] = "0";
cookie.Values["pmsound"] = "0";
cookie.Values["invisible"] = "0";
cookie.Values["referer"] = "index.aspx";
cookie.Values["sigstatus"] = "0";
cookie.Values["expires"] = "100";
cookie.Expires = DateTime.Now.AddMinutes(10);
cookie.Domain = ".dujia168.com";
Response.AppendCookie(cookie);
Response.Redirect("/account/index.aspx");
}
else
{
LTP.Common.MessageBox.Show(this, "用户名或者密码错误,请核对之后再登陆!!");
}
这样网站登陆之后。论坛也就同时登陆了。
4:网站的登陆验证,这个过程主要是读取cookies存储的用户id和密码信息。然后从网站数据库提取的数据做比较。一致则用户是登陆状态,这步就保证了用户从论坛或者网站登陆时,网站能判断用户的登陆状态。
5:网站用户退出。主要是清除cookies值,重设下论坛的状态。