Commit 47187eb3 by lixian7

Merge branch 'dev' into 'master'

Dev

See merge request !18
parents f302218e 972f35fc
...@@ -50,5 +50,38 @@ ...@@ -50,5 +50,38 @@
<version>${parent.version}</version> <version>${parent.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.9.1</version>
</dependency>
</dependencies> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.0.4.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<!-- 给jar包取名 -->
<finalName>extend</finalName>
</build>
</project> </project>
package com.hikcreate.edl.pub.web.mobile.api.controller; package com.hikcreate.edl.pub.web.mobile.api.controller;
import com.hikcreate.common.sdk.response.apiparam.Response; import com.hikcreate.common.orika.DefaultConverter;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.common.sdk.response.statuscode.StatusCode; import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.common.distributed.lock.exception.DistributedLockException;
import com.hikcreate.edl.pub.web.mobile.domain.IBindService; import com.hikcreate.edl.pub.web.mobile.domain.IBindService;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.ResultCode;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.ResultGenerator;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.BodyDecryptAnnotation; import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.BodyDecryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.HeaderDecryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.ResponseEncryptAnnotation; import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.ResponseEncryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.data.mapper.BindInfoMapper; import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoQueryReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoQueryReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.UnBindReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.UnBindReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BindInfoQueryRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BindInfoRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.ResultList; import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.ResultList;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -21,8 +24,6 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -21,8 +24,6 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/** /**
* 绑定信息的controller * 绑定信息的controller
* *
...@@ -31,31 +32,41 @@ import javax.annotation.Resource; ...@@ -31,31 +32,41 @@ import javax.annotation.Resource;
* @time:2020/6/18 15:59 * @time:2020/6/18 15:59
**/ **/
@RestController @RestController
@RequestMapping("/vehicle") @RequestMapping( "/vehicle" )
@Slf4j @Slf4j
public class BindInfoControlller extends BaseController { public class BindInfoControlller extends BaseController {
@Autowired @Autowired
IBindService service; IBindService service;
@Resource @Autowired
BindInfoMapper mapper; DefaultConverter defaultConverter;
/** /**
* 绑定用户信息的接口 * 绑定用户信息的接口
* *
* @param info * @param req
* @return Result * @return Result
* @author: xsx * @author: xsx
* @date: 2020/6/19 10:27 * @date: 2020/6/19 10:27
*/ */
@PostMapping("bind") @PostMapping( "bind" )
@BodyDecryptAnnotation
@ResponseEncryptAnnotation @ResponseEncryptAnnotation
public Response<String> bindInfo(@RequestBody BindInfo info) { public Result<BindInfoRes> bindInfo( @RequestBody @Validated BindInfoReq req ) {
if (info == null) { ParkBindInfo bindInfo = new ParkBindInfo();
return ResponseGenerator.fail(StatusCode.PARAM_ERROR); defaultConverter.getMapperFacade().map(req, bindInfo);
Result response = null;
try {
response = service.bind(bindInfo);
} catch ( DistributedLockException e ) {
log.error("分布式锁超时");
return ResultGenerator.fail(StatusCode.REPEAT_SUBMIT);
} catch ( Exception e ) {
log.error("系统异常:{}", e);
return ResultGenerator.fail(StatusCode.SYSTEM_ERROR);
} }
return service.bind(info); return response;
} }
...@@ -67,9 +78,20 @@ public class BindInfoControlller extends BaseController { ...@@ -67,9 +78,20 @@ public class BindInfoControlller extends BaseController {
* @author: xsx * @author: xsx
* @date: 2020/6/19 10:27 * @date: 2020/6/19 10:27
*/ */
@PostMapping("unbind") @PostMapping( "unbind" )
public Response unbindInfo(@RequestBody @Validated UnBindReq req) { @BodyDecryptAnnotation
return service.unbindInfo(req) ? ResponseGenerator.success() : ResponseGenerator.fail("解绑失败"); @ResponseEncryptAnnotation
public Result unbindInfo( @RequestBody @Validated UnBindReq req ) {
Result result = null;
try {
result = service.unbindInfo(req);
} catch ( DistributedLockException e ) {
return ResultGenerator.fail(StatusCode.REPEAT_SUBMIT);
} catch ( Exception e ) {
log.error("系统异常:{}", e);
return ResultGenerator.fail(StatusCode.SYSTEM_ERROR);
}
return result;
} }
/** /**
...@@ -80,11 +102,11 @@ public class BindInfoControlller extends BaseController { ...@@ -80,11 +102,11 @@ public class BindInfoControlller extends BaseController {
* @author: xsx * @author: xsx
* @date: 2020/6/19 10:31 * @date: 2020/6/19 10:31
*/ */
@PostMapping("query") @PostMapping( "query" )
@BodyDecryptAnnotation @BodyDecryptAnnotation
@ResponseEncryptAnnotation @ResponseEncryptAnnotation
public Response<ResultList<BindInfo>> bindInfoQery(@RequestBody @Validated BindInfoQueryReq query) { public Result<ResultList<BindInfoQueryRes>> bindInfoQery( @RequestBody @Validated BindInfoQueryReq query ) {
return ResponseGenerator.success(new ResultList<BindInfo>(service.selectByQuery(query))); return ResultGenerator.success(new ResultList<BindInfoQueryRes>(service.selectByQuery(query)));
} }
} }
...@@ -3,28 +3,24 @@ package com.hikcreate.edl.pub.web.mobile.api.controller; ...@@ -3,28 +3,24 @@ package com.hikcreate.edl.pub.web.mobile.api.controller;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.hikcreate.common.orika.DefaultConverter; import com.hikcreate.common.orika.DefaultConverter;
import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.common.sdk.response.statuscode.StatusCode; import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.common.sdk.util.VerifyCodeUtil; import com.hikcreate.edl.common.sdk.util.VerifyCodeUtil;
import com.hikcreate.edl.pub.web.mobile.domain.IBindService; import com.hikcreate.edl.pub.web.mobile.domain.IBindService;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.ResultGenerator;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.HeaderDecryptAnnotation; import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.HeaderDecryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.SmsFeign; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.SmsFeign;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.CheckVerifyCodeMicReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.CheckVerifyCodeMicReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendVerifyCodeMicReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendVerifyCodeMicReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.mapper.VerifyInfoMapper; import com.hikcreate.edl.pub.web.mobile.infra.data.mapper.VerifyInfoMapper;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery; import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkVerifyInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.VerifyInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.CheckVerifyCodeReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.CheckVerifyCodeReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.SendVerifyCodeReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.SendVerifyCodeReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.CheckValidityRes; import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.*;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.DrivingLicenseInfoRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.InsuranceInfoRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.ResultList;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.ViolationInfoRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.YearCheckInfoRes;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -42,7 +38,7 @@ import javax.annotation.Resource; ...@@ -42,7 +38,7 @@ import javax.annotation.Resource;
* @time:2020/6/19 16:37 * @time:2020/6/19 16:37
**/ **/
@RestController @RestController
@RequestMapping("/vehicle") @RequestMapping( "/vehicle" )
@Slf4j @Slf4j
public class H5Controller { public class H5Controller {
...@@ -56,6 +52,13 @@ public class H5Controller { ...@@ -56,6 +52,13 @@ public class H5Controller {
DefaultConverter defaultConverter; DefaultConverter defaultConverter;
/** /**
* 验证有效性限制时间
* 单位:小时
*/
@Value( "${biz.check.validity.limit.time:24}" )
Integer checkValidityLimitTime;
/**
* 年检信息查询接口 * 年检信息查询接口
* *
* @param query * @param query
...@@ -63,9 +66,9 @@ public class H5Controller { ...@@ -63,9 +66,9 @@ public class H5Controller {
* @author: xsx * @author: xsx
* @date: 2020/6/19 10:32 * @date: 2020/6/19 10:32
*/ */
@PostMapping("yearCheckInfo") @PostMapping( "yearCheckInfo" )
@HeaderDecryptAnnotation @HeaderDecryptAnnotation
public Response<YearCheckInfoRes> yearCheckInfo(@RequestBody @Validated H5BindInfoQuery query) { public Result<YearCheckInfoRes> yearCheckInfo( @RequestBody @Validated H5BindInfoQuery query ) {
return service.yearCheckInfo(query); return service.yearCheckInfo(query);
} }
...@@ -78,9 +81,9 @@ public class H5Controller { ...@@ -78,9 +81,9 @@ public class H5Controller {
* @author: xsx * @author: xsx
* @date: 2020/6/19 16:28 * @date: 2020/6/19 16:28
*/ */
@PostMapping("violationInfo") @PostMapping( "violationInfo" )
@HeaderDecryptAnnotation @HeaderDecryptAnnotation
public Response<ResultList<ViolationInfoRes>> violationInfo(@RequestBody @Validated H5BindInfoQuery query) { public Result<ResultList<ViolationInfoRes>> violationInfo( @RequestBody @Validated H5BindInfoQuery query ) {
return service.violationInfo(query); return service.violationInfo(query);
} }
...@@ -93,9 +96,9 @@ public class H5Controller { ...@@ -93,9 +96,9 @@ public class H5Controller {
* @author: xsx * @author: xsx
* @date: 2020/6/19 16:28 * @date: 2020/6/19 16:28
*/ */
@PostMapping("insuranceInfo") @PostMapping( "insuranceInfo" )
@HeaderDecryptAnnotation @HeaderDecryptAnnotation
public Response<InsuranceInfoRes> insuranceInfo(@RequestBody @Validated H5BindInfoQuery query) { public Result<InsuranceInfoRes> insuranceInfo( @RequestBody @Validated H5BindInfoQuery query ) {
return service.insuranceInfo(query); return service.insuranceInfo(query);
} }
...@@ -109,45 +112,46 @@ public class H5Controller { ...@@ -109,45 +112,46 @@ public class H5Controller {
* @author: xsx * @author: xsx
* @date: 2020/6/19 16:28 * @date: 2020/6/19 16:28
*/ */
@PostMapping("drivingLicenseInfo") @PostMapping( "drivingLicenseInfo" )
@HeaderDecryptAnnotation @HeaderDecryptAnnotation
public Response<DrivingLicenseInfoRes> drivingLicenseInfo(@RequestBody @Validated H5BindInfoQuery query) { public Result<DrivingLicenseInfoRes> drivingLicenseInfo( @RequestBody @Validated H5BindInfoQuery query ) {
return service.drivingLicenseInfo(query); return service.drivingLicenseInfo(query);
} }
/** /**
* 验证当前手机号是否在10天内,已通过验证 * 验证当前手机号是否在1天内,已通过验证
*
* @param query * @param query
* @return * @return
*/ */
@PostMapping("checkValidity") @PostMapping( "checkValidity" )
@HeaderDecryptAnnotation @HeaderDecryptAnnotation
public Response<CheckValidityRes> checkValidity( @RequestBody @Validated H5BindInfoQuery query) { public Result<CheckValidityRes> checkValidity( @RequestBody @Validated H5BindInfoQuery query ) {
VerifyInfo verifyInfo = verifyInfoMapper.checkValidity(query.getPhone(), query.getUserId(), ParkVerifyInfo verifyInfo = verifyInfoMapper.checkValidity(query.getPhone(), query.getUserId(),
DateUtil.offsetDay(DateTime.now(), -10)); DateUtil.offsetHour(DateTime.now(), -checkValidityLimitTime));
CheckValidityRes checkValidityRes = new CheckValidityRes(); CheckValidityRes checkValidityRes = new CheckValidityRes();
defaultConverter.getMapperFacade().map(query, checkValidityRes); defaultConverter.getMapperFacade().map(query, checkValidityRes);
if (verifyInfo != null) { if ( verifyInfo != null ) {
checkValidityRes.setIsChecked(1); checkValidityRes.setIsChecked(1);
} else { } else {
checkValidityRes.setIsChecked(0); checkValidityRes.setIsChecked(0);
} }
return ResponseGenerator.success(checkValidityRes); return ResultGenerator.success(checkValidityRes);
} }
/*** /***
* 发送短信验证码 * 发送短信验证码
* *
* @param req * @param req
* @return Response * @return Result
* @author: xsx * @author: xsx
* @date: 2020/6/21 13:57 * @date: 2020/6/21 13:57
*/ */
@PostMapping("sendVerifyCode") @PostMapping( "sendVerifyCode" )
public Response<Void> sendVerifyCode(@RequestBody @Validated SendVerifyCodeReq req) { public Result<Void> sendVerifyCode( @RequestBody @Validated SendVerifyCodeReq req ) {
SendVerifyCodeMicReq micReq = new SendVerifyCodeMicReq(); SendVerifyCodeMicReq micReq = new SendVerifyCodeMicReq();
micReq.setPhone(req.getPhone()); micReq.setPhone(req.getPhone());
...@@ -160,25 +164,25 @@ public class H5Controller { ...@@ -160,25 +164,25 @@ public class H5Controller {
* 校验短信验证码 * 校验短信验证码
* *
* @param req * @param req
* @return Response * @return Result
* @author: xsx * @author: xsx
* @date: 2020/6/21 13:58 * @date: 2020/6/21 13:58
*/ */
@PostMapping("checkVerifyCode") @PostMapping( "checkVerifyCode" )
public Response<Void> sendVerifyCode(@RequestBody @Validated CheckVerifyCodeReq req) { public Result<Void> checkVerifyCode( @RequestBody @Validated CheckVerifyCodeReq req ) {
CheckVerifyCodeMicReq micReq = new CheckVerifyCodeMicReq(); CheckVerifyCodeMicReq micReq = new CheckVerifyCodeMicReq();
micReq.setPhone(req.getPhone()); micReq.setPhone(req.getPhone());
micReq.setVerifyCode(req.getVerifyCode()); micReq.setVerifyCode(req.getVerifyCode());
micReq.setTemplateCode("PARK_LOOK_DRIVER_LICENSE"); micReq.setTemplateCode("PARK_LOOK_DRIVER_LICENSE");
Response<Void> checkResult = smsFeign.checkVerifyCode(micReq); Result<Void> checkResult = smsFeign.checkVerifyCode(micReq);
if (StatusCode.SUCCESS.getCode() == (checkResult.getCode())) { if ( StatusCode.SUCCESS.getCode() == (checkResult.getCode()) ) {
VerifyInfo verifyInfo = new VerifyInfo(); ParkVerifyInfo verifyInfo = new ParkVerifyInfo();
verifyInfo.setUserId(req.getUserId()); verifyInfo.setUserId(req.getUserId());
verifyInfo.setVerifyCode(req.getVerifyCode()); verifyInfo.setVerifyCode(req.getVerifyCode());
verifyInfo.setPhone(req.getPhone()); verifyInfo.setPhone(req.getPhone());
verifyInfo.setPassTime(DateTime.now().toString()); verifyInfo.setPassTime(DateTime.now());
verifyInfoMapper.insert(verifyInfo); verifyInfoMapper.insert(verifyInfo);
} }
return checkResult; return checkResult;
......
package com.hikcreate.edl.pub.web.mobile.api.controller;
import com.hikcreate.edl.common.sdk.util.EncryptStringAes;
import com.hikcreate.edl.pub.web.mobile.infra.core.configbean.SignKeyConfigBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 工具
*
* @author lixian
* @menu 工具类
* @description
* @date 2020/6/18 17:57
**/
@Slf4j
@RestController
@RequestMapping("/tool")
public class ToolController {
@Autowired
SignKeyConfigBean signKeyConfigBean;
/**
* 加密
*
* @param plain 明文
* @return
*/
@GetMapping(value = "encrypt")
public String encrypt(String plain) {
return EncryptStringAes.encryptAes(plain, signKeyConfigBean.getKey());
}
/**
* 解密
*
* @param cipher 密文
* @return
*/
@GetMapping(value = "decrypt")
public String decrypt(String cipher) {
return EncryptStringAes.decryptAes(cipher, signKeyConfigBean.getKey());
}
/**
* 获取时间戳
*
* @return
*/
@GetMapping(value = "timestamp")
public String timestamp() {
return String.valueOf(System.currentTimeMillis());
}
}
...@@ -4,9 +4,15 @@ import com.hikcreate.common.sdk.exception.DefaultExceptionHandler; ...@@ -4,9 +4,15 @@ import com.hikcreate.common.sdk.exception.DefaultExceptionHandler;
import com.hikcreate.common.sdk.response.apiparam.Response; import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator; import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.common.sdk.response.statuscode.StatusCode; import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.ResultCode;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.ResultGenerator;
import feign.RetryableException; import feign.RetryableException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ExceptionHandler;
...@@ -16,21 +22,44 @@ import org.springframework.web.bind.annotation.ResponseStatus; ...@@ -16,21 +22,44 @@ import org.springframework.web.bind.annotation.ResponseStatus;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import java.util.List;
/** /**
* 全局异常处理类 FOR controller层以下的异常,Filter的异常不能捕获 * 全局异常处理类 FOR controller层以下的异常,Filter的异常不能捕获
*/ */
@Slf4j @Slf4j
@ControllerAdvice @ControllerAdvice
public class GlobalExceptionHandler extends DefaultExceptionHandler { public class GlobalExceptionHandler {
@Override
@ExceptionHandler(value = ServletRequestBindingException.class) @ExceptionHandler(value = ServletRequestBindingException.class)
@ResponseBody @ResponseBody
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
public Response handleServletRequestBindingException(ServletRequestBindingException e) { public Result handleServletRequestBindingException(ServletRequestBindingException e) {
log.error("param bind failure", e); log.error("param bind failure", e);
return ResponseGenerator.fail(StatusCode.PARAM_ERROR.getCode(), e.getMessage()); return ResultGenerator.fail(StatusCode.PARAM_ERROR);
}
/**
* 可能原因:@Validated 注解的对象验证不通过
*
* @param e
* @return
*/
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseBody
public Result<Void> handle(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
String errorMessage = buildErrorMessage(bindingResult);
log.warn(errorMessage);
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
String message = "参数错误";
if (null != fieldErrors && fieldErrors.size() > 0) {
FieldError fieldError = fieldErrors.get(0);
if (null != fieldError) {
message = fieldError.getDefaultMessage();
}
}
return ResultGenerator.fail(StatusCode.PARAM_ERROR.getCode(), message);
} }
/** /**
...@@ -44,18 +73,36 @@ public class GlobalExceptionHandler extends DefaultExceptionHandler { ...@@ -44,18 +73,36 @@ public class GlobalExceptionHandler extends DefaultExceptionHandler {
@ExceptionHandler(ConstraintViolationException.class) @ExceptionHandler(ConstraintViolationException.class)
@ResponseBody @ResponseBody
@ResponseStatus(HttpStatus.OK) @ResponseStatus(HttpStatus.OK)
public Response handleValidationException(ConstraintViolationException e) { public Result handleValidationException( ConstraintViolationException e) {
for (ConstraintViolation<?> s : e.getConstraintViolations()) { for (ConstraintViolation<?> s : e.getConstraintViolations()) {
log.error("Request parameter is invalid {}", s.getMessage()); log.error("Request parameter is invalid {}", s.getMessage());
return ResponseGenerator.fail(StatusCode.PARAM_ERROR.getCode(), s.getMessage()); return ResultGenerator.fail(StatusCode.PARAM_ERROR);
} }
return ResponseGenerator.fail(StatusCode.PARAM_ERROR); return ResultGenerator.fail(StatusCode.PARAM_ERROR);
} }
@ExceptionHandler(value = RetryableException.class) @ExceptionHandler(value = RetryableException.class)
@ResponseBody @ResponseBody
public Response retryableExceptionHandler(HttpServletRequest req, RetryableException e) throws Exception { public Result retryableExceptionHandler(HttpServletRequest req, RetryableException e) throws Exception {
log.error(" connect timed out", e); log.error(" connect timed out", e);
return ResponseGenerator.fail(StatusCode.SYSTEM_ERROR.getCode(), "服务请求超时或不可用", e.getMessage()); return ResultGenerator.fail(StatusCode.SYSTEM_ERROR.getCode(), "服务请求超时或不可用");
}
/**
* 从{@code @BindingResult}中构建异常信息
* on field 'verifyCode': null];
*
* @param bindingResult 绑定结果
*/
private String buildErrorMessage(BindingResult bindingResult) {
StringBuilder sb = new StringBuilder("BindException. ");
sb.append("Field error in object '").append(bindingResult.getObjectName()).append("'. [").append(bindingResult.getTarget()).append("]");
bindingResult.getFieldErrors()
.forEach(error -> {
sb.append("\r\n on field '").append(error.getField()).append("': ");
sb.append("rejected value [").append(error.getRejectedValue()).append("]. ");
sb.append("default message [").append(error.getDefaultMessage()).append("]");
});
return sb.toString();
} }
} }
\ No newline at end of file
...@@ -37,10 +37,7 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice { ...@@ -37,10 +37,7 @@ public class DecryptRequestBodyAdvice implements RequestBodyAdvice {
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
public static void main( String[] args ) {
String value = "{\"id\":123,\"name\":\"李\"}";
System.out.println(EncryptStringAes.encryptAes(value, "AES/ECB/PKCS5Padding"));
}
@Override @Override
public boolean supports( MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass ) { public boolean supports( MethodParameter methodParameter, Type type, Class<? extends HttpMessageConverter<?>> aClass ) {
......
...@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; ...@@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.hikcreate.common.sdk.response.apiparam.Response; import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.statuscode.StatusCode; import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import com.hikcreate.edl.common.sdk.util.EncryptStringAes; import com.hikcreate.edl.common.sdk.util.EncryptStringAes;
import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.ResponseEncryptAnnotation; import com.hikcreate.edl.pub.web.mobile.infra.core.annotatiion.ResponseEncryptAnnotation;
import com.hikcreate.edl.pub.web.mobile.infra.core.configbean.SignKeyConfigBean; import com.hikcreate.edl.pub.web.mobile.infra.core.configbean.SignKeyConfigBean;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BaseEncryptRes; import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BaseEncryptRes;
...@@ -41,9 +42,9 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice { ...@@ -41,9 +42,9 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice {
@Override @Override
public Object beforeBodyWrite( Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse ) { public Object beforeBodyWrite( Object o, MethodParameter methodParameter, MediaType mediaType, Class aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse ) {
try { try {
log.info("Response body 明文: {}", objectMapper.writeValueAsString(o)); log.info("Result body 明文: {}", objectMapper.writeValueAsString(o));
if ( methodParameter.getMethod().isAnnotationPresent(ResponseEncryptAnnotation.class) && o instanceof Response ) { if ( methodParameter.getMethod().isAnnotationPresent(ResponseEncryptAnnotation.class) && o instanceof Result ) {
Response<Object> result = (Response<Object>) o; Result<Object> result = (Result<Object>) o;
if ( StatusCode.SUCCESS.getCode() == (result.getCode()) ) { if ( StatusCode.SUCCESS.getCode() == (result.getCode()) ) {
//进行加密 //进行加密
Object data = result.getData(); Object data = result.getData();
...@@ -54,12 +55,12 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice { ...@@ -54,12 +55,12 @@ public class EncryptResponseBodyAdvice implements ResponseBodyAdvice {
baseEncryptRes.setEncData(encryptStr); baseEncryptRes.setEncData(encryptStr);
result.setData(baseEncryptRes); result.setData(baseEncryptRes);
o = result; o = result;
log.info("Response body 密文: {}", objectMapper.writeValueAsString(o)); log.info("Result body 密文: {}", objectMapper.writeValueAsString(o));
} }
} }
} }
} catch ( Exception e ) { } catch ( Exception e ) {
log.error("Response body 加密异常:{}", e); log.error("Result body 加密异常:{}", e);
} }
return o; return o;
} }
......
...@@ -2,51 +2,44 @@ ...@@ -2,51 +2,44 @@
<configuration scan="true" scanPeriod="60 seconds" debug="false"> <configuration scan="true" scanPeriod="60 seconds" debug="false">
<springProperty scope="context" name="logPath" source="logging.path" defaultValue="../../log"/> <springProperty scope="context" name="logPath" source="logging.path" defaultValue="../../log"/>
<property name="logPath" value="../../../log/park"/>
<property name="appName" value="park"/>
<property name="moduleName" value="park"/> <property name="appName" value="park"/>
<property name="moduleName" value="extend"/>
<!-- 文档保留天数 --> <!-- 文档保留天数 -->
<property name="maxHistory" value="10"/> <property name="maxHistory" value="30"/>
<!-- 文档保留总大小 --> <!-- 文档保留总大小 -->
<property name="totalSizeCap" value="10GB"/> <property name="totalSizeCap" value="10GB"/>
<!-- 日志文件大小 -->
<property name="maxFileSize" value="100MB"/>
<property name="CONSOLE_LOG_PATTERN" <property name="CONSOLE_LOG_PATTERN"
value="%cyan(%d)|%highlight(%level)|${moduleName},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}|%yellow(%thread)|%blue(%logger{36}:%line)|%msg%n"/> value="%cyan(%d)|%highlight(%level)|${moduleName},%X{_API_URL},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}|%X{_USER_ID}|%yellow(%thread)|%blue(%logger{36}:%line)|%msg%n"/>
<!--没有颜色--> <!--没有颜色-->
<property name="FILE_LOG_PATTERN" <property name="FILE_LOG_PATTERN"
value="%d|%level|${moduleName},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}|%thread|%logger{36}:%line|%msg%n"/> value="%d|%level|${moduleName},%X{_API_URL},%X{X-B3-TraceId},%X{X-B3-SpanId},%X{X-Span-Export}|%X{_USER_ID}|%thread|%logger{36}:%line|%msg%n"/>
<!--%X{requestId}--> <!--%X{requestId}-->
<!--输出到控制台 ConsoleAppender--> <!--输出到控制台 ConsoleAppender-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout"> <layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${CONSOLE_LOG_PATTERN}</pattern> <pattern>${CONSOLE_LOG_PATTERN}</pattern>
</layout> </layout>
</appender> </appender>
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则 <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则
如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天 如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天
的日志改名为今天的日期。即,<File> 的日志都是当天的。 的日志改名为今天的日期。即,<File> 的日志都是当天的。
--> -->
<File>${logPath}/${appName}-${moduleName}.log</File> <File>${logPath}/${appName}-${moduleName}.log</File>
<!--滚动策略,按照时间滚动 TimeBasedRollingPolicy--> <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间--> <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
<FileNamePattern>${logPath}/${appName}-${moduleName}.log.%d{yyyy-MM-dd}.%i</FileNamePattern> <FileNamePattern>${logPath}/${appName}-${moduleName}.log.%d{yyyy-MM-dd}</FileNamePattern>
<!--只保留最近天数的日志--> <!--只保留最近90天的日志-->
<maxHistory>${maxHistory}</maxHistory> <maxHistory>${maxHistory}</maxHistory>
<!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志--> <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
<totalSizeCap>${totalSizeCap}</totalSizeCap> <totalSizeCap>${totalSizeCap}</totalSizeCap>
<maxFileSize>${maxFileSize}</maxFileSize>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy> </rollingPolicy>
<!--日志输出编码格式化--> <!--日志输出编码格式化-->
<encoder> <encoder>
<charset>UTF-8</charset> <charset>UTF-8</charset>
...@@ -54,13 +47,34 @@ ...@@ -54,13 +47,34 @@
</encoder> </encoder>
</appender> </appender>
<!-- 在程序的开发测试阶段,可以调整level的级别,常用级别优先级为: --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- TRACE < DEBUG < INFO < WARN < ERROR --> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<logger name="org.springframework.boot" level="WARN"/> <discardingThreshold>0</discardingThreshold>
<logger name="com.netflix.discovery.shared.resolver.aws.ConfigClusterResolver" level="WARN"/> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>2048</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="fileInfoLog"/>
</appender>
<springProfile name="dev,local">
<logger name="root" level="INFO" additivity="false">
<appender-ref ref="consoleLog"/>
<appender-ref ref="ASYNC"/>
</logger>
<logger name="com.hikcreate.edl.pub.service.activity.dataaccess.dao.mysql" level="DEBUG"></logger>
</springProfile>
<logger name="root" level="INFO" additivity="false"> <springProfile name="test">
<appender-ref ref="console"/> <logger name="root" level="INFO" additivity="false">
<appender-ref ref="rollingFile"/> <appender-ref ref="consoleLog"/>
</logger> <appender-ref ref="ASYNC"/>
</logger>
<logger name="com.hikcreate.edl.pub.service.activity.dataaccess.dao.mysql" level="DEBUG"></logger>
</springProfile>
<springProfile name="pro,ys">
<logger name="root" level="INFO" additivity="false">
<appender-ref ref="ASYNC"/>
</logger>
</springProfile>
</configuration> </configuration>
\ No newline at end of file
package com.hikcreate.edl.pub.web.mobile.api;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ApiApplicationTests {
@Test
void contextLoads() {
}
}
...@@ -26,6 +26,12 @@ ...@@ -26,6 +26,12 @@
<artifactId>sdk</artifactId> <artifactId>sdk</artifactId>
<version>${parent.version}</version> <version>${parent.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.hikcreate.edl.common</groupId>
<artifactId>distributed-lock-starter</artifactId>
<version>${parent.version}</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -2,10 +2,12 @@ package com.hikcreate.edl.pub.web.mobile.domain; ...@@ -2,10 +2,12 @@ package com.hikcreate.edl.pub.web.mobile.domain;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.hikcreate.common.sdk.response.apiparam.Response; import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo; import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoQueryReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoQueryReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.UnBindReq; import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.UnBindReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BindInfoQueryRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.DrivingLicenseInfoRes; import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.DrivingLicenseInfoRes;
import java.util.List; import java.util.List;
...@@ -17,7 +19,7 @@ import java.util.List; ...@@ -17,7 +19,7 @@ import java.util.List;
* @author: xieshixiang * @author: xieshixiang
* @time:2020/6/18 16:11 * @time:2020/6/18 16:11
**/ **/
public interface IBindService extends IService<BindInfo> { public interface IBindService extends IService<ParkBindInfo> {
/** /**
* 信息绑定接口 * 信息绑定接口
...@@ -27,21 +29,21 @@ public interface IBindService extends IService<BindInfo> { ...@@ -27,21 +29,21 @@ public interface IBindService extends IService<BindInfo> {
* @author: xsx * @author: xsx
* @date: 2020/6/19 10:32 * @date: 2020/6/19 10:32
*/ */
Response bind( BindInfo info); Result bind( ParkBindInfo info);
/** /**
* 信息解绑 * 信息解绑
* @param req * @param req
* @return * @return
*/ */
boolean unbindInfo( UnBindReq req ); Result unbindInfo( UnBindReq req );
/** /**
* 查询用户绑定信息 * 查询用户绑定信息
* @param query * @param query
* @return * @return
*/ */
List<BindInfo> selectByQuery( BindInfoQueryReq query); List<BindInfoQueryRes> selectByQuery(BindInfoQueryReq query);
/** /**
* 年检信息查询接口 * 年检信息查询接口
...@@ -49,14 +51,14 @@ public interface IBindService extends IService<BindInfo> { ...@@ -49,14 +51,14 @@ public interface IBindService extends IService<BindInfo> {
* @param query * @param query
* @return * @return
*/ */
Response yearCheckInfo( H5BindInfoQuery query); Result yearCheckInfo( H5BindInfoQuery query);
/** /**
* 保险信息查询接口 * 保险信息查询接口
* @param query * @param query
* @return * @return
*/ */
Response insuranceInfo( H5BindInfoQuery query); Result insuranceInfo( H5BindInfoQuery query);
/** /**
* 违法信息查询接口 * 违法信息查询接口
...@@ -66,7 +68,7 @@ public interface IBindService extends IService<BindInfo> { ...@@ -66,7 +68,7 @@ public interface IBindService extends IService<BindInfo> {
* @author: xsx * @author: xsx
* @date: 2020/6/19 16:06 * @date: 2020/6/19 16:06
*/ */
Response violationInfo( H5BindInfoQuery query); Result violationInfo( H5BindInfoQuery query);
/** /**
* 驾照信息查询接口 * 驾照信息查询接口
...@@ -76,6 +78,6 @@ public interface IBindService extends IService<BindInfo> { ...@@ -76,6 +78,6 @@ public interface IBindService extends IService<BindInfo> {
* @author: xsx * @author: xsx
* @date: 2020/6/19 16:29 * @date: 2020/6/19 16:29
*/ */
Response<DrivingLicenseInfoRes> drivingLicenseInfo( H5BindInfoQuery query); Result<DrivingLicenseInfoRes> drivingLicenseInfo( H5BindInfoQuery query);
} }
...@@ -57,18 +57,30 @@ ...@@ -57,18 +57,30 @@
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource.version}</version> <version>${dynamic-datasource.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<!--多数据源支持 End--> <!--多数据源支持 End-->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency> </dependency>
<dependency> <!--<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>-->
<dependency> <dependency>
<groupId>javax.validation</groupId> <groupId>javax.validation</groupId>
......
package com.hikcreate.edl.pub.web.mobile.infra.core.Result;
import com.hikcreate.common.sdk.response.statuscode.ServiceCode;
/**
* @Description
* @Author lixian
* @Date 2020/6/24 14:15
**/
public enum ParkServiceCode implements ServiceCode {
PARK_OPEN(2L,"停车对外服务")
;
private long code;
private String name;
private ParkServiceCode(long code, String name) {
this.code = code;
this.name = name;
}
@Override
public long getCode() {
return code;
}
@Override
public String getName() {
return name;
}
}
package com.hikcreate.edl.pub.web.mobile.infra.core.Result;
import com.hikcreate.common.sdk.exception.BusinessException;
import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.common.sdk.response.statuscode.StatusCode;
import lombok.Data;
/**
* 统一的返回结果,作为服务间进行通信的数据协议。<br/>
* code表示状态码,不同服务不同接口会返回不同的状态码<br/>
* msg表示返回的结果信息描述<br/>
* data作为泛型参数类型,在不同接口可以定义不同的类型
*
* @param <T> 数据泛型类型
*/
@Data
public class Result<T> {
/**
* 成功标记
*/
private boolean success = true;
/**
* 状态码
*/
private long code = StatusCode.SUCCESS.getCode();
/**
* 描述
*/
private String msg = StatusCode.SUCCESS.getMsg();
/**
* 挂载数据
*/
private T data;
public Result<T> fallback() {
return fallback(code, msg);
}
public Result<T> fallback(String msg) {
return fallback(code, msg);
}
public Result<T> fallback(long code) {
return fallback(code, msg);
}
/**
* 失败时抛出业务异常
*
* @param code 状态码
* @param msg 描述
* @return 当前对象
*/
public Result<T> fallback(long code, String msg) {
if (!success) {
BusinessException ex = new BusinessException(code, msg);
throw ex;
}
return this;
}
}
package com.hikcreate.edl.pub.web.mobile.infra.core.Result;
import com.hikcreate.common.sdk.response.statuscode.IStatusCode;
import com.hikcreate.common.sdk.response.statuscode.ProductCode;
import com.hikcreate.common.sdk.response.statuscode.StatusCodeHelper;
import com.hikcreate.edl.common.sdk.enums.EdlServiceCode;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author: xieshixiang
* @time:2020/6/24 10:28
**/
@AllArgsConstructor
public enum ResultCode implements IStatusCode {
/*SUCCESS(1000, "操作成功"),
SYSTEM_ERROR(1001, "系统未知错误"),
PERMISSION_DENIED(1002, "没有权限"),
DATA_ERROR(1003, "数据错误"),
REPEAT_SUBMIT(1004, "重复提交"),
PARAM_ERROR(1005, "参数错误"),
BUSINESS_ERROR(1006, "业务错误"),*/
BIND_NUM_ERROR(1, "同一客户绑定认证不超过3辆"),
UNBIND_TOTAL_ERROR(2, "30天内解绑次数超过10次,不能再次绑定认证"),
USERID_PHONE_ERROR(3, "客户ID与手机号不一致"),
CAR_MESSAGE_UNKNOWN(4, "车辆信息不存在"),
CAR_PHONE_UNMATCHED(5, "手机号与车辆备案手机号不一致"),
CAR_HAVE_BIND(6, "车辆已被绑定"),
BIND_INFO_UNKNOWN(7, "绑定认证不存在"),
DRIVING_LICENSE_UNKNOWN(8, "车主驾照信息不存在");
private int customCode;
private String msg;
private StatusCodeHelper statusCodeHelper = new StatusCodeHelper(ProductCode.PARKING, ParkServiceCode.PARK_OPEN);
ResultCode(int customCode, String msg) {
this.customCode = customCode;
this.msg = msg;
}
@Override
public long getCode() {
return statusCodeHelper.getCode(this.customCode);
}
@Override
public String getMsg() {
return this.msg;
}
public static void main( String[] args ) {
for(ResultCode code :ResultCode.values()){
System.out.println(code.getMsg()+"----"+code.getCode());
}
}
}
package com.hikcreate.edl.pub.web.mobile.infra.core.Result;
import com.hikcreate.common.sdk.response.statuscode.IStatusCode;
import com.hikcreate.common.sdk.response.statuscode.StatusCode;
/**
*
*/
public class ResultGenerator {
public static <T> Result<T> success() {
return new Result<>();
}
public static <T> Result<T> success(String msg, T data) {
Result<T> result = new Result<>();
result.setMsg(msg);
result.setData(data);
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setData(data);
return result;
}
public static <T> Result<T> success4Msg(String msg) {
Result<T> result = new Result<>();
result.setMsg(msg);
return result;
}
public static <T> Result<T> fail(String msg) {
Result<T> result = new Result<>();
result.setSuccess(false);
result.setCode(StatusCode.BUSINESS_ERROR.getCode());
result.setMsg(msg);
return result;
}
public static <T> Result<T> fail( IStatusCode statusCode) {
Result<T> result = new Result<>();
result.setSuccess(false);
result.setCode(statusCode.getCode());
result.setMsg(statusCode.getMsg());
return result;
}
public static <T> Result<T> fail(long code, String msg) {
Result<T> result = new Result<>();
result.setSuccess(false);
result.setCode(code);
result.setMsg(msg);
return result;
}
public static <T> Result<T> fail(long code, String msg, T data) {
Result<T> result = new Result<>();
result.setSuccess(false);
result.setCode(code);
result.setMsg(msg);
result.setData(data);
return result;
}
public static <T> Result<T> copy(Result<?> from) {
Result<T> result = new Result<>();
result.setSuccess(from.isSuccess());
result.setCode(from.getCode());
result.setMsg(from.getMsg());
return result;
}
}
package com.hikcreate.edl.pub.web.mobile.infra.core.util;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* 唯一建工具类
*
* @author lixian
* @description
* @date 2020/6/22 16:24
**/
@Component
public class UnqIdUtil {
@Autowired
StringRedisTemplate redisTemplate;
String redisKey = "park:unqid:random";
public static void main( String[] args ) {
long random = 11114432543l;
random = random % 10000000;
System.out.println(StrUtil.fillBefore(String.valueOf(random), '0', 8));
}
/**
* 获取唯一建
* 16(日期)+8(随机数)
*
* @return
*/
public String getUnqId() {
String id = "";
id = id.concat(DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_FORMAT));
long random = redisTemplate.opsForValue().increment(redisKey, 1);
if( random==1 ) {
redisTemplate.expire(redisKey, 60l, TimeUnit.SECONDS);
}
random = random % 10000000;
id = id.concat(StrUtil.fillBefore(String.valueOf(random), '0', 8));
System.out.println("id:"+id);
return id;
}
}
package com.hikcreate.edl.pub.web.mobile.infra.data.cache; package com.hikcreate.edl.pub.web.mobile.infra.data.cache;
import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.hikcreate.common.sdk.response.apiparam.ResponseGenerator;
import com.hikcreate.edl.pub.web.mobile.infra.data.mapper.BindInfoMapper; import com.hikcreate.edl.pub.web.mobile.infra.data.mapper.BindInfoMapper;
import com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo; import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
...@@ -24,45 +23,58 @@ public class BindCache { ...@@ -24,45 +23,58 @@ public class BindCache {
private BindInfoMapper mapper; private BindInfoMapper mapper;
@Caching(evict = {
@CacheEvict(value = "bindinfo", key = "'userId:'+#info.userId", condition = "#info!=null")
})
public boolean insert(ParkBindInfo info) {
return mapper.insert(info) > 0;
}
/** /**
* 获取绑定信息 * 获取绑定信息
*
* @param unqId * @param unqId
* @return * @return
*/ */
@Cacheable( value = "bindinfo", key = "'id:'+#unqId", unless = "#result==null" ) @Cacheable(value = "bindinfo", key = "'id:'+#unqId", unless = "#result==null")
public BindInfo getById( String unqId ) { public ParkBindInfo getById(String unqId) {
LambdaQueryWrapper<BindInfo> queryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<ParkBindInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BindInfo::getUnqId, unqId); queryWrapper.eq(ParkBindInfo::getUnqId, unqId);
queryWrapper.eq(BindInfo::getStatus, 1); queryWrapper.eq(ParkBindInfo::getStatus, 1);
return mapper.selectOne(queryWrapper); return mapper.selectOne(queryWrapper);
} }
/** /**
* 查询用户绑定信息 * 查询用户绑定信息
* @param userId 第三方用户ID *
* @param userId 第三方用户ID
* @return * @return
*/ */
@Cacheable( value = "bindinfo", key = "'userId:'+#userId", unless = "#result==null or #result.size()==0" ) @Cacheable(value = "bindinfo", key = "'userId:'+#userId", unless = "#result==null or #result.size()==0")
public List<BindInfo> selectByQuery( String userId) { public List<ParkBindInfo> selectByQuery(String userId) {
return mapper.selectByQuery(userId); return mapper.selectByQuery(userId);
} }
/** /**
* 解绑 * 解绑
* @param unqId 绑定唯一标识 *
* @param unqId 绑定唯一标识
* @param userId 第三方用户ID * @param userId 第三方用户ID
* @return * @return
*/ */
@Caching(evict = { @Caching(evict = {
@CacheEvict( value = "bindinfo", key = "'id:'+#unqId", condition = "#unqId!=null"), @CacheEvict(value = "bindinfo", key = "'id:'+#unqId", condition = "#unqId!=null"),
@CacheEvict( value = "bindinfo", key = "'userId:'+#userId", condition = "#userId!=null") @CacheEvict(value = "bindinfo", key = "'userId:'+#userId", condition = "#userId!=null")
}) })
public boolean unBind(String unqId, String userId) {
public boolean unBind(String unqId, String userId){ ParkBindInfo bindInfo = new ParkBindInfo();
BindInfo bindInfo = new BindInfo();
bindInfo.setUnqId(unqId); bindInfo.setUnqId(unqId);
bindInfo.setUserId(userId);
bindInfo.setStatus("0"); bindInfo.setStatus("0");
bindInfo.setUnbindTime(DateTime.now().toString()); bindInfo.setUnbindTime(new Date());
return mapper.unbind(bindInfo) > 0 ; return mapper.unbind(bindInfo) > 0;
} }
} }
package com.hikcreate.edl.pub.web.mobile.infra.data.cache; package com.hikcreate.edl.pub.web.mobile.infra.data.cache;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.ViolationFeign; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.ViolationFeign;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.request.ViolationPlateNumAndTypeQueryReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.request.ViolationListByTimeReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.response.ViolationRes; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.response.ViolationMicRes;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -25,9 +25,8 @@ public class ViolationCache { ...@@ -25,9 +25,8 @@ public class ViolationCache {
* @param req 号牌+号牌类型,时间开始-结束 * @param req 号牌+号牌类型,时间开始-结束
* @return * @return
*/ */
@Cacheable(value = "violations", key = "'plateNum:'+#req.plateNum+':plateType:'+req.plateType+':timeStart:'+#req" + // @Cacheable(value = "violations", key = "'plateNum:'+#req.plateNum+':plateType:'+#req.plateType", unless = "#result==null or #result.size()==0")
".timeStart.toString()+':timeEnd:'+#req.timeEnd.toString()", unless = "#result==null or #result.size()==0") public List<ViolationMicRes> getByPlateNumAndType(ViolationListByTimeReq req) {
public List<ViolationRes> getByPlateNumAndType(ViolationPlateNumAndTypeQueryReq req) { return violatio.listByTime(req).getData();
return violatio.getByPlateNumAndType(req);
} }
} }
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.request;
import lombok.Data;
import java.util.Date;
/**
* @author MOUBK
* @create 2019/7/8 11:34
*/
@Data
public class ViolationIdCardQueryReq {
private String idCard;
private Date timeStart;
private Date timeEnd;
}
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.response;
import lombok.Data;
/**
* @author MOUBK
* @create 2019/7/5 15:01
*/
@Data
public class ViolationRes {
// 1代表此字段VIO_VIOLATION中有,2代表此字段VIO_SURVEIL中有
// rowkey
private String id;
// 1 2 违法编号
private String wfbh;
//1 2 决定书类别
private String jdslb;
//1 2 决定书编号
private String jdsbh;
//1 2 文书校验位
private String wsjyw;
//1 #N/A 人员分类
private String ryfl;
//1 #N/A 驾驶证号
private String jszh;
//1 #N/A 档案编号
private String dabh;
//1 2 发证机关
private String fzjg;
//1 #N/A 准驾车型
private String zjcx;
//1 2 当事人
private String dsr;
//1 2 住所行政区划
private String zsxzqh;
//1 2 住所详细地址
private String zsxxdz;
//1 2 电话
private String dh;
//1 2 联系方式
private String lxfs;
//1 2 车辆分类
private String clfl;
//1 2 号牌种类
private String hpzl;
//1 2 号牌号码
private String hphm;
//1 2 机动车所有人
private String jdcsyr;
//1 2 机动车使用性质
private String syxz;
//1 2 交通方式
private String jtfs;
//1 2 违法时间
private String wfsj;
//1 2 行政区划
private String xzqh;
//1 2 道路类型 DMLB = 3124
private String dllx;
//1 2 公路行政等级 DMLB3116
private String glxzdj;
//1 2 违法地点
private String wfdd;
//1 2 路口路段代码 当为城市道路时存放路口号,为高速、省道等时存放公里数
private String lddm;
//1 2 地点米数
private String ddms;
//1 2 地点绝对位置
private String ddjdwz;
//1 2 违法地址
private String wfdz;
//1 2 违法行为
private String wfxw;
//1 #N/A 违法记分数
private String wfjfs;
//1 2 罚款金额
private String fkje;
//1 2 实测值
private String scz;
//1 2 标准值
private String bzz;
//1 #N/A 滞纳金
private String znj;
//1 2 执勤民警
private String zqmj;
//1 2 交款方式
private String jkfs;
//1 #N/A 发现机关
private String fxjg;
//1 #N/A 发现机关名称
private String fxjgmc;
//1 2 处理机关
private String cljg;
//1 2 处理机关名称
private String cljgmc;
//1 #N/A 处罚种类
private String cfzl;
//1 2 处理时间
private String clsj;
//1 2 交款标记
private String jkbj;
//1 2 交款日期
private String jkrq;
//1 2 强制措施凭证号
private String pzbh;
//1 #N/A 拒收拒签标记
private String jsjqbj;
//1 2 记录类型
private String jllx;
//1 2 录入人
private String lrr;
//1 2 录入时间
private String lrsj;
//1 #N/A 经办人1
private String jbr1;
//1 #N/A 经办人2
private String jbr2;
//1 #N/A 事故等级 code61
private String sgdj;
//1 2 处理对象标记 0-本地;1-本省外地市;2-外省
private String cldxbj;
//1 #N/A 机动车处理对象标记
private String jdccldxbj;
//1 2 转递记录标记 0-本地;1-异地转入
private String zdjlbj;
//1 #N/A 信息来源 1-现场处罚,2-非现场处罚
private String xxly;
//1 2 写入模式 1-系统写入;2-接口写入;3-内部其他系统写入
private String xrms;
//1 2 导库标记
private String dkbj;
//1 #N/A 减免滞纳金标记 code64
private String jmznjbj;
//1 2 转递标记
private String zdbj;
//1 2 接受机关
private String jsjg;
//1 2 发送机关
private String fsjg;
//1 2 更新时间
private String gxsj;
//1 2 备注
private String bz;
//1 2 校验位
private String ywjyw;
//1 #N/A 证件名称
private String zjmc;
//1 #N/A 初次领证日期
private String cclzrq;
//1 #N/A 年龄
private String nl;
//1 #N/A 性别 code50
private String xb;
//1 #N/A 0-否;1-是;2-未核查
private String hcbj;
//1 #N/A 精度
private String jd;
//1 #N/A 维度
private String wd;
//1 2 预留字段
private String ylzz1;
//1 2 预留字段
private String ylzz2;
//1 2 预留字段
private String ylzz3;
//1 2 预留字段
private String ylzz4;
//1 2 预留字段
private String ylzz5;
//1 2 存放支队工作库接受时间
private String ylzz6;
//1 2 预留字段
private String ylzz7;
//1 2 预留字段
private String ylzz8;
//1 2 noKey
private String cjfs;
//1 #N/A noKey
private String wfsj1;
//1 #N/A noKey
private String wfdd1;
//1 #N/A noKey
private String lddm1;
//1 #N/A noKey
private String ddms1;
//1 #N/A 驾驶人性质
private String jsrxz;
//1 2 车辆用途
private String clyt;
//1 2 是否提供校车服务
private String xcfw;
//1 2 电子坐标
private String dzzb;
//1 #N/A 是否指导人员
private String sfzdry;
//1 #N/A 学员身份证明号码
private String xysfzmhm;
//1 #N/A 学员姓名
private String xyxm;
//1 2 ylzz11
private String ylzz11;
//1 2 ylzz12
private String ylzz12;
//1 2 ylzz13
private String ylzz13;
//1 2 ylzz14
private String ylzz14;
//1 2 ylzz15
private String ylzz15;
//1 2 ylzz16
private String ylzz16;
//1 2 ylzz17
private String ylzz17;
//1 2 ylzz18
private String ylzz18;
//#N/A 2 序号
private String xh;
//#N/A 2 违法采集机关
private String cjjg;
//#N/A 2 采集机关名称
private String cjjgmc;
//#N/A 2 发动机号
private String fdjh;
//#N/A 2 车辆识别代号
private String clsbdh;
//#N/A 2 车身颜色
private String csys;
//#N/A 2 车辆品牌
private String clpp;
//#N/A 2 通知书号
private String tzsh;
//#N/A 2 通知标记:0未通知,1已通知,2无需通知
private String tzbj;
//#N/A 2 通知日期
private String tzrq;
//#N/A 2 处理标记
private String clbj;
//#N/A 2 强制措施处理标记: 0,简易处罚;1,一般处罚完毕;2,转入一般处罚但尚未完毕)
private String qzclbj;
//#N/A 2 经办人
private String jbr;
//#N/A 2 异地处理标记:0未异地处理,1本地处理本省外地市记录,2本地处理外省记录,3本省外地市处理本地记录,4发现地处理记录
private String ydclbj;
// #N/A 2 视频地址
private String spdz;
// #N/A 2 设备编号
private String sbbh;
// 图片
private String fastDfsUrl1;
private String fastDfsUrl2;
private String fastDfsUrl3;
private String fastDfsUrl4;
private String fastDfsUrl5;
private String fastDfsUrl6;
}
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms; package com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms;
import com.hikcreate.common.sdk.response.apiparam.Response; import com.hikcreate.edl.pub.web.mobile.infra.core.Result.Result;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.CheckVerifyCodeMicReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.CheckVerifyCodeMicReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendMicReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendMicReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendVerifyCodeMicReq; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.edl_pub_service_sms.param.request.SendVerifyCodeMicReq;
...@@ -11,15 +11,15 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -11,15 +11,15 @@ import org.springframework.web.bind.annotation.RequestBody;
/** /**
* 短信feign * 短信feign
*/ */
@FeignClient( name = "edl-pvt-service-common",path = "sms" ) @FeignClient( name = "edl-pvt-service-common", path = "sms" )
public interface SmsFeign { public interface SmsFeign {
@PostMapping( {"send"} ) @PostMapping( {"send"} )
Response<Void> send( @RequestBody SendMicReq req ); Result<Void> send( @RequestBody SendMicReq req );
@PostMapping( {"verifyCode/send"} ) @PostMapping( {"verifyCode/send"} )
Response<Void> sendVerifyCode( @RequestBody SendVerifyCodeMicReq req ); Result<Void> sendVerifyCode( @RequestBody SendVerifyCodeMicReq req );
@PostMapping( {"verifyCode/check"} ) @PostMapping( {"verifyCode/check"} )
Response<Void> checkVerifyCode( @RequestBody CheckVerifyCodeMicReq req ); Result<Void> checkVerifyCode( @RequestBody CheckVerifyCodeMicReq req );
} }
\ No newline at end of file
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle; package com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.request.ViolationPlateNumAndTypeQueryReq; import com.hikcreate.common.sdk.response.apiparam.Response;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.response.ViolationRes; import com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.request.ViolationListByTimeReq;
import com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.response.ViolationMicRes;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
...@@ -14,8 +16,8 @@ import java.util.List; ...@@ -14,8 +16,8 @@ import java.util.List;
* @author: xieshixiang * @author: xieshixiang
* @time:2020/6/19 15:26 * @time:2020/6/19 15:26
**/ **/
@FeignClient(name = "dcp-service-vehicle", path = "violation", contextId = "dcp" + @FeignClient(url = "http://10.197.236.198:8116", name = "edl-pvt-service-traffic", path = "violation", contextId =
"-service-vehicle-violation") "dcp-pvt-service-traffic")
public interface ViolationFeign { public interface ViolationFeign {
/** /**
* 查询违法数据 * 查询违法数据
...@@ -23,8 +25,8 @@ public interface ViolationFeign { ...@@ -23,8 +25,8 @@ public interface ViolationFeign {
* @param req 号牌+号牌类型,时间开始-结束 * @param req 号牌+号牌类型,时间开始-结束
* @return * @return
*/ */
@PostMapping("/getByPlateNumAndType") @PostMapping("listByTime")
List<ViolationRes> getByPlateNumAndType(@RequestBody ViolationPlateNumAndTypeQueryReq req); Response<List<ViolationMicRes>> listByTime(@Validated @RequestBody ViolationListByTimeReq req);
} }
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.dcp_service_vehicle.param.request; package com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.request;
import lombok.Data; import lombok.Data;
...@@ -10,11 +10,23 @@ import java.util.Date; ...@@ -10,11 +10,23 @@ import java.util.Date;
* @create 2019/7/8 11:38 * @create 2019/7/8 11:38
*/ */
@Data @Data
public class ViolationPlateNumAndTypeQueryReq { public class ViolationListByTimeReq {
/**
* 车牌号
*/
private String plateNum; private String plateNum;
/**
* 车牌类型
*/
private String plateType; private String plateType;
/**
* 开始时间
*/
private Date timeStart; private Date timeStart;
/**
* 结束时间
*/
private Date timeEnd; private Date timeEnd;
} }
package com.hikcreate.edl.pub.web.mobile.infra.data.feign.pvt_service_traffic.parm.response;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* @author MOUBK
* @create 2019/7/5 15:01
*/
@Data
public class ViolationMicRes {
// 违法主键ID
private String id;
// 违法地址
private String address;
// 违法日期
private String date;
// 违法编号
private String vioNum;
// 违法行为类型
private String vioType;
// 号牌类型
private String plateType;
// 号牌号码
private String plateNum;
// 违法行为类型(枚举值)
private String vioTypeName;
// 违法行为
private String vioAct;
// 违法行为描述
private String vioActDesc;
// 违法扣分数
private Integer score;
// 违法罚款金额
private BigDecimal forfeit;
// 处理状态
private String status;
// 处理状态(已转枚举)
private String statusName;
// 采集单位
private String collectionDepartment;
// 违法图片
private String vioImage;
// 违法图片
private List<String> vioImages;
// 处理时间
private String handleTime;
// 扣分时间
private Date deductionTime;
// 处理机关
private String handleDepartment;
}
package com.hikcreate.edl.pub.web.mobile.infra.data.mapper; package com.hikcreate.edl.pub.web.mobile.infra.data.mapper;
import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hikcreate.edl.pub.web.mobile.infra.core.page.PageResult; import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo;
import com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo; import com.hikcreate.edl.pub.web.mobile.infra.model.param.response.BindInfoQueryRes;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.BindInfoQueryReq;
import com.hikcreate.edl.pub.web.mobile.infra.model.param.request.H5BindInfoQuery;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.Date; import java.util.Date;
...@@ -17,14 +14,12 @@ import java.util.List; ...@@ -17,14 +14,12 @@ import java.util.List;
* @author: xieshixiang * @author: xieshixiang
* @time:2020/6/18 15:56 * @time:2020/6/18 15:56
**/ **/
public interface BindInfoMapper extends BaseMapper<BindInfo> { public interface BindInfoMapper extends BaseMapper<ParkBindInfo> {
List<BindInfo> selectByQuery( String userId); List<ParkBindInfo> selectByQuery(String userId);
Integer bindInfoInsert(BindInfo info); Integer bindInfoInsert( ParkBindInfo info);
Integer clearPast(@Param("dateTime") Date dateTime); Integer unbind(ParkBindInfo info);
Integer unbind(BindInfo info);
} }
...@@ -2,7 +2,7 @@ package com.hikcreate.edl.pub.web.mobile.infra.data.mapper; ...@@ -2,7 +2,7 @@ package com.hikcreate.edl.pub.web.mobile.infra.data.mapper;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hikcreate.edl.pub.web.mobile.infra.model.VerifyInfo; import com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkVerifyInfo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**
...@@ -11,8 +11,8 @@ import org.apache.ibatis.annotations.Param; ...@@ -11,8 +11,8 @@ import org.apache.ibatis.annotations.Param;
* @author: xieshixiang * @author: xieshixiang
* @time:2020/6/19 18:34 * @time:2020/6/19 18:34
**/ **/
public interface VerifyInfoMapper extends BaseMapper<VerifyInfo> { public interface VerifyInfoMapper extends BaseMapper<ParkVerifyInfo> {
VerifyInfo checkValidity(@Param("phone") String phone,@Param("userId") String userId,@Param("time") DateTime last); ParkVerifyInfo checkValidity( @Param("phone") String phone, @Param("userId") String userId, @Param("time") DateTime last);
} }
package com.hikcreate.edl.pub.web.mobile.infra.model; package com.hikcreate.edl.pub.web.mobile.infra.model.entity;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* 绑定信息实体类 * 绑定信息实体类
...@@ -12,7 +13,7 @@ import java.io.Serializable; ...@@ -12,7 +13,7 @@ import java.io.Serializable;
* @date: 2020/6/19 9:50 * @date: 2020/6/19 9:50
*/ */
@Data @Data
public class BindInfo implements Serializable { public class ParkBindInfo implements Serializable {
/** /**
* 绑定信息唯一标识,使用UUID * 绑定信息唯一标识,使用UUID
...@@ -47,11 +48,11 @@ public class BindInfo implements Serializable { ...@@ -47,11 +48,11 @@ public class BindInfo implements Serializable {
/** /**
* 绑定时间 * 绑定时间
*/ */
private String gmtBindTime; private Date gmtBindTime;
/** /**
* 解绑时间 * 解绑时间
*/ */
private String unbindTime; private Date unbindTime;
} }
package com.hikcreate.edl.pub.web.mobile.infra.model; package com.hikcreate.edl.pub.web.mobile.infra.model.entity;
import cn.hutool.core.date.DateTime;
import lombok.Data; import lombok.Data;
import java.util.Date;
/** /**
* 短信验证通过记录 * 短信验证通过记录
* *
...@@ -9,28 +11,28 @@ import lombok.Data; ...@@ -9,28 +11,28 @@ import lombok.Data;
* @date: 2020/6/19 18:33 * @date: 2020/6/19 18:33
*/ */
@Data @Data
public class VerifyInfo { public class ParkVerifyInfo {
/** /**
* 记录唯一id * 记录唯一id
*/ */
private int id; private int id;
/** /**
* 用户id * 用户id
*/ */
private String userId; private String userId;
/** /**
* 验证码 * 验证码
*/ */
private String verifyCode; private String verifyCode;
/** /**
* 电话号码 * 电话号码
*/ */
private String phone; private String phone;
/** /**
* 上次通过验证的时间 * 上次通过验证的时间
*/ */
private String passTime; private Date passTime;
} }
...@@ -21,5 +21,5 @@ public class BindInfoQueryReq { ...@@ -21,5 +21,5 @@ public class BindInfoQueryReq {
* 时间戳 * 时间戳
*/ */
@NotNull(message = "时间戳不能为空") @NotNull(message = "时间戳不能为空")
private long timestamp; private Long timestamp;
} }
package com.hikcreate.edl.pub.web.mobile.infra.model.param.request;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
/**
* @author lixian
* @description
* @date 2020/6/22 14:12
**/
@Data
public class BindInfoReq {
/**
* 客户id
*/
@NotBlank(message = "客户唯一编码不能为空")
private String userId;
/**
* 客户电话号码
*/
@NotBlank(message = "客户手机号不能为空")
private String phone;
/**
* 车牌颜色:A:白,B:灰,C:黄,D:粉,E:红,
* F:紫,G:绿,H:蓝,I:棕,J:黑',
*/
@NotBlank(message = "车牌颜色不能为空")
@Pattern(regexp = "[ABCDEFGHIJ]", message = "车牌颜色不正确")
private String plateColor;
/**
* 车牌号
*/
@NotBlank(message = "车牌号不能为空")
private String plateNum;
/**
* 时间戳
*/
@NotNull(message = "时间戳不能为空")
private Long timestamp;
}
...@@ -27,5 +27,5 @@ public class UnBindReq { ...@@ -27,5 +27,5 @@ public class UnBindReq {
* 时间戳 * 时间戳
*/ */
@NotNull(message = "时间戳不能为空") @NotNull(message = "时间戳不能为空")
private long timestamp; private Long timestamp;
} }
...@@ -2,6 +2,8 @@ package com.hikcreate.edl.pub.web.mobile.infra.model.param.response; ...@@ -2,6 +2,8 @@ package com.hikcreate.edl.pub.web.mobile.infra.model.param.response;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
/** /**
* 公共加密返回消息类 * 公共加密返回消息类
* @author lixian * @author lixian
...@@ -9,7 +11,7 @@ import lombok.Data; ...@@ -9,7 +11,7 @@ import lombok.Data;
* @date 2020/6/19 10:44 * @date 2020/6/19 10:44
**/ **/
@Data @Data
public class BaseEncryptRes { public class BaseEncryptRes implements Serializable {
/** /**
* 加密字段 * 加密字段
*/ */
......
package com.hikcreate.edl.pub.web.mobile.infra.model.param.response;
import lombok.Data;
import java.io.Serializable;
/**
* 绑定信息查询接口返回结果封装
*
* @author: xieshixiang
* @time:2020/6/22 19:52
**/
@Data
public class BindInfoQueryRes implements Serializable {
/**
* 绑定信息唯一标识,使用UUID
*/
private String unqId;
/**
* 车牌颜色:A:白,B:灰,C:黄,D:粉,E:红,
* F:紫,G:绿,H:蓝,I:棕,J:黑',
*/
private String plateColor;
/**
* 车牌号
*/
private String plateNum;
/**
* 绑定时间
*/
private Long gmtBindTime;
}
package com.hikcreate.edl.pub.web.mobile.infra.model.param.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 绑定操作返回结果封装
* @author: xieshixiang
* @time:2020/6/22 17:04
**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BindInfoRes {
/**
* 唯一键
*/
private String unqId;
}
...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; ...@@ -4,6 +4,7 @@ import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
...@@ -15,7 +16,7 @@ import java.util.List; ...@@ -15,7 +16,7 @@ import java.util.List;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class ResultList<T> { public class ResultList<T> implements Serializable {
List<T> list; List<T> list;
......
...@@ -2,47 +2,26 @@ ...@@ -2,47 +2,26 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hikcreate.edl.pub.web.mobile.infra.data.mapper.BindInfoMapper"> <mapper namespace="com.hikcreate.edl.pub.web.mobile.infra.data.mapper.BindInfoMapper">
<insert id="bindInfoInsert" parameterType="com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo"> <insert id="bindInfoInsert" parameterType="com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo">
insert ignore into edl_public.bind_info(unq_id,user_id,phone,plate_color,plate_num,plate_type,gmt_bind_time) insert ignore into park_bind_info(unq_id,user_id,phone,plate_color,plate_num,plate_type,gmt_bind_time)
values (#{unqId},#{userId},#{phone},#{plateColor},#{plateNum},#{plateType},#{gmtBindTime}) values (#{unqId},#{userId},#{phone},#{plateColor},#{plateNum},#{plateType},#{gmtBindTime})
</insert> </insert>
<select id="selectByQuery" parameterType="java.lang.String" <select id="selectByQuery" parameterType="java.lang.String"
resultType="com.hikcreate.edl.pub.web.mobile.infra.model.BindInfo"> resultType="com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkBindInfo">
select b.unq_id, b.user_id, b.phone, select b.unq_id,b.plate_color,b.plate_num,b.gmt_bind_time
case plate_color from park_bind_info as b
when 'A' then '白'
when 'B' then '灰'
when 'C' then '黄'
when 'D' then '粉'
when 'E' then '红'
when 'F' then '紫'
when 'G' then '绿'
when 'H' then '蓝'
when 'I' then '棕'
when 'J' then '黑'
end plateColor,
case status
when '0' then '未绑定'
when '1' then '已绑定'
end status,
b.plate_num,b.plate_type,b.gmt_bind_time
from edl_public.bind_info as b
where b.status='1' where b.status='1'
<if test="userId!=null and nuserId!=''"> <if test="userId!=null and userId!=''">
and b.user_id=#{userId} and b.user_id=#{userId}
</if> </if>
</select> </select>
<update id="unbind"> <update id="unbind">
update edl_public.bind_info as b set b.status="0",b.unbind_time=#{unbindTime} where b.unq_id=#{unqId} update park_bind_info as b set b.status='0',b.unbind_time=#{unbindTime} where b.unq_id=#{unqId} and b.user_id=#{userId} and b.status='1'
</update> </update>
<delete id="clearPast" parameterType="java.util.Date">
delete from edl_public.bind_info as b where b.unbind_time <![CDATA[<=]]> #{dateTime} and b.status='0'
</delete>
</mapper> </mapper>
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
<mapper namespace="com.hikcreate.edl.pub.web.mobile.infra.data.mapper.VerifyInfoMapper"> <mapper namespace="com.hikcreate.edl.pub.web.mobile.infra.data.mapper.VerifyInfoMapper">
<select id="checkValidity" resultType="com.hikcreate.edl.pub.web.mobile.infra.model.VerifyInfo"> <select id="checkValidity" resultType="com.hikcreate.edl.pub.web.mobile.infra.model.entity.ParkVerifyInfo">
select id, user_id, verify_code, phone,pass_time from edl_public.verify_info as v select id, user_id, verify_code, phone,pass_time from park_verify_info as v
where pass_time <![CDATA[ >= ]]> #{time} and phone=#{phone} and user_id=#{userId} where pass_time <![CDATA[ >= ]]> #{time} and phone=#{phone} and user_id=#{userId} limit 1;
</select> </select>
</mapper> </mapper>
-- auto-generated definition
-- auto-generated definition
create table verify_info
(
id bigint auto_increment
primary key,
user_id varchar(36) null comment '用户id',
verify_code varchar(50) null comment '短信验证码',
phone varchar(11) null comment '电话号码',
pass_time datetime null comment '验证通过时间'
)
comment '短信验证通过记录';
-- auto-generated definition
-- auto-generated definition
create table bind_info
(
unq_id varchar(36) not null comment '用户车辆绑定记录唯一编号'
primary key,
user_id varchar(128) not null comment '客户唯一编号',
phone varchar(11) not null comment '客户手机号',
plate_color varchar(2) null comment '车牌颜色:A:白,B:灰,C:黄,D:粉,E:红,F:紫,G:绿,H:蓝,I:棕,J:黑',
plate_num varchar(20) not null comment '车主车牌号',
plate_type varchar(20) not null comment '车牌类型',
status varchar(10) default '1' null comment '绑定状态:0,未绑定,1,已绑定',
gmt_bind_time datetime null comment '绑定时间',
unbind_time datetime null comment '解绑时间',
constraint bind_info_pk
unique (user_id, unbind_time)
)
comment '用户车辆绑定信息';
...@@ -92,11 +92,61 @@ ...@@ -92,11 +92,61 @@
<build> <build>
<plugins> <plugins>
<plugin> <!--<plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>maven-central</name>
<url>http://maven.hikcreate.com/repository/maven-central</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<repositories>
<repository>
<id>nexus</id>
<name>maven-public</name>
<url>http://maven.hikcreate.com/repository/maven-public</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<distributionManagement>
<repository>
<id>nexus</id>
<name>maven-releases</name>
<url>http://maven.hikcreate.com/repository/maven-releases</url>
</repository>
<snapshotRepository>
<id>nexus</id>
<name>maven-snapshots</name>
<url>http://maven.hikcreate.com/repository/maven-snapshots</url>
</snapshotRepository>
</distributionManagement>
</project> </project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment