Делаем админпанель для MySQL и MongoDB на Node.js

в 23:36, , рубрики: Impress, mongodb, mysql, node.js, phpmyadmin, scaffolding, метки: , , , , ,

Делаем админпанель для MySQL и MongoDB на Node.js

Хотим «phpMyAdmin» (читай web GUI) для ноды

Отсутствие универсальных веб-интерфейсов для управления распространенными СУБД, несколько усложняет освоение Node.js, а разворачивать рядом другой веб-сервер и другой язык с инфраструктурой, ой как не хочется. Открывать порты и управлять базами, подключаясь с другого сервера или со своего рабочего компьютера — это и неудобно и есть соображения безопасности. Поэтому мы решили включить такой инструмент в платформу для веб-приложений Impress, которую анонсировали, о которой я немного писал и которая доступна в открытом коде для всеобщей пользы. Задумка такая: реализовать простой и удобный унифицированный интерфейс для СУБД, которые чаще всего применяются в с Node.js, позаботиться о быстром развертывании (просто скопировать папку) и независимости от среды. В бета-версии уже поддерживаются MySQL, MongoDB и в скором времени очередь дойдет до PostgreSQL и Oracle.

Возможности DBMI

Для всех операций с БД используется скаффолдинг, т.е. построение интерфейсов, запросов и всех операций обработки данных на основе динамического получения метаданных о структуре БД или интроспекции структур СУБД. Интерфейс представлен ниже на картинке. Дерево трехуровневое, первый уровень — соединения с БД (они, естественно, пока двух типов), второй уровень — базы данных, третий уровень — коллекции (для Mongo) и таблицы (для MySQL). На узлах дерева можно вызывать контекстное меню правой кнопкой мыши.

Делаем админпанель для MySQL и MongoDB на Node.js

