仿牛客论坛项目总结

news2024/10/5 15:46:18

一.数据库中每一张表有哪些字段

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表中插入一条数据

3.登录功能

使用kaptcha工具类生成验证码

登陆成功,生成登录凭证(往login_ticket登录凭证表中插入一条数据),然后将凭证发放给客户端(把ticket字段返回给客户端即可,把ticket放到cookie里面),页面跳转到首页index.html

如果失败,跳转回登录页面 

4.退出功能

将登录凭证修改为失效状态,然后跳转到网站首页(未登录状态)

5.使用拦截器拦截用户没有登录有些页面无法访问

6.发布帖子

点击发布,输入标题和内容,点击发布,然后通过ajax提交给数据库,页面还是在刚才的页面

其实就是往discuss_post这张表里面添加一行数据

需要你先登录才可以发布帖子

规定敏感词,使用前缀树将敏感词全部替换为*

7.给帖子评论

往comment表里面添加一行数据

8.点赞功能  这是一个使用频率非常高的功能,尤其是一个大牛的号,发了帖子,短时间会有大量的人给他点赞

第一次点赞,第二次取消,可以显示帖子的点赞总数量

//执行点赞
public void  like(int userId,int entityType,int entityId)
{
   //第一个参数表示哪个用户点的赞,第二个参数点赞类型:给帖子点赞还是给帖子的评论点赞
   //第三个参数是帖子的id或者评论的id,表示给谁点赞
     

}

//

9.利用kafka给用户发送系统通知

当有人给用户发布的帖子评论了,给用户发送系统通知

当有人给用户发布的帖子点赞了,给用户发送系统通知

当有人关注了用户,给用户发送系统通知

 评论,点赞,关注分别是一个主题topic

面试常见问题:

1.注册功能怎么实现

