diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 8c79619..38b5a2f 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -10,7 +10,7 @@ import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
*
* @author ruoyi
*/
-@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class , MongoAutoConfiguration.class})
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class RuoYiApplication
{
public static void main(String[] args)
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/Test.java b/ruoyi-admin/src/main/java/com/ruoyi/Test.java
deleted file mode 100644
index 3437020..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/Test.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.ruoyi;
-
-import com.ruoyi.biemo.nlp.NamedEntity;
-
-public class Test {
-
- public static void main(String[] args) throws Exception {
- String text = "巴拉克·奥巴马是美国总统。他在2008年当选?今年的美国总统是特朗普?普京的粉丝";
- //System.out.println(new Segmentation(text).getSegtext());
- //System.out.println(new SPTree(text).getPrasetext());
- System.out.println(new NamedEntity(text).getNertext());
- }
-}
diff --git a/ruoyi-admin/src/main/resources/application-druid.yml b/ruoyi-admin/src/main/resources/application-druid.yml
index beaff32..b657e60 100644
--- a/ruoyi-admin/src/main/resources/application-druid.yml
+++ b/ruoyi-admin/src/main/resources/application-druid.yml
@@ -1,8 +1,18 @@
# 数据源配置
spring:
+ data:
+ mongodb:
+ #uri: mongodb://${mongo.servers:47.107.244.115}:${mongo.port:27017}/${mongo.db:makesoft}
+ database: makesoft
+ host: 47.107.244.115
+ port: 27017
+ username: makesoft
+ password: makesoft
+ #authentication-database: admin
+ #uri: mongodb://admin:123456@47.107.244.115:27017/learning?authSource=admin
elasticsearch:
rest:
- uris: http://59.110.45.20:10000
+ uris: http://47.107.244.115:9200
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
diff --git a/ruoyi-biemo/pom.xml b/ruoyi-biemo/pom.xml
index 1e1bca9..7287351 100644
--- a/ruoyi-biemo/pom.xml
+++ b/ruoyi-biemo/pom.xml
@@ -26,27 +26,6 @@
com.ruoyi
ruoyi-common
-
-
- edu.stanford.nlp
- stanford-corenlp
- ${corenlp.version}
-
-
-
- edu.stanford.nlp
- stanford-corenlp
- ${corenlp.version}
- models
-
-
-
- edu.stanford.nlp
- stanford-corenlp
- ${corenlp.version}
- models-chinese
-
-
org.springframework.boot
spring-boot-starter-data-mongodb
@@ -56,11 +35,6 @@
hutool-all
${huTool.version}
-
- org.elasticsearch.client
- elasticsearch-rest-client
- 7.9.3
-
org.elasticsearch.client
elasticsearch-rest-high-level-client
@@ -70,11 +44,6 @@
org.springframework.boot
spring-boot-starter-data-elasticsearch
-
- org.elasticsearch
- elasticsearch
- 7.9.3
-
org.projectlombok
lombok
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
index 23b43f4..bae4bb1 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/controller/TestESController.java
@@ -27,8 +27,8 @@ public class TestESController {
}
@GetMapping(value = "/get")
- public List get() {
- return testService.search(new SearchSourceBuilder());
+ public List get(String keyword) {
+ return testService.match(keyword);
}
@GetMapping(value = "/test111")
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
index e4f95da..aa3c9e7 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/entity/Topic.java
@@ -25,6 +25,4 @@ public class Topic {
private String answer;
private String three;
private String checkvalue;
-
-
}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
index 6b092a9..fc6fdac 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/service/TestService.java
@@ -1,11 +1,18 @@
package com.ruoyi.biemo.elasticsearch.service;
+import com.github.pagehelper.util.StringUtil;
import com.ruoyi.biemo.elasticsearch.entity.Topic;
import com.ruoyi.biemo.elasticsearch.util.EsService;
+import com.ruoyi.biemo.mongodb.utils.MongoHelper;
import org.elasticsearch.common.unit.Fuzziness;
+import org.elasticsearch.common.xcontent.XContentBuilder;
+import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.springframework.stereotype.Service;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
/**
* @author zcw
@@ -21,12 +28,34 @@ public class TestService extends EsService {
return topics;
}
- public List match() {
- return esLambdaQuery().fuzzyAll(Topic::getContent, Fuzziness.TWO, "abc").query();
+ public List match(String keyword) {
+ return esLambdaQuery().fuzzyAll(Topic::getContent, Fuzziness.TWO, keyword).query();
}
public void delete() {
esLambdaQuery().eq(Topic::getId,1).delete();
}
+ @Override
+ public XContentBuilder buildMappingContext() {
+ return null;
+ }
+
+ @Override
+ protected Topic loadData(SearchSourceBuilder context, SearchHit hit) {
+ String id = hit.getId();
+ if (Objects.isNull(id) || StringUtil.isEmpty(id)) return null;
+ return new MongoHelper().findById(id,Topic.class);
+ }
+
+ @Override
+ public List batchLoadData(SearchSourceBuilder context, SearchHit[] hitArr) {
+ List ids = new ArrayList<>();
+ for(SearchHit hit:hitArr){
+ String id = hit.getId();
+ if (Objects.isNull(id) || StringUtil.isEmpty(id)) continue;
+ ids.add(id);
+ }
+ return new MongoHelper().findListByIds(ids,Topic.class);
+ }
}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java
index 927a2b4..d83a6b9 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/elasticsearch/util/EsService.java
@@ -1,41 +1,68 @@
package com.ruoyi.biemo.elasticsearch.util;
import com.alibaba.fastjson.JSON;
+import com.github.pagehelper.Page;
import com.ruoyi.biemo.elasticsearch.annotation.EsId;
import com.ruoyi.biemo.elasticsearch.function.GFunction;
+import com.ruoyi.common.exception.CustomException;
+import com.ruoyi.common.exception.ServiceException;
import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
+import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
+import org.elasticsearch.client.indices.CreateIndexRequest;
+import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
+import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.Fuzziness;
+import org.elasticsearch.common.unit.TimeValue;
+import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.SearchHit;
+import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.annotations.Document;
+import java.io.IOException;
import java.lang.reflect.*;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
/**
- * @author zcw
+ * @author hjb
* @version 1.0
- * @date 2021/1/14 10:47
+ * @date 2022/8/30 10:47
*/
public abstract class EsService {
+ protected Logger logger = LoggerFactory.getLogger(getClass());
+
+ // ES 默认最大返回 10000 与 scroll查询有关
+ int MAX_RESULT_WINDOW = 10000;
+ // 批量构建时的每次从数据库查询数量
+ int BATCH_SIZE = 1000;
+ // 加载数据超过200 时用批量加载 减少数据库连接
+ int BATCH_LOAD_SIZE = 200;
+ // ES 滚动查询 有效时间 与 scroll查询有关
+ TimeValue SCROLL_TIME = TimeValue.timeValueMinutes(1);
@Autowired
private RestHighLevelClient client;
@@ -45,6 +72,28 @@ public abstract class EsService {
private Method getId;
+ // 构建ES 中的mapping
+ public abstract XContentBuilder buildMappingContext();
+
+ protected abstract T loadData(SearchSourceBuilder context,SearchHit hit);
+
+ /**
+ * 批量加载数据
+ * @param context
+ * @param hitArr
+ * @return
+ */
+ public abstract List batchLoadData(SearchSourceBuilder context,SearchHit[] hitArr);
+
+
+ /**
+ * 索引设置
+ */
+ protected Settings.Builder createSettings(int shards, int replicas){
+ // 设置分片数和副本数
+ return Settings.builder().put("index.number_of_shards", shards).put("index.number_of_replicas", replicas);
+ }
+
protected EsService() {
Type type = this.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
@@ -70,6 +119,49 @@ public abstract class EsService {
}
}
+ /**
+ * 创建 Index
+ * @param shards 分片数
+ * @param replicas 备份数
+ * @param rebuild 是否重建
+ * @param indexName 索引名称
+ * @return
+ */
+ protected boolean createIndex(int shards, int replicas, boolean rebuild,String indexName){
+ boolean result = false;
+ try {
+ // 根据索引名称判断是否存在
+ result = client.indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
+ } catch (IOException e) {
+ logger.error("检查索引是否存在错误,请检查索引服务是否启动!,错误如下:{}",e);
+ throw new CustomException("检查索引是否存在错误",e);
+ }
+ if (result && rebuild){
+ try {
+ // 索引存在且重建 则先删除
+ client.indices().delete(new DeleteIndexRequest(indexName), RequestOptions.DEFAULT);
+ } catch (IOException e) {
+ logger.error("删除索引错误,请检查索引服务是否启动!",e);
+ throw new CustomException("删除索引错误",e);
+ }
+ }
+
+ CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
+ // 设置分片数和副本数
+ createIndexRequest.settings(createSettings(shards,replicas));
+ try {
+ // 构建对应index的mapping
+ createIndexRequest.mapping(buildMappingContext());
+ // 发送创建index的请求
+ CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest,RequestOptions.DEFAULT);
+ result = createIndexResponse.isAcknowledged();
+ }catch (IOException e) {
+ logger.error("创建索引出错,错误如下:{}",e);
+ throw new CustomException("创建索引出错",e);
+ }
+ return result;
+ }
+
public boolean indexExist() throws Exception {
GetIndexRequest request = new GetIndexRequest(index);
request.local(false);
@@ -123,7 +215,6 @@ public abstract class EsService {
throw new RuntimeException(e);
}
}
-
public List search(SearchSourceBuilder builder) {
SearchRequest request = new SearchRequest(index);
request.source(builder);
@@ -140,6 +231,228 @@ public abstract class EsService {
}
}
+ //分页查询 根据需要返回自定义加载数据 比如从mongodb mysql 等
+ public Page searchPage(SearchSourceBuilder builder,boolean searchFrom) {
+ try {
+ List content = new ArrayList<>();
+ Long total = search(content,builder);
+ List res = new ArrayList<>();
+ if(searchFrom){
+ res = sequenceLoadData(content);
+ }else{
+ res = esLoadData(content);
+ }
+ Page page=new Page(builder.from(),builder.size());
+ page.addAll(res);
+ page.setTotal(total);
+ return page;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ protected List sequenceLoadData(List content){
+ return content.stream().map(x -> loadData(null, x)).filter(x -> x != null).collect(Collectors.toList());
+ }
+ protected List esLoadData(List content){
+ return content.stream().map(x -> JSON.parseObject(x.getSourceAsString(), entity)).filter(x -> x != null).collect(Collectors.toList());
+ }
+ protected long search(List content, SearchSourceBuilder searchSourceBuilder){
+ // 用于判断 是否 返回所有数据
+ boolean flag = true;
+ // 总数量
+ long total = 0;
+ // 分页大小
+ int pageSize = searchSourceBuilder.size();
+ // 分页页码
+ int pageNo = searchSourceBuilder.from();
+ //
+ int from = pageNo<0 ? 0 : (pageNo - 1) * pageSize;
+ // 待查询页面内第一条记录的下标
+ int firstRowNum = from + 1 ;
+ // 最后一行
+ int lastRowNum = from + pageSize;
+ // 创建查询请求
+ SearchRequest searchRequest = new SearchRequest(index);
+ // 构建SearchSourceBuilder
+ searchRequest.source(searchSourceBuilder);
+ // 不分页 最多返回10000条
+ if(pageNo==0 && pageSize==0){
+ searchSourceBuilder.from(0).size(MAX_RESULT_WINDOW);
+ }else{
+ // 分页
+ // 小于 MAX_RESULT_WINDOW 10000
+ if(lastRowNum<=MAX_RESULT_WINDOW){
+ searchSourceBuilder.from(from).size(pageSize);
+ flag = false;
+ }
+ }
+ SearchResponse searchResponse;
+ try {
+ // 查询数据超过第10000
+ if (lastRowNum > MAX_RESULT_WINDOW) {
+ // 滚动搜索
+ total = searchScroll(content,firstRowNum,lastRowNum,searchSourceBuilder,searchRequest);
+ }else{
+ searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+ SearchHits hits = searchResponse.getHits();
+ total = hits.getTotalHits().value;
+ // 不分页情况下 总条数超过10000
+ if(total>MAX_RESULT_WINDOW&&flag){
+ searchScroll(content,firstRowNum,(int)total,searchSourceBuilder,searchRequest);
+ }else{
+ content = loadDataByResponse(content, searchResponse);
+ }
+ }
+ } catch (IOException e) {
+ logger.error("查询索引错误,错误如下:{}",e);
+ throw new CustomException("查询索引出错",e);
+ }
+ return total;
+ }
+
+
+ /**
+ * 通过响应加载hit数据
+ * @param searchHitList
+ * @param searchResponse
+ * @return
+ */
+ private List loadDataByResponse(List searchHitList, SearchResponse searchResponse) {
+ SearchHits hits = searchResponse.getHits();
+ // 条数过多 批量加载 减少数据库连接
+ SearchHit[] hitArr = hits.getHits();
+ if(Objects.nonNull(hitArr)&&hitArr.length>=BATCH_LOAD_SIZE){
+ searchHitList.addAll(Arrays.asList(hitArr));
+ }else{
+ //逐条加载
+ for (SearchHit hit : hitArr) {
+
+ String id=hit.getId();
+ if (StringUtils.isBlank(id)){
+ continue;
+ }
+ searchHitList.add(hit);
+ }
+ }
+ return searchHitList;
+ }
+
+
+ /**
+ * scroll 查询 返回总条数
+ * @param searchHitList
+ * @param firstRowNum
+ * @param lastRowNum
+ * @param searchSourceBuilder
+ * @param searchRequest
+ * @return
+ */
+ private long searchScroll(List searchHitList,int firstRowNum,int lastRowNum,SearchSourceBuilder searchSourceBuilder,SearchRequest searchRequest){
+ long total = 0L;
+ SearchResponse searchResponse;
+ // 初始位置
+ int startPosition;
+ // 结束位置
+ int endPosition;
+ // 页面大小
+ int pageSize = lastRowNum-firstRowNum+1;
+ // 第一条数据所在滚动指针
+ int firstScrollCursor = firstRowNum/MAX_RESULT_WINDOW;
+ // 最后一条数据所在指针
+ int lastScrollCursor = lastRowNum/MAX_RESULT_WINDOW;
+ // 滚动次数
+ int scrollCount = 0;
+ // 滚动id
+ String scrollId;
+ try {
+ searchSourceBuilder.size(MAX_RESULT_WINDOW);
+ searchRequest.scroll(SCROLL_TIME);
+ // scroll 查询 获取前10000 条数据和scrollId
+ searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
+ SearchHits hits = searchResponse.getHits();
+ total = hits.getTotalHits().value;
+ // 1分钟 内的scrollId 第一次
+ scrollId = searchResponse.getScrollId();
+ // 部分数据在10000 以内 先获取一部分
+ if(firstRowNum0?firstRowNum - scrollCount*MAX_RESULT_WINDOW:0;
+ endPosition = lastRowNum-scrollCount*MAX_RESULT_WINDOW>MAX_RESULT_WINDOW?MAX_RESULT_WINDOW:lastRowNum-scrollCount*MAX_RESULT_WINDOW;
+ loopLoadDataByPosition(searchHitList, startPosition, endPosition, hits);
+ }
+ if(StringUtils.isNotEmpty(scrollId)){
+ // 指针还没有到最后的指针
+ while (scrollCount=firstScrollCursor){
+ // 从hits取对应数据 剩余容量
+ int capacity = pageSize-searchHitList.size();
+ if(capacity>0){
+ hits = searchResponse.getHits();
+ // 命中数量
+ int hitCount = hits.getHits().length;
+ startPosition = firstRowNum - scrollCount*MAX_RESULT_WINDOW>0?firstRowNum - scrollCount*MAX_RESULT_WINDOW:0;
+ endPosition = lastRowNum-scrollCount*MAX_RESULT_WINDOW>MAX_RESULT_WINDOW?MAX_RESULT_WINDOW:lastRowNum-scrollCount*MAX_RESULT_WINDOW;
+ // 超过命中次数 取命中次数
+ endPosition = endPosition>hitCount?hitCount:endPosition;
+ if(scrollCount==firstScrollCursor)
+ startPosition--;
+ if(firstScrollCursor!=lastScrollCursor&&scrollCount==lastScrollCursor)
+ endPosition=capacity>MAX_RESULT_WINDOW?MAX_RESULT_WINDOW:capacity-startPosition;
+ loopLoadDataByPosition(searchHitList, startPosition, endPosition, hits);
+ }
+ }
+
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return total;
+ }
+
+
+ /**
+ * 滚动搜索
+ * @param scrollId 滚动Id
+ * @return
+ * @throws IOException
+ */
+ protected SearchResponse searchScroll(String scrollId) throws IOException {
+ SearchScrollRequest searchScrollRequest = new SearchScrollRequest(scrollId);
+ searchScrollRequest.scroll(SCROLL_TIME);
+ return client.scroll(searchScrollRequest, RequestOptions.DEFAULT);
+ }
+
+
+ /**
+ * 循环批量加载数据
+ * @param context
+ * @param startPosition
+ * @param endPosition
+ * @param hits
+ */
+ private List loopLoadDataByPosition( SearchSourceBuilder context, int startPosition, int endPosition, SearchHits hits) {
+ int length = hits.getHits().length;
+ int destLength = endPosition-startPosition;
+ destLength = destLength>length?length:destLength;
+ SearchHit[] hitArr = new SearchHit[destLength];
+ System.arraycopy(hits.getHits(),startPosition,hitArr,0,hitArr.length);
+ return batchLoadData(context,hitArr);
+ }
+ private List loopLoadDataByPosition(List searchHitList, int startPosition, int endPosition, SearchHits hits) {
+ int length = hits.getHits().length;
+ int destLength = endPosition-startPosition;
+ destLength = destLength>length?length:destLength;
+ SearchHit[] hitArr = new SearchHit[destLength];
+ System.arraycopy(hits.getHits(),startPosition,hitArr,0,hitArr.length);
+ searchHitList.addAll(Arrays.asList(hitArr));
+ return searchHitList;
+ }
+
public void deleteIndex() {
try {
client.indices().delete(new DeleteIndexRequest(index), RequestOptions.DEFAULT);
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
index 960d489..9832135 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/MongoConverterConfig.java
@@ -1,36 +1,36 @@
-//package com.ruoyi.biemo.mongodb.config;
-//
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.data.mongodb.MongoDatabaseFactory;
-//import org.springframework.data.mongodb.core.convert.DbRefResolver;
-//import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
-//import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
-//import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
-//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-//
-///**
-// * 配置去掉_class字段
-// *
-// * @author 陈钇蒙
-// *
-// */
-//@Configuration
-//public class MongoConverterConfig {
-// @Autowired
-// private MongoDatabaseFactory mongoDatabaseFactory;
-//
-// @Autowired
-// private MongoMappingContext mongoMappingContext;
-//
-// @Bean
-// public MappingMongoConverter mappingMongoConverter() {
-// DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
-// MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
-// // 此处是去除插入数据库的 _class 字段
-// converter.setTypeMapper(new DefaultMongoTypeMapper(null));
-//
-// return converter;
-// }
-//}
+package com.ruoyi.biemo.mongodb.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.mongodb.MongoDatabaseFactory;
+import org.springframework.data.mongodb.core.convert.DbRefResolver;
+import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
+import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
+import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
+import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+
+/**
+ * 配置去掉_class字段
+ *
+ * @author 陈钇蒙
+ *
+ */
+@Configuration
+public class MongoConverterConfig {
+ @Autowired
+ private MongoDatabaseFactory mongoDatabaseFactory;
+
+ @Autowired
+ private MongoMappingContext mongoMappingContext;
+
+ @Bean
+ public MappingMongoConverter mappingMongoConverter() {
+ DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory);
+ MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
+ // 此处是去除插入数据库的 _class 字段
+ converter.setTypeMapper(new DefaultMongoTypeMapper(null));
+
+ return converter;
+ }
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
index 35ae542..7612ef9 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/config/ScanNewField.java
@@ -1,120 +1,120 @@
-//package com.ruoyi.biemo.mongodb.config;
-//
-//import java.lang.reflect.Field;
-//import java.util.Set;
-//
-//import javax.annotation.PostConstruct;
-//
-//import com.ruoyi.biemo.mongodb.bean.IgnoreDocument;
-//import com.ruoyi.biemo.mongodb.bean.InitValue;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.data.mongodb.core.MongoTemplate;
-//import org.springframework.data.mongodb.core.index.IndexOperations;
-//import org.springframework.data.mongodb.core.index.IndexResolver;
-//import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
-//import org.springframework.data.mongodb.core.mapping.Document;
-//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-//import org.springframework.data.mongodb.core.query.Criteria;
-//import org.springframework.data.mongodb.core.query.Query;
-//import org.springframework.data.mongodb.core.query.Update;
-//import org.springframework.stereotype.Service;
-//
-//import com.mongodb.client.result.UpdateResult;
-//
-//import com.ruoyi.biemo.mongodb.utils.PackageUtil;
-//import cn.hutool.core.util.ClassUtil;
-//import cn.hutool.core.util.ReflectUtil;
-//
-///**
-// * 启动时将表初始化
-// *
-// */
-//@Service
-//public class ScanNewField {
-// @Autowired
-// PackageUtil packageUtil;
-// // 写链接(写到主库,可使用事务)
-// @Autowired
-// private MongoTemplate mongoTemplate;
-//
-// @Autowired
-// MongoMappingContext mongoMappingContext;
-//
-// @PostConstruct
-// public void scan() {
-// // 找到主程序包
-// Set> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-// for (Class> clazz : set) {
-// IgnoreDocument ignoreDocument = clazz.getAnnotation(IgnoreDocument.class);
-// if (ignoreDocument != null) {
-// continue;
-// }
-//
-// Document document = clazz.getAnnotation(Document.class);
-// if (document == null) {
-// continue;
-// }
-//
-// // 创建表
-// if (!mongoTemplate.collectionExists(clazz)) {
-// mongoTemplate.createCollection(clazz);
-// System.out.println("创建了" + clazz.getSimpleName() + "表");
-// }
-//
-// // 创建索引
-// IndexOperations indexOps = mongoTemplate.indexOps(clazz);
-// IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
-// resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
-//
-// Field[] fields = ReflectUtil.getFields(clazz);
-// for (Field field : fields) {
-// // 获取注解
-// if (field.isAnnotationPresent(InitValue.class)) {
-// InitValue initValue = field.getAnnotation(InitValue.class);
-// if (initValue.value() != null) {
-//
-// // 更新表默认值
-// Query query = new Query();
-// query.addCriteria(Criteria.where(field.getName()).is(null));
-//
-// Long count = mongoTemplate.count(query, clazz);
-// if (count > 0) {
-// Object value = null;
-// Class> type = field.getType();
-//
-// if (type.equals(String.class)) {
-// value = initValue.value();
-// }
-// if (type.equals(Short.class)) {
-// value = Short.parseShort(initValue.value());
-// }
-// if (type.equals(Integer.class)) {
-// value = Integer.parseInt(initValue.value());
-// }
-// if (type.equals(Long.class)) {
-// value = Long.parseLong(initValue.value());
-// }
-// if (type.equals(Float.class)) {
-// value = Float.parseFloat(initValue.value());
-// }
-// if (type.equals(Double.class)) {
-// value = Double.parseDouble(initValue.value());
-// }
-// if (type.equals(Boolean.class)) {
-// value = Boolean.parseBoolean(initValue.value());
-// }
-//
-// Update update = new Update().set(field.getName(), value);
-// UpdateResult updateResult = mongoTemplate.updateMulti(query, update, clazz);
-//
-// System.out.println(clazz.getSimpleName() + "表更新了" + updateResult.getModifiedCount() + "条默认值");
-// }
-// }
-// }
-//
-// }
-//
-// }
-// }
-//
-//}
+package com.ruoyi.biemo.mongodb.config;
+
+import java.lang.reflect.Field;
+import java.util.Set;
+
+import javax.annotation.PostConstruct;
+
+import com.ruoyi.biemo.mongodb.bean.IgnoreDocument;
+import com.ruoyi.biemo.mongodb.bean.InitValue;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.index.IndexOperations;
+import org.springframework.data.mongodb.core.index.IndexResolver;
+import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexResolver;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.stereotype.Service;
+
+import com.mongodb.client.result.UpdateResult;
+
+import com.ruoyi.biemo.mongodb.utils.PackageUtil;
+import cn.hutool.core.util.ClassUtil;
+import cn.hutool.core.util.ReflectUtil;
+
+/**
+ * 启动时将表初始化
+ *
+ */
+@Service
+public class ScanNewField {
+ @Autowired
+ PackageUtil packageUtil;
+ // 写链接(写到主库,可使用事务)
+ @Autowired
+ private MongoTemplate mongoTemplate;
+
+ @Autowired
+ MongoMappingContext mongoMappingContext;
+
+ @PostConstruct
+ public void scan() {
+ // 找到主程序包
+ Set> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
+ for (Class> clazz : set) {
+ IgnoreDocument ignoreDocument = clazz.getAnnotation(IgnoreDocument.class);
+ if (ignoreDocument != null) {
+ continue;
+ }
+
+ Document document = clazz.getAnnotation(Document.class);
+ if (document == null) {
+ continue;
+ }
+
+ // 创建表
+ if (!mongoTemplate.collectionExists(clazz)) {
+ mongoTemplate.createCollection(clazz);
+ System.out.println("创建了" + clazz.getSimpleName() + "表");
+ }
+
+ // 创建索引
+ IndexOperations indexOps = mongoTemplate.indexOps(clazz);
+ IndexResolver resolver = new MongoPersistentEntityIndexResolver(mongoMappingContext);
+ resolver.resolveIndexFor(clazz).forEach(indexOps::ensureIndex);
+
+ Field[] fields = ReflectUtil.getFields(clazz);
+ for (Field field : fields) {
+ // 获取注解
+ if (field.isAnnotationPresent(InitValue.class)) {
+ InitValue initValue = field.getAnnotation(InitValue.class);
+ if (initValue.value() != null) {
+
+ // 更新表默认值
+ Query query = new Query();
+ query.addCriteria(Criteria.where(field.getName()).is(null));
+
+ Long count = mongoTemplate.count(query, clazz);
+ if (count > 0) {
+ Object value = null;
+ Class> type = field.getType();
+
+ if (type.equals(String.class)) {
+ value = initValue.value();
+ }
+ if (type.equals(Short.class)) {
+ value = Short.parseShort(initValue.value());
+ }
+ if (type.equals(Integer.class)) {
+ value = Integer.parseInt(initValue.value());
+ }
+ if (type.equals(Long.class)) {
+ value = Long.parseLong(initValue.value());
+ }
+ if (type.equals(Float.class)) {
+ value = Float.parseFloat(initValue.value());
+ }
+ if (type.equals(Double.class)) {
+ value = Double.parseDouble(initValue.value());
+ }
+ if (type.equals(Boolean.class)) {
+ value = Boolean.parseBoolean(initValue.value());
+ }
+
+ Update update = new Update().set(field.getName(), value);
+ UpdateResult updateResult = mongoTemplate.updateMulti(query, update, clazz);
+
+ System.out.println(clazz.getSimpleName() + "表更新了" + updateResult.getModifiedCount() + "条默认值");
+ }
+ }
+ }
+
+ }
+
+ }
+ }
+
+}
diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
index c022292..1309f97 100644
--- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
+++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/ImportExportUtil.java
@@ -1,137 +1,137 @@
-//package com.ruoyi.biemo.mongodb.utils;
-//
-//import java.io.BufferedReader;
-//import java.io.File;
-//import java.util.ArrayList;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Set;
-//
-//import com.ruoyi.biemo.mongodb.bean.Page;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.beans.factory.annotation.Value;
-//import org.springframework.boot.autoconfigure.SpringBootApplication;
-//import org.springframework.context.ApplicationContext;
-//import org.springframework.data.mongodb.core.MongoTemplate;
-//import org.springframework.data.mongodb.core.mapping.Document;
-//import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
-//import org.springframework.stereotype.Service;
-//
-//import cn.hutool.core.io.FileUtil;
-//import cn.hutool.core.io.IoUtil;
-//import cn.hutool.core.util.ClassUtil;
-//import cn.hutool.core.util.StrUtil;
-//import cn.hutool.core.util.ZipUtil;
-//import cn.hutool.json.JSONArray;
-//import cn.hutool.json.JSONObject;
-//import cn.hutool.json.JSONUtil;
-//
-///**
-// * 数据库导入导出工具
-// *
-// */
-//@Service
-//public class ImportExportUtil {
-// // 写链接(写到主库,可使用事务)
-// @Autowired
-// private MongoTemplate mongoTemplate;
-//
-// @Autowired
-// private MongoHelper mongoHelper;
-//
-// @Autowired
-// PackageUtil packageUtil;
-// public void exportDb(String path) {
-// path = path.replace(".zip", "");
-// FileUtil.del(path);
-// FileUtil.del(path + ".zip");
-// try {
-//
-// // 找到主程序包
-// Set> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-// Page page = new Page();
-// page.setLimit(1000);
-//
-// for (Class> clazz : set) {
-// Document document = clazz.getAnnotation(Document.class);
-// if (document == null) {
-// continue;
-// }
-//
-// page.setCurr(1);
-// while (true) {
-// page = mongoHelper.findPage(page, clazz);
-// if (page.getList().size() == 0) {
-// break;
-// }
-//
-// List lines = new ArrayList();
-// for (Object object : page.getList()) {
-// lines.add(JSONUtil.toJsonStr(object));
-// }
-// FileUtil.appendLines(lines, path + File.separator + clazz.getSimpleName() + ".json", "UTF-8");
-// System.out.println(clazz.getSimpleName() + "表导出了" + page.getList().size() + "条数据");
-// page.setCurr(page.getCurr() + 1);
-// }
-// }
-// ZipUtil.zip(path);
-//
-// } catch (Exception e) {
-// e.printStackTrace();
-// FileUtil.del(path + ".zip");
-// }
-//
-// FileUtil.del(path);
-// }
-//
-// public void importDb(String path) {
-// if (!FileUtil.exist(path)) {
-// System.out.println(path + "文件不存在");
-// return;
-// }
-// BufferedReader reader = null;
-//
-// path = path.replace(".zip", "");
-// FileUtil.del(path);
-// ZipUtil.unzip(path + ".zip");
-// try {
-//
-// // 找到主程序包
-// Set> set = ClassUtil.scanPackage(packageUtil.getMainPackage());
-// for (Class> clazz : set) {
-// Document document = clazz.getAnnotation(Document.class);
-// if (document == null) {
-// continue;
-// }
-//
-// File file = new File(path + File.separator + clazz.getSimpleName() + ".json");
-// if (file.exists()) {
-// mongoTemplate.dropCollection(clazz);
-//
-// reader = FileUtil.getReader(file, "UTF-8");
-// List