feat(control-panel): сброс системы «чистый запуск» (с бэкапом и подтверждением)
Пункт [Z] в control-panel.ps1: предпросмотр → бэкап БД → подтверждение вводом «СБРОС» → очистка. Скрипт backend/scripts/reset-system.js (dry-run по умолчанию, выполнение только с --apply --confirm=RESET): • сохраняет одного админа (min id), переназначает ему авторский контент (courses/tests/flashcard_decks/custom_sims/шаблоны/библиотека/lab-ссылки/board); • стирает всех остальных пользователей + классы/задания/сессии/геймификацию/ уведомления/прогресс/историю классрума/доступы/логи; • сохраняет контент: учебники, вопросы, темы, уроки, exam-prep, симуляции, биохимия, красная книга, магазин/достижения-определения, роли/права, app_settings; • обнуляет игровые счётчики админа; классифицирует ВСЕ 119 таблиц, неизвестные не трогает; • FK off + транзакция + foreign_key_check + VACUUM. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -183,6 +183,30 @@ function Backup-Db {
|
||||
Prune-Backups
|
||||
}
|
||||
|
||||
function Reset-System {
|
||||
Write-Host ''
|
||||
Write-Host ' ============================================================' -ForegroundColor Red
|
||||
Write-Host ' ВНИМАНИЕ: ЧИСТЫЙ ЗАПУСК - НЕОБРАТИМАЯ ОЧИСТКА' -ForegroundColor Red
|
||||
Write-Host ' ============================================================' -ForegroundColor Red
|
||||
Write-Host ' УДАЛЯТСЯ: все пользователи (кроме одного админа), классы,' -ForegroundColor Yellow
|
||||
Write-Host ' задания, сессии, геймификация, уведомления, прогресс, история.' -ForegroundColor Yellow
|
||||
Write-Host ' СОХРАНЯТСЯ: учебники, вопросы, тесты, курсы, уроки, exam-prep,' -ForegroundColor Gray
|
||||
Write-Host ' симуляции, настройки/права и один админ (контент переходит ему).' -ForegroundColor Gray
|
||||
Write-Host ''
|
||||
Write-Host ' План (предпросмотр, без изменений):' -ForegroundColor Cyan
|
||||
try { & node scripts/reset-system.js | Out-Host } catch { Write-Host (' Ошибка плана: ' + $_.Exception.Message) -ForegroundColor Red; return }
|
||||
Write-Host ''
|
||||
$ans = (Read-Host ' Для подтверждения введите СБРОС (иначе отмена)').Trim().ToUpper()
|
||||
if ($ans -ne 'СБРОС' -and $ans -ne 'RESET') { Write-Host ' Отменено.' -ForegroundColor Yellow; return }
|
||||
if (Server-Proc) { Write-Host ' Сервер работает - остановите его ([2]) перед сбросом для надёжности.' -ForegroundColor Yellow }
|
||||
Write-Host ' Шаг 1/2: бэкап БД...' -ForegroundColor Cyan
|
||||
Backup-Db
|
||||
Write-Host ' Шаг 2/2: очистка...' -ForegroundColor Cyan
|
||||
try { & node scripts/reset-system.js --apply --confirm=RESET | Out-Host }
|
||||
catch { Write-Host (' Ошибка сброса: ' + $_.Exception.Message) -ForegroundColor Red; return }
|
||||
Write-Host ' Готово. Перезапустите сервер ([3]). Бэкап сохранён в data\backups.' -ForegroundColor Green
|
||||
}
|
||||
|
||||
function Restore-Db {
|
||||
if (-not (Test-Path $script:BackupDir)) { Write-Host ' Папки бэкапов нет — сначала сделайте бэкап ([B]).' -ForegroundColor Yellow; return }
|
||||
$files = @(Get-ChildItem $script:BackupDir -Filter 'learnspace-*.db' -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending)
|
||||
@@ -389,6 +413,7 @@ while ($run) {
|
||||
Menu-Row '[5]' 'Применить миграции' '[A]' 'Создать админа'
|
||||
Menu-Row ' ' '' '[W]' 'Сторож (авто-рестарт)'
|
||||
Menu-Row ' ' '' '[E]' 'Ошибки в логах'
|
||||
Menu-Row ' ' '' '[Z]' 'Сброс системы (чистый запуск)'
|
||||
Write-Host ''
|
||||
Menu-Head 'ДИАГНОСТИКА И ПРОЧЕЕ' ''
|
||||
Write-Host ' ' -NoNewline
|
||||
@@ -417,6 +442,7 @@ while ($run) {
|
||||
'^(U|Г)$' { Run-Cmd 'Обновление из репозитория' { Update-FromRepo }; Refresh-Status }
|
||||
'^(W|Ц)$' { Watchdog; Refresh-Status }
|
||||
'^(E|У)$' { Run-Cmd 'Ошибки в логах' { Show-Errors } }
|
||||
'^(Z|Я)$' { Reset-System; Refresh-Status; Start-Sleep 1 }
|
||||
'^0$' { $run = $false }
|
||||
default { }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user