天天看點

9. 自媒體素材管理自媒體素材管理

自媒體素材管理

1. 素材上傳

1.1 需求分析

圖檔上傳的頁面,首先是展示素材資訊,可以點選圖檔上傳,彈窗後可以上傳圖檔

9. 自媒體素材管理自媒體素材管理

1.2 媒體圖文素材資訊表wm_material結構分析

9. 自媒體素材管理自媒體素材管理

1.3 實作思路

9. 自媒體素材管理自媒體素材管理

1.4 代碼實作

1. 網關進行token解析後,把解析後的使用者資訊存儲到header中

//獲得token解析後中的使用者資訊
Object userId = claimsBody.get("id");
//在header中添加新的資訊
ServerHttpRequest serverHttpRequest = request.mutate().headers(httpHeaders -> {
    httpHeaders.add("userId", userId + "");
}).build();
//重置header
exchange.mutate().request(serverHttpRequest).build();
           

2. 自媒體微服務使用攔截器擷取到header中的的使用者資訊,并放入到threadlocal中

ThreadlocalUtil工具類

package com.heima.utils.threadutils;

import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.model.wemedia.pojos.WmUser;

public class ThreadLocalUtil {

    private static final ThreadLocal<WmUser> THREAD_LOCAL_WM = new ThreadLocal<>();


    /**
     * 向目前線程設定值WmMaterial
     */
    public static void setWmUser(WmUser wmUser){
        THREAD_LOCAL_WM.set(wmUser);
    }

    /**
     * 擷取WmMaterial
     */

    public static WmUser getWmUser(){
      return   THREAD_LOCAL_WM.get();
    }


    /**
     * 删除目前線程存的WmMaterial
     *
     */

    public static void delete(){
        THREAD_LOCAL_WM.remove();
    }

}

           

在微服務新增攔截器,建立一個類實作HandlerInterceptor接口,重寫方法前置和後置方法

package com.heima.wemedia.interceptor;

import com.heima.model.wemedia.pojos.WmUser;
import com.heima.utils.threadutils.ThreadLocalUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 攔截器
 */
public class WmInterceptor implements HandlerInterceptor {

    /**
     *擷取header中的使用者資訊,存入目前線程中
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


        //1.擷取請求頭中的userId
        String userId = request.getHeader("userId");

        if(userId != null){
            //2.把userId存進目前線程中
            WmUser wmUser = new WmUser();
            wmUser.setId(Integer.valueOf(userId));

            ThreadLocalUtil.setWmUser(wmUser);
        }
        return true;
    }

    /**
     *線程結束時,清理目前線程中的使用者資訊
     */
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        ThreadLocalUtil.delete();
    }
}

           

配置使攔截器生效,攔截所有的請求

定義一個類實作WebMvcConfigure接口,重寫addInterceptors方法

package com.heima.wemedia.config;

import com.heima.wemedia.interceptor.WmInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new WmInterceptor())
                .addPathPatterns("/**");//攔截所有請求
    }
}

           

3. 接口定義

說明
接口路徑 /api/v1/material/upload_picture
請求方式 POST
參數 MultipartFile
響應結果 ResponseResult

ResponseResult :

成功需要回顯圖檔,傳回素材對象

{
  "host":null,
  "code":200,
  "errorMessage":"操作成功",
  "data":{
    "id":52,
    "userId":1102,
    "url":"http://192.168.200.130:9000/leadnews/2021/04/26/a73f5b60c0d84c32bfe175055aaaac40.jpg",
    "type":0,
    "isCollection":0,
    "createdTime":"2021-01-20T16:49:48.443+0000"
  }
}
           
自媒體微服務內建heima-file-starter

①:導入heima-file-starter

<dependencies>
    <dependency>
        <groupId>com.heima</groupId>
        <artifactId>heima-file-starter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
           

②:在自媒體微服務的配置中心添加以下配置:

minio:
  accessKey: minio
  secretKey: minio123
  bucket: leadnews
  endpoint: http://192.168.200.130:9000
  readPath: http://192.168.200.130:9000
           

4. 具體業務實作邏輯

WmMaterialController

package com.heima.wemedia.controller.v1;

import com.heima.model.common.dtos.ResponseResult;
import com.heima.wemedia.service.WmMaterialService;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
@RequestMapping("/api/v1/material")
public class WmMaterialController {


    @Autowired
    private WmMaterialService wmMaterialService;


    /**
     * 素材上傳
     * 請求路徑:"/api/v1/material/upload_picture"
     * 請求方式:post
     * 請求參數:MultipartFile 圖檔檔案
     * 響應資料:ResponseResult
     */
    @PostMapping("/upload_picture")
    public ResponseResult uploadPicture(MultipartFile multipartFile){

        ResponseResult responseResult = wmMaterialService.uploadPicture(multipartFile);
        return responseResult;
    }
}

           

WmMaterialService

package com.heima.wemedia.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.wemedia.pojos.WmMaterial;
import org.springframework.web.multipart.MultipartFile;

public interface WmMaterialService extends IService<WmMaterial> {
    //素材上傳
    ResponseResult uploadPicture(MultipartFile multipartFile);
}

           

WmMaterialServiceImpl

