Прошу помощи в доделывании скрипта (jsPlumb)
Уважаемые эксперты, прошу помощи.
Задача стоит следующим образом: Есть таблицы в БД, мне нужно нарисовать кастомную ER (entity relation) диаграмму связей в БД. Кастомную в связи со спецификой продукта в БД. Для управления приложением используется JavaFX и контроллер WebView. Идея в том, что на Java идет работа с чтением БД, а при действиях пользователя я буду динамически добавлять таблицы на диаграмму (веб-страницу) К сожалению, высоким уровнем компетенции на JS+CSS не обладаю, в связи с чем обратился к GPT но дошел до тупика. GPT рекомендовал использовать jsPlumb. Из разных вариантов, что он предлагал, этот показался более менее читаемым. Вот что я имею сейчас: <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>ER Диаграмма с jsPlumb</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jsPlumb/2.15.6/js/jsplumb.min.js"></script> <style> body { position: relative; width: 100%; height: 100%; margin: 0; overflow: hidden; } .table { width: 150px; padding: 10px; border: 1px solid #000; border-radius: 5px; background: #fff; position: absolute; cursor: move; box-shadow: 2px 2px 5px rgba(0,0,0,0.3); } .attribute { padding-left: 10px; cursor: default; /* Отключаем курсор для атрибутов */ user-select: none; /* Отключаем выделение текста */ } .aLabel { font-size: 12px; background: rgba(255,255,255,0.8); padding: 2px; border-radius: 3px; } </style> </head> <body> <div id="diagram-container" style="width: 100%; height: 100%; position: relative;"></div> <script> jsPlumb.ready(function() { const instance = jsPlumb.getInstance({ Connector: "Bezier", Anchors: ["Right", "Left"], Endpoint: ["Dot", { radius: 5 }], PaintStyle: { stroke: "#999", strokeWidth: 2 }, EndpointStyle: { fill: "#999" }, Container: "diagram-container" }); let allowConnection = false; // Флаг для разрешения соединений через код // Обработчик перед созданием соединения instance.bind("beforeDrop", function(info) { if (allowConnection) { allowConnection = false; // Сброс флага после разрешения return true; // Разрешить соединение } return false; // Запретить соединение, созданное пользователем }); // Функция для добавления таблицы window.addTable = function(id, name, x, y, attributes) { if (document.getElementById(id)) { console.warn(`Таблица с id "${id}" уже существует.`); return; } const table = document.createElement("div"); table.className = "table"; table.id = id; table.style.left = x + "px"; table.style.top = y + "px"; const title = document.createElement("strong"); title.innerText = name; table.appendChild(title); attributes.forEach(attr => { const attrDiv = document.createElement("div"); attrDiv.className = "attribute"; attrDiv.id = attr.id; attrDiv.innerText = attr.name; table.appendChild(attrDiv); // Настройка источника и цели для атрибутов instance.makeSource(attrDiv, { anchor: "Continuous", connectorStyle: { stroke: "#999", strokeWidth: 2 }, connectionType: "basic", extract: { "action": "the-action" }, maxConnections: -1, filter: ".attribute", allowLoopback: false }); instance.makeTarget(attrDiv, { anchor: "Continuous", allowLoopback: false, maxConnections: -1, dropOptions: { hoverClass: "dragHover" } }); }); document.getElementById("diagram-container").appendChild(table); // Сделать таблицу перетаскиваемой instance.draggable(table, { grid: [10, 10], stop: function() { instance.repaintEverything(); } }); }; // Функция для добавления связи window.addConnection = function(sourceId, targetId, type) { const sourceElem = document.getElementById(sourceId); const targetElem = document.getElementById(targetId); if (!sourceElem || !targetElem) { console.warn(`Элемент(ы) с id "${sourceId}" или "${targetId}" не найдены.`); return; } allowConnection = true; // Разрешить соединение через код instance.connect({ source: sourceId, target: targetId, overlays: [ ["Label", { label: type, location: 0.5, id: "label", cssClass: "aLabel" }] ] }); }; // Отключаем возможность добавления соединений пользователем // Можно дополнительно скрыть эндпоинты, если необходимо addTable('users', 'Users', 100, 100, [ { id: 'u_id', name: 'id' }, { id: 'u_name', name: 'name' }, { id: 'u_email', name: 'email' } ]); addTable('articles', 'Articles', 400, 100, [ { id: 'a_id', name: 'id' }, { id: 'a_title', name: 'title' }, { id: 'a_content', name: 'content' }, { id: 'a_author_id', name: 'author_id' } ]); addConnection('u_id', 'a_author_id', '1:M'); }); </script> </body> </html> С чем я прошу помощи: Условия:
если кто-то знает менее трудоемкие инструменты для решения моей задачи, укажите пожалуйста. Благодарю за внимание. |
Часовой пояс GMT +3, время: 14:02. |