sprinboot+vue集成neo4j图数据库
一 、java后台
1.1
package com.admin.domain; /** * 功能描述: * * @author wangwei * @date 2024-01-15 22:13 */ public class ConnectWeb { private String connectWebId; private String connectWebName; private String connectWebInfo; private String personWebIdAlpha; private String personWebIdBeta; private String personWebIdAlphaName; private String personWebIdBetaName; public String getPersonWebIdAlphaName() { return personWebIdAlphaName; } public void setPersonWebIdAlphaName(String personWebIdAlphaName) { this.personWebIdAlphaName = personWebIdAlphaName; } public String getPersonWebIdBetaName() { return personWebIdBetaName; } public void setPersonWebIdBetaName(String personWebIdBetaName) { this.personWebIdBetaName = personWebIdBetaName; } public String getConnectWebId() { return connectWebId; } public void setConnectWebId(String connectWebId) { this.connectWebId = connectWebId; } public String getConnectWebName() { return connectWebName; } public void setConnectWebName(String connectWebName) { this.connectWebName = connectWebName; } public String getConnectWebInfo() { return connectWebInfo; } public void setConnectWebInfo(String connectWebInfo) { this.connectWebInfo = connectWebInfo; } public String getPersonWebIdAlpha() { return personWebIdAlpha; } public void setPersonWebIdAlpha(String personWebIdAlpha) { this.personWebIdAlpha = personWebIdAlpha; } public String getPersonWebIdBeta() { return personWebIdBeta; } public void setPersonWebIdBeta(String personWebIdBeta) { this.personWebIdBeta = personWebIdBeta; } @Override public String toString() { return "ConnectWeb{" + "connectWebId='" + connectWebId + '\'' + ", connectWebName='" + connectWebName + '\'' + ", connectWebInfo='" + connectWebInfo + '\'' + ", personWebIdAlpha='" + personWebIdAlpha + '\'' + ", personWebIdBeta='" + personWebIdBeta + '\'' + ", personWebIdAlphaName='" + personWebIdAlphaName + '\'' + ", personWebIdBetaName='" + personWebIdBetaName + '\'' + '}'; } }
1.2
package com.admin.domain; /** * 功能描述: *人物属性实体描述 * * @author wangwei * @date 2024-01-15 22:12 */ public class PersonWeb { private String personWebId; private String personWebName; private String personWebPic; private String personWebShow; private String personWebLink; private String personWebPlatform; private String personWebField; private String personWebInfo; private String personWebKey; public String getPersonWebId() { return personWebId; } public void setPersonWebId(String personWebId) { this.personWebId = personWebId; } public String getPersonWebName() { return personWebName; } public void setPersonWebName(String personWebName) { this.personWebName = personWebName; } public String getPersonWebPlatform() { return personWebPlatform; } public void setPersonWebPlatform(String personWebPlatform) { this.personWebPlatform = personWebPlatform; } public String getPersonWebField() { return personWebField; } public void setPersonWebField(String personWebField) { this.personWebField = personWebField; } public String getPersonWebInfo() { return personWebInfo; } public void setPersonWebInfo(String personWebInfo) { this.personWebInfo = personWebInfo; } public String getPersonWebKey() { return personWebKey; } public void setPersonWebKey(String personWebKey) { this.personWebKey = personWebKey; } public String getPersonWebPic() { return personWebPic; } public void setPersonWebPic(String personWebPic) { this.personWebPic = personWebPic; } public String getPersonWebShow() { return personWebShow; } public void setPersonWebShow(String personWebShow) { this.personWebShow = personWebShow; } public String getPersonWebLink() { return personWebLink; } public void setPersonWebLink(String personWebLink) { this.personWebLink = personWebLink; } @Override public String toString() { return "PersonWeb{" + "personWebId='" + personWebId + '\'' + ", personWebName='" + personWebName + '\'' + ", personWebPic='" + personWebPic + '\'' + ", personWebShow='" + personWebShow + '\'' + ", personWebLink='" + personWebLink + '\'' + ", personWebPlatform='" + personWebPlatform + '\'' + ", personWebField='" + personWebField + '\'' + ", personWebInfo='" + personWebInfo + '\'' + ", personWebKey='" + personWebKey + '\'' + '}'; } }
1.3
package com.admin.controller; import com.admin.common.core.controller.BaseController; import com.admin.common.core.domain.AjaxResult; import com.admin.common.core.page.TableDataInfo; import com.admin.domain.ConnectWeb; import com.admin.domain.PersonWeb; import com.admin.service.WebService; import com.admin.utils.transport.Result; import org.neo4j.driver.Record; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; /** * 功能描述: * * @author wangwei * @date 2024-01-16 11:09 */ @RestController @RequestMapping("/people/web") public class WebController extends BaseController { @Autowired private WebService webService; @GetMapping("/map") public TableDataInfo getPersonWebMap() { List list = webService.selectPersonWebMap(); return getDataTable(list); } @GetMapping("/list") public TableDataInfo getPersonWebList() { List list = webService.selectPersonWebList(); return getDataTable(list); } @GetMapping("/search/{personWebName}") public AjaxResult getPersonWebSearchList(@PathVariable("personWebName") String personWebName) { List list = webService.selectPersonWebSearchList(personWebName); return AjaxResult.success(list); } @GetMapping("/search/{personWebId}/{personWebName}") public AjaxResult getPersonWebSearchListOther(@PathVariable("personWebName") String personWebName, @PathVariable("personWebId") String personWebId) { List list = webService.selectPersonWebSearchListOther(personWebName, personWebId); return AjaxResult.success(list); } @GetMapping(value = "/person/{personWebId}") public AjaxResult getPersonWebInfo(@PathVariable("personWebId") String personWebId) { return AjaxResult.success(webService.selectPersonWebById(personWebId)); } @PostMapping("/person") public AjaxResult addPersonWeb(@RequestBody PersonWeb personWeb) { return toAjax(webService.insertPersonWeb(personWeb)); } @PutMapping("/person") public AjaxResult editPersonWeb(@RequestBody PersonWeb personWeb) { return toAjax(webService.updatePersonWeb(personWeb)); } @DeleteMapping("/person/{personWebId}") public AjaxResult removePersonWeb(@PathVariable String personWebId) { try{ int rsg = webService.deletePersonWeb(personWebId); return toAjax(rsg); } catch (Exception e){ return AjaxResult.error(500, "此节点仍与其他节点有关联关系!"); } } @GetMapping(value = "/connect/{connectWebId}") public AjaxResult getInfoConnectWeb(@PathVariable("connectWebId") String connectWebId) { return AjaxResult.success(webService.selectConnectWebById(connectWebId)); } @PostMapping("/connect") public AjaxResult addConnectWeb(@RequestBody ConnectWeb connectWeb) { return toAjax(webService.insertConnectWeb(connectWeb)); } @PutMapping("/connect") public AjaxResult editConnectWeb(@RequestBody ConnectWeb connectWeb) { return toAjax(webService.updateConnectWeb(connectWeb)); } @DeleteMapping("/connect/{connectWebId}") public AjaxResult removeConnectWeb(@PathVariable String connectWebId) { return toAjax(webService.deleteConnectWeb(connectWebId)); } }
1.4
package com.admin.service; import com.admin.domain.ConnectWeb; import com.admin.domain.PersonWeb; import org.neo4j.driver.Record; import java.util.List; public interface WebService { List selectPersonWebMap(); public List selectPersonWebList() ; public List selectPersonWebSearchList(String personWebName) ; public List selectPersonWebSearchListOther(String personWebName, String personWebId) ; public PersonWeb selectPersonWebById(String personWebId) ; public int insertPersonWeb(PersonWeb personWeb) ; public int updatePersonWeb(PersonWeb personWeb) ; public int deletePersonWeb(String personWebId) ; public ConnectWeb selectConnectWebById(String connectWebId) ; public int insertConnectWeb(ConnectWeb connectWeb) ; public int updateConnectWeb(ConnectWeb connectWeb) ; public int deleteConnectWeb(String connectWebId) ; }
1.5
package com.admin.service.impl; import com.admin.common.annotation.DataSource; import com.admin.common.enums.DataSourceType; import com.admin.domain.ConnectWeb; import com.admin.domain.PersonWeb; import com.admin.mapper.ConnectWebMapper; import com.admin.mapper.PersonWebMapper; import com.admin.service.WebService; import com.admin.utils.SnowflakeIdWorker; import org.neo4j.driver.Record; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class WebServiceImpl implements WebService { @Autowired private PersonWebMapper personWebMapper; @Autowired private ConnectWebMapper connectWebMapper; @Autowired private SnowflakeIdWorker snowflakeIdWorker; @DataSource(value = DataSourceType.SLAVE) public List selectPersonWebMap() { return personWebMapper.selectPersonWebMap(); } @DataSource(value = DataSourceType.SLAVE) public List selectPersonWebList() { List personWebs = personWebMapper.selectPersonWebList(); return personWebs; } @DataSource(value = DataSourceType.SLAVE) public List selectPersonWebSearchList(String personWebName) { // System.out.println(personWebName); return personWebMapper.selectPersonWebSearchList(personWebName); } @DataSource(value = DataSourceType.SLAVE) public List selectPersonWebSearchListOther(String personWebName, String personWebId) { // System.out.println(personWebName); return personWebMapper.selectPersonWebSearchListOther(personWebName, personWebId); } @DataSource(value = DataSourceType.SLAVE) public PersonWeb selectPersonWebById(String personWebId) { return personWebMapper.selectPersonWebById(personWebId); } @DataSource(value = DataSourceType.SLAVE) public int insertPersonWeb(PersonWeb personWeb) { personWeb.setPersonWebId(snowflakeIdWorker.nextId()); return personWebMapper.insertPersonWeb(personWeb); } @DataSource(value = DataSourceType.SLAVE) public int updatePersonWeb(PersonWeb personWeb) { return personWebMapper.updatePersonWeb(personWeb); } @DataSource(value = DataSourceType.SLAVE) public int deletePersonWeb(String personWebId) { return personWebMapper.deletePersonWeb(personWebId); } @DataSource(value = DataSourceType.SLAVE) public ConnectWeb selectConnectWebById(String connectWebId) { return connectWebMapper.selectConnectWebById(connectWebId); } @DataSource(value = DataSourceType.SLAVE) public int insertConnectWeb(ConnectWeb connectWeb) { connectWeb.setConnectWebId(snowflakeIdWorker.nextId()); return connectWebMapper.insertConnectWeb(connectWeb); } @DataSource(value = DataSourceType.SLAVE) public int updateConnectWeb(ConnectWeb connectWeb) { return connectWebMapper.updateConnectWeb(connectWeb); } @DataSource(value = DataSourceType.SLAVE) public int deleteConnectWeb(String connectWebId) { return connectWebMapper.deleteConnectWeb(connectWebId); } }
1.6
package com.admin.mapper; import com.admin.domain.ConnectWeb; import org.springframework.stereotype.Repository; /** * @author wangwei */ @Repository public interface ConnectWebMapper { /** * 查询单个连接信息 * * @param connectWebId 连接id * @return ConnectWeb实体信息 */ ConnectWeb selectConnectWebById(String connectWebId); /** * 插入单个连接信息 * * @param connectWeb 连接实体 * @return 插入个数 */ int insertConnectWeb(ConnectWeb connectWeb); /** * 修改单个连接信息 * * @param connectWeb 修改实体 * @return 插入个数 */ int updateConnectWeb(ConnectWeb connectWeb); /** * 删除单个连接 * * @param connectWebId 连接实体 * @return 删除个数 */ int deleteConnectWeb(String connectWebId); }
1.7
MATCH (m)-[c:ConnectWeb{ connectWebId: #{connectWebId} }]->(n) RETURN c.connectWebId as connectWebId, c.connectWebName as connectWebName, c.connectWebInfo as connectWebInfo, m.personWebId as personWebIdAlpha, m.personWebName as personWebIdAlphaName, n.personWebId as personWebIdBeta, n.personWebName as personWebIdBetaName match(pa:PersonWeb{ personWebId: #{personWebIdAlpha} }),(pb:PersonWeb{ personWebId: #{personWebIdBeta} }) merge (pa)-[c:ConnectWeb{ connectWebId: #{connectWebId}, connectWebName: #{connectWebName}, connectWebInfo: #{connectWebInfo} }]->(pb) MATCH (m)-[c:ConnectWeb{ connectWebId: #{connectWebId} }]->(n) c.connectWebName = #{connectWebName}, c.connectWebInfo = #{connectWebInfo}, m.personWebId = #{personWebIdAlpha}, n.personWebId = #{personWebIdBeta}, MATCH ()-[c:ConnectWeb{ connectWebId: #{connectWebId} }]-() DELETE c
1.8 maven
org.neo4j neo4j-jdbc-driver 4.0.1
1.9 数据库配置
#TODO 从库数据源 neo4j slave: # 从数据源开关/默认关闭 enabled: true url: jdbc:neo4j:bolt://127.0.0.1:1273 username: neo4j password: neo4j driverClassName: org.neo4j.jdbc.bolt.BoltDriver #TODO NEO4J 配置检测连接是否有效 validationQuery: match (n) return id(n) limit 2
二、vue前台
2.1
新增成员 修改成员 新增关系 {{ scope.row.personWebName }} {{ scope.row.personWebName }}{{ikey}} {{ scope.row.personWebShow | statusShowFilter}} 修改 删除 删除 取消 确定 上传图片 更新图片 预览 {{dict.dictLabel}} {{tag}} + 新标签 {{dict.dictLabel}} 确 定 取 消
确定 // import graph from '@/assets/binray/les-miserables'; import { getPersonWebMap, getPersonWebList, getPersonWebSearch, getPersonWebInfo, addPersonWeb, editPersonWeb, removePersonWeb, getInfoConnectWeb, addConnectWeb, editConnectWeb, removeConnectWeb, getPersonWebSearchOther } from '@/api/person'; import 'babel-polyfill'; // es6 shim import myUpload from 'vue-image-crop-upload/upload-2'; export default { name: 'Echarts', components: {myUpload}, filters: { statusShowFilter(status) { const statusMap = { 0: '正常', 1: '已下线', } return statusMap[status] }, statusFilter(status) { const statusMap = { 0: 'success', 1: 'warning', } return statusMap[status] } }, data() { return { // 新增or更新,新增为true,更新为false requireFlag: false, myChart: undefined, // 表单参数 form: {}, formConnect: {}, // 表单校验 rules: { personWebName: [{ required: true, message: '成员名称为必填项', trigger: 'blur' }], /* personWebPic: [{ required: true, message: '成员头图为必填项', trigger: 'change' }],*/ personWebShow: [{ required: true, message: '是否展示为必填项', trigger: 'change' }], }, rulesConnect: { personWebIdAlpha: [{ required: true, message: '', trigger: 'blur' }], personWebIdBeta: [{ required: true, message: '', trigger: 'blur' }], connectWebName: [{ required: true, message: '请输入关联关系', trigger: 'blur' }], connectWebInfo: [{ required: true, message: '请输入关联信息', trigger: 'blur' }], }, selectLoading: false, optionsStart: [], optionsEnd: [], personList: [], personMap: [], // 临时标签列表 personWebPlatformTemp: undefined, personWebFieldTemp: undefined, // 路径 person_pic_url: process.env.VUE_APP_BASE_API + "/File/upload/nosql/", //D:\File\upload\nosql // 图片预览框 picVisible: false, // 拼接 answerPicImageUrl: "", // 路径 // 遮罩层 loading: true, // 选中数组 ids: [], // 非单个禁用 single: true, // 非多个禁用 multiple: true, // 显示搜索条件 showSearch: true, // 总条数 total: 0, upload: { // 显示上传图片的弹出框 cropperShow: false, // 图标路径 logo_url: process.env.VUE_APP_BASE_API + "/common/upload", }, // 弹出层标题 title: "", titleConnect: "", // 是否显示弹出层 open: false, openConnect: false, inputVisible: false, // 具体内容 inputValue: '', personWebShowOptions: [], personWebPlatformOptions: [], searchQueryParams: { // 这个一定得有 personWebIdStart: null, // 这个可有可无 personWebIdEnd: null, }, graph: { nodes: [], links: [] }, mapCheckList: [] } }, created() { this.getList(); this.personWebShowOptions = [{ "searchValue": null, "createBy": "admin", "createTime": "2021-02-21 19:29:04", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 124, "dictSort": 0, "dictLabel": "已上架", "dictValue": "0", "dictType": "material_public", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-02-21 19:29:39", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 125, "dictSort": 1, "dictLabel": "未发布", "dictValue": "1", "dictType": "material_public", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }]; this.personWebPlatformOptions = [{ "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:20:51", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 135, "dictSort": 0, "dictLabel": "哔哩哔哩", "dictValue": "0", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:21:03", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 136, "dictSort": 1, "dictLabel": "今日头条", "dictValue": "1", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:21:12", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 137, "dictSort": 2, "dictLabel": "抖音", "dictValue": "2", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:21:21", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 138, "dictSort": 3, "dictLabel": "西瓜视频", "dictValue": "3", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:21:29", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 139, "dictSort": 4, "dictLabel": "YouTube", "dictValue": "4", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:22:06", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 140, "dictSort": 5, "dictLabel": "知乎", "dictValue": "5", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:22:17", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 141, "dictSort": 6, "dictLabel": "小红书", "dictValue": "6", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:22:27", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 142, "dictSort": 7, "dictLabel": "快手", "dictValue": "7", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:22:49", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 143, "dictSort": 8, "dictLabel": "Acfun", "dictValue": "8", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:23:05", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 144, "dictSort": 9, "dictLabel": "网易云音乐", "dictValue": "9", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:23:34", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 145, "dictSort": 10, "dictLabel": "豆瓣", "dictValue": "10", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:23:52", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 146, "dictSort": 11, "dictLabel": "微博", "dictValue": "11", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:24:34", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 147, "dictSort": 12, "dictLabel": "新片场", "dictValue": "12", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }, { "searchValue": null, "createBy": "admin", "createTime": "2021-03-26 02:24:50", "updateBy": null, "updateTime": null, "remark": null, "params": {}, "dictCode": 148, "dictSort": 13, "dictLabel": "图虫", "dictValue": "13", "dictType": "media_platform", "cssClass": null, "listClass": null, "isDefault": "N", "status": "0", "default": false }] }, methods: { myEcharts() { const that = this; this.myChart.showLoading(); this.graph.nodes.forEach(function (node) { node.label = { show: true }; }); const option = { title: { text: '', subtext: '', top: 'bottom', left: 'right' }, tooltip: { trigger: "item", // textStyle: { // width: 10, // fontWeight: "bold", // overflow: "truncate" // }, confine: 'true', formatter: function (param) { if (param.dataType === 'edge') { // 连接 return [ '关系:' + param.data["connectWebName"] + '
', '详情:' + param.data["connectWebInfo"] + '
' ].join(''); } else if (param.dataType === 'node') { // 处理标签 let graphTag = ''; const arr1 = JSON.parse(param.data["personWebField"]); for (let i = 0; i ', '简介:' + param.data["personWebInfo"] + '', '常驻领域:' + graphTag + '
', '活跃平台:' + graphDict + '
', ].join(''); } } }, legend: [], animationDuration: 150, animationEasingUpdate: 'quinticInOut', series: [ { name: '', type: 'graph', layout: "force", force: { repulsion: 200, edgeLength: 100, gravity: 0.2 }, symbolSize: 50, data: this.graph.nodes, links: this.graph.links, // data: graph.nodes, // links: graph.links, roam: true, label: { show: true, }, draggable: true, labelLayout: { hideOverlap: false }, lineStyle: { color: 'source', curveness: 0.3 }, emphasis: { focus: 'adjacency', lineStyle: { width: 10 } } } ] }; this.myChart.clear(); option && this.myChart.setOption(option, true); // console.log(option) this.myChart.hideLoading(); this.myChart.on("click", function (e) { if (e.dataType === 'edge') { that.handleUpdateConnect(e.data) } else if (e.dataType === 'node') { console.log(e) e.data.personWebId = e.data.id that.handleUpdate(e.data) } }) }, getList() { this.loading = true; getPersonWebList().then(response => { this.personList = response.rows; Object.keys(this.personList).forEach(key => { this.personList[key].personWebPlatform = JSON.parse(this.personList[key].personWebPlatform) this.personList[key].personWebField = JSON.parse(this.personList[key].personWebField) }); this.loading = false; }); }, async getMap() { this.loading = true; await getPersonWebMap().then(response => { this.graph = { nodes: [], links: [] }; this.mapCheckList = []; this.personMap = response.rows; Object.keys(this.personMap).forEach(key => { // 导入节点,列表为空表示首次加入元素,反之亦然 if (this.graph.nodes !== []) { // 如果导入过就不用重复导入了 if (!this.mapCheckList.includes(this.personMap[key].PersonAlpha.personWebId)) { this.pushAlpha(key); } if (!this.mapCheckList.includes(this.personMap[key].PersonBeta.personWebId)) { this.pushBeta(key); } } else { this.pushAlpha(key); this.pushBeta(key); } // 把导入过的节点id存进checkList this.mapCheckList.push(this.personMap[key].PersonAlpha.personWebId) this.mapCheckList.push(this.personMap[key].PersonBeta.personWebId) // 导入关系 this.pushConnect(key); }); }); // console.log(this.graph) this.loading = false; }, pushAlpha(key) { this.graph.nodes.push({ id: this.personMap[key].PersonAlpha.personWebId, name: this.personMap[key].PersonAlpha.personWebName, personWebPic: this.personMap[key].PersonAlpha.personWebPic, personWebShow: this.personMap[key].PersonAlpha.personWebShow, personWebLink: this.personMap[key].PersonAlpha.personWebLink, personWebPlatform: this.personMap[key].PersonAlpha.personWebPlatform, personWebField: this.personMap[key].PersonAlpha.personWebField, personWebInfo: this.personMap[key].PersonAlpha.personWebInfo, personWebKey: this.personMap[key].PersonAlpha.personWebKey, }) }, pushBeta(key) { this.graph.nodes.push({ id: this.personMap[key].PersonBeta.personWebId, name: this.personMap[key].PersonBeta.personWebName, personWebPic: this.personMap[key].PersonBeta.personWebPic, personWebShow: this.personMap[key].PersonBeta.personWebShow, personWebLink: this.personMap[key].PersonBeta.personWebLink, personWebPlatform: this.personMap[key].PersonBeta.personWebPlatform, personWebField: this.personMap[key].PersonBeta.personWebField, personWebInfo: this.personMap[key].PersonBeta.personWebInfo, personWebKey: this.personMap[key].PersonBeta.personWebKey, }) }, pushConnect(key) { this.graph.links.push({ source: this.personMap[key].PersonAlpha.personWebId, target: this.personMap[key].PersonBeta.personWebId, connectWebId: this.personMap[key].Connect.connectWebId, connectWebName: this.personMap[key].Connect.connectWebName, connectWebInfo: this.personMap[key].Connect.connectWebInfo, }) }, // 字典翻译 personShowFormat(row, column) { return this.selectDictLabel(this.personWebShowOptions, row.personWebShow); }, personPlatformFormat(row, column) { return this.selectDictLabel(this.personWebPlatformOptions, row.personWebPlatform); }, // 取消按钮 cancel() { this.open = false; this.reset(); }, // 取消按钮 cancelConnect() { this.openConnect = false; this.resetConnect(); }, // 表单重置 reset() { this.form = { personWebId: null, personWebName: null, personWebPic: null, personWebShow: "0", personWebLink: "", personWebPlatform: [], personWebField: [], personWebInfo: "", personWebKey: "" }; this.answerPicImageUrl = null; this.resetForm("form"); }, resetConnect() { this.formConnect = { personWebIdAlpha: null, personWebIdBeta: null, personWebIdAlphaName: null, personWebIdBetaName: null, connectWebId: null, connectWebName: null, connectWebInfo: null, }; this.resetForm("formConnect"); }, handleAddConnect() { this.optionsStart = [] this.optionsEnd = [] this.requireFlag = true; this.resetConnect(); this.openConnect = true; this.titleConnect = "添加成员关系"; }, /** 修改按钮操作 */ handleUpdateConnect(row) { this.optionsStart = [] this.optionsEnd = [] this.requireFlag = false; this.reset(); const connectWeb = row.connectWebId; getInfoConnectWeb(connectWeb).then(response => { this.formConnect = response.data; // console.log(this.formConnect) this.formConnect.personWebIdAlpha = null; this.formConnect.personWebIdBeta = null; this.openConnect = true; this.titleConnect = "修改成员关系"; }); }, // 多选框选中数据 handleSelectionChange(selection) { this.ids = selection.map(item => item.personWebId) this.single = selection.length !== 1 this.multiple = !selection.length }, remoteMethodStart(keyword) { if (keyword.trim() === '') { this.optionsStart = [] return } // 当后一个对象不为空的情况 if (this.formConnect.personWebIdBeta) { let others = []; this.selectLoading = true; getPersonWebSearch(keyword).then(data => { getPersonWebSearchOther(this.formConnect.personWebIdBeta, keyword).then(dataOther => { others = dataOther.rows; this.optionsStart = []; data.rows.forEach(ma => { let exist = others.some(sa => { return ma.personWebId === sa.personWebId }); if (!exist) { this.optionsStart.push(ma); } }); this.optionsStart = this.optionsStart.filter(item => item.personWebId !== this.formConnect.personWebIdBeta) }) this.selectLoading = false; }) } // 后一个对象为空时 else { this.selectLoading = true; getPersonWebSearch(keyword).then(data => { this.selectLoading = false; this.optionsStart = data.rows; }) } }, remoteMethodEnd(keyword) { if (keyword.trim() === '') { this.optionsEnd = [] return } // 当前一个对象不为空的情况 if (this.formConnect.personWebIdAlpha) { let others = []; this.selectLoading = true; getPersonWebSearch(keyword).then(data => { getPersonWebSearchOther(this.formConnect.personWebIdAlpha, keyword).then(dataOther => { others = dataOther.rows; this.optionsEnd = []; data.rows.forEach(ma => { let exist = others.some(sa => { return ma.personWebId === sa.personWebId }); if (!exist) { this.optionsEnd.push(ma); } }); this.optionsEnd = this.optionsEnd.filter(item => item.personWebId !== this.formConnect.personWebIdAlpha) }) this.selectLoading = false; }) } // 前一个对象为空时 else { this.selectLoading = true; getPersonWebSearch(keyword).then(data => { this.selectLoading = false; this.optionsEnd = data.rows; }) } }, /** 新增按钮操作 */ handleAdd() { this.reset(); this.open = true; this.title = "添加成员管理"; }, /** 修改按钮操作 */ handleUpdate(row) { this.reset(); const personWeb = row.personWebId || this.ids; getPersonWebInfo(personWeb).then(response => { this.form = response.data; this.personWebPlatformTemp = this.form.personWebPlatform; this.form.personWebPlatform = JSON.parse(this.personWebPlatformTemp); this.personWebFieldTemp = this.form.personWebField; this.form.personWebField = JSON.parse(this.personWebFieldTemp); this.open = true; this.title = "修改成員管理"; }); }, submitForm() { this.$refs["form"].validate(valid => { if (valid) { this.open = false; this.personWebPlatformTemp = this.form.personWebPlatform; this.form.personWebPlatform = JSON.stringify(this.personWebPlatformTemp); this.personWebFieldTemp = this.form.personWebField; this.form.personWebField = JSON.stringify(this.personWebFieldTemp); if (this.form.personWebId != null) { editPersonWeb(this.form).then(response => { if (response.code === 200) { this.msgSuccess("修改成功"); this.refresh(); } }); } else { addPersonWeb(this.form).then(response => { if (response.code === 200) { this.msgSuccess("新增成功"); this.refresh(); } }); } } }); }, handelConfirm() { this.$refs["formConnect"].validate(valid => { if (valid) { this.openConnect = false; if (this.formConnect.connectWebId != null) { editConnectWeb(this.formConnect).then(response => { if (response.code === 200) { this.msgSuccess("修改成功"); this.refresh(); } }); } else { addConnectWeb(this.formConnect).then(response => { if (response.code === 200) { this.msgSuccess("新增成功"); this.refresh(); } }); } } }); }, deleteConnect() { const connectWebId = this.formConnect.connectWebId this.$confirm('是否确认删除「' + this.formConnect.personWebIdAlphaName + '」和「' + this.formConnect.personWebIdBetaName + '」的关系?', "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(function () { return removeConnectWeb(connectWebId); }).then(() => { this.openConnect = false; this.refresh(); this.msgSuccess("删除成功"); }).catch(function (e) { console.log(e) }); }, /** 删除按钮操作 */ handleDelete(row) { const personWebIds = row.personWebId || this.ids; this.$confirm('是否确认删除成员编号为"' + personWebIds + '"的数据项?', "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" }).then(function () { return removePersonWeb(personWebIds); }).then(() => { this.refresh(); this.msgSuccess("删除成功"); }).catch(function () { }); }, // 显示图片上传模块 imageCropperShow() { this.upload.cropperShow = !this.upload.cropperShow }, // 图片上传成功后执行 cropUploadSuccess(jsonData, field) { this.form.personWebPic = jsonData.fileName // console.log(jsonData) }, picShow(pic) { this.picVisible = !this.picVisible; this.answerPicImageUrl = this.person_pic_url + pic }, handleClose(tag) { this.form.personWebField.splice(this.form.personWebField.indexOf(tag), 1); }, showInput() { this.inputVisible = true; this.$nextTick(_ => { this.$refs.saveTagInput.$refs.input.focus(); }); }, handleInputConfirm() { let inputValue = this.inputValue; if (inputValue) { this.form.personWebField.push(inputValue); } this.inputVisible = false; this.inputValue = ''; }, async refresh() { await this.getMap(); this.myEcharts(); this.getList() }, }, async mounted() { await this.getMap(); // 基于准备好的dom,初始化echarts实例 let echarts = require('echarts') this.myChart = echarts.init(document.getElementById('main')); this.myEcharts(); } } .avatar-uploader .el-upload { border: 1px dashed #d9d9d9; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; width: 178px; height: 178px; } .avatar-uploader .el-upload:hover { border-color: #409EFF; } .avatar-uploader-icon { line-height: 140px; } .avatar { height: 144px; } .image-preview { width: 178px; height: 178px; position: relative; border: 1px dashed #d9d9d9; border-radius: 6px; float: left; } .image-preview .image-preview-wrapper { position: relative; width: 100%; height: 100%; } .image-preview .image-preview-wrapper img { width: 100%; height: 100%; } .image-preview .image-preview-action { position: absolute; width: 100%; height: 100%; left: 0; top: 0; text-align: center; color: #fff; opacity: 0; font-size: 20px; background-color: rgba(0, 0, 0, .5); transition: opacity .3s; cursor: pointer; line-height: 200px; } .image-preview .image-preview-action .el-icon-delete { font-size: 32px; } .image-preview:hover .image-preview-action { opacity: 1; } .el-upload--picture-card { display: block; width: 258px; height: 146px; overflow: hidden; } .input-new-tag { width: 90px; margin-left: 10px; vertical-align: bottom; } .el-tag + .el-tag { margin-left: 10px; } .button-new-tag { margin-left: 10px; height: 32px; line-height: 30px; padding-top: 0; padding-bottom: 0; } .echarts { width: 100%; text-align: center; height: 800px; } .bin { /*text-align: center;*/ /*padding: 50px;*/ width: 100%; height: 800px } .dashboard-editor-container { padding: 32px; background-color: rgb(240, 242, 245); position: relative; .chart-wrapper { background: #fff; padding: 16px 16px 0; margin-bottom: 32px; } } .graph-tag { display: inline-block; border-radius: 4px; min-width: min-content; padding: 5px; background-color: #e7faf0; border-color: #d0f5e0; color: #13ce66; } @media (max-width: 1024px) { .chart-wrapper { padding: 8px; } }
2.2
import request from '@/utils/request' export function getPersonWebMap() { return request({ url: '/people/web/map', method: 'get' }) } export function getPersonWebList() { return request({ url: '/people/web/list', method: 'get' }) } export function getPersonWebSearch(personName) { return request({ url: '/people/web/search/' + personName, method: 'get' }) } export function getPersonWebSearchOther(personId, personName) { return request({ url: '/people/web/search/' + personId + '/' + personName, method: 'get' }) } export function getPersonWebInfo(personId) { return request({ url: '/people/web/person/' + personId, method: 'get' }) } export function addPersonWeb(data) { return request({ url: '/people/web/person', method: 'post', data: data }) } export function editPersonWeb(data) { return request({ url: '/people/web/person', method: 'put', data: data }) } export function removePersonWeb(personId) { return request({ url: '/people/web/person/' + personId, method: 'delete' }) } export function getInfoConnectWeb(connectId) { return request({ url: '/people/web/connect/' + connectId, method: 'get' }) } export function addConnectWeb(data) { return request({ url: '/people/web/connect', method: 'post', data: data }) } export function editConnectWeb(data) { return request({ url: '/people/web/connect', method: 'put', data: data }) } export function removeConnectWeb(connectId) { return request({ url: '/people/web/connect/' + connectId, method: 'delete' }) }
三、展示
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!