xiaoyong931011
2023-02-23 e3d7ec787c2a2b03af577fa151cf78f951a6ae66
百度的地址识别
2 files added
6 files modified
272 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/service/ValidateCodeService.java 55 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallAddressInfoController.java 8 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java 64 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallAddressInfoService.java 3 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAddressInfoServiceImpl.java 38 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java 1 ●●●● patch | view | raw | blame | history
src/test/java/cc/mrbird/febs/AgentTest.java 87 ●●●●● patch | view | raw | blame | history
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);
//
//    }
}
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);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/ApiIdentifyAddressDto.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/mall/quartz/BaiduJob.java
New file
@@ -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);
        }
    }
}
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);
}
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);
    }
}
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";
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;