package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.file.service.FileStorageService;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.pojos.WmMaterial;
import com.heima.utils.threadutils.ThreadLocalUtil;
import com.heima.wemedia.mapper.WmMaterialMapper;
import com.heima.wemedia.service.WmMaterialService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import java.io.IOException;
import java.util.Date;
import java.util.UUID;

@Service
@Slf4j
public class WmMaterialServiceImpl extends ServiceImpl<WmMaterialMapper, WmMaterial> implements WmMaterialService {


    @Autowired
    private FileStorageService fileStorageService;



    /**
     * 上傳素材,圖檔檔案上傳至minio
     * @param multipartFile
     * @return
     */
    public ResponseResult uploadPicture(MultipartFile multipartFile) {

        //1.圖檔檔案的參數校驗
        if(multipartFile == null || multipartFile.getSize() == 0){
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_IMAGE_FORMAT_ERROR);
        }


        //2.圖檔上傳至minio
        String uuid = UUID.randomUUID().toString().replace("-", ".");
        String originalFilename = multipartFile.getOriginalFilename();
        //擷取檔案字尾名,例如原本圖檔的檔案名,例如bbb.jpg;從點開始截,得到.jpg
        String posrfix = originalFilename.substring(originalFilename.lastIndexOf("."));

        String pictureUrl=null;

        try {
            pictureUrl = fileStorageService.uploadImgFile("", uuid + posrfix, multipartFile.getInputStream());

            log.info("上傳圖檔到MinIO中,fileId:{}",pictureUrl);
        } catch (IOException e) {
            e.printStackTrace();
            log.error("WmMaterialServiceImpl-上傳檔案失敗");
        }


        //3.建立MultipartFile對象,封裝資料,儲存到資料庫中
        WmMaterial wmMaterial = new WmMaterial();
        wmMaterial.setUserId(ThreadLocalUtil.getWmUser().getId());
        wmMaterial.setUrl(pictureUrl);
        wmMaterial.setType( (short) 0);
        wmMaterial.setIsCollection( (short) 0 );
        wmMaterial.setCreatedTime(new Date());
        save(wmMaterial);

        return ResponseResult.okResult(wmMaterial);
    }
}

           

2. 素材清單查詢

2.1接口定義

說明
接口路徑 /api/v1/material/list
請求方式 POST
參數 WmMaterialDto
響應結果 ResponseResult

ResponseResult :

@Data
public class WmMaterialDto extends PageRequestDto {

    /**
     * 1 收藏
     * 0 未收藏
     */
    private Short isCollection;
}
           

ResponseResult:

{
  "host":null,
  "code":200,
  "errorMessage":"操作成功",
  "data":[
    {
    "id":52,
      "userId":1102,
      "url":"http://192.168.200.130:9000/leadnews/2021/04/26/ec893175f18c4261af14df14b83cb25f.jpg",
      "type":0,
      "isCollection":0,
      "createdTime":"2021-01-20T16:49:48.000+0000"
    },
    ....
  ],
  "currentPage":1,
  "size":20,
  "total":0
}
           

2.2 具體業務邏輯代碼實作

2.2.1 dto,封裝請求參數

package com.heima.model.wemedia.dtos;

import com.heima.model.common.dtos.PageRequestDto;
import lombok.Data;

@Data
public class WmMaterialDto extends PageRequestDto {

    /**
     * 1 收藏
     * 0 未收藏
     */
    private Short isCollection;
}
           

2.2.2 Controller

/**
     * 分頁查詢素材清單展示
     * 請求路徑:"/api/v1/material"
     * 請求方式: post
     * 請求參數: WmMaterialDto
     * 響應資料: ResponseResult
     */
    @PostMapping("list")
    public  ResponseResult selectPicture(@RequestBody WmMaterialDto dto){

        ResponseResult responseResult = wmMaterialService.selectPicture(dto);

        return responseResult;
    }
           

2.2.3 Service

//分頁查詢素材清單展示
    ResponseResult selectPicture(WmMaterialDto dto);
           

2.2.4 ServiceImpl

/**
     * 分頁查詢素材圖檔
     * @param dto
     * @return
     */
    public ResponseResult selectPicture(WmMaterialDto dto) {
         //1.分頁查詢參數校驗
        dto.checkParam();
        //2.依次根據條件設定查詢條件

        LambdaQueryWrapper<WmMaterial> lwq = new LambdaQueryWrapper<>();

        if(dto.getIsCollection() != null && dto.getIsCollection() == 1){
            lwq.eq(WmMaterial::getIsCollection, dto.getIsCollection());//是否收藏
        }
        
        lwq.eq(WmMaterial::getUserId, ThreadLocalUtil.getWmUser().getId());//根據使用者id查

        lwq.orderByDesc(WmMaterial::getCreatedTime);//根據釋出時間倒序查

        //3.建立Ipage分頁對象,設定分頁參數
        IPage<WmMaterial> page = new Page<>(dto.getPage(),dto.getSize());

        //4.執行分頁查詢
        IPage<WmMaterial> iPage = wmMaterialMapper.selectPage(page, lwq);

        //5.構造傳回資料
        ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) iPage.getTotal());
        responseResult.setData(iPage.getRecords());

        return responseResult;
    }
           

2.2.5 在自媒體引導類中天mybatis-plus的分頁攔截器

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
}