注意:此版本已更新為同時支援 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 做... {: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, TestExmin.Roleles, placer. : :刪除 結尾 @fields ~w(名稱活動電子郵件) def 變更集(模型,參數%{}) domodel |>強制轉換(參數,@fields)|> validate_required([:電子郵件,:名稱])|>強制轉換(:產品,必需:假)|> 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(name) 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 # 如果您在scheim 中使用 Myc找到, type:Date:, conschejection, conschen, con下來, Category .all end 輸入「Groups」 doinputs :groups, as: :check_boxes, 集合: MyProject.Group.all endend 結束
以下範例說明如何修改顯示頁面。
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 endlumn :nameend 結束
對自訂欄位類型的支援是在兩個區域中完成的:呈現欄位和輸入控制項。
對於 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 許可證發布。
檢查許可證以獲取更多資訊。