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