探花交友项目总结
使用技术:
该项目主打陌生人交友,为了达到最好的效果,登录上我们使用了用户使用成本最低的手机验证码登录。作为项目主打的陌生人交友上面,我们做了推荐好友,推荐朋友圈,漂流瓶,附近的人,智能推荐,大数据分析等功能,除了这些之外还有市面上交友软件常用的实时通信,小视频等一些交友功能。其中使用了SpringBoot作为主框架,数据库上使用了mysql,MongoDB,Redis,后期维护的时候加入了ElasticSearch,使用dubbo和RocketMq作为远程调用工具,还使用一些第三方工具。
描述1:
完成功能:当用户登录时,会根据用户登录的手机号发送验证码,验证通过后,会给用户一个唯一的token值,下次用户访问其他模块时会带上这个token,用来验证身份。
具体实现:
1.填写手机号码,发送验证码;技术:阿里云短信发送服务,发送成功后将验证码存入redis中,键名为指定字符串加手机号码,值为用户的验证码。发送失败则返回错误结果返回前端;
2.用户填写验证码;传入参数为验证码和用户的手机号,在redis中查找之前存入的键值对,如果能能匹配上,则表示用户验证码正确,查询不到则表示验证码过期,值错误则表示验证码输入错误;
3.登录成功后,去数据库查找是否用该用户信息(使用手机号查找),如果没有,则表示该用户为新用户,需要先完善个人信息。生成唯一的token(运用jwt技术),发送登录成功的消息给前端,返回值为token和该用户是否为新用户。
4.当该用户为新用户的时候,会跳转到完善个人信息的页面,传入的参数为用户信息和token(当生成token之后,该用户的所有请求都会带上此token),首先判断该用户的token,找到对应的用户,如果失败,则返回登录失败。token验证成功之后,判断用户上传的图片是否为人脸(运用虹软人脸识别技术),判断成功之后,将该照片存储到阿里云OSS上,然后将该用户的信息存入数据库中,登录成功。
优化:我们每次访问其他模块时,都需要校验token,通过token值获取用户信息。这部分代码重复度很高,我们可以设置一个拦截器,当前端传入的请求参数中需要token时,我们对该请求进行拦截,直接根据该token值查找用户,然后将该用户的信息存入当前线程中,当我们需要用到用户信息时,直接在当前线程中直接获取即可。
描述2:
具体实现:有用到第三方接口 阿里的短信验证码发送,虹软的人脸识别,SSO系统,SSM框架,redis ,mysql用户发送请求后,我们会将用户的手机号通过阿里的短信发送平台发送一条验证码给用户,并将验证码和手机号存入到我们的redis中,当用户携带验证码登录的时候,我们会将用的手机号和验证码发送到SSO系统中并且在redis缓存中校验验证码是否正确,如果不正确就直接返回到登录页面, 如果正确就登录成功,并在redis 中将该用户的验证码删除,登录成功后我们会将用的手机号在mysql 数据的用户表中查询,看该用户是否存在, 如果存在就证明是老用户,生成一个token返回给用户,以后用户每次请求都要携带token在sso系统中查询,只要查询匹配后才能继续操作。登录成功后在mysql中查询不到该用户就证明是新用户,并且跳转到用户信息注册页面,完善个人信息,并将该用户的资料写入到mysql数据库中,随后通过第三方接口虹软人脸识别验证是否为人像,如果是则登录成功,sso系统生成token并返回给用户,如果不是,这重新返回完善换个人信息页面.
描述3:
1、关于注册登录,首先需要储存用户电话号码,和用户信息等数据库,这里我选用的是MySql数据库存储,还有通过阿里云的sso用户信息管理系统,验证码选择的是一个阿里云三方服务sso系统,通过阿里云收费服务来完成,其中还利用了相关faceEngine人脸识别技术辅助注册!
2、还有就是用户信息管理与用户服务之间的相互调用和验证,使用单点登录系统。这里就需要产生一个令牌token,我们利用的是md5加密技术来随机生成token,设置过期时间,储存到Redis当中,导入Redis相关jar包,利用RedisTemplate的相关方法,还有拦截器来保证token的一致性和用户sso系统与server系统通信。
今日佳人:
描述1:
具体实现:用到SSO系统,SSM框架redis ,mysql,大数据的推送系, dubbo,zookeeper ,mongodb, 先进行token校验,成功后在数据库中查询到当前用户的id,使用dubbo远程调用 并将该用户的在mongodb推荐表中进行查询,通过查询到推荐用户转发到推荐系统中, 推荐系统进行推荐,按缘分值得高地进行降序的排序,并将缘分值最高的用户id在mysql数据库中进行查询用户详细信息,封装成vo对象返回给前端, 并存在redis中,如果没有查询到用户,则给出一个默认的用户id,并补全信息返回。推荐列表则将查询的用户id通过推荐系统推荐的用户按照缘分值进行降序排序,取前12位,在数据库中补全用户信息, 如果没有查询到,则给出默认值。
描述2:
通过用户id,查找mongodb数据库recommend_quanzi(圈子推荐表)中的userId(推荐的用户Id)和score(推荐得分)这两个字段,查询出最佳用户.如果这个推荐用户recommendUser对象为空,就直接返回空回去.如果不为空,则把recommendUser对象中的userId赋值到返回前端需要的返回值对象todayBest中去,将推荐表recommend_quanzi中的score(推荐得分)向下取整,并封装到对象todayBest中去.如果todayBest对象为空,就给出默认的推荐用户返回.否则,根据todayBest对象中的id去查询mysql数据库userInfo表中的用户,并将userInfo表中的用户信息封装到todayBest对象中去,并返回给前端.
描述3:
首先后台会有一个推荐系统,它会计算用户的各种行为,以及用户的各种信息,比如学历,性别等等,计算之后,我们会把这个结果写入MongoDB中,然后去dubbo服务中查询MongoDB里面的数据,把缘分值最高的用户查询出来并返回,然后service服务通过rpc去调用Dubbo拿到数据返还给用户并展示出来.
用户推荐:
描述1:
当用户登录成功后会直接将其导航到主页面,也就是用户推荐页面。其中用户推荐分为单人推荐和推荐列表,我们会将当前用户的资料和数据库中的其他用户资料进行大数据计算,根据和当前用户的匹配度计算缘分值,缘分值最高的为今日最佳推荐。如果用户为新用户我们会将域设定好的表经行展示。
朋友圈:
朋友全也分为朋友的朋友圈和推荐的朋友全,我们会根据用户朋友圈的点赞.评论.喜欢来经行计分,在用户访问推荐朋友圈的时候根据记分情况经行推荐。
描述1:
朋友圈是分为推荐朋友圈和好友朋友圈,因为朋友圈的读多写少原因,我们使用了多表写,少表查的原则。其中在发布圈子的时候会将朋友圈信息存入指定的表中,还会将发布的朋友圈写进好友的时间线表中,在查询好友朋友圈的时候会直接查询自己的时间线表,这样会很直接的减少查询压力。 在推荐朋友圈中我们使用RocketMq技术将对应朋友圈的所有点赞,评论,喜欢,浏览。都放入消息队列中经行异步储存。同样的我们会利用大数据的技术将信息经行处理,将处理后的朋友圈id存入Redis中,在查询的时候会直接调用Redis中的数据经行数据库查询,并将查询到的数据设置一个较长的时间存入Redis中。 在朋友圈中的所有点赞,评论,喜欢都会被记录,在每次访问的时候都会实时显示是否点赞/喜欢和对应的数量。在点击评论后会进入评论界面,评论界面中会显示该朋友圈的详细信息和所有的评论,用户可以对评论经行点赞,也可以自己发布评论。
描述2:
圈子点赞,喜欢:
先获取本线程:先获取本线程已经登陆的用户信息
圈子点赞:
他点赞的时候,通过发布动态用户的id去查询有谁给自己点了赞,如果点赞的用户里面有本线程登录用户的id,则不能重复点赞,如果没有该用户,则可以进行点赞,点完赞以后,还会把该用户的id,该条动态的id,点赞类型加到里面,如果之前没有缓存过圈子的点赞数,则在MongoDB里面查询出该圈子的点赞数,并且保存到redis里面,如果之前存过点赞数,则将该点数加一,记录当前用户角色已经点过的赞.取消点赞:取消点赞的话,因为是取消点赞,所以只有已经点过赞了:直接根据动态id,本线程用户ID,点赞类型查询出内容,移除该用户信息就好 更新redis中的点赞数 -1从redis中删除当前用户的点赞记录
圈子评论:
查询评论列表:首先要把评论列表查询出来,有的话就传回来,没有的话就没有嘛提交评论:就把用户如书的内容保存嘛,true就是保存好了,false就是报错了
圈子评论点赞:
评论点赞:流程跟圈子点赞一样,没有的话就把他的信息存进去,看看redis里面有没有数据,没有的话就顺路把数据存进去,有的话就点赞加一.评论取消点赞:redis里面肯定是有数据的嘛,直接点赞减一就好了
小视频:
跟市面上的视频类原件基本类似,点赞,喜欢,关注,评论功能都有。
附近的人:
描述1:
我们会将所有用户的位置信息定时的存入MongoDB中,在用户查询附近其他用户时调用MongoDB中的坐标查询。
描述2:
应用百度地图服务中的经纬度来,longitude和latitude,调用circle方法来判断周围注册的用户之间的距离,来搜索附近的人。
好友推荐:
我们会根据用户填写的基本资料使用大数据的技术经行缘分值计算,将计算出的多个用户id和缘分值存入Redis中,查询时先会判断Redis中是否拥有登录用户的推荐好友。如果有,会将数据取出,根据用户id去数据库中查询用户好友的基本信息经行展示。如果没有,会经行临时计算缘分值,此时虽然计算不精致却可以尽快反应。在任意界面点击其他用户可以查看其基本信息和发布过的非公开朋友圈,在其他用户界面可以点击聊一下申请添加好友。
实时通信:
因为该应用使用的是环信接口实现实时通信,所以只需要将指定参数发送到环信即可。我们会在用户第一次登录成功之后将用户id注册到环信中,在其他用户向当前用户发送好友请求时我们也会调用环信接口向当前用户发送信息。而且在程序中只要用户双方都点击过喜欢对方我们就会将双方添加为好友,同时将好友信息存入数据库,也会调用环信的添加好友接口,当用户之间成为好友后就可以进行实时通信了。
用户模块:
当用户进入用户模块后,可以查询用户详细信息,也可以根据单个用户ID,名字,地址获查询单个用户,点击查看功能可以对用户进行冻结和解冻操作具体实现:用到的技术框架SSM ,redis,mysql,dubbo,Mongodb,zookeeper查询用户信息在数据库中有3个表,分别是用户日志表,userinfo表,用户表,并将查询的数据封装到pojo实体类中, 在service层中把有需要的字段封装成一个vo对象返回给controller层同时返回给前端, 当用户点击查看功能的时候,前端传入该用户的id,并通过该用户的id在数据库中查询相应的字段也是封装在pojo实体类中, 然后用dubbo远程调用查询Mongodb中的用户操作表和喜欢表,通过我的喜欢的用户ID查询到我的喜欢数,通过我自己的id查询到喜欢我的用户数,通过我喜欢的id查询喜欢我的id 查询到相互喜欢的用户数,将该数据封装到返回的vo对象中, 在将mysql数据库的userinfo表也查询出来封装在vo对象中返回给页面.
冻结和解冻:
当点击冻结时,先查询redis数据库中有没有该用户如果存在则表示已经冻结 直接返回数据,如果不存在 则通过该用户的id查询到当前用户,将数据库中状态的字段改为冻结状态随后将当前用户的id,冻结时间,原因存入冻结表中并且把改用户的id也同时存入到redis数据库中给页面返回操作成功的提示解冻的时候,先查询redis中是否存在该用户,如果不存在,则表示已经解冻,直接返回数据,如果存在,则在redis中删除掉当前的用户id并且通过当前用户的id 查询冻结表中的用户信息,删除当前表中的信息.