feat: admin panel
I just added is_admin field to user schema, /admin scope, admin page controller and view. No extra functions were implemented.
This commit is contained in:
parent
2d81bf20ce
commit
45c91eb3bf
10 changed files with 110 additions and 0 deletions
10
assets/css/admin.css
Normal file
10
assets/css/admin.css
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
.admin-panel {
|
||||||
|
display: flex;
|
||||||
|
gap: 16px;
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-panel ul {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
@import "./core_components.css";
|
@import "./core_components.css";
|
||||||
@import "./flash.css";
|
@import "./flash.css";
|
||||||
|
@import "./admin.css";
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--bg: #13151a;
|
--bg: #13151a;
|
||||||
|
|
|
@ -7,6 +7,7 @@ defmodule Comfycamp.Accounts.User do
|
||||||
field :password, :string, virtual: true, redact: true
|
field :password, :string, virtual: true, redact: true
|
||||||
field :hashed_password, :string, redact: true
|
field :hashed_password, :string, redact: true
|
||||||
field :confirmed_at, :naive_datetime
|
field :confirmed_at, :naive_datetime
|
||||||
|
field :is_admin, :boolean, default: false
|
||||||
|
|
||||||
timestamps(type: :utc_datetime)
|
timestamps(type: :utc_datetime)
|
||||||
end
|
end
|
||||||
|
|
30
lib/comfycamp_web/components/layouts/admin.html.heex
Normal file
30
lib/comfycamp_web/components/layouts/admin.html.heex
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
<.flash_group flash={@flash} />
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<div class="limiter">
|
||||||
|
<h1>Comfycamp - админка</h1>
|
||||||
|
<.link href={~p"/"}>
|
||||||
|
Главная страница
|
||||||
|
</.link>
|
||||||
|
<div class="admin-panel">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<.link href={~p"/admin/posts"}>
|
||||||
|
Посты
|
||||||
|
</.link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<.link href={~p"/admin/users"}>
|
||||||
|
Пользователи
|
||||||
|
</.link>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<.link href={~p"/admin/services"}>
|
||||||
|
Сервисы
|
||||||
|
</.link>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<%= @inner_content %>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
|
@ -23,6 +23,9 @@ defmodule ComfycampWeb.NavBar do
|
||||||
<div class="space" />
|
<div class="space" />
|
||||||
|
|
||||||
<%= if @current_user do %>
|
<%= if @current_user do %>
|
||||||
|
<.link :if={@current_user.is_admin} href={~p"/admin"}>
|
||||||
|
Админка
|
||||||
|
</.link>
|
||||||
<.link href={~p"/users/settings"}>
|
<.link href={~p"/users/settings"}>
|
||||||
Настройки
|
Настройки
|
||||||
</.link>
|
</.link>
|
||||||
|
|
27
lib/comfycamp_web/controllers/admin_page_controller.ex
Normal file
27
lib/comfycamp_web/controllers/admin_page_controller.ex
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
defmodule ComfycampWeb.AdminPageController do
|
||||||
|
use ComfycampWeb, :controller
|
||||||
|
|
||||||
|
def home(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_layout(html: :admin)
|
||||||
|
|> render(:home, page_title: "Админка")
|
||||||
|
end
|
||||||
|
|
||||||
|
def posts(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_layout(html: :admin)
|
||||||
|
|> render(:home, page_title: "Админка")
|
||||||
|
end
|
||||||
|
|
||||||
|
def users(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_layout(html: :admin)
|
||||||
|
|> render(:home, page_title: "Админка")
|
||||||
|
end
|
||||||
|
|
||||||
|
def services(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_layout(html: :admin)
|
||||||
|
|> render(:home, page_title: "Админка")
|
||||||
|
end
|
||||||
|
end
|
9
lib/comfycamp_web/controllers/admin_page_html.ex
Normal file
9
lib/comfycamp_web/controllers/admin_page_html.ex
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule ComfycampWeb.AdminPageHTML do
|
||||||
|
use ComfycampWeb, :html
|
||||||
|
|
||||||
|
def home(assigns) do
|
||||||
|
~H"""
|
||||||
|
Добро пожаловать, админ.
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
end
|
|
@ -84,4 +84,13 @@ defmodule ComfycampWeb.Router do
|
||||||
live "/users/confirm", UserConfirmationInstructionsLive, :new
|
live "/users/confirm", UserConfirmationInstructionsLive, :new
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
scope "/admin", ComfycampWeb do
|
||||||
|
pipe_through [:browser, :require_authenticated_user, :ensure_admin]
|
||||||
|
|
||||||
|
get "/", AdminPageController, :home
|
||||||
|
get "/posts", AdminPageController, :posts
|
||||||
|
get "/users", AdminPageController, :users
|
||||||
|
get "/services", AdminPageController, :services
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -213,6 +213,17 @@ defmodule ComfycampWeb.UserAuth do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def ensure_admin(conn, _opts) do
|
||||||
|
if conn.assigns[:current_user].is_admin do
|
||||||
|
conn
|
||||||
|
else
|
||||||
|
conn
|
||||||
|
|> put_flash(:error, "Вы должны быть администратором для просмотра.")
|
||||||
|
|> redirect(to: ~p"/")
|
||||||
|
|> halt()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp put_token_in_session(conn, token) do
|
defp put_token_in_session(conn, token) do
|
||||||
conn
|
conn
|
||||||
|> put_session(:user_token, token)
|
|> put_session(:user_token, token)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule Comfycamp.Repo.Migrations.AddIsAdminField do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:users) do
|
||||||
|
add :is_admin, :boolean, null: false, default: false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue