社区动力的一站式登陆

     现在大多数网站都有自己的论坛,基本上的就是动网和社区动力,他们都是可以使用一站式登陆.最近做了2个网站,都是使用社区动力作为自己的论坛,一站式登陆的.有点体会,拿出来侃侃~~~~~~~~~~~
    我采用的社区动力asp.net版本的.采用md5加密的.对于一站式登陆,数据库有2份,一份是网站的数据库,一份是论坛的数据库,所以无论是在论坛上注册还是在网站上注册,都是必须在网站的数据库和论坛的数据库插入一条记录的.登陆也一样,无论是在论坛上登陆,还是在网站上登陆都是要完成一个工作的,就是在一个地方等论,2个地方都应该已经变成登陆状态了.
      现在开始解决上面2个问题.
      我们都知道,社区动力的注册是通过调用一个存储过程dnt_createuser建立一个新用户的.bbs的用户表dnt_users的id号是自增的.我们现在的任务是我们自己来调用这个存储过程来为bbs建立新用户.网站自己会有一张注册页面的,也许风格和bbs的不同,所以你也可以再建立一张页面,来与bbs的风格相同,就是bbs的注册就在那种页面,而网站的注册就调用网站的注册页面..这个只是风格的问题,而后台的处理都是一样的,就是往网站和bbs的数据库中插入一条记录.如何设计网站的用户表,最好是考虑论坛和自己的网站双方面需要,这样比较好.当我们填完资料并且点击注册时候,触发的事件就是完成上面2个动作.
      第1步骤,最好先注册到网站的数据库中去,然后返回id号;当然也可以先注册到bbs的数据库.所以这里有2个数据库的操作,你的web.config就是2个连接数据库的字符串这里面有个约束,bbs的登陆要用到用户的id号,所以2个数据库中的用户表的id号是必须相对应的.所以后注册的那个数据库的表的id号是根据第一个表的id号来生成的.我采用的是先注册到网站的.所以要修改bbs的数据库中的表和存储过程.

主要修改如下:

我添加了一个参数@userid,就是给id号赋值的.


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(@userid,@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)
SELECT SCOPE_IDENTITY()  AS 'userid'
SET @uid = SCOPE_IDENTITY()

IF @@ERROR=0
    
BEGIN
        
UPDATE [dnt_statistics] SET [totalusers]=[totalusers] + 1,[lastusername]=@username,[lastuserid]=@userid
    
END

INSERT INTO dnt_userfields 
    (
[uid],[website],[icq],[qq],[yahoo],[msn],[skype],[location],[customstatus],[avatar],[avatarwidth],[avatarheight],[medals],[bio],[signature],[sightml],[authstr])
VALUES
    (
@userid,@website,@icq,@qq,@yahoo,@msn,@skype,@location,@customstatus,@avatar,@avatarwidth,@avatarheight,@medals,@bio,@signature,@sightml,@authstr)

在第一个insert语句中加入[uid]和@userid
在update语句中修改成了[lastuserid]=@userid
在最下面的insert语句修改了value下面的@userid
最后把用户表的自增去掉就好了.
比较简单.
现在前期工作都做好了,现在点击注册,调用web.config里面的网站的数据库链接字符串,把用户信息写入到数据库中去,并返回相应的id号.然后再到web.config取bbs的链接字符串,,把用户信息和刚才返回的id号传给存储过程dnt_createuser,执行存储过程.这样就完成注册了.

下面开始解决登陆问题
      登陆象上面也可以有2张页面,就是风格问题,不说了.现在主要关心后台的问题了.当输入用户名密码登陆成功后,登陆时我是先调用网站的数据库进行验证的.登陆成功后,网站的已经登陆了,那么bbs怎么登陆的.社区动力提供的登陆语句如下:
      

ForumUtils.WriteUserCookie ( System.Int32 uid , System.Int32 expires , System.String passwordkey )

 

OnlineUserFactory.UpdateAction(1, Discuz.Forum.UserAction.Login.ActionID, 0);

第一条语句的第1个参数是用户的id号,第二个是session保存时间,第3个可以在论坛的配置文件general.config中找到.所以我们要把用户登陆后的id号传到bbs上才可以登陆,所以我们要自己新建一个项目.用来接受id号并且使用这段代码来登陆论坛.
      
上面的是我的项目:
说明一下:
         login.aspx,register.aspx,usercpnewpassword.aspx是用来覆盖论坛login.aspx,register.aspx,usercpnewpassword.aspx的的,并且转向你们定义的各自登陆页面和注册页面.
         SetSession.aspx是用来接受id号执行登陆的.
         我们的网站上都是有链接到论坛的.所以我们应该在这些链接到论坛上的都应该先链接到setsession.aspx然后判断是否是已经登陆了.就是setsession.aspx作为中转页面的.
         最后我们把这个项目的dll放到bbs的bin目录下,把aspx页面放到bbs的aspx目录下子目录1的下面.覆盖bbs的aspx页面.
         这样就可以了,,因为水平有限和时间参促.写的不怎么好,权当抛砖引玉吧!!!!!!!!!!!!!!!!!

posted @ 2007-03-10 15:46  荒芜  阅读(2482)  评论(3编辑  收藏  举报