这样就囊括了所有会出现的用户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表越来越大,但可以通过分库分表来分担压力,大家可以参考下,有好的意见可以留言。