From 019b4e1fd4f841f4b7f4a657f75d9c4ec93fbd25 Mon Sep 17 00:00:00 2001 From: zhouhaibin Date: Fri, 14 Jun 2024 10:34:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0minio=E5=92=8Celasicsearch?= =?UTF-8?q?=E7=9A=84=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/CostItemDetailMapper.xml | 2 +- .../costManagement/vo/ProductsVO.java | 4 +- .../impl/SupplierProductsServiceImpl.java | 88 ++++--- .../src/main/resources/http_ca.crt | 31 --- platform-boot-starter-elasticsearch/pom.xml | 30 ++- .../config/ElasticSearchConfig.java | 221 +++++++++--------- .../config/LocalDateTimeAdapter.java | 32 +++ .../entity/SupplierProductsDTO.java | 74 +++--- .../abc/platform/oss/config/MinioConfig.java | 6 +- .../src/main/resources/application.yml | 24 +- .../main/resources/application-platform.yml | 28 ++- .../controller/AttachmentController.java | 8 + .../support/service/AttachmentService.java | 8 +- .../service/impl/AttachmentServiceImpl.java | 41 +++- pom.xml | 19 +- 15 files changed, 350 insertions(+), 266 deletions(-) delete mode 100644 platform-boot-starter-demo/src/main/resources/http_ca.crt create mode 100644 platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/LocalDateTimeAdapter.java diff --git a/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/mapper/CostItemDetailMapper.xml b/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/mapper/CostItemDetailMapper.xml index 734c741..7f418a6 100644 --- a/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/mapper/CostItemDetailMapper.xml +++ b/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/mapper/CostItemDetailMapper.xml @@ -21,7 +21,7 @@ id, supplier_information_id, product_name, product_identity, - product_price, source_information, model_id, remarks, + product_price, source_information, model_id, remarks,image, delete_flag diff --git a/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/vo/ProductsVO.java b/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/vo/ProductsVO.java index dc4e4a9..1631d8b 100644 --- a/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/vo/ProductsVO.java +++ b/platform-boot-started-costManagement/src/main/java/tech/abc/platform/costManagement/vo/ProductsVO.java @@ -36,6 +36,8 @@ public class ProductsVO extends BaseVO { @NotBlank(message = "【产品名称】不能为空") private String productName; + private String image; + /** * 产品标识(型号) */ @@ -64,7 +66,7 @@ public class ProductsVO extends BaseVO { /** * 产品描述 */ - private String ModelDescription; + private String productSpecifications; /** * 产品类型 (-1:全部, 0:供应商产品库, 1:公司产品库,2:个人产品库) diff --git a/platform-boot-started-productManagement/src/main/java/tech/abc/platform/productManagement/service/impl/SupplierProductsServiceImpl.java b/platform-boot-started-productManagement/src/main/java/tech/abc/platform/productManagement/service/impl/SupplierProductsServiceImpl.java index 8e16c46..f777779 100644 --- a/platform-boot-started-productManagement/src/main/java/tech/abc/platform/productManagement/service/impl/SupplierProductsServiceImpl.java +++ b/platform-boot-started-productManagement/src/main/java/tech/abc/platform/productManagement/service/impl/SupplierProductsServiceImpl.java @@ -1,14 +1,24 @@ package tech.abc.platform.productManagement.service.impl; -import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.elasticsearch._types.query_dsl.Operator; -import co.elastic.clients.elasticsearch.core.SearchResponse; -import co.elastic.clients.elasticsearch.core.search.Hit; + import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.elasticsearch.action.search.SearchRequest; +import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.client.RequestOptions; +import org.elasticsearch.client.RestHighLevelClient; +import org.elasticsearch.index.query.QueryBuilders; +import org.elasticsearch.search.SearchHit; +import org.elasticsearch.search.SearchHits; +import org.elasticsearch.search.builder.SearchSourceBuilder; +import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import tech.abc.platform.common.exception.CommonException; +import tech.abc.platform.common.exception.CustomException; import tech.abc.platform.common.vo.PageInfo; import tech.abc.platform.common.vo.SortInfo; import tech.abc.platform.elasticsearch.entity.SupplierProductsDTO; @@ -47,7 +57,8 @@ public class SupplierProductsServiceImpl extends BaseServiceImpl querypagebyes(SupplierProductsVO queryVO, PageInfo pageInfo, SortInfo sortInfo) { // 执行查询 Page supplierProductsVOPage = new Page<>(pageInfo.getPageNum(), pageInfo.getPageSize()); + List supplierProductsVOList =new ArrayList<>(); String productName = queryVO.getProductName(); + SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); + SearchRequest searchRequest = new SearchRequest("pmg_supplier_products"); + // //高亮器 + HighlightBuilder highlightBuilder = new HighlightBuilder(); + highlightBuilder.requireFieldMatch(false)//多字段时,需要设置为false//因为高亮查询默认是对查询字段即description就行高亮,可以关闭字段匹配,这样就可以对查询到的多个字段(前提是有关键词并且改字段可以分词)进行高亮显示 + .field("product_name")//若有关键字切可以分词,则可以高亮,写*可以匹配所有字段 + .field("product_specifications")//若有关键字切可以分词,则可以高亮,写*可以匹配所有字段 + .preTags("")//手动前缀标签 + .postTags(""); + searchSourceBuilder + .query(QueryBuilders.multiMatchQuery(productName, "product_name", "product_specifications")) + .highlighter(highlightBuilder) + .from(pageInfo.getPageNum()-1) //起始位置:start=(page-1)*size + .size(pageInfo.getPageSize()); //每页显示条数; + + searchRequest.source(searchSourceBuilder); try { - SearchResponse searchResponse = client.search(srBuilder -> srBuilder - .index("pmg_supplier_products") - // MultiMatch 查找:对输入内容先分词再查询。 - .query(queryBuilder -> queryBuilder - .multiMatch(multiMatchQueryBuilder -> multiMatchQueryBuilder - .fields("product_name", "product_specifications") - .query(productName) - .operator(Operator.Or))) - //高亮显示 - .highlight(highlightBuilder -> highlightBuilder - .preTags("") - .postTags("") - .requireFieldMatch(false) //多字段时,需要设置为false - .fields("product_name", highlightFieldBuilder -> highlightFieldBuilder) - .fields("product_specifications", highlightFieldBuilder -> highlightFieldBuilder) - ) - .from(pageInfo.getPageNum()-1) - .size(pageInfo.getPageSize()) - , SupplierProductsDTO.class); - List> hitList = searchResponse.hits().hits(); - supplierProductsVOPage.setTotal(searchResponse.hits().total().value()); - List supplierProductsVOList =new ArrayList<>(); - for (Hit hit : hitList) { - SupplierProductsVO supplierProductsVO = new SupplierProductsVO(); - BeanUtils.copyProperties(hit.source(),supplierProductsVO); -// SupplierProductsVO map = mapperFacade.map(hit.source(), SupplierProductsVO.class); - if(hit.highlight().get("product_name")!=null){ - supplierProductsVO.setProductName(hit.highlight().get("product_name").get(0)); + SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); + // 解析结果 + SearchHits hits = response.getHits(); + + + supplierProductsVOPage.setTotal(response.getHits().getTotalHits().value); + SearchHit[] searchHits = hits.getHits(); + Gson gson =new Gson(); + for (SearchHit hit : searchHits) { + String json = gson.toJson(hit.getSourceAsMap()); + SupplierProductsDTO supplierProductsDTO = gson.fromJson(json, SupplierProductsDTO.class); + SupplierProductsVO supplierProductsVO =mapperFacade.map(supplierProductsDTO, SupplierProductsVO.class); + if(hit.getHighlightFields().get("product_name")!=null){ + supplierProductsVO.setProductName(hit.getHighlightFields().get("product_name").getFragments()[0].toString()); } - if(hit.highlight().get("product_specifications")!=null){ - supplierProductsVO.setProductSpecifications(hit.highlight().get("product_specifications").get(0)); + if(hit.getHighlightFields().get("product_specifications")!=null){ + supplierProductsVO.setProductSpecifications(hit.getHighlightFields().get("product_specifications").getFragments()[0].toString()); } supplierProductsVOList.add(supplierProductsVO); } supplierProductsVOPage.setRecords(supplierProductsVOList); + return supplierProductsVOPage; } catch (IOException e) { - throw new RuntimeException(e); + throw new CustomException(CommonException.ELASTICSEARCH_ERROR,"查询失败"); } - return supplierProductsVOPage; } @Override diff --git a/platform-boot-starter-demo/src/main/resources/http_ca.crt b/platform-boot-starter-demo/src/main/resources/http_ca.crt deleted file mode 100644 index 92ab33d..0000000 --- a/platform-boot-starter-demo/src/main/resources/http_ca.crt +++ /dev/null @@ -1,31 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFWjCCA0KgAwIBAgIVAIoa4/XgAnDR+55oINCE0Vm77NOfMA0GCSqGSIb3DQEB -CwUAMDwxOjA4BgNVBAMTMUVsYXN0aWNzZWFyY2ggc2VjdXJpdHkgYXV0by1jb25m -aWd1cmF0aW9uIEhUVFAgQ0EwHhcNMjQwNTI4MDMwODM5WhcNMjcwNTI4MDMwODM5 -WjA8MTowOAYDVQQDEzFFbGFzdGljc2VhcmNoIHNlY3VyaXR5IGF1dG8tY29uZmln -dXJhdGlvbiBIVFRQIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA -1YbHndQVi5WRsO52jh1ThRGbndrVTdaKgepCEPc0bt3EiHPEXB3xUnoPQkmcazn/ -Vf3fuIV8ZLML6CeR5w5jX+FYr6fl7J4o2f8WWBGS9nWkpfYYxICUh0vf9g8y3jOc -yeeME3tNFCOPRW9rlYUjq4ba514lNaGZGOnLCV6G2LBZLXIkE7ukj+Mly3pDUpJv -5aen+nsWF9MyUcXa2U8mHvv3SHNSp+N+2jbpgTYAM6tWMSbpZ+6LTewNyQi+4QiJ -Qo2BGpfi6G6YAWXfvy+ewI7hkWZVnep9ndFjci7306IDj6wfWntGmvf7OTXT2m4U -8ZVg/PECfZAIwj7A5j60joia4r4q8ftlRa+wVNTyuEvAbSYfvLt+l9A/UldQ4Vxs -+VZOCpTNwME7UQUqaZq8TThgpqd9RFGwtgeJ7JV92NPlaQCHGC9FSE1iZQB6ykAE -Dl1df5dnlTMSfj2EreDBOF4JpI406C/RDXxg3c94986UZC7ra7qQ8WBnAxpsaVto -nXIVCFaBzn7yFkJbm4f6Zd0CCYrwB9pqhqp8LuVQr0ubDvawgodanuKBUkNC7qtZ -F7jxXzSj4bg1bhDRzyUrtuIg+CTMJA0rrZWxthE2gYzvbfZqMSInPwjkgGmL6vxN -KW1FJcIHamMTHU/tl1RNSA9BnczitN3/x7fWGGfSYN0CAwEAAaNTMFEwHQYDVR0O -BBYEFI8Vo0wKU5BgjNtgyZ26uPI0iKX2MB8GA1UdIwQYMBaAFI8Vo0wKU5BgjNtg -yZ26uPI0iKX2MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggIBAANc -g7Wf5ET9QDbTXdN4mwL4Vr2pri2mAzB1LRqAz4UGmsgxZICUZXWOoo1P5qfzOkWm -xzP9BPHXMJLtQZh3pYtb+UGuxcLeT/IcuKpXiKVX4+7N6WVyEXZl1cSy2xf3i03j -AjqP0aRJBQo74aMcFKngh2tz7NMOmSPw5cYyLIsklL9uShh/tFEgMAZtC8aReHTj -WJJhIP0NgGHMiqbozTuDatDprKE4UDgt9tOKq/ci29kCDBHH2+siJOGsg5oDwa3V -Cin/bMwCdvZwQAbmOOETyHl/Og3PduHQZ1O2FbgPICxlPzKRxDx2jTmSg7Ub36t6 -Ec/j+BV8eciZneJ0f9K3SGP4aG5GECYdsINhjbG0HQe+ktj0Fm3a4mwlR+vkmF3d -/LeW6mbaO/Km3H9iRT9SRa0LG1rslL6awVSueHxpmAXU+EGI/gxdacxV8T32V8IJ -cYYJcKVZC5HDnN4VP+PDXST3cfKGb1wRSL1+IkCjrY9EZK+DFJG/gmTdgDi9qSBx -99vHbnGyKBY5+UAZ2nVxnnRTyfLXXkZQZqVzuRg6STlKGvYbWSS/nBLVyp/dW32J -kJK7t92SV8TGzFY24VyfnBsQaf1mUnsSSn5tFDej6bvpA83nsL8sgUeHy/HbGKTA -5AxbnKvU2qtM65Sx01ZKVdbVE5ubYGxu2h7IGZ38 ------END CERTIFICATE----- diff --git a/platform-boot-starter-elasticsearch/pom.xml b/platform-boot-starter-elasticsearch/pom.xml index 25850d1..52f62ce 100644 --- a/platform-boot-starter-elasticsearch/pom.xml +++ b/platform-boot-starter-elasticsearch/pom.xml @@ -9,13 +9,13 @@ - platform-boot-starter-elasticsearch 5.1.0 platform-boot-starter-elasticsearch 全文搜索 + tech.abc @@ -27,23 +27,31 @@ - - co.elastic.clients - elasticsearch-java - 8.1.3 + org.elasticsearch + elasticsearch + + + org.elasticsearch.client + elasticsearch-rest-high-level-client - com.fasterxml.jackson.core - jackson-databind - 2.13.3 + com.google.code.gson + gson + + + + + + - - - + + + + org.apache.poi diff --git a/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/ElasticSearchConfig.java b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/ElasticSearchConfig.java index 307d5d4..ea978ca 100644 --- a/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/ElasticSearchConfig.java +++ b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/ElasticSearchConfig.java @@ -1,46 +1,23 @@ package tech.abc.platform.elasticsearch.config; -import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient; -import co.elastic.clients.elasticsearch.ElasticsearchClient; -import co.elastic.clients.json.jackson.JacksonJsonpMapper; -import co.elastic.clients.transport.ElasticsearchTransport; -import co.elastic.clients.transport.rest_client.RestClientTransport; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.conn.ssl.NoopHostnameVerifier; + import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; -import org.apache.http.ssl.SSLContextBuilder; -import org.apache.http.ssl.SSLContexts; + import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; +import org.elasticsearch.client.RestHighLevelClient; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.util.StringUtils; - - -import javax.net.ssl.SSLContext; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; + +import java.util.ArrayList; +import java.util.List; /** * ElasticSearch 配置 @@ -58,7 +35,89 @@ public class ElasticSearchConfig { private String userName; @Value("${elasticsearch.password}") - private String passWord; + private String password; + + /** + * es 请求方式 + */ + @Value("${elasticsearch.scheme}") + private String scheme; + /** + * es 连接超时时间 + */ + @Value("${elasticsearch.connectTimeOut}") + + private int connectTimeOut; + /** + * es socket 连接超时时间 + */ + @Value("${elasticsearch.socketTimeOut}") + + private int socketTimeOut; + /** + * es 请求超时时间 + */ + @Value("${elasticsearch.connectionRequestTimeOut}") + private int connectionRequestTimeOut; + /** + * es 最大连接数 + */ + @Value("${elasticsearch.maxConnectNum}") + private int maxConnectNum; + /** + * es 每个路由的最大连接数 + */ + @Value("${elasticsearch.maxConnectNumPerRoute}") + private int maxConnectNumPerRoute; + + + /** + * 如果@Bean没有指定bean的名称,那么方法名就是bean的名称 + */ + @Bean + public RestHighLevelClient restHighLevelClient() { + // 构建连接对象 + RestClientBuilder builder = RestClient.builder(getEsHost()); + + // 连接延时配置 + builder.setRequestConfigCallback(requestConfigBuilder -> { + requestConfigBuilder.setConnectTimeout(connectTimeOut); + requestConfigBuilder.setSocketTimeout(socketTimeOut); + requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); + return requestConfigBuilder; + }); + + // 连接数配置 + builder.setHttpClientConfigCallback(httpClientBuilder -> { + httpClientBuilder.setMaxConnTotal(maxConnectNum); + httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute); + httpClientBuilder.setDefaultCredentialsProvider(getCredentialsProvider()); + + return httpClientBuilder; + }); + return new RestHighLevelClient(builder); + } + + private HttpHost[] getEsHost() { + // 拆分地址(es为多节点时,不同host以逗号间隔) + List hostLists = new ArrayList<>(); + String[] hostList = hosts.split(","); + for (String addr : hostList) { + String host = addr.split(":")[0]; + String port = addr.split(":")[1]; + hostLists.add(new HttpHost(host, Integer.parseInt(port), scheme)); + } + // 转换成 HttpHost 数组 + return hostLists.toArray(new HttpHost[]{}); + } + + private CredentialsProvider getCredentialsProvider() { + // 设置用户名、密码 + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); + return credentialsProvider; + } + /** * 同步方式 * @@ -107,85 +166,27 @@ public class ElasticSearchConfig { //// asyncClient = new ElasticsearchAsyncClient(transport); // // } - @Bean - public ElasticsearchClient clientByPasswd() throws Exception { - ElasticsearchTransport transport = getElasticsearchTransport(userName, passWord, toHttpHost()); - return new ElasticsearchClient(transport); - } - - private static SSLContext buildSSLContext() { - ClassPathResource resource = new ClassPathResource("http_ca.crt"); - SSLContext sslContext = null; - try { - CertificateFactory factory = CertificateFactory.getInstance("X.509"); - Certificate trustedCa; - try (InputStream is = resource.getInputStream()) { - trustedCa = factory.generateCertificate(is); - } - KeyStore trustStore = KeyStore.getInstance("pkcs12"); - trustStore.load(null, null); - trustStore.setCertificateEntry("ca", trustedCa); - SSLContextBuilder sslContextBuilder = SSLContexts.custom() - .loadTrustMaterial(trustStore, null); - sslContext = sslContextBuilder.build(); - } catch (CertificateException | IOException | KeyStoreException | NoSuchAlgorithmException | - KeyManagementException e) { - throw new RuntimeException("ES连接认证失败", e); - } - return sslContext; - } - private static ElasticsearchTransport getElasticsearchTransport(String username, String passwd, HttpHost...hosts) { - // 账号密码的配置 - final CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); - credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, passwd)); - - // 自签证书的设置,并且还包含了账号密码 - RestClientBuilder.HttpClientConfigCallback callback = httpAsyncClientBuilder -> httpAsyncClientBuilder - .setSSLContext(buildSSLContext()) - .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) - .setDefaultCredentialsProvider(credentialsProvider); - - // 用builder创建RestClient对象 - RestClient client = RestClient - .builder(hosts) - .setHttpClientConfigCallback(callback) - .build(); - - return new RestClientTransport(client, new JacksonJsonpMapper()); - } - /** - * 异步方式 - * - * @return - */ - @Bean - public ElasticsearchAsyncClient elasticsearchAsyncClient() { - HttpHost[] httpHosts = toHttpHost(); - RestClient restClient = RestClient.builder(httpHosts).build(); - RestClientTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper()); - return new ElasticsearchAsyncClient(transport); - } - /** - * 解析配置的字符串hosts,转为HttpHost对象数组 - * - * @return - */ - private HttpHost[] toHttpHost() { - if (!StringUtils.hasLength(hosts)) { - throw new RuntimeException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!"); - } - // 多个IP逗号隔开 - String[] hostArray = hosts.split(","); - HttpHost[] httpHosts = new HttpHost[hostArray.length]; - HttpHost httpHost; - for (int i = 0; i < hostArray.length; i++) { - String[] strings = hostArray[i].split(":"); - httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "https"); - httpHosts[i] = httpHost; - } - return httpHosts; - } +// /** +// * 解析配置的字符串hosts,转为HttpHost对象数组 +// * +// * @return +// */ +// private HttpHost[] toHttpHost() { +// if (!StringUtils.hasLength(hosts)) { +// throw new RuntimeException("invalid elasticsearch configuration. elasticsearch.hosts不能为空!"); +// } +// // 多个IP逗号隔开 +// String[] hostArray = hosts.split(","); +// HttpHost[] httpHosts = new HttpHost[hostArray.length]; +// HttpHost httpHost; +// for (int i = 0; i < hostArray.length; i++) { +// String[] strings = hostArray[i].split(":"); +// httpHost = new HttpHost(strings[0], Integer.parseInt(strings[1]), "https"); +// httpHosts[i] = httpHost; +// } +// return httpHosts; +// } // @Bean // ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) { diff --git a/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/LocalDateTimeAdapter.java b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/LocalDateTimeAdapter.java new file mode 100644 index 0000000..c676977 --- /dev/null +++ b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/config/LocalDateTimeAdapter.java @@ -0,0 +1,32 @@ +package tech.abc.platform.elasticsearch.config; + +import com.google.gson.*; + +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author 李昊哲 + * @version 1.0 + * @create 2023/10/19 + */ +public class LocalDateTimeAdapter implements JsonDeserializer, JsonSerializer { + private final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(dateTimeFormatter.format(src)); + } + + @Override + public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + try { + + return LocalDateTime.parse(json.getAsString().substring(0, 10) +" "+ json.getAsString().substring(11, 19), dateTimeFormatter); + } catch (Exception e) { + throw new JsonParseException(e); + } + } + +} diff --git a/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/entity/SupplierProductsDTO.java b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/entity/SupplierProductsDTO.java index 2253dc5..c7dd0f3 100644 --- a/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/entity/SupplierProductsDTO.java +++ b/platform-boot-starter-elasticsearch/src/main/java/tech/abc/platform/elasticsearch/entity/SupplierProductsDTO.java @@ -1,12 +1,16 @@ package tech.abc.platform.elasticsearch.entity; import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import tech.abc.platform.common.base.BaseEntity; +import tech.abc.platform.elasticsearch.config.LocalDateTimeAdapter; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -19,149 +23,127 @@ import java.time.LocalDateTime; * */ @Data -@TableName("pmg_supplier_products") -@JsonIgnoreProperties(ignoreUnknown=true) - public class SupplierProductsDTO { /** * 供应商id */ - @TableField("supplier_information_id") - @JsonProperty("supplier_information_id") + @SerializedName("supplier_information_id") private String supplierInformationId; /** * 厂商产品型号id */ - @TableField("model_id") - @JsonProperty("model_id") + @SerializedName("model_id") private String modelId; /** * 个人产品规格 */ - @TableField("product_specifications") - @JsonProperty("product_specifications") + @SerializedName("product_specifications") private String productSpecifications; /** * 产品名称 */ - @TableField("product_name") - @JsonProperty("product_name") + @SerializedName("product_name") private String productName; /** * 产品标识(型号) */ - @TableField("product_identity") - @JsonProperty("product_identity") + @SerializedName("product_identity") private String productIdentity; /** * 产品价格 */ - @TableField(value="product_price",updateStrategy= FieldStrategy.IGNORED) - @JsonProperty("product_price") + @SerializedName("product_price") private BigDecimal productPrice; /** * 信息来源 */ - @TableField("source_information") - @JsonProperty("source_information") + @SerializedName("source_information") private String sourceInformation; /** * 备注 */ - @TableField("remarks") - @JsonProperty("remarks") + @SerializedName("remarks") private String remarks; /** * 产品图片 */ - @TableField("image") - @JsonProperty("image") + @SerializedName("image") private String image; /** * 产品品牌 */ - @TableField("brand") - @JsonProperty("brand") + @SerializedName("brand") private String brand; /** * 产品单位*/ - @TableField("unit") - @JsonProperty("unit") + @SerializedName("unit") private String unit; /** * 除税价格 */ - @TableField("ex_tax_price") - @JsonProperty("ex_tax_price") + @SerializedName("ex_tax_price") private BigDecimal exTaxPrice; /** * 税率 */ - @TableField("taxrate") - @JsonProperty("taxrate") + @SerializedName("taxrate") private BigDecimal taxrate; /** * 分类id */ - @TableField("category_id") - @JsonProperty("category_id") + @SerializedName("category_id") private String categoryId; /** * 逻辑删除 */ - @TableField(value = "delete_flag", fill = FieldFill.INSERT) - @TableLogic - @JsonProperty("delete_flag") + @SerializedName("delete_flag") protected String deleteFlag; /** * 创建人标识 */ - @TableField(value = "create_id", fill = FieldFill.INSERT) - @JsonProperty("create_id") + @SerializedName("create_id") private String createId; /** * 创建时间 */ - @TableField(value = "create_time", fill = FieldFill.INSERT) - @JsonProperty("create_time") - private String createTime; + @SerializedName("create_time") + @JsonAdapter(LocalDateTimeAdapter.class) + private LocalDateTime createTime; /** * 更新人标识 */ - @TableField(value = "update_id", fill = FieldFill.INSERT_UPDATE) - @JsonProperty("update_id") + @SerializedName("update_id") private String updateId; /** * 更新时间 */ - @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) - @JsonProperty("update_time") - private String updateTime; + @SerializedName("update_time") + @JsonAdapter(LocalDateTimeAdapter.class) + private LocalDateTime updateTime; /** * 版本 */ - @TableField(value = "version", fill = FieldFill.INSERT) - @JsonProperty("version") + @SerializedName("version") private Integer version; /********非库表存储属性*****/ } diff --git a/platform-boot-starter-oss/src/main/java/tech/abc/platform/oss/config/MinioConfig.java b/platform-boot-starter-oss/src/main/java/tech/abc/platform/oss/config/MinioConfig.java index 2e0d7f4..f7c3c94 100644 --- a/platform-boot-starter-oss/src/main/java/tech/abc/platform/oss/config/MinioConfig.java +++ b/platform-boot-starter-oss/src/main/java/tech/abc/platform/oss/config/MinioConfig.java @@ -18,17 +18,17 @@ public class MinioConfig { /** * 账号 */ - private String accessKey = "admin"; + private String accessKey = "root"; /** * 密钥 */ - private String secretKey = "12345678"; + private String secretKey = "123456789"; /** * 桶名 */ - private String bucketName = "abc"; + private String bucketName = "test"; } diff --git a/platform-boot-starter-oss/src/main/resources/application.yml b/platform-boot-starter-oss/src/main/resources/application.yml index b8f1cc9..ce246d3 100644 --- a/platform-boot-starter-oss/src/main/resources/application.yml +++ b/platform-boot-starter-oss/src/main/resources/application.yml @@ -1,12 +1,12 @@ -platform-config: - oss: -# 本地磁盘存储模式 -# storeClass: tech.abc.platform.oss.service.impl.LocalStoreServiceImpl -# 集成minio模式 - storeClass: tech.abc.platform.oss.service.impl.MinioStoreServiceImpl - basePath: c:/attachment/ - minio: - server: http://127.0.0.1:9000 - accessKey: admin - secretKey: 12345678 - bucketName: abc +#platform-config: +# oss: +## 本地磁盘存储模式 +## storeClass: tech.abc.platform.oss.service.impl.LocalStoreServiceImpl +## 集成minio模式 +# storeClass: tech.abc.platform.oss.service.impl.MinioStoreServiceImpl +# basePath: c:/attachment/ +# minio: +# server: http://127.0.0.1:9000 +# accessKey: minioadmin +# secretKey: minioadmin +# bucketName: test diff --git a/platform-boot-starter/src/main/resources/application-platform.yml b/platform-boot-starter/src/main/resources/application-platform.yml index b313726..9e808ea 100644 --- a/platform-boot-starter/src/main/resources/application-platform.yml +++ b/platform-boot-starter/src/main/resources/application-platform.yml @@ -1,9 +1,23 @@ server: port: 8080 elasticsearch: + # es host ip 地址(集群),多个以","间隔 uris: localhost:9200 username: elastic - password: '1CVfNF7NPO+HQXprJGaR' + password: 123456789 + # es 请求方式 + scheme: http + # es 连接超时时间(ms) + connectTimeOut: 1000 + # es socket 连接超时时间(ms) + socketTimeOut: 30000 + # es 请求超时时间(ms) + connectionRequestTimeOut: 500 + # es 最大连接数 + maxConnectNum: 100 + # es 每个路由的最大连接数 + maxConnectNumPerRoute: 100 + #数据连接 spring: datasource: @@ -139,16 +153,16 @@ platform-config: enableResend: true oss: # 本地磁盘存储模式 - storeClass: tech.abc.platform.oss.service.impl.LocalStoreServiceImpl +# storeClass: tech.abc.platform.oss.service.impl.LocalStoreServiceImpl # 集成minio模式 - # storeClass: tech.abc.platform.oss.service.impl.MinioStoreServiceImpl - # 本地磁盘需要给出路径,如c:/attachment/或/data;minio因使用桶作为逻辑存储,无根路径,需留空 + storeClass: tech.abc.platform.oss.service.impl.MinioStoreServiceImpl +# 本地磁盘需要给出路径,如c:/attachment/或/data;minio因使用桶作为逻辑存储,无根路径,需留空 basePath: c:/attachment/ minio: server: http://127.0.0.1:9000 - accessKey: admin - secretKey: 12345678 - bucketName: abc + accessKey: root + secretKey: 123456789 + bucketName: test mail: senderAddress: sealy321@126.com file: diff --git a/platform-support/src/main/java/tech/abc/platform/support/controller/AttachmentController.java b/platform-support/src/main/java/tech/abc/platform/support/controller/AttachmentController.java index ae87f3f..2189c77 100644 --- a/platform-support/src/main/java/tech/abc/platform/support/controller/AttachmentController.java +++ b/platform-support/src/main/java/tech/abc/platform/support/controller/AttachmentController.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.annotations.Param; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -42,6 +43,7 @@ import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URLEncoder; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; /** @@ -245,6 +247,12 @@ public class AttachmentController extends BaseController { } + @PostMapping("/uploadImageReturnUrl") + @AllowAuthenticated + public ResponseEntity uploadImageReturnUrl(MultipartFile image) { + String url = attachmentService.uploadImageReturnUrl(image); + return ResultUtil.success(url); + } @PostMapping("/uploadImage") @AllowAuthenticated public ResponseEntity uploadImage(MultipartFile image) { diff --git a/platform-support/src/main/java/tech/abc/platform/support/service/AttachmentService.java b/platform-support/src/main/java/tech/abc/platform/support/service/AttachmentService.java index 5f3f003..a12e2f1 100644 --- a/platform-support/src/main/java/tech/abc/platform/support/service/AttachmentService.java +++ b/platform-support/src/main/java/tech/abc/platform/support/service/AttachmentService.java @@ -57,7 +57,13 @@ public interface AttachmentService extends BaseService { * @return 文件流 */ InputStream getFile(String id); + /** + * 上传图片并返回url + * + * @param image + * @return 图片url + */ - + String uploadImageReturnUrl(MultipartFile image); } diff --git a/platform-support/src/main/java/tech/abc/platform/support/service/impl/AttachmentServiceImpl.java b/platform-support/src/main/java/tech/abc/platform/support/service/impl/AttachmentServiceImpl.java index f93021c..e9b14d9 100644 --- a/platform-support/src/main/java/tech/abc/platform/support/service/impl/AttachmentServiceImpl.java +++ b/platform-support/src/main/java/tech/abc/platform/support/service/impl/AttachmentServiceImpl.java @@ -1,6 +1,10 @@ package tech.abc.platform.support.service.impl; import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import io.minio.GetPresignedObjectUrlArgs; +import io.minio.MinioClient; +import io.minio.errors.*; +import io.minio.http.Method; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FilenameUtils; @@ -18,7 +22,10 @@ import tech.abc.platform.support.entity.Attachment; import tech.abc.platform.support.mapper.AttachmentMapper; import tech.abc.platform.support.service.AttachmentService; +import java.io.IOException; import java.io.InputStream; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -35,6 +42,8 @@ public class AttachmentServiceImpl extends BaseServiceImpl5.1.0 2.3.0.RELEASE 1.8 - 2.0.1 UTF-8 UTF-8 + 7.10.2 - jakarta.json - jakarta.json-api - ${jakartajson.version} + org.elasticsearch + elasticsearch + ${elasticsearch.version} + + + org.elasticsearch.client + elasticsearch-rest-high-level-client + ${elasticsearch.version} @@ -70,6 +75,12 @@ ${springboot.version} pom import + + + org.elasticsearch + elasticsearch + +