Примечание. Эта версия была обновлена для поддержки Ecto 1.1 и Ecto 2.0. Дополнительную информацию см. в разделе «Установка».
ExAdmin — это пакет автоматического администрирования для Elixir и Phoenix Framework, порт/вдохновитель ActiveAdmin для Ruby on Rails.
Посмотрите живую демо-версию. Исходный код можно найти на ExAdmin Demo.
Ознакомьтесь с этой дополнительной интерактивной демонстрацией, чтобы увидеть примеры отношений «многие ко многим», вложенных атрибутов и аутентификации.
Дополнительную информацию см. в документации и Wiki.
ExAdmin — это надстройка для приложения, использующая Phoenix Framework, позволяющая создать инструмент администрирования CRUD с небольшим количеством кода или без него. Запустив несколько задач смешивания, чтобы определить, какие модели Ecto вы хотите администрировать, вы получите что-то, что работает без дополнительного кода.
Перед использованием ExAdmin вам понадобится проект Phoenix и созданная модель Ecto.
Добавьте ex_admin в свои deps:
микс.exs
defp deps do ... {:ex_admin, "~> 0.8"}, ... конец
микс.exs
defp deps do ... {:ex_admin, github: "smpallen99/ex_admin"}, ... конец
Добавьте некоторую конфигурацию администратора и модули администратора в файл конфигурации.
конфиг/config.exs
конфигурация: ex_admin, репозиторий: MyProject.Repo, модуль: MyProject, # MyProject.Web для феникса >= 1.3.0-rc модули: [MyProject.ExAdmin.Dashboard, ]
Получить и скомпилировать зависимость
mix do deps.get, deps.compile
Настройте ExAdmin:
mix admin.install
Добавьте маршруты администратора
веб/router.ex
defmodule MyProject.Router сделать используйте MyProject.Web, :router используйте ExAdmin.Router ... область действия "/", MyProject сделать... конец # настраиваем маршруты ExAdmin в /admin область действия "/admin", ExAdmin dopipe_through :browseradmin_routes() конец
Добавьте конфигурацию подкачки
lib/my_project/repo.ex
defmodule MyProject.Repo залить Ecto.Repo, otp_app: :my_projectuse Scrivener, page_size: 10 конец
Отредактируйте файл brunch-config.js и следуйте инструкциям, добавленным установщиком к этому файлу. Для этого вам потребуется скопировать 2 блока и заменить существующие блоки.
Запустите приложение с помощью iex -S mix phoenix.server
Посетите http://localhost:4000/admin.
Вы должны увидеть страницу панели мониторинга по умолчанию.
Чтобы добавить модель, используйте задачу смешивания admin.gen.resource
:
mix admin.gen.resource MyModel
Добавьте новый модуль в файл конфигурации:
конфиг/config.exs
конфигурация: ex_admin, репозиторий: MyProject.Repo, модуль: МойПроект, модули: [MyProject.ExAdmin.Dashboard,MyProject.ExAdmin.MyModel, ]
Снова запустите сервер Phoenix и перейдите по адресу http://localhost:4000/admin/my_model
Теперь вы можете перечислять/добавлять/редактировать/и удалять MyModel
.
ExAdmin будет использовать наборы изменений вашей схемы. По умолчанию мы вызываем функцию changeset
в вашей схеме, хотя вы можете настроить набор изменений, который мы используем для обновления, и создать отдельно.
пользовательский набор изменений:
defmodule TestExAdmin.ExAdmin.Simple do используйте ExAdmin.Register Register_resource TestExAdmin.Simple doupdate_changeset :changeset_updatecreate_changeset :changeset_create положить конец
Мы поддерживаем связь «многие ко многим» и поддерживаем множество связей, предоставляемых Ecto. Мы рекомендуем использовать cast_assoc для отношений «многие ко многим» и put_assoc для отношений «многие». Вы можете увидеть примеры наборов изменений в наших тестовых схемах.
При передаче результатов из формы для отношений мы вносим некоторые принуждения, чтобы упростить работу с ними в вашем наборе изменений. Для флажков коллекции мы передадим массив идентификаторов выбранных параметров в ваш набор изменений, чтобы вы могли получить их и использовать put_assoc, как показано здесь.
Чтобы поддерживать множество удалений, вам необходимо настроить виртуальный атрибут в вашей схеме. В связанной схеме вам нужно будет добавить виртуальный атрибут _destroy, чтобы мы могли отслеживать свойство уничтожения в форме. Вам также нужно будет включить это в свой набор изменений. Вот пример набора изменений. В этом сценарии у пользователя есть много продуктов, и продукты можно удалить. У нас также много связанных ролей.
defmodule TestExAdmin.User сделать импортировать Ecto.Changeset используйте Ecto.Schema импортировать Ecto.Query схема "пользователи" dofield :name, :stringfield :email, :stringfield :active, :boolean, по умолчанию: truehas_many :products, TestExAdmin.Product, on_replace: :deletemany_to_many :roles, TestExAdmin.Role, join_through: TestExAdmin.UserRole, on_replace: :удалить конец @fields ~w(имя активного адреса электронной почты) def Changeset(model, params %{}) domodel|> cast(params, @fields)|> validate_required([:email, :name])|> cast_assoc(:products, require: false)|> add_roles(params) конец def add_roles(changeset, params) doif Enum.count(Map.get(params, :roles, [])) > 0 do ids = params[:roles] roles = TestExAdmin.Repo.all(из r в TestExAdmin.Role, где: r.id в ^ids) put_assoc(changeset, :roles, roles)elsechangesetend endenddefmodule TestExAdmin.Role do используйте Ecto.Schema импортировать Ecto.Changeset псевдоним TestExAdmin.Repo схема «роли» dofield :name, :stringhas_many :uses_roles, TestExAdmin.UserRolemany_to_many :users, TestExAdmin.User, join_through: TestExAdmin.UserRole конец @fields ~w(имя) def Changeset(model, params %{}) domodel|> cast(params, @fields) endenddefmodule TestExAdmin.Product do используйте Ecto.Schema импортировать Ecto.Changeset схема «продукты» dofield :_destroy, :boolean, virtual: truefield :title, :stringfield :price, :decimalbelongs_to :user, TestExAdmin.User конец def Changeset(schema, params %{}) doschema|> cast(params, ~w(цена заголовка user_id))|> validate_required(~w(цена заголовка))|> mark_for_deletion конец defp mark_for_deletion(changeset) do# Если было установлено удаление и оно истинно, давайте изменим actionif get_change(changeset, :_destroy) do %{changeset | действие: :delete}иначе набор изменений положить конец
В блоге Platformatec есть хорошая запись, описывающая, как работают эти отношения: http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/
Используйте команду index do
, чтобы определить поля, которые будут отображаться.
admin/my_model.ex
defmodule MyProject.ExAdmin.MyModel do используйте ExAdmin.Register Register_resource MyProject.MyModel doindex do selectable_column() columns :id columns :name action() # отображаем действия по умолчанию columnsend положить конец
В следующем примере показано, как настроить форму с помощью макроса form
:
defmodule MyProject.ExAdmin.Contact do используйте ExAdmin.Register Register_resource MyProject.Contact doform contact do inputs doinput contact, :first_nameinput contact, :last_nameinput contact, :emailinput contact, :register_date, type: Date # если вы используете Ecto :date, введите в входной контакт схемы, :category, коллекцию: MyProject.Category .all end inputs «Группы» doinputs :groups, as: :check_boxes, коллекция: MyProject.Group.all endend положить конец
В следующем примере показано, как изменить страницу показа.
defmodule MyProject.ExAdmin.Question do используйте ExAdmin.Register Register_resource MyProject.Question приоритет меню: 3show вопрос do атрибуты_таблица # отобразить атрибуты по умолчанию # создать панель для отображения списка вариантов вопроса панель «Выбор» dotable_for(question.choices) do columns :key columns :nameend endend положить конец
Поддержка типов настраиваемых полей осуществляется в двух областях: полях рендеринга и элементах управления вводом.
Используйте протокол ExAdmin.Render.to_string/
для типов рендеринга, которые не поддерживаются ExAdmin.
Например, для поддержки рендеринга кортежа добавьте в свой проект следующий файл:
# lib/render.exdefimpl ExAdmin.Render, для: Tuple do def to_string(кортеж), do: проверить(кортеж)end
Используйте элемент конфигурации :field_type_matching
, чтобы установить тип ввода.
Например, учитывая следующий проект:
defmodule ElixirLangMoscow.SpeakerSlug do используйте EctoAutoslugField.Slug от: [:name, :company] до: :slugenddefmodule ElixirLangMoscow.Speaker do используйте ElixirLangMoscow.Web, :model используйте Arc.Ecto.Model псевдоним ElixirLangMoscow.SpeakerSlug схема «динамики» dofield :slug,дикторSlug.Typefield :avatar, ElixirLangMoscow.Avatar.Type положить конец
Добавьте следующее в конфигурацию вашего проекта:
конфигурация: ex_admin, # ... field_type_matching: %{ElixirLangMoscow.SpeakerSlug.Type => :string,ElixirLangMoscow.Avatar.Type => :file }
ExAdmin поддерживает 2 темы. Новая тема AdminLte2 включена по умолчанию. Старая тема ActiveAdmin также поддерживается для тех, кому нужна обратная совместимость.
Чтобы изменить тему на ActiveAdmin, в вашем файле config/config.exs
выполните следующую команду:
конфиг/config.exs
конфигурация: ex_admin, тема: ExAdmin.Theme.ActiveAdmin, ...
Тема AdminLte2 имеет несколько различных цветов кожи, включая синий, черный, фиолетовый, зеленый, красный, желтый, синий свет, черный свет, фиолетовый свет, зеленый свет, красный свет и желтый свет.
Чтобы изменить цвет кожи, например, на фиолетовый:
конфиг/config.exs
конфигурация: ex_admin, цвет кожи: :фиолетовый, ...
Вы можете добавить селектор темы в правом верхнем углу строки меню, добавив следующее в файл config/config.exs
:
конфиг/config.exs
конфигурация: ex_admin, theme_selector: [{"AdminLte", ExAdmin.Theme.AdminLte2}, {"ActiveAdmin", ExAdmin.Theme.ActiveAdmin} ], ...
Вы можете переопределить имя модели, определив в модуле функцию model_name/0
. Это полезно, если вы хотите использовать другой модуль для некоторых своих действий.
admin/my_model.ex
def model_name сделать "custom_name" конец
ExAdmin оставляет работу по аутентификации сторонним пакетам. Пример использования Coherence можно найти в демонстрационном проекте Contact.
Посетите Wiki для получения дополнительной информации о добавлении аутентификации.
Мы ценим любой вклад в ExAdmin. Дополнительную информацию можно найти в наших руководствах CODE_OF_CONDUCT.md и CONTRIBUTING.md. Обычно мы храним список функций и ошибок в системе отслеживания ошибок.
Подробный пример демонстрации ExAdmin
Краткое руководство можно найти на сайте Elixir Survey Tutorial.
Живая демонстрация
Документы
ex_admin
- Copyright (c) 2015-2016 E-MetroTel
Исходный код распространяется под лицензией MIT.
Проверьте ЛИЦЕНЗИЮ для получения дополнительной информации.