天天看點

今日佳人

目錄

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);
    }
}