临时提交

master
hujunbo 3 years ago
parent 33d0f8b1d1
commit 849277cc01

@ -0,0 +1,34 @@
package com.ruoyi.task;
import com.ruoyi.biemo.business.domain.DocInfo;
import com.ruoyi.biemo.business.service.DocInfoService;
import com.ruoyi.biemo.mongodb.bean.Page;
import com.ruoyi.biemo.mongodb.utils.CriteriaAndWrapper;
import com.ruoyi.biemo.mongodb.utils.MongoHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
@Component("syncData")
public class SyncData {
@Autowired
MongoHelper mongoHelper;
@Autowired
DocInfoService docInfoService;
public void mongoToEs(){
Page<DocInfo> page = new Page();
Page<DocInfo> pageInfo = mongoHelper.findPage(new CriteriaAndWrapper().eq(DocInfo::getIsSync,0),page, DocInfo.class);
List<DocInfo> docInfos = pageInfo.getList();
if(docInfos!=null&& docInfos.size()>0){
docInfos.forEach(docInfo -> {
docInfo.setCreatedBy(1L);
docInfo.setUpdatedBy(1L);
docInfoService.insertEs(docInfo);
docInfo.setIsSync(1);
docInfoService.insertOrUpdateDocInfo(docInfo);
});
}
}
}

@ -7,9 +7,9 @@ spring:
port: 27017
username: makesoft
password: makesoft
elasticsearch:
rest:
uris: http://39.108.144.227:9200
#elasticsearch:
#rest:
#uris: http://39.108.144.227:9200
datasource:
type: com.alibaba.druid.pool.DruidDataSource
@ -66,3 +66,13 @@ spring:
wall:
config:
multi-statement-allow: true
elasticsearch:
schema: http
address: 39.108.144.227:9200
connectTimeout: 5000
socketTimeout: 5000
connectionRequestTimeout: 5000
maxConnectNum: 100
maxConnectPerRoute: 100

@ -44,6 +44,11 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.9.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

