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()