Backend архитектура

- Структура проекта
- Модели
- Репозитории
- Утилиты
This commit is contained in:
trueold89 2024-11-01 01:27:47 +03:00
commit aa5c8fb69f
Signed by: trueold89
GPG Key ID: C122E85DD49E6B30
8 changed files with 293 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
.obsidian
.trash

View File

@ -0,0 +1,82 @@
# Модели
***
> Описание структур данных для BackEnd
## Виджет (Абстрактный)
---
>[!Виджет]
>Абстрактный класс, описывающий стандартной поведение модели виджета
### Поля
---
- **Тип** - тип реализации абстракции | ENUM
- **Id** - Идентификатор в базе данных | Целое число
- **Имя** - имя виджета | Строка
- **Описание** - описание виджета | Строка
### Методы
---
- **Публичный | В формат БД | Строка** - Преобразовывает модель в формат, необходимый для записи в базу данных
- **Публичный | В Json | Строка** - Преобразовывает модель в *.json*
## Сайт
---
>[!Сайт]
>Реализация абстрактного класса виджета для описания сайтов ORUDO
### Поля
---
- **Ссылка** - Ссылка на сайт | Строка
- **Редирект** - Должна ли быть кнопка для перехода на сайт | Булево
- **Изображение** - Ссылка на изображение с логотипом сайта | Строка
### Yaml представление
---
```yaml
Sites:
id:
name: ""
desk: ""
link: ""
image: ""
redirect: True | False
```
### Json представление
---
```json
{
id: "",
name: "",
desk: "",
link: "",
image: "",
redirect: True | False
}
```
## Соц. сеть
---
>[!Соц. сеть]
>Реализация абстрактного класса виджета для описания внешних ресурсов ORUDO
### Поля
---
- **Ссылка** - Ссылка на сайт | Строка
- **Изображение** - Ссылка на изображение с аватаром ресурса | Строка
- **Иконка кнопки** - Ссылка на изображение с иконкой ресурса | Строка
### Yaml представление
---
```yaml
Social:
id:
name: ""
desk: ""
link: ""
image: ""
icon: ""
```
### Json представление
---
```json
{
id: "",
name: "",
desk: "",
link: "",
image: "",
icon: ""
}
```

View File

@ -0,0 +1,24 @@
# Репозитории
***
> Модули для доступа к различным элементам базы данных
## Репозиторий (Абстрактный)
---
>[!Репозиторий]
>Абстрактный класс, описывающий основные методы для репозитория
### Строки
---
- **Префикс** - Префикс базы данных *(Приватный | инициализируется перегрузкой в дочернем классе)*
### Методы
---
- **Приватный | Добавить виджет | Целое число | Абстрактный** - Добавляет виджет в базу данных, возвращает id
- **Приватный | Получить виджет | Виджет | Абстрактный** - Возвращает данные из базы данных по id
- **Публичный | Получить размер репозитория | Целое число | Абстрактный** - Возвращает размер репозитория
## Репозиторий сайтов
---
>[!Репозиторий сайтов]
>Реализации абстрактного класса репозитория для управления сайтами
## Репозиторий соц. сетей
---
>[!Репозиторий сайтов]
>Реализации абстрактного класса репозитория для управления соц. сетями

View File

