目录
1.2接口: ApUserRealnameController
1.3mapper:ApUserRealnameMapper
1.4service实现类:ApUserRealnameServiceImpl
2.3.完善ApUserRealnameController
3.1完善ApUserRenalnameController
黑马头条day08下半部分用户审核、自媒体文章人工审核来啦!
一、用户审核
该部分写在user模块中
1.查询列表
1.1实体类准备
pojo类:ApUserRealname
package com.heima.model.admin.pojos;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* APP实名认证信息表
* </p>
*
* @author itheima
*/
@Data
@TableName("ap_user_realname")
public class ApUserRealname implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 账号ID
*/
@TableField("user_id")
private Integer userId;
/**
* 用户名称
*/
@TableField("name")
private String name;
/**
* 资源名称
*/
@TableField("idno")
private String idno;
/**
* 正面照片
*/
@TableField("font_image")
private String fontImage;
/**
* 背面照片
*/
@TableField("back_image")
private String backImage;
/**
* 手持照片
*/
@TableField("hold_image")
private String holdImage;
/**
* 活体照片
*/
@TableField("live_image")
private String liveImage;
/**
* 状态
0 创建中
1 待审核
2 审核失败
9 审核通过
*/
@TableField("status")
private Short status;
/**
* 拒绝原因
*/
@TableField("reason")
private String reason;
/**
* 创建时间
*/
@TableField("created_time")
private Date createdTime;
/**
* 提交时间
*/
@TableField("submited_time")
private Date submitedTime;
/**
* 更新时间
*/
@TableField("updated_time")
private Date updatedTime;
}
dto:AuthDto
package com.heima.model.admin.dtos;
import com.heima.model.common.dtos.PageRequestDto;
import lombok.Data;
/**
* @author Z-熙玉
* @version 1.0
*/
@Data
public class AuthDto extends PageRequestDto {
private Integer id;
private String msg;
private Integer status;
}
1.2接口: ApUserRealnameController
@RestController
@RequestMapping("/api/v1/auth")
public class ApUserRealnameController {
@Autowired
private ApUserRealnameService apUserRealnameService;
@PostMapping("/list")
public ResponseResult list(@RequestBody AuthDto authDto) {
return apUserRealnameService.list(authDto);
}
}
1.3mapper:ApUserRealnameMapper
package com.heima.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.admin.pojos.ApUserRealname;
import org.apache.ibatis.annotations.Mapper;
/**
* @author Z-熙玉
* @version 1.0
*/
@Mapper
public interface ApUserRealnameMapper extends BaseMapper<ApUserRealname> {
}
1.4service实现类:ApUserRealnameServiceImpl
@Service
@Slf4j
public class ApUserRealnameServiceImpl extends ServiceImpl<ApUserRealnameMapper, ApUserRealname> implements ApUserRealnameService {
/**
* 用户审核列表 - 根据状态分页查询
* @param dto
* @return
*/
@Override
public ResponseResult list(AuthDto dto) {
//校验参数
if (dto == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
dto.checkParam();
//分页查询
IPage page = new Page(dto.getPage(), dto.getSize());
LambdaQueryWrapper<ApUserRealname> queryWrapper = new LambdaQueryWrapper<>();
//根据状态查询
if (dto.getStatus() != null) {
queryWrapper.eq(ApUserRealname::getStatus, dto.getStatus());
}
page = page(page, queryWrapper);
//返回结果
PageResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
responseResult.setData(page.getRecords());
return responseResult;
}
}
2.审核成功
2.1.创建常量类:UserConstans
package com.heima.common.constants;
public class UserConstants {
public static final Short PASS_AUTH = 9;
public static final Short FAIL_AUTH = 2;
public static final Integer AUTH_TYPE = 2;
}
2.2.定义feignclient
因为审核成功之后是需要创建自媒体账号的,因此需要调用自媒体服务的接口,需要定义feignclient,进行远程调用。
首先在api模块中创建feign接口:
package com.heima.apis.wemedia;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.pojos.WmUser;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @author Z-熙玉
* @version 1.0
*/
@FeignClient("leadnews-wemedia")
public interface IWemediaClient {
/**
* 根据名称查询自媒体用户信息
* @param name
* @return
*/
@GetMapping("/api/v1/user/findByName/{name}")
WmUser findWmUserByName(@PathVariable("name") String name);
/**
* 创建自媒体用户
* @param wmUser
*/
@PostMapping("/api/v1/wm_user/save")
ResponseResult saveWmUser(@RequestBody WmUser wmUser);
}
其次在自媒体服务创建feign接口的实现(也就是编写controller接口以及业务方法),一般来讲,定义feign是不需要实现api中的feign接口就可以进行调用的,但是老师这里还有之前都会进行实现,我斗胆猜测一下原因:因为这些接口不是对外暴露,也就是前端是没有发送这个请求的,这些接口只对服务内部进行调用,因此老师才会单独创建一个feign包,将controller定义在其中,并实现feign接口提高调用效率。(仅是个人猜测)
package com.heima.wemedia.feign;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.heima.apis.wemedia.IWemediaClient;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.pojos.WmUser;
import com.heima.wemedia.service.WmUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @author Z-熙玉
* @version 1.0
*/
@RestController
public class WemediaClient implements IWemediaClient {
@Autowired
private WmUserService wmUserService;
/**
* 根据名称查询自媒体用户信息
* @param name
* @return
*/
@GetMapping("/api/v1/user/findByName/{name}")
public WmUser findWmUserByName(@PathVariable("name") String name) {
return wmUserService.getOne(Wrappers.<WmUser>lambdaQuery().eq(WmUser::getName, name));
}
/**
* 创建自媒体用户
* @param wmUser
*/
@Override
@PostMapping("/api/v1/wm_user/save")
public ResponseResult saveWmUser(@RequestBody WmUser wmUser) {
wmUserService.save(wmUser);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
}
注意:记得在user启类加上EnableFeignClient注解,不然小心报nosuchbean的异常哦
2.3.完善ApUserRealnameController
@PostMapping("/authPass")
public ResponseResult authPass(@RequestBody AuthDto authDto) {
return apUserRealnameService.updateStatus(authDto, UserConstants.PASS_AUTH);
}
2.4.完善service实现类
/**
* 更新认证状态
* @param dto
* @param status
* @return
*/
@Override
public ResponseResult updateStatus(AuthDto dto, Short status) {
//校验参数
if (dto == null || dto.getId() == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//修改认证状态
ApUserRealname apUserRealname = new ApUserRealname();
apUserRealname.setId(dto.getId());
apUserRealname.setStatus(status);
apUserRealname.setUpdatedTime(new Date());
if(StringUtils.isNotBlank(dto.getMsg())){
apUserRealname.setReason(dto.getMsg());
}
updateById(apUserRealname);
//如果认证成功,则创建账户
if (status.equals(UserConstants.PASS_AUTH)) {
ResponseResult responseResult = createWmUserAndAuthor(dto);
return responseResult;
}
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
@Autowired
private IWemediaClient wemediaClient;
@Autowired
private ApUserMapper apUserMapper;
/**
* 创建账户
* @param dto
* @return
*/
private ResponseResult createWmUserAndAuthor(AuthDto dto) {
Integer userRealnameId = dto.getId();
//查询用户认证信息
ApUserRealname apUserRealname = getById(userRealnameId);
if(apUserRealname == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
//查询app端用户信息
Integer userId = apUserRealname.getUserId();
ApUser apUser = apUserMapper.selectById(userId);
if(apUser == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
//创建自媒体账户
WmUser wmUser = wemediaClient.findWmUserByName(apUser.getName());
if(wmUser == null){
wmUser= new WmUser();
wmUser.setApUserId(apUser.getId());
wmUser.setCreatedTime(new Date());
wmUser.setName(apUser.getName());
wmUser.setPassword(apUser.getPassword());
wmUser.setSalt(apUser.getSalt());
wmUser.setPhone(apUser.getPhone());
wmUser.setStatus(9);
wemediaClient.saveWmUser(wmUser);
}
apUser.setFlag((short)1);
apUserMapper.updateById(apUser);
return null;
}
3.审核失败
3.1完善ApUserRenalnameController
@PostMapping("/authPass")
public ResponseResult authPass(@RequestBody AuthDto authDto) {
return apUserRealnameService.updateStatus(authDto, UserConstants.PASS_AUTH);
}
因为和审核成功调用的是同一个service方法,只是参数不同,因此,只需定义controller接口即可
二、自媒体文章人工审核
此部分在自媒体模块中完成
1.文章列表查询
1.1创建实体类以及常量类准备
dto:NewsAuthDto
package com.heima.model.admin.dtos;
import com.heima.model.common.dtos.PageRequestDto;
import lombok.Data;
/**
* @author Z-熙玉
* @version 1.0
*/
@Data
public class NewsAuthDto extends PageRequestDto {
private Integer id;
private String msg;
private Integer status;
private String title;
}
vo:WmNewsVo
package com.heima.model.wemedia.vos;
import com.heima.model.wemedia.pojos.WmNews;
import lombok.Data;
@Data
public class WmNewsVo extends WmNews {
/**
* 作者名称
*/
private String authorName;
}
常量类:WemediaConstans
package com.heima.common.constants;
public class WemediaConstants {
public static final Short COLLECT_MATERIAL = 1;//收藏
public static final Short CANCEL_COLLECT_MATERIAL = 0;//取消收藏
public static final String WM_NEWS_TYPE_IMAGE = "image";
public static final Short WM_NEWS_NONE_IMAGE = 0;
public static final Short WM_NEWS_SINGLE_IMAGE = 1;
public static final Short WM_NEWS_MANY_IMAGE = 3;
public static final Short WM_NEWS_TYPE_AUTO = -1;
public static final Short WM_CONTENT_REFERENCE = 0;
public static final Short WM_COVER_REFERENCE = 1;
public static final Short WM_NEWS_AUTH_PASS = 4;
public static final Short WM_NEWS_AUTH_FAIL = 2;
}
1.2完善WmNewsController
@PostMapping("/list_vo")
public ResponseResult findList(@RequestBody NewsAuthDto dto) {
return wmNewsService.findList(dto);
}
1.3service实现类完善
/**
* 管理端文章列表查询
* @param dto
* @return
*/
@Override
public ResponseResult findList(NewsAuthDto dto) {
//校验参数
if (dto == null || dto.getId() == null) {
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
dto.checkParam();
//2.分页查询+count查询
dto.setPage((dto.getPage()-1)*dto.getSize());
List<WmNewsVo> wmNewsVoList = wmNewsMapper.findListAndPage(dto);
int count = wmNewsMapper.findListCount(dto);
//3.结果返回
ResponseResult responseResult = new PageResponseResult(dto.getPage(),dto.getSize(),count);
responseResult.setData(wmNewsVoList);
return responseResult;
}
1.4mapper接口
package com.heima.wemedia.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.heima.model.admin.dtos.NewsAuthDto;
import com.heima.model.wemedia.pojos.WmNews;
import com.heima.model.wemedia.vos.WmNewsVo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface WmNewsMapper extends BaseMapper<WmNews> {
/**
* 文章分页查询
* @param dto
* @return
*/
List<WmNewsVo> findListAndPage(NewsAuthDto dto);
/**
* 查询记录数
* @param dto
* @return
*/
int findListCount(NewsAuthDto dto);
}
1.5mapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.heima.wemedia.mapper.WmNewsMapper">
<select id="findListAndPage" parameterType="com.heima.model.admin.dtos.NewsAuthDto"
resultType="com.heima.model.wemedia.vos.WmNewsVo">
SELECT
wn.*,wu.`name` authorName
FROM
wm_news wn
LEFT JOIN
wm_user wu
ON wn.user_id = wu.id
<where>
<if test="dto.title!=null and dto.title!=''">
and wn.title like concat('%',#{dto.title},'%')
</if>
<if test="dto.status!=null">
and wn.status = #{dto.status}
</if>
</where>
limit #{dto.page},#{dto.size}
</select>
<select id="findListCount" parameterType="com.heima.model.admin.dtos.NewsAuthDto"
resultType="int">
SELECT
count(1)
FROM
wm_news wn
LEFT JOIN
wm_user wu
ON wn.user_id = wu.id
<where>
<if test="dto.title!=null and dto.title!=''">
and wn.title like concat('%',#{dto.title},'%')
</if>
<if test="dto.status!=null">
and wn.status = #{dto.status}
</if>
</where>
</select>
</mapper>
2.查询文章详情
2.1完善WmNewsController
@GetMapping("/one_vo/{id}")
public ResponseResult findWmNewsVo(@PathVariable("id") Integer id) {
return wmNewsService.findWmNewsVo(id);
}
2.2service实现类
/**
* 管理端查看文章详情请
* @param id
* @return
*/
@Override
public ResponseResult findWmNewsVo(Integer id) {
//1.检查参数
if(id == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//2.查询文章信息
WmNews wmNews = getById(id);
if(wmNews == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
//3.查询用户信息
WmUser wmUser = wmUserMapper.selectById(wmNews.getUserId());
//4.封装vo返回
WmNewsVo vo = new WmNewsVo();
//属性拷贝
BeanUtils.copyProperties(wmNews,vo);
if(wmUser != null){
vo.setAuthorName(wmUser.getName());
}
// ResponseResult responseResult = new ResponseResult().ok(vo);
// return responseResult;
return ResponseResult.okResult(vo);
}
3.审核失败、审核通过
审核失败既前端点击了“驳回”,表示人工审核不通过
3.1完善WmNewsController
@PostMapping("/auth_fail")
public ResponseResult authFail(@RequestBody NewsAuthDto dto) {
return wmNewsService.updateStatus(dto, WemediaConstants.WM_NEWS_AUTH_FAIL);
}
@PostMapping("/auth_pass")
public ResponseResult authPass(@RequestBody NewsAuthDto dto) {
return wmNewsService.updateStatus(dto, WemediaConstants.WM_NEWS_AUTH_PASS);
}
3.2servie实现类
/**
* 审核文章,修改状态
* @param dto
* @param status
* @return
*/
@Override
public ResponseResult updateStatus(NewsAuthDto dto, Short status) {
//1.检查参数
if(dto == null || dto.getId() == null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//2.查询文章信息
WmNews wmNews = getById(dto.getId());
if(wmNews == null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
}
//3.修改文章的状态
wmNews.setStatus(status);
if(StringUtils.isNotBlank(dto.getMsg())){
wmNews.setReason(dto.getMsg());
}
updateById(wmNews);
//审核成功,则需要创建app端文章数据,并修改自媒体文章
if(status.equals(WemediaConstants.WM_NEWS_AUTH_PASS)){
//创建app端文章数据
ResponseResult responseResult = wmNewsAutoScanService.saveAppArticle(wmNews);
if(responseResult.getCode().equals(200)){
wmNews.setArticleId((Long) responseResult.getData());
wmNews.setStatus(WmNews.Status.PUBLISHED.getCode());
updateById(wmNews);
}
}
注意:审核成功后,需要在app端创建文章数据,这时候需要调用wmNewsAutoScanService的saveAppArticle方法,这个方法我们之前在做文章自动审核时创建过,但是应该是私有的,既private,所以在这里如果调用报错的话,找到这个方法,修改为public即可。
至此,day08实战部分全部结束,本文章仅提供参考,不要直接照搬哦,一定要自己动手做,“我亦无他,唯手熟尔”,只有亲自动手才能真正有所收获,祝小伙伴们在码农的道路上一帆风顺!
有问题的话还是在评论区交流哦,看到了就会回答的,另外,给孩子个点赞加关注吧,据说点赞的人,bug会离你越来越远哦。(明天更新day09实战)