
这样就囊括了所有会出现的用户event,只要在java层做业务转换即可:
最核心的event数据转换java类源码:
package com.zuidaima.core.service.impl;
private void setSourceAndTarget(Event event, EventRule _eventRule) {
try {
EventRule eventRule = new EventRule();
eventRule.setCreateTime(_eventRule.getCreateTime());
eventRule.setExtendJson(_eventRule.getExtendJson());
eventRule.setId(_eventRule.getId());
eventRule.setName(_eventRule.getName());
eventRule.setNiubi(_eventRule.getNiubi());
eventRule.setType(_eventRule.getType());
eventRule.setUpdateTime(_eventRule.getUpdateTime());
BaseEntity source = null;
BaseEntity target = null;
long sourceId = event.getSourceId();
long targetId = event.getTargetId();
JSONObject extend = eventRule.getExtend();
extend = eventRule.getExtend();
String description = (String) extend.get("description");
String _description = null;
Answer answer = null;
Project project = null;
switch (eventRule.getType()) {
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_CREATE:
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_DELETE_BY_USER:
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_DELETE_BY_ADMIN:
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_VIEW:
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_COLLECT:
case ModuleConstants.EVENT_TYPE_RULE_PROJECT_REWARD:
if (sourceId > 0) {
source = projectService.findOneById(sourceId);
}
if (targetId > 0) {
target = projectService.findOneById(targetId);
}
project = (Project) target;
if (source != null) {
project = (Project) source;
}
if (project == null) {
return;
}
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
break;
case ModuleConstants.EVENT_TYPE_RULE_POST_CREATE:
case ModuleConstants.EVENT_TYPE_RULE_POST_DELETE_BY_USER:
case ModuleConstants.EVENT_TYPE_RULE_POST_DELETE_BY_ADMIN:
if (sourceId > 0) {
source = postService.findOneById(sourceId);
}
if (targetId > 0) {
target = postService.findOneById(targetId);
}
Post post = (Post) target;
if (source != null) {
post = (Post) source;
}
_description = String.format(description,
ModuleConstants.POST_TYPE_DESC_MAP.get(post.getType()));
break;
// case ModuleConstants.EVENT_TYPE_RULE_GROUP_CREATE://暂时没有这种动态
case ModuleConstants.EVENT_TYPE_RULE_GROUP_JOIN_IN:
case ModuleConstants.EVENT_TYPE_RULE_GROUP_DELETE_BY_USER:
// case
// ModuleConstants.EVENT_TYPE_RULE_GROUP_DELETE_BY_ADMIN://暂时没有这种动态
if (sourceId > 0) {
source = groupService.findOneById(sourceId);
}
if (targetId > 0) {
target = groupService.findOneById(targetId);
}
Group group = (Group) source;
_description = String
.format(description,
ModuleConstants.GROUP_TYPE_DESC_MAP.get(group
.getType()));
break;
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_CREATE:
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_DELETE_BY_USER:
case ModuleConstants.EVENT_TYPE_RULE_COMMENT_DELETE_BY_ADMIN:
target = commentService.findOneById(targetId);
Comment comment = (Comment) target;
int commentType = comment.getType();
if (commentType == ModuleConstants.COMMENT_TYPE_ANSWER) {
source = answerService.findOneById(sourceId);
answer = (Answer) source;
project = (Project) answer.getTarget();
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
} else if (commentType == ModuleConstants.COMMENT_TYPE_PROJECT) {
source = projectService.findOneById(sourceId);
project = (Project) source;
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
} else if (commentType == ModuleConstants.COMMENT_TYPE_POST) {
source = postService.findOneById(sourceId);
post = (Post) source;
_description = String.format(description,
ModuleConstants.POST_TYPE_DESC_MAP.get(post
.getType()));
} else {
}
break;
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_CREATE:
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_BEEN_SET_PERFECT:
source = projectService.findOneById(sourceId);
target = answerService.findOneById(targetId);
project = (Project) source;
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
break;
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_GET:
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_DELETE_BY_USER:
case ModuleConstants.EVENT_TYPE_RULE_ANSWER_DELETE_BY_ADMIN:
source = answerService.findOneById(sourceId);
answer = (Answer) source;
Project _project = (Project) answer.getTarget();
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
_project.getType()).getDesc());
break;
case ModuleConstants.EVENT_TYPE_RULE_REPUTATION_CREATE:
if (sourceId > 0) {
source = reputationService.findOneById(sourceId);
}
if (targetId > 0) {
target = reputationService.findOneById(targetId);
}
break;
case ModuleConstants.EVENT_TYPE_RULE_USER_FOLLOW:
source = userService.findOneById(sourceId);
User _user = (User) source;
_description = String
.format(description,
"" + _user.getName() + "");
break;
case ModuleConstants.EVENT_TYPE_RULE_MENTION_COMMENT:
target = commentService.findOneById(targetId);
comment = (Comment) target;
commentType = comment.getType();
if (commentType == ModuleConstants.COMMENT_TYPE_ANSWER) {
source = answerService.findOneById(sourceId);
answer = (Answer) source;
project = (Project) answer.getTarget();
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
} else if (commentType == ModuleConstants.COMMENT_TYPE_PROJECT) {
source = projectService.findOneById(sourceId);
project = (Project) source;
_description = String.format(
description,
ModuleConstants.PROJECT_TYPE_DESC_MAP.get(
project.getType()).getDesc());
} else if (commentType == ModuleConstants.COMMENT_TYPE_POST) {
source = postService.findOneById(sourceId);
post = (Post) source;
_description = String.format(description,
ModuleConstants.POST_TYPE_DESC_MAP.get(post
.getType()));
} else {
}
break;
case ModuleConstants.EVENT_TYPE_RULE_MENTION_POST:
source = postService.findOneById(sourceId);
break;
default:
_description = description;
}
extend.put("description", _description);
eventRule.setExtend(extend);
eventRule.setExtendJson(extend.toString());
event.setEventRule(eventRule);
event.setSource(source);
event.setTarget(target);
} catch (Exception e) {
logger.error("Fail to setSourceAndTarget event:" + event);
}
}freemarker显示层转换核心代码:
<#switch event.eventRule.type> <#case event_type_rule_post_create> <@event_post_macro event.target/> <#break> <#case event_type_rule_project_create> <@event_project_macro event event.target/> <#break> <#case event_type_rule_project_view> <#case event_type_rule_project_collect> <#case event_type_rule_project_reward> <@event_project_macro event event.source/> <#break> <#case event_type_rule_comment_create> <@event_comment_macro event event.target/> <#break> <#case event_type_rule_answer_create> <@event_answer_macro event event.target/> <#break> <#case event_type_rule_answer_get> <#case event_type_rule_answer_been_set_perfect> <@event_answer_macro event event.source/> <#break> <#case event_type_rule_mention_comment> <@event_comment_macro event event.target/> <#break> <#case event_type_rule_mention_post> <@event_post_macro event.source/> <#break> #switch>
比如其中一种event type的freemarker macro代码如下:
<#macro event_post_macro post>
${post.contentExt}
${post.thirdSort}
#macro>这样的设计符合高内聚低耦合的设计思路,未来可以根据业务实现无限扩张,当然代价就是event表越来越大,但可以通过分库分表来分担压力,大家可以参考下,有好的意见可以留言。