@ -0,0 +1,32 @@
# Структура
***
>Описание модулей различных частей проекта, их взаимосвязи и назначения
## Общие компоненты
---
- **Nginx** - Веб-сервер для FrontEnd части сайта / доступ к хранилищу с изображениями / обратное прокси, связывающее все части сайта
- **FastAPI** - BackEnd часть сайта, программный интерфейс для получения информации для виджетов на сайте
- **Хранилище** - Хранилище с динамическими ассетами для сайта (иконки виджетов, бэкграунд, логотипы и т.п.)
- **React сайт** - FrontEnd часть, с пользовательским интерфейсом
### Связь компонентов
---
**Диаграмма связей компонентов**
![[connections.png]]
## Структура BackEnd
---
- **[[Утилиты]]** *(Модули для дополнительных ф-ий)*
- [[Утилиты#Парсер YAML|Парсер YAML]]
- [[Утилиты#Redis|Управление ДБ Redis]]
- [[Утилиты#Статические ф-ии|Статические ф-ии]]
- **[[Репозитории]]** *(Модули для получения доступа к данным БД)*
- [[Репозитории#Репозиторий сайтов|Сайты]]
- [[Репозитории#Репозиторий соц. сетей|Соц. сети]]
- **Контроллеры** *(Модули управления программным интерфейсом)*
- Сайты
- Соц. сети
- **[[Модели]]** *(Структуры данных)*
- [[Модели#Виджет (Абстрактный)|Виджет (Абстракция)]]
- [[Модели#Сайт|Сайт]]
- [[Модели#Соц. сеть|Соц. сеть]]
## Структура FrontEnd
---
`*требуется составить*`

View File

@ -0,0 +1,40 @@
# Утилиты BackEnd
***
>Прикладные модули необходимые для различных дополнительных функций
## Парсер YAML
---
>[!YAML Парсер]
>Модуль, который сериализует изначальный файл с описанием виджетов в разметке YAML в нативные объекты Python
### Поля
---
- **Путь к файлу** - Путь к .yaml файлу *( Приватный | Аргумент конструктора)*
- **Список агрументов** - Список аргументов виджетов *(Приватный | инициализируется методом преобразования)*
### Методы
---
- **Приватный | Загрузить файл | Строка** - Загружает файл с описанием виджетов в формате YAML и возвращает его в виде строки
- **Приватный | Преобразовать в список | None** - Преобразовывает загруженный файл в нативный Python список
- **Публичный | Создать объект | Widget** - Принимает в качестве аргументов набор параметров виджета и создаёт на их основе объект этого виджета в зависимости от типа *(сайт / соц. сеть)*
- **Публичный, магический, перезапись | len | int** - Возвращает кол-во виджетов полученных из файла при преобразовании
## Redis
---
>[!Redis]
>Утилита управления базой данных по протоколу Redis
### Поля
---
- **Хост Redis** - Адрес нахождения базы данных Redis *(Приватный | Аргумент конструктора)*
### Методы
---
- **Публичный | Получить поле | Строка** - Получает поле из БД[^1] по id
- **Публичный | Записать поле | Целое число** - Записывает значение поля в БД[^1], возвращает id созданного поля
- **Публичный | Удалить поле| None** - Удаляет значение поля из БД[^1]
- **Публичный | Очистка | None** - Обнуляет БД[^1]
[^1]: База данных
## Статические ф-ии
---
>[!Статические функции]
>Функции, которые не относятся к определенному модулю
>
- **Инциализация БД** - Отчищает базу данных, и после заполняет её модулями, полученными из парсера YAML

View File

@ -0,0 +1,110 @@
<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/24.7.8 Chrome/126.0.6478.234 Electron/31.4.0 Safari/537.36" version="24.7.8">
<diagram name="Страница — 1" id="TghjJbqFGwZU-yRDKE4a">
<mxGraphModel dx="1478" dy="1018" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="55yLeNXAztfiM6QIOv7U-2" value="ЩК" style="sketch=0;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=#2D7600;fillColor=#60a917;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;outlineConnect=0;align=center;shape=mxgraph.office.concepts.application_generic;fontColor=#ffffff;fontFamily=Montserrat;fontSize=14;fontStyle=0" vertex="1" parent="1">
<mxGeometry x="300" y="390" width="100" height="60" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#66B2FF;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-3" target="55yLeNXAztfiM6QIOv7U-2">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="250" y="547" />
<mxPoint x="250" y="420" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-6" value="orudo.ru/storage" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontSize=7;fontFamily=Montserrat;spacing=7;spacingLeft=0;" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-4">
<mxGeometry x="-0.0876" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-3" value="Storage" style="shadow=0;dashed=0;html=1;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;outlineConnect=0;shape=mxgraph.veeam.3d.datastore_volume;fillColor=#60a917;fontColor=#ffffff;strokeColor=#2D7600;fontFamily=Montserrat;fontSize=14;fontStyle=0" vertex="1" parent="1">
<mxGeometry x="510" y="530" width="60" height="34" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.005;exitY=0.63;exitDx=0;exitDy=0;exitPerimeter=0;fillColor=#fa6800;strokeColor=#C73500;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-7" target="55yLeNXAztfiM6QIOv7U-2">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="157" y="266" />
<mxPoint x="157" y="260" />
<mxPoint x="120" y="260" />
<mxPoint x="120" y="339" />
<mxPoint x="350" y="339" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-16" value="orudo.ru/api" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-14">
<mxGeometry x="0.3655" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-7" value="FastApi" style="aspect=fixed;sketch=0;html=1;dashed=0;whitespace=wrap;verticalLabelPosition=bottom;verticalAlign=top;fillColor=#60a917;strokeColor=#2D7600;points=[[0.005,0.63,0],[0.1,0.2,0],[0.9,0.2,0],[0.5,0,0],[0.995,0.63,0],[0.72,0.99,0],[0.5,1,0],[0.28,0.99,0]];shape=mxgraph.kubernetes.icon2;kubernetesLabel=1;prIcon=api;fontFamily=Montserrat;fontSize=14;fontColor=#ffffff;" vertex="1" parent="1">
<mxGeometry x="140" y="230" width="60" height="57.6" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-8" value="widgets.yaml" style="verticalLabelPosition=bottom;html=1;verticalAlign=top;align=center;strokeColor=#314354;fillColor=#647687;shape=mxgraph.azure.file_2;pointerEvents=1;fontColor=#ffffff;fontFamily=Montserrat;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="270" y="40" width="40" height="50" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#fa6800;strokeColor=#C73500;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-12" target="55yLeNXAztfiM6QIOv7U-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-12" value="RedisDB" style="image;sketch=0;aspect=fixed;html=1;points=[];align=center;fontSize=14;image=img/lib/mscae/Cache_Redis_Product.svg;fontFamily=Montserrat;" vertex="1" parent="1">
<mxGeometry x="260" y="233.60000000000002" width="60" height="50.4" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.524;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-8" target="55yLeNXAztfiM6QIOv7U-12">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="370" y="65" />
<mxPoint x="370" y="260" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-18" value="информация&lt;div style=&quot;font-size: 9px;&quot;&gt;о&lt;/div&gt;&lt;div style=&quot;font-size: 9px;&quot;&gt;виджетах&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];fontFamily=Montserrat;fontSize=9;" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-17">
<mxGeometry x="-0.1361" y="1" relative="1" as="geometry">
<mxPoint y="20" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#33FF99;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-19" target="55yLeNXAztfiM6QIOv7U-2">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-21" value="orudo.ru/" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-20">
<mxGeometry x="-0.161" y="2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;" edge="1" parent="1" source="55yLeNXAztfiM6QIOv7U-19">
<mxGeometry relative="1" as="geometry">
<mxPoint x="350" y="340" as="targetPoint" />
<Array as="points">
<mxPoint x="540" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-23" value="информация о виджетах" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-22">
<mxGeometry x="0.1145" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;endArrow=none;endFill=0;startArrow=classic;startFill=1;" edge="1" parent="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="480" y="547" as="targetPoint" />
<mxPoint x="570.0000000000001" y="417" as="sourcePoint" />
<Array as="points">
<mxPoint x="650" y="417" />
<mxPoint x="650" y="507" />
<mxPoint x="480" y="507" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-25" value="динамические ассеты" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="55yLeNXAztfiM6QIOv7U-24">
<mxGeometry x="0.4467" y="2" relative="1" as="geometry">
<mxPoint x="20" y="-3" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="55yLeNXAztfiM6QIOv7U-19" value="FrontEnd" style="sketch=0;points=[[0,0,0],[0.25,0,0],[0.5,0,0],[0.75,0,0],[1,0,0],[0,1,0],[0.25,1,0],[0.5,1,0],[0.75,1,0],[1,1,0],[0,0.25,0],[0,0.5,0],[0,0.75,0],[1,0.25,0],[1,0.5,0],[1,0.75,0]];outlineConnect=0;fontColor=#ffffff;fillColor=#60a917;strokeColor=#2D7600;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=14;fontStyle=0;aspect=fixed;shape=mxgraph.aws4.resourceIcon;resIcon=mxgraph.aws4.ecs_anywhere;fontFamily=Montserrat;" vertex="1" parent="1">
<mxGeometry x="510" y="390" width="60" height="60" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

View File

@ -0,0 +1,3 @@
# Дизайн-система [ORUDO.RU](https://orudo.ru)
***
`тут будет описание дизайн-системы сайта`