- 浏览: 45456 次
- 性别:
- 来自: 无锡
最新评论
-
RainWu:
...
chx 学习jForum笔记十四 数据表四 jforum_groups及jforum_user_groups -
c_huabo:
这都被你发现了!!!
chx 学习jForum笔记十七 实现中文搜索 -
beermonkey:
感谢啊。。。。
chx 学习jForum笔记十七 实现中文搜索
2010.12.9。接昨天
在net.jforum.view.forum.common/ForumCommon.java中
public static void checkUnreadPosts(final Forum forum, final Map<Integer, Long> tracking
, final long lastVisit
)
{
final LastPostInfo lpi = forum.getLastPostInfo
(); //取Forum中最后贴子信息
if (lpi == null) {
return;
}
final Integer topicId = Integer.valueOf(lpi.getTopicId()); //Forum中最后贴子的主题ID
//tracking 来自 SessionFacade.getTopicsReadTime() 最后阅读时间
if (tracking != null && tracking.containsKey(topicId)) { //tracking中读过此主题的记录
final long readTime = tracking.get(topicId).longValue(); //tracking中读主题的时间
forum.setUnread(readTime > 0 && lpi.getPostTimeMillis() > readTime); //主题变更时间晚于阅读时间
}
else {
forum.setUnread(lpi.getPostTimeMillis() > lastVisit); //主题变更时间晚于登录时间
}
}
从上面这段字看来,基本上是设置FORUM的状态,如果FORUM中有会员未读的帖子,就将状态设为未读。
这里有三个问题。一是tracking从哪里来的,查了一下,从SessionFacade.getTopicsReadTime()获取,但这里面的值又是什么时候设置的?二是lastVisit从哪里来的,来自userSession.getLastVisit().getTime(); //最后登录时间,同样的,这里面的值是什么时候设置的?三是forum.getLastPostInfo ();
在net.jforum.entities/Forum.java中
public LastPostInfo getLastPostInfo() {
return this.lpi;
}
仅仅是返回一个属性,查构造函数:
public Forum(final Forum forum)
{
this.description = forum.getDescription();
this.id = forum.getId();
this.idCategories = forum.getCategoryId();
this.lastPostId = forum.getLastPostId();
this.moderated = forum.isModerated();
this.name = forum.getName();
this.order = forum.getOrder();
this.totalPosts = forum.getTotalPosts();
this.totalTopics = forum.getTotalTopics();
this.unread = forum.isUnread();
this.lpi = forum.getLastPostInfo();
}
居然也是这句:getLastPostInfo(),难道购造时已经有forum的值了吗?哦,有个传入的forum值。
public void setLastPostInfo(final LastPostInfo lpi) {
this.lpi = lpi;
}
再普通不过的写值。全项目查找这个setLastPostInfo,得到四个结果,在同一个文件中。net.jforum.repository/ForumRepository.java
public static LastPostInfo getLastPostInfo(Forum forum) //取指定forum的最后帖子信息
{
LastPostInfo lpi = forum.getLastPostInfo(); //取指定forum的最后帖子信息
if (lpi == null || !forum.getLastPostInfo().hasInfo()) { //信息为空
lpi = DataAccessDriver.getInstance().newForumDAO().getLastPostInfo
(forum.getId()); //从数据表中取信息
forum.setLastPostInfo(lpi); //设置forum的最后帖子信息
}
return lpi; //返回forum的最后帖子信息
}
嗯,看来这个最正确了。从数据表中取信息的。
net.jforum.dao.generic/GenericForumDAO.java
public LastPostInfo getLastPostInfo(final int forumId)
{
return this.getLastPostInfo
(forumId, true);
}
找到主体了:
private LastPostInfo getLastPostInfo(final int forumId, boolean origTryFix)
{
boolean tryFix = origTryFix; //是否尝试修复
final LastPostInfo lpi = new LastPostInfo();
PreparedStatement pstmt = null;
ResultSet resultSet = null;
try { //读取sql语句。并设置参数
pstmt = JForumExecutionContext.getConnection()
.prepareStatement(SystemGlobals.getSql("ForumModel.lastPostInfo"));
pstmt.setInt(1, forumId);
resultSet = pstmt.executeQuery(); //执行sql语句
if (resultSet.next()) {
lpi.setUsername(resultSet.getString("username")); //取用户名
lpi.setUserId(resultSet.getInt("user_id")); //取用户id
final SimpleDateFormat sdf = new SimpleDateFormat(SystemGlobals.getValue(ConfigKeys.DATE_TIME_FORMAT), Locale.getDefault());
lpi.setPostDate(sdf.format(resultSet.getTimestamp("post_time"))); //取发贴显示日期
lpi.setPostId(resultSet.getInt("post_id")); //取帖子ID
lpi.setTopicId(resultSet.getInt("topic_id")); //取主题ID
lpi.setPostTimeMillis(resultSet.getTimestamp("post_time").getTime()); //取发贴时间
lpi.setTopicReplies(resultSet.getInt("topic_replies")); //取主题回复数
lpi.setHasInfo(true); //设为有信息
lpi.setTitle(resultSet.getString("topic_title")); //取主题标题。
// Check if the topic is consistent
TopicDAO topicDao = DataAccessDriver.getInstance().newTopicDAO();
Topic topic = topicDao.selectById(lpi.getTopicId()); //从数据表中取主题内容
if (topic.getId() == 0) { //未取到主题,尝试修复
// Hm, that's not good. Try to fix it
topicDao.fixFirstLastPostId(lpi.getTopicId()); ////修复主题的首贴ID与尾贴ID
}
tryFix = false; //设置标志为“正常”非修复的。
}
else if (tryFix) { //未取到最后贴子信息并且需要尝试修复
resultSet.close();
pstmt.close();
int postId = this.getMaxPostId(forumId); //初始值取最大的贴子ID
//读取sql语句。并设置参数
pstmt = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("ForumModel.latestTopicIdForfix"));
pstmt.setInt(1, forumId);
resultSet = pstmt.executeQuery();
if (resultSet.next()) {
int topicId;
topicId = resultSet.getInt("topic_id"); //取SQL执行返回值。
resultSet.close();
pstmt.close();
// Topic 更新数据表内容
pstmt = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("ForumModel.fixLatestPostData"));
pstmt.setInt(1, postId);
pstmt.setInt(2, topicId);
pstmt.executeUpdate();
pstmt.close();
// Forum 更新数据表内容
pstmt = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("ForumModel.fixForumLatestPostData"));
pstmt.setInt(1, postId);
pstmt.setInt(2, forumId);
pstmt.executeUpdate();
}
}
//如果是修复的,返回修复后的结果,否则返回取到的值。
return (tryFix ? this.getLastPostInfo
(forumId, false) : lpi);
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(resultSet, pstmt);
}
}
至此,getLastPostInfo研究结束,SQL语句来自于"ForumModel.lastPostInfo",并且还具有自查修复功能。
下面查SessionFacade.getTopicsReadTime()和userSession.getLastVisit().getTime();
net.jforum/SessionFacade.java
public static Map<Integer, Long> getTopicsReadTime()
{ //取属性
Map<Integer, Long> tracking = (Map<Integer, Long>)getAttribute
(ConfigKeys.TOPICS_READ_TIME);
if (tracking == null) { //如果未取到
tracking = new HashMap<Integer, Long>(); //新建一个空的
setAttribute
(ConfigKeys.TOPICS_READ_TIME, tracking); //设置属性
}
return tracking;
}
好象是直接去操作SESSION了。对这个我是一窍不通的。
public static Object getAttribute(final String name)
{
return JForumExecutionContext.getRequest().getSessionContext().getAttribute(name);
}
public static void setAttribute(final String name, final Object value)
{
JForumExecutionContext.getRequest().getSessionContext().setAttribute(name, value);
}
看看是什么时候设置进去的,查"setAttribute(ConfigKeys.TOPICS_READ_TIME",找到了四处,一处是上面的设置空值,一处是setAttribute(ConfigKeys.TOPICS_READ_TIME_BY_FORUM,……),当然也不对,一处是跟MAIL有关的,先排除,剩下最后一处最象。
但是,怎么又是空值?
SessionFacade.setAttribute(ConfigKeys.TOPICS_READ_TIME, new HashMap<Integer, Long>());
回过来再看第二处那个“ConfigKeys.TOPICS_READ_TIME_BY_FORUM”的。似乎有点象。
在net.jforum.view.forum/ForumAction.java中
public void readAll() // 将所有主题标记为已读
{
String forumId = this.request.getParameter("forum_id"); //取查询参数
if (forumId != null) {
Map<Integer, Long> tracking = SessionFacade.getTopicsReadTimeByForum(); //取session中的值
if (tracking == null) { //未取到
tracking = new HashMap<Integer, Long>(); //建空值
}
tracking.put(Integer.valueOf(forumId), Long.valueOf(System.currentTimeMillis())); //设置forumID及当前时间
SessionFacade.setAttribute(ConfigKeys.TOPICS_READ_TIME_BY_FORUM, tracking); //设置session
}
if (forumId != null) {
JForumExecutionContext.setRedirect(this.makeRedirect("show")); //重定向到show
}
else { //重定向到list
JForumExecutionContext.setRedirect(this.request.getContextPath() + "/forums/list"
+ SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION));
}
}
看来,session中保存的ConfigKeys.TOPICS_READ_TIME_BY_FORUM 是板块的ID及查看时间。似乎并不是ConfigKeys.TOPICS_READ_TIME。再根据“TOPICS_READ_TIME”查找全文,仍然没有新的内容。也许没有实现这个主题阅读时间的功能吧。
反正 if (tracking != null && tracking.containsKey(topicId)) { //tracking中读过此主题的记录
else {
forum.setUnread(lpi.getPostTimeMillis() > lastVisit); //主题变更时间晚于登录时间
}
现在再查lastVisit。userSession.getLastVisit().getTime();
来自于net.jforum.entities/UserSession.java
public Date getLastVisit()
{
//return new GregorianCalendar(2007, 6, 28, 15, 15, 19).getTime();
return this.lastVisit;
}
public void setLastVisit(final Date lastVisit)
{
this.lastVisit = lastVisit;
}
public void registerBasicInfo() //注册基本信息
{
this.setStartTime(new Date(System.currentTimeMillis()));
this.setLastVisit(new Date(System.currentTimeMillis()));
this.setUserId(SystemGlobals.getIntValue(ConfigKeys.ANONYMOUS_USER_ID));
this.setUsername(I18n.getMessage("Guest"));
}
除了注册基本信息中会同时设置一下最后登录时间外,应该还有其他地方设置这个值。
查"setLastVisit",嗯,挺多的。
net.jforum/ControllerUtils.java中
protected void configureUserSession(final UserSession userSession, final User user)//SSO登入认证成功后的操作。
net.jforum.view.forum/UserAction.java中
private void logNewRegisteredUserIn(final int userId, final User user) //用户注册
public void validateLogin() //用记登录校验
好了,看来这个LastVisit也仅仅是最后登录时间,而非最后看贴时间。
小结:
至此,ForumAction中的 this.context.put("allCategories", ForumCommon.getAllCategoriesAndForums(true));//页面显示的所有分类和板块(检查有无未读的贴子) 这句话研究结束。
不仅返回所有有权查看的分类、板块,同时还返回板块是否有未读贴子的状态。
关于用户认证,在net.jforum/ControllerUtils.java中的protected void configureUserSession(final UserSession userSession, final User user)//SSO登入认证成功后的操作。
及net.jforum.view.forum/UserAction.java中的 public void validateLogin() //用记登录校验
另外,用户注册在private void logNewRegisteredUserIn(final int userId, final User user) //用户注册
这几个都是我将来要改造的。
发表评论
-
chx 学习jForum笔记十九 jForum定时作业
2011-02-25 15:43 978参照jforum原有的两个定时作业SummarySchedul ... -
chx 学习jForum笔记十八 jForum与ms sqlserver
2011-02-23 16:39 7394jForum的原生数据库是mysql,但对sqlserver也 ... -
chx 学习jForum笔记十七 实现中文搜索
2011-02-23 16:04 1516最初测试的时候中文搜索一直都不成功。所以以为要对源程序进行大幅 ... -
chx 学习jForum笔记十六 实现附件移植,添加附件时按钮无效的问题解决
2011-02-23 15:59 3041==背景== 原论坛附件存放于d:\res\cibfo ... -
chx 学习jForum笔记十五 实现用户及用户组同步
2011-02-23 15:25 1691==背景== 原先有一个随时维护的用户表rswk、权限表ci ... -
chx 学习jForum笔记十四 数据表四 jforum_groups及jforum_user_groups
2011-02-14 14:07 1438jforum_groups group_id ... -
chx 学习jForum笔记十三 数据表三 jforum_roles及jforum_role_values
2011-02-12 16:19 1261jforum_roles 权限表。是一张组与基本权限的对应表。 ... -
chx 学习jForum笔记十二 数据表二 jforum_categories及jforum_forums
2011-02-12 15:05 1333jforum_categories是子论坛的分类以下称为栏目。 ... -
chx 学习jForum笔记十一 实现单点登录SSO
2011-02-09 11:55 1948分为三部分: 1.导入原用户数据库. 2.修改SSO模块, ... -
chx 学习jForum笔记十 数据表一 jforum_users
2011-02-09 10:35 1245user_id bigint ... -
chx 学习jForum笔记九-ForumAction四,发现用户注册模块
2010-12-09 14:27 19512010.12.9接上午。继续看net.jforum.view ... -
chx 学习jForum笔记七-ForumAction二
2010-12-08 17:24 11432010.12.8 接昨天。 下面这句是存在于net.jfo ... -
chx 学习jForum笔记六-MostUsersEverOnline的结束及ForumAction-list的开始
2010-12-07 15:54 22462010.12.7 继续查找关键字MostUsersEverO ... -
chx 学习jForum笔记五-参数表的操作
2010-12-07 15:05 9752010.12.7 继续查找关键字MostUsersEverO ... -
chx 学习jForum笔记四
2010-12-06 15:21 9672010.12.6 接上午。在net.jforum.repos ... -
chx 学习jForum笔记三
2010-12-06 14:05 10032010.12.6 接上周日,继续。PermissionCon ... -
chx 学习jForum笔记二
2010-12-05 10:26 1203我的源程序是安道森练 ... -
chx 学习jForum笔记一
2010-12-05 09:37 1647目标:jForum二次开发,读懂源程序。 修改权限管理模块, ...
相关推荐
NULL 博文链接:https://caihexi.iteye.com/blog/919868
北大计算机系高级计算机系统结构课件chx14-arch07-MT1
CHX-I防火墙官方教程-附带翻译终稿.pdf
1. Data dependences (also called true data dependences) 2. name dependences 3. c
HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网HA-SoftEther-CHX虚拟专网
1. 驱动位线(bit) 2. 选择行 1. 对两条位线预充电,使得bitVdd 2. 选择行 3. 存储单元将一条线拉为低 4. 列上的信号放大器检测 bit
北京大学微处理器研究开发中心(第六讲)2014年4月21日程 旭基于静态调度的ILP高等计算机系统结构北京大学微处理器研究开发中心复习: 先进超标量技术°简单的
北京大学计算机科学技术系计算机系统结构教研室高等计算机系统结构(第九讲)2014年5月12日程 旭多处理器系统北京大学计算机科学技术系计算机系统结构教研室197
北京大学微处理器研究开发中心计算机系统结构研究所高等计算机系统结构(第五讲)2014年4月21日程 旭现代指令级并行技术北京大学微处理器研究开发中心计算机系统结
1. Instruction status—which of 4 steps the instruction is in 2. Functional unit
1.5% 1.4B Transistors 2.75B Transistors
使用基于密度泛函理论(DFT)的Cast叩量子力学计算程序模块,对CHX(X=0-4)在Y-AI2O3(ll0D)表面吸附的位置,空间结构和能量进行了理论计算。计算结果表明.CHx=(x=0-3)与表面形成强的相互作用。CH3,CH2物种处于表面八面体...
CHX-I防火墙官方教程-附带翻译借鉴.pdf
采用密度泛函理论与周期平板模型相结合的方法,对物种CHx(x=2-4)在Co(111)表面的top,fcc,hcp 和 bridge位的吸附模型进行了结构优化、能量计算,得到了各物种较有利的吸附位;并对最佳吸附位进行密立根电荷和总态密度...
chx99个人主页源码_chx99
这是生物方面的资源,不感兴趣的人不建议下载
本软件是一个模似网卡和集线器的工具,可以模似集线器功能,实现VPN的功能。使得系统把此软件识别成一块网卡,有了这个东西,只要可以访问外网,都可以连接到虚拟HUB上与其他电脑组成局域网,在此虚拟的局域...
CHX-3大手臂大法兰.SLDDRW
CHX是C ++嵌入HTML扩展,就像JSP是Java嵌入的一样。 这是CHX到C ++的源代码转换器。
工控软件,要求联网才能使用,否则就运行不下去。虚拟网卡正是解决无实际网卡的困扰。