一.数据库中每一张表有哪些字段
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
将打印日志功能封装成一个切面,织入到目标对象的连接点位置
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代替拦截器进行登录检查
我还是说用拦截器检查用户是否登录吧