練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

关于开发环境搭建 RSS feed
討論區首頁 » JForum中文社群 JForum Chinese Users Community
發表人 內容
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
问题5:指定版面的版主却可以删除其他版面的文章或者主题。
首先在管理后台的“会员分组”为一个会员所在的群组设置权限: 版主->是否允许设置为版主 设置为“是”;是否在允许的版块里审核/封锁贴子 设置为“是”;不能修改的论坛 设置为指定版面除外的所有其他版面。

这样就可以将某个会员设置为指定版面的版主了(我是这么理解的)。现在的问题是一个版面的版主不应该有权修改或者删除其他版面的主题的文章,除非该文章是他(她)发布的。

问题6:在封锁控制中添加了对某个用户ID的封锁,登陆后得到已经被封锁的提示,但是无法再以游客的身份浏览本网站了,点击"注销"和"论坛首页"都没有任何响应。 合理的希望应该是点击"注销"和"论坛首页"时以游客身份回到首页。
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:问题5:指定版面的版主却可以删除其他版面的文章或者主题。
首先在管理后台的“会员分组”为一个会员所在的群组设置权限: 版主->是否允许设置为版主 设置为“是”;是否在允许的版块里审核/封锁贴子 设置为“是”;不能修改的论坛 设置为指定版面除外的所有其他版面。

这样就可以将某个会员设置为指定版面的版主了(我是这么理解的)。现在的问题是一个版面的版主不应该有权修改或者删除其他版面的主题的文章,除非该文章是他(她)发布的。

问题6:在封锁控制中添加了对某个用户ID的封锁,登陆后得到已经被封锁的提示,但是无法再以游客的身份浏览本网站了,点击"注销"和"论坛首页"都没有任何响应。 合理的希望应该是点击"注销"和"论坛首页"时以游客身份回到首页。


問題5的處理:
修改post_show_action_buttons_inc.htm: 第18行及第22行,如下:
[code=html; first-line:18] <#if canEditCurrentMessage && (((post.userId == session.userId) && (session.userId != 1)) || isModerator || isAdmin)>
<a href="${JForumContext.encodeURL("/${moduleName}/edit/${start}/${post.id}")}" rel="nofollow" class="icon_edit"><img src="${contextPath}/images/transp.gif" alt="" /></a>
</#if>

<#if canRemove && (((post.userId == session.userId) && (session.userId != 1)) || isModerator || isAdmin)>
<a href="${JForumContext.encodeURL("/${moduleName}/delete/${start}/${post.id}")}" id="delete${post.id}" onclick="return confirmDelete(${post.id});"><img src="${contextPath}/templates/${templateName}/images/icon_delete.gif" alt="[Delete]" /></a>
</#if>[/code]

問題6的處理:
修改JForum.java第210行,加上條件判斷:
[code=java; first-line:208]
final boolean shouldBan = this.shouldBan(request.getRemoteAddr());

if (shouldBan && !"logout".equals(request.getAction())) {
moduleClass = ModulesRepository.getModuleClass("forums");
context.put("moduleName", "forums");
((WebRequestContext)request).changeAction("banned");
}
[/code]

分享經驗 累積智慧
[WWW]
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
问题7、似乎无法使用文章审核功能?

关于个人资料显示问题:
在多个页面中都有会员链接,点击链接就会看到这个会员的个人资料信息,包括:注册时间、发起的主题数、回复的文章数等等信息。当一个会员登录的时候,点击页面头部的“个人资料”链接则进入个人资料的编辑界面。我个人觉得会员登录后,查看自己的个人资料信息存在着不便利性。
所以实现功能:自己个人资料快速查看入口,见附件图。

实现:在模版文件user_form.htm中添加入user_profile.htm的个人资料对应的HTML码,然后分别在net.jforum.view.forum.UserAction.java 和net.jforum.view.admin.UserAction.java 的edit()函数中添加代码:

this.context.put("karmaEnabled", SecurityRepository.canAccess(SecurityConstants.PERM_KARMA_ENABLED));
this.context.put("rank", new RankingRepository());
this.context.put("u", user);
this.context.put("avatarAllowExternalUrl", SystemGlobals.getBoolValue(ConfigKeys.AVATAR_ALLOW_EXTERNAL_URL));

int loggedId = SessionFacade.getUserSession().getUserId();
int count = 0;
DataAccessDriver da = DataAccessDriver.getInstance();

