日期:2012-11-15  浏览次数:21286 次

   最近又拜读了飞鸟的WWWBOARD 4大作,又有飞鸟的一些解释,比BOARD3好读多了,确实是个设计的挺优秀的PRG。我根据我的实际需要,写了一个简装版和一个全部版(内核可全是飞鸟的BOARD4),暂时还没UPLOAD,只是去掉了一些 If pwssys...,If winnt_chinese等。后来觉得飞鸟的程序有的地方可以改一下,现写出来,另加上一些BOARD4的我的心得,供喜欢BOARD4的朋友参考。不知对不对,请飞鸟指正。

飞鸟的BOARD主要在数据库结构,结构的说明飞鸟已经讲了,我不在叙述。
List.asp语句:
1、先取出根帖(字段Parentid=0),并将得到的记录集反序排列
Select announceid,boardid from announce Where boardid="&boardid&" and parentid=0 ORDER BY announceid DESC
2、利用Getrows从记录集中选出20条根帖,存入到rootid数组中。
3、选出rootid数组中的Announceid,形成如同(1,2,3,4,5,.....20)的格式,
    (飞鸟:有个判断语句:If Ubound(rootid)>1好象不要也可以吧)
4、因为每一组讨论的话题(根帖-父帖-子帖)它们都拥有一个相同的Rootid,Rootid之间的关系:
子帖(rootid)=父帖(rootid)=根帖的(rootid)=根帖的(announcdid),(这个在存储子帖时注意一下)明白这点很重要,所以飞鸟用:
select AnnounceID,parentID,child,boardID,userID,UserName,UserEmail,URL,URLTitle,URLPic,Topic,DateAndTime,hits,length,RootID,layer,orders from Announce  where BoardID="&cstr(boardID)&" and ( rootID in "&selStr& " ) ORDER BY rootID desc,orders "
将这20条根帖及其所有子帖一股脑儿的全带了出来,相同的Rootid靠Orders升序排序,
5、记住layer只是控制层的, eg:我给你写了一个回复帖,那么我就是你的子帖->layer+1,但还要把最新加入的帖子放在最上面显示,这就靠orders了,因为orders采用的是升序排列,那么就提取出父帖的rootid,orders 将同一组(rootid)且orders>父帖的orders的Orders值加+1,就可以实现了,只不过写的时候倒过写:
         conn.execute "update announce set orders=orders+1 where rootid="&cstr(RootID)&" and orders>"&cstr(iOrders)
         Orders=Orders+1
6、关于控制缩进的layer,那就用数值套进去算吧,马上就明白了。
7、飞鸟tree.inc有些变量没用上,删除吧!
8、飞鸟判断一个用户是否新用户,用了循环。我用:
        dim newuser,rs,SQL
        newuser=false
        Set rs=Server.CreateObject("ADODB.Recordset")
        SQL="Select * from user Where Ucase(username)='"&Ucase(username)&"'"
        rs.open SQL,connmdb,1,3
        If rs.eof then
            rs.addnew
                newuser=true
                rs("username")=username
                rs("userpassword")=userpassword
                rs.update
                If err then
                    founderr=true
                    message="对不起,操作数据库失败,请稍侯再试"
                    showmessage(message)
                Else
                    userid=rs("userid")
                End If
        Else
            If rs("userpassword")<>userpassword then
                founderr=tr