mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 04:31:09 +00:00
Добавление аналитики
This commit is contained in:
@@ -1,17 +1,19 @@
|
||||

|
||||
# LiB
|
||||
|
||||
Это проект приложения на FastAPI - современном веб фреймворке для создания API на Python. Я использую Pydantic для валидации данных, SQLModel для взаимодействия с базой данных, Alembic для управления миграциями, PostgreSQL как систему базы данных и Docker Compose для легкого развертывания.
|
||||
Веб-приложение библиотеки на FastAPI с современным REST API и веб-интерфейсом. Использует Pydantic для валидации данных, SQLModel для работы с базой данных, Alembic для миграций, PostgreSQL как СУБД и Docker Compose для развертывания.
|
||||
|
||||
### **Ключевые элементы:**
|
||||
|
||||
1. FastAPI: Предоставляет высокопроизводительность и простоту для разработки RESTful API, поддерживает асинхронные операции и автоматическую генерацию документации.
|
||||
2. Pydantic: Используется для валидации данных и сериализации, позволяет легко определить схемы данных.
|
||||
3. SQLModel: Объединяет SQLAlchemy и Pydantic, включая операции с базой данных с помощью классов Python.
|
||||
4. Alembic: Инструмент для управления миграциями базы данных, упрощающий отслеживание и применение изменений в схеме базы данных.
|
||||
5. PostgreSQL: Надежная реляционная база данных для хранения данных.
|
||||
6. Docker Compose: Упрощает развертывание приложения и его зависимостей в контейнерах.
|
||||
### **Ключевые технологии:**
|
||||
|
||||
1. **FastAPI**: Высокопроизводительный веб-фреймворк для создания RESTful API с автоматической генерацией документации
|
||||
2. **Pydantic**: Валидация данных и сериализация с использованием аннотаций типов Python
|
||||
3. **SQLModel**: Объединение SQLAlchemy и Pydantic для работы с БД через классы Python
|
||||
4. **Alembic**: Инструмент для управления миграциями базы данных
|
||||
5. **PostgreSQL**: Надежная реляционная база данных
|
||||
6. **Docker Compose**: Упрощенное развертывание приложения и зависимостей в контейнерах
|
||||
7. **Tailwind CSS**: CSS-фреймворк для стилизации интерфейса
|
||||
8. **Alpine.js**: Легковесный JavaScript-фреймворк для реактивности
|
||||
9. **Chart.js**: Библиотека для визуализации данных
|
||||
|
||||
### **Инструкция по установке**
|
||||
|
||||
@@ -50,58 +52,122 @@
|
||||
docker compose up test
|
||||
```
|
||||
|
||||
Для добавление данных для примера используйте:
|
||||
Для добавления данных для примера используйте:
|
||||
```bash
|
||||
python data.py
|
||||
```
|
||||
|
||||
### **Роли пользователей**
|
||||
|
||||
- **Админ**: Полный доступ ко всем функциям системы
|
||||
- **librarian**: Управление книгами, авторами, жанрами и выдачами
|
||||
- **member**: Просмотр каталога и управление своими выдачами
|
||||
|
||||
### **Эндпоинты API**
|
||||
|
||||
**Авторы**
|
||||
| Метод | Эндпоинты | Описание |
|
||||
|--------|---------------------------|---------------------------------|
|
||||
| POST | `/api/authors` | Создать нового автора |
|
||||
| GET | `/api/authors` | Получить список всех авторов |
|
||||
| GET | `/api/authors/{id}` | Получить автора по ID с книгами |
|
||||
| PUT | `/api/authors/{id}` | Обновить автора по ID |
|
||||
| DELETE | `/api/authors/{id}` | Удалить автора по ID |
|
||||
#### **Аутентификация** (`/api/auth`)
|
||||
|
||||
**Книги**
|
||||
| Метод | Эндпоинты | Описание |
|
||||
|--------|---------------------------|---------------------------------|
|
||||
| POST | `/api/books` | Создать новую книгу |
|
||||
| GET | `/api/books` | Получить список всех книг |
|
||||
| GET | `/api/book/{id}` | Получить книгу по ID с авторами |
|
||||
| PUT | `/api/books/{id}` | Обновить книгу по ID |
|
||||
| DELETE | `/api/books/{id}` | Удалить книгу по ID |
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|-----------------------------------------------|----------------|------------------------------------------|
|
||||
| POST | `/api/auth/register` | Публичный | Регистрация нового пользователя |
|
||||
| POST | `/api/auth/token` | Публичный | Получение JWT токенов (access + refresh) |
|
||||
| POST | `/api/auth/refresh` | Публичный | Обновление пары токенов |
|
||||
| GET | `/api/auth/me` | Авторизованный | Информация о текущем пользователе |
|
||||
| PUT | `/api/auth/me` | Авторизованный | Обновление профиля текущего пользователя |
|
||||
| GET | `/api/auth/users` | Сотрудник | Список всех пользователей |
|
||||
| POST | `/api/auth/users/{user_id}/roles/{role_name}` | Админ | Назначение роли пользователю |
|
||||
| DELETE | `/api/auth/users/{user_id}/roles/{role_name}` | Админ | Удаление роли у пользователя |
|
||||
| GET | `/api/auth/roles` | Авторизованный | Список ролей в системе |
|
||||
|
||||
**Жанры**
|
||||
| Метод | Эндпоинты | Описание |
|
||||
|--------|----------------------------|--------------------------------|
|
||||
| POST | `/api/genres` | Создать новый жанр |
|
||||
| GET | `/api/genres` | Получить список всех жанров |
|
||||
| GET | `/api/genres/{id}` | Получить жанр по ID |
|
||||
| PUT | `/api/genres/{id}` | Обновить жанр по ID |
|
||||
| DELETE | `/api/genres/{id}` | Удалить жанр по ID |
|
||||
#### **Авторы** (`/api/authors`)
|
||||
|
||||
**Связи**
|
||||
| Метод | Эндпоинты | Описание |
|
||||
|--------|------------------------------|-----------------------------------|
|
||||
| GET | `/authors/{id}/books` | Получить список книг для автора |
|
||||
| GET | `/books/{id}/authors` | Получить список авторов для книги |
|
||||
| POST | `/relationships/author-book` | Связать автор-книга |
|
||||
| DELETE | `/relationships/author-book` | Разделить автор-книга |
|
||||
| GET | `/genres/{id}/books` | Получить список книг для жанра |
|
||||
| GET | `/books/{id}/genres` | Получить список жанров для книги |
|
||||
| POST | `/relationships/genre-book` | Связать автор-книга |
|
||||
| DELETE | `/relationships/genre-book` | Разделить автор-книга |
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|---------------------|-----------|---------------------------------|
|
||||
| POST | `/api/authors` | Сотрудник | Создать нового автора |
|
||||
| GET | `/api/authors` | Публичный | Получить список всех авторов |
|
||||
| GET | `/api/authors/{id}` | Публичный | Получить автора по ID с книгами |
|
||||
| PUT | `/api/authors/{id}` | Сотрудник | Обновить автора по ID |
|
||||
| DELETE | `/api/authors/{id}` | Сотрудник | Удалить автора по ID |
|
||||
|
||||
**Другие**
|
||||
| Метод | Эндпоинты | Описание |
|
||||
|--------|--------------|----------------------------------------------|
|
||||
| GET | `/api/info` | Получить общую информацию о сервисе |
|
||||
| GET | `/api/stats` | Получить статистическую информацию о сервисе |
|
||||
#### **Книги** (`/api/books`)
|
||||
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|---------------------|-----------|-----------------------------------------------------------|
|
||||
| GET | `/api/books/filter` | Публичный | Фильтрация книг по названию, авторам, жанрам с пагинацией |
|
||||
| POST | `/api/books` | Сотрудник | Создать новую книгу |
|
||||
| GET | `/api/books` | Публичный | Получить список всех книг |
|
||||
| GET | `/api/books/{id}` | Публичный | Получить книгу по ID с авторами и жанрами |
|
||||
| PUT | `/api/books/{id}` | Сотрудник | Обновить книгу по ID |
|
||||
| DELETE | `/api/books/{id}` | Сотрудник | Удалить книгу по ID |
|
||||
|
||||
#### **Жанры** (`/api/genres`)
|
||||
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|--------------------|-----------|-------------------------------|
|
||||
| POST | `/api/genres` | Сотрудник | Создать новый жанр |
|
||||
| GET | `/api/genres` | Публичный | Получить список всех жанров |
|
||||
| GET | `/api/genres/{id}` | Публичный | Получить жанр по ID с книгами |
|
||||
| PUT | `/api/genres/{id}` | Сотрудник | Обновить жанр по ID |
|
||||
| DELETE | `/api/genres/{id}` | Сотрудник | Удалить жанр по ID |
|
||||
|
||||
#### **Выдачи** (`/api/loans`)
|
||||
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|------------------------------------|----------------|--------------------------------------------------------------|
|
||||
| POST | `/api/loans` | Авторизованный | Создать выдачу/бронь (читатели для себя, Сотрудник для всех) |
|
||||
| GET | `/api/loans` | Авторизованный | Список выдач (читатели видят свои, Сотрудник видят все) |
|
||||
| GET | `/api/loans/analytics` | Админ | Аналитика выдач и возвратов |
|
||||
| GET | `/api/loans/{id}` | Авторизованный | Получить выдачу по ID (читатели только свои) |
|
||||
| PUT | `/api/loans/{id}` | Авторизованный | Обновить выдачу (читатели только свои) |
|
||||
| POST | `/api/loans/{id}/confirm` | Сотрудник | Подтвердить бронь (меняет статус на BORROWED) |
|
||||
| POST | `/api/loans/{id}/return` | Сотрудник | Вернуть книгу и закрыть выдачу |
|
||||
| DELETE | `/api/loans/{id}` | Авторизованный | Удалить выдачу/бронь (только для RESERVED статуса) |
|
||||
| GET | `/api/loans/book/{book_id}/active` | Сотрудник | Получить активную выдачу книги |
|
||||
| POST | `/api/loans/issue` | Админ | Выдать книгу напрямую без бронирования |
|
||||
|
||||
#### **Связи** (`/api`)
|
||||
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|--------|----------------------------------|-----------|-------------------------------|
|
||||
| POST | `/api/relationships/author-book` | Сотрудник | Связать автора и книгу |
|
||||
| DELETE | `/api/relationships/author-book` | Сотрудник | Удалить связь автор-книга |
|
||||
| GET | `/api/authors/{id}/books` | Публичный | Получить список книг автора |
|
||||
| GET | `/api/books/{id}/authors` | Публичный | Получить список авторов книги |
|
||||
| POST | `/api/relationships/genre-book` | Сотрудник | Связать жанр и книгу |
|
||||
| DELETE | `/api/relationships/genre-book` | Сотрудник | Удалить связь жанр-книга |
|
||||
| GET | `/api/genres/{id}/books` | Публичный | Получить список книг жанра |
|
||||
| GET | `/api/books/{id}/genres` | Публичный | Получить список жанров книги |
|
||||
|
||||
#### **Прочее** (`/api`)
|
||||
|
||||
| Метод | Эндпоинт | Доступ | Описание |
|
||||
|-------|--------------|-----------|----------------------|
|
||||
| GET | `/api/info` | Публичный | Информация о сервисе |
|
||||
| GET | `/api/stats` | Публичный | Статистика системы |
|
||||
|
||||
### **Веб-страницы**
|
||||
|
||||
| Путь | Доступ | Описание |
|
||||
|---------------------|----------------|-----------------------------------------|
|
||||
| `/` | Публичный | Главная страница |
|
||||
| `/auth` | Публичный | Страница авторизации |
|
||||
| `/profile` | Авторизованный | Профиль пользователя |
|
||||
| `/books` | Публичный | Каталог книг с фильтрацией |
|
||||
| `/book/{id}` | Публичный | Страница просмотра книги |
|
||||
| `/book/create` | Сотрудник | Создание новой книги |
|
||||
| `/book/{id}/edit` | Сотрудник | Редактирование книги |
|
||||
| `/authors` | Публичный | Список авторов |
|
||||
| `/author/{id}` | Публичный | Страница автора |
|
||||
| `/author/create` | Сотрудник | Создание автора |
|
||||
| `/author/{id}/edit` | Сотрудник | Редактирование автора |
|
||||
| `/genre/create` | Сотрудник | Создание жанра |
|
||||
| `/genre/{id}/edit` | Сотрудник | Редактирование жанра |
|
||||
| `/my-books` | Авторизованный | Мои выдачи |
|
||||
| `/users` | Сотрудник | Управление пользователями |
|
||||
| `/analytics` | Админ | Аналитика выдач и возвратов |
|
||||
| `/api` | Публичный | Страница с ссылками на документацию API |
|
||||
|
||||
### **Схема базы данных**
|
||||
|
||||
```mermaid
|
||||
erDiagram
|
||||
@@ -110,29 +176,28 @@ erDiagram
|
||||
string username UK
|
||||
string email UK
|
||||
string full_name
|
||||
string password
|
||||
string hashed_password
|
||||
boolean is_active
|
||||
boolean is_verified
|
||||
}
|
||||
|
||||
USER_ROLE {
|
||||
int user_id FK
|
||||
string role
|
||||
ROLE {
|
||||
int id PK
|
||||
string name UK
|
||||
string description
|
||||
int payroll
|
||||
}
|
||||
|
||||
LOAN {
|
||||
int id PK
|
||||
int book_id FK
|
||||
USER_ROLE_LINK {
|
||||
int user_id FK
|
||||
datetime borrowed_at
|
||||
datetime due_date
|
||||
datetime returned_at
|
||||
int role_id FK
|
||||
}
|
||||
|
||||
BOOK {
|
||||
int id PK
|
||||
string title
|
||||
string description
|
||||
string status
|
||||
}
|
||||
|
||||
AUTHOR {
|
||||
@@ -144,38 +209,53 @@ erDiagram
|
||||
GENRE {
|
||||
int id PK
|
||||
string name
|
||||
string description
|
||||
}
|
||||
|
||||
AUTHOR_BOOK {
|
||||
AUTHOR_BOOK_LINK {
|
||||
int author_id FK
|
||||
int book_id FK
|
||||
}
|
||||
|
||||
GENRE_BOOK {
|
||||
GENRE_BOOK_LINK {
|
||||
int genre_id FK
|
||||
int book_id FK
|
||||
}
|
||||
|
||||
USER ||--o{ USER_ROLE : "имеет роли"
|
||||
USER ||--o{ LOAN : "берёт книги"
|
||||
LOAN }o--|| BOOK : "выдача"
|
||||
BOOK_USER_LINK {
|
||||
int id PK
|
||||
int book_id FK
|
||||
int user_id FK
|
||||
datetime borrowed_at
|
||||
datetime due_date
|
||||
datetime returned_at
|
||||
}
|
||||
|
||||
AUTHOR ||--o{ AUTHOR_BOOK : "пишет"
|
||||
AUTHOR_BOOK }o--|| BOOK : "авторство"
|
||||
|
||||
GENRE ||--o{ GENRE_BOOK : "содержит"
|
||||
GENRE_BOOK }o--|| BOOK : "жанр"
|
||||
USER ||--o{ USER_ROLE_LINK : "имеет"
|
||||
ROLE ||--o{ USER_ROLE_LINK : "назначена"
|
||||
USER ||--o{ BOOK_USER_LINK : "берет"
|
||||
BOOK ||--o{ BOOK_USER_LINK : "выдана"
|
||||
AUTHOR ||--o{ AUTHOR_BOOK_LINK : "пишет"
|
||||
BOOK ||--o{ AUTHOR_BOOK_LINK : "написана"
|
||||
GENRE ||--o{ GENRE_BOOK_LINK : "содержит"
|
||||
BOOK ||--o{ GENRE_BOOK_LINK : "принадлежит"
|
||||
```
|
||||
|
||||
### **Статусы книг**
|
||||
|
||||
- **ACTIVE**: Книга доступна для выдачи
|
||||
- **RESERVED**: Книга забронирована (ожидает подтверждения)
|
||||
- **BORROWED**: Книга выдана пользователю
|
||||
|
||||
### **Используемые технологии**
|
||||
|
||||
- **FastAPI**: Современный web фреймворк для построения API с использованием Python, известный своей скоростью и простотой использования.
|
||||
- **Pydantic**: Библиотека для валидации данных и управления настройками, использующая аннотации типов Python.
|
||||
- **SQLModel**: Библиотека для взаимодействия с базами данных с использованием классов Python, объединяющая функции SQLAlchemy и Pydantic.
|
||||
- **Alembic**: Легковесный инструмент для миграции базы данных на основе SQLAlchemy.
|
||||
- **PostgreSQL**: Сильная, открытая реляционная система управления базами данных.
|
||||
- **Docker**: Платформа для разработки, распространения и запуска приложений в контейнерах.
|
||||
- **Docker Compose**: Инструмент для определения и запуска многоконтейнерных приложений Docker.
|
||||
- **Tailwind**: CSS-фреймворк, позволяющий стилизовать веб-интерфейсы, применяя готовые низкоуровневые классы.
|
||||
- **Cash**: Микро JavaScript-библиотека, созданная как очень быстрая и компактная альтернатива jQuery.
|
||||
- **FastAPI**: Современный веб-фреймворк для построения API на Python
|
||||
- **Pydantic**: Библиотека для валидации данных и управления настройками
|
||||
- **SQLModel**: Библиотека для взаимодействия с базами данных, объединяющая SQLAlchemy и Pydantic
|
||||
- **Alembic**: Инструмент для миграции базы данных на основе SQLAlchemy
|
||||
- **PostgreSQL**: Реляционная система управления базами данных
|
||||
- **Docker**: Платформа для разработки, распространения и запуска приложений в контейнерах
|
||||
- **Docker Compose**: Инструмент для определения и запуска многоконтейнерных приложений Docker
|
||||
- **Tailwind CSS**: CSS-фреймворк для стилизации интерфейса
|
||||
- **Alpine.js**: Легковесный JavaScript-фреймворк для реактивности
|
||||
- **Chart.js**: Библиотека для визуализации данных
|
||||
|
||||
Reference in New Issue
Block a user