最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

最代码网站中关于动态表event的设计思路

来源:动视网 责编:小采 时间:2020-11-09 15:04:11
文档

最代码网站中关于动态表event的设计思路

最代码网站中关于动态表event的设计思路:原文:最代码网站中关于动态表event的设计思路 为了能将最代码整站用户的操作都展现出来,需要设计一种动态类型,既可以根据业务无限扩展,也可以指定某些用户行为是可以产生多少牛币交换的,这样就在原先javaniu的零散的表设计基础上抽象出event表 表结
推荐度:
导读最代码网站中关于动态表event的设计思路:原文:最代码网站中关于动态表event的设计思路 为了能将最代码整站用户的操作都展现出来,需要设计一种动态类型,既可以根据业务无限扩展,也可以指定某些用户行为是可以产生多少牛币交换的,这样就在原先javaniu的零散的表设计基础上抽象出event表 表结


这样就囊括了所有会出现的用户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>
	

比如其中一种event type的freemarker macro代码如下:

<#macro event_post_macro post>
	
	${post.contentExt}
	
	 ${post.thirdSort}
	
	

这样的设计符合高内聚低耦合的设计思路,未来可以根据业务实现无限扩张,当然代价就是event表越来越大,但可以通过分库分表来分担压力,大家可以参考下,有好的意见可以留言。

文档

最代码网站中关于动态表event的设计思路

最代码网站中关于动态表event的设计思路:原文:最代码网站中关于动态表event的设计思路 为了能将最代码整站用户的操作都展现出来,需要设计一种动态类型,既可以根据业务无限扩展,也可以指定某些用户行为是可以产生多少牛币交换的,这样就在原先javaniu的零散的表设计基础上抽象出event表 表结
推荐度:
标签: 网站 设计 动态
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top