@ -67,7 +67,7 @@ public class DocInfoController extends BaseController {
*
*/
@PreAuthorize("@ss.hasPermi('biemo:docInfo:add')")
@Log(title = "文章管理", businessType = BusinessType.INSERT)
@Log(title = "文章新增", businessType = BusinessType.INSERT)
@RequestMapping
public AjaxResult add(@RequestBody DocInfo docInfo)
{
@ -80,11 +80,16 @@ public class DocInfoController extends BaseController {
*
*/
@PreAuthorize("@ss.hasPermi('biemo:docInfo:remove')")
@Log(title = "文章管理", businessType = BusinessType.DELETE)
@Log(title = "文章删除", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable String[] ids)
{
docInfoService.deleteDocInfoByIds(ids);
return AjaxResult.success();
}
@PostMapping("/analysis")
public AjaxResult analysis(String id){
return AjaxResult.success(docInfoService.analysis(id));
}
}

@ -35,6 +35,8 @@ public class DocInfo implements Serializable {
private String author;
@FieldInfo(type = "keyword",participle = 0)
private String source;
@FieldInfo(type = "long",participle = 0)
private Long click;
@FieldInfo(type = "keyword",participle = 0)
private String summary;
@FieldInfo(type = "keyword",participle = 0)
@ -51,6 +53,8 @@ public class DocInfo implements Serializable {
private Long createdBy;
@FieldInfo(type = "long",participle = 0)
private Long updatedBy;
@FieldInfo(type = "keyword",participle = 0)
private Integer isSync;
@CreateTime
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@FieldInfo(type = "datetime",participle = 0)

@ -9,6 +9,7 @@ import com.ruoyi.biemo.business.domain.event.DocInfoSaveEvent;
import com.ruoyi.biemo.core.page.Page;
import com.ruoyi.biemo.elasticsearch.util.EsService;
import com.ruoyi.biemo.mongodb.utils.MongoHelper;
import com.ruoyi.common.utils.StringUtils;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
@ -100,6 +101,15 @@ public class DocInfoService extends EsService<DocInfo> {
return id;
}
public void insertBatchEs(List<DocInfo> docInfos){
insertBatch(docInfos);
}
public void insertEs(DocInfo docInfo){
List<DocInfo> docInfos = new ArrayList<>();
docInfos.add(docInfo);
insertBatch(docInfos);
}
/**
*
@ -142,4 +152,13 @@ public class DocInfoService extends EsService<DocInfo> {
}
public String analysis(String id) {
if(StringUtils.isBlank(id)){
return null;
}
DocInfo docInfo = this.selectDocInfoById(id);
String content = docInfo.getContent();
return null;
}
}

@ -0,0 +1,74 @@
package com.ruoyi.biemo.elasticsearch.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class EsRestClientConfiguration {
/** 协议 */
@Value("${elasticsearch.schema:http}")
private String schema;
/** 集群地址,如果有多个用“,”隔开 */
@Value("${elasticsearch.address}")
private String address;
/** 连接超时时间 */
@Value("${elasticsearch.connectTimeout}")
private int connectTimeout;
/** Socket 连接超时时间 */
@Value("${elasticsearch.socketTimeout}")
private int socketTimeout;
/** 获取连接的超时时间 */
@Value("${elasticsearch.connectionRequestTimeout}")
private int connectionRequestTimeout;
/** 最大连接数 */
@Value("${elasticsearch.maxConnectNum}")
private int maxConnectNum;
/** 最大路由连接数 */
@Value("${elasticsearch.maxConnectPerRoute}")
private int maxConnectPerRoute;
@Bean(name = "restHighLevelClient")
public RestHighLevelClient restHighLevelClient(){
List<HttpHost> hostList = new ArrayList<>();
String[] addressArray = address.split(",");
for (String address : addressArray) {
String host = address.split(":")[0];
Integer port = Integer.parseInt(address.split(":")[1]);
hostList.add(new HttpHost(host, port, schema));
}
HttpHost[] httpPosts = hostList.toArray(new HttpHost[]{});
RestClientBuilder builder = RestClient.builder(httpPosts);
// 异步连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(connectTimeout);
requestConfigBuilder.setSocketTimeout(socketTimeout);
requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
return requestConfigBuilder;
});
// 异步连接数配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(maxConnectNum);
httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
return httpClientBuilder;
});
return new RestHighLevelClient(builder);
}
}

