Re:未名帖子已读未读这个功能是怎么设计的

[复制链接]
查看11 | 回复0 | 2021-1-29 05:14:33 | 显示全部楼层 |阅读模式
zz
发信人:[email protected],原信区:BBSDev标题:剖析文章未读标志发信站:南京大学小百合站(MonJul2221:06:552002),站内信件
你说:系统怎么知道我读过哪些文章,没读过哪些文章?我来解释下吧:)
未读标识是这么控制的。代码主要在boards.c里面。最后几个函数brd_xxx。每个用户的未读标志存放在自己用户目录的.boardrc里面。.boardrc的格式是多个record,每个record先来一个BRC_STRLEN长度的字符串,存放版名。然后是一个char类型的数字,记录接下来有几个time_t类型的值。(记录的最大值BRC_MAXNUM缺省为60)接着就是多个time_t类型的值。
大家知道bbs每篇文章都是以时间为文件名,比如M.994224383.A就是说这篇文章是994224383时写的。(对于一切系统或者数据库系统的时间来说,都是以时间戳记录的,只是显示出来做了转化),所以如果你看过M.994224383.A这篇文章,系统把这篇文章的文件名994224383提取出来,把他插入到time_t类型的列表中,并且把char类型加1。.boardrc由大到小排列(使查找速度加快),如果超过BRC_MAXNUM,则替换掉时间最小的那篇文章。
程序判断未读是这样的,intbrc_unread(filename)传入filename,把filename提取出的994224383跟60个列表里面的所有值比较,注意列表是按大到小排列的,如果filename时间不等正在判断的值,比较下一个,如果大于正在判断的值,立刻返回未读,如果等于,立刻返回已读。如果都小于,则返回已读。(认真想想:))

这里顺便可以解答几个疑问:1)为什么有的板块改名了,那个版的文章都变成未读了。因为板块改名,不会去每个用户目录下去修改.boardrc,把相应的板块名字改为修改后的板块。所以你去看新板块的时候,.boardrc里面没有记录,系统就认为你均未看过这个版。
2)既然最大的值只记录60个,如果我看了61篇文章,会出现什么效果?这个问题问得好,我也不知道。
吓,我怎么会不知道哈,我们来做一个实验,找一个版块你从未看过的。我们打算把102和160篇文章都看了,这就是59篇了,这时100篇以前的文章你还都是未看过的,然后再看一下101篇,哈,前面100篇都变成已经读了,是不是有点不合理呀:)
3)为什么有时我上站发现我看过的文章又变成未读的了?因为你没有正常下线。文章未读标志只有在离开板块时才brc_update()写入.boardrc。
4)我登陆2个帐号?为什么没有同步?因为brd_update()只在离开板块时调用,所以你2个帐号在同一板块看了不同的文章,brd_update()不仅写入.boardrc,同时还重新载入.boardrc,当然,这一切都需要在已读未读标志改变以后。所以如果第一个窗口已经看了多好版,结果第二个窗口显示还是没看过,那么可以在第二个窗口里采用以下的简单办法操作:进入任意版,阅读任意文章(当然最简单的就是c一下清掉未读),退出该版,退回分类讨论区菜单,重新进入讨论区列表,然后就可以发现第二个窗口的未读标记跟第一个窗口已经同步了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行