天天看点

今日佳人

目录

5、今日佳人

5.1、表结构设计

5.2、服务提供者

5.3、代码实现

5、今日佳人

在用户登录成功后,就会进入首页,首页中有今日佳人、推荐好友、探花、搜附近等功能。

今日佳人,会推荐缘分值最大的用户,进行展现出来。缘分值的计算是由用户的行为进行打分,如:点击、点赞、评论、学历、婚姻状态等信息组合而成的。

实现:我们先不考虑推荐的逻辑,假设现在已经有推荐的结果,我们只需要从结果中查询到缘分值最高的用户就可以了。至于推荐的逻辑以及实现,我们将后面的课程中讲解。

流程:

今日佳人

5.1、表结构设计

#表结构 recommend_user

{

 "userId":1001,  #推荐的用户id

 "toUserId":1002, #用户id

 "score":90,  #推荐得分

 "date":"2019/1/1" #日期

}

在MongoDB中只存储用户的id数据,其他的数据需要通过接口查询。

5.2、服务提供者

5.2.0、导入依赖

找到tanhua-domain模块的

pom.xml

打开mongo的依赖

今日佳人

5.2.1、实体类

@AllArgsConstructor

@NoArgsConstructor

@Data

@Document(collection = "recommend_user")

public class RecommendUser implements java.io.Serializable {

   private ObjectId id; //主键id

   private Long userId; //推荐的用户id

   private Long toUserId; //用户id

   private Double score =0d; //推荐得分

   private String date; //日期

}

5.2.2、RecommendUserApi接口

public interface RecommendUserApi {

   RecommendUser queryWithMaxScore(Long toUserId);

}

5.2.3、RecommendUserApiImpl

@DubboService

public class RecommendUserApiImpl  implements RecommendUserApi {

   @Autowired

   private MongoTemplate mongoTemplate;

   //查询今日佳人

   public RecommendUser queryWithMaxScore(Long toUserId) {

       //根据toUserId查询,根据评分score排序,获取第一条

       //构建Criteria

       Criteria criteria = Criteria.where("toUserId").is(toUserId);

       //构建Query对象

       Query query = Query.query(criteria).with(Sort.by(Sort.Order.desc("score")))

              .limit(1);

       //调用mongoTemplate查询

       return mongoTemplate.findOne(query,RecommendUser.class);

  }

}

5.2.4、application配置

server:

port: 18082

spring:

application:

  name: tanhua-dubbo-mongo

cloud:

  nacos:

    discovery:

      server-addr: 192.168.136.160:8848

data:

  mongodb:

    uri: mongodb://192.168.136.160:27017/tanhua        

dubbo:

protocol:

  name: dubbo

  port: 20881

registry:

  address: spring-cloud://localhost

scan:

  base-packages: com.tanhua.dubbo.api  #dubbo中包扫描

5.2.5 启动类

package com.tanhua.dubbo;

import com.baomidou.mybatisplus.annotation.DbType;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;

import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

import org.mybatis.spring.annotation.MapperScan;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.annotation.Bean;

@SpringBootApplication

public class DubboMongoApplication {

   public static void main(String[] args) {

       SpringApplication.run(DubboMongoApplication.class,args);

  }

}

5.3、代码实现

5.3.1、接口说明

地址:http://192.168.136.160:3000/project/19/interface/api/100

今日佳人
今日佳人

5.3.2、TanhuaController

@RestController

@RequestMapping("/tanhua")

public class TanhuaController {

   @Autowired

   private TanhuaService tanhuaService;

   //今日佳人

   @GetMapping("/todayBest")

   public ResponseEntity todayBest() {

       TodayBest vo = tanhuaService.todayBest();

       return ResponseEntity.ok(vo);

  }

}

5.3.3、TanhuaService

@Service

public class TanhuaService {

   @DubboReference

   private RecommendUserApi recommendUserApi;

   @DubboReference

   private UserInfoApi userInfoApi;

   @DubboReference

   private QuestionApi questionApi;

   @Autowired

   private HuanXinTemplate template;

   //查询今日佳人数据

   public TodayBest todayBest() {

       //1、获取用户id

       Long userId = UserHolder.getUserId();

       //2、调用API查询

       RecommendUser recommendUser = recommendUserApi.queryWithMaxScore(userId);

       if(recommendUser == null) {

           recommendUser = new RecommendUser();

           recommendUser.setUserId(1l);

           recommendUser.setScore(99d);

      }

       //3、将RecommendUser转化为TodayBest对象

       UserInfo userInfo = userInfoApi.findById(recommendUser.getUserId());

       TodayBest vo = TodayBest.init(userInfo, recommendUser);

       //4、返回

       return vo;

  }

}

5.3.4、vo对象

package com.tanhua.domain.vo;

import com.tanhua.domain.db.UserInfo;

import com.tanhua.domain.mongo.RecommendUser;

import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;

import org.springframework.beans.BeanUtils;

/**

* 今日佳人

*/

@Data

@NoArgsConstructor

@AllArgsConstructor

public class TodayBest {

   private Long id; //用户id

   private String avatar;

   private String nickname;

   private String gender; //性别 man woman

   private Integer age;

   private String[] tags;

   private Long fateValue; //缘分值

   /**

    * 在vo对象中,补充一个工具方法,封装转化过程

    */

   public static TodayBest init(UserInfo userInfo, RecommendUser recommendUser) {

       TodayBest vo = new TodayBest();

       BeanUtils.copyProperties(userInfo,vo);

       if(userInfo.getTags() != null) {

           vo.setTags(userInfo.getTags().split(","));

      }

       vo.setFateValue(recommendUser.getScore().longValue());

       return vo;

  }

}

5.3.5、解决MongoDB启动bug

在项目中,添加了mongo的依赖的话,springboot就会自动去连接本地的mongo,由于他连接不上会导致出错。

  • 排除掉mongo的依赖
  • springboot中添加排除自动配置的注解
package com.tanhua.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;

@SpringBootApplication(exclude = {
        MongoAutoConfiguration.class,
        MongoDataAutoConfiguration.class
}) //排除mongo的自动配置
public class TanhuaServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(TanhuaServerApplication.class,args);
    }
}