注意:此版本已更新为同时支持 Ecto 1.1 和 Ecto 2.0。请参阅安装以获取更多信息。
ExAdmin 是 Elixir 和 Phoenix Framework 的自动管理包,是 ActiveAdmin for Ruby on Rails 的移植/灵感。
查看现场演示。源代码可以在 ExAdmin Demo 中找到。
查看此附加实时演示,了解多对多关系、嵌套属性和身份验证的示例。
请参阅文档和 Wiki 了解更多信息。
ExAdmin 是一个应用程序的附加组件,使用 Phoenix 框架创建 CRUD 管理工具,只需很少的代码或无需代码。通过运行一些混合任务来定义您想要管理的 Ecto 模型,您将拥有无需额外代码即可运行的东西。
在使用 ExAdmin 之前,您需要创建一个 Phoenix 项目和一个 Ecto 模型。
将 ex_admin 添加到您的部门:
混合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 for phoenix >= 1.3.0-rc 模块:[MyProject.ExAdmin.Dashboard, ]
获取并编译依赖项
mix do deps.get, deps.compile
配置 ExAdmin:
mix admin.install
添加管理路由
网络/路由器.ex
defmodule MyProject.Router 做 使用 MyProject.Web,:路由器 使用 ExAdmin.Router ... 范围“/”,MyProject 做... 结尾 # 在 /admin 上设置 ExAdmin 路由 范围“/admin”,ExAdmin dopipe_through :browseradmin_routes() 结尾
添加分页配置
lib/my_project/repo.ex
defmodule MyProject.Repo douse 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 任务:
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.简单做 使用 ExAdmin.Register register_resource TestExAdmin.Simple doupdate_changeset :changeset_updatecreate_changeset :changeset_create 结束
我们支持多对多,并拥有 Ecto 提供的许多关系。我们建议对多对多关系使用cast_assoc,对多对多关系使用put_assoc。您可以在我们的测试模式中查看示例变更集
当从关系表单传递结果时,我们会进行一些强制,以便更轻松地在变更集中使用它们。对于集合复选框,我们会将所选选项 id 的数组传递给您的变更集,以便您可以获取它们并使用 put_assoc,如下所示
为了支持多次删除,您需要在架构上设置虚拟属性。在相关架构上,您需要添加 _destroy 虚拟属性,以便我们可以跟踪表单中的 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 变更集(模型,参数 %{}) domodel|> 强制转换(参数,@fields)|> validate_required([:电子邮件,:名称])|>cast_assoc(:产品,必需:假)|> add_roles(参数) 结尾 def add_roles(changeset, params) doif Enum.count(Map.get(params, :roles, [])) > 0 do ids = params[:roles] 角色 = TestExAdmin.Repo.all(来自 TestExAdmin.Role 中的 r,其中:^ids 中的 r.id) put_assoc(changeset, :roles, Roles)else Changesetend endenddefmodule TestExAdmin.Role 做 使用Ecto.Schema 导入 Ecto.Changeset 别名 TestExAdmin.Repo 模式“角色”dofield:名称,:stringhas_many:uses_roles,TestExAdmin.UserRolemany_to_many:用户,TestExAdmin.User,join_through:TestExAdmin.UserRole 结尾 @fields ~w(名称) def 变更集(模型,参数 %{}) domodel|> 强制转换(参数,@fields) endenddefmodule TestExAdmin.Product 做 使用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# 如果设置了删除并且它为 true,那么让我们更改操作 if get_change(changeset, :_destroy) do %{changeset |操作::删除}否则更改结束 结束
Platformatec 博客上有一篇很好的博客文章,描述了这些关系如何运作:http://blog.plataformatec.com.br/2015/08/working-with-ecto-associations-and-embeds/
使用index do
命令定义要显示的字段。
管理员/my_model.ex
defmodule MyProject.ExAdmin.MyModel 做 使用 ExAdmin.Register register_resource MyProject.MyModel doindex do selectable_column() column :id column :name actions() # 显示默认操作 columnend 结束
以下示例展示了如何使用form
宏自定义表单:
defmodule MyProject.ExAdmin.联系方式 使用 ExAdmin.Register register_resource MyProject.Contact doform contact do input doinput contact, :first_nameinput contact, :last_nameinput contact, :emailinput contact, :register_date, type: Date # 如果您在 schema 中使用 Ecto :date 类型input contact, :category, collection: MyProject.Category .all end 输入“Groups” doinputs :groups, as: :check_boxes, 集合: MyProject.Group.all结束 结束
以下示例说明了如何修改显示页面。
defmodule MyProject.ExAdmin.Question 做 使用 ExAdmin.Register register_resource MyProject.Question domenupriority: 3show Question do attribute_table # 显示默认属性 # 创建一个面板来列出问题的选项面板 "Choices" dotable_for(question.choices) do column :key column :nameend endend 结束
对自定义字段类型的支持是在两个区域中完成的:呈现字段和输入控件。
对于 ExAdmin 不支持的渲染类型,请使用ExAdmin.Render.to_string/
协议。
例如,要支持渲染元组,请将以下文件添加到您的项目中:
# lib/render.exdefimpl ExAdmin.Render, for: 元组 do def to_string(tuple), do: 检查(tuple)end
使用:field_type_matching
配置项设置输入类型。
例如,给定以下项目:
defmodule ElixirLangMoscow.SpeakerSlug 做 使用 EctoAutoslugField.Slug,从:[:name, :company],到::slugenddefmodule ElixirLangMoscow.Speaker 执行 使用 ElixirLangMoscow.Web, :model 使用 Arc.Ecto.Model 别名 ElixirLangMoscow.SpeakerSlug 模式“扬声器” dofield :slug,SpeakerSlug.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
函数来覆盖模型的名称。如果您想使用不同的模块来执行某些操作,这非常有用。
管理员/my_model.ex
def model_name 做 “自定义名称”结束
ExAdmin 将身份验证的工作留给了第三方软件包。有关使用 Coherence 的示例,请查看联系演示项目。
有关添加身份验证的更多信息,请访问 Wiki。
我们感谢对 ExAdmin 的任何贡献。请查看我们的 CODE_OF_CONDUCT.md 和 CONTRIBUTING.md 指南以获取更多信息。我们通常会在问题跟踪器中保留功能和错误的列表。
详细示例 ExAdmin 演示
如需简要教程,请访问 Elixir 调查教程
现场演示
文档
ex_admin
版权所有 (c) 2015-2016 E-MetroTel
源代码根据 MIT 许可证发布。
检查许可证以获取更多信息。