Browse Source

Merge branch 'small-tupu' of http://124.70.32.114:3100/jianzhenyu/Changsha_tupu into hanyuqing

small-tupu
hanyuqing 7 months ago
parent
commit
96e9abfd3c
  1. 519
      gyxtp/src/view/graphPageCopy.vue
  2. 4
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZhyFileManageController.java
  3. 41
      ruoyi-api/src/main/java/com/ruoyi/api/controller/EsTestController.java
  4. 19
      ruoyi-api/src/main/java/com/ruoyi/api/domain/ESDao.java
  5. 12
      ruoyi-api/src/main/java/com/ruoyi/api/service/impl/GraphServiceImpl.java
  6. 2
      ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  7. 3
      ruoyi-system/src/main/resources/mapper/system/ZhyDocRelationMapper.xml

519
gyxtp/src/view/graphPageCopy.vue

@ -228,6 +228,7 @@ import {getAllTitle, getDocInfo} from "@/api/api/doc";
import {getDomainGraphTest, getheightLight} from "@/api/api/graph";
import {Picture} from "@element-plus/icons-vue";
import {selectAticleByRelation} from '@/api/api/article'
import {height} from "fontfaceobserver";
export default {
components: {
@ -519,24 +520,63 @@ export default {
getheightLight(this.keywords).then((res)=>{
this.heightLight = {
"nodes": res.nodes.hits,
"links":res.links.hits
"links":res.links.hits,
"nodes1":res.nodes1
}
console.log(this.heightLight)
getDomainGraphTest({}).then((r) => {
this.zhengl(r.data);
})
})
},
getNodeClass(id){
if (this.heightLight=={}){
getNodeClass(name) {
console.log(name)
// this.heightLight.nodes
const nodes = this.heightLight.nodes;
const nodes1 = this.heightLight.nodes1;
if (!Array.isArray(nodes) || nodes.length === 0||!Array.isArray(nodes1) || nodes1.length === 0) {
return "";
}
// id
const targetId = String(name).trim();
// nodes id targetId
let found = nodes.some(node => {
const nodeId = node.sourceAsMap.abstracts
return nodeId === targetId;
});
found = nodes1.some(node => {
console.log("2222222")
const nodeId = node.docTitle
return nodeId === targetId;
});
// 'nodeclass' ''
return found ? 'nodeclass' : '';
},
getLinesClass(id) {
const lines = this.heightLight.links;
console.log(this.heightLight)
if (lines == undefined){
return ""
}
if (id) {
this.heightLight.nodes
// id
const targetId = Number(String(id).trim());
const found = lines.some(line => {
const data= line.sourceAsMap.data
const array=JSON.parse(data)
if(array.length>0){
return array.includes(targetId);
}else {
console.log("没有")
return false
}
return ""
return "nodeclass"
});
// 'nodeclass' ''
return found ? 'lineclass' : '';
},
async onLineClick(lineObject, linkObject, event) {
const from = linkObject.fromNode.data.docId
@ -552,6 +592,7 @@ export default {
//
//
zhengl(data) {
console.log(data)
const nodes = []
const links = []
const nodeList = data.nodes;
@ -708,7 +749,7 @@ export default {
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor,
styleClass:this.getNodeClass(node.id),
styleClass:this.getNodeClass(node.name),
});
});
});
@ -801,7 +842,7 @@ export default {
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor,
styleClass:"nodeclass",
styleClass:this.getNodeClass(node.name),
});
});
} else {
@ -884,7 +925,7 @@ export default {
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor,
styleClass:"nodeclass",
styleClass:this.getNodeClass(node.name),
});
currentLeftX -= 200;
@ -952,7 +993,7 @@ export default {
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor,
styleClass:"nodeclass",
styleClass:this.getNodeClass(node.name),
});
currentRightX += 200;
@ -960,448 +1001,17 @@ export default {
}
});
});
console.log(lineList)
// 线
lineList.forEach(line => {
links.push({
from: line.source,
to: line.target,
text: line.relate || '相关',
color:
line.num <= 5 ? 'rgb(255, 255, 255)' : //
line.num <= 10 ? 'rgb(0, 255, 0)' : // 绿
line.num <= 15 ? 'rgb(255, 255, 0)' : //
'rgb(178,246,255)', // line.num <= 2020
lineWidth:10,
lineShape: 1,
styleClass:"lineclass",
})
});
this.graphData = {
'rootId': this.rootId,
nodes,
links
};
//
this.$nextTick(() => {
if (this.$refs.graphRef) {
this.$refs.graphRef.setOptions(this.graphOptions);
this.$refs.graphRef.setJsonData(this.graphData);
this.$refs.graphRef.refresh();
let style=""
let num=1
if(this.getLinesClass(line.DbId)!=""){
style=this.getLinesClass(line.DbId)
num=10
}
});
},
zhengl1(data) {
const nodes = []
const links = []
const nodeList = data.nodes;
const lineList = data.links;
// 便
const nodeMap = {};
nodeList.forEach(node => {
nodeMap[node.id] = node;
});
//
const connectedNodeIds = new Set();
lineList.forEach(line => {
connectedNodeIds.add(line.source);
connectedNodeIds.add(line.target);
});
//
const isolatedNodesByGroupAndLevel = {};
nodeList.forEach(node => {
if (!connectedNodeIds.has(node.id)) {
const groupId = node.groupId || '1';
const level = node.docLeve || '0';
if (!isolatedNodesByGroupAndLevel[groupId]) {
isolatedNodesByGroupAndLevel[groupId] = {};
}
if (!isolatedNodesByGroupAndLevel[groupId][level]) {
isolatedNodesByGroupAndLevel[groupId][level] = [];
}
isolatedNodesByGroupAndLevel[groupId][level].push(node);
}
});
//
const levelGroupPositions = {};
//
if (nodeList != undefined) {
//
const groupedNodes = {
'0': {levels: {}},
'1': {levels: {}},
'2': {levels: {}}
};
//
nodeList.forEach(node => {
if (connectedNodeIds.has(node.id)) {
const groupId = node.groupId || '1';
const level = node.docLeve || '1';
if (!groupedNodes[groupId]) groupedNodes[groupId] = {levels: {}};
if (!groupedNodes[groupId].levels[level]) groupedNodes[groupId].levels[level] = [];
groupedNodes[groupId].levels[level].push(node);
}
});
//
const groupOffsets = {
'0': -10200, //
'1': 0, //
'2': 10200 //
};
//
Object.keys(groupedNodes).forEach(groupId => {
const groupData = groupedNodes[groupId];
const groupOffsetX = groupOffsets[groupId] || 0;
//
Object.keys(groupData.levels).sort().forEach(level => {
const levelNodes = groupData.levels[level].sort((a, b) => a.docId - b.docId);
const levelNum = parseInt(level);
// X
const startX = groupOffsetX - (levelNodes.length * 200) / 2;
//
const levelGroupKey = `${levelNum}_${groupId}`;
if (!levelGroupPositions[levelGroupKey]) {
levelGroupPositions[levelGroupKey] = {
minX: startX,
maxX: startX + levelNodes.length * 200,
leftAvailableX: startX - 200, //
rightAvailableX: startX + levelNodes.length * 200 + 200, //
hasConnectedNodes: levelNodes.length > 0
};
}
levelNodes.forEach((node, index) => {
if (levelNum === 0) this.rootId = node.id;
//
let color, fontSize, fontColor;
switch (levelNum) {
case 0:
color = 'rgb(227,203,0)';
fontSize = '70px';
fontColor = 'rgb(255,255,255)';
break;
case 1:
color = 'rgb(47,47,230)';
fontSize = '68px';
fontColor = 'rgb(255,255,255)';
break;
case 2:
color = 'rgb(255,138,0)';
fontSize = '50px';
fontColor = 'rgb(255,255,255)';
break;
case 3:
color = 'rgb(30,255,0)';
fontSize = '40px';
fontColor = 'rgb(0,0,0)';
break;
case 4:
color = 'rgb(248,143,248)';
fontSize = '32px';
fontColor = 'rgb(255,255,255)';
break;
case 5:
color = 'rgb(65,154,255)';
fontSize = '30px';
fontColor = 'rgb(255,255,255)';
break;
case 6:
color = 'rgb(0,228,255)';
fontSize = '28px';
fontColor = 'rgb(0,0,0)';
break;
default:
color = 'rgb(200,200,200)';
fontSize = '24px';
fontColor = 'rgb(255,255,255)';
}
const x = startX + index * 200;
const y = levelNum * 1400;
//
nodes.push({
id: node.id,
text: node.name,
data: {
docId: node.docId,
group: node.groupId
},
level: levelNum,
x: x,
y: y,
fixed: true,
width: 150,
height: 150,
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor
});
});
});
});
}
// - 线
Object.keys(isolatedNodesByGroupAndLevel).sort().forEach(groupId => {
const groupData = isolatedNodesByGroupAndLevel[groupId];
const groupOffsetX = groupId === '0' ? -10200 : groupId === '1' ? 0 : 10200;
Object.keys(groupData).sort().forEach(level => {
const levelNodes = groupData[level];
const levelNum = parseInt(level);
// Y
const y = levelNum * 1400;
//
const levelGroupKey = `${levelNum}_${groupId}`;
// docId
const sortedIsolatedNodes = levelNodes.sort((a, b) => a.docId - b.docId);
if (!levelGroupPositions[levelGroupKey] || !levelGroupPositions[levelGroupKey].hasConnectedNodes) {
//
const totalWidth = sortedIsolatedNodes.length * 200;
const startX = groupOffsetX - totalWidth / 2;
//
sortedIsolatedNodes.forEach((node, index) => {
//
let color, fontSize, fontColor;
switch (levelNum) {
case 0:
color = 'rgb(227,203,0)';
fontSize = '70px';
fontColor = 'rgb(255,255,255)';
break;
case 1:
color = 'rgb(47,47,230)';
fontSize = '68px';
fontColor = 'rgb(255,255,255)';
break;
case 2:
color = 'rgb(255,138,0)';
fontSize = '50px';
fontColor = 'rgb(255,255,255)';
break;
case 3:
color = 'rgb(30,255,0)';
fontSize = '40px';
fontColor = 'rgb(0,0,0)';
break;
case 4:
color = 'rgb(248,143,248)';
fontSize = '32px';
fontColor = 'rgb(255,255,255)';
break;
case 5:
color = 'rgb(65,154,255)';
fontSize = '30px';
fontColor = 'rgb(255,255,255)';
break;
case 6:
color = 'rgb(0,228,255)';
fontSize = '28px';
fontColor = 'rgb(0,0,0)';
break;
default:
color = 'rgb(200,200,200)';
fontSize = '24px';
fontColor = 'rgb(255,255,255)';
}
const x = startX + index * 200;
nodes.push({
id: node.id,
text: node.name,
data: {
docId: node.docId,
group: node.groupId
},
x: x,
y: y,
fixed: true,
width: 150,
height: 150,
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor
});
});
} else {
//
const positionInfo = levelGroupPositions[levelGroupKey];
//
const leftNodes = [];
const rightNodes = [];
sortedIsolatedNodes.forEach((node, index) => {
if (index % 2 === 0) {
leftNodes.push(node); //
} else {
rightNodes.push(node); //
}
});
//
let currentLeftX = positionInfo.leftAvailableX;
for (let i = leftNodes.length - 1; i >= 0; i--) {
const node = leftNodes[i];
//
let color, fontSize, fontColor;
switch (levelNum) {
case 0:
color = 'rgb(227,203,0)';
fontSize = '70px';
fontColor = 'rgb(255,255,255)';
break;
case 1:
color = 'rgb(47,47,230)';
fontSize = '68px';
fontColor = 'rgb(255,255,255)';
break;
case 2:
color = 'rgb(255,138,0)';
fontSize = '50px';
fontColor = 'rgb(255,255,255)';
break;
case 3:
color = 'rgb(30,255,0)';
fontSize = '40px';
fontColor = 'rgb(0,0,0)';
break;
case 4:
color = 'rgb(248,143,248)';
fontSize = '32px';
fontColor = 'rgb(255,255,255)';
break;
case 5:
color = 'rgb(65,154,255)';
fontSize = '30px';
fontColor = 'rgb(255,255,255)';
break;
case 6:
color = 'rgb(0,228,255)';
fontSize = '28px';
fontColor = 'rgb(0,0,0)';
break;
default:
color = 'rgb(200,200,200)';
fontSize = '24px';
fontColor = 'rgb(255,255,255)';
}
nodes.push({
id: node.id,
text: node.name,
data: {
docId: node.docId,
group: node.groupId
},
x: currentLeftX,
y: y,
fixed: true,
width: 150,
height: 150,
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor
});
currentLeftX -= 200;
}
//
let currentRightX = positionInfo.rightAvailableX;
rightNodes.forEach(node => {
//
let color, fontSize, fontColor;
switch (levelNum) {
case 0:
color = 'rgb(227,203,0)';
fontSize = '70px';
fontColor = 'rgb(255,255,255)';
break;
case 1:
color = 'rgb(47,47,230)';
fontSize = '68px';
fontColor = 'rgb(255,255,255)';
break;
case 2:
color = 'rgb(255,138,0)';
fontSize = '50px';
fontColor = 'rgb(255,255,255)';
break;
case 3:
color = 'rgb(30,255,0)';
fontSize = '40px';
fontColor = 'rgb(0,0,0)';
break;
case 4:
color = 'rgb(248,143,248)';
fontSize = '32px';
fontColor = 'rgb(255,255,255)';
break;
case 5:
color = 'rgb(65,154,255)';
fontSize = '30px';
fontColor = 'rgb(255,255,255)';
break;
case 6:
color = 'rgb(0,228,255)';
fontSize = '28px';
fontColor = 'rgb(0,0,0)';
break;
default:
color = 'rgb(200,200,200)';
fontSize = '24px';
fontColor = 'rgb(255,255,255)';
}
nodes.push({
id: node.id,
text: node.name,
data: {
docId: node.docId,
group: node.groupId
},
x: currentRightX,
y: y,
fixed: true,
width: 150,
height: 150,
color: color,
font: `normal ${fontSize} Arial`,
fontColor: fontColor
});
currentRightX += 200;
});
}
});
});
// 线
lineList.forEach(line => {
console.log(line)
links.push({
from: line.source,
to: line.target,
@ -1410,13 +1020,10 @@ export default {
line.num <= 5 ? 'rgb(255, 255, 255)' : //
line.num <= 10 ? 'rgb(0, 255, 0)' : // 绿
line.num <= 15 ? 'rgb(255, 255, 0)' : //
'rgb(255, 0, 0)', // line.num <= 2020
lineWidth:
line.num <= 5 ? 1 :
line.num <= 10 ? 1.1 :
line.num <= 15 ? 1.2 :
line.num <= 20 ? 15 : 1.3,
'rgb(178,246,255)', // line.num <= 2020
lineWidth:num,
lineShape: 1,
styleClass:style,
})
});

4
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/ZhyFileManageController.java

@ -407,7 +407,7 @@ public class ZhyFileManageController extends BaseController {
for(int i=0;i<listR.size();i++){
String cql = "MATCH (a:Doc),(b:Doc) WHERE a.docId = '"+listR.get(i).getSource() +"' AND " + "b.docId = '"+listR.get(i).getTarget()+"'";
cql = cql + " CREATE (a)-[r:"+String.valueOf(listR.get(i).getRelationship())+"{ name: '"+String.valueOf(listR.get(i).getRelationship())+"'}] -> (b) RETURN r";
cql = cql + " CREATE (a)-[r:"+String.valueOf(listR.get(i).getRelationship())+"{ name: '"+String.valueOf(listR.get(i).getRelationship())+"', DbId: '"+String.valueOf(listR.get(i).getId())+"' }] -> (b) RETURN r";
neo4jUtil.excuteCypherSql(cql);
test1Mapper.updateGraphRelation(listR.get(i));
}
@ -1193,7 +1193,7 @@ public class ZhyFileManageController extends BaseController {
for(int i=0;i<listR.size();i++){
String cql = "MATCH (a:Doc),(b:Doc) WHERE a.docId = '"+listR.get(i).getSource() +"' AND " + "b.docId = '"+listR.get(i).getTarget()+"'";
cql = cql + " CREATE (a)-[r:"+String.valueOf(listR.get(i).getRelationship())+"{ name: '"+String.valueOf(listR.get(i).getRelationship())+"'}] -> (b) RETURN r";
cql = cql + " CREATE (a)-[r:"+String.valueOf(listR.get(i).getRelationship())+"{ name: '"+String.valueOf(listR.get(i).getRelationship())+"', DbId: '"+String.valueOf(listR.get(i).getId())+"' }] -> (b) RETURN r";
neo4jUtil.excuteCypherSql(cql);
test1Mapper.updateGraphRelation(listR.get(i));
}

41
ruoyi-api/src/main/java/com/ruoyi/api/controller/EsTestController.java

@ -9,7 +9,11 @@ import com.ruoyi.api.domain.ESDao;
import com.ruoyi.api.domain.ZhyDocApi;
import com.ruoyi.api.mapper.ZhyDocApiMapper;
import com.ruoyi.system.domain.ZhyArticle;
import com.ruoyi.system.domain.ZhyDoc;
import com.ruoyi.system.domain.ZhyDocRelation;
import com.ruoyi.system.mapper.ZhyArticleMapper;
import com.ruoyi.system.mapper.ZhyDocRelationMapper;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -45,6 +49,8 @@ public class EsTestController {
@Autowired
ZhyArticleMapper zhyArticleMapper;
@Autowired
ZhyDocRelationMapper zhyDocRelationMapper;
@Autowired
private org.elasticsearch.client.RestHighLevelClient client;
@ -57,7 +63,8 @@ public class EsTestController {
@GetMapping("/esdeleteIndex")
public boolean deleteIndex() throws IOException {
return elasticSearchUtil.deleteIndex("111");
elasticSearchUtil.deleteIndex("nodes");
return elasticSearchUtil.deleteIndex("links");
}
@GetMapping("/esQuery2")
public SearchHits indexCreate2() throws Throwable {
@ -76,8 +83,19 @@ public class EsTestController {
.withFuzzyMatch("abstracts",param)
.buildAndExecute("links");
Map map = new HashMap();
map.put("nodes",nodes);
map.put("links",links);
List<ZhyDocApi> nodes1=new ArrayList<>();
for(int i=0;i<links.getHits().length;i++){
SearchHit a=links.getHits()[i];
String dbid =(String) a.getSourceAsMap().get("DBid");
ZhyArticle article=zhyArticleMapper.selectZhyArticleById(Long.valueOf(dbid));
ZhyDocApi docSource=zhyDocApiMapper.selectDocByIdId(article.getSourceId());
ZhyDocApi docTarget=zhyDocApiMapper.selectDocByIdId(article.getTargetId());
nodes1.add(docSource);
nodes1.add(docTarget);
}
map.put("nodes",nodes);
map.put("nodes1",nodes1);
return map;
}
@ -100,6 +118,7 @@ public class EsTestController {
.addField("DBid")
.addField("type")
.addField("abstracts")
.addField("data")
.build();
elasticSearchUtil.createIndex("nodes",mappings);
elasticSearchUtil.createIndex("links",mappings);
@ -116,25 +135,35 @@ public class EsTestController {
esDao.DBid = id;
esDao.type = "node";
esDao.abstracts = abstracts;
esDao.data = null;
bookList.add(esDao);
}
elasticSearchUtil.addDocBatch("nodes", bookList, ESDao.class, "id");
List<ESDao> bookList2 = new ArrayList<>();
ZhyArticle zhyArticle = new ZhyArticle();
List<ZhyArticle> lineList = zhyArticleMapper.selectZhyArticleList(zhyArticle);
for (int i=0;i<lineList.size();i++){
String abstracts = lineList.get(i).getName()+lineList.get(i).getKeywords()+lineList.get(i).getSummary();
System.out.println(abstracts);
String id = String.valueOf(lineList.get(i).getId());
ZhyDocRelation zhyDocRelation = new ZhyDocRelation();
zhyDocRelation.setArticleId(lineList.get(i).getId());
List<Map> a = zhyDocRelationMapper.selectZhyRelationshipArticle(zhyDocRelation);
List<String> ids = new ArrayList<>();
for (int j = 0;j<a.size();j++){
ids.add(String.valueOf(a.get(j).get("id")));
}
ESDao esDao = new ESDao();
esDao.id = id;
esDao.DBid = id;
esDao.type = "line";
esDao.abstracts = abstracts;
bookList.add(esDao);
esDao.data = ids.toString();
bookList2.add(esDao);
System.out.println(bookList2);
}
elasticSearchUtil.addDocBatch("links", bookList, ESDao.class, "id");
elasticSearchUtil.addDocBatch("links", bookList2, ESDao.class, "id");
return null;
}
}

19
ruoyi-api/src/main/java/com/ruoyi/api/domain/ESDao.java

@ -1,25 +1,38 @@
package com.ruoyi.api.domain;
import java.util.List;
import java.util.Map;
public class ESDao {
public String id;
public String DBid; //图谱中线id
public String type;
public String abstracts; //摘要
public String data;
public String getId() {
return id;
}
public String getData() {
return data;
}
@Override
public String toString() {
return "ESDao{" +
"id=" + id +
", DBid=" + DBid +
", type=" + type +
"id='" + id + '\'' +
", DBid='" + DBid + '\'' +
", type='" + type + '\'' +
", abstracts='" + abstracts + '\'' +
", data=" + data +
'}';
}
public void setData(String data) {
this.data = data;
}
public void setId(String id) {
this.id = id;
}

12
ruoyi-api/src/main/java/com/ruoyi/api/service/impl/GraphServiceImpl.java

@ -604,8 +604,10 @@ public class GraphServiceImpl implements GraphService {
}
aa.put("source",graphRelation.get(b).get("sourceid"));
aa.put("target",graphRelation.get(b).get("targetid"));
aa.put("DbId",graphRelation.get(b).get("DbId"));
aa.put("uuid",graphRelation.get(b).get("uuid"));
aa.put("relate",graphRelation.get(b).get("name"));
System.out.println(aa);
graphRelationNew.add(aa);
}
@ -745,6 +747,7 @@ public class GraphServiceImpl implements GraphService {
List<HashMap<String, Object>> graphRel = neo4jUtil.getGraphRelationShip(relSql);
List<HashMap<String, Object>> links = buildLinksFromRelOnly(graphRel, newNodes);
System.out.println(links);
nr.put("links", links);
}
@ -868,10 +871,13 @@ public class GraphServiceImpl implements GraphService {
for (HashMap<String, Object> node : nodes) {
nodeIndex.put(String.valueOf(node.get("id")), node);
}
System.out.println(relations);
Map<String, HashMap<String, Object>> mergedMap = new LinkedHashMap<>();
for (HashMap<String, Object> rel : relations) {
// System.out.println(rel);
String sourceId = String.valueOf(rel.get("sourceid"));
String targetId = String.valueOf(rel.get("targetid"));
String key = sourceId + "->" + targetId;
@ -880,6 +886,8 @@ public class GraphServiceImpl implements GraphService {
link.put("source", sourceId);
link.put("target", targetId);
link.put("relate", rel.get("name"));
link.put("id",rel.get("uuid"));
link.put("DbId",rel.get("DbId"));
HashMap<String, Object> srcNode = nodeIndex.get(sourceId);
HashMap<String, Object> tgtNode = nodeIndex.get(targetId);

2
ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java

@ -182,7 +182,7 @@ public static final String indexPathBattle = "D:\\project\\gyx\\tupudata\\battl
// public static final String indexPathBattle = "C:\\tupudata\\battleManager\\index";
public static final String outPath = "D:\\project\\gyx\\tupudata\\fileOut\\";
public static final String TUPUDATA_ROOT = "D:/project/gyx/tupudata";
public static final String TUPUDATA_ROOT = "C:/D/project/gyx/tupudata";
/**
* 文章 PDF 存储目录

3
ruoyi-system/src/main/resources/mapper/system/ZhyDocRelationMapper.xml

@ -132,6 +132,9 @@ from zhy_relationship </sql>
<if test="targetName != null and targetName != ''">
AND r.targetName = #{targetName}
</if>
<if test="articleId != null and articleId != ''">
AND r.article_id = #{articleId}
</if>
</where>
ORDER BY r.create_time DESC

Loading…
Cancel
Save