From e3d7ec787c2a2b03af577fa151cf78f951a6ae66 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Thu, 23 Feb 2023 11:46:42 +0800 Subject: [PATCH] 百度的地址识别 --- src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java | 64 ++++++++++++ src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java | 3 src/test/java/cc/mrbird/febs/AgentTest.java | 87 ++++++++++++++++- src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java | 8 + src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java | 16 +++ src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java | 38 +++++++ src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java | 55 +++++++++++ src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java | 1 8 files changed, 267 insertions(+), 5 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java b/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java index 35c2505..ada2056 100644 --- a/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java +++ b/src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java @@ -5,6 +5,8 @@ import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.properties.FebsProperties; import cc.mrbird.febs.common.properties.ValidateCodeProperties; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.wf.captcha.GifCaptcha; import com.wf.captcha.SpecCaptcha; import com.wf.captcha.base.Captcha; @@ -18,6 +20,8 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; /** * 验证码服务 @@ -77,4 +81,55 @@ response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache"); response.setDateHeader(HttpHeaders.EXPIRES, 0L); } + + +// public static void main(String[] args) { +// List<Integer> lists = new ArrayList<>(); +//// lists.add(1); +//// lists.add(2); +//// lists.add(3); +//// lists.add(4); +// System.out.println(lists); +// List<Integer> collect = lists +// .stream() +// .filter(list -> 1 == list) +// .collect(Collectors.toList()); +// +// System.out.println(collect); +// +// List<Integer> collect1 = lists.stream().filter( +// list -> { +// if (1 != list) { +// return true; +// } +// return false; +// } +// ).collect(Collectors.toList()); +// +// System.out.println(collect1); +// +// +// List<Integer> list2 = new ArrayList<>(); +// Random rd = new Random(); +// for (int i = 0; i < 100; i++) { +// list2.add(rd.nextInt(101));// 随机产生一个[0,100]的数字 +// } +// System.out.println(list2); +// // 流处理, 进行数据处理 +// DoubleSummaryStatistics ds = list2.stream().collect(Collectors.summarizingDouble(e -> e)); +// Map<Boolean, List<Integer>> collect2 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 60)); +// Map<Boolean, List<Integer>> collect3 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 80)); +// Map<Boolean, List<Integer>> collect4 = list2.stream().collect(Collectors.partitioningBy(e -> e >= 200)); +// System.out.println("平均分"+ds.getAverage()); +// System.out.println("最高分"+ds.getMax()); +// System.out.println("最低分"+ds.getMin()); +// System.out.println("总分"+ds.getSum()); +// System.out.println("人数"+ds.getCount()); +// System.out.println("大于60分"+collect2.toString()); +// System.out.println("大于80分"+collect3.get(true).toString()); +// System.out.println("大于90分"+collect4.get(true).toString()); +// JSONObject jsonObject = JSONUtil.parseObj(collect2); +// System.out.println(jsonObject); +// +// } } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java index 6130cf7..8305013 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java @@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion; import cc.mrbird.febs.mall.dto.AddressInfoDto; +import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.service.IApiMallAddressInfoService; import cc.mrbird.febs.mall.vo.AddressInfoVo; @@ -15,6 +16,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; /** @@ -77,4 +79,10 @@ return new FebsResponse().success().message("设置成功"); } + @ApiOperation(value = "智能识别地址", notes = "智能识别地址") + @PostMapping(value = "/identifyAddress") + public FebsResponse identifyAddress(@RequestBody @Valid ApiIdentifyAddressDto identifyAddressDto) { + return mallAddressInfoService.identifyAddress(identifyAddressDto); + } + } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java new file mode 100644 index 0000000..db2b225 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java @@ -0,0 +1,16 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +@ApiModel(value = "ApiIdentifyAddressDto", description = "地址接收参数类") +public class ApiIdentifyAddressDto { + + + @NotBlank(message = "参数不能为空") + private String text; + +} diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java new file mode 100644 index 0000000..d9c2125 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java @@ -0,0 +1,64 @@ +package cc.mrbird.febs.mall.quartz; + +import cc.mrbird.febs.common.utils.RedisUtils; +import cc.mrbird.febs.pay.util.WechatConfigure; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.extension.exceptions.ApiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; + +@Slf4j +@Component +@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true") +public class BaiduJob { + + @Autowired + private RedisUtils redisUtils; + @Resource + RestTemplate restTemplate; + + @Scheduled(cron = "0 0 1 * * ? ") + public void getAccessToken(){ + // 官网获取的 API Key 更新为你注册的 + String clientId = "MPHXcBxkGLIDOmoaahS9pIB7"; + // 官网获取的 Secret Key 更新为你注册的 + String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw"; + String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; + String getAccessTokenUrl = authHost + // 1. grant_type为固定参数 + + "grant_type=client_credentials" + // 2. 官网获取的 API Key + + "&client_id=" + clientId + // 3. 官网获取的 Secret Key + + "&client_secret=" + clientSecret; + String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class); + + /** + * 返回结果 + * {"access_token":"ACCESS_TOKEN","expires_in":7200} + */ + if (!jsonStr.contains("access_token")) { + System.out.println("获取access_token失败"); + } + JSONObject jsonObject = JSONObject.parseObject(jsonStr); + String accessToken = jsonObject.getString("access_token"); + + String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY; + if (StrUtil.isEmpty(accessToken)) { + log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg")); + throw new ApiException("获取access token失败"); + } else { + log.info("baidu access_token : {}",accessToken); + System.out.println(accessToken); + redisUtils.set(accessTokenKey,accessToken); + } + } + +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java index d4d5a65..bd88226 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java @@ -2,6 +2,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.AddressInfoDto; +import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.vo.AddressInfoVo; import com.baomidou.mybatisplus.extension.service.IService; @@ -17,4 +18,6 @@ void modifyAddress(AddressInfoDto addressInfoDto); void setDefaultAddress(Long id); + + FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java index 4ebfcd9..e9118ea 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java @@ -3,20 +3,29 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; +import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.conversion.MallAddressInfoConversion; import cc.mrbird.febs.mall.dto.AddressInfoDto; +import cc.mrbird.febs.mall.dto.ApiIdentifyAddressDto; import cc.mrbird.febs.mall.entity.MallAddressInfo; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.mapper.MallAddressInfoMapper; import cc.mrbird.febs.mall.service.IApiMallAddressInfoService; import cc.mrbird.febs.mall.vo.AddressInfoVo; +import cc.mrbird.febs.pay.util.WechatConfigure; import cn.hutool.core.collection.CollUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.io.IOException; import java.util.Date; +import java.util.HashMap; import java.util.List; /** @@ -27,6 +36,9 @@ @Service @RequiredArgsConstructor public class ApiMallAddressInfoServiceImpl extends ServiceImpl<MallAddressInfoMapper, MallAddressInfo> implements IApiMallAddressInfoService { + + @Autowired + private RedisUtils redisUtils; @Override public List<AddressInfoVo> findAddressInfoList() { @@ -88,4 +100,30 @@ this.baseMapper.updateIsDefault(MallAddressInfo.IS_DEFAULT_Y, member.getId(), id); } + + static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); + + @Override + public FebsResponse identifyAddress(ApiIdentifyAddressDto identifyAddressDto) { + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(identifyAddressDto)); + Request request = new Request.Builder() + .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString()) + .method("POST", body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + String data = ""; + try { + Response response = HTTP_CLIENT.newCall(request).execute(); + data = response.body().string(); + if (data.contains("error_code")) { + JSONObject jsonObject = JSONUtil.parseObj(data); + return new FebsResponse().fail().message("地址识别错误编码:"+jsonObject.get("error_code").toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + return new FebsResponse().success().data(data); + } } diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java index d59fc37..4c940c8 100644 --- a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java +++ b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java @@ -7,6 +7,7 @@ public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="; public static final String WX_ACCESS_TOKEN_REDIS_KEY = "access_token"; + public static final String BAIDU_ACCESS_TOKEN_REDIS_KEY = "bd_access_token"; public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder"; diff --git a/src/test/java/cc/mrbird/febs/AgentTest.java b/src/test/java/cc/mrbird/febs/AgentTest.java index 553b8b8..7be46b8 100644 --- a/src/test/java/cc/mrbird/febs/AgentTest.java +++ b/src/test/java/cc/mrbird/febs/AgentTest.java @@ -5,32 +5,37 @@ import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; +import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.conversion.MallGoodsConversion; -import cc.mrbird.febs.mall.dto.AddOrderItemDto; -import cc.mrbird.febs.mall.dto.AgentLevelUpdateDto; -import cc.mrbird.febs.mall.dto.ApiCreateOrderVerifyDto; -import cc.mrbird.febs.mall.dto.ApiMallActWinDetailsDto; +import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.quartz.ProfitJob; import cc.mrbird.febs.mall.service.IAgentService; import cc.mrbird.febs.mall.vo.*; +import cc.mrbird.febs.pay.util.WechatConfigure; import cc.mrbird.febs.rabbit.consumer.AgentConsumer; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONObject; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.exceptions.ApiException; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import okhttp3.*; import org.aspectj.weaver.loadtime.Agent; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.web.client.RestTemplate; +import javax.annotation.Resource; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; @@ -77,6 +82,78 @@ private MallGoodsMapper mallGoodsMapper; @Autowired private MallGoodsImagesMapper goodsImagesMapper; + + + @Autowired + private RedisUtils redisUtils; + @Resource + RestTemplate restTemplate; + + public static final String API_KEY = "MPHXcBxkGLIDOmoaahS9pIB7"; + public static final String SECRET_KEY = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw"; + + static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build(); + @Test + public void getAccessToken(){ + ApiIdentifyAddressDto apiIdentifyAddressDto = new ApiIdentifyAddressDto(); + apiIdentifyAddressDto.setText("上海市浦东新区纳贤路701号百度上海研发中心 F4A000 张三"); + MediaType mediaType = MediaType.parse("application/json"); + RequestBody body = RequestBody.create(mediaType, JSONUtil.toJsonStr(apiIdentifyAddressDto)); + Request request = new Request.Builder() + .url("https://aip.baidubce.com/rpc/2.0/nlp/v1/address?access_token=" + redisUtils.get(WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY).toString()) + .method("POST", body) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + try { + Response response = HTTP_CLIENT.newCall(request).execute(); + String responseStr = response.body().string(); + System.out.println(responseStr); + if (responseStr.contains("error_code")) { + System.out.println("获取access_token失败"); + JSONObject jsonObject = JSONUtil.parseObj(responseStr); + System.out.print(jsonObject.get("error_code").toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + @Test + public void getAccessToken2(){ + // 官网获取的 API Key 更新为你注册的 + String clientId = "MPHXcBxkGLIDOmoaahS9pIB7"; + // 官网获取的 Secret Key 更新为你注册的 + String clientSecret = "f5ueNY65fE9C6FzFTVKc6Imo8NdZSWMw"; + String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; + String getAccessTokenUrl = authHost + // 1. grant_type为固定参数 + + "grant_type=client_credentials" + // 2. 官网获取的 API Key + + "&client_id=" + clientId + // 3. 官网获取的 Secret Key + + "&client_secret=" + clientSecret; + String jsonStr = restTemplate.getForObject(getAccessTokenUrl, String.class); + + /** + * 返回结果 + * {"access_token":"ACCESS_TOKEN","expires_in":7200} + */ + if (!jsonStr.contains("access_token")) { + System.out.println("获取access_token失败"); + } + com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(jsonStr); + String accessToken = jsonObject.getString("access_token"); + + String accessTokenKey = WechatConfigure.BAIDU_ACCESS_TOKEN_REDIS_KEY; + if (StrUtil.isEmpty(accessToken)) { + log.error("获取baidu access_token失败: {}" , jsonObject.getString("errmsg")); + throw new ApiException("获取access token失败"); + } else { + log.info("baidu access_token : {}",accessToken); + System.out.println(accessToken); + redisUtils.set(accessTokenKey,accessToken); + } + } @Test public void goodsDetails(){ Long id = 68L; -- Gitblit v1.9.1