From 16105a418ca343f5c51e2e0067d9067c8ddd49de Mon Sep 17 00:00:00 2001 From: liuao <1150003126@qq.com> Date: Thu, 8 May 2025 09:24:26 +0800 Subject: [PATCH] =?UTF-8?q?2025=E5=B9=B45=E6=9C=888=E6=97=A509:24:10=201.?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/framework/config/SecurityConfig.java | 2 +- .../module/vehicle/constant/Constant.java | 26 ++ .../vehicle/controller/VehicleController.java | 50 ++++ .../boot/module/vehicle/dto/pr/DevicePR.java | 27 ++ .../boot/module/vehicle/enums/Method.java | 30 +++ .../boot/module/vehicle/enums/TabType.java | 33 +++ .../vehicle/properties/TourRunProperties.java | 36 +++ .../vehicle/service/TourRunService.java | 21 ++ .../service/impl/TourRunServiceImpl.java | 246 ++++++++++++++++++ .../boot/module/vehicle/util/SignUtils.java | 103 ++++++++ .../boot/module/vehicle/util/StringUtil.java | 135 ++++++++++ .../module/vehicle/util/http/HttpUtils.java | 96 +++++++ src/main/resources/application.yml | 8 + 13 files changed, 812 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/zilber/boot/module/vehicle/constant/Constant.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/controller/VehicleController.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/dto/pr/DevicePR.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/enums/Method.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/enums/TabType.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/properties/TourRunProperties.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/service/TourRunService.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/service/impl/TourRunServiceImpl.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/util/SignUtils.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/util/StringUtil.java create mode 100644 src/main/java/com/zilber/boot/module/vehicle/util/http/HttpUtils.java diff --git a/src/main/java/com/zilber/boot/framework/config/SecurityConfig.java b/src/main/java/com/zilber/boot/framework/config/SecurityConfig.java index 38e427f..19d07ee 100644 --- a/src/main/java/com/zilber/boot/framework/config/SecurityConfig.java +++ b/src/main/java/com/zilber/boot/framework/config/SecurityConfig.java @@ -111,7 +111,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter // 对于登录login 注册register 验证码captchaImage 允许匿名访问 .antMatchers("/login", "/register", "/captchaImage").anonymous() // 静态资源,可匿名访问 - .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js","/**/*.jpg","/**/*.png","/zilbervue/admin/", "/profile/**").permitAll() + .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js","/**/*.jpg","/**/*.png","/zilbervue/admin/", "/profile/**", "/vehicle/**").permitAll() .antMatchers("/file/**","/bpmn/**","/swagger-ui.html","/swagger-ui", "/v3","/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() diff --git a/src/main/java/com/zilber/boot/module/vehicle/constant/Constant.java b/src/main/java/com/zilber/boot/module/vehicle/constant/Constant.java new file mode 100644 index 0000000..6d5f14e --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/constant/Constant.java @@ -0,0 +1,26 @@ +package com.zilber.boot.module.vehicle.constant; + +/** + * @Author LJX + * @TIME 2025-05-06 13:38 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +public class Constant { + + public final static String KEY = "TourRunToken"; + + public final static Long TIMEOUT = 120L; + + public final static String MD5 = "md5"; + + public final static String CODE = "code"; + + public final static String message = "message"; + + public final static String RESULT = "result"; + + public final static String SUCCESS_CODE = "0"; + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/controller/VehicleController.java b/src/main/java/com/zilber/boot/module/vehicle/controller/VehicleController.java new file mode 100644 index 0000000..2b8ac8a --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/controller/VehicleController.java @@ -0,0 +1,50 @@ +package com.zilber.boot.module.vehicle.controller; + +import com.zilber.boot.module.vehicle.dto.pr.DevicePR; +import com.zilber.boot.module.vehicle.service.TourRunService; +import com.zilber.boot.utils.AjaxResult; +import com.zilber.boot.utils.page.PageUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Author LJX + * @TIME 2025-05-06 11:57 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +@RestController +@Api(tags = "车辆机械设备管理") +@RequestMapping("/vehicle") +public class VehicleController { + + @Autowired + private TourRunService service; + + @GetMapping("/list") + @ApiOperation("设备列表") + public AjaxResult list(DevicePR pr) { + return AjaxResult.success(service.list(pr)); + } + + @GetMapping("/h5") + @ApiOperation("h5") + public AjaxResult h5( + @RequestParam(required = true) String tabType, + @RequestParam(required = true) String imei) { + return AjaxResult.success(service.h5(tabType, imei)); + } + + @GetMapping("/token") + @ApiOperation("获取途强token") + public AjaxResult token(){ + return AjaxResult.success(service.token()); + } + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/dto/pr/DevicePR.java b/src/main/java/com/zilber/boot/module/vehicle/dto/pr/DevicePR.java new file mode 100644 index 0000000..63813fd --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/dto/pr/DevicePR.java @@ -0,0 +1,27 @@ +package com.zilber.boot.module.vehicle.dto.pr; + +import com.zilber.boot.utils.page.Pageable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author LJX + * @TIME 2025-05-06 11:52 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +@Data +@NoArgsConstructor +@AllArgsConstructor +@ApiModel("设备管理分页请求") +public class DevicePR + extends Pageable { + + @ApiModelProperty("使用范围") + private String scope; + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/enums/Method.java b/src/main/java/com/zilber/boot/module/vehicle/enums/Method.java new file mode 100644 index 0000000..260118f --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/enums/Method.java @@ -0,0 +1,30 @@ +package com.zilber.boot.module.vehicle.enums; + +/** + * @Author LJX + * @TIME 2025-05-06 11:37 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +public enum Method { + + TOKEN("jimi.oauth.token.get"), + REFRESH("jimi.oauth.token.refresh"), + LIST("jimi.user.device.list"), + ; + + private String code; + + Method(String code) { + this.code = code; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/enums/TabType.java b/src/main/java/com/zilber/boot/module/vehicle/enums/TabType.java new file mode 100644 index 0000000..393f337 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/enums/TabType.java @@ -0,0 +1,33 @@ +package com.zilber.boot.module.vehicle.enums; + +/** + * @Author LJX + * @TIME 2025-05-06 11:40 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +public enum TabType { + + LocationIndex("locationIndex"),//定位 + TrackIndex("trackIndex"),//轨迹 + AlarmIndex("alarmIndex"),//告警 + InstructionIndex("instructionIndex"),//指令 + ReportIndex("reportIndex"),//报表 + FenceIndex("fenceIndex"),//围栏 + ; + + private String type; + + TabType(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/properties/TourRunProperties.java b/src/main/java/com/zilber/boot/module/vehicle/properties/TourRunProperties.java new file mode 100644 index 0000000..b481068 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/properties/TourRunProperties.java @@ -0,0 +1,36 @@ +package com.zilber.boot.module.vehicle.properties; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @Author LJX + * @TIME 2025-05-07 10:10 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +@Data +@Component +public class TourRunProperties { + + @Value("${tourRun.appKey}") + private String appKey; + + @Value("${tourRun.appSecret}") + private String appSecret; + + @Value("${tourRun.tourRunAccount}") + private String tourRunAccount; + + @Value("${tourRun.tourRunPassword}") + private String tourRunPassword; + + @Value("${tourRun.openapiUrl}") + private String openapiUrl; + + @Value("${tourRun.h5Url}") + private String h5Url; + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/service/TourRunService.java b/src/main/java/com/zilber/boot/module/vehicle/service/TourRunService.java new file mode 100644 index 0000000..f5e5893 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/service/TourRunService.java @@ -0,0 +1,21 @@ +package com.zilber.boot.module.vehicle.service; + +import com.zilber.boot.module.vehicle.dto.pr.DevicePR; +import com.zilber.boot.utils.page.PageUtils; + +/** + * @Author LJX + * @TIME 2025-05-06 11:51 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +public interface TourRunService { + + PageUtils list(DevicePR pr); + + String h5(String tabType, String imei); + + String token(); + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/service/impl/TourRunServiceImpl.java b/src/main/java/com/zilber/boot/module/vehicle/service/impl/TourRunServiceImpl.java new file mode 100644 index 0000000..70b3b23 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/service/impl/TourRunServiceImpl.java @@ -0,0 +1,246 @@ +package com.zilber.boot.module.vehicle.service.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.zilber.boot.exception.ServiceException; +import com.zilber.boot.module.vehicle.constant.Constant; +import com.zilber.boot.module.vehicle.dto.pr.DevicePR; +import com.zilber.boot.module.vehicle.enums.Method; +import com.zilber.boot.module.vehicle.properties.TourRunProperties; +import com.zilber.boot.module.vehicle.service.TourRunService; +import com.zilber.boot.module.vehicle.util.SignUtils; +import com.zilber.boot.utils.StringUtils; +import com.zilber.boot.utils.page.PageUtils; +import org.apache.commons.codec.digest.DigestUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.HttpURLConnection; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static com.zilber.boot.module.vehicle.util.http.HttpUtils.sendGet; +import static com.zilber.boot.module.vehicle.util.http.HttpUtils.sendPost; + +/** + * @Author LJX + * @TIME 2025-05-06 11:56 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description + */ +@Service +public class TourRunServiceImpl + implements TourRunService { + + // 申请来的appKey和appSecret +// @Value("${tourRun.tourRunPassword}") +// private String appKey; +// +// @Value("${tourRun.tourRunPassword}") +// private String appSecret; +// +// @Value("${tourRun.tourRunPassword}") +// private String tourRunAccount; +// +// @Value("${tourRun.tourRunPassword}") +// private String tourRunPassword; +// +// @Value("${tourRun.openapiUrl}") +// private String openapiUrl; +// +// @Value("${tourRun.h5Url}") +// private String h5Url; + + @Autowired + private TourRunProperties properties; + + @Autowired + private RedisTemplate redisTemplate; + + @Override + public PageUtils list(DevicePR pr) { + String token = token(); + + Map paramMap = paramMap(Method.LIST.getCode()); + + // 私有参数 + paramMap.put("access_token", token); + paramMap.put("target", properties.getTourRunAccount()); + // 计算签名 + String sign = ""; + try { + sign = SignUtils.signTopRequest(paramMap, properties.getAppSecret(), Constant.MD5); + paramMap.put("sign", sign); + } catch (IOException e) { + e.printStackTrace(); + } + //调用com/zilber/boot/module/vehicle/util/http/HttpUtils方法 + JSONObject jsonObject = sendPost(properties.getOpenapiUrl(), headerMap(), paramMap); + //初始化列表 +// List resultList = null; +// if ( jsonObject != null) { +// if ( !jsonObject.get("code").toString().equals("0")) +// { +// throw new ServiceException(jsonObject.get("message").toString()); +// } +// resultList = jsonObject.getList("result", JSONObject.class); +// } +// else { +// throw new ServiceException("列表获取失败"); +// } + List resultList = handleResult(jsonObject, JSONObject.class, "获取列表失败"); + if (CollectionUtils.isNotEmpty(resultList)) + { + List handledList = resultList.stream() + .filter(jo -> jo.get("mcTypeUseScope").toString().equals(pr.getScope())) + .sorted((o1, o2) -> StringUtils.compare(o1.get("imei").toString(), o2.get("imei").toString())) + .collect(Collectors.toList()); + return new PageUtils( + //将处理后的列表手动分页 + handledList.stream() + .skip((long) (pr.getPageNo() - 1) *pr.getPageSize()) + .limit(pr.getPageSize()) + .collect(Collectors.toList()), + handledList.size(), + pr.getPageSize(), + pr.getPageNo()); + } + return new PageUtils(new ArrayList<>(), 0, pr.getPageSize(), pr.getPageNo()); + } + + //https://openh5.aichezaixian.com/?token=XXX&imei=AAA&appKey=BBB&activeTab=CCC + @Override + public String h5(String tabType, String imei) { + if ( StringUtils.isEmpty(tabType)) { + throw new ServiceException("tab栏位不能为空"); + } + if ( StringUtils.isEmpty(imei)){ + throw new ServiceException("imei号不能为空"); + } + String suffix = "/?token={}&imei={}&appKey={}&activeTab={}"; + String token = token(); + + String format = StringUtils.format(suffix, token, imei, properties.getAppKey(), tabType); + return sendGet(properties.getH5Url() + format); + } + + @Override + public String token() { + String token = redisTemplate.opsForValue().get(Constant.KEY); + if (StringUtils.isEmpty(token)) { + + Map paramMap = paramMap(Method.TOKEN.getCode()); + + // 私有参数 + paramMap.put("user_id", properties.getTourRunAccount()); + paramMap.put("user_pwd_md5", DigestUtils.md5Hex(properties.getTourRunPassword())); + paramMap.put("expires_in", "120"); + + // 计算签名 + String sign = ""; + try { + sign = SignUtils.signTopRequest(paramMap, properties.getAppSecret(), Constant.MD5); + paramMap.put("sign", sign); + } catch (IOException e) { + e.printStackTrace(); + } + //调用com/zilber/boot/module/vehicle/util/http/HttpUtils方法 + JSONObject jsonObject = sendPost(properties.getOpenapiUrl(), headerMap(), paramMap); +// if ( jsonObject != null) { +// if ( !jsonObject.get("code").toString().equals("0")) +// { +// throw new ServiceException(jsonObject.get("message").toString()); +// } +// token = ((JSONObject) jsonObject.get("result")).get("accessToken").toString(); +// } +// else { +// throw new ServiceException("无法获取token"); +// } + token = handleResult(jsonObject, "无法获取token"); + redisTemplate.opsForValue().set(Constant.KEY, token, Constant.TIMEOUT, TimeUnit.SECONDS); + } + return token; + } + + public static String getCurrentDate() { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return formatter.format(new Date()); + } + + /** + * 构造并初始化部分参数的请求头map + * @return map + */ + private Map headerMap(){ + Map headerMap = new HashMap<>(); + headerMap.put("Content-Type", "application/x-www-form-urlencoded"); + return headerMap; + } + + /** + * 构造并初始化部分参数的请求参数map + * @return map + */ + private Map paramMap(String method){ + Map paramMap = new HashMap<>(); + // 公共参数 + paramMap.put("app_key", properties.getAppKey()); + paramMap.put("v", "1.0"); + paramMap.put("timestamp", getCurrentDate()); + paramMap.put("sign_method", Constant.MD5); + paramMap.put("format", "json"); + paramMap.put("method", method); + return paramMap; + } + + /** + * 处理接收到的返回结果(列表) + * @param result 返回结果 + * @param clazz 数据类 + * @param errorMessage 自定义错误信息(result为空时的异常信息) + * @return + * @param + */ + private List handleResult(JSONObject result, Class clazz, String errorMessage) { + List resultList = null; + if ( result != null) { + if ( !result.get(Constant.CODE).toString().equals(Constant.SUCCESS_CODE)) { + throw new ServiceException(result.get(Constant.message).toString()); + } + resultList = result.getList(Constant.RESULT, clazz); + return resultList; + } + else { + throw new ServiceException(errorMessage); + } + } + + /** + * 处理接收到的返回结果(字符串) + * @param result 结果 + * @param errorMessage 自定义错误信息(result为空时的异常信息) + * @return + */ + private String handleResult(JSONObject result, String errorMessage) + { + if ( result != null) { + if ( !result.get(Constant.CODE).toString().equals(Constant.SUCCESS_CODE)) { + throw new ServiceException(result.get(Constant.message).toString()); + } + return ((JSONObject) result.get("result")).get("accessToken").toString(); + } + else { + throw new ServiceException(errorMessage); + } + } + + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/util/SignUtils.java b/src/main/java/com/zilber/boot/module/vehicle/util/SignUtils.java new file mode 100644 index 0000000..5bedbaa --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/util/SignUtils.java @@ -0,0 +1,103 @@ +/* + * COPYRIGHT. ShenZhen JiMi Technology Co., Ltd. 2017. + * ALL RIGHTS RESERVED. + * + * No part of this publication may be reproduced, stored in a retrieval system, or transmitted, + * on any form or by any means, electronic, mechanical, photocopying, recording, + * or otherwise, without the prior written permission of ShenZhen JiMi Network Technology Co., Ltd. + * + * Amendment History: + * + * Date By Description + * ------------------- ----------- ------------------------------------------- + * 2017年4月5日 yaojianping Create the class + * http://www.jimilab.com/ + */ + +package com.zilber.boot.module.vehicle.util; + +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.Map; + +/** + * @FileName CodeUtils.java + * @Description: 服务器签名工具类 + * + * @Date 2017年4月5日 下午4:59:06 + * @author yaojianping + * @version 1.0 + */ +public class SignUtils { + + public static String signTopRequest(Map params, String secret, String signMethod) throws IOException { + // 第一步:检查参数是否已经排序 + String[] keys = params.keySet().toArray(new String[0]); + Arrays.sort(keys); + + // 第二步:把所有参数名和参数值串在一起 + StringBuilder query = new StringBuilder(); + if ("md5".equals(signMethod)) { + query.append(secret); + } + for (String key : keys) { + String value = params.get(key); + if (StringUtil.areNotEmpty(key, value)) { + query.append(key).append(value); + } + } + + // 第三步:使用MD5/HMAC加密 + query.append(secret); + byte[] bytes = encryptMD5(query.toString()); + + // 第四步:把二进制转化为大写的十六进制 + return byte2hex(bytes); + } + + public static byte[] encryptHMAC(String data, String secret) throws IOException { + byte[] bytes = null; + try { + SecretKey secretKey = new SecretKeySpec(secret.getBytes("utf-8"), "HmacMD5"); + Mac mac = Mac.getInstance(secretKey.getAlgorithm()); + mac.init(secretKey); + bytes = mac.doFinal(data.getBytes("utf-8")); + } catch (GeneralSecurityException gse) { + throw new IOException(gse.toString()); + } + return bytes; + } + + public static byte[] encryptMD5(String data) throws IOException { + return encryptMD5(data.getBytes("utf-8")); + } + + private static byte[] encryptMD5(byte[] bytes) throws IOException { + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new IOException(e.toString()); + } + return md.digest(bytes); + } + + public static String byte2hex(byte[] bytes) { + StringBuilder sign = new StringBuilder(); + for (int i = 0; i < bytes.length; i++) { + String hex = Integer.toHexString(bytes[i] & 0xFF); + if (hex.length() == 1) { + sign.append("0"); + } + sign.append(hex.toUpperCase()); + } + return sign.toString(); + } + +} diff --git a/src/main/java/com/zilber/boot/module/vehicle/util/StringUtil.java b/src/main/java/com/zilber/boot/module/vehicle/util/StringUtil.java new file mode 100644 index 0000000..f987212 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/util/StringUtil.java @@ -0,0 +1,135 @@ +/* + * COPYRIGHT. ShenZhen JiMi Technology Co., Ltd. 2017. + * ALL RIGHTS RESERVED. + * + * No part of this publication may be reproduced, stored in a retrieval system, or transmitted, + * on any form or by any means, electronic, mechanical, photocopying, recording, + * or otherwise, without the prior written permission of ShenZhen JiMi Network Technology Co., Ltd. + * + * Amendment History: + * + * Date By Description + * ------------------- ----------- ------------------------------------------- + * 2017年4月5日 yaojianping Create the class + * http://www.jimilab.com/ + */ + +package com.zilber.boot.module.vehicle.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @FileName StringUtil.java + * @Description: + * + * @Date 2017年4月5日 下午5:36:34 + * @author yaojianping + * @version 1.0 + */ +public final class StringUtil { + + public static boolean areNotEmpty(String... values) { + boolean result = true; + if ((values == null) || (values.length == 0)) + result = false; + else { + for (String value : values) { + result &= !isEmpty(value); + } + } + return result; + } + + public static boolean isEmpty(String value) { + int strLen; + if ((value == null) || ((strLen = value.length()) == 0)) + return true; + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(value.charAt(i))) { + return false; + } + } + return true; + } + + public static final char UNDERLINE = '_'; + + /** + * 驼峰格式字符串转换为下划线格式字符串 + * + * @param param + * @return + */ + public static String camelToUnderline(String param) { + if (param == null || "".equals(param.trim())) { + return ""; + } + int len = param.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = param.charAt(i); + if (Character.isUpperCase(c)) { + sb.append(UNDERLINE); + sb.append(Character.toLowerCase(c)); + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 下划线格式字符串转换为驼峰格式字符串 + * + * @param param + * @return + */ + public static String underlineToCamel(String param) { + if (param == null || "".equals(param.trim())) { + return ""; + } + int len = param.length(); + StringBuilder sb = new StringBuilder(len); + for (int i = 0; i < len; i++) { + char c = param.charAt(i); + if (c == UNDERLINE) { + if (++i < len) { + sb.append(Character.toUpperCase(param.charAt(i))); + } + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 下划线格式字符串转换为驼峰格式字符串2 + * + * @param param + * @return + */ + public static String underlineToCamel2(String param) { + if (param == null || "".equals(param.trim())) { + return ""; + } + StringBuilder sb = new StringBuilder(param); + Matcher mc = Pattern.compile("_").matcher(param); + int i = 0; + while (mc.find()) { + int position = mc.end() - (i++); + sb.replace(position - 1, position + 1, sb.substring(position, position + 1).toUpperCase()); + } + return sb.toString(); + } + + public static void main(String[] args) { + String aaa = "app_version_fld"; + System.out.println(underlineToCamel(aaa)); + System.out.println(underlineToCamel2(aaa)); + aaa = "appVersionFld"; + System.out.println(camelToUnderline(aaa)); + + } +} \ No newline at end of file diff --git a/src/main/java/com/zilber/boot/module/vehicle/util/http/HttpUtils.java b/src/main/java/com/zilber/boot/module/vehicle/util/http/HttpUtils.java new file mode 100644 index 0000000..e7de253 --- /dev/null +++ b/src/main/java/com/zilber/boot/module/vehicle/util/http/HttpUtils.java @@ -0,0 +1,96 @@ +package com.zilber.boot.module.vehicle.util.http; + +import com.alibaba.fastjson2.JSONObject; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicHeader; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Value; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Author LJX + * @TIME 2025-05-06 11:45 + * @PROJECT intelligence-site + * created by Intellij IDEA + * Description 调用途强api的工具类 + */ +public class HttpUtils { + + public static JSONObject sendPost(String url, Map headerMap, Map paramMap) { + try { + HttpPost post = new HttpPost(url); + List list = new ArrayList(); + for (String key : paramMap.keySet()) { + list.add(new BasicNameValuePair(key, paramMap.get(key))); + } + post.setEntity(new UrlEncodedFormEntity(list, "UTF-8")); + if (null != headerMap) { + post.setHeaders(assemblyHeader(headerMap)); + } + + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpResponse response = httpClient.execute(post); + HttpEntity entity = response.getEntity(); + String result = EntityUtils.toString(entity, "utf-8"); + System.out.println(result); + return JSONObject.parseObject(result); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + public static String sendGet(String url) { + try { + HttpGet get = new HttpGet(url); + List list = new ArrayList(); +// for (String key : paramMap.keySet()) { +// list.add(new BasicNameValuePair(key, paramMap.get(key))); +// } +// post.setEntity(new UrlEncodedFormEntity(list, "UTF-8")); +// if (null != headerMap) { +// post.setHeaders(assemblyHeader(headerMap)); +// } + + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpResponse response = httpClient.execute(get); + HttpEntity entity = response.getEntity(); + String result = EntityUtils.toString(entity, "utf-8"); + System.out.println(result); + return result; + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 组装头部信息 + * + * @param headers + * @return + */ + private static Header[] assemblyHeader(Map headers) { + Header[] allHeader = new BasicHeader[headers.size()]; + int i = 0; + for (String str : headers.keySet()) { + allHeader[i] = new BasicHeader(str, headers.get(str)); + i++; + } + return allHeader; + } + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index ff84663..2639263 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -161,3 +161,11 @@ aliyun: keySecret: a2NgvAo2EXy4UbUTQm3xtirHSQbPiO bucketName: zilber-public module: upload + +tourRun: + appKey: 8FB345B8693CCD00BA15086EBAA101736574BC1ECEB825E0 + appSecret: 3bfa3a79bd9f4c0baeeae8b29c88b21a + tourRunAccount: SYCS + tourRunPassword: SYbh888888 + openapiUrl: http://open.aichezaixian.com/route/rest + h5Url: https://openh5.aichezaixian.com