发帖步骤 牛客网项目过程记录
数据库表 用户表 user 字段 类型 备注
id
int
主键、自增
用户名,创建索引
用户密码
salt
加密盐值
用户邮箱,创建索引
type
int
用户类型:0 普通、1 管理员、2 版主
int
用户状态:0 未激活、1 已激活
激活码
用户头像地址
注册时间
评论表 字段 类型 备注
id
int
主键、自增
int
评论的用户 id,创建索引
int
评论实体 id,创建索引
int
评论实体类型:1 帖子评论、2 评论回复
int
评论目标 id
text
评论内容
int
评论状态:0 有效、1 无效
评论发表时间
帖子表 字段 类型 备注
id
int
主键、自增
int
发帖的用户 id,创建索引
title
帖子表标题
text
帖子内容
type
int
帖子类型:0 普通、1 置顶
int
评论数量
int
帖子状态:0 普通、1 精华、2 拉黑
评论发表时间
用户登录凭证表 字段 类型 备注
id
int
主键、自增
int
登录用户 id
登录凭证,随机字符串
int
登录状态:0 有效、1 无效
过期时间
消息表 字段 类型 备注
id
int
主键、自增
int
发消息的 id,创建索引
to_id
int
收消息的 id,创建索引
会话 id,由通信双方 id 拼接,创建索引
text
消息内容
int
消息状态:0 未读、1 已读、2 删除
消息发送时间
开发社区首页 搭建基本环境
构建 的 maven 项目,引入 mysql 和 依赖。
在 . 配置文件中:
创建 数据库和数据库表。
用户相关操作:
开发社区首页( 表)
功能拆分:开发社区首页,显示前 10 个帖子。开发分页组件,分页显示所有帖子。
用到的表是 数据库表,包括帖子 id、发帖人 id、标题、内容、类型、状态、发帖时间、评论数量(为了提高效率,避免关联查询,因此冗余存储)、分数(用于进行热度排名)。
开发数据层
帖子相关操作:
创建 -.xml。
开发业务层
创建 类,可以分页查询帖子和帖子数量。
创建 类,实现根据 id 查询用户功能,因为显示帖子时不显示用户 id,而是显示用户名。
开发视图层
把静态资源 css、html、img、js 放到 目录下。
把模板 mail、site、index.html 放到 目录下。
创建 , 方法,用 map 集合把帖子和用户封装到一起。
修改 index.html,使用 动态替换。
【问题】使用帖子关联查询用户时,给查询用户的 方法传入了帖子的 getId 方法,应该是 方法。
开发分页组件
创建 Page 实体类,封装分页信息,包括当前页码、显示限制、帖子总数、查询路径等。显示的起始页不能小于 1,最大页不能超过 total。
在 index.html 中,当 page.rows > 0 时显示分页信息。
如果 page. 等于 1 或 page.total,代表是首页或末页,此时不能点击上一页和下一页,用 属性实现。
开发注册登录模块 发送邮件
在新浪邮箱打开 SMTP 服务。
引入 -boot–mail 依赖。
在配置文件配置主机、端口、发送邮箱、授权码等。
创建 类,调用 发送邮件。
使用 发送 HTML 邮件,调用 把信息封装到 HTML 模板。
【问题】发送邮件成功但没接收到,在垃圾箱中可找到。
注册功能
把 .html 地址关联到首页的注册 href 属性。
设置域名、创建 工具类,在工具类创建生产随机字符串和 MD5 加密方法。
创建 ,创建 方法,跳转注册页面。
在 中创建 方法,判断注册信息合规后插入数据库,发送激活邮件。
在 创建 方法,调用 的 方法。
创建接口 ,定义激活码的三种状态,成功、重复、失败,让 和 实现该接口。
点击激活邮件的 url 【本地服务器的url】后,服务器通过 的 方法查询数据库用户,如果 url 中的激活码和设置的一样,就把用户 改为 1。
生成验证码
在 pom.xml 导入 的 jar 包。
创建配置类 ,设置验证码的大小、范围、长度等。
在 类新增 方法生成验证码图片。
在 login.html 中,将刷新验证码的链接绑定 方法,通过 id 选择器获取 img 组件,重新访问 方法生成验证码图片。
【问题】由于访问同一个生成验证码路径,需要在 url 参数加上一个随机数字,保证会重新请求获取新图片。
登录退出功能( 表)
登录成功时,需要生成一个登录凭证发送给客户端。凭证可以在多个业务中连续地验证用户的登陆状态,凭证信息存储在 数据库表中, 的 0 和 1 表示有效和无序, 表示过期时间。
创建对应 表的 实体类,对应 数据库表。
创建 接口,通过 @、@、@ 注解来插入、查询、更新凭证。
在
在
在 login.html 绑定登录链接,index.html 绑定退出登录链接。
【问题】登录成功后,创建了凭证,但忘记将凭证信息插入数据库。
显示登录信息
创建 工具类,通过 name 查询对应 的 value。
在 中新增 方法,根据 查询 。
创建 类用来模拟 的功能,利用 实现,存储用户信息。
创建 or 拦截器,实现 接口。
创建 配置类,实现 接口,配置 or,拦截除了静态资源之外的所有路径。
上传头像
在 新增 方法,更改指定用户的头像。
创建
调整 .html 的 form 表单, =”post”,=”/form-data”,并设置提交路径。
修改密码
在 中新增 方法,判断原密码是否正确,正确则修改密码并返回 1,否则返回 0。
在 中新增 方法,根据 的 方法的返回值判断原密码是否成功修改,封装为 JSON 数据并返回。
在 .html 中
【问题】js 的虚拟路径问题,需要加上 ../。
【问题】使用 ajax 请求时,表单按钮类型必须是 ,不能是 ,否则 405 报错。
【问题】使用 ajax 请求时, 中方法的返回值必须是 JSON 数据,并且需要加上 @。
【问题】使用 ajax 请求时,回调函数需要先对返回的 JSON 数据进行解析再使用。
检查登录状态
利用拦截器,实现只处理带有自定义注解的方法,防止用户在未登录情况下通过 url 访问没有权限的页面。
创建 @ 自定义注解,作用范围在方法上,有效期为运行时。
在 中需要在登录状态下调用的方法,访问设置页面、修改密码、上传头像等加上自定义注解。
创建 ptor 拦截器,在 方法中判断方法是否加了 @ 注解,如果加了注解并且此时从 中获取不到用户则拒绝访问。
在 配置类配置 ptor,拦截除了静态资源之外的所有路径。
开发核心功能 敏感词过滤
利用字典树数据结构解决。
创建 类
【问题】判断子节点空时,直接添加了一个 new 的子节点,没有将对象赋值给子节点变量。
发布帖子
引入 依赖,在 中新增 方法封装 JSON 信息。
在 接口新增 方法,并在 -.xml 配置 语句。
在 新增 方法调用 的 方法,其中需要进行对标题内容和发帖内容进行 HTML 转义以及过滤敏感词。
创建 r 类,新增 方法,调用 的 方法发帖。
在 index.html 中为发帖按钮绑定函数,利用 Ajax 向 r 的 方法发送 POST 请求。
显示帖子内容
在 接口新增 d 方法,在 -.xml 配置 语句。
在 新增 方法调用 的 d 方法。
在 r 新增 方法,调用 的 方法查询帖子内容,将 对象和 User 对象(通过 查询,不在 DAO 层关联查询)数据存放到 Model 对象,返回模板 -。
在 -.html 取出 Model 对象存放的数据绑定到对应组件显示。
显示评论( 表)
创建 表对应的实体类 。
创建 接口
创建 类
在 r 的 方法中增加查询帖子评论和回复的逻辑,将结果存储在 Model 对象。
【问题】sql 的 xml 文件中绑定参数时,应传入实体类属性名,拼错成数据库字段名( 写成 )。
添加评论
在 接口新增 方法,添加评论数据,在 – 配置对应 sql。
在 接口新增 方法,增加评论数量,在 – 配置对应 sql。
在 类新增 方法,调用 的 方法。
在 类新增 方法,调用 的 新增评论,并调用 的 更新评论数量,使用 @ 注解保证事务。
创建 类,新增 方法,从 获取用户信息,然后调用 的 方法添加评论。
【问题】sql 的 xml 文件中绑定参数时,应传入实体类属性名,拼错成数据库字段名( 写成 )。
显示私信列表 ( 表)
创建对应 表的实体类 。
创建 接口,增加查询会话列表、会话数量、私信列表、私信数量、未读私信数量等方法,在 -.xml 中配置对应的 sql。
创建 ,调用 中的方法。
创建
发送私信
在
在
在
统一异常处理
在 中增加 方法,返回错误页面。
创建 类
统一日志处理
在 pom.xml 引入 的依赖。
创建 类,添加 @ 切面注解,配置切入点表达式,拦截所有 包下的方法,利用 @ 记录日志。
Redis 点赞
创建 工具类
创建业务层的 类
创建表现层的 类
(更新首页帖子点赞数量)在表现层的 类
收到的赞
对点赞功能进行重构
在 工具类
在 中
增加 方法,以用户 id 作为 key,调用 get 方法查询用户所获得的点赞数。
在 中给 like 方法增加 参数即可。
关注
在 工具类
创建业务层的 类
新增 方法,当用户取消关注某实体时, 个人主页
在业务层的 类
在 中新增 方法获取个人主页。
关注列表和粉丝列表
在业务层的 类
在表现层的 类
优化登录模块
存储验证码
在 工具类
在表现层的 类
存储登录凭证
在 工具类
在业务层的 类
缓存用户信息
在 工具类
在业务层的 类
Kafka 发送系统通知
在 接口中新增三个常量,代表三个主题:评论、点赞、关注。
创建 Event 类,封装事件对象,包括主题、用户 id、实体类型、实体 id、实体用户 id 以及一个 map 集合存放其它信息。
触发事件
创建 事件生产者,新增 (Event event) 方法,通过 Event 获取事件类型,并将其封装成 JSON 数据,然后调用注入的 实例的 send 方法发送。
在 、、 中注入 实例,分别重构 方法、like 方法、 方法,封装 Event 对象,然后调用 的 方法发布通知。
消费事件
创建 事件消费者,消费者是被动触发的。
【问题】没有向数据库插入系统通知记录,原因是 类进行日志处理时要获取 utes 请求对象,Kafka 的消费事件是自动触发的,没有进行新的请求,产生了请求对象的空指针异常。
显示系统通知 通知列表
在 接口中
在业务层的 中
在表现层的 中新增 方法,获取通知列表
显示通知详情
在 接口新增 方法,查询某个主题的通知列表,在 -.xml 配置 SQL。
在业务层的 中新增 方法,调用 方法。
在表现层的 中新增 方法
显示未读通知总数
创建 拦截器
在 中注入 实例,并在 方法中添加该拦截器。
