# zhihu
模仿知乎做的SpringBoot问答社交网站项目,项目技术点SpringBoot+Mybatis+Mysql+redis+solr+velocity,利用爬虫对项目进行数据填充。
# 知乎项目总体预览
[1登陆注册](/new/master?readme=1#登陆注册)
[2知乎首页](/new/master?readme=1#知乎首页)
[3用户提问](/new/master?readme=1#用户提问)
[4关注、评论、点赞问题](/new/master?readme=1#关注、评论、点赞问题)
[5用户发私信](/new/master?readme=1#用户发私信)
[6我关注的用户的新鲜事](/new/master?readme=1#我关注的用户的新鲜事)
[7我的主页](/new/master?readme=1#我的主页)
[8主页个人动态](/new/master?readme=1#主页个人动态)
[9主页个人提问](/new/master?readme=1#主页个人提问)
[10主页个人回答](/new/master?readme=1#主页个人回答)
[11主页个人关注问题](/new/master?readme=1#主页个人关注问题)
[12主页个人关注好友](/new/master?readme=1#主页个人关注好友)
[13主页个人的粉丝](/new/master?readme=1#主页我的粉丝)
[14主页我的私信](/new/master?readme=1#主页我的私信)
[15搜索问题或内容](/new/master?readme=1#搜索问题或内容)
## 登陆注册
[![kGA3Bq.md.png](https://s2.ax1x.com/2019/02/03/kGA3Bq.md.png)]
## 知乎首页
![kGAwv9.png](https://s2.ax1x.com/2019/02/03/kGAwv9.png)
## 用户提问
[![kGAXvj.png](https://s2.ax1x.com/2019/02/03/kGAXvj.png)](https://imgchr.com/i/kGAXvj)
## 关注、评论、点赞问题
[![kGu1Rf.png](https://s2.ax1x.com/2019/02/03/kGu1Rf.png)](https://imgchr.com/i/kGu1Rf)
## 用户发私信
[![kGndgO.png](https://s2.ax1x.com/2019/02/03/kGndgO.png)](https://imgchr.com/i/kGndgO)
## 我关注的用户的新鲜事
[![kGnwvD.png](https://s2.ax1x.com/2019/02/03/kGnwvD.png)](https://imgchr.com/i/kGnwvD)
## 我的主页
[![kGnrbd.png](https://s2.ax1x.com/2019/02/03/kGnrbd.png)](https://imgchr.com/i/kGnrbd)
### 主页个人动态
[![kGn2PP.png](https://s2.ax1x.com/2019/02/03/kGn2PP.png)](https://imgchr.com/i/kGn2PP)
### 主页个人提问
[![kGnfxS.png](https://s2.ax1x.com/2019/02/03/kGnfxS.png)](https://imgchr.com/i/kGnfxS)
### 主页个人回答
[![kGn5rQ.png](https://s2.ax1x.com/2019/02/03/kGn5rQ.png)](https://imgchr.com/i/kGn5rQ)
### 主页个人关注问题
[![kGnTVs.png](https://s2.ax1x.com/2019/02/03/kGnTVs.png)](https://imgchr.com/i/kGnTVs)
### 主页个人关注好友
[![kGnqP0.png](https://s2.ax1x.com/2019/02/03/kGnqP0.png)](https://imgchr.com/i/kGnqP0)
### 主页我的粉丝
[![kGnO2T.png](https://s2.ax1x.com/2019/02/03/kGnO2T.png)](https://imgchr.com/i/kGnO2T)
### 主页我的私信
[![kGuVMD.png](https://s2.ax1x.com/2019/02/03/kGuVMD.png)](https://imgchr.com/i/kGuVMD)
[![kGuQit.png](https://s2.ax1x.com/2019/02/03/kGuQit.png)](https://imgchr.com/i/kGuQit)
## 搜索问题或内容
[![kGuCI1.png](https://s2.ax1x.com/2019/02/03/kGuCI1.png)](https://imgchr.com/i/kGuCI1)
# 主要内容
1. 开发工具和Java语言介绍
主要讲述这个项目所用到的开发工具和语言-java的回顾。
1. Spring入门,模板语法和渲染
进行Spring语言的介绍和讲解,模板语法和渲染(注意springboot1.5开始不支持velocity模板引擎,可以用Thymeleaf或者Freemarker代替)
1. 数据库交互iBatis集成
主要是进行数据库的创建以及交互,讲解注释和XML定义并进行首页的开发,两种方式书写sql代码,第一种方式是在dao层的接口上利用@Mapper、@Insert方法注解在.java文件上书写sql,优点是方便,快捷适合简单查询语句。第二种方式是在dao对应的xml文件中书写sql代码,适合复杂的sql代码,与java文件解耦,个人推荐在xml中书写sql代码。
1. 用户注册登录管理
主要实现用户的注册,登录,浏览等功能,并考虑数据的安全性(密码采用md5(salt+password)进行加密)
1. 问题发布,敏感词和js标签过滤,问题广场
主要实现问题发布,同时异步发起两个事件,一个是提醒问题作者的粉丝,你关注的某某木提出了问题,等你来回答,第二个是把该问题加入到作者的动态时间轴中。利用前缀树进行敏感词的过滤,问题广场的实现等主功能
1. 评论中心,站内信
主要搭建评论中心用户评论问题,把评论信息插入到数据库comment表,并且修改question表问题的的commentcount评论个数,产生异步评论事件,给这个评论的作者的粉丝产生一个新鲜事,比如某某您关注的用户,评论了问题**** 评论内容为****。并且实现站内信等功能
1. Redis入门以及Redis实现赞踩功能
主要进行Redis的介绍并且实现赞踩功能(为每个评论维护两个redis的Set集合一个点赞一个点踩,集合中存放的是点赞点踩的用户id),熟悉jedis的五种数据结构api操作,以及jedis的事务操作(比如用户点赞的同时,如果用户存在于点踩的集合中的话,必须set点赞集合增加一个,点踩集合减少一个,两件事情必须要么都执行要么都不执行)。
1. 异步设计和站内邮件通知系统
主要进行异步设计,使用redis的list数据结构进行异步处理,和搭建站内邮件通知系统,实现邮件发送的功能。
1. sns关注功能,关注和粉丝列表页实现
主要实现关注和被关注功能,包括关注问题,关注人,粉丝列表的实现,并且进行了排序算法的介绍。一个实体有至少两个关注相关的redis的key,一个是实体的粉丝,这里包括人的粉丝,人关注了问题,人就是这个问题的粉丝,另一个是关注key,a关注b那么b就是a关注的对象,b可以是人或者是问题,因此一个实体的粉丝key有一个,但是关注对象的key可能有两个
1. timeline实现
推拉模式的对比,推模式:大明星谢娜发布一条微博,把这条微博推送给他的一亿粉丝,加入到他一亿粉丝每个人的新鲜事队列中,
缺点是推送延迟,压力大,海量数据存储。拉模式:用户张三登陆微博之后,从数据库中拉去他关注的用户。
推模式主要适合粉丝较少的小用户,因为他们的粉丝量少,使用推模式产生的冗余副本也比较少,并且可以减少用户访问的压力。
拉模式主要适合大v,因为很多僵尸粉根本不需要推送信息,用推模式发给这些僵尸粉就是浪费资源,所以让用户通过拉模式请求,只需要一个数据副本即可。
同时推拉结合,比如用户 yanzhongxin发送一条微博,推模式推送给当天在线的用户,或者微博活跃用户,这样就可以减少数据冗余(推送给僵尸粉数据、或者不活跃用户) 不常玩微薄的粉丝登陆微博的时候,从关注列表Feed流中拉去新鲜事。
/pullfeeds 首先获得用户关注人的id,根据这些人的id查询Feed表中数据,按照id desc进行排序,把这些用户关注的新鲜事Feed返回给前端网页展示。
/pushfeeds 首先查询用户的粉丝id,然后根据redis获得粉丝的时间轴key,把新鲜事Feed的id加入到粉丝的新鲜事时间轴上
/mytimeline1 显示当前用户的新鲜事列表。比如用户知乎用户yanzhongxin关注了zhangsan,yanzhongxin 关注了问题“你家乡在哪”,yanzhongxin评论了某个问题,这些新鲜事除了异步推送给粉丝的新鲜事时间轴上之外,还要加入到自己的个人时间轴上,效果基本上和知乎的个人动态一样。
1. python语法简介,pip工具介绍
python以及工具,Python27/PIP,PyCharm。
1. python爬虫实现数据抓取和导入
主要介绍爬虫,以此来实现数据抓取和导入pyspider爬去知乎top50热门的问题问题、导入到mysql数据库
1. 站内全文搜索
主要实现站内全文搜索功能,进行solr的安装,solr中文分词,solr