9 | * 设备表 Mapper 接口 10 | *
11 | * 12 | * @author RabbitNoTeeth 13 | * @since 2021-06-11 14 | */ 15 | @Mapper 16 | public interface DeviceMapper extends BaseMapper9 | * 视频流表 Mapper 接口 10 | *
11 | * 12 | * @author RabbitNoTeeth 13 | * @since 2021-06-11 14 | */ 15 | @Mapper 16 | public interface VideoStreamMapper extends BaseMapper9 | * 视频质量检测记录表 Mapper 接口 10 | *
11 | * 12 | * @author RabbitNoTeeth 13 | * @since 2021-06-11 14 | */ 15 | @Mapper 16 | public interface VideoQualityDetectRecordMapper extends BaseMapper10 | * open api 服务类 11 | *
12 | * 13 | * @author RabbitNoTeeth 14 | * @since 2021-06-11 15 | */ 16 | public interface IOpenApiService { 17 | 18 | List9 | * 视频质量检测算法 Mapper 接口 10 | *
11 | * 12 | * @author RabbitNoTeeth 13 | * @since 2021-06-10 14 | */ 15 | @Mapper 16 | public interface VideoQualityDetectArithmeticMapper extends BaseMapper8 | * 视频质量检测算法应用设备表 服务类 9 | *
10 | * 11 | * @author RabbitNoTeeth 12 | * @since 2021-06-15 13 | */ 14 | public interface IVideoQualityDetectArithmeticApplyDeviceService extends IService9 | * 视频质量检测算法应用设备表 Mapper 接口 10 | *
11 | * 12 | * @author RabbitNoTeeth 13 | * @since 2021-06-15 14 | */ 15 | @Mapper 16 | public interface VideoQualityDetectArithmeticApplyDeviceMapper extends BaseMapper11 | * 视频质量检测算法应用设备表 服务实现类 12 | *
13 | * 14 | * @author RabbitNoTeeth 15 | * @since 2021-06-15 16 | */ 17 | @Service 18 | public class VideoQualityDetectArithmeticApplyDeviceServiceImpl extends ServiceImpl16 | * 视频质量检测记录表 服务类 17 | *
18 | * 19 | * @author RabbitNoTeeth 20 | * @since 2021-06-11 21 | */ 22 | public interface IVideoQualityDetectManualService { 23 | 24 | /** 25 | * 图片上传 26 | * 27 | * @return 28 | * @param file 29 | */ 30 | VideoQualityDetectManualVO upload(MultipartFile file) throws IOException, Exception; 31 | 32 | } 33 | -------------------------------------------------------------------------------- /m-sip/src/main/java/fun/bookish/blueberry/sip/constant/SipTraceLevel.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.sip.constant; 2 | 3 | import org.apache.commons.lang3.StringUtils; 4 | 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | 8 | /** 9 | * sip日志级别 10 | */ 11 | public class SipTraceLevel { 12 | 13 | private static final Map14 | * 设备通道表 Mapper 接口 15 | *
16 | * 17 | * @author RabbitNoTeeth 18 | * @since 2021-06-11 19 | */ 20 | @Component 21 | @Mapper 22 | public interface ChannelMapper extends BaseMapper10 | * 设备通道表 11 | *
12 | * 13 | * @author RabbitNoTeeth 14 | * @since 2021-06-11 15 | */ 16 | @TableName("t_channel") 17 | public class ChannelQueryParamVO implements Serializable { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @ApiModelProperty(value = "通道ID", required = true) 22 | private String id; 23 | 24 | @ApiModelProperty(value = "设备编码", required = true) 25 | private String deviceId; 26 | 27 | @ApiModelProperty(value = "通道名称", required = true) 28 | private String name; 29 | 30 | public String getId() { 31 | return id; 32 | } 33 | 34 | public void setId(String id) { 35 | this.id = id; 36 | } 37 | 38 | public String getName() { 39 | return name; 40 | } 41 | 42 | public void setName(String name) { 43 | this.name = name; 44 | } 45 | 46 | public String getDeviceId() { 47 | return deviceId; 48 | } 49 | 50 | public void setDeviceId(String deviceId) { 51 | this.deviceId = deviceId; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/BlueberryApplication.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server; 2 | 3 | import fun.bookish.blueberry.core.utils.SpringUtils; 4 | import fun.bookish.blueberry.server.permission.PermissionCodeUtils; 5 | import fun.bookish.blueberry.server.permission.PermissionProperties; 6 | import org.apache.ibatis.annotations.Mapper; 7 | import org.mybatis.spring.annotation.MapperScan; 8 | import org.springframework.boot.SpringApplication; 9 | import org.springframework.boot.autoconfigure.SpringBootApplication; 10 | 11 | @SpringBootApplication(scanBasePackages = "fun.bookish.blueberry") 12 | @MapperScan(basePackages = "fun.bookish.blueberry", annotationClass = Mapper.class) 13 | public class BlueberryApplication { 14 | 15 | public static void main(String[] args) { 16 | SpringApplication.run(BlueberryApplication.class, args); 17 | // 检测序列号是否有效 18 | checkPermissionCode(); 19 | } 20 | 21 | /** 22 | * 检查序列号是否有效 23 | */ 24 | private static void checkPermissionCode() { 25 | PermissionProperties permissionProperties = SpringUtils.getBeanByClass(PermissionProperties.class); 26 | Boolean check = permissionProperties.getCheck(); 27 | if (!check) { 28 | return; 29 | } 30 | PermissionCodeUtils.check(permissionProperties.getCode()); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /m-sip/src/main/java/fun/bookish/blueberry/sip/command/executor/media/param/SipMediaStopParam.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.sip.command.executor.media.param; 2 | 3 | import fun.bookish.blueberry.sip.command.executor.param.SipCommandParam; 4 | 5 | /** 6 | * 媒体流点播参数 7 | */ 8 | public class SipMediaStopParam extends SipCommandParam { 9 | 10 | private final String channelId; 11 | 12 | private final String ssrc; 13 | 14 | private final String fromTag; 15 | 16 | private final String toTag; 17 | 18 | private final String callId; 19 | 20 | public SipMediaStopParam(String deviceId, String deviceAddress, String channelId, String protocolType, String ssrc, String fromTag, String toTag, String callId) { 21 | super(deviceId, deviceAddress, protocolType); 22 | this.channelId = channelId; 23 | this.ssrc = ssrc; 24 | this.fromTag = fromTag; 25 | this.toTag = toTag; 26 | this.callId = callId; 27 | } 28 | 29 | public String getSsrc() { 30 | return ssrc; 31 | } 32 | 33 | public String getChannelId() { 34 | return channelId; 35 | } 36 | 37 | public String getFromTag() { 38 | return fromTag; 39 | } 40 | 41 | public String getToTag() { 42 | return toTag; 43 | } 44 | 45 | public String getCallId() { 46 | return callId; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blueberry-page", 3 | "version": "0.0.1", 4 | "description": "page of blueberry", 5 | "productName": "blueberry-page", 6 | "author": "刘新冬 <864426487@qq.com>", 7 | "private": true, 8 | "scripts": { 9 | "lint": "eslint --ext .js,.vue ./", 10 | "test": "echo \"No test specified\" && exit 0" 11 | }, 12 | "dependencies": { 13 | "@quasar/extras": "^1.0.0", 14 | "axios": "^0.21.1", 15 | "core-js": "^3.6.5", 16 | "element-ui": "^2.15.2", 17 | "flv.js": "^1.5.0", 18 | "qs": "^6.10.1", 19 | "quasar": "^1.0.0", 20 | "vue-i18n": "^8.0.0" 21 | }, 22 | "devDependencies": { 23 | "@quasar/app": "^2.0.0", 24 | "babel-eslint": "^10.0.1", 25 | "eslint": "^7.21.0", 26 | "eslint-config-prettier": "^8.1.0", 27 | "eslint-plugin-vue": "^7.7.0", 28 | "eslint-webpack-plugin": "^2.4.0" 29 | }, 30 | "browserslist": [ 31 | "ie >= 11", 32 | "last 10 Chrome versions", 33 | "last 10 Firefox versions", 34 | "last 4 Edge versions", 35 | "last 7 Safari versions", 36 | "last 8 Android versions", 37 | "last 8 ChromeAndroid versions", 38 | "last 8 FirefoxAndroid versions", 39 | "last 10 iOS versions", 40 | "last 5 Opera versions" 41 | ], 42 | "engines": { 43 | "node": ">= 10.18.1", 44 | "npm": ">= 6.13.4", 45 | "yarn": ">= 1.21.1" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /m-sip/src/main/java/fun/bookish/blueberry/sip/command/executor/SipCommandExecutor.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.sip.command.executor; 2 | 3 | import fun.bookish.blueberry.sip.SipServer; 4 | import fun.bookish.blueberry.sip.exception.SipClientTransactionCreationException; 5 | 6 | import javax.sip.ClientTransaction; 7 | import javax.sip.SipProvider; 8 | import javax.sip.header.ViaHeader; 9 | import javax.sip.message.Request; 10 | 11 | /** 12 | * sip命令执行器接口 13 | */ 14 | public interface SipCommandExecutor { 15 | 16 | /** 17 | * 获取会话事务 18 | * @param protocolType 19 | * @param request 20 | * @return 21 | * @throws SipClientTransactionCreationException 22 | */ 23 | default ClientTransaction getClientTransaction(String protocolType, Request request) throws SipClientTransactionCreationException { 24 | try { 25 | SipServer sipServer = getSipServer(); 26 | SipProvider tcpSipProvider = sipServer.getTcpSipProvider(); 27 | SipProvider udpSipProvider = sipServer.getUdpSipProvider(); 28 | return "TCP".equals(protocolType) ? tcpSipProvider.getNewClientTransaction(request) : udpSipProvider.getNewClientTransaction(request); 29 | } catch (Exception e) { 30 | throw new SipClientTransactionCreationException("(×) Failed to get client transaction", e); 31 | } 32 | } 33 | 34 | SipServer getSipServer(); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /m-sip/src/main/java/fun/bookish/blueberry/sip/entity/SipDeviceRegisterDesc.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.sip.entity; 2 | 3 | import fun.bookish.blueberry.sip.event.SipEventTypeEnum; 4 | 5 | /** 6 | * 设备注册回调数据 7 | */ 8 | public class SipDeviceRegisterDesc extends SipDeviceDesc{ 9 | 10 | /** 11 | * 设备注册地址 12 | */ 13 | private String registerAddress; 14 | /** 15 | * 传输协议 16 | * UDP/TCP 17 | */ 18 | private String transport; 19 | /** 20 | * 设备过期时长 21 | */ 22 | private int expires; 23 | 24 | public SipDeviceRegisterDesc(String requestDeviceID, String requestDeviceAddress,String deviceId, String registerServer, SipEventTypeEnum eventType) { 25 | super(requestDeviceID, requestDeviceAddress, deviceId, registerServer, eventType); 26 | } 27 | 28 | public String getTransport() { 29 | return transport; 30 | } 31 | 32 | public void setTransport(String transport) { 33 | this.transport = transport; 34 | } 35 | 36 | public int getExpires() { 37 | return expires; 38 | } 39 | 40 | public void setExpires(int expires) { 41 | this.expires = expires; 42 | } 43 | 44 | public String getRegisterAddress() { 45 | return registerAddress; 46 | } 47 | 48 | public void setRegisterAddress(String registerAddress) { 49 | this.registerAddress = registerAddress; 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /m-server/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | 2 | web: 3 | html: ./dist 4 | upload: ./fileUpload 5 | 6 | spring: 7 | application: 8 | name: Blueberry 9 | profiles: 10 | active: dev 11 | servlet: 12 | multipart: 13 | max-request-size: 1000MB 14 | max-file-size: 1000MB 15 | web: 16 | resources: 17 | static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.html},file:${web.upload} 18 | quartz: 19 | job-store-type: jdbc 20 | properties: 21 | org: 22 | quartz: 23 | scheduler: 24 | instanceName: clusteredScheduler 25 | instanceId: AUTO 26 | jobStore: 27 | class: org.quartz.impl.jdbcjobstore.JobStoreTX 28 | driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate 29 | tablePrefix: QRTZ_ 30 | isClustered: false 31 | clusterCheckinInterval: 10000 32 | useProperties: false 33 | misfireThreshold: 1000 34 | threadPool: 35 | class: org.quartz.simpl.SimpleThreadPool 36 | threadCount: 10 37 | threadPriority: 5 38 | threadsInheritContextClassLoaderOfInitializingThread: true 39 | 40 | mybatis: 41 | mapper-locations: classpath*:fun/bookish/blueberry/**/mapper/**/*.xml 42 | configuration: 43 | map-underscore-to-camel-case: true 44 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/videoqualitydetect/manual/controller/VideoQualityDetectManualController.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server.videoqualitydetect.manual.controller; 2 | 3 | import fun.bookish.blueberry.core.annotation.EnableResponseBodyJsonWrap; 4 | import fun.bookish.blueberry.server.videoqualitydetect.manual.service.IVideoQualityDetectManualService; 5 | import fun.bookish.blueberry.server.videoqualitydetect.manual.entity.VideoQualityDetectManualVO; 6 | import io.swagger.annotations.Api; 7 | import io.swagger.annotations.ApiOperation; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.web.bind.annotation.*; 10 | import org.springframework.web.multipart.MultipartFile; 11 | 12 | 13 | /** 14 | *15 | * 视频质量检测记录表 前端控制器 16 | *
17 | * 18 | * @author RabbitNoTeeth 19 | * @since 2021-06-11 20 | */ 21 | @Api(tags = "手动图像检测管理") 22 | @EnableResponseBodyJsonWrap 23 | @RestController 24 | @RequestMapping("/api/v1/video-quality-detect/manual") 25 | public class VideoQualityDetectManualController { 26 | 27 | @Autowired 28 | private IVideoQualityDetectManualService videoQualityDetectManualService; 29 | 30 | @ApiOperation("上传图片") 31 | @PostMapping("/upload") 32 | public VideoQualityDetectManualVO upload(@RequestParam("file") MultipartFile file) throws Exception { 33 | return videoQualityDetectManualService.upload(file); 34 | } 35 | 36 | } 37 | 38 | -------------------------------------------------------------------------------- /m-core/src/main/java/fun/bookish/blueberry/core/swagger2/Swagger2Configuration.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.core.swagger2; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.PathSelectors; 8 | import springfox.documentation.builders.RequestHandlerSelectors; 9 | import springfox.documentation.service.ApiInfo; 10 | import springfox.documentation.spi.DocumentationType; 11 | import springfox.documentation.spring.web.plugins.Docket; 12 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 13 | 14 | @Configuration 15 | @EnableSwagger2 16 | public class Swagger2Configuration { 17 | 18 | @Value("${spring.application.name}") 19 | private String applicationName; 20 | 21 | @Bean 22 | public Docket createRestApi() { 23 | return new Docket(DocumentationType.SWAGGER_2) 24 | .apiInfo(apiInfo()) 25 | .select() 26 | .apis(RequestHandlerSelectors.basePackage("fun.bookish.blueberry")) 27 | .paths(PathSelectors.any()) 28 | .build(); 29 | } 30 | 31 | private ApiInfo apiInfo() { 32 | return new ApiInfoBuilder() 33 | .title(applicationName + "接口文档") 34 | .build(); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/dev/DevController.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server.dev; 2 | 3 | import fun.bookish.blueberry.server.dev.service.DevService; 4 | import fun.bookish.blueberry.sip.command.executor.query.param.SipQueryCatalogParam; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.web.bind.annotation.PostMapping; 7 | import org.springframework.web.bind.annotation.RequestMapping; 8 | import org.springframework.web.bind.annotation.RestController; 9 | 10 | import javax.validation.constraints.NotBlank; 11 | 12 | 13 | @RestController 14 | @RequestMapping("/api/v1/dev") 15 | public class DevController { 16 | 17 | @Autowired 18 | private DevService devService; 19 | 20 | /** 21 | * 发送sip命令,查新设备列表 22 | * @param param 23 | * @return 24 | * @throws Exception 25 | */ 26 | @PostMapping("/sip/catalog") 27 | public Object sipCatalog(SipQueryCatalogParam param) throws Exception { 28 | return devService.sipCatalog(param); 29 | } 30 | 31 | /** 32 | * 触发设备通道删除钩子 33 | * @param deviceId 34 | * @param channelId 35 | * @return 36 | */ 37 | @PostMapping("/stream/qualityDetect") 38 | public Object hookOnStreamQualityDetect(@NotBlank(message = "设备ID不能为空") String deviceId, @NotBlank(message = "通道ID不能为空") String channelId) { 39 | return devService.streamQualityDetect(deviceId, channelId); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /m-sip/src/main/java/fun/bookish/blueberry/sip/command/manager/impl/SipCommandExecutorManagerImpl.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.sip.command.manager.impl; 2 | 3 | import fun.bookish.blueberry.sip.SipServer; 4 | import fun.bookish.blueberry.sip.command.executor.media.SipMediaCommandExecutor; 5 | import fun.bookish.blueberry.sip.command.executor.query.SipQueryCommandExecutor; 6 | import fun.bookish.blueberry.sip.command.manager.SipCommandExecutorManager; 7 | 8 | /** 9 | * sip命令执行器管理器 10 | */ 11 | public class SipCommandExecutorManagerImpl implements SipCommandExecutorManager { 12 | 13 | private final SipServer sipServer; 14 | private final SipQueryCommandExecutor sipQueryCommandExecutor; 15 | private final SipMediaCommandExecutor sipMediaCommandExecutor; 16 | 17 | public SipCommandExecutorManagerImpl(SipServer sipServer) { 18 | this.sipServer = sipServer; 19 | this.sipQueryCommandExecutor = SipQueryCommandExecutor.create(sipServer); 20 | this.sipMediaCommandExecutor = SipMediaCommandExecutor.create(sipServer); 21 | } 22 | 23 | @Override 24 | public SipServer getSipServer() { 25 | return this.sipServer; 26 | } 27 | 28 | @Override 29 | public SipQueryCommandExecutor getSipQueryCommandExecutor() { 30 | return this.sipQueryCommandExecutor; 31 | } 32 | 33 | @Override 34 | public SipMediaCommandExecutor getSipMediaCommandExecutor() { 35 | return this.sipMediaCommandExecutor; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/channel/service/IChannelService.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server.channel.service; 2 | 3 | import fun.bookish.blueberry.core.page.PageResult; 4 | import fun.bookish.blueberry.server.channel.entity.ChannelPO; 5 | import com.baomidou.mybatisplus.extension.service.IService; 6 | import fun.bookish.blueberry.server.channel.entity.ChannelQueryParamVO; 7 | import fun.bookish.blueberry.server.channel.entity.ChannelStatusSync; 8 | import fun.bookish.blueberry.server.channel.entity.ChannelVO; 9 | import fun.bookish.blueberry.server.device.entity.DeviceVO; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | *15 | * 设备通道表 服务类 16 | *
17 | * 18 | * @author RabbitNoTeeth 19 | * @since 2021-06-11 20 | */ 21 | public interface IChannelService extends IService10 | * 设备表 11 | *
12 | * 13 | * @author RabbitNoTeeth 14 | * @since 2021-06-11 15 | */ 16 | @TableName("t_device") 17 | public class DeviceParamVO implements Serializable { 18 | 19 | private static final long serialVersionUID = 1L; 20 | 21 | @ApiModelProperty(value = "设备编码", required = true) 22 | private String id; 23 | 24 | @ApiModelProperty(value = "设备名称", required = true) 25 | private String name; 26 | 27 | @ApiModelProperty(value = "设备类型", required = true, example = "GB, RTSP") 28 | private String type; 29 | 30 | @ApiModelProperty(value = "是否在线(0:否,1:是)", required = true, example = "0") 31 | private Integer online; 32 | 33 | public String getId() { 34 | return id; 35 | } 36 | 37 | public void setId(String id) { 38 | this.id = id; 39 | } 40 | 41 | public String getName() { 42 | return name; 43 | } 44 | 45 | public void setName(String name) { 46 | this.name = name; 47 | } 48 | 49 | public String getType() { 50 | return type; 51 | } 52 | 53 | public void setType(String type) { 54 | this.type = type; 55 | } 56 | 57 | public Integer getOnline() { 58 | return online; 59 | } 60 | 61 | public void setOnline(Integer online) { 62 | this.online = online; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/videoqualitydetect/arithmetic/entity/VideoQualityDetectArithmeticQueryParamVO.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server.videoqualitydetect.arithmetic.entity; 2 | 3 | import io.swagger.annotations.ApiModel; 4 | import io.swagger.annotations.ApiModelProperty; 5 | 6 | import javax.validation.constraints.NotBlank; 7 | import javax.validation.constraints.NotNull; 8 | import java.io.Serializable; 9 | 10 | /** 11 | *12 | * 视频质量检测算法 13 | *
14 | * 15 | * @author RabbitNoTeeth 16 | * @since 2021-06-10 17 | */ 18 | @ApiModel(value = "VideoQualityDetectArithmetic实体对象", description = "视频质量检测算法实体") 19 | public class VideoQualityDetectArithmeticQueryParamVO implements Serializable { 20 | 21 | private static final long serialVersionUID = 1L; 22 | 23 | @ApiModelProperty(value = "名称", required = true) 24 | private String name; 25 | 26 | @ApiModelProperty(value = "是否启用(0:否,1:是)", required = true, example = "1") 27 | private Integer enable; 28 | 29 | @ApiModelProperty(value = "是否应用到所有设备(0:否,1:是)", required = true, example = "1") 30 | private Integer applyAll; 31 | 32 | public String getName() { 33 | return name; 34 | } 35 | 36 | public void setName(String name) { 37 | this.name = name; 38 | } 39 | 40 | public Integer getEnable() { 41 | return enable; 42 | } 43 | 44 | public void setEnable(Integer enable) { 45 | this.enable = enable; 46 | } 47 | 48 | public Integer getApplyAll() { 49 | return applyAll; 50 | } 51 | 52 | public void setApplyAll(Integer applyAll) { 53 | this.applyAll = applyAll; 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /m-server/src/main/java/fun/bookish/blueberry/server/videoqualitydetect/arithmetic/entity/VideoQualityDetectArithmeticApplyDeviceVO.java: -------------------------------------------------------------------------------- 1 | package fun.bookish.blueberry.server.videoqualitydetect.arithmetic.entity; 2 | 3 | import java.util.List; 4 | 5 | public class VideoQualityDetectArithmeticApplyDeviceVO { 6 | 7 | private List13 | * 视频质量检测记录表 服务类 14 | *
15 | * 16 | * @author RabbitNoTeeth 17 | * @since 2021-06-11 18 | */ 19 | public interface IVideoQualityDetectRecordService extends IService