mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 12:31:09 +00:00
262 lines
15 KiB
Markdown
262 lines
15 KiB
Markdown

|
||
# LiB
|
||
|
||
Веб-приложение библиотеки на FastAPI с современным REST API и веб-интерфейсом. Использует Pydantic для валидации данных, SQLModel для работы с базой данных, Alembic для миграций, PostgreSQL как СУБД и 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**: Библиотека для визуализации данных
|
||
|
||
### **Инструкция по установке**
|
||
|
||
1. Клонируйте репозиторий:
|
||
```bash
|
||
git clone https://github.com/wowlikon/libraryapi.git
|
||
```
|
||
|
||
2. Перейдите в каталог проекта:
|
||
```bash
|
||
cd libraryapi
|
||
```
|
||
|
||
3. Настройте переменные окружения:
|
||
```bash
|
||
edit .env
|
||
```
|
||
|
||
4. Соберите контейнеры Docker:
|
||
```bash
|
||
docker compose build
|
||
```
|
||
|
||
5. Запустите приложение:
|
||
```bash
|
||
docker compose up api -d
|
||
```
|
||
|
||
Для создания новых миграций:
|
||
```bash
|
||
alembic revision --autogenerate -m "Migration name"
|
||
```
|
||
|
||
Для запуска тестов:
|
||
```bash
|
||
docker compose up test
|
||
```
|
||
|
||
Для добавления данных для примера используйте:
|
||
```bash
|
||
python data.py
|
||
```
|
||
|
||
### **Роли пользователей**
|
||
|
||
- **Админ**: Полный доступ ко всем функциям системы
|
||
- **librarian**: Управление книгами, авторами, жанрами и выдачами
|
||
- **member**: Просмотр каталога и управление своими выдачами
|
||
|
||
### **Эндпоинты API**
|
||
|
||
#### **Аутентификация** (`/api/auth`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|-----------------------------------------------|----------------|------------------------------------------|
|
||
| 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` | Авторизованный | Список ролей в системе |
|
||
|
||
#### **Авторы** (`/api/authors`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|---------------------|-----------|---------------------------------|
|
||
| POST | `/api/authors` | Сотрудник | Создать нового автора |
|
||
| GET | `/api/authors` | Публичный | Получить список всех авторов |
|
||
| GET | `/api/authors/{id}` | Публичный | Получить автора по ID с книгами |
|
||
| PUT | `/api/authors/{id}` | Сотрудник | Обновить автора по ID |
|
||
| DELETE | `/api/authors/{id}` | Сотрудник | Удалить автора по ID |
|
||
|
||
#### **Книги** (`/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
|
||
USER {
|
||
int id PK
|
||
string username UK
|
||
string email UK
|
||
string full_name
|
||
string hashed_password
|
||
boolean is_active
|
||
boolean is_verified
|
||
}
|
||
|
||
ROLE {
|
||
int id PK
|
||
string name UK
|
||
string description
|
||
int payroll
|
||
}
|
||
|
||
USER_ROLE_LINK {
|
||
int user_id FK
|
||
int role_id FK
|
||
}
|
||
|
||
BOOK {
|
||
int id PK
|
||
string title
|
||
string description
|
||
string status
|
||
}
|
||
|
||
AUTHOR {
|
||
int id PK
|
||
string name
|
||
string bio
|
||
}
|
||
|
||
GENRE {
|
||
int id PK
|
||
string name
|
||
string description
|
||
}
|
||
|
||
AUTHOR_BOOK_LINK {
|
||
int author_id FK
|
||
int book_id FK
|
||
}
|
||
|
||
GENRE_BOOK_LINK {
|
||
int genre_id FK
|
||
int book_id FK
|
||
}
|
||
|
||
BOOK_USER_LINK {
|
||
int id PK
|
||
int book_id FK
|
||
int user_id FK
|
||
datetime borrowed_at
|
||
datetime due_date
|
||
datetime returned_at
|
||
}
|
||
|
||
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**: Современный веб-фреймворк для построения API на Python
|
||
- **Pydantic**: Библиотека для валидации данных и управления настройками
|
||
- **SQLModel**: Библиотека для взаимодействия с базами данных, объединяющая SQLAlchemy и Pydantic
|
||
- **Alembic**: Инструмент для миграции базы данных на основе SQLAlchemy
|
||
- **PostgreSQL**: Реляционная система управления базами данных
|
||
- **Docker**: Платформа для разработки, распространения и запуска приложений в контейнерах
|
||
- **Docker Compose**: Инструмент для определения и запуска многоконтейнерных приложений Docker
|
||
- **Tailwind CSS**: CSS-фреймворк для стилизации интерфейса
|
||
- **Alpine.js**: Легковесный JavaScript-фреймворк для реактивности
|
||
- **Chart.js**: Библиотека для визуализации данных
|