123 lines
6.1 KiB
HTML
123 lines
6.1 KiB
HTML
<h2>Секция 2: Модель данных</h2>
|
|
<p class="subtitle">Основные сущности и связи в PostgreSQL</p>
|
|
|
|
<div class="mockup">
|
|
<div class="mockup-header">ER-диаграмма</div>
|
|
<div class="mockup-body" style="padding: 24px; font-size: 13px;">
|
|
|
|
<div style="display: flex; gap: 16px; flex-wrap: wrap; justify-content: center;">
|
|
|
|
<!-- User -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 200px; border-top: 3px solid #3b82f6;">
|
|
<div style="font-weight: bold; color: #60a5fa; margin-bottom: 8px;">👤 User</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>username</code> str unique<br>
|
|
<code>email</code> str unique<br>
|
|
<code>password_hash</code> str<br>
|
|
<code>role</code> enum (admin, user)<br>
|
|
<code>is_active</code> bool<br>
|
|
<code>created_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recording -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 220px; border-top: 3px solid #f59e0b;">
|
|
<div style="font-weight: bold; color: #fbbf24; margin-bottom: 8px;">🎬 Recording</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>user_id</code> FK → User<br>
|
|
<code>title</code> str<br>
|
|
<code>file_path</code> str<br>
|
|
<code>file_size</code> bigint<br>
|
|
<code>duration</code> interval<br>
|
|
<code>format</code> str (mp4, webm, mp3…)<br>
|
|
<code>source</code> enum (web, telegram, lensa)<br>
|
|
<code>status</code> enum (uploaded, processing, done, error)<br>
|
|
<code>created_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Transcription -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 220px; border-top: 3px solid #10b981;">
|
|
<div style="font-weight: bold; color: #34d399; margin-bottom: 8px;">📝 Transcription</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>recording_id</code> FK → Recording<br>
|
|
<code>text</code> text<br>
|
|
<code>segments</code> JSONB (таймкоды)<br>
|
|
<code>language</code> str<br>
|
|
<code>whisper_model</code> str<br>
|
|
<code>processing_time</code> interval<br>
|
|
<code>created_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Protocol -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 220px; border-top: 3px solid #8b5cf6;">
|
|
<div style="font-weight: bold; color: #a78bfa; margin-bottom: 8px;">📋 Protocol</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>transcription_id</code> FK → Transcription<br>
|
|
<code>template_id</code> FK → PromptTemplate<br>
|
|
<code>content</code> JSONB (структурированный)<br>
|
|
<code>raw_text</code> text<br>
|
|
<code>llm_model</code> str<br>
|
|
<code>status</code> enum (generating, done, error)<br>
|
|
<code>created_at</code> timestamp<br>
|
|
<code>updated_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PromptTemplate -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 220px; border-top: 3px solid #ec4899;">
|
|
<div style="font-weight: bold; color: #f472b6; margin-bottom: 8px;">📐 PromptTemplate</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>name</code> str<br>
|
|
<code>description</code> str<br>
|
|
<code>type</code> enum (client_survey, internal, standup, custom)<br>
|
|
<code>system_prompt</code> text<br>
|
|
<code>user_prompt</code> text<br>
|
|
<code>output_schema</code> JSONB<br>
|
|
<code>is_default</code> bool<br>
|
|
<code>created_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ExportFile -->
|
|
<div style="background: #1e293b; color: #e2e8f0; padding: 14px; border-radius: 8px; min-width: 200px; border-top: 3px solid #6b7280;">
|
|
<div style="font-weight: bold; color: #9ca3af; margin-bottom: 8px;">📄 ExportFile</div>
|
|
<div style="font-size: 12px; line-height: 1.8;">
|
|
<code>id</code> UUID PK<br>
|
|
<code>protocol_id</code> FK → Protocol<br>
|
|
<code>format</code> enum (docx, pdf, md)<br>
|
|
<code>file_path</code> str<br>
|
|
<code>file_size</code> bigint<br>
|
|
<code>created_at</code> timestamp
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Relations -->
|
|
<div style="margin-top: 20px; padding: 12px; background: #f1f5f9; border-radius: 8px; font-size: 13px;">
|
|
<strong>Связи:</strong>
|
|
User 1→N Recording → 1→1 Transcription → 1→N Protocol → 1→N ExportFile<br>
|
|
PromptTemplate 1→N Protocol
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="section" style="margin-top: 24px;">
|
|
<h3>Управление хранилищем</h3>
|
|
<div style="background: #fefce8; border: 1px solid #fde047; border-radius: 8px; padding: 16px; font-size: 14px;">
|
|
<ul style="line-height: 1.8; margin: 0;">
|
|
<li><strong>Retention policies</strong> — настраиваемый срок хранения для записей, транскрипций и экспортов (по умолчанию: 90 дней)</li>
|
|
<li><strong>Ручная очистка</strong> — админ может удалить старые данные из UI (записи + связанные файлы)</li>
|
|
<li><strong>Автоочистка</strong> — Celery beat задача по расписанию удаляет данные старше retention period</li>
|
|
<li><strong>Дашборд хранилища</strong> — в админке видно занятое место (файлы + БД) с разбивкой по типам</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|