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 list = new ArrayList(); -// while (true) { -// String json = reader.readLine(); -// if (StrUtil.isEmpty(json)) { -// mongoTemplate.insertAll(list); -// System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据"); -// list.clear(); -// break; -// } -// list.add(JSONUtil.toBean(json, clazz)); -// if (list.size() == 1000) { -// mongoTemplate.insertAll(list); -// System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据"); -// list.clear(); -// } -// } -// } -// } -// } catch (Exception e) { -// e.printStackTrace(); -// } finally { -// IoUtil.close(reader); -// } -// FileUtil.del(path); -// } -//} +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 list = new ArrayList(); + while (true) { + String json = reader.readLine(); + if (StrUtil.isEmpty(json)) { + mongoTemplate.insertAll(list); + System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据"); + list.clear(); + break; + } + list.add(JSONUtil.toBean(json, clazz)); + if (list.size() == 1000) { + mongoTemplate.insertAll(list); + System.out.println(clazz.getSimpleName() + "表导入了" + list.size() + "条数据"); + list.clear(); + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + IoUtil.close(reader); + } + FileUtil.del(path); + } +} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java index ec3dfd3..a6f7be8 100644 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java +++ b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/mongodb/utils/MongoHelper.java @@ -1,967 +1,967 @@ -//package com.ruoyi.biemo.mongodb.utils; -// -//import java.lang.reflect.Field; -//import java.util.ArrayList; -//import java.util.Arrays; -//import java.util.Collection; -//import java.util.Date; -//import java.util.HashSet; -//import java.util.List; -//import java.util.Set; -// -//import javax.annotation.PostConstruct; -// -//import com.ruoyi.biemo.mongodb.bean.*; -//import com.ruoyi.biemo.mongodb.config.Constant; -//import com.ruoyi.biemo.mongodb.reflection.ReflectionUtil; -//import com.ruoyi.biemo.mongodb.reflection.SerializableFunction; -//import org.bson.Document; -//import org.slf4j.Logger; -//import org.slf4j.LoggerFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.beans.factory.annotation.Value; -//import org.springframework.data.domain.Sort.Direction; -//import org.springframework.data.mongodb.core.MongoTemplate; -//import org.springframework.data.mongodb.core.convert.MongoConverter; -//import org.springframework.data.mongodb.core.convert.QueryMapper; -//import org.springframework.data.mongodb.core.convert.UpdateMapper; -//import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; -//import org.springframework.data.mongodb.core.query.Query; -//import org.springframework.stereotype.Service; -//import cn.hutool.core.bean.BeanUtil; -//import cn.hutool.core.date.DateUtil; -//import cn.hutool.core.util.ReflectUtil; -//import cn.hutool.core.util.StrUtil; -//import cn.hutool.json.JSONObject; -//import cn.hutool.json.JSONUtil; -// -///** -// * mongodb操作器 -// * -// */ -//@Service("mongoHelper") -//public class MongoHelper { -// Logger logger = LoggerFactory.getLogger(this.getClass()); -// -// @Autowired -// protected MongoConverter mongoConverter; -// -// protected QueryMapper queryMapper; -// protected UpdateMapper updateMapper; -// -// @Autowired -// protected MongoTemplate mongoTemplate; -// -// public MongoTemplate getMongoTemplate() { -// return mongoTemplate; -// } -// -// @Value("${spring.data.mongodb.print:false}") -// protected Boolean print; -// -// @Value("${spring.data.mongodb.slowQuery:false}") -// protected Boolean slowQuery; -// -// @Value("${spring.data.mongodb.slowTime:1000}") -// protected Long slowTime; -// -// @PostConstruct -// public void init() { -// queryMapper = new QueryMapper(mongoConverter); -// updateMapper = new UpdateMapper(mongoConverter); -// } -// -// private void insertSlowQuery(String log, Long queryTime) { -// if (slowQuery) { -// SlowQuery slowQuery = new SlowQuery(); -// slowQuery.setQuery(log); -// slowQuery.setTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); -// slowQuery.setQueryTime(queryTime); -// slowQuery.setSystem(SystemTool.getSystem()); -// StackTraceElement stack[] = Thread.currentThread().getStackTrace(); -// -// // 保存堆栈 -// String stackStr = ""; -// for (int i = 0; i < stack.length; i++) { -// stackStr += stack[i].getClassName() + "." + stack[i].getMethodName() + ":" + stack[i].getLineNumber() + "\n"; -// } -// slowQuery.setStack(stackStr); -// -// mongoTemplate.insert(slowQuery); -// } -// } -// -// /** -// * 打印查询语句 -// * -// * @param query -// */ -// private void logQuery(Class clazz, Query query, Long startTime) { -// -// MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); -// Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); -// Document mappedField = queryMapper.getMappedObject(query.getFieldsObject(), entity); -// Document mappedSort = queryMapper.getMappedObject(query.getSortObject(), entity); -// -// String log = "\ndb." + getCollectionName(clazz) + ".find("; -// -// log += FormatUtils.bson(mappedQuery.toJson()) + ")"; -// -// if (!query.getFieldsObject().isEmpty()) { -// log += ".projection("; -// log += FormatUtils.bson(mappedField.toJson()) + ")"; -// } -// -// if (query.isSorted()) { -// log += ".sort("; -// log += FormatUtils.bson(mappedSort.toJson()) + ")"; -// } -// -// if (query.getLimit() != 0l) { -// log += ".limit(" + query.getLimit() + ")"; -// } -// -// if (query.getSkip() != 0l) { -// log += ".skip(" + query.getSkip() + ")"; -// } -// log += ";"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// -// } -// -// private String getCollectionName(Class clazz) { -// org.springframework.data.mongodb.core.mapping.Document document = clazz.getAnnotation(org.springframework.data.mongodb.core.mapping.Document.class); -// if (document != null) { -// if (StrUtil.isNotEmpty(document.value())) { -// return document.value(); -// } -// if (StrUtil.isNotEmpty(document.collection())) { -// return document.collection(); -// } -// } -// -// return StrUtil.lowerFirst(clazz.getSimpleName()); -// } -// -// /** -// * 打印查询语句 -// * -// * @param query -// */ -// private void logCount(Class clazz, Query query, Long startTime) { -// -// MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); -// Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); -// -// String log = "\ndb." + getCollectionName(clazz) + ".find("; -// log += FormatUtils.bson(mappedQuery.toJson()) + ")"; -// log += ".count();"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// -// } -// -// /** -// * 打印查询语句 -// * -// * @param query -// */ -// private void logDelete(Class clazz, Query query, Long startTime) { -// -// MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); -// Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); -// -// String log = "\ndb." + getCollectionName(clazz) + ".remove("; -// log += FormatUtils.bson(mappedQuery.toJson()) + ")"; -// log += ";"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// -// } -// -// /** -// * 打印查询语句 -// * -// * @param query -// */ -// private void logUpdate(Class clazz, Query query, UpdateBuilder updateBuilder, boolean multi, Long startTime) { -// -// MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); -// Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); -// Document mappedUpdate = updateMapper.getMappedObject(updateBuilder.toUpdate().getUpdateObject(), entity); -// -// String log = "\ndb." + getCollectionName(clazz) + ".update("; -// log += FormatUtils.bson(mappedQuery.toJson()) + ","; -// log += FormatUtils.bson(mappedUpdate.toJson()) + ","; -// log += FormatUtils.bson("{multi:" + multi + "})"); -// log += ";"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// -// } -// -// /** -// * 打印查询语句 -// * -// * @param object -// * -// * @param query -// */ -// private void logSave(Object object, Long startTime, Boolean isInsert) { -// JSONObject jsonObject = JSONUtil.parseObj(object); -// -// if (isInsert) { -// jsonObject.remove(Constant.ID); -// } -// -// String log = "\ndb." + getCollectionName(object.getClass()) + ".save("; -// log += JSONUtil.toJsonPrettyStr(jsonObject); -// log += ");"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// } -// -// /** -// * 打印查询语句 -// * -// * @param object -// * -// * @param query -// */ -// private void logSave(List list, Long startTime) { -// List cloneList = new ArrayList<>(); -// for (Object item : list) { -// JSONObject jsonObject = JSONUtil.parseObj(item); -// -// jsonObject.remove(Constant.ID); -// cloneList.add(jsonObject); -// } -// -// Object object = list.get(0); -// String log = "\ndb." + getCollectionName(object.getClass()) + ".save("; -// log += JSONUtil.toJsonPrettyStr(cloneList); -// log += ");"; -// -// // 记录慢查询 -// Long queryTime = System.currentTimeMillis() - startTime; -// if (queryTime > slowTime) { -// insertSlowQuery(log, queryTime); -// } -// if (print) { -// // 打印语句 -// logger.info(log + "\n执行时间:" + queryTime + "ms"); -// } -// } -// -// /** -// * 插入或更新 -// * -// * @param object 对象 -// */ -// public String insertOrUpdate(Object object) { -// -// Long time = System.currentTimeMillis(); -// String id = (String) ReflectUtil.getFieldValue(object, Constant.ID); -// Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null; -// -// if (objectOrg == null) { -// // 插入 -// // 设置插入时间 -// setCreateTime(object, time); -// // 设置更新时间 -// setUpdateTime(object, time); -// -// // 设置默认值 -// setDefaultVaule(object); -// // 去除id值 -// ReflectUtil.setFieldValue(object, Constant.ID, null); -// -// // 克隆一个@IgnoreColumn的字段设为null的对象; -// Object objectClone = BeanUtil.copyProperties(object, object.getClass()); -// ignoreColumn(objectClone); -// -// mongoTemplate.save(objectClone); -// id = (String) ReflectUtil.getFieldValue(objectClone, Constant.ID); -// -// // 设置id值 -// ReflectUtil.setFieldValue(object, Constant.ID, id); -// -// logSave(objectClone, time, true); -// -// } else { -// // 更新 -// Field[] fields = ReflectUtil.getFields(object.getClass()); -// // 拷贝属性 -// for (Field field : fields) { -// if (!field.getName().equals(Constant.ID) && ReflectUtil.getFieldValue(object, field) != null) { -// ReflectUtil.setFieldValue(objectOrg, field, ReflectUtil.getFieldValue(object, field)); -// } -// } -// -// // 设置更新时间 -// setUpdateTime(objectOrg, time); -// // 克隆一个@IgnoreColumn的字段设为null的对象; -// Object objectClone = BeanUtil.copyProperties(objectOrg, object.getClass()); -// ignoreColumn(objectClone); -// -// mongoTemplate.save(objectClone); -// logSave(objectClone, time, false); -// } -// -// return id; -// } -// -// /** -// * 插入 -// * -// * @param object 对象 -// */ -// public String insert(Object object) { -// ReflectUtil.setFieldValue(object, Constant.ID, null); -// insertOrUpdate(object); -// return (String) ReflectUtil.getFieldValue(object, Constant.ID); -// } -// -// /** -// * 批量插入 -// * -// * @param -// * -// * @param object 对象 -// */ -// public void insertAll(List list) { -// Long time = System.currentTimeMillis(); -// -// List listClone = new ArrayList<>(); -// for (Object object : list) { -// -// // 去除id以便插入 -// ReflectUtil.setFieldValue(object, Constant.ID, null); -// // 设置插入时间 -// setCreateTime(object, time); -// // 设置更新时间 -// setUpdateTime(object, time); -// // 设置默认值 -// setDefaultVaule(object); -// // 克隆一个@IgnoreColumn的字段设为null的对象; -// Object objectClone = BeanUtil.copyProperties(object, object.getClass()); -// ignoreColumn(objectClone); -// listClone.add(objectClone); -// } -// -// mongoTemplate.insertAll(listClone); -// logSave(listClone, time); -// -// } -// -// /** -// * 设置更新时间 -// * -// * @param object 对象 -// */ -// private void setUpdateTime(Object object, Long time) { -// Field[] fields = ReflectUtil.getFields(object.getClass()); -// for (Field field : fields) { -// // 获取注解 -// if (field.isAnnotationPresent(UpdateTime.class) && field.getType().equals(Long.class)) { -// ReflectUtil.setFieldValue(object, field, time); -// } -// } -// } -// -// /** -// * 设置创建时间 -// * -// * @param object 对象 -// */ -// private void setCreateTime(Object object, Long time) { -// Field[] fields = ReflectUtil.getFields(object.getClass()); -// for (Field field : fields) { -// // 获取注解 -// if (field.isAnnotationPresent(CreateTime.class) && field.getType().equals(Long.class)) { -// ReflectUtil.setFieldValue(object, field, time); -// } -// } -// } -// -// /** -// * 将带有@IgnoreColumn的字段设为null; -// * -// * @param object 对象 -// */ -// private void ignoreColumn(Object object) { -// Field[] fields = ReflectUtil.getFields(object.getClass()); -// for (Field field : fields) { -// // 获取注解 -// if (field.isAnnotationPresent(IgnoreColumn.class)) { -// ReflectUtil.setFieldValue(object, field, null); -// } -// } -// } -// -// /** -// * 根据id更新 -// * -// * @param object 对象 -// */ -// public void updateById(Object object) { -// if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) { -// return; -// } -// if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) { -// return; -// } -// insertOrUpdate(object); -// } -// -// /** -// * 根据id更新全部字段 -// * -// * @param object 对象 -// */ -// public void updateAllColumnById(Object object) { -// -// if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) { -// return; -// } -// if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) { -// return; -// } -// Long time = System.currentTimeMillis(); -// setUpdateTime(object, time); -// mongoTemplate.save(object); -// logSave(object, time, false); -// } -// -// /** -// * 更新查到的第一项 -// * -// * @param criteria 查询 -// * @param update 更新 -// * @param clazz 类 -// */ -// public void updateFirst(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) { -// Long time = System.currentTimeMillis(); -// Query query = new Query(criteriaWrapper.build()); -// -// mongoTemplate.updateFirst(query, updateBuilder.toUpdate(), clazz); -// logUpdate(clazz, query, updateBuilder, false, time); -// } -// -// /** -// * 更新查到的全部项 -// * -// * @param criteria 查询 -// * @param update 更新 -// * @param clazz 类 -// */ -// public void updateMulti(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) { -// -// Long time = System.currentTimeMillis(); -// Query query = new Query(criteriaWrapper.build()); -// mongoTemplate.updateMulti(new Query(criteriaWrapper.build()), updateBuilder.toUpdate(), clazz); -// logUpdate(clazz, query, updateBuilder, true, time); -// } -// -// /** -// * 根据id删除 -// * -// * @param id 对象 -// * @param clazz 类 -// */ -// public void deleteById(String id, Class clazz) { -// -// if (StrUtil.isEmpty(id)) { -// return; -// } -// deleteByQuery(new CriteriaAndWrapper().eq(Constant::getId, id), clazz); -// } -// -// /** -// * 根据id删除 -// * -// * @param id 对象 -// * @param clazz 类 -// */ -// public void deleteByIds(List ids, Class clazz) { -// -// if (ids == null || ids.size() == 0) { -// return; -// } -// -// deleteByQuery(new CriteriaAndWrapper().in(Constant::getId, ids), clazz); -// } -// -// /** -// * 根据条件删除 -// * -// * @param criteria 查询 -// * @param clazz 类 -// */ -// public void deleteByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { -// Long time = System.currentTimeMillis(); -// Query query = new Query(criteriaWrapper.build()); -// mongoTemplate.remove(query, clazz); -// logDelete(clazz, query, time); -// } -// -// /** -// * 设置默认值 -// * -// * @param object 对象 -// */ -// private void setDefaultVaule(Object object) { -// Field[] fields = ReflectUtil.getFields(object.getClass()); -// for (Field field : fields) { -// // 获取注解 -// if (field.isAnnotationPresent(InitValue.class)) { -// InitValue defaultValue = field.getAnnotation(InitValue.class); -// -// String value = defaultValue.value(); -// -// if (ReflectUtil.getFieldValue(object, field) == null) { -// // 获取字段类型 -// Class type = field.getType(); -// if (type.equals(String.class)) { -// ReflectUtil.setFieldValue(object, field, value); -// } -// if (type.equals(Short.class)) { -// ReflectUtil.setFieldValue(object, field, Short.parseShort(value)); -// } -// if (type.equals(Integer.class)) { -// ReflectUtil.setFieldValue(object, field, Integer.parseInt(value)); -// } -// if (type.equals(Long.class)) { -// ReflectUtil.setFieldValue(object, field, Long.parseLong(value)); -// } -// if (type.equals(Float.class)) { -// ReflectUtil.setFieldValue(object, field, Float.parseFloat(value)); -// } -// if (type.equals(Double.class)) { -// ReflectUtil.setFieldValue(object, field, Double.parseDouble(value)); -// } -// if (type.equals(Boolean.class)) { -// ReflectUtil.setFieldValue(object, field, Boolean.parseBoolean(value)); -// } -// } -// } -// } -// } -// -// /** -// * 累加某一个字段的数量,原子操作 -// * -// * @param object -// */ -// public void addCountById(String id, SerializableFunction property, Number count, Class clazz) { -// UpdateBuilder updateBuilder = new UpdateBuilder().inc(property, count); -// -// updateFirst(new CriteriaAndWrapper().eq(Constant::getId, id), updateBuilder, clazz); -// } -// -// /** -// * 按查询条件获取Page -// * -// * @param criteria 查询 -// * @param page 分页 -// * @param clazz 类 -// * @return Page 分页 -// */ -// public Page findPage(CriteriaWrapper criteriaWrapper, Page page, Class clazz) { -// SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); -// return findPage(criteriaWrapper, sortBuilder, page, clazz); -// } -// -// /** -// * 按查询条件获取Page -// * -// * @param criteria 查询 -// * @param sort 排序 -// * @param clazz 类 -// * @return Page 分页 -// */ -// public Page findPage(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Page page, Class clazz) { -// -// Page pageResp = new Page(); -// pageResp.setCurr(page.getCurr()); -// pageResp.setLimit(page.getLimit()); -// -// // 查询出总条数 -// if (page.getQueryCount()) { -// Long count = findCountByQuery(criteriaWrapper, clazz); -// pageResp.setCount(count); -// } -// -// // 查询List -// Query query = new Query(criteriaWrapper.build()); -// query.with(sortBuilder.toSort()); -// query.skip((page.getCurr() - 1) * page.getLimit());// 从那条记录开始 -// query.limit(page.getLimit());// 取多少条记录 -// -// Long systemTime = System.currentTimeMillis(); -// List list = mongoTemplate.find(query, clazz); -// logQuery(clazz, query, systemTime); -// -// pageResp.setList(list); -// -// return pageResp; -// } -// -// /** -// * 按查询条件获取Page -// * -// * @param criteria 查询 -// * @param sort 排序 -// * @param clazz 类 -// * @return Page 分页 -// */ -// public Page findPage(SortBuilder sortBuilder, Page page, Class clazz) { -// return findPage(new CriteriaAndWrapper(), sortBuilder, page, clazz); -// } -// -// /** -// * 获取Page -// * -// * @param page 分页 -// * @param clazz 类 -// * @return Page 分页 -// */ -// public Page findPage(Page page, Class clazz) { -// return findPage(new CriteriaAndWrapper(), page, clazz); -// } -// -// /** -// * 根据id查找 -// * -// * @param id id -// * @param clazz 类 -// * @return T 对象 -// */ -// public T findById(String id, Class clazz) { -// -// if (StrUtil.isEmpty(id)) { -// return null; -// } -// Long systemTime = System.currentTimeMillis(); -// -// T t = (T) mongoTemplate.findById(id, clazz); -// -// CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().eq(Constant::getId, id); -// logQuery(clazz, new Query(criteriaAndWrapper.build()), systemTime); -// return t; -// } -// -// /** -// * 根据条件查找单个 -// * -// * @param 类型 -// * @param criteria -// * @param clazz 类 -// * @return T 对象 -// */ -// public T findOneByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { -// SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); -// return (T) findOneByQuery(criteriaWrapper, sortBuilder, clazz); -// } -// -// /** -// * 根据条件查找单个 -// * -// * @param query 查询 -// * @param clazz 类 -// * @return T 对象 -// */ -// public T findOneByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) { -// -// Query query = new Query(criteriaWrapper.build()); -// query.limit(1); -// query.with(sortBuilder.toSort()); -// -// Long systemTime = System.currentTimeMillis(); -// T t = (T) mongoTemplate.findOne(query, clazz); -// logQuery(clazz, query, systemTime); -// -// return t; -// -// } -// -// /** -// * 根据条件查找单个 -// * -// * @param query 查询 -// * @param clazz 类 -// * @return T 对象 -// */ -// public T findOneByQuery(SortBuilder sortBuilder, Class clazz) { -// return (T) findOneByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); -// } -// -// /** -// * 根据条件查找List -// * -// * @param 类型 -// * @param criteria 查询 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { -// SortBuilder sortBuilder = new SortBuilder().add(Constant::getId, Direction.DESC); -// return findListByQuery(criteriaWrapper, sortBuilder, clazz); -// -// } -// -// /** -// * 根据条件查找List -// * -// * @param 类型 -// * @param criteria 查询 -// * @param sort 排序 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) { -// Query query = new Query(criteriaWrapper.build()); -// query.with(sortBuilder.toSort()); -// -// Long systemTime = System.currentTimeMillis(); -// List list = mongoTemplate.find(query, clazz); -// logQuery(clazz, query, systemTime); -// return list; -// -// } -// -// /** -// * 根据条件查找某个属性 -// * -// * @param 类型 -// * @param criteria 查询 -// * @param documentClass 类 -// * @param property 属性 -// * @param propertyClass 属性类 -// * @return List 列表 -// */ -// public List findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class documentClass, SerializableFunction property, Class propertyClass) { -// Query query = new Query(criteriaWrapper.build()); -// query.fields().include(ReflectionUtil.getFieldName(property)); -// -// Long systemTime = System.currentTimeMillis(); -// List list = mongoTemplate.find(query, documentClass); -// logQuery(documentClass, query, systemTime); -// -// List propertyList = extractProperty(list, ReflectionUtil.getFieldName(property), propertyClass); -// return propertyList; -// } -// -// /** -// * 根据条件查找某个属性 -// * -// * @param 类型 -// * @param criteria 查询 -// * @param documentClass 类 -// * @param property 属性 -// * @return List 列表 -// */ -// public List findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class documentClass, SerializableFunction property) { -// return findPropertiesByQuery(criteriaWrapper, documentClass, property, String.class); -// } -// -// /** -// * 根据id查找某个属性 -// * -// * @param 类型 -// * @param criteria 查询 -// * @param documentClass 类 -// * @param property 属性 -// * @return List 列表 -// */ -// public List findPropertiesByIds(List ids, Class clazz, SerializableFunction property) { -// CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); -// return findPropertiesByQuery(criteriaAndWrapper, clazz, property); -// } -// -// /** -// * 根据条件查找id -// * -// * @param criteria 查询 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findIdsByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { -// return findPropertiesByQuery(criteriaWrapper, clazz, Constant::getId); -// } -// -// /** -// * 根据id集合查找 -// * -// * @param List ids id集合 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByIds(Collection ids, Class clazz) { -// CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); -// return findListByQuery(criteriaAndWrapper, clazz); -// } -// -// /** -// * 根据id集合查找 -// * -// * @param List ids id集合 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByIds(Collection ids, SortBuilder sortBuilder, Class clazz) { -// CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); -// return findListByQuery(criteriaAndWrapper, sortBuilder, clazz); -// } -// -// /** -// * 根据id集合查找 -// * -// * @param Array ids id集合 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByIds(String[] ids, SortBuilder sortBuilder, Class clazz) { -// return findListByIds(Arrays.asList(ids), sortBuilder, clazz); -// } -// -// /** -// * 根据id集合查找 -// * -// * @param Array ids id集合 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findListByIds(String[] ids, Class clazz) { -// SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); -// return findListByIds(ids, sortBuilder, clazz); -// } -// -// /** -// * 查询全部 -// * -// * @param 类型 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findAll(Class clazz) { -// SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); -// return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); -// } -// -// /** -// * 查询全部 -// * -// * @param 类型 -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findAll(SortBuilder sortBuilder, Class clazz) { -// return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); -// } -// -// /** -// * 查找全部的id -// * -// * @param clazz 类 -// * @return List 列表 -// */ -// public List findAllIds(Class clazz) { -// return findIdsByQuery(new CriteriaAndWrapper(), clazz); -// } -// -// /** -// * 查找数量 -// * -// * @param criteria 查询 -// * @param clazz 类 -// * @return Long 数量 -// */ -// public Long findCountByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { -// Long systemTime = System.currentTimeMillis(); -// Long count = null; -// -// Query query = new Query(criteriaWrapper.build()); -// if (query.getQueryObject().isEmpty()) { -// count = mongoTemplate.getCollection(mongoTemplate.getCollectionName(clazz)).estimatedDocumentCount(); -// } else { -// count = mongoTemplate.count(query, clazz); -// } -// -// logCount(clazz, query, systemTime); -// return count; -// } -// -// /** -// * 查找全部数量 -// * -// * @param clazz 类 -// * @return Long 数量 -// */ -// public Long findAllCount(Class clazz) { -// return findCountByQuery(new CriteriaAndWrapper(), clazz); -// } -// -// /** -// * 获取list中对象某个属性,组成新的list -// * -// * @param list 列表 -// * @param clazz 类 -// * @param property 属性 -// * @return List 列表 -// */ -// @SuppressWarnings("unchecked") -// private List extractProperty(List list, String property, Class clazz) { -// Set rs = new HashSet(); -// for (Object object : list) { -// Object value = ReflectUtil.getFieldValue(object, property); -// if (value != null && value.getClass().equals(clazz)) { -// rs.add((T) value); -// } -// } -// -// return new ArrayList(rs); -// } -// -//} +package com.ruoyi.biemo.mongodb.utils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.annotation.PostConstruct; + +import com.ruoyi.biemo.mongodb.bean.*; +import com.ruoyi.biemo.mongodb.config.Constant; +import com.ruoyi.biemo.mongodb.reflection.ReflectionUtil; +import com.ruoyi.biemo.mongodb.reflection.SerializableFunction; +import org.bson.Document; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.data.mongodb.core.convert.QueryMapper; +import org.springframework.data.mongodb.core.convert.UpdateMapper; +import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.stereotype.Service; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; + +/** + * mongodb操作器 + * + */ +@Service("mongoHelper") +public class MongoHelper { + Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + protected MongoConverter mongoConverter; + + protected QueryMapper queryMapper; + protected UpdateMapper updateMapper; + + @Autowired + protected MongoTemplate mongoTemplate; + + public MongoTemplate getMongoTemplate() { + return mongoTemplate; + } + + @Value("${spring.data.mongodb.print:false}") + protected Boolean print; + + @Value("${spring.data.mongodb.slowQuery:false}") + protected Boolean slowQuery; + + @Value("${spring.data.mongodb.slowTime:1000}") + protected Long slowTime; + + @PostConstruct + public void init() { + queryMapper = new QueryMapper(mongoConverter); + updateMapper = new UpdateMapper(mongoConverter); + } + + private void insertSlowQuery(String log, Long queryTime) { + if (slowQuery) { + SlowQuery slowQuery = new SlowQuery(); + slowQuery.setQuery(log); + slowQuery.setTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + slowQuery.setQueryTime(queryTime); + slowQuery.setSystem(SystemTool.getSystem()); + StackTraceElement stack[] = Thread.currentThread().getStackTrace(); + + // 保存堆栈 + String stackStr = ""; + for (int i = 0; i < stack.length; i++) { + stackStr += stack[i].getClassName() + "." + stack[i].getMethodName() + ":" + stack[i].getLineNumber() + "\n"; + } + slowQuery.setStack(stackStr); + + mongoTemplate.insert(slowQuery); + } + } + + /** + * 打印查询语句 + * + * @param query + */ + private void logQuery(Class clazz, Query query, Long startTime) { + + MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); + Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); + Document mappedField = queryMapper.getMappedObject(query.getFieldsObject(), entity); + Document mappedSort = queryMapper.getMappedObject(query.getSortObject(), entity); + + String log = "\ndb." + getCollectionName(clazz) + ".find("; + + log += FormatUtils.bson(mappedQuery.toJson()) + ")"; + + if (!query.getFieldsObject().isEmpty()) { + log += ".projection("; + log += FormatUtils.bson(mappedField.toJson()) + ")"; + } + + if (query.isSorted()) { + log += ".sort("; + log += FormatUtils.bson(mappedSort.toJson()) + ")"; + } + + if (query.getLimit() != 0l) { + log += ".limit(" + query.getLimit() + ")"; + } + + if (query.getSkip() != 0l) { + log += ".skip(" + query.getSkip() + ")"; + } + log += ";"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + + } + + private String getCollectionName(Class clazz) { + org.springframework.data.mongodb.core.mapping.Document document = clazz.getAnnotation(org.springframework.data.mongodb.core.mapping.Document.class); + if (document != null) { + if (StrUtil.isNotEmpty(document.value())) { + return document.value(); + } + if (StrUtil.isNotEmpty(document.collection())) { + return document.collection(); + } + } + + return StrUtil.lowerFirst(clazz.getSimpleName()); + } + + /** + * 打印查询语句 + * + * @param query + */ + private void logCount(Class clazz, Query query, Long startTime) { + + MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); + Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); + + String log = "\ndb." + getCollectionName(clazz) + ".find("; + log += FormatUtils.bson(mappedQuery.toJson()) + ")"; + log += ".count();"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + + } + + /** + * 打印查询语句 + * + * @param query + */ + private void logDelete(Class clazz, Query query, Long startTime) { + + MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); + Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); + + String log = "\ndb." + getCollectionName(clazz) + ".remove("; + log += FormatUtils.bson(mappedQuery.toJson()) + ")"; + log += ";"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + + } + + /** + * 打印查询语句 + * + * @param query + */ + private void logUpdate(Class clazz, Query query, UpdateBuilder updateBuilder, boolean multi, Long startTime) { + + MongoPersistentEntity entity = mongoConverter.getMappingContext().getPersistentEntity(clazz); + Document mappedQuery = queryMapper.getMappedObject(query.getQueryObject(), entity); + Document mappedUpdate = updateMapper.getMappedObject(updateBuilder.toUpdate().getUpdateObject(), entity); + + String log = "\ndb." + getCollectionName(clazz) + ".update("; + log += FormatUtils.bson(mappedQuery.toJson()) + ","; + log += FormatUtils.bson(mappedUpdate.toJson()) + ","; + log += FormatUtils.bson("{multi:" + multi + "})"); + log += ";"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + + } + + /** + * 打印查询语句 + * + * @param object + * + * @param query + */ + private void logSave(Object object, Long startTime, Boolean isInsert) { + JSONObject jsonObject = JSONUtil.parseObj(object); + + if (isInsert) { + jsonObject.remove(Constant.ID); + } + + String log = "\ndb." + getCollectionName(object.getClass()) + ".save("; + log += JSONUtil.toJsonPrettyStr(jsonObject); + log += ");"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + } + + /** + * 打印查询语句 + * + * @param object + * + * @param query + */ + private void logSave(List list, Long startTime) { + List cloneList = new ArrayList<>(); + for (Object item : list) { + JSONObject jsonObject = JSONUtil.parseObj(item); + + jsonObject.remove(Constant.ID); + cloneList.add(jsonObject); + } + + Object object = list.get(0); + String log = "\ndb." + getCollectionName(object.getClass()) + ".save("; + log += JSONUtil.toJsonPrettyStr(cloneList); + log += ");"; + + // 记录慢查询 + Long queryTime = System.currentTimeMillis() - startTime; + if (queryTime > slowTime) { + insertSlowQuery(log, queryTime); + } + if (print) { + // 打印语句 + logger.info(log + "\n执行时间:" + queryTime + "ms"); + } + } + + /** + * 插入或更新 + * + * @param object 对象 + */ + public String insertOrUpdate(Object object) { + + Long time = System.currentTimeMillis(); + String id = (String) ReflectUtil.getFieldValue(object, Constant.ID); + Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null; + + if (objectOrg == null) { + // 插入 + // 设置插入时间 + setCreateTime(object, time); + // 设置更新时间 + setUpdateTime(object, time); + + // 设置默认值 + setDefaultVaule(object); + // 去除id值 + ReflectUtil.setFieldValue(object, Constant.ID, null); + + // 克隆一个@IgnoreColumn的字段设为null的对象; + Object objectClone = BeanUtil.copyProperties(object, object.getClass()); + ignoreColumn(objectClone); + + mongoTemplate.save(objectClone); + id = (String) ReflectUtil.getFieldValue(objectClone, Constant.ID); + + // 设置id值 + ReflectUtil.setFieldValue(object, Constant.ID, id); + + logSave(objectClone, time, true); + + } else { + // 更新 + Field[] fields = ReflectUtil.getFields(object.getClass()); + // 拷贝属性 + for (Field field : fields) { + if (!field.getName().equals(Constant.ID) && ReflectUtil.getFieldValue(object, field) != null) { + ReflectUtil.setFieldValue(objectOrg, field, ReflectUtil.getFieldValue(object, field)); + } + } + + // 设置更新时间 + setUpdateTime(objectOrg, time); + // 克隆一个@IgnoreColumn的字段设为null的对象; + Object objectClone = BeanUtil.copyProperties(objectOrg, object.getClass()); + ignoreColumn(objectClone); + + mongoTemplate.save(objectClone); + logSave(objectClone, time, false); + } + + return id; + } + + /** + * 插入 + * + * @param object 对象 + */ + public String insert(Object object) { + ReflectUtil.setFieldValue(object, Constant.ID, null); + insertOrUpdate(object); + return (String) ReflectUtil.getFieldValue(object, Constant.ID); + } + + /** + * 批量插入 + * + * @param + * + * @param object 对象 + */ + public void insertAll(List list) { + Long time = System.currentTimeMillis(); + + List listClone = new ArrayList<>(); + for (Object object : list) { + + // 去除id以便插入 + ReflectUtil.setFieldValue(object, Constant.ID, null); + // 设置插入时间 + setCreateTime(object, time); + // 设置更新时间 + setUpdateTime(object, time); + // 设置默认值 + setDefaultVaule(object); + // 克隆一个@IgnoreColumn的字段设为null的对象; + Object objectClone = BeanUtil.copyProperties(object, object.getClass()); + ignoreColumn(objectClone); + listClone.add(objectClone); + } + + mongoTemplate.insertAll(listClone); + logSave(listClone, time); + + } + + /** + * 设置更新时间 + * + * @param object 对象 + */ + private void setUpdateTime(Object object, Long time) { + Field[] fields = ReflectUtil.getFields(object.getClass()); + for (Field field : fields) { + // 获取注解 + if (field.isAnnotationPresent(UpdateTime.class) && field.getType().equals(Long.class)) { + ReflectUtil.setFieldValue(object, field, time); + } + } + } + + /** + * 设置创建时间 + * + * @param object 对象 + */ + private void setCreateTime(Object object, Long time) { + Field[] fields = ReflectUtil.getFields(object.getClass()); + for (Field field : fields) { + // 获取注解 + if (field.isAnnotationPresent(CreateTime.class) && field.getType().equals(Long.class)) { + ReflectUtil.setFieldValue(object, field, time); + } + } + } + + /** + * 将带有@IgnoreColumn的字段设为null; + * + * @param object 对象 + */ + private void ignoreColumn(Object object) { + Field[] fields = ReflectUtil.getFields(object.getClass()); + for (Field field : fields) { + // 获取注解 + if (field.isAnnotationPresent(IgnoreColumn.class)) { + ReflectUtil.setFieldValue(object, field, null); + } + } + } + + /** + * 根据id更新 + * + * @param object 对象 + */ + public void updateById(Object object) { + if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) { + return; + } + if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) { + return; + } + insertOrUpdate(object); + } + + /** + * 根据id更新全部字段 + * + * @param object 对象 + */ + public void updateAllColumnById(Object object) { + + if (StrUtil.isEmpty((String) ReflectUtil.getFieldValue(object, Constant.ID))) { + return; + } + if (findById((String) ReflectUtil.getFieldValue(object, Constant.ID), object.getClass()) == null) { + return; + } + Long time = System.currentTimeMillis(); + setUpdateTime(object, time); + mongoTemplate.save(object); + logSave(object, time, false); + } + + /** + * 更新查到的第一项 + * + * @param criteria 查询 + * @param update 更新 + * @param clazz 类 + */ + public void updateFirst(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) { + Long time = System.currentTimeMillis(); + Query query = new Query(criteriaWrapper.build()); + + mongoTemplate.updateFirst(query, updateBuilder.toUpdate(), clazz); + logUpdate(clazz, query, updateBuilder, false, time); + } + + /** + * 更新查到的全部项 + * + * @param criteria 查询 + * @param update 更新 + * @param clazz 类 + */ + public void updateMulti(CriteriaWrapper criteriaWrapper, UpdateBuilder updateBuilder, Class clazz) { + + Long time = System.currentTimeMillis(); + Query query = new Query(criteriaWrapper.build()); + mongoTemplate.updateMulti(new Query(criteriaWrapper.build()), updateBuilder.toUpdate(), clazz); + logUpdate(clazz, query, updateBuilder, true, time); + } + + /** + * 根据id删除 + * + * @param id 对象 + * @param clazz 类 + */ + public void deleteById(String id, Class clazz) { + + if (StrUtil.isEmpty(id)) { + return; + } + deleteByQuery(new CriteriaAndWrapper().eq(Constant::getId, id), clazz); + } + + /** + * 根据id删除 + * + * @param id 对象 + * @param clazz 类 + */ + public void deleteByIds(List ids, Class clazz) { + + if (ids == null || ids.size() == 0) { + return; + } + + deleteByQuery(new CriteriaAndWrapper().in(Constant::getId, ids), clazz); + } + + /** + * 根据条件删除 + * + * @param criteria 查询 + * @param clazz 类 + */ + public void deleteByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { + Long time = System.currentTimeMillis(); + Query query = new Query(criteriaWrapper.build()); + mongoTemplate.remove(query, clazz); + logDelete(clazz, query, time); + } + + /** + * 设置默认值 + * + * @param object 对象 + */ + private void setDefaultVaule(Object object) { + Field[] fields = ReflectUtil.getFields(object.getClass()); + for (Field field : fields) { + // 获取注解 + if (field.isAnnotationPresent(InitValue.class)) { + InitValue defaultValue = field.getAnnotation(InitValue.class); + + String value = defaultValue.value(); + + if (ReflectUtil.getFieldValue(object, field) == null) { + // 获取字段类型 + Class type = field.getType(); + if (type.equals(String.class)) { + ReflectUtil.setFieldValue(object, field, value); + } + if (type.equals(Short.class)) { + ReflectUtil.setFieldValue(object, field, Short.parseShort(value)); + } + if (type.equals(Integer.class)) { + ReflectUtil.setFieldValue(object, field, Integer.parseInt(value)); + } + if (type.equals(Long.class)) { + ReflectUtil.setFieldValue(object, field, Long.parseLong(value)); + } + if (type.equals(Float.class)) { + ReflectUtil.setFieldValue(object, field, Float.parseFloat(value)); + } + if (type.equals(Double.class)) { + ReflectUtil.setFieldValue(object, field, Double.parseDouble(value)); + } + if (type.equals(Boolean.class)) { + ReflectUtil.setFieldValue(object, field, Boolean.parseBoolean(value)); + } + } + } + } + } + + /** + * 累加某一个字段的数量,原子操作 + * + * @param object + */ + public void addCountById(String id, SerializableFunction property, Number count, Class clazz) { + UpdateBuilder updateBuilder = new UpdateBuilder().inc(property, count); + + updateFirst(new CriteriaAndWrapper().eq(Constant::getId, id), updateBuilder, clazz); + } + + /** + * 按查询条件获取Page + * + * @param criteria 查询 + * @param page 分页 + * @param clazz 类 + * @return Page 分页 + */ + public Page findPage(CriteriaWrapper criteriaWrapper, Page page, Class clazz) { + SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); + return findPage(criteriaWrapper, sortBuilder, page, clazz); + } + + /** + * 按查询条件获取Page + * + * @param criteria 查询 + * @param sort 排序 + * @param clazz 类 + * @return Page 分页 + */ + public Page findPage(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Page page, Class clazz) { + + Page pageResp = new Page(); + pageResp.setCurr(page.getCurr()); + pageResp.setLimit(page.getLimit()); + + // 查询出总条数 + if (page.getQueryCount()) { + Long count = findCountByQuery(criteriaWrapper, clazz); + pageResp.setCount(count); + } + + // 查询List + Query query = new Query(criteriaWrapper.build()); + query.with(sortBuilder.toSort()); + query.skip((page.getCurr() - 1) * page.getLimit());// 从那条记录开始 + query.limit(page.getLimit());// 取多少条记录 + + Long systemTime = System.currentTimeMillis(); + List list = mongoTemplate.find(query, clazz); + logQuery(clazz, query, systemTime); + + pageResp.setList(list); + + return pageResp; + } + + /** + * 按查询条件获取Page + * + * @param criteria 查询 + * @param sort 排序 + * @param clazz 类 + * @return Page 分页 + */ + public Page findPage(SortBuilder sortBuilder, Page page, Class clazz) { + return findPage(new CriteriaAndWrapper(), sortBuilder, page, clazz); + } + + /** + * 获取Page + * + * @param page 分页 + * @param clazz 类 + * @return Page 分页 + */ + public Page findPage(Page page, Class clazz) { + return findPage(new CriteriaAndWrapper(), page, clazz); + } + + /** + * 根据id查找 + * + * @param id id + * @param clazz 类 + * @return T 对象 + */ + public T findById(String id, Class clazz) { + + if (StrUtil.isEmpty(id)) { + return null; + } + Long systemTime = System.currentTimeMillis(); + + T t = (T) mongoTemplate.findById(id, clazz); + + CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().eq(Constant::getId, id); + logQuery(clazz, new Query(criteriaAndWrapper.build()), systemTime); + return t; + } + + /** + * 根据条件查找单个 + * + * @param 类型 + * @param criteria + * @param clazz 类 + * @return T 对象 + */ + public T findOneByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { + SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); + return (T) findOneByQuery(criteriaWrapper, sortBuilder, clazz); + } + + /** + * 根据条件查找单个 + * + * @param query 查询 + * @param clazz 类 + * @return T 对象 + */ + public T findOneByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) { + + Query query = new Query(criteriaWrapper.build()); + query.limit(1); + query.with(sortBuilder.toSort()); + + Long systemTime = System.currentTimeMillis(); + T t = (T) mongoTemplate.findOne(query, clazz); + logQuery(clazz, query, systemTime); + + return t; + + } + + /** + * 根据条件查找单个 + * + * @param query 查询 + * @param clazz 类 + * @return T 对象 + */ + public T findOneByQuery(SortBuilder sortBuilder, Class clazz) { + return (T) findOneByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); + } + + /** + * 根据条件查找List + * + * @param 类型 + * @param criteria 查询 + * @param clazz 类 + * @return List 列表 + */ + public List findListByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { + SortBuilder sortBuilder = new SortBuilder().add(Constant::getId, Direction.DESC); + return findListByQuery(criteriaWrapper, sortBuilder, clazz); + + } + + /** + * 根据条件查找List + * + * @param 类型 + * @param criteria 查询 + * @param sort 排序 + * @param clazz 类 + * @return List 列表 + */ + public List findListByQuery(CriteriaWrapper criteriaWrapper, SortBuilder sortBuilder, Class clazz) { + Query query = new Query(criteriaWrapper.build()); + query.with(sortBuilder.toSort()); + + Long systemTime = System.currentTimeMillis(); + List list = mongoTemplate.find(query, clazz); + logQuery(clazz, query, systemTime); + return list; + + } + + /** + * 根据条件查找某个属性 + * + * @param 类型 + * @param criteria 查询 + * @param documentClass 类 + * @param property 属性 + * @param propertyClass 属性类 + * @return List 列表 + */ + public List findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class documentClass, SerializableFunction property, Class propertyClass) { + Query query = new Query(criteriaWrapper.build()); + query.fields().include(ReflectionUtil.getFieldName(property)); + + Long systemTime = System.currentTimeMillis(); + List list = mongoTemplate.find(query, documentClass); + logQuery(documentClass, query, systemTime); + + List propertyList = extractProperty(list, ReflectionUtil.getFieldName(property), propertyClass); + return propertyList; + } + + /** + * 根据条件查找某个属性 + * + * @param 类型 + * @param criteria 查询 + * @param documentClass 类 + * @param property 属性 + * @return List 列表 + */ + public List findPropertiesByQuery(CriteriaWrapper criteriaWrapper, Class documentClass, SerializableFunction property) { + return findPropertiesByQuery(criteriaWrapper, documentClass, property, String.class); + } + + /** + * 根据id查找某个属性 + * + * @param 类型 + * @param criteria 查询 + * @param documentClass 类 + * @param property 属性 + * @return List 列表 + */ + public List findPropertiesByIds(List ids, Class clazz, SerializableFunction property) { + CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); + return findPropertiesByQuery(criteriaAndWrapper, clazz, property); + } + + /** + * 根据条件查找id + * + * @param criteria 查询 + * @param clazz 类 + * @return List 列表 + */ + public List findIdsByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { + return findPropertiesByQuery(criteriaWrapper, clazz, Constant::getId); + } + + /** + * 根据id集合查找 + * + * @param List ids id集合 + * @param clazz 类 + * @return List 列表 + */ + public List findListByIds(Collection ids, Class clazz) { + CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); + return findListByQuery(criteriaAndWrapper, clazz); + } + + /** + * 根据id集合查找 + * + * @param List ids id集合 + * @param clazz 类 + * @return List 列表 + */ + public List findListByIds(Collection ids, SortBuilder sortBuilder, Class clazz) { + CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper().in(Constant::getId, ids); + return findListByQuery(criteriaAndWrapper, sortBuilder, clazz); + } + + /** + * 根据id集合查找 + * + * @param Array ids id集合 + * @param clazz 类 + * @return List 列表 + */ + public List findListByIds(String[] ids, SortBuilder sortBuilder, Class clazz) { + return findListByIds(Arrays.asList(ids), sortBuilder, clazz); + } + + /** + * 根据id集合查找 + * + * @param Array ids id集合 + * @param clazz 类 + * @return List 列表 + */ + public List findListByIds(String[] ids, Class clazz) { + SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); + return findListByIds(ids, sortBuilder, clazz); + } + + /** + * 查询全部 + * + * @param 类型 + * @param clazz 类 + * @return List 列表 + */ + public List findAll(Class clazz) { + SortBuilder sortBuilder = new SortBuilder(Constant::getId, Direction.DESC); + return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); + } + + /** + * 查询全部 + * + * @param 类型 + * @param clazz 类 + * @return List 列表 + */ + public List findAll(SortBuilder sortBuilder, Class clazz) { + return findListByQuery(new CriteriaAndWrapper(), sortBuilder, clazz); + } + + /** + * 查找全部的id + * + * @param clazz 类 + * @return List 列表 + */ + public List findAllIds(Class clazz) { + return findIdsByQuery(new CriteriaAndWrapper(), clazz); + } + + /** + * 查找数量 + * + * @param criteria 查询 + * @param clazz 类 + * @return Long 数量 + */ + public Long findCountByQuery(CriteriaWrapper criteriaWrapper, Class clazz) { + Long systemTime = System.currentTimeMillis(); + Long count = null; + + Query query = new Query(criteriaWrapper.build()); + if (query.getQueryObject().isEmpty()) { + count = mongoTemplate.getCollection(mongoTemplate.getCollectionName(clazz)).estimatedDocumentCount(); + } else { + count = mongoTemplate.count(query, clazz); + } + + logCount(clazz, query, systemTime); + return count; + } + + /** + * 查找全部数量 + * + * @param clazz 类 + * @return Long 数量 + */ + public Long findAllCount(Class clazz) { + return findCountByQuery(new CriteriaAndWrapper(), clazz); + } + + /** + * 获取list中对象某个属性,组成新的list + * + * @param list 列表 + * @param clazz 类 + * @param property 属性 + * @return List 列表 + */ + @SuppressWarnings("unchecked") + private List extractProperty(List list, String property, Class clazz) { + Set rs = new HashSet(); + for (Object object : list) { + Object value = ReflectUtil.getFieldValue(object, property); + if (value != null && value.getClass().equals(clazz)) { + rs.add((T) value); + } + } + + return new ArrayList(rs); + } + +} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/CoreNLPHel.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/CoreNLPHel.java deleted file mode 100644 index 871fa17..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/CoreNLPHel.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.ruoyi.biemo.nlp; - -import edu.stanford.nlp.pipeline.StanfordCoreNLP; - -public class CoreNLPHel { - private static CoreNLPHel instance = new CoreNLPHel(); - private StanfordCoreNLP pipeline; - - private CoreNLPHel() { - String props = "CoreNLP-chinese.properties"; - pipeline = new StanfordCoreNLP(props); - } - - - public static CoreNLPHel getInstance() { - return instance; - } - - public StanfordCoreNLP getPipeline() { - return pipeline; - } -} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/NamedEntity.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/NamedEntity.java deleted file mode 100644 index 1aa6c16..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/NamedEntity.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.ruoyi.biemo.nlp; - -import edu.stanford.nlp.ling.CoreAnnotations; -import edu.stanford.nlp.ling.CoreLabel; -import edu.stanford.nlp.pipeline.Annotation; -import edu.stanford.nlp.pipeline.StanfordCoreNLP; -import edu.stanford.nlp.util.CoreMap; - -import java.util.List; - -public class NamedEntity { - - private String nertext = ""; - - public String getNertext() { - return nertext; - } - - public NamedEntity(String text){ - CoreNLPHel coreNLPHel = CoreNLPHel.getInstance(); - StanfordCoreNLP pipeline = coreNLPHel.getPipeline(); - Annotation annotation = new Annotation(text); - pipeline.annotate(annotation); - List sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); - StringBuffer sb = new StringBuffer(); - for (CoreMap sentence:sentences){ - // 获取句子的token(可以是作为分词后的词语) - for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)){ - String word = token.get(CoreAnnotations.TextAnnotation.class); - //String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class); - //String ne = token.get(CoreAnnotations.NormalizedNamedEntityTagAnnotation.class); - String ner = token.get(CoreAnnotations.NamedEntityTagAnnotation.class); - //System.out.println(word + "\t" + pos + " | analysis : { original : " + ner + "," + " normalized : " + ne + "}"); - sb.append(word); - sb.append("/"); - sb.append(ner); - sb.append(" "); - } - } - nertext = sb.toString().trim(); - } -} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/PosTag.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/PosTag.java deleted file mode 100644 index c2a126f..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/PosTag.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.ruoyi.biemo.nlp; - -import edu.stanford.nlp.ling.CoreAnnotations; -import edu.stanford.nlp.ling.CoreLabel; -import edu.stanford.nlp.pipeline.Annotation; -import edu.stanford.nlp.pipeline.StanfordCoreNLP; -import edu.stanford.nlp.util.CoreMap; - -import java.util.List; - -public class PosTag { - - private String postext = ""; - - public String getPostext() { - return postext; - } - public PosTag(String text){ - - CoreNLPHel coreNLPHel = CoreNLPHel.getInstance(); - StanfordCoreNLP pipeline = coreNLPHel.getPipeline(); - Annotation annotation = new Annotation(text); - pipeline.annotate(annotation); - List sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); - StringBuffer sb = new StringBuffer(); - for (CoreMap sentence:sentences){ - for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)){ - String word = token.get(CoreAnnotations.TextAnnotation.class); - String pos = token.get(CoreAnnotations.PartOfSpeechAnnotation.class); - sb.append(word); - sb.append("/"); - sb.append(pos); - sb.append(" "); - } - } - postext = sb.toString().trim(); - } -} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SPTree.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SPTree.java deleted file mode 100644 index 7b41656..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SPTree.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.ruoyi.biemo.nlp; - -import edu.stanford.nlp.ling.CoreAnnotations; -import edu.stanford.nlp.pipeline.Annotation; -import edu.stanford.nlp.pipeline.StanfordCoreNLP; -import edu.stanford.nlp.semgraph.SemanticGraph; -import edu.stanford.nlp.semgraph.SemanticGraphCoreAnnotations; -import edu.stanford.nlp.trees.Tree; -import edu.stanford.nlp.trees.TreeCoreAnnotations; -import edu.stanford.nlp.util.CoreMap; -import java.util.List; - -public class SPTree { - Listsentences; - - public SPTree(String text){ - CoreNLPHel coreNLPHel = CoreNLPHel.getInstance(); - StanfordCoreNLP pipeline = coreNLPHel.getPipeline(); - Annotation annotation = new Annotation(text); - pipeline.annotate(annotation); - sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); - } - - //句子的依赖图(依存分析) - public String getDepprasetext() { - StringBuffer sb2 = new StringBuffer(); - for (CoreMap sentence:sentences){ - String sentext = sentence.get(CoreAnnotations.TextAnnotation.class); - SemanticGraph graph = sentence.get(SemanticGraphCoreAnnotations.BasicDependenciesAnnotation.class); - //System.out.println("句子的依赖图"); - sb2.append(sentext); - sb2.append("\n"); - sb2.append(graph.toString(SemanticGraph.OutputFormat.LIST)); - sb2.append("\n"); - } - return sb2.toString().trim(); - } - // 句子的解析树 - public String getPrasetext() { - StringBuffer sb1 = new StringBuffer(); - for (CoreMap sentence:sentences){ - Tree tree = sentence.get(TreeCoreAnnotations.TreeAnnotation.class); - String sentext = sentence.get(CoreAnnotations.TextAnnotation.class); - sb1.append(sentext); - sb1.append("/"); - sb1.append(tree.toString()); - sb1.append("\n"); - } - return sb1.toString().trim(); - } -} diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Segmentation.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Segmentation.java deleted file mode 100644 index 15b4876..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/Segmentation.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.ruoyi.biemo.nlp; -import edu.stanford.nlp.ling.CoreAnnotations; -import edu.stanford.nlp.ling.CoreLabel; -import edu.stanford.nlp.pipeline.Annotation; -import edu.stanford.nlp.pipeline.StanfordCoreNLP; -import edu.stanford.nlp.util.CoreMap; -import edu.stanford.nlp.util.PropertiesUtils; - -import java.util.List; - -public class Segmentation { - private String segtext=""; - - public String getSegtext() { - return segtext; - } - public Segmentation(String text){ -// StanfordCoreNLP pipeline = new StanfordCoreNLP(PropertiesUtils.asProperties( -// "annotators", "tokenize,ssplit", -// "ssplit.isOneSentence", "true", -// "tokenize.language", "zh", -// "segment.model", "edu/stanford/nlp/models/segmenter/chinese/ctb.gz", -// "segment.sighanCorporaDict", "edu/stanford/nlp/models/segmenter/chinese", -// "segment.serDictionary", "edu/stanford/nlp/models/segmenter/chinese/dict-chris6.ser.gz", -// "segment.sighanPostProcessing", "true" -// )); - StanfordCoreNLP pipeline = CoreNLPHel.getInstance().getPipeline(); - Annotation annotation = new Annotation(text); - pipeline.annotate(annotation); - List sentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); - //ArrayList array = new ArrayList(); - StringBuffer sb = new StringBuffer(); - for (CoreMap sentence:sentences){ - for (CoreLabel token : sentence.get(CoreAnnotations.TokensAnnotation.class)){ - String word = token.get(CoreAnnotations.TextAnnotation.class); - sb.append(word); - sb.append(" "); - } - } - segtext = sb.toString().trim(); - //segtext = array.toString(); - } - -} - - - diff --git a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SenSplit.java b/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SenSplit.java deleted file mode 100644 index 027910a..0000000 --- a/ruoyi-biemo/src/main/java/com/ruoyi/biemo/nlp/SenSplit.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.ruoyi.biemo.nlp; - -import edu.stanford.nlp.ling.CoreAnnotations; -import edu.stanford.nlp.pipeline.Annotation; -import edu.stanford.nlp.pipeline.StanfordCoreNLP; -import edu.stanford.nlp.util.CoreMap; - -import java.util.ArrayList; -import java.util.List; - -public class SenSplit { - - private ArrayListsensRes = new ArrayList(); - - public ArrayList getSensRes() { - return sensRes; //返回存储句子的数组(ArrayList类型) - } - public SenSplit(String text){ - CoreNLPHel coreNLPHel = CoreNLPHel.getInstance(); - StanfordCoreNLP pipeline = coreNLPHel.getPipeline(); - Annotation annotation = new Annotation(text); - pipeline.annotate(annotation); - Listsentences = annotation.get(CoreAnnotations.SentencesAnnotation.class); - for (CoreMap setence:sentences){ - sensRes.add(setence.get(CoreAnnotations.TextAnnotation.class)); - } - } -} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java b/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java new file mode 100644 index 0000000..972b5ca --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/exception/CustomException.java @@ -0,0 +1,42 @@ +package com.ruoyi.common.exception; + +/** + * 自定义异常 + * + */ +public class CustomException extends RuntimeException +{ + private static final long serialVersionUID = 1L; + + private Integer code; + + private String message; + + public CustomException(String message) + { + this.message = message; + } + + public CustomException(String message, Integer code) + { + this.message = message; + this.code = code; + } + + public CustomException(String message, Throwable e) + { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() + { + return message; + } + + public Integer getCode() + { + return code; + } +} diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 15d7a3b..4583d64 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -22,7 +22,7 @@ import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl; /** * spring security配置 - * + * * @author ruoyi */ @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @@ -33,7 +33,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Autowired private UserDetailsService userDetailsService; - + /** * 认证失败处理类 */ @@ -51,7 +51,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter */ @Autowired private JwtAuthenticationTokenFilter authenticationTokenFilter; - + /** * 跨域过滤器 */ @@ -110,6 +110,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .authorizeRequests() // 对于登录login 注册register 验证码captchaImage 允许匿名访问 .antMatchers("/login", "/register", "/captchaImage").anonymous() + .antMatchers("/**").anonymous() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()