学成在线-删除媒资文件新需求实现

    科技2022-08-15  89

    文章目录

    前言一、需求内容二、删除媒资文件三、新需求实现1.同一工程实现2.使用feign远程调用实现(1)course服务增加查询接口(2)course服务application.yml添加配置(3)media服务进行远程调用(4)启动类添加注解 四、测试


    前言

    在实现删除媒资文件时,还没有听到讲解与课程计划的关联,所以我们的新需求就是:当删除媒资文件的时候判断文件是否与课程计划相关联,不关联可以直接删除,存在关联就跳出提示不删除 本人技术有限写的不好的地方敬请原谅,如有什么问题或者更好的解决方案大家可以留言或者私信


    一、需求内容

    需求:删除媒资文件判断其是否与课程计划关联,不关联可以直接删除,存在关联就跳出提示不删除

    二、删除媒资文件

    https://blog.csdn.net/weixin_45305953/article/details/108810425

    三、新需求实现

    1.同一工程实现

    配置连接两个数据库,mongodb,mysql,但是程序一直运行报错,没有实现,网上找了一篇文章解决请参考:https://blog.csdn.net/you_ran_jian/article/details/103007812 我们使用feign进行远程调用

    2.使用feign远程调用实现

    xc-service-manage-media服务调用xc-service-manage-course服务

    (1)course服务增加查询接口

    根据媒资文件ID查询文件与文件是否关联,返回一个list, Controller

    //根据mediaId查询与课程计划关联的视频数量,判断是否删除对应的视频文件 @Override @PostMapping("/findMedia/{mediaId}") public List<TeachplanMedia> findTeachPlanMediaById(@PathVariable(name = "mediaId") String mediaId){ return this.courseService.findTeachPlanMediaById(mediaId); }

    api

    @ApiOperation("根据视频Id查询视频与课程计划关联关系") public List<TeachplanMedia> findTeachPlanMediaById(String mediaId);

    Service

    //根据mediaId查询与课程计划关联的视频数量,判断是否删除对应的视频文件 public List<TeachplanMedia> findTeachPlanMediaById(String mediaId) { return this.teachPlanMediaRepository.findTeachplanMediaByMediaId(mediaId); }

    DAO

    public List<TeachplanMedia> findTeachplanMediaByMediaId(@Param("mediaId") String mediaId);

    (2)course服务application.yml添加配置

    # 注册中心 eureka: client: registerWithEureka: true #服务注册开关 fetchRegistry: true #服务发现开关 serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔 defaultZone: ${EUREKA_SERVER:http://127.0.0.1:50101/eureka/,http://127.0.0.1:50102/eureka/} #两个eureka服务相互注册之后,向其中一个几点注册服务后,另一个节点也可以拿到注册信息(尽量使用逗号隔开的方式防止当前注册的一个节点挂掉) instance: prefer-ip-address: true #将自己的ip地址注册到Eureka服务中 ip-address: ${IP_ADDRESS:127.0.0.1} #设置自己的Ip地址 默认就是127.0.0.1, instance-id: ${spring.application.name}:${server.port} #指定实例id(服务名:端口)

    (3)media服务进行远程调用

    创建CourseManageFeignClient接口,注入到service中

    @FeignClient(value="XC-SERVICE-MANAGE-COURSE")//指定远程调用的服务名 public interface CourseManageFeignClient { //根据mediaId查询与课程计划关联的视频数量,判断是否删除对应的视频文件 @PostMapping("/course/findMedia/{mediaId}") public List<TeachplanMedia> findTeachPlanMediaById(@PathVariable(name = "mediaId") String mediaId); }

    修改service删除,增加一个远程调用查询是否存在关联,判断返回列表的长度即可

    //删除文件,分块,ts以及m3u8文件 @Transactional public ResponseResult deleteUploadFileChunks(String mediaId) { //查询mongodb中是否包含这调数据 Optional<MediaFile> optionalById = this.mediaFileRepository.findById(mediaId); if (!optionalById.isPresent()){ //为空抛出异常 log.error("删除文件失败,数据库不包含词条记录;mediaId:"+mediaId); ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL); return new ResponseResult(CommonCode.FAIL); } //根据媒资文件的ID远程调用课程微服务查询mysql数据库此视频是否与课程计划关联,关联就返回异常信息不可以删除 List<TeachplanMedia> teachPlanMediaList= this.courseManageFeignClient.findTeachPlanMediaById(mediaId); if (teachPlanMediaList.size()>0){ //表示存在课程计划与视频的关联,不能删除这个媒资视频 ExceptionCast.cast(MediaCode.DELETE_MEDIA_FILE_FAIL); return new ResponseResult(CommonCode.FAIL); } //获取上传文件路径(路径格式E:\xcEdu\xcVideo\0\1\013b627312c228c7d1a068b58844cdb4)删除以文件ID命名的文件夹及其所有的子文件 String deleteFilePath=this.upload_location+mediaId.substring(0,1)+"/"+mediaId.substring(1,2)+"/"+mediaId; //调用私用方法进行删除操作 boolean result =this.deleteAnyone(deleteFilePath); if (!result){ //删除出错 log.error("删除文件失败目录不存在;deleteFilePath:"+deleteFilePath); ExceptionCast.cast(MediaCode.MERGE_FILE_DELETE_FAIL); return new ResponseResult(CommonCode.FAIL); } //删除数据库记录 this.mediaFileRepository.deleteById(mediaId); return new ResponseResult(CommonCode.SUCCESS); }

    MediaCode增加一个异常类型

    DELETE_MEDIA_FILE_FAIL(false,22021,"删除视频文件失败!此视频已与课程计划进行关联")

    (4)启动类添加注解

    在xc-service-manage-media服务添加,否则不能使用feign进行远程调用

    @EnableFeignClients//添加FeignClients注解表示要使用feign进行远程调用

    四、测试

    重启服务,点击删除媒资文件,如果已经与课程计划关联就提示:“删除视频文件失败!此视频已与课程计划进行关联”;如果不关联就提示删除成功。 远程调用参考:https://blog.csdn.net/Leeyehong_self/article/details/104976366 本人技术有限如有任何问题,或者更好的解决方法直接评论私聊我即可

    Processed: 0.026, SQL: 8