Nota: Esta versão foi atualizada para suportar Ecto 1.1 e Ecto 2.0. Consulte Instalação para obter mais informações.
ExAdmin é um pacote de administração automática para Elixir e Phoenix Framework, uma porta/inspiração do ActiveAdmin para Ruby on Rails.
Confira a demonstração ao vivo. O código-fonte pode ser encontrado em ExAdmin Demo.
Confira esta demonstração ao vivo adicional para obter exemplos de relacionamentos muitos para muitos, atributos aninhados e autenticação.
Consulte a documentação e o Wiki para obter mais informações.
ExAdmin é um complemento para um aplicativo que usa o Phoenix Framework para criar uma ferramenta de administração CRUD com pouco ou nenhum código. Ao executar algumas tarefas mistas para definir quais modelos Ecto você deseja administrar, você terá algo que funciona sem código adicional.
Antes de usar o ExAdmin, você precisará de um projeto Phoenix e de um modelo Ecto criado.
Adicione ex_admin às suas dependências:
mix.exs
defp deps do ... {:ex_admin, "~> 0.8"}, ... fim
mix.exs
defp deps do ... {:ex_admin, github: "smpallen99/ex_admin"}, ... fim
Adicione algumas configurações de administrador e módulos de administração ao arquivo de configuração
config/config.exs
configuração: ex_admin, repositório: MeuProjeto.Repo, módulo: MyProject, # MyProject.Web para Phoenix >= 1.3.0-rc módulos: [MyProject.ExAdmin.Dashboard, ]
Buscar e compilar a dependência
mix do deps.get, deps.compile
Configurar ExAdmin:
mix admin.install
Adicione as rotas administrativas
web/roteador.ex
defmodule MyProject.Router do use MyProject.Web,: roteador usar ExAdmin.Router ... escopo "/", MeuProjeto faz... fim # configura as rotas ExAdmin em /admin escopo "/admin", ExAdmin dopipe_through:browseradmin_routes() fim
Adicione a configuração de paginação
lib/meu_projeto/repo.ex
defmodule MyProject.Repo douse Ecto.Repo, otp_app::my_projectuse Scrivener, page_size: 10 fim
Edite seu arquivo brunch-config.js e siga as instruções que o instalador anexou a este arquivo. Isso requer que você copie 2 blocos e substitua os blocos existentes.
Inicie o aplicativo com iex -S mix phoenix.server
Visite http://localhost:4000/admin
Você deverá ver a página padrão do painel.
Para adicionar um modelo, use a tarefa combinada admin.gen.resource
:
mix admin.gen.resource MyModel
Adicione o novo módulo ao arquivo de configuração:
config/config.exs
configuração: ex_admin, repositório: MeuProjeto.Repo, módulo: MeuProjeto, módulos: [MyProject.ExAdmin.Dashboard,MyProject.ExAdmin.MyModel, ]
Inicie o servidor Phoenix novamente e navegue até http://localhost:4000/admin/my_model
Agora você pode listar/adicionar/editar/excluir MyModel
s.
ExAdmin usará os conjuntos de alterações do seu esquema. Por padrão, chamamos a função changeset
em seu esquema, embora você possa configurar o conjunto de alterações que usamos para atualização e criação separadamente.
conjunto de alterações personalizado:
defmodule TestExAdmin.ExAdmin.Simple fazer usar ExAdmin.Register Register_resource TestExAdmin.Simple doupdate_changeset :changeset_updatecreate_changeset :changeset_create fim
Apoiamos muitos para muitos e temos muitos relacionamentos fornecidos pela Ecto. Recomendamos usar cast_assoc para relacionamentos muitos para muitos e put_assoc para has-many. Você pode ver exemplos de conjuntos de alterações em nossos esquemas de teste
Ao passar resultados de um formulário para relacionamentos, fazemos algumas coerções para facilitar o trabalho com eles em seu conjunto de alterações. Para caixas de seleção de coleção, passaremos uma matriz de ids de opções selecionadas para o seu changeset para que você possa obtê-los e usar put_assoc como visto aqui
Para suportar muitas exclusões, você precisa configurar um atributo virtual em seu esquema. No esquema relacionado você precisará adicionar um atributo virtual _destroy para que possamos rastrear a propriedade destroy no formulário. Você também precisará lançar isso em seu conjunto de alterações. Aqui está um exemplo de conjunto de alterações. Neste cenário, um usuário tem muitos produtos e os produtos podem ser excluídos. Também temos muitas funções associadas.
defmodule TestExAdmin.User do importar Ecto.Changeset usar Ecto.Schema importar Ecto.Query esquema "usuários" dofield: nome,: stringfield: e-mail,: stringfield: ativo,: booleano, padrão: truehas_many: produtos, TestExAdmin.Product, on_replace:: deletemany_to_many: funções, TestExAdmin.Role, join_through: TestExAdmin.UserRole, on_replace: :excluir fim @fields ~w(nome do e-mail ativo) def changeset(model, params %{}) domodel|> cast(params, @fields)|> valid_required([:email, :name])|> cast_assoc(:produtos, obrigatório: false)|> add_roles(params) fim def add_roles(changeset, params) doif Enum.count(Map.get(params, :roles, [])) > 0 do ids = params[:roles] rolees = TestExAdmin.Repo.all(de r em TestExAdmin.Role, onde: r.id em ^ids) put_assoc(changeset, :roles, Roles)else changesetend endenddefmodule TestExAdmin.Role do usar Ecto.Schema importar Ecto.Changeset alias TestExAdmin.Repo esquema "roles" dofield: nome,: stringhas_many: uses_roles, TestExAdmin.UserRolemany_to_many: usuários, TestExAdmin.User, join_through: TestExAdmin.UserRole fim @campos ~w(nome) def changeset(model, params %{}) domodel|> cast(params, @fields) endenddefmodule TestExAdmin.Product do usar Ecto.Schema importar Ecto.Changeset esquema "produtos" dofield:_destroy,:boolean, virtual: truefield:title,:stringfield:price,:decimalbelongs_to:user, TestExAdmin.User fim def changeset(schema, params %{}) doschema|> cast(params, ~w(preço do título user_id))|> validar_required(~w(preço do título))|> mark_for_deletion fim defp mark_for_deletion(changeset) do# Se delete foi definido e for verdade, vamos alterar a ação se get_change(changeset, :_destroy) do %{changeset | ação: :delete}else changesetend fim
Existe um bom post no blog da Platformatec descrevendo como funcionam essas relações: http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/
Use o comando index do
para definir os campos a serem exibidos.
admin/meu_modelo.ex
defmodule MyProject.ExAdmin.MyModel do usar ExAdmin.Register register_resource MyProject.MyModel doindex do selectable_column() coluna: id coluna: nome actions() # exibe as ações padrão final da coluna fim
O exemplo a seguir mostra como personalizar o formulário com a macro form
:
defmodule MyProject.ExAdmin.Contact do usar ExAdmin.Register registrar_resource MyProject.Contact doform contato do inputs doinput contato,: primeiro_nomeinput contato,: último_nomeinput contato,: contato emailinput,: registro_data, tipo: Data # se você usar Ecto: tipo de data em seu contato de entrada de esquema,: categoria, coleção: MyProject.Category .all end insere "Grupos" doinputs :groups, como: :check_boxes, coleção: MyProject.Group.all endend fim
O exemplo a seguir ilustra como modificar a página show.
defmodule MyProject.ExAdmin.Question do usar ExAdmin.Register Register_resource MyProject.Question domenu prioridade: 3mostrar pergunta do atributos_tabela # exibe os atributos padrão # cria um painel para listar o painel de escolhas da pergunta "Escolhas" dotable_for(question.choices) do column :key column :nameend endend fim
O suporte para tipos de campos personalizados é feito em duas áreas, campos de renderização e controles de entrada.
Use o protocolo ExAdmin.Render.to_string/
para renderizar tipos que não são suportados pelo ExAdmin.
Por exemplo, para oferecer suporte à renderização de uma tupla, adicione o seguinte arquivo ao seu projeto:
# lib/render.exdefimpl ExAdmin.Render, para: Tupla do def to_string(tupla), faça: inspecionar(tupla)end
Use o item de configuração :field_type_matching
para definir o tipo de entrada.
Por exemplo, dado o seguinte projeto:
defmodule ElixirLangMoscow.SpeakerSlug do use EctoAutoslugField.Slug, de: [:nome, :empresa], para: :slugenddefmodule ElixirLangMoscow.Speaker do use ElixirLangMoscow.Web,: modelo usar Arc.Ecto.Model pseudônimo ElixirLangMoscow.SpeakerSlug esquema "alto-falantes" dofield: slug, SpeakerSlug.Typefield: avatar, ElixirLangMoscow.Avatar.Type fim
Adicione o seguinte à configuração do seu projeto:
configuração: ex_admin, #... field_type_matching:%{ElixirLangMoscow.SpeakerSlug.Type =>:string,ElixirLangMoscow.Avatar.Type =>:arquivo }
ExAdmin suporta 2 temas. O novo tema AdminLte2 está habilitado por padrão. O antigo tema ActiveAdmin também é compatível com aqueles que desejam compatibilidade com versões anteriores.
Para alterar o tema para ActiveAdmin, faça o seguinte em seu arquivo config/config.exs
:
config/config.exs
configuração: ex_admin, tema: ExAdmin.Theme.ActiveAdmin, ...
O tema AdminLte2 tem várias cores de pele diferentes, incluindo azul, preto, roxo, verde, vermelho, amarelo, luz azul, luz negra, luz roxa, luz verde, luz vermelha e luz amarela
Para alterar a cor da pele para, por exemplo, roxo:
config/config.exs
configuração: ex_admin, cor_da_pele: :roxo, ...
Você pode adicionar um seletor de tema no canto superior direito da barra de menu adicionando o seguinte ao seu arquivo config/config.exs
:
config/config.exs
configuração: ex_admin, theme_selector: [{"AdminLte", ExAdmin.Theme.AdminLte2},{"ActiveAdmin", ExAdmin.Theme.ActiveAdmin} ], ...
Você pode substituir o nome de um modelo definindo uma função model_name/0
no módulo. Isto é útil se você quiser usar um módulo diferente para algumas de suas ações.
admin/meu_modelo.ex
def nome_modelo do "nome_personalizado"fim
ExAdmin deixa o trabalho de autenticação para pacotes de terceiros. Para obter um exemplo de uso do Coherence, verifique o Projeto de demonstração de contato.
Visite o Wiki para obter mais informações sobre como adicionar autenticação.
Agradecemos qualquer contribuição ao ExAdmin. Verifique nossos guias CODE_OF_CONDUCT.md e CONTRIBUTING.md para obter mais informações. Geralmente mantemos uma lista de recursos e bugs no rastreador de problemas.
Exemplo detalhado de demonstração ExAdmin
Para um breve tutorial, visite Elixir Survey Tutorial
Demonstração ao vivo
Documentos
ex_admin
é Copyright (c) 2015-2016 E-MetroTel
O código-fonte é lançado sob a licença MIT.
Verifique LICENÇA para obter mais informações.