返回目录列表
帖子屏蔽功能
需求:如果帖子中有不恰当内容不适合公开,管理员可以将其隐藏,这比采取删除的方式要更人性尊重作者。
初步分析:帖子屏蔽实际就是显示帖子时,将全部内容不显示,替代以“该贴已经被管理员屏蔽”字样,这个功能是一种帖子过滤功能,和对帖子中敏感字眼过滤器com.jdon.jivejdon.model.message.output.shield.Profanity类似。
设计思路:Profanity是以敏感词语为核心,而该功能以帖子为核心,管理员通过管理界面将某个帖子设置为隐藏屏蔽或取消屏蔽,该帖子显示时屏蔽过滤器根据管理员设置的开关进行过滤与否判断。
ForumMessage作为帖子的模型,我们需要在其中增加一个boolean字段maked,用来表示屏蔽与否的开关,按正常思维,ForumMessage映射的数据表同样需要一个字段,这种方式没有扩展性,以后再需要新字段,还要更改数据表,一种灵活动态方式,就是我们可以通过Property来实现字段的添加。ForumMessage中增加方法:
public boolean isMasked() {
if (getPropertyValue(PROPERTY_MASKED) != null)
return true;
else
return false;
}
public void setMasked(boolean masked){
if (masked)
addProperty(PROPERTY_MASKED, PROPERTY_MASKED);
else
removeProperty(PROPERTY_MASKED);
}
ForumMessage中已经有了屏蔽与否的开关,下一步实现对屏蔽的操作,以及屏蔽效果的过滤两个功能。
屏蔽设置实现
首先实现管理员对帖子设置屏蔽的功能,该功能链接可以和删除帖子放在一起,很显然,这个业务功能代码应该在ForumMessageService中实现,在该接口增加如下方法:
void maskMessage(EventModel em) throws Exception ;
那么链接和这个ForumMessageService方法之间无疑是通过struts的Action实现,如
<html:link page=”/message/messageMaskAction.shtml”></html:link>
我们需要在struts-config.xml配置这个messageMaskAction,
问题是,对应这个messageMaskAction的具体类应该是什么呢?Jdon框架的ModelViewAction和ModelSaveAction是针对CRUD功能,而屏蔽标志设立好像没有CRUD那么复杂,不需要,我们现在需要的是通过messageMaskActio.shtml直接激活ForumMessageService的maskMessage方法,无疑这里联系需要一个Action。
Jdon框架提供了一种命令服务功能可以帮助我们省却手工编码Action,这个类就是com.jdon.strutsutil.ServiceMethodAction,这样我们只要参考Jdon框架开发指南命令服务的使用,直接在struts-config-message.xml配置如下:
<action name="messageForm" path="/message/messageMaskAction" type="com.jdon.strutsutil.ServiceMethodAction" scope="request"
validate="false">
<forward name="success" path="/message/result.jsp" />
</action>
而jsp中链接调用形式如下:
/message/messageMaskAction.shtml?method=maskMessage
通过参数method方法的值maskMessage,Jdon框架就将这个Action直接去调用ForumMessageService的maskMessage方法。
当然,messageMaskAction.shtm还有其他参数,比如设置屏蔽和取消屏蔽以及对应的ForumMessage的messageId。
设置屏蔽的链接形式:
<html:link page="/message/messageMaskAction.shtml?method=maskMessage&masked=true" paramId="messageId" paramName="forumMessage" paramProperty="messageId" >
取消设置的链接形式:
<html:link page="/message/messageMaskAction.shtml?method=maskMessage&masked=false" paramId="messageId" paramName="forumMessage" paramProperty="messageId" >
这样,以上链接将直接激活ForumMessageService的maskMessage方法,该方法是该功能业务核心,在ForumMessageService实现子类ForumMessageShell内容如下:
public void maskMessage(EventModel em) throws Exception {
logger.debug("enter maskMessage");
ForumMessage
forumMessage = (ForumMessage) em.getModelIF();
boolean masked =
forumMessage.isMasked();
forumMessage
= getMessage(forumMessage.getMessageId());
if (forumMessage == null) {
logger.error("the message don't existed: " + forumMessage.getMessageId());
return;
}
forumMessage.setMasked(masked);//modify full message
em.setModelIF(forumMessage);
this.updateMessage(em);
}
注意:EventModel中获得的forumMessage实际就是前台链接messageMaskAction.shtml提交的参数,但不是一个真正完整的内容的forumMessage,因此我们需要从后台数据库获得一个完整forumMessage,然后修改这个老的forumMessage的屏蔽属性值,再将这个修改后的完整的forumMessage交由后台完成修改。
过滤类实现
以上实现的是帖子屏蔽功能的设置,下面实现屏蔽效果在显示发生作用的功能,可以参考com.jdon.jivejdon.model.message.output.shield. Profanity,建立一个过滤类: com.jdon.jivejdon.model.message.output.shield. Bodymasking
public class Bodymasking extends MessageRendering {
private String maskLocalization = "THIS MESSAGE HAS BEEN MASKED";
public String applyFilteredBody() {
if (message.isMasked()){
return maskLocalization;
}else
return message.getFilteredBody();
}
其中maskLocalization值可以通过论坛管理界面进行定制。
关于Bodymasking过滤类的安装有两种方式:
1.
如果当前论坛已经正常运行,各种过滤器已经设置好,那么新的过滤类就需要通过论坛管理的” 添加过虑器”方式进行安装。
2.
在manage.xml中配置加入新的过滤类,这样一个新论坛初始化时就会加入这个过滤类,如下:
<component name="renderingAvailableFilters"
class="com.jdon.jivejdon.model.message.output.RenderingAvailableFilters">
<constructor
value="com.jdon.jivejdon.model.message.output.html.HTMLFilter"/>
<constructor
value="com.jdon.jivejdon.model.message.output.html.Newline"/>
<constructor
value="com.jdon.jivejdon.model.message.output.html.TextStyle"/>
<constructor value="com.jdon.jivejdon.model.message.output.html.URLConverter"/>
<constructor
value="com.jdon.jivejdon.model.message.output.shield.Profanity"/>
<constructor
value="com.jdon.jivejdon.model.message.output.codeviewer.CodeHighlighter"/>
<constructor value="com.jdon.jivejdon.model.message.output.html.WordBreak"/>
<constructor
value="com.jdon.jivejdon.model.message.output.html.QuoteFilter"/>
<constructor
value="com.jdon.jivejdon.model.message.output.emotion.Emoticon"/>
<constructor value="com.jdon.jivejdon.model.message.output.html.ImageFilter"/>
<constructor
value="com.jdon.jivejdon.model.message.output.shield.Bodymasking"/>
</component>
更多Jdon框架专题讨论
JdonFramework作为一个免费开源软件开发平台,可以商用开发大多数数据库应用软件和管理软件: 电子商务软件 在线教育软件 税务软件 Web快速开发软件 财务软件 购物车软件 医院帐务软件 crm software medical software 人事薪资软件payroll software 在线购物软件 销售软件 项目管理软件 房产不动产管理软件 生产软件 PDM软件 制造业软件 仓库软件 采购软件 进销存软件 危险源监控软件 物流软件 超市软件 银行软件 保险软件 汽车软件 医疗软件 电子软件 自动化软件 服装软件 烟草软件 分销管理软件 供应商管理软件
|