仿牛客网社区Web开发项目代码逐行精读(更新中)
仿牛客网社区Web开发项目
-
- 怎么看项目?
- 如何调试
- 项目前瞻
-
- 技术架构
- 项目亮点
- 开始看代码
-
- LoginController
- DiscussPostController
怎么看项目?
- pom.xml看技术架构
- resource看配置文件,这个项目是前后端不分离的
- 以调试为导向,从前端入手
检查
- 先看controller,只做调用;调用service,实现具体业务;service还会调用其他service
- 后看dao,这个项目是dataSource,与数据库相关
- 深入源码
如何调试
- 网页检查,看
Network
,Header
是发送的请求,Preview
是响应信息 - 找到接口,如:
Login
- 找到该接口的
.java
文件,打断点调试,查看所带参数 - 再进到方法中,打断点,
F8
执行到下一断点
项目前瞻
技术架构
- 核心框架:SpringBoot SSM
- 持久层框架:Mybatis
- 日志管理:SLF4J
- 模板框架: ElasticSearch
- 项目管理框架: Maven
- 消息队列:Kafka
- 缓存框架:Redis
- 其他:Spring Security、Quatz、Caffeine
项目亮点
参考文章
- 项目构建在Spring Boot+SSM框架之上,并统一的进行了状态管理、事务管理、异常处理;
- 利用Redis实现了点赞和关注功能;
- 利用Kafka实现了异步的站内通知;
- 利用ElasticSearch实现了全文搜索功能,可准确匹配搜索结果,并高亮显示关键词;
- 利用Caffeine+Redis实现了两级缓存,并优化了热门帖子的访问。
- 利用Spring Security实现了权限控制,实现了多重角色、URL级别的权限管理;
- 利用HyperLogLog、Bitmap分别实现了UV、DAU的统计功能,100万用户数据只需*M内存空间;
- 利用Quartz实现了任务调度功能,并实现了定时计算帖子分数、定时清理垃圾文件等功能;
- 利用Actuator对应用的Bean、缓存、日志、路径等多个维度进行了监控,并通过自定义的端点对数据库连接进行了监控。
开始看代码
启动zookeeper
bin\\windows\\zookeeper-server-start.bat config\\zookeeper.properties
启动server
bin\\windows\\kafka-server-start.bat config\\server.properties
LoginController
- 首先,总体上看看这个Controller包含哪些模块:
- 未登录前,可以点击按钮得到注册和登录界面
- 注册功能模块
- 激活用户
- 验证码模块
- 检查账号密码
- 登出
- Get、Post与Put
- POST /url 创建
- DELETE /url/xxx 删除
- PUT /url/xxx 更新
- GET /url/xxx 查看
- 注册功能模块先调用userService,userService:
- 初始化一个HashMap,用于存放提示信息
- 先进行空值处理,若参数为空直接返回
- 调用userMapper,通过查询检查用户名和邮箱是否已经存在
- 通过MD5算法对密码加密
- 对User实体类创建的对象user,设置必要的数据,存入数据库
- 通过TemplateEngine 和Context 的配合,使用thymeleaf模版来生产html文件
- 调用MailClient工具类发送邮件,即上一步生成的html文件
- 激活模块调用userService,用不同数值来表示不同激活状态
- 验证码模块:
- 服务器通过Cookie将验证码和用户标识发送给浏览器
- 将验证码放入Redis,设置过期时间60s
- 通过字节流向浏览器传输图片
- 检查账号密码:
- 对密码进行md5加密,判断是否正确
- 生成登录凭证,并将其存入Redis
- 将登录凭证通过Cookie发送给浏览器
DiscussPostController
-
首先,总体上看看这个Controller包含哪些模块:
- 发帖
- 获取帖子详情页面
- 置顶
- 加精
- 删帖
-
发帖模块:
-
先创建DiscussPost实体对象
-
调用discussPostService
- discussPostService调用sensitiveFilter过滤敏感词,原理
-
创建Event实体对象
- 设置主题类型:有六种:评论、点赞、关注、分享长图、发帖、删帖。此处是发帖
- 设置实体类型,有三种:帖子、评论、用户。此处是帖子
-
调用eventProducer,生产者发布消息
-
把帖子放入Redis中
-
-
获取帖子详情页面:
- 查询帖子,根据帖子查询作者
- 调用likeService查询点赞数量和当前用户对这个帖子的点赞状态
- 遍历评论列表,创建评论VO(Value Object)列表,这个列表是要给用户看的。将查询到的数据put到Map,再add到List,最后放入model中。model中存放了数据,再经过渲染得到View,呈现给用户,这不就体现了Spring MVC嘛!
-
置顶、加精和删帖:
- 设置不同的类型和主题,发布事件