@ -47,6 +47,7 @@ import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.elasticsearch.annotations.Document;
import javax.print.Doc;
@ -72,6 +73,7 @@ public abstract class EsService<T> {
int BATCH_LOAD_SIZE = 200;
// ES 滚动查询 有效时间 与 scroll查询有关
TimeValue SCROLL_TIME = TimeValue.timeValueMinutes(1);
@Qualifier("restHighLevelClient")
@Autowired
private RestHighLevelClient client;
@ -284,6 +286,8 @@ public abstract class EsService<T> {
client.index(request, RequestOptions.DEFAULT);
} catch (Exception e) {
throw new RuntimeException(e);
}finally {
}
}
@ -590,6 +594,7 @@ public abstract class EsService<T> {
return new EsQueryBuilder();
}
@Data
protected class EsQueryBuilder {

@ -305,6 +305,8 @@ public class MongoHelper {
Long time = System.currentTimeMillis();
String id = (String) ReflectUtil.getFieldValue(object, Constant.ID);
Long createdBy = (Long) ReflectUtil.getFieldValue(object, Constant.CREATEDBY);
Long updatedBy = (Long) ReflectUtil.getFieldValue(object, Constant.UPDATEDBY);
Object objectOrg = StrUtil.isNotEmpty(id) ? findById(id, object.getClass()) : null;
if (objectOrg == null) {
@ -323,17 +325,24 @@ public class MongoHelper {
Object objectClone = BeanUtil.copyProperties(object, object.getClass());
ignoreColumn(objectClone);
//设置创建人
ReflectUtil.setFieldValue(objectClone, Constant.CREATEDBY, SecurityUtils.getUserId());
ReflectUtil.setFieldValue(objectClone, Constant.UPDATEDBY, SecurityUtils.getUserId());
if(createdBy==null){
ReflectUtil.setFieldValue(objectClone, Constant.CREATEDBY, SecurityUtils.getUserId());
}
if(updatedBy==null){
ReflectUtil.setFieldValue(objectClone, Constant.UPDATEDBY, SecurityUtils.getUserId());
}
mongoTemplate.save(objectClone);
id = (String) ReflectUtil.getFieldValue(objectClone, Constant.ID);
// 设置id值
ReflectUtil.setFieldValue(object, Constant.ID, id);
//设置创建人
ReflectUtil.setFieldValue(object, Constant.CREATEDBY, SecurityUtils.getUserId());
ReflectUtil.setFieldValue(object, Constant.UPDATEDBY, SecurityUtils.getUserId());
if(createdBy==null){
ReflectUtil.setFieldValue(object, Constant.CREATEDBY, SecurityUtils.getUserId());
}
if(updatedBy==null){
ReflectUtil.setFieldValue(object, Constant.UPDATEDBY, SecurityUtils.getUserId());
}
logSave(objectClone, time, true);
} else {
@ -345,14 +354,14 @@ public class MongoHelper {
ReflectUtil.setFieldValue(objectOrg, field, ReflectUtil.getFieldValue(object, field));
}
}
// 设置更新时间
setUpdateTime(objectOrg, time);
setUpdateTime(object, time);
//设置更新人
ReflectUtil.setFieldValue(objectOrg, Constant.UPDATEDBY, SecurityUtils.getUserId());
ReflectUtil.setFieldValue(object, Constant.UPDATEDBY, SecurityUtils.getUserId());
if(updatedBy==null){
ReflectUtil.setFieldValue(objectOrg, Constant.UPDATEDBY, SecurityUtils.getUserId());
ReflectUtil.setFieldValue(object, Constant.UPDATEDBY, SecurityUtils.getUserId());
}
// 克隆一个@IgnoreColumn的字段设为null的对象;
Object objectClone = BeanUtil.copyProperties(objectOrg, object.getClass());
ignoreColumn(objectClone);

@ -0,0 +1,111 @@
* {
margin: 0px;
padding: 0px;
}
body {
font: 13px 'Helvetica Neue',Helvetica,Arial,sans-serif;
font-size: 20px;
}
.neo4jd3-graph {
border: 1px solid #ddd;
border-radius: 5px;
}
.neo4jd3-info {
font-size: 16px;
padding: 10px;
position: absolute;
}
.neo4jd3-info a {
border: 1px solid;
display: inline-block;
font-size: 14px;
line-height: 1.428571429;
margin-left: 5px;
margin-top: 5px;
padding: 6px 12px;
}
.neo4jd3-info a.class {
color: white;
}
.neo4jd3-info a.property {
background-color: #fff;
border-color: #ccc;
color: #333;
}
.neo4jd3-info a.btn {
margin-left: 5px;
margin-top: 5px;
opacity: 1;
}
.neo4jd3-info a.info {
background-color: #a5abb6;
border: 1px solid #9aa1ac;
color: white;
}
.node.node-highlighted .ring {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=50)';
filter: alpha(opacity=50);
opacity: .5;
stroke: #888;
stroke-width: 12px;
}
.node .outline {
cursor: pointer;
fill: #a5abb6;
pointer-events: all;
stroke: #9aa1ac;
stroke-width: 2px;
}
.node .ring {
fill: none;
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';
filter: alpha(opacity=0);
opacity: 0;
stroke: #6ac6ff;
stroke-width: 8px;
}
.node .text.icon {
font-family: FontAwesome;
}
.node.selected .ring,
.node:hover .ring {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)';
filter: alpha(opacity=30);
opacity: .3;
}
.relationship {
cursor: default;
}
.relationship line {
stroke: #aaa;
}
.relationship .outline {
cursor: default;
}
.relationship .overlay {
cursor: default;
fill: #6ac6ff;
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)';
filter: alpha(opacity=0);
opacity: 0;
}
.relationship text {
cursor: default;
}
.relationship.selected .overlay,
.relationship:hover .overlay {
-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)';
filter: alpha(opacity=30);
opacity: .3;
}
svg {
cursor: move;
}