List<Bookmark> bookmarks = da.newBookmarkDAO().selectByUser(user.getId());
if(loggedId == user.getId())
count = bookmarks.size();
else{
for (Iterator<Bookmark> iter = bookmarks.iterator(); iter.hasNext(); ) {
Bookmark bookmark = iter.next();
if (bookmark.isPublicVisible()) {
count++;
}
}
}

this.context.put("nbookmarks", Integer.valueOf(count));
this.context.put("ntopics", Integer.valueOf(da.newTopicDAO().countUserTopics(user.getId())));
this.context.put("nposts", Integer.valueOf(da.newPostDAO().countUserPosts(user.getId())));
this.context.put("tally", Integer.valueOf(da.newUserDAO().getUserTally(user.getId())));



后续打算添加积分功能,现在只能统计文章数,并且不区分主题和回复类型,无法区分会员活跃程度和社区荣誉。
  • [Thumb - 自己个人资料入口.jpg]
 檔案名稱 自己个人资料入口.jpg [Disk] 下載
 描述 自己的个人资料查看入口功能
 檔案大小 121 Kbytes
 下載次數:  0 次

andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:问题7、似乎无法使用文章审核功能?

請修改樣板檔/admin/forum_form.htm第212行的mailIntegration.isSSL()為mailIntegration.isSsl()即可:
[code=html; first-line:212]<td><input type="checkbox" name="requires_ssl" value="1" <#if mailIntegration?exists && mailIntegration.isSsl()>checked="checked"</#if> /></td>[/code]

測試方式:
1.系統管理控制台 > 版面管理 > 建立新版面
版面名稱 Moderated Forum
審核這個版面? 是
權限
將沒選到的這些群組設為禁止存取: Administration General
將沒選到的這些群組設為禁止匿名發表:
將沒選到的這些群組設為唯讀: Administration General
將沒選到的這些群組設為在訊息中禁止使用 HTML: Administration General
[更新]
群組管理
群組名稱 動作 刪除 安全性
Administration 編輯群組 權限
點選權限

版面管理
不能審核這些版面: 允許全部
[儲存]
2.註冊一個新的使用者
恭喜您!

您已經完成註冊程序. 您可以按 這裡 填寫更多個人資料以及選取個人頭像, 或點選 這裡 回到首頁.

記得喔!您隨時可以點選網頁上方的 "個人資料" 連結來修改您的個人資料.

3.點選 這裡 回到首頁並在Moderated Forum發表文章,出現下列訊息:
這是一個需要審核的版面.
您的文章正在等候版面管理員分析處理. 請耐心等候一下.

按這裡 繼續.

討論區首頁
4.登出
5.使用Admin帳號登入
6.系統管理控制台 > 文章審核

分享經驗 累積智慧
[WWW]
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
为了增加积分功能,我为数据库表jforum_users添加了一个字段tally(类型为int,默认值为0),并修改了需要的相关SQL语句和数据库操作代码(主要是读取和更新user info),并为net.jforum.entities.User类添加成员 int tally;以及get、set函数。

看了下数据库表jforum_posts里面,没有7天内的post记录。

构建项目的时候出现以下错误提示:
------------------------------
...
Failed tests:
testListPosts(net.jforum.summary.SummaryTest): null

Tests run: 62, Failures: 1, Errors: 0, Skipped: 0
...
------------------------------

分析代码,失败原因是testListPosts函数中的获取一周post list为空。我并不十分理解这里的post list是由哪部分测试用例创建的,是SummaryTest用例产生的,还是包含了本次构建所有测试用例产生的?跟我修改jforum_users 的表结构是否有关联?

我查看了关于获取和更新jforum_posts表的SQL语句和相关操作代码,看起来并没有与Jforum_users的tally字段有相交。

请andowson指教一二! 如能介绍下项目的测试用例功能的概况和原理就更佳了。

谢谢了!


这个问题经过半天的了解,总结一下:
构建过程中使用到的数据库是由执行脚本文件:mysql_data_dump.sql更新的,所以开始构建项目前需要执行一下这个脚本,执行后,jforum_posts表中多了一个表项,内容为:“Welcome to JForum”。

每次构建过程执行的SummaryTest用例会测试发送发表文章摘要功能,这个用例使用的时间范围是7天,如果执行脚本mysql_data_dump.sql超过7天,即7天内没有新发表文章,则构建项目时该测试用例会得到空的post list。

这个测试用例似乎需要重新考虑文章摘要的时间范围。


andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:为了增加积分功能,我为数据库表jforum_users添加了一个字段tally(类型为int,默认值为0),并修改了需要的相关SQL语句和数据库操作代码(主要是读取和更新user info),并为net.jforum.entities.User类添加成员 int tally;以及get、set函数。

看了下数据库表jforum_posts里面,没有7天内的post记录。

构建项目的时候出现以下错误提示:
------------------------------
...
Failed tests:
testListPosts(net.jforum.summary.SummaryTest): null

Tests run: 62, Failures: 1, Errors: 0, Skipped: 0
...
------------------------------

分析代码,失败原因是testListPosts函数中的获取一周post list为空。我并不十分理解这里的post list是由哪部分测试用例创建的,是SummaryTest用例产生的,还是包含了本次构建所有测试用例产生的?跟我修改jforum_users 的表结构是否有关联?

我查看了关于获取和更新jforum_posts表的SQL语句和相关操作代码,看起来并没有与Jforum_users的tally字段有相交。

请andowson指教一二! 如能介绍下项目的测试用例功能的概况和原理就更佳了。

谢谢了!


这个问题经过半天的了解,总结一下:
构建过程中使用到的数据库是由执行脚本文件:mysql_data_dump.sql更新的,所以开始构建项目前需要执行一下这个脚本,执行后,jforum_posts表中多了一个表项,内容为:“Welcome to JForum”。

每次构建过程执行的SummaryTest用例会测试发送发表文章摘要功能,这个用例使用的时间范围是7天,如果执行脚本mysql_data_dump.sql超过7天,即7天内没有新发表文章,则构建项目时该测试用例会得到空的post list。

这个测试用例似乎需要重新考虑文章摘要的时间范围。



SummaryTest中的post list如您所理解的,是去抓取資料庫中目前七天內發表的新文章,測試案例中所發表的文章會於測試完畢時自動刪除,故這些文章的來源是由使用者自行部署到Tomcat webapps去測試時產生。
以我自己來說,我每次執行完Eclipse的Run As > maven package後,會將target\jforum目錄copy回Tomcat的webapps目錄下去進行測試,使用的資料庫名稱就是jforum,與Eclipse所連的測試資料庫一致。

分享經驗 累積智慧
[WWW]
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
难怪,我的项目构建使用的数据库和实际部署使用的库是分开的。
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
问题:删除一个主题时,用户的文章数并没有减去相应数量。
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
andowson wrote:
十鼎 wrote:为主题的文章进行缓存功能,我感觉有问题(我的理解),如果我理解有误还请指教。楼主,你的理解如何?


應該是有問題沒錯,有可能是我誤改了原來的程式碼
trunk/src/main/java/net/jforum/repository/PostRepository.java的118行:
[code=java; first-line:118]posts = pm.selectAllByTopicByLimit(topicId, start, count);[/code]
將其還原為:
[code=java; first-line:118]posts = pm.selectAllByTopic(topicId);[/code]
再測測看吧!

另外,您在發表程式碼時可否幫忙加上code的標籤,以便套用原始碼排版?謝謝您!
可參考這篇的說明:
http://www.andowson.com/posts/list/133.page


旧的设置为:每页主题数15,然后设置为每页10;
在某个版面发表新的主题,直到该版面有12个,当超过10时,页导航出现2页,但是首页主题数为12,次页有2页。
这个问题与上面的问题存在相同的逻辑。

重启服务器后,正常。
问题所在的位置在:net.jforum.view.forum.common.TopicsCommon.java L102。
看来主题缓存和文章缓存都有进一步改进机会。
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:问题:删除一个主题时,用户的文章数并没有减去相应数量。

請修改一下src/main/java/net/jforum/dao/generic/GenericPostDAO.java#removePosts(),加上
userDAO.decrementPosts(post.getUserId());

...
import net.jforum.dao.UserDAO;
...

private void removePosts(List<Post> posts)
{
PreparedStatement pstmtPost = null;
PreparedStatement pstmtText = null;
UserDAO userDAO = DataAccessDriver.getInstance().newUserDAO();

try {
pstmtPost = JForumExecutionContext.getConnection()
.prepareStatement(SystemGlobals.getSql("PostModel.deletePost"));

pstmtText = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("PostModel.deletePostText"));

for (Iterator<Post> iter = posts.iterator(); iter.hasNext();) {
Post post = iter.next();

pstmtPost.setInt(1, post.getId());
pstmtText.setInt(1, post.getId());

pstmtText.executeUpdate();
pstmtPost.executeUpdate();

SearchFacade.delete(post);
userDAO.decrementPosts(post.getUserId());
}
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(pstmtPost);
DbUtils.close(pstmtText);
}
}


