From e2c4a0b94465045059cda898469d743f14b6af17 Mon Sep 17 00:00:00 2001 From: Andrei Duvakin Date: Thu, 13 Feb 2025 21:05:45 +0500 Subject: [PATCH] =?UTF-8?q?=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB=20=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=8B=D0=B5=20=D1=81=D1=82=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=86=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BB=D0=B8=D0=BD?= =?UTF-8?q?=D0=B7=20=D0=B8=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=BD=D1=83=D1=8E.?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D1=83=20=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D1=8B=20=D0=BF=D0=B0=D1=86=D0=B8=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2,=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20=D0=BF=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=20=D0=B2=20=D0=B2=D0=B8=D0=B4=D0=B5=20?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D0=BF=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D1=81=D0=B5=D1=82=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/app/application/lenses_repository.py | 37 ++++++++++++++++ ...97c6bf2f1_добавил_признак_выдачи_у_линз.py | 30 +++++++++++++ api/app/domain/models/lens.py | 3 +- web-app/src/AppRouter.jsx | 5 ++- web-app/src/pages/HomePage.jsx | 12 ++++++ web-app/src/pages/LensPage.jsx | 11 +++++ web-app/src/pages/PatientsPage.jsx | 42 +++++++++++++++---- 7 files changed, 129 insertions(+), 11 deletions(-) create mode 100644 api/app/application/lenses_repository.py create mode 100644 api/app/database/migrations/versions/c0997c6bf2f1_добавил_признак_выдачи_у_линз.py create mode 100644 web-app/src/pages/HomePage.jsx create mode 100644 web-app/src/pages/LensPage.jsx diff --git a/api/app/application/lenses_repository.py b/api/app/application/lenses_repository.py new file mode 100644 index 0000000..fac8dca --- /dev/null +++ b/api/app/application/lenses_repository.py @@ -0,0 +1,37 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.domain.models import Lens + + +class LensesRepository: + def __init__(self, db: AsyncSession): + self.db = db + + async def get_all(self): + stmt = select(Lens) + result = await self.db.execute(stmt) + return result.scalars().all() + + async def create(self, lens: Lens): + self.db.add(lens) + await self.db.commit() + await self.db.refresh(lens) + return lens + + async def update(self, lens: Lens): + await self.db.merge(lens) + await self.db.commit() + return lens + + async def delete(self, lens_id: int): + stmt = select(Lens).filter(Lens.id == lens_id) + result = await self.db.execute(stmt) + lens = result.scalars().first() + + if lens: + await self.db.delete(lens) + await self.db.commit() + return lens + + return None diff --git a/api/app/database/migrations/versions/c0997c6bf2f1_добавил_признак_выдачи_у_линз.py b/api/app/database/migrations/versions/c0997c6bf2f1_добавил_признак_выдачи_у_линз.py new file mode 100644 index 0000000..89323e9 --- /dev/null +++ b/api/app/database/migrations/versions/c0997c6bf2f1_добавил_признак_выдачи_у_линз.py @@ -0,0 +1,30 @@ +"""добавил признак выдачи у линз + +Revision ID: c0997c6bf2f1 +Revises: 463487eaaa57 +Create Date: 2025-02-13 20:35:52.618925 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = 'c0997c6bf2f1' +down_revision: Union[str, None] = '463487eaaa57' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('lens', sa.Column('issued', sa.Boolean(), nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('lens', 'issued') + # ### end Alembic commands ### diff --git a/api/app/domain/models/lens.py b/api/app/domain/models/lens.py index 8781622..4f62ad0 100644 --- a/api/app/domain/models/lens.py +++ b/api/app/domain/models/lens.py @@ -1,5 +1,5 @@ from enum import Enum as PyEnum -from sqlalchemy import Column, Integer, ForeignKey, Float, Enum +from sqlalchemy import Column, Integer, ForeignKey, Float, Enum, Boolean from sqlalchemy.orm import relationship from app.domain.models import Base @@ -22,6 +22,7 @@ class Lens(Base): diameter = Column(Float, nullable=False) periphery_toricity = Column(Float, nullable=False) # Торичность перефирии side = Column(Enum(SideEnum), nullable=False) + issued = Column(Boolean, nullable=False, default=False) type_id = Column(Integer, ForeignKey('lenses_types.id'), nullable=False) diff --git a/web-app/src/AppRouter.jsx b/web-app/src/AppRouter.jsx index b4f1df0..befba5f 100644 --- a/web-app/src/AppRouter.jsx +++ b/web-app/src/AppRouter.jsx @@ -3,6 +3,8 @@ import PrivateRoute from "./components/PrivateRoute.jsx"; import LoginPage from "./pages/LoginPage.jsx"; import MainLayout from "./layouts/MainLayout.jsx"; import PatientsPage from "./pages/PatientsPage.jsx"; +import HomePage from "./pages/HomePage.jsx"; +import LensPage from "./pages/LensPage.jsx"; const AppRouter = () => ( @@ -12,7 +14,8 @@ const AppRouter = () => ( }> }> }/> - 1234

}/> + }/> + }/> }/> diff --git a/web-app/src/pages/HomePage.jsx b/web-app/src/pages/HomePage.jsx new file mode 100644 index 0000000..9c72df1 --- /dev/null +++ b/web-app/src/pages/HomePage.jsx @@ -0,0 +1,12 @@ + + + +const HomePage = () => { + + return ( + <> + + ) +} + +export default HomePage; \ No newline at end of file diff --git a/web-app/src/pages/LensPage.jsx b/web-app/src/pages/LensPage.jsx new file mode 100644 index 0000000..5fb7c2b --- /dev/null +++ b/web-app/src/pages/LensPage.jsx @@ -0,0 +1,11 @@ + + + +const LensPage = () => { + return ( + <> + + ) +} + +export default LensPage; diff --git a/web-app/src/pages/PatientsPage.jsx b/web-app/src/pages/PatientsPage.jsx index 43ed5b6..124c1a3 100644 --- a/web-app/src/pages/PatientsPage.jsx +++ b/web-app/src/pages/PatientsPage.jsx @@ -16,7 +16,6 @@ const PatientsPage = () => { const [searchText, setSearchText] = useState(""); const [sortOrder, setSortOrder] = useState("asc"); const [patients, setPatients] = useState([]); - const [error, setError] = useState(null); const [current, setCurrent] = useState(1); const [pageSize, setPageSize] = useState(10); @@ -38,8 +37,8 @@ const PatientsPage = () => { try { const data = await getAllPatients(user.token); setPatients(data); - } catch (err) { - setError(err.message); + } catch (error) { + console.log(error); notification.error({ message: "Ошибка загрузки данных", description: "Проверьте подключение к сети.", @@ -53,7 +52,13 @@ const PatientsPage = () => { }; const filteredPatients = patients - .filter((patient) => `${patient.first_name} ${patient.last_name}`.toLowerCase().includes(searchText.toLowerCase())) + .filter((patient) => { + const searchLower = searchText.toLowerCase(); + + return Object.values(patient) + .filter(value => typeof value === "string") + .some(value => value.toLowerCase().includes(searchLower)); + }) .sort((a, b) => { const fullNameA = `${a.last_name} ${a.first_name}`; const fullNameB = `${b.last_name} ${b.first_name}`; @@ -81,8 +86,8 @@ const PatientsPage = () => { description: "Пациент успешно удалён из базы.", placement: "topRight", }); - } catch (err) { - setError(err.message); + } catch (error) { + console.log(error); notification.error({ message: "Ошибка удаления", description: "Не удалось удалить пациента.", @@ -133,6 +138,7 @@ const PatientsPage = () => { placeholder="Поиск пациента" onChange={(e) => setSearchText(e.target.value)} style={{width: "100%"}} + allowClear /> @@ -148,10 +154,24 @@ const PatientsPage = () => { {loading ? ( - }/> - ) : ( +
+ }/> +
) : ( ( @@ -167,6 +187,10 @@ const PatientsPage = () => { pageSize, showSizeChanger: true, pageSizeOptions: ["5", "10", "20", "50"], + onChange: (page, newPageSize) => { + setCurrent(page); + setPageSize(newPageSize); + }, }} /> )}