基于Java得黑马头条项目------day05

第五章的内容主要涉及到图片上传,用的是fastDFS这个分布式文件存储系统用了很多在其他项目里面,所以在搭建的时候没有讲搭建过程,所以如果没有这个fastDFS做这个项目的这个步骤会比较吃力

下面就是fastDFS的接口的编写,还是简单的老三样实在没什么写的了,就是简单的复制粘贴,瞬间感觉编程简单了很多。

首先是搭建后台的前端服务,在搭建的时候一定要先把他包里的这个node_modules这个给删除了,自己在执行npm install, npm run dev, 之后才可以正常的运行这个前端的功能

基于Java得黑马头条项目------day05_第1张图片

这里面有个默认的用户名和密码,账号是zhangsan 密码是123,在ap_user这个库里面存者的可以自己看看有没有没有的话添加一个,他也没有做加密的处理,很简单的

下面的接口开发是内容管理里面的素材管理里面下的文件上传的这个接口,这个接口铺垫了很多东西,其实就是个API的调用,搭建环节久不在赘述了,太简单了实在

图片上传接口:

基于Java得黑马头条项目------day05_第2张图片

直接上文件上传的接口实现,找里面的代码直接复制久行

 

  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地址需要改成虚拟机的地址,如果没有虚拟机的同学这个步骤久没办法做了

基于Java得黑马头条项目------day05_第3张图片

进行图片上传测试,Controller接收到图片上传的请求

基于Java得黑马头条项目------day05_第4张图片

前端页面渲染图片成功

基于Java得黑马头条项目------day05_第5张图片

数据库里面的数据存储成功

基于Java得黑马头条项目------day05_第6张图片

下面的就是图片删除的接口地址:

基于Java得黑马头条项目------day05_第7张图片

 @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);
    }

这个删除的接口也是很简单的一个方法久实现了,非常简单,就是查询,然后判断,然后删除

查询素材列表的接口信息,

基于Java得黑马头条项目------day05_第8张图片

接口信息情况如下

    @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);
        
    }

下面是测试信息:查询素材列表成功

基于Java得黑马头条项目------day05_第9张图片

下面是删除的接口

基于Java得黑马头条项目------day05_第10张图片

删除成功:

基于Java得黑马头条项目------day05_第11张图片

最后是收藏和取消收藏的接口信息

基于Java得黑马头条项目------day05_第12张图片

收藏和取消收藏的接口信息:久一行代码解决

  @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);
    }

 

前端页测试

基于Java得黑马头条项目------day05_第13张图片

收藏页显示了两个图片信息收藏成功:

基于Java得黑马头条项目------day05_第14张图片

接下来的接口就是文章信息管理的功能,也是文章管理模块的对应的接口的开发

基于Java得黑马头条项目------day05_第15张图片

文章管理主要文章发布和保存草稿接口的定义入下所示

基于Java得黑马头条项目------day05_第16张图片

代码

   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 list = objectMapper.readValue(content, List.class);
            //抽取信息
            Map extractInfo = extractUrlInfo(list);
            //图片map信息
            materials = (Map) extractInfo.get("materials");
            //图片数量
            int countImageNum = (int) extractInfo.get("countImageNum");
            //保存或修改文章的数据
            WmNews wmNews = new WmNews();
            BeanUtils.copyProperties(dto,wmNews);
            if(dto.getType().equals(WmMediaConstans.WM_NEWS_TYPE_AUTO)){
                saveWmNews(wmNews,countImageNum,type);
            }else{
                saveWmNews(wmNews,dto.getType(),type);
            }
            //保存内容中的图片和当前文章的关系
            if(materials.keySet().size()!=0){
                ResponseResult responseResult = saveRelationInfoForContent(materials,wmNews.getId());
                if(responseResult!=null){
                    return responseResult;
                }
            }
            //保存封面图片和当前文章的关系
            ResponseResult responseResult = coverIamgesRelation(dto,materials,wmNews,countImageNum);
            //流程处理完成返回处理结果

        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

列表查询正常

基于Java得黑马头条项目------day05_第17张图片

保存文章成功

基于Java得黑马头条项目------day05_第18张图片

基于Java得黑马头条项目------day05_第19张图片

基于Java得黑马头条项目------day05_第20张图片

文章列表接口:

基于Java得黑马头条项目------day05_第21张图片

内容接口分页查询成功

分页查询接口信息:

  @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属性字段删除即可

 

基于Java得黑马头条项目------day05_第22张图片基于Java得黑马头条项目------day05_第23张图片

修改审核状态接口信息

 

基于Java得黑马头条项目------day05_第24张图片

    @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;
    }

基于Java得黑马头条项目------day05_第25张图片

删除文章接口

基于Java得黑马头条项目------day05_第26张图片

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

基于Java得黑马头条项目------day05_第27张图片

基于Java得黑马头条项目------day05_第28张图片

以上就是黑马头条得文章发布相关得接口信息,基本都可以实现,没有什么难度,就是在进fastDFS进行文件存储得时候需要有一个图片服务器才可以,不然后面得文章内容都无法操作,如果有得话,基本就没问题了

你可能感兴趣的:(Java,java,mysql,es)