用户的实名认证信息会保存在用户库中,有一个表存储ap_user_auth。后端可以选择审核通过或者驳回认证信息。如果驳回,录入驳回的原因,告知用户。如果是通过,需要有多个微服务和数据库参与数据保存。
参与的微服务有 用户服务、自媒体服务、文章服务,用户认证成功首先要修改认证表的状态,需要去创建自媒体用户,远程调用自媒体服务。还需要远程调用文章服务,创建作者,app用户可以看到的文章作者信息。最后把用户的类型改为自媒体用户。
使用OpenFeign进行远程调用,会使用分布式事务Seata
package com.heima.feignclient.client;
import com.heima.model.article.dtos.AuthorDto;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient("leadnews-article")
public interface ArticleFeign {
/**
* 保存作者
* @param dto
* @return
*/
@PostMapping("/api/v1/author/save")
Integer saveAuthor(@RequestBody AuthorDto dto);
}
@Autowired
private ApUserService apUserService;
@Autowired
private WemediaFeign wemediaFeign;
@Autowired
private ArticleFeign articleFeign;
@Override
@Transactional(rollbackFor = Exception.class)
public void userAuth(AuthDto dto, int status) {
// 获取认证信息id
Integer authId = dto.getId();
// 根据id 修改认证状态,原因
ApUserAuth userAuth = new ApUserAuth();
userAuth.setId(authId);
userAuth.setStatus(status);
userAuth.setReason(status==9?"":dto.getMsg());
boolean b = updateById(userAuth);
if(!b){
log.error("修改用户审核状态失败,authId={}",authId);
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
// 如果不通过,直接结束
if(status==2){
log.info("用户认证不通过,直接结束,authId={}",authId);
return ;
}
// 根据认证信息id,查询认证信息,获取ap_user_id
userAuth = getById(authId);
Integer userId = userAuth.getUserId();
// 根据ap_user_id 查询ap_user 的数据
ApUser apUser = apUserService.getById(userId);
// 远程调用,自媒体服务,创建自媒体用户
WmUserDto wmUserDto = new WmUserDto();
wmUserDto.setApUserId(userId);
wmUserDto.setName(apUser.getName());
wmUserDto.setPassword(apUser.getPassword());
wmUserDto.setStatus(9);
wmUserDto.setPhone(apUser.getPhone());
wmUserDto.setImage(apUser.getImage());
try {
Integer wmUserId = wemediaFeign.userSave(wmUserDto);
wmUserDto.setId(wmUserId);
}catch (Exception e){
log.error("远程调用wemedia,创建用户失败,userId={}",userId);
e.printStackTrace();
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
// 远程调用,article服务,创建作者
AuthorDto authorDto = new AuthorDto();
authorDto.setUserId(userId);
authorDto.setWmUserId(wmUserDto.getId());
authorDto.setName(apUser.getName());
authorDto.setType(2);
try {
Integer authorId = articleFeign.saveAuthor(authorDto);
}catch (Exception e){
log.error("远程调用article,创建用户失败,userId={}",userId);
e.printStackTrace();
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
// 修改user的flag状态,改为 1- 自媒体人
apUser = new ApUser();
apUser.setId(userId);
apUser.setFlag(1);
boolean b1 = apUserService.updateById(apUser);
if(!b1){
log.error("修改用户flag失败,userId={}",userId);
throw new LeadException(AppHttpCodeEnum.SERVER_ERROR);
}
}