77 lines
2.7 KiB
Python
77 lines
2.7 KiB
Python
import flet as ft
|
|
import designer as d
|
|
import api_client as api
|
|
|
|
|
|
class LoginView:
|
|
def __init__(self, page: ft.Page):
|
|
self.page = page
|
|
self._username = d.text_field("Логин", prefix_icon=ft.icons.PERSON_OUTLINE)
|
|
self._password = d.text_field("Пароль", password=True, prefix_icon=ft.icons.LOCK_OUTLINE)
|
|
self._error = ft.Text("", color=d.ERROR, size=13)
|
|
self._btn = d.btn_primary("Войти", on_click=self._on_login, width=280)
|
|
|
|
def build_page_view(self) -> ft.View:
|
|
self._username.on_submit = self._on_login
|
|
self._password.on_submit = self._on_login
|
|
|
|
form = ft.Container(
|
|
content=ft.Column(
|
|
[
|
|
ft.Icon(ft.icons.NEWSPAPER, size=56, color=d.PRIMARY),
|
|
d.headline("Новостная CMS", size=24),
|
|
d.caption("Войдите в панель управления", color=d.TEXT_SECONDARY),
|
|
ft.Divider(height=20, color="transparent"),
|
|
self._username,
|
|
self._password,
|
|
self._error,
|
|
ft.Divider(height=8, color="transparent"),
|
|
self._btn,
|
|
],
|
|
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
|
spacing=14,
|
|
width=320,
|
|
),
|
|
bgcolor=d.SURFACE,
|
|
border_radius=16,
|
|
padding=40,
|
|
shadow=ft.BoxShadow(blur_radius=24, color=ft.colors.with_opacity(0.10, ft.colors.BLACK)),
|
|
)
|
|
|
|
return ft.View(
|
|
route="/admin/login",
|
|
bgcolor=d.BACKGROUND,
|
|
controls=[
|
|
ft.Container(
|
|
content=form,
|
|
alignment=ft.alignment.center,
|
|
expand=True,
|
|
)
|
|
],
|
|
vertical_alignment=ft.MainAxisAlignment.CENTER,
|
|
horizontal_alignment=ft.CrossAxisAlignment.CENTER,
|
|
)
|
|
|
|
async def _on_login(self, e=None):
|
|
self._error.value = ""
|
|
username = self._username.value.strip()
|
|
password = self._password.value.strip()
|
|
if not username or not password:
|
|
self._error.value = "Заполните все поля"
|
|
self.page.update()
|
|
return
|
|
|
|
self._btn.disabled = True
|
|
self.page.update()
|
|
|
|
token = await api.admin_login(username, password)
|
|
self._btn.disabled = False
|
|
|
|
if token:
|
|
self.page.session.set("token", token)
|
|
self.page.session.set("username", username)
|
|
self.page.go("/admin")
|
|
else:
|
|
self._error.value = "Неверный логин или пароль"
|
|
self.page.update()
|