index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <template>
  2. <VueFlow ref="vueFlowRef" :nodes="nodes" :edges="edges" :class="{ dark }"
  3. class="basic-flow"
  4. :default-viewport="{ zoom: 1.5 }" :min-zoom="0.2" :max-zoom="4" @drop="onDrop"
  5. @contextmenu.prevent="onContextMenu" @node-contextmenu="logEvent('contextmenu', $event)"
  6. @dragover="onDragOver" @dragleave="onDragLeave" @edge-click="onEdgeClick" @node-click="onNodeClick">
  7. <template #node-default="props">
  8. <!-- <template #node-process="props"> // @contextmenu.prevent="onContextMenu" -->
  9. <eltree :node="props" />
  10. </template>
  11. <Background pattern-color="#aaa" :gap="16" />
  12. <!-- <MiniMap /> -->
  13. <Panel>
  14. <div>
  15. <button class="remove" @click="removeNode(event)">删除节点</button>
  16. <button class="remove" @click="removeEdge(event)">删除线</button>
  17. <!-- <button class="remove" @click="getnodes()">获取所有数据</button> -->
  18. </div>
  19. </Panel>
  20. <Controls position="top-left">
  21. <ControlButton title="Reset Transform" @click="resetTransform">
  22. <Icon name="reset" />
  23. </ControlButton>
  24. <!-- <ControlButton title="Shuffle Node Positions" @click="updatePos">
  25. <Icon name="update" />
  26. </ControlButton> -->
  27. <ControlButton title="Toggle Dark Mode" @click="toggleDarkMode">
  28. <Icon v-if="dark" name="sun" />
  29. <Icon v-else name="moon" />
  30. </ControlButton>
  31. <ControlButton title="Log `toObject`" @click="logToObject">
  32. <Icon name="log" />
  33. </ControlButton>
  34. </Controls>
  35. </VueFlow>
  36. <div class="dnd-flow">
  37. <div id="contextMenu" @click="deleteItemConfirm">删除</div>
  38. </div>
  39. </template>
  40. <script setup>
  41. import { ref, markRaw } from 'vue'
  42. import { VueFlow, useVueFlow, MarkerType } from '@vue-flow/core'
  43. import { useRoute } from 'vue-router';
  44. import { Background } from '@vue-flow/background'
  45. import { ControlButton, Controls } from '@vue-flow/controls'
  46. import { initialEdges, initialNodes } from './modeljs.js'
  47. import { MiniMap } from '@vue-flow/minimap'
  48. import "./main.css";//重置样式
  49. import DropzoneBackground from './DropzoneBackground.vue'
  50. import eltree from './eltree.vue'
  51. import useDragAndDrop from './useDnD'
  52. import f11 from '@/assets/img/f11.png'
  53. import Icon from './Icon.vue'
  54. const dark = ref(false)
  55. const route = useRoute();
  56. const { onInit, onNodeDragStop, onNodeContextMenu, onConnect, addEdges, setViewport, toObject } = useVueFlow()
  57. let vueFlowRef = ref();
  58. let emit = defineEmits(['optimizerfalse']);
  59. const props = defineProps({
  60. optimizer: {
  61. type: Boolean,
  62. },
  63. })
  64. const shopShow = ref(false);
  65. let noid = ref([]);
  66. let Edgeid = ref();
  67. let node = ref();
  68. let contextMenu = ref({
  69. position: { x: 0, y: 0 },
  70. target: 'kong',
  71. })
  72. const { onDragOver, onDrop, onDragLeave, isDragOver } = useDragAndDrop();
  73. const edges = ref([]);
  74. const nodes = ref([]);
  75. onConnect((connection) => {
  76. console.log(connection);
  77. connection.type = 'smoothstep';// smoothstep straight
  78. connection.markerEnd = MarkerType.ArrowClosed;
  79. addEdges(connection)
  80. })
  81. function onNodeClick(e) {
  82. noid.value = e.node;
  83. if (e.node.data.label == '优化器') {
  84. console.log(e.node);
  85. emit('optimizerfalse', true);
  86. }
  87. }
  88. // 监听线
  89. function onEdgeClick(e) {
  90. Edgeid.value = e.edge.id;
  91. }
  92. function logEvent(name, event) {
  93. console.log(2222)
  94. }
  95. function onContextMenu(event) {
  96. if (noid.value !== null) {
  97. if (noid.value.id) {
  98. console.log(noid.value.position.y);
  99. console.log(noid.value.position.x);
  100. document.getElementById('contextMenu').style.top = noid.value.position.y + 100 + 'px';
  101. document.getElementById('contextMenu').style.left = noid.value.position.x + 270 + 'px';
  102. document.getElementById('contextMenu').style.display = 'block';
  103. event.preventDefault();
  104. //shopShow.value=true;
  105. // document.getElementById('contextMenu').style.display = 'none';
  106. }
  107. }
  108. }
  109. //点击左键右键内容消失
  110. document.addEventListener('click', function (e) {
  111. if (e.button === 0) { // 0 是左键
  112. document.getElementById('contextMenu').style.display = 'none';
  113. // shopShow.value=false;
  114. }
  115. });
  116. //删除
  117. const deleteItemConfirm = () => {
  118. if (noid.value.id) {
  119. vueFlowRef.value.removeNodes(noid.value.id);
  120. noid.value = null;
  121. document.getElementById('contextMenu').style.display = 'none';
  122. }
  123. }
  124. onInit((vueFlowInstance) => {
  125. vueFlowInstance.fitView()
  126. })
  127. onNodeDragStop(({ event, nodes, node }) => {
  128. console.log('Node Drag Stop', { event, nodes, node })
  129. })
  130. onConnect((connection) => {
  131. addEdges(connection)
  132. console.log(1111);
  133. console.log(edges.value);
  134. })
  135. function updatePos() {
  136. nodes.value = nodes.value.map((node) => {
  137. return {
  138. ...node,
  139. position: {
  140. x: Math.random() * 400,
  141. y: Math.random() * 400,
  142. },
  143. }
  144. })
  145. }
  146. function removeEdge(id) {
  147. id = Edgeid.value;
  148. vueFlowRef.value.removeEdges(id);
  149. }
  150. function removeNode(id) {
  151. id = noid.value.id
  152. vueFlowRef.value.removeNodes(noid.value.id);
  153. }
  154. function logToObject() {
  155. console.log(toObject())
  156. }
  157. /**
  158. * Resets the current viewport transformation (zoom & pan)
  159. */
  160. function resetTransform() {
  161. setViewport({ x: 0, y: 0, zoom: 1 })
  162. }
  163. function toggleDarkMode() {
  164. dark.value = !dark.value
  165. }
  166. onMounted(() => {
  167. getroter();
  168. // childfun();
  169. });
  170. // 获取链接
  171. const getroter=()=>{
  172. console.log(11111)
  173. console.log(route.query);
  174. if(route.query.id=='0'){
  175. console.log(route.query);
  176. nodes.value=initialNodes;
  177. edges.value=initialEdges;
  178. }
  179. }
  180. </script>
  181. <style>
  182. .vue-flow__edge {
  183. text-align: left;
  184. /* 设置edges的左对齐 */
  185. }
  186. #contextMenu {
  187. display: none;
  188. position: absolute;
  189. background-color: #fff;
  190. border-radius: 5px;
  191. padding: 10px;
  192. text-align: center;
  193. color: black;
  194. font-size: 14px;
  195. font-weight: 400;
  196. cursor: pointer;
  197. z-index: 99999;
  198. }
  199. .vue-flow__node-default.selectable:hover,
  200. .vue-flow__node-input.selectable:hover,
  201. .vue-flow__node-output.selectable:hover {
  202. box-shadow: none;
  203. }
  204. panel {
  205. cursor: pointer;
  206. position: absolute;
  207. z-index: 100000;
  208. }
  209. .remove {
  210. background: #fff;
  211. color: #666;
  212. margin: 0 10px;
  213. font-size: 12px;
  214. }
  215. .vue-flow__node-default, .vue-flow__node-input, .vue-flow__node-output{
  216. width: auto !important;
  217. border: none;
  218. background-color: rgba(0,0,0,0);
  219. }
  220. </style>