html текст
All interests
  • All interests
  • Design
  • Food
  • Gadgets
  • Humor
  • News
  • Photo
  • Travel
  • Video
Click to see the next recommended page
Like it
Don't like
Add to Favorites

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


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


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

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


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





Функциональность же такая:
  • Отображение таблиц и коллекций. Это естественный способ редактирования для MySQL, но и для 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);
});


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

материал с habrahabr.ru

5

      Add

      You can create thematic collections and keep, for instance, all recipes in one place so you will never lose them.

      No images found
      Previous Next 0 / 0
      500
      • Advertisement
      • Animals
      • Architecture
      • Art
      • Auto
      • Aviation
      • Books
      • Cartoons
      • Celebrities
      • Children
      • Culture
      • Design
      • Economics
      • Education
      • Entertainment
      • Fashion
      • Fitness
      • Food
      • Gadgets
      • Games
      • Health
      • History
      • Hobby
      • Humor
      • Interior
      • Moto
      • Movies
      • Music
      • Nature
      • News
      • Photo
      • Pictures
      • Politics
      • Psychology
      • Science
      • Society
      • Sport
      • Technology
      • Travel
      • Video
      • Weapons
      • Web
      • Work
        Submit
        Valid formats are JPG, PNG, GIF.
        Not more than 5 Мb, please.
        30
        surfingbird.ru/site/
        RSS format guidelines
        500
        • Advertisement
        • Animals
        • Architecture
        • Art
        • Auto
        • Aviation
        • Books
        • Cartoons
        • Celebrities
        • Children
        • Culture
        • Design
        • Economics
        • Education
        • Entertainment
        • Fashion
        • Fitness
        • Food
        • Gadgets
        • Games
        • Health
        • History
        • Hobby
        • Humor
        • Interior
        • Moto
        • Movies
        • Music
        • Nature
        • News
        • Photo
        • Pictures
        • Politics
        • Psychology
        • Science
        • Society
        • Sport
        • Technology
        • Travel
        • Video
        • Weapons
        • Web
        • Work

          Submit

          Thank you! Wait for moderation.

          Тебе это не нравится?

          You can block the domain, tag, user or channel, and we'll stop recommend it to you. You can always unblock them in your settings.

          • BigDaddy
          • домен habrahabr.ru

          Get a link

          Спасибо, твоя жалоба принята.

          Log on to Surfingbird

          Recover
          Sign up

          or

          Welcome to Surfingbird.com!

          You'll find thousands of interesting pages, photos, and videos inside.
          Join!

          • Personal
            recommendations

          • Stash
            interesting and useful stuff

          • Anywhere,
            anytime

          Do we already know you? Login or restore the password.

          Close

          Add to collection

             

            Facebook

            Ваш профиль на рассмотрении, обновите страницу через несколько секунд

            Facebook

            К сожалению, вы не попадаете под условия акции