第五章的内容主要涉及到图片上传,用的是fastDFS这个分布式文件存储系统用了很多在其他项目里面,所以在搭建的时候没有讲搭建过程,所以如果没有这个fastDFS做这个项目的这个步骤会比较吃力
下面就是fastDFS的接口的编写,还是简单的老三样实在没什么写的了,就是简单的复制粘贴,瞬间感觉编程简单了很多。
首先是搭建后台的前端服务,在搭建的时候一定要先把他包里的这个node_modules这个给删除了,自己在执行npm install, npm run dev, 之后才可以正常的运行这个前端的功能
这里面有个默认的用户名和密码,账号是zhangsan 密码是123,在ap_user这个库里面存者的可以自己看看有没有没有的话添加一个,他也没有做加密的处理,很简单的
下面的接口开发是内容管理里面的素材管理里面下的文件上传的这个接口,这个接口铺垫了很多东西,其实就是个API的调用,搭建环节久不在赘述了,太简单了实在
图片上传接口:
直接上文件上传的接口实现,找里面的代码直接复制久行
public ResponseResult uploadPicture(MultipartFile multipartFile) {
//获取当前登录用户
WmUser wmUser = WmThreadLocalUtils.getUser();
if(wmUser==null){
return ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
}
//验证参数
if(multipartFile==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//上传图片到fastdfs
String originalFilename = multipartFile.getOriginalFilename();//aa.jpg
String extName = originalFilename.substring(originalFilename.lastIndexOf(".")+1);
if(!extName.matches("(gif|png|jpg|jpeg)")){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_IMAGE_FORMAT_ERROR);
}
String fileId = null;
try {
fileId = fastDfsClient.uploadFile(multipartFile.getBytes(), extName);
} catch (Exception e) {
e.printStackTrace();
log.error("user {} upload file {} to fastDfs error,error info:n", wmUser.getId(),originalFilename,e.getMessage());
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
}
//上传成功后,保存一条数据wm_material
WmMaterial wmMaterial = new WmMaterial();
wmMaterial.setCreatedTime(new Date());
wmMaterial.setType((short)0);
wmMaterial.setUrl(fileId);
wmMaterial.setIsCollection((short)0);
wmMaterial.setUserId(wmUser.getId());
wmMaterialMapper.insert(wmMaterial);
wmMaterial.setUrl(fileServerUrl+fileId);
return ResponseResult.okResult(wmMaterial);
}
需要改的地方就是Fastdfs的IP地址需要改成虚拟机的地址,如果没有虚拟机的同学这个步骤久没办法做了
进行图片上传测试,Controller接收到图片上传的请求
前端页面渲染图片成功
数据库里面的数据存储成功
下面的就是图片删除的接口地址:
@Override
public ResponseResult delPicture(WmMaterialDto dto) {
WmUser user = WmThreadLocalUtils.getUser();
if(dto==null || dto.getId() ==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//删除fastdfs中的图片 先去判断当前图片有没有关联
WmMaterial wmMaterial = wmMaterialMapper.selectByPrimaryKey(dto.getId());
if(wmMaterial==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
int count = wmNewsMaterialMapper.countByMid(wmMaterial.getId());
if(count > 0){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"当前图片被引用");
}
String fileId = wmMaterial.getUrl().replace(fileServerUrl,"");
try {
fastDfsClient.delFile(fileId);
} catch (Exception e) {
e.printStackTrace();
log.error("user {} delete file {} from fastDfs error,error info :n",user.getId(),fileId,e.getMessage());
return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
}
//删除 wm_material表中的数据
wmMaterialMapper.deleteByPrimaryKey(dto.getId());
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
这个删除的接口也是很简单的一个方法久实现了,非常简单,就是查询,然后判断,然后删除
查询素材列表的接口信息,
接口信息情况如下
@Override
public ResponseResult findList(WmMaterialListDto dto) {
//验证参数
dto.checkParam();
//获取用户
Long uid = WmThreadLocalUtils.getUser().getId();
//查询
List datas = wmMaterialMapper.findListByUidAndStatus(dto, uid);
datas = datas.stream().map((item)->{
item.setUrl(fileServerUrl+item.getUrl());
return item;
}).collect(Collectors.toList());
int total = wmMaterialMapper.countListByUidAndStatus(dto, uid);
//返回
Map resDatas = new HashMap<>();
resDatas.put("curPage",dto.getPage());
resDatas.put("size",dto.getSize());
resDatas.put("list",datas);
resDatas.put("total",total);
return ResponseResult.okResult(resDatas);
}
下面是测试信息:查询素材列表成功
下面是删除的接口
删除成功:
最后是收藏和取消收藏的接口信息
收藏和取消收藏的接口信息:久一行代码解决
@Override
public ResponseResult changeUserMaterialStatus(WmMaterialDto dto, Short type) {
if(dto ==null || dto.getId()==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//获取用户信息
WmUser user = WmThreadLocalUtils.getUser();
wmMaterialMapper.updateStatusByUidAndId(dto.getId(),user.getId(),type);
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
前端页测试
收藏页显示了两个图片信息收藏成功:
接下来的接口就是文章信息管理的功能,也是文章管理模块的对应的接口的开发
文章管理主要文章发布和保存草稿接口的定义入下所示
代码
public ResponseResult saveNews(WmNewsDto dto, Short type) {
// 如果用户传递参数为空或文章内容为空返回PARAM_REQUIRE错误
if(dto==null || StringUtils.isEmpty(dto.getContent())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//如果用户本次为修改操作那么先删除数据库关联数据
if(dto.getId()!=null){
wmNewsMaterialMapper.delByNewsId(dto.getId());
}
//将用户提交的文章内容解析转为Map结构的数据
String content = dto.getContent();
Map materials;
try {
List
列表查询正常
保存文章成功
文章列表接口:
内容接口分页查询成功
分页查询接口信息:
@Override
public ResponseResult listByUser(WmNewsPageReqDto dto) {
if(dto==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
dto.checkParam();
Long uid = WmThreadLocalUtils.getUser().getId();
List datas = wmNewsMapper.selectBySelective(dto, uid);
int total = wmNewsMapper.countSelectBySelective(dto, uid);
PageResponseResult responseResult = new PageResponseResult(dto.getPage(),dto.getSize(),total);
responseResult.setData(datas);
responseResult.setHost(fileServerUrl);
return responseResult;
}
在进行分页查询得时候回出现一个字段找不到吧wmNewsMapper里面得enable属性字段删除即可
修改审核状态接口信息
@Override
public ResponseResult findWmNewsById(WmNewsDto dto) {
if(dto == null || dto.getId()==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE,"文章ID不可缺少");
}
WmNews wmNews = wmNewsMapper.selectNewsDetailByPrimaryKey(dto.getId());
if(wmNews==null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"文章不存在");
}
ResponseResult responseResult = ResponseResult.okResult(wmNews);
responseResult.setHost(fileServerUrl);
return responseResult;
}
删除文章接口
public ResponseResult delNews(WmNewsDto dto) {
if(dto ==null || dto.getId()==null){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
}
//查询文章
WmNews wmNews = wmNewsMapper.selectNewsDetailByPrimaryKey(dto.getId());
//文章是否存在
if(wmNews==null){
return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,"文章不存在");
}
//当前文章是否审核通过 app
if(WmMediaConstans.WM_NEWS_AUTHED_STATUS.equals(wmNews.getStatus())||WmMediaConstans.WM_NEWS_PUBLISH_STATUS.equals(wmNews.getStatus())){
return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID,"当前文章已通过审核不可删除");
}
//删除文章与素材的关系
wmNewsMaterialMapper.delByNewsId(wmNews.getId());
//删除文章
wmNewsMapper.deleteByPrimaryKey(wmNews.getId());
return ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);
}
以上就是黑马头条得文章发布相关得接口信息,基本都可以实现,没有什么难度,就是在进fastDFS进行文件存储得时候需要有一个图片服务器才可以,不然后面得文章内容都无法操作,如果有得话,基本就没问题了
。