仿牛客论坛项目总结

一.数据库中每一张表有哪些字段

user表  用户表

(1)id  用户的id  (2) username  用户名 (3)password   密码 (4)salt  盐 (5)emai邮箱

(6)type 类型   (7)status 状态   (8)activationCode 激活码  (9)headerUrl  头像存放路径
(10) createTime  创建时间

discuss_post   帖子表

(1)id  每一个帖子的id

(2)user_id   记录这个帖子由哪个用户发布的,记录这个用户的id,显然,这个字段是可以用来和user表进行关联的

(3)title  帖子的标题

(4)content  帖子的内容,由于帖子的内容比较长,所以这个字段的数据类型是text类型

(5)type  帖子的类型,0表示这是一个普通帖子,1表示这是一个置顶帖子

(6)status  帖子的状态,0表示这是一个正常的帖子,1表示是精华帖,2表示被拉黑了

(7)create_time  帖子的创建时间  数据类型是timestamp

(8)comment_count表示这个帖子的评论的数量

(9)score  帖子的分数,用来给帖子进行排名用的

comment评论表

(1)id  主键

(2)user_id  是谁评论的

(3)entity_type   对谁进行评论(比如说1代表对帖子进行评论  2代表对帖子评论进行评论)

(4)entity_id   对谁进行评论的id,比如对帖子A进行评论,那就是帖子A的主键ID

(5)content  评论的具体内容

(6)status  状态0表示正常,状态1表示不可用

(7)create_time   创建时间

login_ticket  登录凭证表

(1)id主键字段

(2)user_id 表明这一行是哪个用户的登录凭证

(3)ticket凭证 一个随机字符串,作为唯一标识

(4)status  状态,凭证是否有效,0表示正常,1表示无效

(5)expired  什么时候过期,数据类型是timestamp,也就是说凭证会到期自动失效

message表   私信表

(1)id  主键字段

(2)from_id  消息发送人的id

(3)to_id  消息接收方的id

(4)conversation_id 用来唯一标志这个会话(比如from_id是111,to_id是112,因此conversation_id是111_112,from_id是112,to_id是111,conversation_id还是111_112)

(5)content 发送的内容

(6)status  0表示未读,1表示已读

(7)create_time  表示发送时间

二.功能

1.分页查询功能:每页显示十个帖子,去discuss_post 讨论帖这张表中查找(用户登录了的话,拉黑的帖子就不会在显示了status!=2)

select id,user_id,title,content,type,status,create_time,comment_count,score
from discuss_post
where status!=2
order by type desc,create_time desc
limit 0  10

type=1表示置顶帖子,先把置顶帖放在前面,然后再比较创建顺序,按照创建顺序来排序

limit后面跟两个参数,第一个参数每一页起始行的行号,第二个参数每一页最多显示多少条数据

另一个功能:我发布过的帖子功能,也是去discuss_post 讨论帖这张表中查找,查找这个表中user_id这个字段等于登录用户的id的行

2.用户注册功能

 点击首页的注册按钮,就可以进行注册:

 通过表单提交数据,后端检查注册的账号是否已经存在,邮箱是否已经被注册(去user表中查)

select xxxxx  from  user  where  email=xxxxx

然后给输入的邮箱发送激活邮件(这里实现了发送邮件功能,通过导入spring mail的maven坐标依赖)

用户点击激活邮件中的链接,注册成功,跳转到登录页面

成功向user表中插入一条数据

4.退出功能

将登录凭证修改为失效状态,然后跳转到网站首页(未登录状态)

5.使用拦截器拦截用户没有登录有些页面无法访问

6.发布帖子

点击发布,输入标题和内容,点击发布,然后通过ajax提交给数据库,页面还是在刚才的页面

其实就是往discuss_post这张表里面添加一行数据

需要你先登录才可以发布帖子

规定敏感词,使用前缀树将敏感词全部替换为*

7.给帖子评论

往comment表里面添加一行数据

8.点赞功能

9.利用kafka给用户发送通知

当有人给用户发布的帖子评论了,给用户发送通知

当有人给用户发布的帖子点赞了,给用户发送通知

当有人关注了用户,给用户发送通知

 评论,点赞,关注分别是一个主题topic

这是一个论坛系统,实现了登录,注册,发帖,评论,点赞,关注等功能

技术栈:SpringMVC,Mybatis,Springboot,Mybatis,

并且使用AOP来统一记录日志

使用kafka来给用户异步发送系统通知(点赞,关注,评论)

项目中用到redis的地方:

(1)存储用户登录凭证

(2)实现点赞   使用set数据结构,key为点赞对象的id,value保存的是点赞人的id

(3)实现关注 使用zset数据结构(有序set),key是被关注人的id,value是关注人的那个id,score是关注时间

(4)存储登录的时候需要的验证码

(5)使用Redis中的HyperLogLog数据结构来统计UV


 

面试常见问题:

1.讲一下IOC,AOP

2.SpringMVC

3.注册功能怎么实现

点击首页的注册按钮,就可以进行注册:

 通过表单提交数据,服务端接收到数据之后在后台查询账号是否已经被注册,邮箱是否已经被注册,如果没有,服务端就发送一封激活邮件给注册的邮箱(发送邮件功能,通过导入spring mail的maven坐标依赖),用户点击邮箱中的链接,成功激活