Функциональность же такая:

  • Отображение таблиц и коллекций. Для MongoDB так же применяется грид, столбцы — это поля, собранные из всех записей коллекции, думаю, что такоре редактирование будет удобнее, чем правка JSON.
  • Фильтры по полям. В заголовке грида есть строка для фильтра, для MongoDB она работает только по строгому совпадению, а для MySQL, кроме полного совпадения есть еще синтаксис условий фильтрации, вводить без кавычек: ">5" — больше 5 и все другие знаки сравнения как в SQL, т.е. «не равно 5» пишется как "<>5", диапазоны «5..10» — преобразовывается в BETWEEN, шаблоны с символами "*" (любая последовательность, даже пустая, преобразовывается в "%" в SQL LIKE-выражении) и "?" (обязательно любой символ, преобразовывается в "_" в SQL LIKE-выражении), например, "*str?" (такие символы привычнее для пользователей), одно значение из множества "(1,2,4,10,11)" — преобразовывается в SQL IN-выражение.
  • Вставка записей. Работает пока только для MySQL. Последняя пустая строка грида служит для вставки, если после редактирования одного поля уже можно сделать INSERT, то запись добавляется сразу, в колонке в PRIMARY KEY появляется ее ID, а дальнейшее редактирование уже через UPDATE, но если ограничения «NOT NULL» требуют заполнить более одного поля, то INSERT происходит только после того, как все нужные поля заполнены).
  • Редактирование записей с таблицах и коллекциях (работает для Mongo всегда, а для MySQL пока только при наличии не составного первичного ключа, т.е. ID записи, позже будет поддержка составных primary key, составных и не составных unique index и уже в случае, если ничего такого не найдено, то в WHERE для UPDATE оператора будем помещать все поля редактируемой записи.
  • Удаление записей из таблиц и коллекций. Для Mongo работает, для MySQL работает пока тоже по не составному PRIMARY KEY.
  • Лог SQL операторов. Естественно, будет поддерживаться только для реляционных СУБД. Возможно, потом для MongoDB будем выводить в лог JavaScript код для копирования и вставки в проекты.
  • Создание и удаление баз. Для MySQL работает, а для Mongo есть особенность, база создается только если в ней сразу создать хоть одну коллекцию, иначе при обновлении экрана база пропадет, это особенности СУБД, но возможно, я чего-то не знаю, пролежите способ, если я не прав.
  • Переименование баз. Работает как в Mongo, но не работает пока в MySQL, ибо, как Вам известно, RENAME DATABASE в MySQL был введен и потом ликвидирован, а для переименования баз нужно создать новую с новым именем, скопировать туда все таблицы, потом скопировать пользователей и права доступа, возможно, еще какие-то вещи нужно будет учесть, но пока до этого не добрались.
  • Создание коллекций и таблиц. Пока работает только в Mongo, но скоро допишем конструктор таблиц для MySQL.
  • Удаление коллекций и таблиц. Работает как в MySQL и в Mongo, но в MySQL удалению могут препятствовать связи между таблицами, (FOREIGN KEYS), в этом случае удаление не проходит и таблица опять появляется в дереве.
  • Переименование коллекций и таблиц. Работает как в MySQL и в Mongo.

Установка и настройка

Полная процедура настройки такая (это из-за безопасности, но в, большинстве случаев, она существенно сокращается):
1. Создаем каталог проекта и в устанавливаем в него Impress из репозитория npm.

$ npm install impress

2. Копируем из папки /node_modules/impress/examples/copyContentToProjectFolder все содержимое в корневой каталог проекта.
3. В файле config.js прописываем нужные нам базы данных (конекшенстринги к ним) в разделе «databases».
4. В файле /sites/localhost/dbmi/access.js находим настройки доступа

module.exports = {
	guests: true, // позволять или нет заходить без автентификации
	logged: true, // позволять или нет заходить автентифицированным пользователям
	http:   true, // доступно или нет по http
	https:  true, // доступно или нет по https
	groups: [] // пользователям каких групп доступно (массив строк)
}

5. Для того, чтобы закрыть админпанель паролем, нужно создать базу пользователей при помощи команды «node setup.js». И потом запустить систему «node server.js». Зайти на 127.0.0.1 и зарегистрироваться («Create account» справа вверху). После этого, можно закрыть возможность регистрации, добавив в /sites/localhost/api/auth/register.json файл access.js и задав в нем guests = false.
6. Если хочется ходить к базе через HTTPS, то положите в корень проекта свои server.key и server.cer файлы, а так же поправьте в config.js параметр servers.www.protocol = «https».
7. Ну и заходить можно через 127.0.0.1/dbmi или на 127.0.0.1 и там в меню слева выбрать вреди примеров пункт «DB Management Interface».

Планы развития DBMI

Весь модуль DBMI занимает сейчас 70кб, половина из которых состоит из css и html, примерно четверть — серверный js, и еще четверть — клиентского. Думаю, что это не так много, чтобы разобраться в коде, если что-то хочется поправить или дописать. Небольшой размер, это еще и потому, что платформа Impress (нашего же изготовления), производить большую часть инфраструктурной работы, как маршрутизацию URLов, обработку шаблонов, огромное количество вспомогательных функций по работе с базами данных, особенно с MySQL. Что планируем дописывать мы в ближайшее время:

  • Исполнение произвольных SQL запросов. В т.ч. CREATE TABLE, DROP..., ALTER… и т.д. Сохранение истории этих запросов и вызов из в редактор запросов в дальнейшем.
  • Сохранение фильтров в гридах в виде именованных узлов четвертого уровня в дереве. И написание кастомного SQL-запроса, который тоже можно будет сохранить с заданным именем, как четвертый уровень дерева и работать с его результатами тоже в том же гриде.
  • Генерацию таблиц из их JSON-метаописания, см. примеры в /node_modules/impress/schemas. Генерация уже работает, но она еще не связана с DBMI, на результат генерации можно посмотреть запустив:

require('impress');
var schemaCore = require('./schemas/impress.core.schema.js'),
	schemaCMS = require('./schemas/impress.cms.schema.js');
impress.init(function() {
	console.log(db.schema.mysql.generateScript(schemaCore, true).script);
	console.log(db.schema.mysql.generateScript(schemaCMS, true).script);
});

Движется шустро, но нужно штука такая, что всем нужно и желательно — еще шустрее. Так что, присоединяйтесь к тестированию и доработке, будем рады Вашему участию.

Автор: MarcusAurelius

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js