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);
+ },
}}
/>
)}