mirror of
https://github.com/wowlikon/LiB.git
synced 2026-02-04 04:31:09 +00:00
284 lines
17 KiB
Markdown
284 lines
17 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/LiB.git
|
||
```
|
||
|
||
2. Перейдите в каталог проекта:
|
||
```bash
|
||
cd LiB
|
||
```
|
||
|
||
3. Настройте переменные окружения:
|
||
```bash
|
||
cp example-docker.env .env # или example-local.env для запуска без docker
|
||
edit .env
|
||
```
|
||
|
||
4. Соберите контейнеры Docker:
|
||
```bash
|
||
docker compose build
|
||
```
|
||
|
||
5. Запустите приложение:
|
||
```bash
|
||
docker compose up api -d
|
||
```
|
||
|
||
Для создания новых миграций:
|
||
```bash
|
||
uv run alembic revision --autogenerate -m "Migration name"
|
||
```
|
||
|
||
### **Роли пользователей**
|
||
|
||
- **admin**: Полный доступ ко всем функциям системы
|
||
- **librarian**: Управление книгами, авторами, жанрами и выдачами
|
||
- **member**: Просмотр каталога и управление своими выдачами
|
||
|
||
### **Эндпоинты API**
|
||
|
||
#### **Аутентификация** (`/api/auth`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|------------------------------|----------------|------------------------------------------|
|
||
| POST | `/register` | Публичный | Регистрация нового пользователя |
|
||
| POST | `/token` | Публичный | Получение JWT токенов (access + refresh) |
|
||
| POST | `/refresh` | Публичный | Обновление пары токенов |
|
||
| GET | `/me` | Авторизованный | Информация о текущем пользователе |
|
||
| PUT | `/me` | Авторизованный | Обновление профиля текущего пользователя |
|
||
| GET | `/2fa` | Авторизованный | Создаёт QR-код для включения 2FA |
|
||
| POST | `/2fa/verify` | Неполный вход | Завершает вход при включеной 2FA |
|
||
| POST | `/2fa/enable` | Авторизованный | Включает двухваткорную аутентификацию |
|
||
| POST | `/2fa/disable` | Авторизованный | Выключает двухваткорную аутентификацию |
|
||
| GET | `/recovery-codes/status` | Авторизованный | Проверяет состояние кодов восстановления |
|
||
| POST | `/recovery-codes/regenerate` | Авторизованный | Пересоздает коды восстановления пароля |
|
||
| POST | `/password/reset` | Публичный | Сброс пароля с помощью одноразового кода |
|
||
|
||
#### **Авторы** (`/api/authors`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|----------|-----------|---------------------------------|
|
||
| POST | `/` | Сотрудник | Создать нового автора |
|
||
| GET | `/` | Публичный | Получить список всех авторов |
|
||
| GET | `/{id}` | Публичный | Получить автора по ID с книгами |
|
||
| PUT | `/{id}` | Сотрудник | Обновить автора по ID |
|
||
| DELETE | `/{id}` | Сотрудник | Удалить автора по ID |
|
||
|
||
#### **Книги** (`/api/books`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|-----------|-----------|----------------------------------------------|
|
||
| POST | `/` | Сотрудник | Создать новую книгу |
|
||
| GET | `/` | Публичный | Получить список всех книг |
|
||
| GET | `/{id}` | Публичный | Получить книгу по ID с авторами и жанрами |
|
||
| PUT | `/{id}` | Сотрудник | Обновить книгу по ID |
|
||
| DELETE | `/{id}` | Сотрудник | Удалить книгу по ID |
|
||
| GET | `/filter` | Публичный | Фильтрация книг по названию, авторам, жанрам |
|
||
|
||
#### **Жанры** (`/api/genres`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|----------|-----------|-------------------------------|
|
||
| POST | `/` | Сотрудник | Создать новый жанр |
|
||
| GET | `/` | Публичный | Получить список всех жанров |
|
||
| GET | `/{id}` | Публичный | Получить жанр по ID с книгами |
|
||
| PUT | `/{id}` | Сотрудник | Обновить жанр по ID |
|
||
| DELETE | `/{id}` | Сотрудник | Удалить жанр по ID |
|
||
|
||
#### **Выдачи** (`/api/loans`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|-------------------------|----------------|------------------------------------------------------------|
|
||
| POST | `/` | Авторизованный | Создать выдачу/бронь (читатели на себя, cотрудник на всех) |
|
||
| GET | `/` | Авторизованный | Список выдач (читатели видят свои, Сотрудник видят все) |
|
||
| GET | `{id}` | Авторизованный | Получить выдачу по ID (читатели только свои) |
|
||
| PUT | `{id}` | Авторизованный | Обновить выдачу (читатели только свои) |
|
||
| DELETE | `{id}` | Авторизованный | Удалить выдачу/бронь (только для RESERVED статуса) |
|
||
| POST | `{id}/confirm` | Сотрудник | Подтвердить бронь (меняет статус на BORROWED) |
|
||
| POST | `{id}/return` | Сотрудник | Вернуть книгу и закрыть выдачу |
|
||
| GET | `book/{book_id}/active` | Сотрудник | Получить активную выдачу книги |
|
||
| POST | `issue` | Админ | Выдать книгу напрямую без бронирования |
|
||
| GET | `analytics` | Админ | Аналитика выдач и возвратов |
|
||
|
||
#### **Связи** (`/api`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|------------------------------|-----------|-------------------------------|
|
||
| POST | `/relationships/author-book` | Сотрудник | Связать автора и книгу |
|
||
| DELETE | `/relationships/author-book` | Сотрудник | Удалить связь автор-книга |
|
||
| GET | `/authors/{id}/books` | Публичный | Получить список книг автора |
|
||
| GET | `/books/{id}/authors` | Публичный | Получить список авторов книги |
|
||
| POST | `/relationships/genre-book` | Сотрудник | Связать жанр и книгу |
|
||
| DELETE | `/relationships/genre-book` | Сотрудник | Удалить связь жанр-книга |
|
||
| GET | `/genres/{id}/books` | Публичный | Получить список книг жанра |
|
||
| GET | `/books/{id}/genres` | Публичный | Получить список жанров книги |
|
||
|
||
|
||
#### **Пользователи** (`/api/users`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|--------------------------------|----------------|------------------------------|
|
||
| POST | `/` | Админ | Создать нового пользователя |
|
||
| GET | `/` | Админ | Список всех пользователей |
|
||
| GET | `/{id}` | Админ | Получить пользователя по ID |
|
||
| PUT | `/{id}` | Админ | Обновить пользователя по ID |
|
||
| DELETE | `/{id}` | Админ | Удалить пользователя по ID |
|
||
| POST | `/{user_id}/roles/{role_name}` | Админ | Назначение роли пользователю |
|
||
| DELETE | `/{user_id}/roles/{role_name}` | Админ | Удаление роли у пользователя |
|
||
| GET | `/roles` | Авторизованный | Список ролей в системе |
|
||
|
||
|
||
#### **CAPTCHA** (`/api/cap`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|--------|---------------|-----------|-----------------|
|
||
| POST | `/challenge` | Публичный | Создание задачи |
|
||
| POST | `/redeem` | Публичный | Проверка задачи |
|
||
|
||
|
||
#### **Прочее** (`/api`)
|
||
|
||
| Метод | Эндпоинт | Доступ | Описание |
|
||
|-------|-----------|-----------|----------------------|
|
||
| GET | `/info` | Публичный | Информация о сервисе |
|
||
| GET | `/stats` | Публичный | Статистика системы |
|
||
| GET | `/schema` | Публичный | Схема базы данных |
|
||
|
||
### **Веб-страницы**
|
||
|
||
| Путь | Доступ | Описание |
|
||
|---------------------|----------------|-----------------------------|
|
||
| `/` | Публичный | Главная страница |
|
||
| `/api` | Публичный | Ссылки на документацию |
|
||
| `/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` | Админ | Аналитика выдач и возвратов |
|
||
|
||
|
||
### **Схема базы данных**
|
||
|
||
```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**: Книга выдана пользователю
|
||
- **RESTORATION**: Книга на реставрации
|
||
- **WRITTEN_OFF**: Книга списана
|
||
|
||
### **Используемые технологии**
|
||
|
||
- **FastAPI**: Современный веб-фреймворк для построения API на Python
|
||
- **Pydantic**: Библиотека для валидации данных и управления настройками
|
||
- **SQLModel**: Библиотека для взаимодействия с базами данных, объединяющая SQLAlchemy и Pydantic
|
||
- **Alembic**: Инструмент для миграции базы данных на основе SQLAlchemy
|
||
- **PostgreSQL**: Реляционная система управления базами данных
|
||
- **Ollama**: Инструмент для локального запуска и управления большими языковыми моделями
|
||
- **Docker**: Платформа для разработки, распространения и запуска приложений в контейнерах
|
||
- **Docker Compose**: Инструмент для определения и запуска многоконтейнерных приложений Docker
|
||
- **Tailwind CSS**: CSS-фреймворк для стилизации интерфейса
|
||
- **Alpine.js**: Легковесный JavaScript-фреймворк для реактивности
|
||
- **Chart.js**: Библиотека для визуализации данных
|