@ -0,0 +1 @@
*{margin:0;padding:0}body{font:13px Helvetica Neue,Helvetica,Arial,sans-serif;font-size:20px}.neo4jd3-graph{border:1px solid #ddd;border-radius:5px}.neo4jd3-info{font-size:16px;padding:10px;position:absolute}.neo4jd3-info a{border:1px solid;display:inline-block;font-size:14px;line-height:1.428571429;margin-left:5px;margin-top:5px;padding:6px 12px}.neo4jd3-info a.class{color:#fff}.neo4jd3-info a.property{background-color:#fff;border-color:#ccc;color:#333}.neo4jd3-info a.btn{margin-left:5px;margin-top:5px;opacity:1}.neo4jd3-info a.info{background-color:#a5abb6;border:1px solid #9aa1ac;color:#fff}.node.node-highlighted .ring{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";filter:alpha(opacity=50);opacity:.5;stroke:#888;stroke-width:12px}.node .outline{cursor:pointer;fill:#a5abb6;pointer-events:all;stroke:#9aa1ac;stroke-width:2px}.node .ring{fill:none;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;stroke:#6ac6ff;stroke-width:8px}.node .text.icon{font-family:FontAwesome}.node.selected .ring,.node:hover .ring{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";filter:alpha(opacity=30);opacity:.3}.relationship{cursor:default}.relationship line{stroke:#aaa}.relationship .outline{cursor:default}.relationship .overlay{cursor:default;fill:#6ac6ff;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0}.relationship text{cursor:default}.relationship.selected .overlay,.relationship:hover .overlay{-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)";filter:alpha(opacity=30);opacity:.3}svg{cursor:move}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -17,7 +17,7 @@ module.exports = {
/**
* 是否显示 tagsView
*/
tagsView: true,
tagsView: false,
/**
* 是否固定头部

@ -1 +1,138 @@
图谱浏览
<template>
<div id="neo4jd3"></div>
</template>
<script>
import { getDocInfo } from "@/api/biemo/docInfo";
export default {
data(){
return{
docInfo: {},
isOpen: true
}
},
props: ["id"],
created(){
this.getDocInfoById(this.id);
this.init();
},
mounted() {
},
methods: {
getDocInfoById(id){
getDocInfo(id).then(response=>{
this.docInfo = response.data;
});
},
init() {
var neo4jd3 = new Neo4jd3('#neo4jd3', {
highlight: [
{
class: 'Project',
property: 'name',
value: 'neo4jd3'
}, {
class: 'User',
property: 'userId',
value: 'eisman'
}
],
icons: {
// 'Address': 'home',
'Api': 'gear',
// 'BirthDate': 'birthday-cake',
'Cookie': 'paw',
// 'CreditCard': 'credit-card',
// 'Device': 'laptop',
'Email': 'at',
'Git': 'git',
'Github': 'github',
'Google': 'google',
// 'icons': 'font-awesome',
'Ip': 'map-marker',
'Issues': 'exclamation-circle',
'Language': 'language',
'Options': 'sliders',
'Password': 'lock',
'Phone': 'phone',
'Project': 'folder-open',
'SecurityChallengeAnswer': 'commenting',
'User': 'user',
'zoomFit': 'arrows-alt',
'zoomIn': 'search-plus',
'zoomOut': 'search-minus'
},
images: {
'Address': 'img/twemoji/1f3e0.svg',
// 'Api': 'img/twemoji/1f527.svg',
'BirthDate': 'img/twemoji/1f382.svg',
'Cookie': 'img/twemoji/1f36a.svg',
'CreditCard': 'img/twemoji/1f4b3.svg',
'Device': 'img/twemoji/1f4bb.svg',
'Email': 'img/twemoji/2709.svg',
'Git': 'img/twemoji/1f5c3.svg',
'Github': 'img/twemoji/1f5c4.svg',
'icons': 'img/twemoji/1f38f.svg',
'Ip': 'img/twemoji/1f4cd.svg',
'Issues': 'img/twemoji/1f4a9.svg',
'Language': 'img/twemoji/1f1f1-1f1f7.svg',
'Options': 'img/twemoji/2699.svg',
'Password': 'img/twemoji/1f511.svg',
// 'Phone': 'img/twemoji/1f4de.svg',
'Project': 'img/twemoji/2198.svg',
'Project|name|neo4jd3': 'img/twemoji/2196.svg',
// 'SecurityChallengeAnswer': 'img/twemoji/1f4ac.svg',
'User': 'img/twemoji/1f600.svg'
// 'zoomFit': 'img/twemoji/2194.svg',
// 'zoomIn': 'img/twemoji/1f50d.svg',
// 'zoomOut': 'img/twemoji/1f50e.svg'
},
minCollision: 60,
neo4jDataUrl: 'json/neo4jData.json',
nodeRadius: 25,
onNodeDoubleClick: function(node) {
switch(node.id) {
case '25':
// Google
window.open(node.properties.url, '_blank');
break;
default:
var maxNodes = 5,
data = neo4jd3.randomD3Data(node, maxNodes);
neo4jd3.updateWithD3Data(data);
break;
}
},
onRelationshipDoubleClick: function(relationship) {
console.log('double click on relationship: ' + JSON.stringify(relationship));
},
zoomFit: true
});
}
}
}
</script>
<style lang="scss">
.newsinfo-container {
padding: 0 4px;
.title {
font-size: 20px;
text-align: center;
margin: 15px 0;
color: #000000;
}
.subtitle {
font-size: 16px;
color: #090909;
display: flex;
justify-content: center ;
}
.content {
width: 100%;
justify-content: center ;
font-size: 16px;
}
}
</style>

@ -1,21 +1,64 @@
<template>
<span>文章详情{{id}}</span>
<div class="newsinfo-container">
<!-- 大标题 -->
<h3 class="title">{{ docInfo.title }}</h3>
<!-- 子标题 -->
<p class="subtitle">
<span>发表时间{{ parseTime(docInfo.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }} <span v-html="'&nbsp;&nbsp;'"></span></span>
<span>作者{{ docInfo.author }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>来源{{ docInfo.source }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>评分{{ docInfo.score }}<span v-html="'&nbsp;&nbsp;'"></span></span>
<span>点击{{ docInfo.click }}</span>
</p>
<hr>
<!-- 内容区域 -->
<div class="content" v-html="docInfo.content"></div>
</div>
</template>
<script>
import { getDocInfo } from "@/api/biemo/docInfo";
export default {
data(){
return{
num:"xxxxx"
docInfo: {},
isOpen: true
}
},
props: ["id"],
computed(){
this.getNum();
created(){
this.getDocInfoById(this.id);
},
methods: {
getNum(){
getDocInfoById(id){
getDocInfo(id).then(response=>{
this.docInfo = response.data;
});
}
}
}
</script>
<style lang="scss">
.newsinfo-container {
padding: 0 4px;
.title {
font-size: 20px;
text-align: center;
margin: 15px 0;
color: #000000;
}
.subtitle {
font-size: 16px;
color: #090909;
display: flex;
justify-content: center ;
}
.content {
width: 100%;
justify-content: center ;
font-size: 16px;
}
}
</style>

@ -103,7 +103,13 @@
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="摘要" align="center" prop="summary" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="状态" align="center">
<template slot-scope="scope">
<span v-if="scope.row.status == 0||scope.row.status ==null"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="分属分类" align="center" prop="cateId" />
<el-table-column label="修改时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
@ -316,7 +322,6 @@ export default {
handleDetail(row) {
const id = row.id || this.ids
this.$tab.openPage("文章详情", '/docInfo/doc-detail/'+id, {});
},
/** 提交按钮 */
submitForm() {

Loading…
Cancel
Save