一.数据库中每一张表有哪些字段
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表中插入一条数据
3.登录功能
使用kaptcha工具类生成验证码
登陆成功,生成登录凭证(往login_ticket登录凭证表中插入一条数据),然后将凭证发放给客户端(把ticket字段返回给客户端即可,把ticket放到cookie里面),页面跳转到首页index.html
如果失败,跳转回登录页面
4.退出功能
将登录凭证修改为失效状态,然后跳转到网站首页(未登录状态)
5.使用拦截器拦截用户没有登录有些页面无法访问
6.发布帖子
点击发布,输入标题和内容,点击发布,然后通过ajax提交给数据库,页面还是在刚才的页面
其实就是往discuss_post这张表里面添加一行数据
需要你先登录才可以发布帖子
规定敏感词,使用前缀树将敏感词全部替换为*
7.给帖子评论
往comment表里面添加一行数据
8.点赞功能 这是一个使用频率非常高的功能,尤其是一个大牛的号,发了帖子,短时间会有大量的人给他点赞
第一次点赞,第二次取消,可以显示帖子的点赞总数量
//执行点赞
public void like(int userId,int entityType,int entityId)
{
//第一个参数表示哪个用户点的赞,第二个参数点赞类型:给帖子点赞还是给帖子的评论点赞
//第三个参数是帖子的id或者评论的id,表示给谁点赞
}
//
9.利用kafka给用户发送系统通知
当有人给用户发布的帖子评论了,给用户发送系统通知
当有人给用户发布的帖子点赞了,给用户发送系统通知
当有人关注了用户,给用户发送系统通知
评论,点赞,关注分别是一个主题topic
面试常见问题:
1.注册功能怎么实现
点击首页的注册按钮,就可以进行注册:
通过表单提交数据,服务端接收到数据之后在后台查询账号是否已经被注册,邮箱是否已经被注册,如果没有,服务端就发送一封激活邮件给注册的邮箱(发送邮件功能,通过导入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,表示有效
2.登录状态保存在哪里?
最开始是保存在数据库里面,有一个login_ticket表,里面有一个ticket字段,用户登录了就会在这个表里面插入一行
当一个请求来了,看这个请求里有没有ticket,如果这个ticket在login_ticket表里面保存了,,就表明用户登录了,如果用户退出,就把请求里面的ticket删除
后来用redis进行优化,将登录凭证保存在redis里面,key是ticket字段,value是这个login_ticket表对应的一个login_ticket实体类的对象,代表这个ticket字段代表的这一行
3.项目里面哪里用到了AOP
打印日志的时候,在方法调用前打印日志的时候使用到了AOP
AOP 面向切面编程_Pr Young的博客-CSDN博客
将打印日志功能封装成一个切面,织入到目标对象的连接点位置
4.redis怎么用的
缓存点赞和关注:用户id为key,
缓存粉丝列表:采用的数据结构为zset,粉丝的id是key,value是关注的时间戳,zcard可以获取粉丝数量
缓存验证码
缓存登录凭证