仿牛客论坛项目全面大总结
开始总结
咋们就从核心功能处开始捋,一个一个功能点开始总结实现过程:
核心功能:
发帖:
点击发布帖子按钮,输入帖子标题内容等信息后发布,以JS异步请求的方式进行提交,首先判断该线程中有无用户信息(在登录成功是会将用户信息与本线程的id进行键值对存储,保证了多线程情况下安全)即判断有无登录,已登录则初始化帖子信息将其添加至DB中,并且触发发帖事件,采用kafka信息队列来完成,将帖子信息添加至ES中,通知再将其存入Redis中计算帖子的分值,用来在最热列表中展示出来:
添加帖子
// 发布帖子
@RequestMapping(path = "/add",method = RequestMethod.POST)
@ResponseBody
public String addDiscussPost(String title,String content){
User users = hostHolder.getUsers();
if(users == null){
return CommunityUtil.getJSONString(403,"你还没有登录!");
}
DiscussPost post=new DiscussPost();
post.setUserId(users.getId());
post.setTitle(title);
post.setContent(content);
post.setCreateTime(new Date());
discussPostService.addDiscussPost(post);
// 触发发帖事件 添加至es中
Event event = new Event()
.setTopic(TOPIC_PUBLISH)
.setUserId(users.getId())
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(post.getId());
eventProducer.fireEvent(event);
// 计算帖子分数
String redisKey= RediskeyUtil.getPostScoreKey();
redisTemplate.opsForSet().add(redisKey,post.getId());
return CommunityUtil.getJSONString(0,"发布成功!");
}
// 消费 发帖事件 es添加数据
@KafkaListener(topics = {TOPIC_PUBLISH})
public void handlePublishMessage(ConsumerRecord record){
if(record == null && record.value() == null){
logger.error("消息的内容为空!");
return;
}
Event event = JSONObject.parseObject(record.value().toString(), Event.class);
if(event == null){
logger.error("消息格式错误!");
return;
}
DiscussPost discussPost =
discussPostService.selectDiscussPostById(event.getEntityId());
elasticsearchService.saveDiscussPost(discussPost);
}
评论:
评论这一块数据库表comment结构得先捋一下,entity_type字段(int型)1:表示此条评论是对帖子进行的一个评论,2:表示此条评论是对1级评论进行的2级评论;entityId字段(int型&#x
sinat_59818620: 没有剩下的内容了吗
weixin_44927765: 楼主,请问项目难点是什么啊?麻烦具体回答一下下
骑驴去学习: 请问有源码可以学习一下吗?主要是想知道怎么对热门帖子的访问进行优化的
南川~北: 楼主有源码吗
qq_45039459: 楼主有完整代码不,想参考学习一下