通用设置,包含探花交友APP基本的软件设置功能。包含:
设置陌生人问题:当平台其他用户想进行在线交流时需要回答陌生人问题。
通用设置:包含一些APP通知设置
黑名单:对于不感兴趣的用户设置黑名单屏蔽骚扰
1.1.2数据库表
通用设置
实体类
(1)Settings
@Data@NoArgsConstructor@AllArgsConstructorpublicclassQuestionextendsBasePojo{privateLongid;privateLonguserId;//问题内容privateStringtxt;}(3)BlackList
@Data@NoArgsConstructor@AllArgsConstructorpublicclassBlackListextendsBasePojo{privateLongid;privateLonguserId;privateLongblackUserId;}mapper接口
(1)SettingsMapper
publicinterfaceSettingsMapperextendsBaseMapper
publicinterfaceQuestionMapperextendsBaseMapper
publicinterfaceBlackListMapperextendsBaseMapper
(1)SettingApi
packagecom.tanhua.dubbo.api;importcom.tanhua.domain.db.Settings;publicinterfaceSettingsApi{}(2)QuestionApi
packagecom.tanhua.dubbo.api;importcom.tanhua.domain.db.Question;publicinterfaceQuestionApi{}(3)BlackListApi
packagecom.tanhua.dubbo.api;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.tanhua.domain.db.UserInfo;publicinterfaceBlackListApi{}api服务实现类
(1)SettingServiceImpl
packagecom.tanhua.dubbo.api;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.tanhua.domain.db.Settings;importcom.tanhua.dubbo.mapper.SettingsMapper;importorg.apache.dubbo.config.annotation.Service;importorg.springframework.beans.factory.annotation.Autowired;@DubboServicepublicclassSettingsApiImplimplementsSettingsApi{@AutowiredprivateSettingsMappersettingsMapper;}(2)QuestionServiceImpl
packagecom.tanhua.dubbo.api;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.tanhua.domain.db.Question;importcom.tanhua.dubbo.mapper.QuestionMapper;importorg.apache.dubbo.config.annotation.Service;importorg.springframework.beans.factory.annotation.Autowired;@DubboServicepublicclassQuestionApiImplimplementsQuestionApi{@AutowiredprivateQuestionMapperquestionMapper;}(3)BlackListServiceImpl
packagecom.tanhua.dubbo.api;importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.baomidou.mybatisplus.core.metadata.IPage;importcom.baomidou.mybatisplus.extension.plugins.pagination.Page;importcom.tanhua.domain.db.BlackList;importcom.tanhua.domain.db.UserInfo;importcom.tanhua.dubbo.mapper.BlackListMapper;importcom.tanhua.dubbo.mapper.UserInfoMapper;importorg.apache.dubbo.config.annotation.Service;importorg.springframework.beans.factory.annotation.Autowired;@DubboServicepublicclassBlackListApiImplimplementsBlackListApi{@AutowiredprivateBlackListMapperblackListMapper;}1.2查询通用设置1.2.1接口文档
1.2.2代码实现
vo对象
@Data@NoArgsConstructor@AllArgsConstructorpublicclassSettingsVoimplementsSerializable{privateLongid;privateStringstrangerQuestion="";privateStringphone;privateBooleanlikeNotification=true;privateBooleanpinglunNotification=true;privateBooleangonggaoNotification=true;}SettingsController
在tanhua-server工程创建SettingsController完成代码编写
@RestController@RequestMapping("/users")publicclassSettingsController{@AutowiredprivateSettingsServicesettingsService;/***查询通用设置*/@GetMapping("/settings")publicResponseEntitysettings(){SettingsVovo=settingsService.settings();returnResponseEntity.ok(vo);}}SettingService
在tanhua-server工程创建SettingService完成代码编写
@ServicepublicclassSettingsService{@DubboReferenceprivateQuestionApiquestionApi;@DubboReferenceprivateSettingsApisettingsApi;@DubboReferenceprivateBlackListApiblackListApi;//查询通用设置publicSettingsVosettings(){SettingsVovo=newSettingsVo();//1、获取用户idLonguserId=UserHolder.getUserId();vo.setId(userId);//2、获取用户的手机号码vo.setPhone(UserHolder.getMobile());//3、获取用户的陌生人问题Questionquestion=questionApi.findByUserId(userId);Stringtxt=question==null"你喜欢java吗?":question.getTxt();vo.setStrangerQuestion(txt);//4、获取用户的APP通知开关数据Settingssettings=settingsApi.findByUserId(userId);if(settings!=null){vo.setGonggaoNotification(settings.getGonggaoNotification());vo.setPinglunNotification(settings.getPinglunNotification());vo.setLikeNotification(settings.getLikeNotification());}returnvo;}}QuestionApi
在tanhua-dubbo中的QuestionApi和QuestionApiImpl补充方法
@OverridepublicQuestionfindByUserId(LonguserId){QueryWrapper
在tanhua-dubbo中的SettingApi和SettingApiImpl补充方法
//根据用户id查询publicSettingsfindByUserId(LonguserId){QueryWrapper
1.2.1接口文档
SettingsController
/***设置陌生人问题*/@PostMapping("/questions")publicResponseEntityquestions(@RequestBodyMapmap){//获取参数Stringcontent=(String)map.get("content");settingsService.saveQuestion(content);returnResponseEntity.ok(null);}SettingsService
//设置陌生人问题publicvoidsaveQuestion(Stringcontent){//1、获取当前用户idLonguserId=UserHolder.getUserId();//2、调用api查询当前用户的陌生人问题Questionquestion=questionApi.findByUserId(userId);//3、判断问题是否存在if(question==null){//3.1如果不存在,保存question=newQuestion();question.setUserId(userId);question.setTxt(content);questionApi.save(question);}else{//3.2如果存在,更新question.setTxt(content);questionApi.update(question);}}QuestionApi
tanhua-dubbo工程中的QuestionApi和QuestionApiImpl中添加保存和更新方法
@Overridepublicvoidsave(Questionquestion){questionMapper.insert(question);}@Overridepublicvoidupdate(Questionquestion){questionMapper.updateById(question);}1.3通知设置1.3.1接口文档
通知管理:对通知进行保存或者更新的操作
1.3.2代码实现
/***通知设置*/@PostMapping("/notifications/setting")publicResponseEntitynotifications(@RequestBodyMapmap){//获取参数settingsService.saveSettings(map);returnResponseEntity.ok(null);}SettingsService
//通知设置publicvoidsaveSettings(Mapmap){booleanlikeNotification=(Boolean)map.get("likeNotification");booleanpinglunNotification=(Boolean)map.get("pinglunNotification");booleangonggaoNotification=(Boolean)map.get("gonggaoNotification");//1、获取当前用户idLonguserId=UserHolder.getUserId();//2、根据用户id,查询用户的通知设置Settingssettings=settingsApi.findByUserId(userId);//3、判断if(settings==null){//保存settings=newSettings();settings.setUserId(userId);settings.setPinglunNotification(pinglunNotification);settings.setLikeNotification(likeNotification);settings.setGonggaoNotification(gonggaoNotification);settingsApi.save(settings);}else{settings.setPinglunNotification(pinglunNotification);settings.setLikeNotification(likeNotification);settings.setGonggaoNotification(gonggaoNotification);settingsApi.update(settings);}}SettingsApi
tanhua-dubbo工程中的SettingsApi和SettingsApiImpl中添加保存和更新方法
@Overridepublicvoidsave(Settingssettings){settingsMapper.insert(settings);}@Overridepublicvoidupdate(Settingssettings){settingsMapper.updateById(settings);}1.4黑名单管理1.3.1接口文档
1.3.2分页查询
tanhua-domain工程的配置分页vo对象
packagecom.tanhua.domain.vo;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importjava.io.Serializable;importjava.util.Collections;importjava.util.List;@Data@AllArgsConstructor@NoArgsConstructorpublicclassPageResultimplementsSerializable{privateIntegercounts=0;//总记录数privateIntegerpagesize;//页大小privateIntegerpages=0;//总页数privateIntegerpage;//当前页码privateList<>items=Collections.emptyList();//列表publicPageResult(Integerpage,Integerpagesize,intcounts,Listlist){this.page=page;this.pagesize=pagesize;this.items=list;this.counts=counts;this.pages=counts%pagesize==0counts/pagesize:counts/pagesize+1;}}SettingsController
/***分页查询黑名单列表*/@GetMapping("/blacklist")publicResponseEntityblacklist(@RequestParam(defaultValue="1")intpage,@RequestParam(defaultValue="10")intsize){//1、调用service查询PageResultpr=settingsService.blacklist(page,size);//2、构造返回returnResponseEntity.ok(pr);}/***取消黑名单*/@DeleteMapping("/blacklist/{uid}")publicResponseEntitydeleteBlackList(@PathVariable("uid")LongblackUserId){settingsService.deleteBlackList(blackUserId);returnResponseEntity.ok(null);}SettingService
//分页查询黑名单列表publicPageResultblacklist(intpage,intsize){//1、获取当前用户的idLonguserId=UserHolder.getUserId();//2、调用API查询用户的黑名单分页列表Ipage对象IPage
@OverridepublicIPage
publicinterfaceUserInfoMapperextendsBaseMapper
tanhua-dubbo-db引导类开启mybatis-plus分页插件支持
publicinterfaceUserInfoMapperextendsBaseMapper
对于社交类软件的功能,我们需要对它的功能特点做分析:
针对以上特点,我们来分析一下:
探花交友
MongoDB:是一个高效的非关系型数据库(不支持表关系:只能操作单表)
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的,它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
MongoDB最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下:
1.2.1、通过docker安装MongoDB
在课程资料的虚拟机中已经提供了MongoDB的镜像和容器,我们只需要使用简单的命令即可启动
1.2.2、MongoDB体系结构
MongoDB的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。
为了更好的理解,下面与SQL中的概念进行对比:
SQL术语/概念
MongoDB术语/概念
解释/说明
database
数据库
table
collection
数据库表/集合
row
document
表中的一条数据
column
field
数据字段/域
index
索引
tablejoins
表连接,MongoDB不支持
primarykey
主键,MongoDB自动将_id字段设置为主键
db.collection.update(
#查询全部>db.user.find()#更新数据>db.user.update({id:1},{$set:{age:22}})#注意:如果这样写,会删除掉其他的字段>db.user.update({id:1},{age:25})#更新不存在的字段,会新增字段>db.user.update({id:2},{$set:{sex:1}})#更新数据#更新不存在的数据,默认不会新增数据>db.user.update({id:3},{$set:{sex:1}})#如果设置第一个参数为true,就是新增数据>db.user.update({id:3},{$set:{sex:1}},true)2.4、删除数据通过remove()方法进行删除数据,语法如下:
db.collection.remove(
实例:
db.user.find([query],[fields])条件查询:
操作
格式
范例
RDBMS中的类似语句
等于
{
db.col.find({"by":"黑马程序员"}).pretty()
小于
{
db.col.find({"likes":{$lt:50}}).pretty()
wherelikes<50
小于或等于
{
db.col.find({"likes":{$lte:50}}).pretty()
wherelikes<=50
大于
{
db.col.find({"likes":{$gt:50}}).pretty()
wherelikes>50
大于或等于
{
db.col.find({"likes":{$gte:50}}).pretty()
wherelikes>=50
不等于
{
db.col.find({"likes":{$ne:50}}).pretty()
wherelikes!=50
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构
使用Spring-Data-MongoDB很简单,只需要如下几步即可:
第一步,导入依赖:
spring:data:mongodb:uri:mongodb://192.168.136.160:27017/test第三步,编写启动类
packagecom.tanhua.mongo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassMongoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MongoApplication.class,args);}}4.2、完成基本操作第一步,编写实体类
packagecom.tanhua.mongo.domain;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.bson.types.ObjectId;importorg.springframework.data.mongodb.core.mapping.Document;@Data@AllArgsConstructor@NoArgsConstructor@Document(value="person")publicclassPerson{privateObjectIdid;privateStringname;privateintage;privateStringaddress;}第二步,通过MongoTemplate完成CRUD操作
实现:我们先不考虑推荐的逻辑,假设现在已经有推荐的结果,我们只需要从结果中查询到缘分值最高的用户就可以了。至于推荐的逻辑以及实现,我们将后面的课程中讲解。
流程:
#表结构recommend_user{"userId":1001,#推荐的用户id"toUserId":1002,#用户id"score":90,#推荐得分"date":"2019/1/1"#日期}在MongoDB中只存储用户的id数据,其他的数据需要通过接口查询。
5.2.0、导入依赖
找到tanhua-domain模块的pom.xml打开mongo的依赖
5.2.1、实体类
@AllArgsConstructor@NoArgsConstructor@Data@Document(collection="recommend_user")publicclassRecommendUserimplementsjava.io.Serializable{privateObjectIdid;//主键idprivateLonguserId;//推荐的用户idprivateLongtoUserId;//用户idprivateDoublescore=0d;//推荐得分privateStringdate;//日期}5.2.2、RecommendUserApi接口
publicinterfaceRecommendUserApi{RecommendUserqueryWithMaxScore(LongtoUserId);}5.2.3、RecommendUserApiImpl
@DubboServicepublicclassRecommendUserApiImplimplementsRecommendUserApi{@AutowiredprivateMongoTemplatemongoTemplate;//查询今日佳人publicRecommendUserqueryWithMaxScore(LongtoUserId){//根据toUserId查询,根据评分score排序,获取第一条//构建CriteriaCriteriacriteria=Criteria.where("toUserId").is(toUserId);//构建Query对象Queryquery=Query.query(criteria).with(Sort.by(Sort.Order.desc("score"))).limit(1);//调用mongoTemplate查询returnmongoTemplate.findOne(query,RecommendUser.class);}}5.2.4、application配置
server:port:18082spring:application:name:tanhua-dubbo-mongocloud:nacos:discovery:server-addr:192.168.136.160:8848data:mongodb:uri:mongodb://192.168.136.160:27017/tanhuadubbo:protocol:name:dubboport:20882registry:address:spring-cloud://localhostscan:base-packages:com.tanhua.dubbo.api#dubbo中包扫描5.2.5启动类
packagecom.tanhua.dubbo;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;importcom.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.annotation.Bean;@SpringBootApplicationpublicclassDubboMongoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DubboMongoApplication.class,args);}}5.3、代码实现5.3.1、接口说明
5.3.2、TanhuaController
@RestController@RequestMapping("/tanhua")publicclassTanhuaController{@AutowiredprivateTanhuaServicetanhuaService;//今日佳人@GetMapping("/todayBest")publicResponseEntitytodayBest(){TodayBestvo=tanhuaService.todayBest();returnResponseEntity.ok(vo);}}5.3.3、TanhuaService
@ServicepublicclassTanhuaService{@DubboReferenceprivateRecommendUserApirecommendUserApi;@DubboReferenceprivateUserInfoApiuserInfoApi;@DubboReferenceprivateQuestionApiquestionApi;@AutowiredprivateHuanXinTemplatetemplate;//查询今日佳人数据publicTodayBesttodayBest(){//1、获取用户idLonguserId=UserHolder.getUserId();//2、调用API查询RecommendUserrecommendUser=recommendUserApi.queryWithMaxScore(userId);if(recommendUser==null){recommendUser=newRecommendUser();recommendUser.setUserId(1l);recommendUser.setScore(99d);}//3、将RecommendUser转化为TodayBest对象UserInfouserInfo=userInfoApi.findById(recommendUser.getUserId());TodayBestvo=TodayBest.init(userInfo,recommendUser);//4、返回returnvo;}}5.3.4、vo对象
packagecom.tanhua.domain.vo;importcom.tanhua.domain.db.UserInfo;importcom.tanhua.domain.mongo.RecommendUser;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.springframework.beans.BeanUtils;/***今日佳人*/@Data@NoArgsConstructor@AllArgsConstructorpublicclassTodayBest{privateLongid;//用户idprivateStringavatar;privateStringnickname;privateStringgender;//性别manwomanprivateIntegerage;privateString[]tags;privateLongfateValue;//缘分值/***在vo对象中,补充一个工具方法,封装转化过程*/publicstaticTodayBestinit(UserInfouserInfo,RecommendUserrecommendUser){TodayBestvo=newTodayBest();BeanUtils.copyProperties(userInfo,vo);if(userInfo.getTags()!=null){vo.setTags(userInfo.getTags().split(","));}vo.setFateValue(recommendUser.getScore().longValue());returnvo;}}5.3.5、解决MongoDB启动bug
在项目中,添加了mongo的依赖的话,springboot就会自动去连接本地的mongo,由于他连接不上会导致出错。