其实就是在user表中插入一行数据

这里比较需要注意的是:md5加密,数据库存储用户的密码的时候存储用户密码的MD5值(128位)。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码,用户登录的时候,用户输入的密码md5加密之后的结果如果和数据库中的MD5值相等,就表明密码正确

更具体来说是将密码和盐进行字符串拼接(字符串=密码+盐)

然后将拼接好的字符串进行md5加密

//生成盐,其实就是长度为5的字符串
user.setSalt(CommunityUtil.generateUUID().substring(0,5));

//密码和盐进行拼接
String  password=user.getPassword()+user.getSalt();

//进行md5加密后存入数据库
user.setPassword(CommunityUtil.md5(password);

刚开始status字段是0,表示无效,进行激活处理之后就变成1,表示有效

4.登录功能

使用kaptcha工具类生成验证码

登陆成功,生成登录凭证(往login_ticket登录凭证表中插入一条数据),然后将凭证发放给客户端(把ticket字段也就是一个字符串返回给客户端即可,把ticket放到cookie里面),页面跳转到首页index.html

如果失败,跳转回登录页面 

5.登录状态保存在哪里?

最开始是保存在数据库里面,有一个login_ticket登录表,里面有一个ticket字段,用户登录了就会在这个表里面插入一行数据

当一个请求来了,看这个请求里有没有ticket字符串,如果这个ticket字符串和login_ticket表某条记录里面的ticket字段相等,有,就表明用户登录了,如果用户退出,就把请求request里面的ticket删除

后来用redis进行优化,key是ticket字符串,value是序列化对象

使用 Redis 存储登录凭证后,login_ticket表就不需要了

6.项目里面哪里用到了AOP

打印日志的时候,在方法调用前打印日志的时候使用到了AOP

AOP 面向切面编程_Pr Young的博客-CSDN博客

将打印日志功能封装成一个切面,织入到目标对象的连接点位置

7.项目中redis怎么用的

redis存储验证码:之前是保存在服务端的session里面,现在保存在redis中(设置过期时间为60s),

用户刷新验证码,生成一个随机字符串fae737adc5eb41eaa189334f9d152d4e,验证码的值是4ZBT,在cookie中存储:

kaptchaOwner:fae737adc5eb41eaa189334f9d152d4e  //60s后删除

 redis中存储:

fae737adc5eb41eaa189334f9d152d4e:4ZBT

8.Ajax:局部刷新

9.点赞功能如何实现?

  这是一个使用频率非常高的功能,尤其是一个大牛的号,发了帖子,短时间会有大量的人给他点赞

//执行点赞  

//第一个参数表示点赞用户的id,第二个参数是帖子的id
//表示userid这个用户给entityid这个帖子点赞
  
public void  like(int userId,int entityId)
{
   
     

}

使用set数据结构,key为被点赞对象的id(也就是帖子的id),value保存的是点赞人的id,所以一个kv键值对表示的是一条帖子有哪些用户给它点赞

举例:id为275,376,555的用户给id为123的帖子点赞,redis中存储如下键值对:

123->{275,376,555}

第一次点赞,第二次取消(第二次点赞的时候先查询一下是否已经有了帖子id-用户id这条key-value,,有的话说明是第二次重复点赞了,于是取消点赞,也就是从set中移除这个用户的id)

同时也可以显示帖子的点赞总数量(查询某条帖子的点赞数量:传入这条帖子的id,求出点赞数量)

10.关注和取消关注功能怎么实现:

也是用redis,key是被关注人的id,value是关注人的id组成的set,跟点赞功能很像,score是关注时间

11.使用Elasticsearch进行帖子搜索

帖子发布之后就保存到Elasticsearch服务器中

elasticsearchService.searchDiscussPost()

12.SpringSecurity代替拦截器进行登录检查

我还是说用拦截器检查用户是否登录吧

  • 3
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kafka是一个高性能的分布式消息队列系统,可以实现高吞吐量、低延迟的消息传递。它支持点对点和发布-订阅两种消息传递模式。在仿牛客项目中使用Kafka可以实现消息的异步处理和分布式架构。 使用Kafka的第一步是创建一个主题(topic),主题既是消息的类别,也是消息在Kafka中的存储位置。可以使用命令行工具kafka-topics.bat来创建主题。例如,可以使用以下命令来创建一个名为test的主题: bin\windows\kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test 上述命令中,--bootstrap-server参数指定了Kafka服务器的地址和端口,--replication-factor参数指定了主题的副本数,--partitions参数指定了主题的分区数。创建主题后,可以向主题中发送消息,并由消费者进行消费。 要列出已经存在的主题,可以使用以下命令: kafka-topics.bat --list --bootstrap-server localhost:9092 需要注意的是,以上命令中的localhost:9092是Kafka服务器的地址和端口,根据实际情况进行修改。 总结起来,在仿牛客项目中使用Kafka,首先需要创建一个主题,然后可以使用相关命令行工具进行消息的发送和消费。这样可以实现消息的异步处理和分布式架构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [仿牛客论坛项目学习记录——5 Kafka 构建TB级异步消息系统](https://blog.csdn.net/dadayangpei/article/details/127173098)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值