我需要在查询用户的违规次数进行统计,查询用户是在用户服务,而查询违规次数则要到后台服务中。如果完成查询用户违规次数则要使用Feign客户端来调用后台服务的接口。也就是首先要有一个Feign客户端,然后再进行调用就可以了。
第一步建立一个Feign客户端模块,要加Feign包。创建一个CheckClient接口,在接口上加@FeignClient注解并在写上要调用的服务名,在接口内写上要调用方法和参数和方法的调用的地址(地址要写全,写到调用接口上的@RequestMapping注解内的地址)。这样Feign客户端就完成了。
<!-- 服务调用feign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
@FeignClient(value = "service-beark")
public interface CheckClient {
@ApiOperation(value = "获取用户举报次数")
@PostMapping(value = "/beark/checkremark/userCheck/")
Result getUserCheck(@RequestBody List<Userinfo> userinfos);
}
第二步就是在用户服务中进行调用,要加入Feign客户端模块和Feign包。在启动类上加@EnableFeignClients,内填写上调用服务的包名(我只填写了前面一部分)。在Service内加上CheckClient类(我习惯在service层写,实际在哪加应该都一样)。然后先查询全部用户的ID再给后台服务作参数。再把查询得到的值进行返回就可以了。
我的包结构:
加@EnableFeignClients注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.xu")
public class ServiceUserApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceUserApplication.class, args);
}
}
方法:
@Autowired
private CheckClient checkClient;
@Override
public Result getUserList(Page page){
LambdaQueryWrapper<Userinfo> wrapper = new LambdaQueryWrapper();
wrapper.select(Userinfo::getId,Userinfo::getNickName);
Page page1 = baseMapper.selectPage(page, wrapper);
List<Userinfo> records = page1.getRecords();
return checkClient.getUserCheck(records);
}
还有一个是在违规次数查询这里,之前文章中讲了在COUNT函数中可以加表达式来查询笔记和评论的违规次数,但没讲在代码实现了。下面讲下。
首先要在实体类加上这两个字段。再在字段上加@TableField注解来实现COUNT函数加表达式。其中值的意思:value 则对应查询字段时的函数,insertStrategy是添加策略而updateStrategy 是更新策略,然后值FieldStrategy.NEVER就是永远不进行更新和添加的意思。
@ApiModelProperty("笔记违规次数")
@TableField(value = "count(CASE WHEN status = '2' THEN 1 END)", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private Long nodeCount;
@ApiModelProperty("评论违规次数")
@TableField(value = "count(CASE WHEN status = '1' THEN 1 END)", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private Long remarkCount;
方法在这里
@PostMapping("/userCheck")
public Result getUserCheck(@RequestBody List<Userinfo> userinfos){
LambdaQueryWrapper<Check> wrapper = new LambdaQueryWrapper();
ArrayList<Long> uids = new ArrayList();
for (Userinfo userinfo : userinfos){
uids.add(userinfo.getId());
// 对每个用户进行初始化
userinfo.setNodeCount(0l);
userinfo.setRemarkCount(0l);
}
wrapper.select(Check::getNodeCount,Check::getCheckid,Check::getUid)
// 表明已审核
.eq(Check::getPass,1)
.groupBy(Check::getUid)
.in(Check::getUid,uids);
List<Check> list = checkService.list(wrapper);
for (Userinfo userinfo : userinfos){
list.forEach(item -> {
if(item.getUid() == userinfo.getId()){
// 防止空值
if(item.getNodeCount() != null ){
userinfo.setNodeCount(item.getNodeCount());
}
if(item.getRemarkCount() != null ){
userinfo.setRemarkCount(item.getRemarkCount());
}
}
});
}
return Result.ok(userinfos);
}