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