点击首页的注册按钮,就可以进行注册:

 通过表单提交数据,服务端接收到数据之后在后台查询账号是否已经被注册,邮箱是否已经被注册,如果没有,服务端就发送一封激活邮件给注册的邮箱(发送邮件功能,通过导入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,表示有效

2.登录状态保存在哪里?

最开始是保存在数据库里面,有一个login_ticket表,里面有一个ticket字段,用户登录了就会在这个表里面插入一行

当一个请求来了,看这个请求里有没有ticket,如果这个ticket在login_ticket表里面保存了,,就表明用户登录了,如果用户退出,就把请求里面的ticket删除

后来用redis进行优化,将登录凭证保存在redis里面,key是ticket字段,value是这个login_ticket表对应的一个login_ticket实体类的对象,代表这个ticket字段代表的这一行

3.项目里面哪里用到了AOP

打印日志的时候,在方法调用前打印日志的时候使用到了AOP

AOP 面向切面编程_Pr Young的博客-CSDN博客

将打印日志功能封装成一个切面,织入到目标对象的连接点位置

4.redis怎么用的

缓存点赞和关注:用户id为key,

缓存粉丝列表:采用的数据结构为zset,粉丝的id是key,value是关注的时间戳,zcard可以获取粉丝数量

缓存验证码

缓存登录凭证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAT甲级1008 Elevator C++/C语言

1008 Elevator 分数 20 作者 CHEN, Yue 单位 浙江大学 The highest building in our city has only one elevator. A request list is made up with N positive numbers. The numbers denote at which floors the elevator will stop, in specified order. It costs 6 seconds …

联邦学习将如何影响您的日常生活?

人工智能 (AI) 被认为是下一次工业革命的最大创新之一,其中包括机器学习。另一方面,随着原油和电力成为现代工业的基础资源,数据成为人工智能和机器学习的关键要素。 数据隐私与需求之间的冲突 训练的数据样本的大小决定了可用于增强 AI 性能…

CPT203-Software Engineering(2)

文章目录5. Scrum Framework5.1 Scrum Roles5.2 Scrum Activities and Artifacts6. Requirements Engineering6.1 User requirements and system requirements6.2 Functional & Non-functional requirements6.2.1 Functional requirements6.2.2 Non-functional requirement…

第一章:C++算法基础之基础算法

系列文章目录 文章目录系列文章目录前言一、排序(1)快速排序核心思想思路分析模板(2)归并排序核心思想思路分析模板稳定性时间复杂度二分查找(1)整数二分核心思想思路分析模板(2)浮点…

jetson nano系统引导安装(无外设安装方式)

文章目录一.硬件设置二.系统设置一.硬件设置 插入烧写好系统的SD卡将micro USB线接到jetson nano上,另一端USB A接到电脑上为jetson nano插入电源,开机等待电脑检测到如下盘符说明jetson nano连接成功 二.系统设置 进入电脑的设备管理器,查…

【linux】三种权限的使用和更改、粘滞位和yum的使用

目录 1.权限问题 ①什么是权限? ②小问题 ③默认权限 ④如何更改“人”的权限呢? ⑤更改权限的八进制方案 ⑥强制改权限里的“人”(权限人文件属性) 2.粘滞位 2.yum的使用 1.权限问题 ①什么是权限? 权限人&a…

HTTP协议解析

HTTP概述 HTTP (全称为 "超文本传输协议") 是一种应用非常广泛的应用层协议~~我们平时打开一个网站, 就是通过 HTTP 协议来传输数据的。 HTTP工作过程: 当我们在浏览器中输入一个 "网址",此时浏览器就会给对应的服务器发送一个 H…

CTF中的PHP特性函数(上)

前言 对于PHP大家一定不陌生,但你知道PHP在CTF中是如何考察的吗,本文给大家带来的是通过PHP特性来进行CTF比赛中解题出题的知识,会介绍一下CTF中常见的php特性以及围绕该知识点的相关案例,因为内容过多这里分成上中下三篇来讲&am…

操作系统的特征

文章目录🎀前言:本篇博客知识总览🍔并发🎇概念:🍔共享🎇概念:🍔虚拟🎇概念:🍔异步🎇概念:🏳️‍&a…

ThinkPHP 多应用模式之Api路由分组+中间件

ThinkPHP 6.1 在多应用模式下实现API路由分组中间件验证业务 目录 1.创建中间件文件 2.迁移中间件到子应用目录中 3.编辑中间件验证业务 修改命名空间 编写handle处理代码 4.注册中间件 编辑中间件文件 TP内置中间件 5.设置路由分组 优化相同控制器前缀 最终效果&am…

【信息论与编码 沈连丰】第六章:连续信息和连续信道

【信息论与编码 沈连丰】第六章:连续信息和连续信道第六章 连续信息和连续信道6.1 连续消息的信息6.2 连续消息在信道上的传输问题6.3 香农信道容量公式6.4 连续消息的识别和理想接收机6.5 连续信源的数字处理及其编码第六章 连续信息和连续信道 6.1 连续消息的信息…

在 KubeSphere 上部署 OpenLDAP 并进行对接使用

在 KubeSphere 上部署 OpenLDAP 并进行对接-进阶背景前置条件KubeSphere 中部署 LDAP部署 LDAP 应用ApacheDirectoryStudio 验证 LDAP下载部署 ApacheDirectoryStudioApacheDirectoryStudio 测试 LDAP创建 Ldap Search ,KS 对接时可选择使用KubeSphere 对接 LDAPHar…

【区块链 | EVM】深入理解学习EVM - 深入Solidity数据存储位置:内存

图片来源: Mech Mind on Unsplash 这是深入Solidity数据存储位置系列的另一篇。在今天的文章中,我们将学习EVM内存的布局,它的保留空间,空闲内存指针,如何使用memory引用来读写内存,以及使用内存时的常规最佳做法。 我们将使用 Ethereum Name Service (ENS)中的合约代码…

实模式和保护模式的区别

实模式和保护模式的区别 实模式和保护模式的来历 最早期的8086 CPU只有一种工作方式 ---- 实模式。数据总线为16位,地址总线为20位。实模式下所有寄存器都是16位。 从80286开始就有了保护模式,从80386开始CPU数据总线和地址总线均为32位,而且…

开发板测试手册——SPI FLASH 读写、USB WIFI 模块(2)

目录 1.8 SPI FLASH 读写测试 20 1.9 USB 接口读写测试 21 1.10 网络接口测试 23 1.10.1 网络连通测试 23 1.10.2 网络速度测试 25 2 网络静态 IP 设置 27 3 USB WIFI 模块测试 31 3.1 WIFI STA 功能测试 32 3.2 WIFI AP 功能测试 35 3.3 USB WIFI 驱动编译 39 前 言…

scikit-learn线性模型之线性回归

scikit-learn线性模型之线性回归线性回归参考文献线性回归 有监督学习中主要解决两个问题,一个是分类,另一个是回归。 在回归问题中,我们需要利用我们已知的特征 x1,x2,...,xpx_1,x_2,...,x_px1​,x2​,...,xp​ 去预测我们的目标变量 yyy 。…

隐私计算一体机,金融大数据规模商用的催化剂

一股隐私计算的浪潮正席卷金融行业。 银行通过隐私计算引入外部不动产数据,与行内贷款企业的时点贷款余额、注册资本等数据联合建立企业贷中预警监测模型,提升银行风险监测业务能力;银行利用联邦学习与互联网公司的客户特征数据完成联合建模…

Linux:使用telnet命令提示:Connection refused

我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。如果小伙伴们觉得不错就一键三连吧~ 下一篇:Linux安装telnet命令教程 文章目录一、分析没有xinetd服务:二、讲解: 什么是 telnet 命令具体语法具体参数三…

Node.js--》如何在Node.js中操作MySQL

目录 数据库 MySQL的安装与配置 SQL管理数据库 WHERE子句 AND和OR ORDER BY子句 COUNT(*)函数 在Express项目中操作MySQL 数据库 数据库(database)是用来组织、存储和管理数据的仓库。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。数据的来源有…

算法拾遗二十三之暴力递归到动态规划一

算法拾遗二十三之暴力递归到动态规划一题目一优化Code(空间换时间)优化二题目二优化一(缓存法)优化三(严格表优化)题目一 假设有排成一行的N个位置,记为1~N,N 一定大于或等于 2 开始…