Commit 2c470f5061de91a1330c3c802d00f2bc48cdeb19
1 parent
2adf2459
升级spring boot版本;全局异常处理;统一返回结果
Showing
14 changed files
with
431 additions
and
248 deletions
pom.xml
| @@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
| 5 | <parent> | 5 | <parent> |
| 6 | <groupId>org.springframework.boot</groupId> | 6 | <groupId>org.springframework.boot</groupId> |
| 7 | <artifactId>spring-boot-starter-parent</artifactId> | 7 | <artifactId>spring-boot-starter-parent</artifactId> |
| 8 | - <version>2.3.5.RELEASE</version> | 8 | + <version>2.7.2</version> |
| 9 | </parent> | 9 | </parent> |
| 10 | <groupId>top.panll.assist</groupId> | 10 | <groupId>top.panll.assist</groupId> |
| 11 | <artifactId>wvp-pro-assist</artifactId> | 11 | <artifactId>wvp-pro-assist</artifactId> |
| @@ -56,17 +56,16 @@ | @@ -56,17 +56,16 @@ | ||
| 56 | <version>1.2.73</version> | 56 | <version>1.2.73</version> |
| 57 | </dependency> | 57 | </dependency> |
| 58 | 58 | ||
| 59 | - <!--Swagger3 --> | ||
| 60 | <!--在线文档 --> | 59 | <!--在线文档 --> |
| 61 | <dependency> | 60 | <dependency> |
| 62 | - <groupId>io.springfox</groupId> | ||
| 63 | - <artifactId>springfox-boot-starter</artifactId> | ||
| 64 | - <version>3.0.0</version> | 61 | + <groupId>org.springdoc</groupId> |
| 62 | + <artifactId>springdoc-openapi-ui</artifactId> | ||
| 63 | + <version>1.6.10</version> | ||
| 65 | </dependency> | 64 | </dependency> |
| 66 | <dependency> | 65 | <dependency> |
| 67 | <groupId>com.github.xiaoymin</groupId> | 66 | <groupId>com.github.xiaoymin</groupId> |
| 68 | - <artifactId>knife4j-spring-boot-starter</artifactId> | ||
| 69 | - <version>3.0.2</version> | 67 | + <artifactId>knife4j-springdoc-ui</artifactId> |
| 68 | + <version>3.0.3</version> | ||
| 70 | </dependency> | 69 | </dependency> |
| 71 | 70 | ||
| 72 | <dependency> | 71 | <dependency> |
src/main/java/top/panll/assist/config/GlobalExceptionHandler.java
0 → 100644
| 1 | +package top.panll.assist.config; | ||
| 2 | + | ||
| 3 | +import org.slf4j.Logger; | ||
| 4 | +import org.slf4j.LoggerFactory; | ||
| 5 | +import org.springframework.http.HttpStatus; | ||
| 6 | +import org.springframework.web.bind.annotation.ExceptionHandler; | ||
| 7 | +import org.springframework.web.bind.annotation.ResponseStatus; | ||
| 8 | +import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
| 9 | +import top.panll.assist.controller.bean.ControllerException; | ||
| 10 | +import top.panll.assist.controller.bean.ErrorCode; | ||
| 11 | +import top.panll.assist.controller.bean.WVPResult; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * 全局异常处理 | ||
| 15 | + */ | ||
| 16 | +@RestControllerAdvice | ||
| 17 | +public class GlobalExceptionHandler { | ||
| 18 | + | ||
| 19 | + private final static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class); | ||
| 20 | + | ||
| 21 | + /** | ||
| 22 | + * 默认异常处理 | ||
| 23 | + * @param e 异常 | ||
| 24 | + * @return 统一返回结果 | ||
| 25 | + */ | ||
| 26 | + @ExceptionHandler(Exception.class) | ||
| 27 | + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) | ||
| 28 | + public WVPResult<String> exceptionHandler(Exception e) { | ||
| 29 | + logger.error("[全局异常]: ", e); | ||
| 30 | + return WVPResult.fail(ErrorCode.ERROR500.getCode(), e.getMessage()); | ||
| 31 | + } | ||
| 32 | + | ||
| 33 | + /** | ||
| 34 | + * 自定义异常处理, 处理controller中返回的错误 | ||
| 35 | + * @param e 异常 | ||
| 36 | + * @return 统一返回结果 | ||
| 37 | + */ | ||
| 38 | + @ExceptionHandler(ControllerException.class) | ||
| 39 | + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) | ||
| 40 | + public WVPResult<String> exceptionHandler(ControllerException e) { | ||
| 41 | + return WVPResult.fail(e.getCode(), e.getMsg()); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | +} |
src/main/java/top/panll/assist/config/GlobalResponseAdvice.java
0 → 100644
| 1 | +package top.panll.assist.config; | ||
| 2 | + | ||
| 3 | +import com.alibaba.fastjson.JSON; | ||
| 4 | +import org.springframework.core.MethodParameter; | ||
| 5 | +import org.springframework.http.MediaType; | ||
| 6 | +import org.springframework.http.converter.HttpMessageConverter; | ||
| 7 | +import org.springframework.http.server.ServerHttpRequest; | ||
| 8 | +import org.springframework.http.server.ServerHttpResponse; | ||
| 9 | +import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
| 10 | +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; | ||
| 11 | +import top.panll.assist.controller.bean.ErrorCode; | ||
| 12 | +import top.panll.assist.controller.bean.WVPResult; | ||
| 13 | + | ||
| 14 | +import javax.validation.constraints.NotNull; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * 全局统一返回结果 | ||
| 18 | + * @author lin | ||
| 19 | + */ | ||
| 20 | +@RestControllerAdvice | ||
| 21 | +public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> { | ||
| 22 | + | ||
| 23 | + | ||
| 24 | + @Override | ||
| 25 | + public boolean supports(@NotNull MethodParameter returnType, @NotNull Class<? extends HttpMessageConverter<?>> converterType) { | ||
| 26 | + return true; | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + @Override | ||
| 30 | + public Object beforeBodyWrite(Object body, @NotNull MethodParameter returnType, @NotNull MediaType selectedContentType, @NotNull Class<? extends HttpMessageConverter<?>> selectedConverterType, @NotNull ServerHttpRequest request, @NotNull ServerHttpResponse response) { | ||
| 31 | + // 排除api文档的接口,这个接口不需要统一 | ||
| 32 | + String[] excludePath = {"/v3/api-docs","/api/v1","/index/hook"}; | ||
| 33 | + for (String path : excludePath) { | ||
| 34 | + if (request.getURI().getPath().startsWith(path)) { | ||
| 35 | + return body; | ||
| 36 | + } | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + if (body instanceof WVPResult) { | ||
| 40 | + return body; | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + if (body instanceof ErrorCode) { | ||
| 44 | + ErrorCode errorCode = (ErrorCode) body; | ||
| 45 | + return new WVPResult<>(errorCode.getCode(), errorCode.getMsg(), null); | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + if (body instanceof String) { | ||
| 49 | + return JSON.toJSONString(WVPResult.success(body)); | ||
| 50 | + } | ||
| 51 | + | ||
| 52 | + return WVPResult.success(body); | ||
| 53 | + } | ||
| 54 | +} |
src/main/java/top/panll/assist/config/SpringDocConfig.java
0 → 100644
| 1 | +package top.panll.assist.config; | ||
| 2 | + | ||
| 3 | +import io.swagger.v3.oas.models.OpenAPI; | ||
| 4 | +import io.swagger.v3.oas.models.info.Contact; | ||
| 5 | +import io.swagger.v3.oas.models.info.Info; | ||
| 6 | +import io.swagger.v3.oas.models.info.License; | ||
| 7 | +import org.springdoc.core.GroupedOpenApi; | ||
| 8 | +import org.springframework.beans.factory.annotation.Value; | ||
| 9 | +import org.springframework.context.annotation.Bean; | ||
| 10 | +import org.springframework.context.annotation.Configuration; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * @author lin | ||
| 14 | + */ | ||
| 15 | +@Configuration | ||
| 16 | +public class SpringDocConfig { | ||
| 17 | + | ||
| 18 | + @Value("${doc.enabled: true}") | ||
| 19 | + private boolean enable; | ||
| 20 | + | ||
| 21 | + @Bean | ||
| 22 | + public OpenAPI springShopOpenApi() { | ||
| 23 | + Contact contact = new Contact(); | ||
| 24 | + contact.setName("pan"); | ||
| 25 | + contact.setEmail("648540858@qq.com"); | ||
| 26 | + return new OpenAPI() | ||
| 27 | + .info(new Info().title("WVP-PRO-ASSIST 接口文档") | ||
| 28 | + .contact(contact) | ||
| 29 | + .description("WVP-PRO助手,补充ZLM功能") | ||
| 30 | + .version("v2.0") | ||
| 31 | + .license(new License().name("Apache 2.0").url("http://springdoc.org"))); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + /** | ||
| 35 | + * 添加分组 | ||
| 36 | + * @return | ||
| 37 | + */ | ||
| 38 | + @Bean | ||
| 39 | + public GroupedOpenApi publicApi() { | ||
| 40 | + return GroupedOpenApi.builder() | ||
| 41 | + .group("1. 全部") | ||
| 42 | + .packagesToScan("top.panll.assist") | ||
| 43 | + .build(); | ||
| 44 | + } | ||
| 45 | +} |
src/main/java/top/panll/assist/config/Swagger3Config.java deleted
100644 → 0
| 1 | -package top.panll.assist.config; | ||
| 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.service.Contact; | ||
| 11 | -import springfox.documentation.spi.DocumentationType; | ||
| 12 | -import springfox.documentation.spring.web.plugins.Docket; | ||
| 13 | - | ||
| 14 | -@Configuration | ||
| 15 | -public class Swagger3Config { | ||
| 16 | - | ||
| 17 | - @Value("${swagger-ui.enabled}") | ||
| 18 | - private boolean enable; | ||
| 19 | - | ||
| 20 | - @Bean | ||
| 21 | - public Docket createRestApi() { | ||
| 22 | - return new Docket(DocumentationType.OAS_30) | ||
| 23 | - .apiInfo(apiInfo()) | ||
| 24 | - .groupName("1. 全部") | ||
| 25 | - .select() | ||
| 26 | - .apis(RequestHandlerSelectors.basePackage("top.panll.assist")) | ||
| 27 | - .paths(PathSelectors.any()) | ||
| 28 | - .build() | ||
| 29 | - .pathMapping("/") | ||
| 30 | - .enable(enable); | ||
| 31 | - } | ||
| 32 | - | ||
| 33 | - private ApiInfo apiInfo() { | ||
| 34 | - return new ApiInfoBuilder() | ||
| 35 | - .title("WVP-PRO-ASSIST 接口文档") | ||
| 36 | - .description("更多请咨询服务开发者(https://github.com/648540858/wvp-pro-assist)。") | ||
| 37 | - .contact(new Contact("648540858", "648540858", "648540858@qq.com")) | ||
| 38 | - .version("1.0") | ||
| 39 | - .build(); | ||
| 40 | - } | ||
| 41 | -} |
src/main/java/top/panll/assist/controller/RecordController.java
| @@ -2,16 +2,17 @@ package top.panll.assist.controller; | @@ -2,16 +2,17 @@ package top.panll.assist.controller; | ||
| 2 | 2 | ||
| 3 | import com.alibaba.fastjson.JSON; | 3 | import com.alibaba.fastjson.JSON; |
| 4 | import com.alibaba.fastjson.JSONObject; | 4 | import com.alibaba.fastjson.JSONObject; |
| 5 | -import io.swagger.annotations.Api; | ||
| 6 | -import io.swagger.annotations.ApiImplicitParam; | ||
| 7 | -import io.swagger.annotations.ApiImplicitParams; | ||
| 8 | -import io.swagger.annotations.ApiOperation; | 5 | +import io.swagger.v3.oas.annotations.Operation; |
| 6 | +import io.swagger.v3.oas.annotations.Parameter; | ||
| 7 | +import io.swagger.v3.oas.annotations.tags.Tag; | ||
| 9 | import org.slf4j.Logger; | 8 | import org.slf4j.Logger; |
| 10 | import org.slf4j.LoggerFactory; | 9 | import org.slf4j.LoggerFactory; |
| 11 | import org.springframework.beans.factory.annotation.Autowired; | 10 | import org.springframework.beans.factory.annotation.Autowired; |
| 12 | import org.springframework.http.HttpStatus; | 11 | import org.springframework.http.HttpStatus; |
| 13 | import org.springframework.http.ResponseEntity; | 12 | import org.springframework.http.ResponseEntity; |
| 14 | import org.springframework.web.bind.annotation.*; | 13 | import org.springframework.web.bind.annotation.*; |
| 14 | +import top.panll.assist.controller.bean.ControllerException; | ||
| 15 | +import top.panll.assist.controller.bean.ErrorCode; | ||
| 15 | import top.panll.assist.controller.bean.WVPResult; | 16 | import top.panll.assist.controller.bean.WVPResult; |
| 16 | import top.panll.assist.dto.MergeOrCutTaskInfo; | 17 | import top.panll.assist.dto.MergeOrCutTaskInfo; |
| 17 | import top.panll.assist.dto.SignInfo; | 18 | import top.panll.assist.dto.SignInfo; |
| @@ -28,7 +29,7 @@ import java.util.ArrayList; | @@ -28,7 +29,7 @@ import java.util.ArrayList; | ||
| 28 | import java.util.Date; | 29 | import java.util.Date; |
| 29 | import java.util.List; | 30 | import java.util.List; |
| 30 | import java.util.Map; | 31 | import java.util.Map; |
| 31 | -@Api(tags = "录像管理") | 32 | +@Tag(name = "录像管理", description = "录像管理") |
| 32 | @CrossOrigin | 33 | @CrossOrigin |
| 33 | @RestController | 34 | @RestController |
| 34 | @RequestMapping("/api/record") | 35 | @RequestMapping("/api/record") |
| @@ -49,40 +50,31 @@ public class RecordController { | @@ -49,40 +50,31 @@ public class RecordController { | ||
| 49 | * 获取app+stream列表 | 50 | * 获取app+stream列表 |
| 50 | * @return | 51 | * @return |
| 51 | */ | 52 | */ |
| 52 | - @ApiOperation("分页获取app+stream的列表") | ||
| 53 | - @ApiImplicitParams({ | ||
| 54 | - @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), | ||
| 55 | - @ApiImplicitParam(name="count", value = "每页查询数量", required = true, dataTypeClass = Integer.class), | ||
| 56 | - }) | 53 | + @Operation(summary ="分页获取app+stream的列表") |
| 54 | + @Parameter(name = "page", description = "当前页", required = true) | ||
| 55 | + @Parameter(name = "count", description = "每页查询数量", required = true) | ||
| 57 | @GetMapping(value = "/list") | 56 | @GetMapping(value = "/list") |
| 58 | @ResponseBody | 57 | @ResponseBody |
| 59 | - public WVPResult<PageInfo<Map<String, String>>> getList(@RequestParam int page, | 58 | + public PageInfo<Map<String, String>> getList(@RequestParam int page, |
| 60 | @RequestParam int count){ | 59 | @RequestParam int count){ |
| 61 | - WVPResult<PageInfo<Map<String, String>>> result = new WVPResult<>(); | ||
| 62 | List<Map<String, String>> appList = videoFileService.getList(); | 60 | List<Map<String, String>> appList = videoFileService.getList(); |
| 63 | - result.setCode(0); | ||
| 64 | - result.setMsg("success"); | ||
| 65 | 61 | ||
| 66 | PageInfo<Map<String, String>> stringPageInfo = new PageInfo<>(appList); | 62 | PageInfo<Map<String, String>> stringPageInfo = new PageInfo<>(appList); |
| 67 | stringPageInfo.startPage(page, count); | 63 | stringPageInfo.startPage(page, count); |
| 68 | - result.setData(stringPageInfo); | ||
| 69 | - return result; | 64 | + return stringPageInfo; |
| 70 | } | 65 | } |
| 71 | 66 | ||
| 72 | /** | 67 | /** |
| 73 | * 分页获取app列表 | 68 | * 分页获取app列表 |
| 74 | * @return | 69 | * @return |
| 75 | */ | 70 | */ |
| 76 | - @ApiOperation("分页获取app列表") | ||
| 77 | - @ApiImplicitParams({ | ||
| 78 | - @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), | ||
| 79 | - @ApiImplicitParam(name="count", value = "每页查询数量", required = true, dataTypeClass = Integer.class), | ||
| 80 | - }) | 71 | + @Operation(summary ="分页获取app列表") |
| 72 | + @Parameter(name = "page", description = "当前页", required = true) | ||
| 73 | + @Parameter(name = "count", description = "每页查询数量", required = true) | ||
| 81 | @GetMapping(value = "/app/list") | 74 | @GetMapping(value = "/app/list") |
| 82 | @ResponseBody | 75 | @ResponseBody |
| 83 | - public WVPResult<PageInfo<String>> getAppList(@RequestParam int page, | 76 | + public PageInfo<String> getAppList(@RequestParam int page, |
| 84 | @RequestParam int count){ | 77 | @RequestParam int count){ |
| 85 | - WVPResult<PageInfo<String>> result = new WVPResult<>(); | ||
| 86 | List<String> resultData = new ArrayList<>(); | 78 | List<String> resultData = new ArrayList<>(); |
| 87 | List<File> appList = videoFileService.getAppList(true); | 79 | List<File> appList = videoFileService.getAppList(true); |
| 88 | if (appList.size() > 0) { | 80 | if (appList.size() > 0) { |
| @@ -90,36 +82,28 @@ public class RecordController { | @@ -90,36 +82,28 @@ public class RecordController { | ||
| 90 | resultData.add(file.getName()); | 82 | resultData.add(file.getName()); |
| 91 | } | 83 | } |
| 92 | } | 84 | } |
| 93 | - result.setCode(0); | ||
| 94 | - result.setMsg("success"); | ||
| 95 | 85 | ||
| 96 | PageInfo<String> stringPageInfo = new PageInfo<>(resultData); | 86 | PageInfo<String> stringPageInfo = new PageInfo<>(resultData); |
| 97 | stringPageInfo.startPage(page, count); | 87 | stringPageInfo.startPage(page, count); |
| 98 | - result.setData(stringPageInfo); | ||
| 99 | - return result; | 88 | + return stringPageInfo; |
| 100 | } | 89 | } |
| 101 | 90 | ||
| 102 | /** | 91 | /** |
| 103 | * 分页stream列表 | 92 | * 分页stream列表 |
| 104 | * @return | 93 | * @return |
| 105 | */ | 94 | */ |
| 106 | - @ApiOperation("分页stream列表") | ||
| 107 | - @ApiImplicitParams({ | ||
| 108 | - @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), | ||
| 109 | - @ApiImplicitParam(name="count", value = "每页查询数量", required = true, dataTypeClass = Integer.class), | ||
| 110 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 111 | - }) | 95 | + @Operation(summary ="分页stream列表") |
| 96 | + @Parameter(name = "page", description = "当前页", required = true) | ||
| 97 | + @Parameter(name = "count", description = "每页查询数量", required = true) | ||
| 98 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 112 | @GetMapping(value = "/stream/list") | 99 | @GetMapping(value = "/stream/list") |
| 113 | @ResponseBody | 100 | @ResponseBody |
| 114 | - public WVPResult<PageInfo<String>> getStreamList(@RequestParam int page, | 101 | + public PageInfo<String> getStreamList(@RequestParam int page, |
| 115 | @RequestParam int count, | 102 | @RequestParam int count, |
| 116 | @RequestParam String app ){ | 103 | @RequestParam String app ){ |
| 117 | - WVPResult<PageInfo<String>> result = new WVPResult<>(); | ||
| 118 | List<String> resultData = new ArrayList<>(); | 104 | List<String> resultData = new ArrayList<>(); |
| 119 | if (app == null) { | 105 | if (app == null) { |
| 120 | - result.setCode(400); | ||
| 121 | - result.setMsg("app不能为空"); | ||
| 122 | - return result; | 106 | + throw new ControllerException(ErrorCode.ERROR400.getCode(), "app不能为空"); |
| 123 | } | 107 | } |
| 124 | List<File> streamList = videoFileService.getStreamList(app, true); | 108 | List<File> streamList = videoFileService.getStreamList(app, true); |
| 125 | if (streamList != null) { | 109 | if (streamList != null) { |
| @@ -127,69 +111,54 @@ public class RecordController { | @@ -127,69 +111,54 @@ public class RecordController { | ||
| 127 | resultData.add(file.getName()); | 111 | resultData.add(file.getName()); |
| 128 | } | 112 | } |
| 129 | } | 113 | } |
| 130 | - result.setCode(0); | ||
| 131 | - result.setMsg("success"); | ||
| 132 | PageInfo<String> stringPageInfo = new PageInfo<>(resultData); | 114 | PageInfo<String> stringPageInfo = new PageInfo<>(resultData); |
| 133 | stringPageInfo.startPage(page, count); | 115 | stringPageInfo.startPage(page, count); |
| 134 | - result.setData(stringPageInfo); | ||
| 135 | - return result; | 116 | + return stringPageInfo; |
| 136 | } | 117 | } |
| 137 | 118 | ||
| 138 | /** | 119 | /** |
| 139 | * 获取日期文件夹列表 | 120 | * 获取日期文件夹列表 |
| 140 | * @return | 121 | * @return |
| 141 | */ | 122 | */ |
| 142 | - @ApiOperation("获取日期文件夹列表") | ||
| 143 | - @ApiImplicitParams({ | ||
| 144 | - @ApiImplicitParam(name="year", value = "年", required = true, dataTypeClass = Integer.class), | ||
| 145 | - @ApiImplicitParam(name="month", value = "月", required = true, dataTypeClass = Integer.class), | ||
| 146 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 147 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 148 | - }) | 123 | + @Operation(summary ="获取日期文件夹列表") |
| 124 | + @Parameter(name = "year", description = "月", required = true) | ||
| 125 | + @Parameter(name = "month", description = "年", required = true) | ||
| 126 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 127 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 149 | @GetMapping(value = "/date/list") | 128 | @GetMapping(value = "/date/list") |
| 150 | @ResponseBody | 129 | @ResponseBody |
| 151 | - public WVPResult<List<String>> getDateList( @RequestParam(required = false) Integer year, | 130 | + public List<String> getDateList( @RequestParam(required = false) Integer year, |
| 152 | @RequestParam(required = false) Integer month, | 131 | @RequestParam(required = false) Integer month, |
| 153 | @RequestParam String app, | 132 | @RequestParam String app, |
| 154 | @RequestParam String stream ){ | 133 | @RequestParam String stream ){ |
| 155 | - WVPResult<List<String>> result = new WVPResult<>(); | ||
| 156 | List<String> resultData = new ArrayList<>(); | 134 | List<String> resultData = new ArrayList<>(); |
| 157 | if (app == null) { | 135 | if (app == null) { |
| 158 | - result.setCode(400); | ||
| 159 | - result.setMsg("app不能为空"); | ||
| 160 | - return result; | 136 | + throw new ControllerException(ErrorCode.ERROR400.getCode(), "app不能为空"); |
| 161 | }; | 137 | }; |
| 162 | if (stream == null) { | 138 | if (stream == null) { |
| 163 | - result.setCode(400); | ||
| 164 | - result.setMsg("stream不能为空"); | ||
| 165 | - return result; | 139 | + throw new ControllerException(ErrorCode.ERROR400.getCode(), "stream不能为空"); |
| 166 | } | 140 | } |
| 167 | List<File> dateList = videoFileService.getDateList(app, stream, year, month, true); | 141 | List<File> dateList = videoFileService.getDateList(app, stream, year, month, true); |
| 168 | for (File file : dateList) { | 142 | for (File file : dateList) { |
| 169 | resultData.add(file.getName()); | 143 | resultData.add(file.getName()); |
| 170 | } | 144 | } |
| 171 | - result.setCode(0); | ||
| 172 | - result.setMsg("success"); | ||
| 173 | - result.setData(resultData); | ||
| 174 | - return result; | 145 | + return resultData; |
| 175 | } | 146 | } |
| 176 | 147 | ||
| 177 | /** | 148 | /** |
| 178 | * 获取视频文件列表 | 149 | * 获取视频文件列表 |
| 179 | * @return | 150 | * @return |
| 180 | */ | 151 | */ |
| 181 | - @ApiOperation("获取日期文件夹列表") | ||
| 182 | - @ApiImplicitParams({ | ||
| 183 | - @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class), | ||
| 184 | - @ApiImplicitParam(name="count", value = "每页查询数量", required = true, dataTypeClass = Integer.class), | ||
| 185 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 186 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 187 | - @ApiImplicitParam(name="startTime", value = "开始时间(yyyy-MM-dd HH:mm:ss)", required = false, dataTypeClass = String.class), | ||
| 188 | - @ApiImplicitParam(name="endTime", value = "结束时间(yyyy-MM-dd HH:mm:ss)", required = false, dataTypeClass = String.class), | ||
| 189 | - }) | 152 | + @Operation(summary ="获取日期文件夹列表") |
| 153 | + @Parameter(name = "page", description = "当前页", required = true) | ||
| 154 | + @Parameter(name = "count", description = "每页查询数量", required = true) | ||
| 155 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 156 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 157 | + @Parameter(name = "startTime", description = "开始时间(yyyy-MM-dd HH:mm:ss)", required = true) | ||
| 158 | + @Parameter(name = "endTime", description = "结束时间(yyyy-MM-dd HH:mm:ss)", required = true) | ||
| 190 | @GetMapping(value = "/file/list") | 159 | @GetMapping(value = "/file/list") |
| 191 | @ResponseBody | 160 | @ResponseBody |
| 192 | - public WVPResult<PageInfo<String>> getRecordList(@RequestParam int page, | 161 | + public PageInfo<String> getRecordList(@RequestParam int page, |
| 193 | @RequestParam int count, | 162 | @RequestParam int count, |
| 194 | @RequestParam String app, | 163 | @RequestParam String app, |
| 195 | @RequestParam String stream, | 164 | @RequestParam String stream, |
| @@ -197,7 +166,6 @@ public class RecordController { | @@ -197,7 +166,6 @@ public class RecordController { | ||
| 197 | @RequestParam(required = false) String endTime | 166 | @RequestParam(required = false) String endTime |
| 198 | ){ | 167 | ){ |
| 199 | 168 | ||
| 200 | - WVPResult<PageInfo<String>> result = new WVPResult<>(); | ||
| 201 | // 开始时间与结束时间可不传或只传其一 | 169 | // 开始时间与结束时间可不传或只传其一 |
| 202 | List<String> recordList = new ArrayList<>(); | 170 | List<String> recordList = new ArrayList<>(); |
| 203 | try { | 171 | try { |
| @@ -216,40 +184,33 @@ public class RecordController { | @@ -216,40 +184,33 @@ public class RecordController { | ||
| 216 | recordList.add(file.getName()); | 184 | recordList.add(file.getName()); |
| 217 | } | 185 | } |
| 218 | } | 186 | } |
| 219 | - result.setCode(0); | ||
| 220 | - result.setMsg("success"); | ||
| 221 | PageInfo<String> stringPageInfo = new PageInfo<>(recordList); | 187 | PageInfo<String> stringPageInfo = new PageInfo<>(recordList); |
| 222 | stringPageInfo.startPage(page, count); | 188 | stringPageInfo.startPage(page, count); |
| 223 | - result.setData(stringPageInfo); | 189 | + return stringPageInfo; |
| 224 | } catch (ParseException e) { | 190 | } catch (ParseException e) { |
| 225 | logger.error("错误的开始时间[{}]或结束时间[{}]", startTime, endTime); | 191 | logger.error("错误的开始时间[{}]或结束时间[{}]", startTime, endTime); |
| 226 | - result.setCode(400); | ||
| 227 | - result.setMsg("错误的开始时间或结束时间"); | 192 | + throw new ControllerException(ErrorCode.ERROR400.getCode(), "错误的开始时间或结束时间, e=" + e.getMessage()); |
| 228 | } | 193 | } |
| 229 | - return result; | ||
| 230 | } | 194 | } |
| 231 | 195 | ||
| 232 | 196 | ||
| 233 | /** | 197 | /** |
| 234 | * 添加视频裁剪合并任务 | 198 | * 添加视频裁剪合并任务 |
| 235 | */ | 199 | */ |
| 236 | - @ApiOperation("添加视频裁剪合并任务") | ||
| 237 | - @ApiImplicitParams({ | ||
| 238 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 239 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 240 | - @ApiImplicitParam(name="startTime", value = "开始时间(yyyy-MM-dd HH:mm:ss)", required = false, dataTypeClass = String.class), | ||
| 241 | - @ApiImplicitParam(name="endTime", value = "结束时间(yyyy-MM-dd HH:mm:ss)", required = false, dataTypeClass = String.class), | ||
| 242 | - @ApiImplicitParam(name="remoteHost", value = "服务的IP:端口(用于直接返回完整播放地址以及下载地址)", required = false, dataTypeClass = String.class), | ||
| 243 | - }) | 200 | + @Operation(summary ="添加视频裁剪合并任务") |
| 201 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 202 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 203 | + @Parameter(name = "startTime", description = "开始时间(yyyy-MM-dd HH:mm:ss)", required = true) | ||
| 204 | + @Parameter(name = "endTime", description = "结束时间(yyyy-MM-dd HH:mm:ss)", required = true) | ||
| 205 | + @Parameter(name = "remoteHost", description = "服务的IP:端口(用于直接返回完整播放地址以及下载地址)", required = true) | ||
| 244 | @GetMapping(value = "/file/download/task/add") | 206 | @GetMapping(value = "/file/download/task/add") |
| 245 | @ResponseBody | 207 | @ResponseBody |
| 246 | - public WVPResult<String> addTaskForDownload(@RequestParam String app, | 208 | + public String addTaskForDownload(@RequestParam String app, |
| 247 | @RequestParam String stream, | 209 | @RequestParam String stream, |
| 248 | @RequestParam(required = false) String startTime, | 210 | @RequestParam(required = false) String startTime, |
| 249 | @RequestParam(required = false) String endTime, | 211 | @RequestParam(required = false) String endTime, |
| 250 | @RequestParam(required = false) String remoteHost | 212 | @RequestParam(required = false) String remoteHost |
| 251 | ){ | 213 | ){ |
| 252 | - WVPResult<String> result = new WVPResult<>(); | ||
| 253 | Date startTimeDate = null; | 214 | Date startTimeDate = null; |
| 254 | Date endTimeDate = null; | 215 | Date endTimeDate = null; |
| 255 | try { | 216 | try { |
| @@ -263,111 +224,96 @@ public class RecordController { | @@ -263,111 +224,96 @@ public class RecordController { | ||
| 263 | e.printStackTrace(); | 224 | e.printStackTrace(); |
| 264 | } | 225 | } |
| 265 | String id = videoFileService.mergeOrCut(app, stream, startTimeDate, endTimeDate, remoteHost); | 226 | String id = videoFileService.mergeOrCut(app, stream, startTimeDate, endTimeDate, remoteHost); |
| 266 | - result.setCode(0); | ||
| 267 | - result.setMsg(id!= null?"success":"error: 可能未找到视频文件"); | ||
| 268 | - result.setData(id); | ||
| 269 | - return result; | 227 | + if (id== null) { |
| 228 | + throw new ControllerException(ErrorCode.ERROR100.getCode(), "可能未找到视频文件"); | ||
| 229 | + } | ||
| 230 | + return id; | ||
| 270 | } | 231 | } |
| 271 | 232 | ||
| 272 | /** | 233 | /** |
| 273 | * 查询视频裁剪合并任务列表 | 234 | * 查询视频裁剪合并任务列表 |
| 274 | */ | 235 | */ |
| 275 | - @ApiOperation("查询视频裁剪合并任务列表") | ||
| 276 | - @ApiImplicitParams({ | ||
| 277 | - @ApiImplicitParam(name="app", value = "应用名", required = false, dataTypeClass = String.class), | ||
| 278 | - @ApiImplicitParam(name="stream", value = "流ID", required = false, dataTypeClass = String.class), | ||
| 279 | - @ApiImplicitParam(name="taskId", value = "任务ID", required = false, dataTypeClass = String.class), | ||
| 280 | - @ApiImplicitParam(name="isEnd", value = "是否结束", required = false, dataTypeClass = Boolean.class), | ||
| 281 | - }) | 236 | + @Operation(summary ="查询视频裁剪合并任务列表") |
| 237 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 238 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 239 | + @Parameter(name = "taskId", description = "任务ID", required = true) | ||
| 240 | + @Parameter(name = "isEnd", description = "是否结束", required = true) | ||
| 282 | @GetMapping(value = "/file/download/task/list") | 241 | @GetMapping(value = "/file/download/task/list") |
| 283 | @ResponseBody | 242 | @ResponseBody |
| 284 | - public WVPResult<List<MergeOrCutTaskInfo>> getTaskListForDownload( | 243 | + public List<MergeOrCutTaskInfo> getTaskListForDownload( |
| 285 | @RequestParam(required = false) String app, | 244 | @RequestParam(required = false) String app, |
| 286 | @RequestParam(required = false) String stream, | 245 | @RequestParam(required = false) String stream, |
| 287 | @RequestParam(required = false) String taskId, | 246 | @RequestParam(required = false) String taskId, |
| 288 | @RequestParam(required = false) Boolean isEnd){ | 247 | @RequestParam(required = false) Boolean isEnd){ |
| 289 | List<MergeOrCutTaskInfo> taskList = videoFileService.getTaskListForDownload(isEnd, app, stream, taskId); | 248 | List<MergeOrCutTaskInfo> taskList = videoFileService.getTaskListForDownload(isEnd, app, stream, taskId); |
| 290 | - WVPResult<List<MergeOrCutTaskInfo>> result = new WVPResult<>(); | ||
| 291 | - result.setCode(0); | ||
| 292 | - result.setMsg(taskList != null?"success":"error"); | ||
| 293 | - result.setData(taskList); | ||
| 294 | - return result; | 249 | + if (taskList == null) { |
| 250 | + throw new ControllerException(ErrorCode.ERROR100); | ||
| 251 | + } | ||
| 252 | + return taskList; | ||
| 295 | } | 253 | } |
| 296 | 254 | ||
| 297 | /** | 255 | /** |
| 298 | * 收藏录像(被收藏的录像不会被清理任务清理) | 256 | * 收藏录像(被收藏的录像不会被清理任务清理) |
| 299 | */ | 257 | */ |
| 300 | - @ApiOperation("收藏录像(被收藏的录像不会被清理任务清理)") | ||
| 301 | - @ApiImplicitParams({ | ||
| 302 | - @ApiImplicitParam(name="type", value = "类型", required = true, dataTypeClass = String.class), | ||
| 303 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 304 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 305 | - }) | 258 | + @Operation(summary ="收藏录像(被收藏的录像不会被清理任务清理)") |
| 259 | + @Parameter(name = "type", description = "类型", required = true) | ||
| 260 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 261 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 306 | @GetMapping(value = "/file/collection/add") | 262 | @GetMapping(value = "/file/collection/add") |
| 307 | @ResponseBody | 263 | @ResponseBody |
| 308 | - public WVPResult<String> collection( | 264 | + public void collection( |
| 309 | @RequestParam(required = true) String type, | 265 | @RequestParam(required = true) String type, |
| 310 | @RequestParam(required = true) String app, | 266 | @RequestParam(required = true) String app, |
| 311 | @RequestParam(required = true) String stream){ | 267 | @RequestParam(required = true) String stream){ |
| 312 | 268 | ||
| 313 | boolean collectionResult = videoFileService.collection(app, stream, type); | 269 | boolean collectionResult = videoFileService.collection(app, stream, type); |
| 314 | - WVPResult<String> result = new WVPResult<>(); | ||
| 315 | - result.setCode(0); | ||
| 316 | - result.setMsg(collectionResult ?"success":"error"); | ||
| 317 | - return result; | 270 | + if (!collectionResult) { |
| 271 | + throw new ControllerException(ErrorCode.ERROR100); | ||
| 272 | + } | ||
| 318 | } | 273 | } |
| 319 | 274 | ||
| 320 | /** | 275 | /** |
| 321 | * 移除收藏录像 | 276 | * 移除收藏录像 |
| 322 | */ | 277 | */ |
| 323 | - @ApiOperation("移除收藏录像") | ||
| 324 | - @ApiImplicitParams({ | ||
| 325 | - @ApiImplicitParam(name="type", value = "类型", required = true, dataTypeClass = String.class), | ||
| 326 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 327 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 328 | - }) | 278 | + @Operation(summary ="移除收藏录像") |
| 279 | + @Parameter(name = "type", description = "类型", required = true) | ||
| 280 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 281 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 329 | @GetMapping(value = "/file/collection/remove") | 282 | @GetMapping(value = "/file/collection/remove") |
| 330 | @ResponseBody | 283 | @ResponseBody |
| 331 | - public WVPResult<String> removeCollection( | 284 | + public void removeCollection( |
| 332 | @RequestParam(required = true) String type, | 285 | @RequestParam(required = true) String type, |
| 333 | @RequestParam(required = true) String app, | 286 | @RequestParam(required = true) String app, |
| 334 | @RequestParam(required = true) String stream){ | 287 | @RequestParam(required = true) String stream){ |
| 335 | 288 | ||
| 336 | boolean collectionResult = videoFileService.removeCollection(app, stream, type); | 289 | boolean collectionResult = videoFileService.removeCollection(app, stream, type); |
| 337 | - WVPResult<String> result = new WVPResult<>(); | ||
| 338 | - result.setCode(0); | ||
| 339 | - result.setMsg(collectionResult ?"success":"error"); | ||
| 340 | - return result; | 290 | + if (!collectionResult) { |
| 291 | + throw new ControllerException(ErrorCode.ERROR100); | ||
| 292 | + } | ||
| 341 | } | 293 | } |
| 342 | 294 | ||
| 343 | /** | 295 | /** |
| 344 | * 收藏录像列表 | 296 | * 收藏录像列表 |
| 345 | */ | 297 | */ |
| 346 | - @ApiOperation("收藏录像列表") | ||
| 347 | - @ApiImplicitParams({ | ||
| 348 | - @ApiImplicitParam(name="type", value = "类型", required = true, dataTypeClass = String.class), | ||
| 349 | - @ApiImplicitParam(name="app", value = "应用名", required = false, dataTypeClass = String.class), | ||
| 350 | - @ApiImplicitParam(name="stream", value = "流ID", required = false, dataTypeClass = String.class), | ||
| 351 | - }) | 298 | + @Operation(summary ="收藏录像列表") |
| 299 | + @Parameter(name = "type", description = "类型", required = false) | ||
| 300 | + @Parameter(name = "app", description = "应用名", required = false) | ||
| 301 | + @Parameter(name = "stream", description = "流ID", required = false) | ||
| 352 | @GetMapping(value = "/file/collection/list") | 302 | @GetMapping(value = "/file/collection/list") |
| 353 | @ResponseBody | 303 | @ResponseBody |
| 354 | - public WVPResult<List<SignInfo>> collectionList( | 304 | + public List<SignInfo> collectionList( |
| 355 | @RequestParam(required = false) String type, | 305 | @RequestParam(required = false) String type, |
| 356 | @RequestParam(required = false) String app, | 306 | @RequestParam(required = false) String app, |
| 357 | @RequestParam(required = false) String stream){ | 307 | @RequestParam(required = false) String stream){ |
| 358 | 308 | ||
| 359 | List<SignInfo> signInfos = videoFileService.getCollectionList(app, stream, type); | 309 | List<SignInfo> signInfos = videoFileService.getCollectionList(app, stream, type); |
| 360 | - WVPResult<List<SignInfo>> result = new WVPResult<>(); | ||
| 361 | - result.setCode(0); | ||
| 362 | - result.setMsg(signInfos != null ?"success":"error"); | ||
| 363 | - result.setData(signInfos); | ||
| 364 | - return result; | 310 | + return signInfos; |
| 365 | } | 311 | } |
| 366 | 312 | ||
| 367 | /** | 313 | /** |
| 368 | * 中止视频裁剪合并任务列表 | 314 | * 中止视频裁剪合并任务列表 |
| 369 | */ | 315 | */ |
| 370 | - @ApiOperation("中止视频裁剪合并任务列表(暂不支持)") | 316 | + @Operation(summary ="中止视频裁剪合并任务列表(暂不支持)") |
| 371 | @GetMapping(value = "/file/download/task/stop") | 317 | @GetMapping(value = "/file/download/task/stop") |
| 372 | @ResponseBody | 318 | @ResponseBody |
| 373 | public WVPResult<String> stopTaskForDownload(@RequestParam String taskId){ | 319 | public WVPResult<String> stopTaskForDownload(@RequestParam String taskId){ |
| @@ -397,7 +343,9 @@ public class RecordController { | @@ -397,7 +343,9 @@ public class RecordController { | ||
| 397 | String app = json.getString("app"); | 343 | String app = json.getString("app"); |
| 398 | String stream = json.getString("stream"); | 344 | String stream = json.getString("stream"); |
| 399 | logger.debug("ZLM 录制完成,参数:" + file_path); | 345 | logger.debug("ZLM 录制完成,参数:" + file_path); |
| 400 | - if (file_path == null) return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); | 346 | + if (file_path == null) { |
| 347 | + return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); | ||
| 348 | + } | ||
| 401 | videoFileService.handFile(new File(file_path), app, stream); | 349 | videoFileService.handFile(new File(file_path), app, stream); |
| 402 | 350 | ||
| 403 | return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); | 351 | return new ResponseEntity<String>(ret.toString(), HttpStatus.OK); |
| @@ -406,54 +354,39 @@ public class RecordController { | @@ -406,54 +354,39 @@ public class RecordController { | ||
| 406 | /** | 354 | /** |
| 407 | * 磁盘空间查询 | 355 | * 磁盘空间查询 |
| 408 | */ | 356 | */ |
| 409 | - @ApiOperation("磁盘空间查询") | 357 | + @Operation(summary ="磁盘空间查询") |
| 410 | @ResponseBody | 358 | @ResponseBody |
| 411 | @GetMapping(value = "/space", produces = "application/json;charset=UTF-8") | 359 | @GetMapping(value = "/space", produces = "application/json;charset=UTF-8") |
| 412 | - public ResponseEntity<String> getSpace() { | ||
| 413 | - JSONObject ret = new JSONObject(); | ||
| 414 | - ret.put("code", 0); | ||
| 415 | - ret.put("msg", "success"); | ||
| 416 | - SpaceInfo spaceInfo = videoFileService.getSpaceInfo(); | ||
| 417 | - ret.put("data", JSON.toJSON(spaceInfo)); | ||
| 418 | - return new ResponseEntity<>(ret.toString(), HttpStatus.OK); | ||
| 419 | - } | ||
| 420 | - | ||
| 421 | - /** | ||
| 422 | - * 录像文件的时长 | ||
| 423 | - */ | ||
| 424 | - @ApiOperation("录像文件的时长") | ||
| 425 | - @ApiImplicitParams({ | ||
| 426 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 427 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 428 | - @ApiImplicitParam(name="recordIng", value = "是否录制中", required = false, dataTypeClass = String.class), | ||
| 429 | - }) | ||
| 430 | - @ResponseBody | ||
| 431 | - @GetMapping(value = "/file/duration", produces = "application/json;charset=UTF-8") | ||
| 432 | - @PostMapping(value = "/file/duration", produces = "application/json;charset=UTF-8") | ||
| 433 | - public ResponseEntity<String> fileDuration( @RequestParam String app, @RequestParam String stream) { | ||
| 434 | - JSONObject ret = new JSONObject(); | ||
| 435 | - ret.put("code", 0); | ||
| 436 | - ret.put("msg", "success"); | ||
| 437 | - long duration = videoFileService.fileDuration(app, stream); | ||
| 438 | - ret.put("data", duration); | ||
| 439 | - return new ResponseEntity<>(ret.toString(), HttpStatus.OK); | 360 | + public SpaceInfo getSpace() { |
| 361 | + return videoFileService.getSpaceInfo(); | ||
| 440 | } | 362 | } |
| 441 | 363 | ||
| 442 | /** | 364 | /** |
| 443 | * 增加推流的鉴权信息,用于录像存储使用 | 365 | * 增加推流的鉴权信息,用于录像存储使用 |
| 444 | */ | 366 | */ |
| 445 | - @ApiOperation("增加推流的鉴权信息") | ||
| 446 | - @ApiImplicitParams({ | ||
| 447 | - @ApiImplicitParam(name="app", value = "应用名", required = true, dataTypeClass = String.class), | ||
| 448 | - @ApiImplicitParam(name="stream", value = "流ID", required = true, dataTypeClass = String.class), | ||
| 449 | - @ApiImplicitParam(name="callId", value = "录像自鉴权ID", required = true, dataTypeClass = String.class), | ||
| 450 | - }) | 367 | + @Operation(summary ="增加推流的鉴权信息") |
| 368 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 369 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 370 | + @Parameter(name = "callId", description = "录像自鉴权ID", required = true) | ||
| 451 | @ResponseBody | 371 | @ResponseBody |
| 452 | @GetMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") | 372 | @GetMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") |
| 453 | @PostMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") | 373 | @PostMapping(value = "/addStreamCallInfo", produces = "application/json;charset=UTF-8") |
| 454 | - public ResponseEntity<String> addStreamCallInfo(String app, String stream, String callId) { | 374 | + public void addStreamCallInfo(String app, String stream, String callId) { |
| 455 | String key = "Stream_Call_Info" + app + "_" + stream; | 375 | String key = "Stream_Call_Info" + app + "_" + stream; |
| 456 | redisUtil.set(key, callId, -1); | 376 | redisUtil.set(key, callId, -1); |
| 457 | - return new ResponseEntity<>(null, HttpStatus.OK); | 377 | + } |
| 378 | + | ||
| 379 | + /** | ||
| 380 | + * 录像文件的时长 | ||
| 381 | + */ | ||
| 382 | + @Operation(summary ="录像文件的时长") | ||
| 383 | + @Parameter(name = "app", description = "应用名", required = true) | ||
| 384 | + @Parameter(name = "stream", description = "流ID", required = true) | ||
| 385 | + @Parameter(name = "recordIng", description = "是否录制中", required = true) | ||
| 386 | + @ResponseBody | ||
| 387 | + @GetMapping(value = "/file/duration", produces = "application/json;charset=UTF-8") | ||
| 388 | + @PostMapping(value = "/file/duration", produces = "application/json;charset=UTF-8") | ||
| 389 | + public long fileDuration( @RequestParam String app, @RequestParam String stream) { | ||
| 390 | + return videoFileService.fileDuration(app, stream); | ||
| 458 | } | 391 | } |
| 459 | } | 392 | } |
src/main/java/top/panll/assist/controller/bean/ControllerException.java
0 → 100644
| 1 | +package top.panll.assist.controller.bean; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 自定义异常,controller出现错误时直接抛出异常由全局异常捕获并返回结果 | ||
| 5 | + */ | ||
| 6 | +public class ControllerException extends RuntimeException{ | ||
| 7 | + | ||
| 8 | + private int code; | ||
| 9 | + private String msg; | ||
| 10 | + | ||
| 11 | + public ControllerException(int code, String msg) { | ||
| 12 | + this.code = code; | ||
| 13 | + this.msg = msg; | ||
| 14 | + } | ||
| 15 | + public ControllerException(ErrorCode errorCode) { | ||
| 16 | + this.code = errorCode.getCode(); | ||
| 17 | + this.msg = errorCode.getMsg(); | ||
| 18 | + } | ||
| 19 | + | ||
| 20 | + public int getCode() { | ||
| 21 | + return code; | ||
| 22 | + } | ||
| 23 | + | ||
| 24 | + public void setCode(int code) { | ||
| 25 | + this.code = code; | ||
| 26 | + } | ||
| 27 | + | ||
| 28 | + public String getMsg() { | ||
| 29 | + return msg; | ||
| 30 | + } | ||
| 31 | + | ||
| 32 | + public void setMsg(String msg) { | ||
| 33 | + this.msg = msg; | ||
| 34 | + } | ||
| 35 | +} |
src/main/java/top/panll/assist/controller/bean/ErrorCode.java
0 → 100644
| 1 | +package top.panll.assist.controller.bean; | ||
| 2 | + | ||
| 3 | +/** | ||
| 4 | + * 全局错误码 | ||
| 5 | + */ | ||
| 6 | +public enum ErrorCode { | ||
| 7 | + SUCCESS(0, "成功"), | ||
| 8 | + ERROR100(100, "失败"), | ||
| 9 | + ERROR400(400, "参数不全或者错误"), | ||
| 10 | + ERROR403(403, "无权限操作"), | ||
| 11 | + ERROR401(401, "请登录后重新请求"), | ||
| 12 | + ERROR500(500, "系统异常"); | ||
| 13 | + | ||
| 14 | + private final int code; | ||
| 15 | + private final String msg; | ||
| 16 | + | ||
| 17 | + ErrorCode(int code, String msg) { | ||
| 18 | + this.code = code; | ||
| 19 | + this.msg = msg; | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public int getCode() { | ||
| 23 | + return code; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + public String getMsg() { | ||
| 27 | + return msg; | ||
| 28 | + } | ||
| 29 | +} |
src/main/java/top/panll/assist/controller/bean/WVPResult.java
| 1 | package top.panll.assist.controller.bean; | 1 | package top.panll.assist.controller.bean; |
| 2 | 2 | ||
| 3 | + | ||
| 4 | +import io.swagger.v3.oas.annotations.media.Schema; | ||
| 5 | + | ||
| 6 | +@Schema(description = "统一返回结果") | ||
| 3 | public class WVPResult<T> { | 7 | public class WVPResult<T> { |
| 4 | 8 | ||
| 9 | + public WVPResult() { | ||
| 10 | + } | ||
| 11 | + | ||
| 12 | + public WVPResult(int code, String msg, T data) { | ||
| 13 | + this.code = code; | ||
| 14 | + this.msg = msg; | ||
| 15 | + this.data = data; | ||
| 16 | + } | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + @Schema(description = "错误码,0为成功") | ||
| 5 | private int code; | 20 | private int code; |
| 21 | + @Schema(description = "描述,错误时描述错误原因") | ||
| 6 | private String msg; | 22 | private String msg; |
| 23 | + @Schema(description = "数据") | ||
| 7 | private T data; | 24 | private T data; |
| 8 | 25 | ||
| 26 | + | ||
| 27 | + public static <T> WVPResult<T> success(T t, String msg) { | ||
| 28 | + return new WVPResult<>(ErrorCode.SUCCESS.getCode(), msg, t); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + public static <T> WVPResult<T> success(T t) { | ||
| 32 | + return success(t, ErrorCode.SUCCESS.getMsg()); | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + public static <T> WVPResult<T> fail(int code, String msg) { | ||
| 36 | + return new WVPResult<>(code, msg, null); | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + public static <T> WVPResult<T> fail(ErrorCode errorCode) { | ||
| 40 | + return fail(errorCode.getCode(), errorCode.getMsg()); | ||
| 41 | + } | ||
| 42 | + | ||
| 9 | public int getCode() { | 43 | public int getCode() { |
| 10 | return code; | 44 | return code; |
| 11 | } | 45 | } |
src/main/java/top/panll/assist/service/VideoFileService.java
| @@ -518,7 +518,6 @@ public class VideoFileService { | @@ -518,7 +518,6 @@ public class VideoFileService { | ||
| 518 | }else { | 518 | }else { |
| 519 | result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem)); | 519 | result.add((MergeOrCutTaskInfo)redisUtil.get(keyItem)); |
| 520 | } | 520 | } |
| 521 | - | ||
| 522 | } | 521 | } |
| 523 | } | 522 | } |
| 524 | result.sort((MergeOrCutTaskInfo m1, MergeOrCutTaskInfo m2)->{ | 523 | result.sort((MergeOrCutTaskInfo m1, MergeOrCutTaskInfo m2)->{ |
src/main/java/top/panll/assist/utils/RedisUtil.java
| @@ -707,28 +707,18 @@ public class RedisUtil { | @@ -707,28 +707,18 @@ public class RedisUtil { | ||
| 707 | * @return | 707 | * @return |
| 708 | */ | 708 | */ |
| 709 | public List<Object> scan(String query) { | 709 | public List<Object> scan(String query) { |
| 710 | - Set<String> keys = (Set<String>) redisTemplate.execute((RedisCallback<Set<String>>) connection -> { | ||
| 711 | - Set<String> keysTmp = new HashSet<>(); | ||
| 712 | - Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build()); | ||
| 713 | - while (cursor.hasNext()) { | ||
| 714 | - keysTmp.add(new String(cursor.next())); | 710 | + Set<String> resultKeys = redisTemplate.execute((RedisCallback<Set<String>>) connection -> { |
| 711 | + ScanOptions scanOptions = ScanOptions.scanOptions().match("*" + query + "*").count(1000).build(); | ||
| 712 | + Cursor<byte[]> scan = connection.scan(scanOptions); | ||
| 713 | + Set<String> keys = new HashSet<>(); | ||
| 714 | + while (scan.hasNext()) { | ||
| 715 | + byte[] next = scan.next(); | ||
| 716 | + keys.add(new String(next)); | ||
| 715 | } | 717 | } |
| 716 | - return keysTmp; | 718 | + return keys; |
| 717 | }); | 719 | }); |
| 718 | -// Set<String> keys = (Set<String>) redisTemplate.execute(new RedisCallback<Set<String>>(){ | ||
| 719 | -// | ||
| 720 | -// @Override | ||
| 721 | -// public Set<String> doInRedis(RedisConnection connection) throws DataAccessException { | ||
| 722 | -// Set<String> keysTmp = new HashSet<>(); | ||
| 723 | -// Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match(query).count(1000).build()); | ||
| 724 | -// while (cursor.hasNext()) { | ||
| 725 | -// keysTmp.add(new String(cursor.next())); | ||
| 726 | -// } | ||
| 727 | -// return keysTmp; | ||
| 728 | -// } | ||
| 729 | -// }); | ||
| 730 | 720 | ||
| 731 | - return new ArrayList<>(keys); | 721 | + return new ArrayList<>(resultKeys); |
| 732 | } | 722 | } |
| 733 | 723 | ||
| 734 | public void convertAndSend(String channel, Object msg) { | 724 | public void convertAndSend(String channel, Object msg) { |
src/main/resources/application-dev.yml
src/main/resources/application-local.yml
0 → 100644
| 1 | +spring: | ||
| 2 | + # REDIS数据库配置 | ||
| 3 | + redis: | ||
| 4 | + # [可选] 超时时间 | ||
| 5 | + timeout: 10000 | ||
| 6 | + # 以下为单机配置 | ||
| 7 | + # [必须修改] Redis服务器IP, REDIS安装在本机的,使用127.0.0.1 | ||
| 8 | + host: 127.0.0.1 | ||
| 9 | + # [必须修改] 端口号 | ||
| 10 | + port: 6379 | ||
| 11 | + # [可选] 数据库 DB | ||
| 12 | + database: 1 | ||
| 13 | + # [可选] 访问密码,若你的redis服务器没有设置密码,就不需要用密码去连接 | ||
| 14 | + password: adminadmin123. | ||
| 15 | + # 以下为集群配置 | ||
| 16 | +# cluster: | ||
| 17 | +# nodes: 192.168.1.242:7001 | ||
| 18 | +# password: 4767cb971b40a1300fa09b7f87b09d1c | ||
| 19 | + | ||
| 20 | +# [可选] WVP监听的HTTP端口, 网页和接口调用都是这个端口 | ||
| 21 | +server: | ||
| 22 | + port: 18089 | ||
| 23 | + # [可选] HTTPS配置, 默认不开启 | ||
| 24 | + ssl: | ||
| 25 | + # [可选] 是否开启HTTPS访问 | ||
| 26 | + enabled: false | ||
| 27 | + # [可选] 证书文件路径,放置在resource/目录下即可,修改xxx为文件名 | ||
| 28 | + key-store: classpath:xxx.jks | ||
| 29 | + # [可选] 证书密码 | ||
| 30 | + key-password: password | ||
| 31 | + # [可选] 证书类型, 默认为jks,根据实际修改 | ||
| 32 | + key-store-type: JKS | ||
| 33 | + | ||
| 34 | +# [根据业务需求配置] | ||
| 35 | +userSettings: | ||
| 36 | + # [必选 ] zlm配置的录像路径 | ||
| 37 | + record: /home/lin/server/test001/default/www/record/ | ||
| 38 | + # [可选 ] 录像保存时长(单位: 天)每天晚12点自动对过期文件执行清理 | ||
| 39 | + recordDay: 7 | ||
| 40 | + # [可选 ] 录像下载合成临时文件保存时长, 不配置默认取值recordDay(单位: 天)每天晚12点自动对过期文件执行清理 | ||
| 41 | + # recordTempDay: 7 | ||
| 42 | + # [必选 ] ffmpeg路径 | ||
| 43 | + ffmpeg: /home/lin/IdeaProjects/wvp-pro-assist/lib/ffmpeg | ||
| 44 | + # [必选 ] ffprobe路径, 一般安装ffmpeg就会自带, 一般跟ffmpeg在同一目录,用于查询文件的信息 | ||
| 45 | + ffprobe: /home/lin/IdeaProjects/wvp-pro-assist/lib/ffprobe | ||
| 46 | + # [可选 ] 限制 ffmpeg 合并文件使用的线程数,间接限制cpu使用率, 默认2 限制到50% | ||
| 47 | + threads: 2 | ||
| 48 | + | ||
| 49 | +swagger-ui: | ||
| 50 | + | ||
| 51 | +# [可选] 日志配置, 一般不需要改 | ||
| 52 | +logging: | ||
| 53 | + file: | ||
| 54 | + name: logs/wvp.log | ||
| 55 | + max-history: 30 | ||
| 56 | + max-size: 10MB | ||
| 57 | + total-size-cap: 300MB | ||
| 58 | + level: | ||
| 59 | + root: WARN | ||
| 60 | + top: | ||
| 61 | + panll: | ||
| 62 | + assist: info | ||
| 0 | \ No newline at end of file | 63 | \ No newline at end of file |