写在前面

先简单介绍一下,博主目前研三,找完工作后最近一段时间空闲时间比较多,因此就想把自己以前学习过的一些东西总结一下,以后也打算把新学习到的东西及时记录,即是能够方便以后随时查看,也是监督自己每天都能有所提升,以前也偶尔写过几篇博客,但都是浅尝辄止,因此准备先把以前的东西重新梳理一下,写的第一篇就是关于牛客网的高级项目课问答平台的,这个是博主接触的第一个java项目,也是决定入坑java的原因,下面就尽量详细的介绍一下这个项目的各个模块,在这里放上代码地址,感兴趣的同学可以自行下载查看,如果有不懂的也可以qq联系我,博主qq:2589656897,代码地址:github
想要视频的同学可以私聊我,我私发给你,下面就介绍一下这个项目的各个模块,希望能对也在做这个项目的同学提供一些帮助。

准备

准备工作就是一些工作环境的配置,博主主要是在windows平台上编码,IDE是intellijIDEA,除此之外还用到了MySQL与Redis数据库,具体的准备工作可以参考视频教程,讲的已经非常详细,在此不作多说,除此之外,由于博主并不是很熟悉前端,因此以下都是与后端编码相关,下面便开始的一个模块。

用户的登录与注册

登录与注册模块实现起来比较简单,总体来说就是把用户信息存入我们的MySQL数据库中,登录与注册表中主要包含的数据有用户id,用户名,密码,为了保证数据安全,密码不能以明文的方式存在数据表中,因此还需要有一列存储盐值,存在表中的密码为用户输入的密码与盐值使用MD5加密之后的字符串,除此之外还需要存储的就是用户的头像信息,有了这几列,一个基本用户的信息就被我们建立起来了,除此之外,为了保证访问效率,http具有无状态性,为了保证用户能够正常使用网站功能而非每次访问都需要重新输入账号密码,我们还要建立一张表存储用户的登录信息,每次访问只要与数据库比对携带的ticket,便可以知道访问者是谁,这张表需要存储的信息主要有用户id,用户名,ticket值,过期时间以及状态信息,只要用户点击退出,便将状态值置为0即可,下面就是该模块简答介绍。

(1)登录注册模块:

1.用户名及密码合法性检测,包括用户名与密码不能为空,以及用户名未被注册

2.验证用户名与密码,如果通过检验就下发一个ticket,通过cookie发放给客户端

3.客户端每次发起请求,都要与数据库对比ticket是否有效

4.在数据库存储的密码是md5加密字符串,防止密码泄露

此模块用到的数据库表有user表与loginTicket表

user表包含字段:id name password salt headUrl

loginticket表包含字段:id userid expiredtime status ticket

问题的评论与发表

问答网站最主要的功能当然就是问题与评论了,这个模块相对来说比较简单,整体思路就是把用户输入的问题与评论按照设定入库即可,但是在设计数据表结构时需要注意一点就是当一个用户发起评论的时候,他评论的即可能是一个问题,也可能是一个评论即评论的评论,还有可能对一个用户发起评论,此时要注意的就是,评论表如果设计成评论单个场景,那至少要有三张表,因此在设计评论表的时候,这里就取了一个巧,具体如下:
question表:
id,title,content,createdDate,userId,commentCount
comment表:
id,userId,entityId,entityType,content,createdDate,status

拦截器与敏感词过滤

在完成以上两个模块的时候,其实整个网站的基本功能已经实现,接下来就是一些功能添加以及优化工作,在这里首要的任务就是要保证网站的内容安全,不能出现一些不合理不合法的词汇出现,因此添加的第一个功能就是敏感词的过滤,在这里我们采用了字典树的方式建立了一棵敏感词树,当检测到用户输入包含敏感词的时候就进行过滤,除此之外还要注意的一点是还要进行一些html标签信息的过滤,敏感词过滤主要用在用户的注册时用户名,以及用户问题与评论的发表。
在本项目中我们定义的拦截器有两个:
1.每次客户端发起请求,都被拦截器拦下,检查cookie携带的ticket信息,根据ticket信息查表确定用户信息,将用户信息存下,以便使用,在后面用户发布问题或者发起评论的时候方便数据入库。
2.未登录跳转拦截器,此拦截器定义在第一个拦截器后面,如果检测未登录即ticket不存在,用户即是处于未登录状态,如果客户端要发表问题或评论等等需要个人数据的行为,就跳转到登录页面,先完成登录再继续接下来的操作。

赞踩

问答网站还有一个重要的功能就是点赞与点踩,赞踩从功能上来说用传统的关系型数据库也可以实现,但是由于这个功能关系型并非很强,用简单快速的非关系型数据库也可以实现,因此在该项目中就使用Redis数据库来实现赞踩功能,关于Redis数据库可以访问官方网站来学习相关使用:redis
在这里我们主要是用了Redis里面的set数据结构,以免用户频繁赞踩造成数据不实。

粉丝与关注列表

在该模块就是要实现用户或者问题的粉丝与关注列表,在这里我们依旧使用Redis数据库来实现该功能,只不过在设计如何存储方面要下一点小心思,在这个需求中也是使用Redis的sorted Set数据结构实现,但是在粉丝列表中key是用户或者问题的id+type组成,value是粉丝的id,在关注列表中,key是用户id+关注对象type,value是关注对象id,排序依据是时间产生的时间,除此之外还要注意的一点是在关注与粉丝列表进行操作的时候必须要保证事务性,Redis的事务主要是由multi与exec两个命令实现。

异步化

