254 lines
8.1 KiB
Markdown
254 lines
8.1 KiB
Markdown
# План доработок конструктора курса
|
||
|
||
---
|
||
|
||
## 📊 Текущее состояние
|
||
|
||
### ✅ Реализовано:
|
||
- Форма создания курса (название, описание, уровень)
|
||
- Vditor редактор с русской локализацией и поддержкой KaTeX
|
||
- Структура модулей (добавление, редактирование, удаление)
|
||
- Автосохранение в localStorage
|
||
- Загрузка файлов на бэкенд
|
||
- Рендеринг markdown на сервере
|
||
|
||
### ❌ Не реализовано:
|
||
- Создание/сохранение курсов через API (publishCourse — демо)
|
||
- Загрузка существующего курса для редактирования
|
||
- Синхронизация модулей с БД (только localStorage)
|
||
- API для создания модулей, уроков, шагов
|
||
- Валидация контента перед публикацией
|
||
- Управление черновиками (несколько курсов)
|
||
- Восстановление черновиков
|
||
|
||
---
|
||
|
||
## 🎯 ЭТАП 1: Базовый функционал создания курсов (ПРИОРИТЕТ)
|
||
|
||
### Задачи:
|
||
|
||
#### 1.1 **API для создания курса**
|
||
```
|
||
POST /api/course-builder/create
|
||
- title, description, level, content (markdown)
|
||
- response: Course с id
|
||
```
|
||
|
||
| Backend | Схема | Priority |
|
||
|---------|-------|----------|
|
||
| Создать endpoint в `routes/course_builder.py` | `CourseCreateRequest` schema | P0 |
|
||
| Реализовать CRUD операции в `crud.py` | `create_course_with_content()` | P0 |
|
||
- Связать с автором (current_user.id)
|
||
|
||
#### 1.2 **Фронтенд: Реализовать publishCourse**
|
||
```
|
||
- Заменить демо на API вызов
|
||
- Сохранение структуры модулей
|
||
- Очистка формы после успеха
|
||
```
|
||
|
||
| Компонент | Функция | Priority |
|
||
|-----------|--------|----------|
|
||
| `courseBuilder.js`, publishCourse() | API вызов на `/api/course-builder/create` | P0 |
|
||
| | Отправка structure.modules | P0 |
|
||
- Обработка ошибок (ошибки валидации)
|
||
|
||
#### 1.3 **API для сохранения черновика**
|
||
```
|
||
POST /api/course-builder/save-draft
|
||
- content (markdown)
|
||
- structure (modules, lessons, steps)
|
||
- duration
|
||
- response: { draft_id, saved_at }
|
||
```
|
||
|
||
| Endpoint | CRUD | Priority |
|
||
|----------|------|----------|
|
||
| Добавить в `course_builder.py` | `save_draft()` | P1 |
|
||
- Связать с current_user
|
||
|
||
#### 1.4 **API для загрузки черновика**
|
||
```
|
||
GET /api/course-builder/drafts
|
||
GET /api/course-builder/drafts/{draft_id}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔗 ЭТАП 2: Управление структурой курса
|
||
|
||
### Задачи:
|
||
|
||
#### 2.1 **API для создания модулей**
|
||
```
|
||
POST /api/course-builder/modules
|
||
- course_id, title, description, duration, order_index
|
||
- response: Module
|
||
```
|
||
|
||
#### 2.2 **API для создания уроков**
|
||
```
|
||
POST /api/course-builder/lessons
|
||
- module_id, title, description, order_index
|
||
- response: Lesson
|
||
```
|
||
|
||
#### 2.3 **API для создания шагов**
|
||
```
|
||
POST /api/course-builder/steps
|
||
- lesson_id, step_type, title, content, order_index
|
||
- response: Step
|
||
```
|
||
|
||
#### 2.4 **Frontend: Синхронизация с БД**
|
||
```
|
||
- Сохранять module/lesson после создания
|
||
- Обновлять courseStructure при редактировании
|
||
- Удалять из БД при удалении модуля
|
||
```
|
||
|
||
---
|
||
|
||
## 📋 ЭТАП 3: Редактирование существующих курсов
|
||
|
||
### Задачи:
|
||
|
||
#### 3.1 **API для загрузки курса для редактирования**
|
||
```
|
||
GET /api/course-builder/courses/{course_id}/edit
|
||
- return: { title, description, level, content, structure }
|
||
```
|
||
|
||
#### 3.2 **Frontend: Загрузка существующего курса**
|
||
```
|
||
- Добавить параметр ?course_id=123 в route
|
||
- Запрос данных при входе
|
||
- Заполнять форму и редактор
|
||
- Отображать структуру
|
||
```
|
||
|
||
#### 3.3 **API для обновления курса**
|
||
```
|
||
PUT /api/course-builder/courses/{course_id}
|
||
- обновление: title, description, level, content
|
||
- response: Course
|
||
```
|
||
|
||
#### 3.4 **API для обновления модулей/уроков**
|
||
```
|
||
PUT /api/course-builder/modules/{module_id}
|
||
PUT /api/course-builder/lessons/{lesson_id}
|
||
PUT /api/course-builder/steps/{step_id}
|
||
DELETE /api/{modules|lessons|steps}/{id}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 ЭТАП 4: Валидация и безопасность
|
||
|
||
### Задачи:
|
||
|
||
#### 4.1 **Валидация на бэкенде**
|
||
```
|
||
- Схемы Pydantic для всех API запросов
|
||
- Проверка обязательных полей
|
||
- Ограничение длины полей
|
||
- Валидация содержимого markdown (размер)
|
||
```
|
||
|
||
#### 4.2 **Проверки доступа**
|
||
```
|
||
- Проверка авторства курса при редактировании
|
||
- Доступ только к своим的课程
|
||
- Проверка авторизации при всех операциях
|
||
```
|
||
|
||
#### 4.3 **Rate limiting**
|
||
```
|
||
- Ограничение количества создаваемых курсов
|
||
- Ограничение размера загружаемых файлов
|
||
- Ограничение количества модулей/уроков
|
||
```
|
||
|
||
---
|
||
|
||
## 💾 ЭТАП 5: Улучшения UX
|
||
|
||
### Задачи:
|
||
|
||
#### 5.1 **Управление черновиками**
|
||
```
|
||
DELETE /api/course-builder/drafts/{id}
|
||
GET /api/course-builder/drafts (с пагинацией)
|
||
- Фронтенд: список черновиков
|
||
```
|
||
|
||
#### 5.2 **Автосохранение с индикацией**
|
||
```
|
||
- Индикатор сохранения (last saved at...)
|
||
- Лайв preview контента
|
||
- Быстрая вставка модулей (drag & drop)
|
||
```
|
||
|
||
#### 5.3 **Медиа библиотека**
|
||
```
|
||
- Список загруженных файлов
|
||
- Вставка в редактор по клику
|
||
- Управление файлами (удаление)
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 ЭТАП 6: Продвинутые функции (опционально)
|
||
|
||
### Задачи:
|
||
|
||
#### 6.1 **Клонирование курсов**
|
||
```
|
||
POST /api/course-builder/courses/{id}/clone
|
||
- Создает копию курса
|
||
```
|
||
|
||
#### 6.2 **Импорт/экспорт**
|
||
```
|
||
- Экспорт курса в JSON/ZIP
|
||
- Импорт курса из файла
|
||
```
|
||
|
||
#### 6.3 **Коллаборация** (будущее)
|
||
```
|
||
- Совместная редактирование
|
||
- История изменений
|
||
- Версионирование контента
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 Рекомендуемый порядок реализации
|
||
|
||
| Этап | Приоритет | Сложность | Ожидаемое время |
|
||
|---|---|---|---|
|
||
| **Этап 1.1** | P0 | Низкая | 2-3 часа |
|
||
| **Этап 1.2** | P0 | Средняя | 2-3 часа |
|
||
| **Этап 1.3** | P1 | Низкая | 1-2 часа |
|
||
| **Этап 1.4** | P1 | Низкая | 1 час |
|
||
| **Этап 2** | P1 | Средняя | 3-4 часа |
|
||
| **Этап 3** | P2 | Средняя | 4-5 часов |
|
||
| **Этап 4** | P2 | Средняя | 2-3 часа |
|
||
| **Этап 5** | P3 | Средняя | 4-5 часов |
|
||
| **Этап 6** | P4 | Высокая | TBD |
|
||
|
||
---
|
||
|
||
## ❓ Вопросы для уточнения
|
||
|
||
1. **С приоритетом хотите начать?**
|
||
- С минимального функционала (быстро, базовое)
|
||
- С полного функционала (медленно, полноценно)
|
||
|
||
2. **Нужно ли:**
|
||
- Версионирование редакций курса?
|
||
- Автосохранение с откатом?
|
||
- Публикация без модерации?
|
||
|
||
Соблюдение одного этапа за один раз или сразу запускать полную разработку? |