Проектирование архитектуры, настройка Git и базы данных Supabase
Проектирование архитектуры, настройка Git и базы данных Supabase
Добро пожаловать в курс по разработке образовательной AI-платформы (LMS). Мы создаем не просто сайт, а сложную экосистему с геймификацией, ролевой моделью (ученик, учитель, родитель, учреждение) и искусственным интеллектом. Чтобы проект получил высокую оценку и стал достойным кейсом в портфолио, мы начнем с фундамента: правильной архитектуры, профессиональной работы с Git и проектирования базы данных.
1. Архитектура системы: Модульный монолит
Для учебного проекта такого масштаба (LMS с элементами соцсети и турнирами) микросервисная архитектура может быть избыточной и сложной в развертывании. Мы выберем модульный монолит. Это позволит нам держать код в одном репозитории (удобно для показа преподавателю), но сохранять четкое разделение логики.
Согласно Степанов М.А. и др., современные образовательные системы требуют интеграции разнородных данных (цифровой след, успеваемость) и масштабируемости. Наша архитектура будет состоять из трех слоев:
- Frontend (Клиентская часть): React (Vite) + TailwindCSS. Отвечает за интерфейс, анимации геймификации и отображение графиков.
- Backend (Серверная часть): Node.js (Express/NestJS). Обрабатывает бизнес-логику: создание турниров, генерацию курсов через AI, валидацию данных.
- Data Layer (Слой данных):
- Supabase (PostgreSQL): Основное хранилище (пользователи, курсы, оценки).
- Redis: Кэширование, списки лидеров (leaderboards) в реальном времени и статусы «онлайн».
Схема взаимодействия
Пользователь (Student/Teacher) React App Node.js API Supabase/Redis.
2. Профессиональная настройка Git
Для получения высокой оценки важно показать историю разработки. Мы будем использовать методологию Conventional Commits. Это стандарт оформления коммитов, который делает историю читаемой.
Инициализация репозитория
Откройте терминал в папке проекта:
git init
echo "node_modules/" >> .gitignore
echo ".env" >> .gitignore
git add .
git commit -m "chore: initial project setup"
Правила именования коммитов
Каждый ваш коммит должен начинаться с типа изменения. Это покажет преподавателю вашу дисциплину.
feat:— новая функциональность (например,feat: add tournament logic)fix:— исправление бага (например,fix: user login error)docs:— изменения в документацииstyle:— форматирование, отсутсвие изменений кода (пробелы, точки с запятой)refactor:— правка кода без изменения функциональности
Использование понятной истории коммитов критически важно для командной разработки и оценки вклада каждого участника.
3. Проектирование базы данных в Supabase
Supabase предоставляет нам PostgreSQL «из коробки» с готовым API и аутентификацией. Это идеально подходит для быстрого старта сложного проекта. Как отмечают в статье про подключение Supabase, использование CLI и миграций позволяет автоматизировать развертывание схемы БД, что является признаком зрелого подхода к разработке (согласно @ansaril3).
ER-диаграмма (Схема данных)
Нам нужно реализовать 4 роли: Institution (Учреждение), Teacher (Учитель), Student (Ученик), Parent (Родитель). В Supabase таблица auth.users управляет входом, но данные профилей мы будем хранить в отдельной таблице public.profiles.
Основные таблицы:
-
profiles
id(uuid, PK) — ссылка наauth.usersrole(enum: 'admin', 'institution', 'teacher', 'student', 'parent')full_name(text)avatar_url(text)institution_id(uuid, FK) — принадлежность к школе/вузу
-
institutions (Учреждения)
id(uuid, PK)name(text)type(enum: 'school', 'college', 'university')subscription_plan(enum: 'basic', 'pro', 'max')
-
courses (Курсы)
id(uuid, PK)title(text)author_id(uuid, FK) — учитель или учреждениеis_public(boolean) — для глобального поискаprice(numeric) — если курс платный
-
course_progress (Прогресс)
student_id(uuid, FK)course_id(uuid, FK)progress_percent(int)completed_at(timestamp)
-
gamification_stats (Геймификация)
user_id(uuid, FK)xp(int) — опытlevel(int) — уровеньcoins(int) — внутренняя валюта
Математика геймификации
Чтобы система уровней была сбалансированной, мы не можем использовать линейный рост. Нам нужна формула, где каждый следующий уровень требует больше опыта. Используем квадратичную зависимость.
Формула расчета необходимого опыта () для достижения уровня ():
где — необходимое количество очков опыта для достижения уровня, — коэффициент сложности (например, 100), — номер уровня.
При :
- Уровень 1: XP
- Уровень 2: XP
- Уровень 10: XP
Для расчета текущего уровня игрока на основе его опыта используем обратную формулу:
L_{current} = igg ⌊ ext{sqrt}igg(rac{XP_{total}}{K}igg) igg ⌋
где — текущий уровень (округленный вниз), — текущий опыт игрока, — коэффициент сложности.
SQL для создания таблиц (Supabase SQL Editor)
Вставьте этот код в SQL Editor в панели Supabase:
-- Создание ENUM для ролей
create type user_role as enum ('institution', 'teacher', 'student', 'parent', 'admin');
-- Таблица профилей
create table public.profiles (
id uuid references auth.users on delete cascade not null primary key,
role user_role default 'student',
full_name text,
institution_id uuid, -- связь добавим позже
created_at timestamp with time zone default timezone('utc'::text, now())
);
-- Включение RLS (Row Level Security)
alter table public.profiles enable row level security;
-- Политика: каждый может читать базовые данные, но менять только свои
create policy "Public profiles are viewable by everyone."
on profiles for select
using ( true );
create policy "Users can insert their own profile."
on profiles for insert
with check ( auth.uid() = id );
4. Настройка Redis для турниров
Redis нам нужен для двух критических функций, которые сложно реализовать быстро на чистом SQL:
- Статус Online: Родители и учителя должны видеть, в сети ли ученик.
- Leaderboards (Турнирные таблицы): Сортировка тысяч учеников по очкам в реальном времени.
В Node.js мы будем использовать структуру Sorted Set в Redis для хранения очков турнира. Это работает быстрее, чем SELECT * FROM users ORDER BY xp DESC в PostgreSQL при больших нагрузках.
5. Инициализация проекта (Node.js + React)
Создадим структуру папок, которая впечатлит любого проверяющего своей организованностью.
mkdir edu-platform-lms
cd edu-platform-lms
# Создаем папку для бэкенда
mkdir backend
cd backend
npm init -y
npm install express @supabase/supabase-js redis cors dotenv
# Создаем папку для фронтенда (в корне проекта)
cd ..
npm create vite@latest frontend -- --template react-ts
В итоге ваша структура должна выглядеть так:
/edu-platform-lms
/backend # API, работа с AI, Redis
/frontend # React, UI компоненты
/docs # Документация и схемы
.gitignore
README.md
Итоги
В этой статье мы заложили фундамент нашей LMS-платформы:
- Утвердили архитектуру Модульного Монолита (React + Node.js + Supabase + Redis).
- Настроили Git с использованием Conventional Commits для профессиональной истории изменений.
- Спроектировали схему базы данных с учетом ролей (Учреждение, Учитель, Родитель, Студент) и настроили RLS в Supabase.
- Ввели математическую модель геймификации для расчета уровней.
- Подготовили структуру проекта для дальнейшей разработки функционала.