程序员讨论社区
gitee开源链接
一、技术架构
- Spring Boot
- Spring 、SpringMVC、Mybatis
- Redis、Kafka、Elasticsearch
- Spring Security、Spring Actuator
前端:html、css、js、thymeleaf模版引擎
后端:spring、springmvc、mybatis 后期过渡到springboot
数据库:mysql、redis
中间件:kafka、elasticsearch
二、搭建开发环境
-
Apache Maven
负责构建项目、管理项目中的jar包
-
IntelliJ IDEA
Java集成开发工具
三、开发具体功能
-
首页模块
-
注册模块
-
发送邮件功能
- 邮箱设置:启用客户端SMTP服务
- Spring Email:使用JavaMailSender发送邮件
- 模版引擎:使用Thymeleaf发送HTML邮件
-
注册功能详细流程
- 访问注册页面
- 提交注册数据(表单提交数据》服务端验证账号是否已经存在以及邮箱是否已经被注册〉服务端发送激活邮件)
- 激活注册账号(点击邮件中的链接,访问服务端的激活服务)
-
-
登陆模块
-
会话管理
Cookie,由于服务器发送到浏览器,并保存在浏览器的一小块数据
浏览器下次访问该服务器时,会携带该cookie给服务器
Session,是JavaEE的标准,用于在服务端记录客户端的信息,数据存放在服务端更加安全,但是也会增加服务端的内存压力
-
生成验证码
Kaptcha
导入jar包
编写Kaptcha配置类
生成随机字符、生成图片
-
开发登录、退出功能
- 访问登录页面
- 登录(验证账号、密码、验证码=》成功生成登录凭证发给客户端,失败跳回登录页)
- 退出(将登陆凭证修改为失效状态=〉跳转至网站首页)
-
显示登录信息
拦截器应用
在请求开始时查询登录用户
在本次请求中持有用户数据
在模版视图上显示用户数据
在请求结束时清理用户数据
-
账号设置
-
修改头像
上传文件:
请求:必须是POST请求
表单:enctype = “multipart/form-data”
Spring MVC:通过MultipartFile处理上传文件
-
修改密码
-
-
四、开发核心功能
To do
修改密码、删除私信
-
过滤敏感词
用前缀树构建敏感词过滤器
-
发布帖子
使用AJAX实现异步请求
用AJAX请求,实现发布帖子的功能
-
帖子详情
显示标题、作者、发布时间、帖子正文等内容
-
事务管理
-
显示评论
-
添加评论--运用事务管理
数据层:
增加评论数据
修改帖子的评论数量
业务层:
处理添加评论的业务:
先增加评论、在更新帖子的评论数
表现层:
处理添加评论数据的请求
设置添加评论的表单
-
私信列表
私信列表:
查询当前用户的会话列表
每个会话只显示一条最新的私信
支持分页显示
私信详情:
查询某个会话所包含的私信
支持分页显示
-
发送私信
发送私信:
采用异步的方式发送私信
发送成功后刷新私信列表
设置已读:
访问私信详情
将显示的私信设置为已读状态
-
统一异常处理
@ControllerAdvice
用于修饰类,表示该类是Controller的全局配置类
在此类中,可以对Controller进行如下三种配置:
异常处理方案、绑定数据方案、绑定参数方案
@ExceptionHandler
用于修饰方法,该方法会在Controller出现异常后被调用,用于处理捕获后的异常
@ModelAttribute
用于修饰方法,该方法会在Controller方法执行前被调用,用于为model对象绑定参数
@DataBinder
用于修饰方法,该方法会在Controller方法执行前被调用,用于绑定参数的转换器
-
统一记录日志
AOP 面相切面的实现
AOP实现:
1.ASpectJ
是语言级实现,扩展了Java语言,定义了AOP语法
是在编译期织入的代码,它有一个专门的编译器,用来生成遵守java字节码规范的class文件
2.Spring AOP
使用纯java实现,它不需要专门的编译过程,也不需要特使的类装载器
在运行时通过代理的方式织入代码,只支持方法类型的连接点
Spring支持对AspectJ的集成
而Spirng AOP采用代理只如,代理有两种方式:
1.JDK动态代理
Java提供的动态代理技术,可以在运行时创建接口的代理实例
SPring AOP默认采用此方式,在借口的代理实例中织入代码
2.CGLib动态代理
采用底层的字节码技术,在运行时创建子类代理对象
当目标对象不存在接口时,Spring AOP会采用此种方式,在子类实例中织入代码
四、整合Redis开发点赞与粉丝模块
-
为什么选择Redis
- Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构,字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有续集合(sorted sets)等
- Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,同时,Redis还可以将内存中的数据以快照或日志的形式保存到硬盘上,以保证数据的安全性
- Redis典型的应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等
-
点赞功能的开发
-
点赞:
支持对帖子、评论点赞
第1次点赞,第2次取消点赞
-
首页点赞数量
统计帖子的点赞数量
-
详情页点赞数量
统计点赞数量
显示点赞状态
-
-
用户个人中心统计收到的赞
重构点赞功能
开发个人主页
以用户为key,记录点赞数量
-
关注、取消关注
需求:
- 开发关注、取消功能
- 统计用户的关注数、粉丝数
-
关注列表、粉丝列表
-
业务层
查询某个用户关注的人,支持分页
查询某个用户的粉丝,支持分页
-
表现层
处理“查询关注的人”、“查询粉丝”请求
编写“查询关注的人”、“查询粉丝“模板
-
五、优化登录模块
- 使用Redis存储验证码
- 验证码需要频繁的访问与刷新,对性能要求较高
- 验证码不需要永久保存,通常在很短的时间后就会失效
- 分布式部署时,存在Session共享问题
- 使用Redis存储登录凭证
- 处理每次请求时,都要查询用户的登录凭证,访问的频率较高
- 对数据库IO请求较多,故用Redis做优化
- 使用Redis缓存用户信息
- 处理每次请求时,都要根据凭证查询用户信息,访问的频率较高
- 用Redis对用户信息作缓存,减少服务器压力
六、整合Kafka实现消息通知
-
阻塞队列
- BlockingQueue
- 解决线程通信的问题
- 阻塞方法:put、take
- 生产者消费者模式
- 生产者:产生数据的线程
- 消费者:使用数据的线程
- 实现类
- ArrayBlockingQueue
- LinkedBlockingQueue
- PriorityBlockingQueue、SynchronousQueue、DelayQueue
- BlockingQueue
-
Kafka入门
- Kafka简介
- 是分布式的流媒体平台
- 应用:消息系统、日志收集、用户行为追踪、流式处理
- Kafka特点
- 高吞吐量、消息持久化、高可靠性、高扩展性
- Kafka术语
- Broker(服务器)、Zookeeper(管理集群)
- Topic、Partition、Offset
- Leader Repplica、 Follower Replica
- Kafka简介
-
发送系统通知
- 触发事件
- 评论后,发布通知
- 点赞后,发布通知
- 关注后,发布通知
- 处理事件
- 封装事件对象
- 开发事件的生产者
- 开发事件的消费者
- 触发事件
-
显示系统通知
- 通知列表
- 显示评论、点赞、关注三种类型的通知
- 通知详情
- 分页显示某一类主题所包含的通知
- 未读消息
- 在页面头部显示所有的未读消息数量
- 通知列表
七、整合Elasticsearch开发搜索功能
- 简介
- 一个分布式的、Restful风格的搜索引擎
- 支持对各种类型的数据的检索
- 搜索速度快,提供实时的搜索服务
- 便于水平扩展,每秒可以处理pb级海量数据
- 术语
- 索引、类型、文档、字段
- 集群、节点、分片、副本
评论区