除了以上四个功能之外,还有一个比较重要的功能就是为了提升网站的性能,进行异步化操作是必然选择,异步化最常用的是借助一些消息队列工具来实现,在这里我们直接利用Redis的list数据结构来实现,Redis的的list是双端队列,我们可以利用向队列中添加任务与取出任务,来实现操作的异步化。实现方式比较简单,主要依托两个命令lpush与brpop操作。

结语

以上就是一个问答网站最基本的一些功能的实现,当然在该项目还有一些其他功能,但我觉得以上几个就是一个网站最核心最通用的几个功能,感兴趣的同学可以根据视频以及我这里提供的代码自己敲一敲,理解会更加深刻,如果有不明白的欢迎私信,我会尽力解答。该项目主要是基于springBoot来实现,后面我会详细介绍一下该框架与传统SSM框架使用上的一些不同。

牛客网高级项目课总结相关推荐

  1. 2019牛客网高级项目

    本项目是一个基于SpringBoot的社区平台,实现了牛客网讨论区的功能.实现了邮箱注册.验证码登录.发帖.评论.私信.点赞.关注.统计网站访问次数等功能,数据库使用Mybatis.Redis,使用K ...

  2. Java牛客网社区项目——知识点面试题

    Java牛客网社区项目--知识点&面试题 持续更新中(ง •̀_•́)ง 文章目录 Java牛客网社区项目--知识点&面试题 请简要介绍一下你的项目? 什么是Spring框架? 对Sp ...

  3. 仿牛客网社区项目 全栈总结

    学习仿牛客网社区项目 代码&资源 各章节总结 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 争取让每个知识点都有链接可点 项目总结 网站架构图 常见面试题 MySQL Red ...

  4. 牛客网中级项目学习笔记(一)

    牛客中级项目学习: Controller 解析web请求 Service 业务层 DAO(data access object)数据处理层 database 底层数据库 重定向 代码如下: @Requ ...

  5. [牛客网中级项目]第四章用户注册登陆管理

    目录 1. 预习 1.1 拦截器: 1.2 MD5加密算法: 2. 内容: 3. 注册: 3.1 注册要实现的功能: 3.2 代码实现: 3.2.1 建立LoginCotroller.class 3. ...

  6. 牛客网实战项目详细到每一步(更新中)

    一技术架构 Spring Boot Spring Spring MVC MyBatics Redis Kafka Elasticsearch重点的提高性能的技术 Spring Security, Sp ...

  7. 牛客网社区项目——p3.4事务管理

    数据库保障事务的机制如下 spring事务管理 在业务层模拟某个业务,注册用户和自动发送新人报到帖这两个业务视作一个事务 代码如下(两种方法): @Transactional(isolation = ...

  8. 2022-1-13牛客网C++项目—— 第二章 Linux 多进程开发(一)

    复习用的问题 进程和程序之间的关系是什么? 进程包含了哪些信息? 一.程序当中包含了一系列的信息,这些信息用于描述如何创建一个进程. 1)二进制格式标识:描述文件的格式,内核根据这个信息来解释文件中的 ...

  9. 2021-12-11牛客网C++项目——Linux编程介绍入门(二)

    1.15 目录操作函数 mkdir 函数 /*#include <sys/stat.h>#include <sys/types.h>int mkdir(const char * ...

  10. 仿牛客网项目第五,六章:异步消息系统和分布式搜索引擎(详细步骤和思路)

    目录 1. Kafka:构建TB级异步消息系统 1.0 同步/异步消息的区别 1.1 项目的目的 1. 2 阻塞队列实现异步消息系统 1.4 Kafka入门 1.5 Spring整合Kafka 1.6 ...

最新文章

  1. linux深度定制,Linux Deepin 12.06 beta1 发布
  2. AppCan用cookie实现记住密码功能 [APP]
  3. SpringMVC注解@initbinder解决类型转换问题
  4. 存储虚拟化之带内设备与基于存储控制器的虚拟化
  5. python输入语句-1、python基本的元素及输出语句
  6. Git 的工作区、暂存区、版本库—— Git 学习笔记 15
  7. 手机空间定位_你或许被默默定位很久了却不知情,盘点生活中各类定位技术
  8. 【ntp】虚拟机时间莫名异常
  9. memset()函数用法
  10. dynmic_debug动态控制kernel下的日志输出
  11. 0基础学python要多久-零基础学Python的过程有多难?需要多久?
  12. jsp html5 模板,JSP标准模板库
  13. 刚想起QQ微信支付宝三合一收款码
  14. Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
  15. 谭浩翔c语言,严谨细致的科技尖兵丨广州市公安局黄埔区分局民警谭浩翔
  16. 企业上云“行稳致远”,新钛云服“服务+产品”模式升级上云、用云新思维 | 爱分析洞见...
  17. Dexpot 虚拟桌面软件(推荐)
  18. android联动动画,Android双向列表左右联动效果
  19. 求知方面无妨多一点,生活方面无妨省一点
  20. JavaWeb个人博客项目:手把手教你实现博客后台系统之管理员管理模块5

热门文章

  1. JanusGraph 创建索引步骤
  2. Janusgraph使用示例
  3. PostgreSQL 数据库导入导出
  4. . mindoc linux amd64,linux安装Mindoc文档管理系统
  5. qnx 设备驱动开发_一种QNX系统的USB驱动加载方法与流程
  6. 爱快路由器下水星(Mercury)无线管理器AC跨三层发现AP
  7. 韩立刚《计算机网络》| 第5章 传输层
  8. 改变世界的程序员—Jack Dorsey
  9. 利用PS 调整 pdf清晰度
  10. IDEA打包jar 跳过测试