现在的位置: 首页 > 综合 > 正文

网站与论坛在会员注册,登陆,退出,会员资料修改上的同步【转】

2012年10月13日 ⁄ 综合 ⁄ 共 6294字 ⁄ 字号 评论关闭

出自:http://nt.discuz.net/showtopic.aspx?topicid=53983

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

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:增加触发器,保持会员信息的同步,首先得在自己的会员表信息增加触发器,

然后在论坛上dnt_users,dnt_userfields分别增加触发器,

由于不同的用户表的设计不一样,我只把网站增加会员的触发器发出来,供参考 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:由于是跨域验证,先在论坛后台设置如下:

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值,重设下论坛的状态。哈哈,经过上面的过程,相信聪明的你也会整合拉。初次写技术文章,有好多疏漏,希望指点。有什么问题可以和我联系,。QQ:312718144

 

 

=================================================

其它:

1。分析bbs系统的用户表结构,然后当网站用户注册的同时,把相应数据在bbs的用户表里面再插一遍。

2。同时在用户登录后,也要给bbs的session赋值,实现一个地方登录,全站浏览

3。在用户登录bbs后,也要给网站的session赋值,实现一个地方登录,全站浏览

抱歉!评论已关闭.