diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java index 004ae889..2c372bfd 100644 --- a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java +++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/controller/BaseApiController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.google.common.collect.Lists; import com.xueyi.common.core.web.vo.DeviceTenantSourceMergeVo; import com.xueyi.common.web.constant.ResponseCode; +import com.xueyi.common.web.entity.domain.BaseReq; import com.xueyi.common.web.response.MyResponse; import com.xueyi.system.api.device.feign.RemoteDeviceTenantMergeService; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +22,43 @@ public class BaseApiController { private MyResponse message = null; + public MyResponse checkSign(Object t, String sign, String ts){ + System.err.println("----------header check start----------"); + if (ts == null || ts.isEmpty()) { + return output(400, "ts is null"); + } + if (sign == null || sign.isEmpty()) { + return new MyResponse(400, "sign is null"); + } + ts.replace(".", ""); + Long tsVal = Long.parseLong(ts); + if (ts.length() == 10) { + // 将10位时间戳转为13位 + tsVal *= 1000; + } + Long currentTs = System.currentTimeMillis(); + + if (currentTs - tsVal > 1000 * 60 || tsVal - currentTs > 1000 * 60){//时间误差正负1分钟内为合法 + return new MyResponse(400, "请求时间戳ts非法"); + } + System.err.println("----------header check complete----------"); + BaseReq req = null; + String signStr = ""; + if (t instanceof BaseReq) { + req = (BaseReq) t; + signStr = req.getSign(ts); + } + System.err.println(signStr); + System.err.println(sign); + System.err.println("----------sign check end----------"); + + if (!sign.equals(signStr)) { + return output(ResponseCode.AUTH_NOT_PASS); + } + return new MyResponse(200); + } + + public DeviceTenantSourceMergeVo getDeviceTenantSourceMergeVo(String devId){ return remoteDeviceTenantMergeService.selectDeviceTenantSourceMerge(devId); } diff --git a/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/domain/BaseReq.java b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/domain/BaseReq.java new file mode 100644 index 00000000..ffa7e9fa --- /dev/null +++ b/xueyi-common/xueyi-common-web/src/main/java/com/xueyi/common/web/entity/domain/BaseReq.java @@ -0,0 +1,45 @@ +package com.xueyi.common.web.entity.domain; + +import lombok.Data; +import org.springframework.util.DigestUtils; + +import java.lang.reflect.Field; +import java.util.Arrays; + +/** + * @author yk + * @description + * @date 2023-12-06 11:45 + */ +@Data +public class BaseReq { + + public String getSign(String ts){ + Field[] fields = this.getClass().getDeclaredFields(); + StringBuilder sb = new StringBuilder(); + //fields按name字典排序 + Arrays.sort(fields, (o1, o2) -> o1.getName().compareTo(o2.getName())); + for (Field field : fields) { + //设置允许通过反射访问私有变量 + field.setAccessible(true); + //获取字段属性名称 + String name = field.getName(); + //获取字段的值 + String value = null; + try { + value = field.get(this).toString(); + sb.append(value); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + //其他自定义操作 + System.out.println("字段的属性名称:"+name); + System.out.println("字段的值:"+value); + } + String parmas = sb.toString()+ts; + System.err.println("加密前的参数:"+parmas); + //返回md5加密后的值 + return DigestUtils.md5DigestAsHex(parmas.getBytes()); + } + +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/FlightsQueryReq.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/FlightsQueryReq.java new file mode 100644 index 00000000..60b927e7 --- /dev/null +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/FlightsQueryReq.java @@ -0,0 +1,42 @@ +package com.xueyi.system.interfaces.airport.bean; + +import com.xueyi.common.web.entity.domain.BaseReq; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * @author yk + * @description + * @date 2023-12-06 11:45 + */ +@Data +public class FlightsQueryReq extends BaseReq { + + @NotNull(message = "Valid校验:出发城市startCity不能为空!") + private String startCity; + + @NotNull(message = "Valid校验:抵达城市endCity不能为空!") + private String endCity; + + @NotNull(message = "Valid校验:时间startDate不能为空!") + private String date; + + + + + @Override + public String toString() { + return "PlaneQueryReq{" + + "START_CITY='" + startCity + '\'' + + ", END_CITY='" + endCity + '\'' + + ", START_DATE='" + date + '\'' + + '}'; + } + + public String toQueryString() { + return "START_CITY=" + startCity + + "&END_CITY=" + endCity + + "&START_DATE=" + date; + } +} diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java index 3817f7f7..aec1e115 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/bean/PlaneQueryReq.java @@ -1,5 +1,6 @@ package com.xueyi.system.interfaces.airport.bean; +import com.xueyi.common.web.entity.domain.BaseReq; import lombok.Data; import javax.validation.constraints.NotNull; @@ -10,7 +11,7 @@ import javax.validation.constraints.NotNull; * @date 2023-12-06 11:45 */ @Data -public class PlaneQueryReq { +public class PlaneQueryReq extends BaseReq { @NotNull(message = "Valid校验:航班号fNum不能为空!") private String fNum; diff --git a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java index 57c29495..faad4afb 100644 --- a/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java +++ b/xueyi-modules/xueyi-system/src/main/java/com/xueyi/system/interfaces/airport/controller/PlaneController.java @@ -2,9 +2,9 @@ package com.xueyi.system.interfaces.airport.controller; import com.alibaba.fastjson2.JSONObject; import com.xueyi.common.redis.utils.RedisUtil; -import com.xueyi.common.web.constant.ResponseCode; import com.xueyi.common.web.controller.BaseApiController; import com.xueyi.common.web.response.MyResponse; +import com.xueyi.system.interfaces.airport.bean.FlightsQueryReq; import com.xueyi.system.interfaces.airport.bean.PlaneQueryReq; import okhttp3.MediaType; import okhttp3.OkHttpClient; @@ -13,7 +13,6 @@ import okhttp3.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; -import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -32,42 +31,25 @@ import java.io.IOException; public class PlaneController extends BaseApiController { private final Logger logger = LoggerFactory.getLogger(PlaneController.class); - @Value("${notification.airport.flight.key}") + @Value("${notification.airport.flight.juhe.key}") private String key; + @Value("${notification.airport.flight.juhe.url}") + private String juHeUrl; + + @Value("${notification.airport.flight.icredit.app-code}") + private String icreditCode; + + @Value("${notification.airport.flight.icredit.url}") + private String icreditUrl; + @RequestMapping("/query-flight") public JSONObject query (@Valid @RequestBody PlaneQueryReq req, HttpServletRequest httpServletRequest) { String sign = httpServletRequest.getHeader("sign"); String ts = httpServletRequest.getHeader("ts"); - System.err.println("----------sign check start----------"); - if (ts == null || ts.isEmpty()) { - return output(400, "ts is null").toJSON(); - } - if (sign == null || sign.isEmpty()) { - return new MyResponse(400, "sign is null").toJSON(); - } - ts.replace(".", ""); - Long tsVal = Long.parseLong(ts); - if (ts.length() == 10) { - // 将10位时间戳转为13位 - tsVal *= 1000; - } - Long currentTs = System.currentTimeMillis(); - System.err.println(currentTs); - System.err.println(tsVal); - - if (currentTs - tsVal > 1000 * 60 || tsVal - currentTs > 1000 * 60){//时间误差正负1分钟内为合法 - return new MyResponse(400, "请求时间戳ts非法").toJSON(); - } - String singStr = req.getDate() + req.getFNum() + ts; - System.err.println(singStr); - String signStr = DigestUtils.md5DigestAsHex(singStr.getBytes()); - System.err.println(signStr); - System.err.println(sign); - System.err.println("----------sign check end----------"); - - if (!sign.equals(signStr)) { - return output(ResponseCode.AUTH_NOT_PASS).toJSON(); + MyResponse resp = super.checkSign(req, sign, ts); + if (resp.getStatus() != 200) { + return resp.toJSON(); } logger.info("查询航班信息:{}", req); @@ -83,7 +65,7 @@ public class PlaneController extends BaseApiController { logger.info("请求参数:{}", "key="+key+"&"+req.toQueryString()); okhttp3.RequestBody body = okhttp3.RequestBody.Companion.create("key="+key+"&"+req.toQueryString(), mediaType); Request request = new Request.Builder() - .url("http://v.juhe.cn/flight_dynamic/query") + .url(juHeUrl) .method("POST", body) .addHeader("Content-Type", "application/x-www-form-urlencoded") .build(); @@ -100,8 +82,48 @@ public class PlaneController extends BaseApiController { } catch (IOException e) { throw new RuntimeException(e); } + return new JSONObject(); + } + + @RequestMapping("/flight-list") + public JSONObject flightList (@Valid @RequestBody FlightsQueryReq req, HttpServletRequest httpServletRequest) { + String sign = httpServletRequest.getHeader("sign"); + String ts = httpServletRequest.getHeader("ts"); + MyResponse resp = super.checkSign(req, sign, ts); + if (resp.getStatus() != 200) { + return resp.toJSON(); + } + + logger.info("查询航班列表信息:{}", req); + String dateStr = req.getStartDate().replaceAll("-",""); + String redisKey = "dgman:airport:flight:"+req.getEndCity()+":" + dateStr; + if (RedisUtil.existed(redisKey)){ + return JSONObject.parseObject(RedisUtil.getVal(redisKey).toString()); + } + req.setStartDate(req.getStartDate().replaceAll("-","")); + OkHttpClient client = new OkHttpClient().newBuilder() + .build(); + Request request = new Request.Builder() + .url(icreditUrl+"?"+req.toQueryString()) + .get() + .addHeader("Authorization", "APPCODE "+icreditCode) + .addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8") + .build(); + try { + Response response = client.newCall(request).execute(); + if (response.isSuccessful()) { + String result = response.body().string(); + logger.info("查询航班列表结果:{}", result); + RedisUtil.setVal(redisKey,result,60*60*24); + + return JSONObject.parseObject(result); + } + + } catch (IOException e) { + throw new RuntimeException(e); + } return new JSONObject(); }