然後修改src/main/java/net/jforum/view/forum/PostAction.java#delete()

public void delete()
{
....
postDao.delete(post);
//刪掉這行DataAccessDriver.getInstance().newUserDAO().decrementPosts(post.getUserId());
...
}


分享經驗 累積智慧
[WWW]
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:
andowson wrote:
十鼎 wrote:为主题的文章进行缓存功能,我感觉有问题(我的理解),如果我理解有误还请指教。楼主,你的理解如何?


應該是有問題沒錯,有可能是我誤改了原來的程式碼
trunk/src/main/java/net/jforum/repository/PostRepository.java的118行:
[code=java; first-line:118]posts = pm.selectAllByTopicByLimit(topicId, start, count);[/code]
將其還原為:
[code=java; first-line:118]posts = pm.selectAllByTopic(topicId);[/code]
再測測看吧!

另外,您在發表程式碼時可否幫忙加上code的標籤,以便套用原始碼排版?謝謝您!
可參考這篇的說明:
http://www.andowson.com/posts/list/133.page


旧的设置为:每页主题数15,然后设置为每页10;
在某个版面发表新的主题,直到该版面有12个,当超过10时,页导航出现2页,但是首页主题数为12,次页有2页。
这个问题与上面的问题存在相同的逻辑。

重启服务器后,正常。
问题所在的位置在:net.jforum.view.forum.common.TopicsCommon.java L102。
看来主题缓存和文章缓存都有进一步改进机会。

如您所說的cache機制目前尚需測試來確認是否可正常運作,這個問題可以由修改trunk/src/main/java/net/jforum/view/forum/common/TopicsCommon.java#topicsByForum()來解決:
[code=java;first-line:85]
/**
* List all first 'n' topics of a given forum.
* This method returns no more than <code>ConfigKeys.TOPICS_PER_PAGE</code>
* topics for the forum.
*
* @param forumId The forum id to which the topics belongs to
* @param start The start fetching index
* @return <code>java.util.List</code> containing the topics found.
*/
public static List<Topic> topicsByForum(int forumId, int start)
{
TopicDAO tm = DataAccessDriver.getInstance().newTopicDAO();
int topicsPerPage = SystemGlobals.getIntValue(ConfigKeys.TOPICS_PER_PAGE);
List<Topic> topics;

// Try to get the first's page of topics from the cache
if (SystemGlobals.getBoolValue(ConfigKeys.TOPIC_CACHE_ENABLED)) {
topics = TopicRepository.getTopics(forumId);

if (topics.isEmpty() || !TopicRepository.isLoaded(forumId)) {
synchronized (MUTEXT) {
if (topics.isEmpty() || !TopicRepository.isLoaded(forumId)) {
topics = tm.selectAllByForum(forumId);
TopicRepository.addAll(forumId, topics);
}
}
}
}
else {
topics = tm.selectAllByForumByLimit(forumId, start, topicsPerPage);
}

int size = topics.size();
return topics.subList(start, (size < start + topicsPerPage) ? size : start + topicsPerPage);
}
[/code]
改為topics = tm.selectAllByForum(forumId);
然後return topics.subList(start, (size < start + topicsPerPage) ? size : start + topicsPerPage);

分享經驗 累積智慧
[WWW]
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
关于运行时更新配置文件引起的异常问题
jforum支持运行时更新配置文件功能,运行时会监测主要的配置文件是否被更新,如果发现则重新装载。相关代码见SystemGlobalsListener.java 文件:
[code=java; first-line:60]
public void fileChanged(final String filename)
{
LOGGER.info("Reloading "+ filename);

SystemGlobals.reset(); //这里已经清空了所有配置信息
SystemGlobals.initGlobals(SystemGlobals.getApplicationPath(),
SystemGlobals.getValue(ConfigKeys.DEFAULT_CONFIG));//这里希望取出默认配置文件名,返回值为空
}
[/code]

文件SystemGlobals.java
[code=java; first-line:118]
private void buildSystem(String appPath, String mainConfigurationFile)
{
if (mainConfigurationFile == null) {
throw new InvalidParameterException("defaultConfig could not be null");//空的路径参数导致抛出异常
}

this.defaultConfig = mainConfigurationFile;
this.defaults = new Properties();
[/code]
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
十鼎 wrote:关于运行时更新配置文件引起的异常问题
jforum支持运行时更新配置文件功能,运行时会监测主要的配置文件是否被更新,如果发现则重新装载。相关代码见SystemGlobalsListener.java 文件:
[code=java; first-line:60]
public void fileChanged(final String filename)
{
LOGGER.info("Reloading "+ filename);

SystemGlobals.reset(); //这里已经清空了所有配置信息
SystemGlobals.initGlobals(SystemGlobals.getApplicationPath(),
SystemGlobals.getValue(ConfigKeys.DEFAULT_CONFIG));//这里希望取出默认配置文件名,返回值为空
}
[/code]

嗯!這個問題只要把SystemGlobals.reset();這行刪掉即可解決。

分享經驗 累積智慧
[WWW]
十鼎

八級學員

註冊時間: 2011/7/1
文章: 27
來自: 中国杭州
離線
我为后台管理添加新的功能页面,浏览器请求显示时,freemarker处理新模版文件页面中的<#include "header.htm"/>,会插入default目录下的header.htm而不是default/admin/header.htm ,反复查看了各个环节未能找到原因所在,请求指教 !

我为后台管理添加新功能页面,涉及的环节如下:
1、在default/admin/menu.htm添加新功能链接,点击这个链接可以显示新功能页面;
[code=html; first-line:123]
<tr>
<td class="row1"><a id="recommTopics" class="genmed" href="${JForumContext.encodeURL("/adminRecommTopics/list")}" target="main">${I18n.getMessage("AdminTopics.index")}</a></td>
</tr>
[/code]
2、在urlPattern.properties文件中添加一行:“adminRecommTopics.list.0 =”;
即这个请求action不带参数;

3、在modulesMapping.properties中添加一行:“adminRecommTopics = net.jforum.view.admin.RecommendAction” ;
即为url :/adminRecommTopics/list请求定义对应的模块文件;

4、在源码包package net.jforum.view.admin中添加模块类:public class RecommendAction extends AdminCommand;

public class RecommendAction extends AdminCommand {

public void list() {
this.context.put("topics", DataAccessDriver.getInstance().newTopicDAO().selectRecommWaitingTopics(10));
this.setTemplateName(TemplateKeys.RECOMMEND_LIST);//新添加的,= "recommend.list";
}

}

5、在文件:templatesMapping.properties中添加新的模版文件映射关系;
添加一行定义:recommend.list = admin/recommend_list.htm

6、添加模版文件templates/default/admin/recommend_list.htm;
[code=html; first-line:1]
<#include "header.htm"/>

<form accept-charset="${encoding}" name="form" action="${JForumContext.encodeURL("/jforum")}" method="post">
<input type="hidden" name="action" value="RecommWaitingOpera" />
<input type="hidden" name="module" value="${moduleName}" />
...

[/code]
7、SystemGlobals.properties文件中的相关设置项;

# If you have freemarker templates residing outside of the JForum webapp
# you can add the path to the directory containing them here.
# Add the full path to the directory.
freemarker.extra.template.path =
...
# The template to use
template.dir = default

8、检查JForumBaseServlet类中初始话freemarker配置过程,没有新更改
[code=java;first-line:99]
// Configure the template engine
final Configuration templateCfg = new Configuration();
templateCfg.setTemplateUpdateDelay(2);
templateCfg.setSetting("number_format", "#");
templateCfg.setSharedVariable("startupTime", Long.valueOf(System.currentTimeMillis()));

// Create the default template loader
final String defaultTemplatePath = SystemGlobals.getApplicationPath() + "/templates";
final FileTemplateLoader defaultLoader = new FileTemplateLoader(new File(defaultTemplatePath));
[/code]
没有弄明白freemarker在处理default/admin/recommend_list.htm和default/forum_show.htm两个模版文件时,用什么规则分别为它们装载不同的包含文件:header.htm?
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
目前JForum中使用的templates對FreeMarker來說都是使用相對路徑,例如forum_list.htm裡面的<#include "header.htm" />就是和forum_list.htm同一目錄下的header.htm。
可以參考下面這個網址的說明:
http://freemarker.sourceforge.net/docs/ref_directive_include.html

分享經驗 累積智慧
[WWW]
 
討論區首頁 » JForum中文社群 JForum Chinese Users Community
前往:   
行動版