feat: ? справка — модальное окно с описанием сервиса (v1.4)
Deploy contracts-flask / validate (push) Successful in 0s
Deploy contracts-flask / validate (push) Successful in 0s
This commit is contained in:
@@ -54,6 +54,26 @@
|
||||
.btn-primary { background: var(--brand); color: #fff; border-color: var(--brand); width: 100%; margin-top: 8px; }
|
||||
.btn-primary:hover { background: var(--brand-dark); }
|
||||
.btn-primary:disabled { opacity: .5; cursor: not-allowed; }
|
||||
|
||||
/* ── Модальное окно ──────────────────────────────── */
|
||||
.modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,.4); z-index: 1000; justify-content: center; align-items: flex-start; padding-top: 60px; }
|
||||
.modal-overlay.show { display: flex; }
|
||||
.modal { background: var(--card); border-radius: 12px; max-width: 600px; width: 90%; max-height: 80vh; overflow-y: auto; box-shadow: 0 8px 32px rgba(0,0,0,.15); }
|
||||
.modal-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--border); }
|
||||
.modal-header h2 { font-size: 16px; }
|
||||
.modal-close { cursor: pointer; font-size: 20px; color: var(--muted); background: none; border: none; line-height: 1; }
|
||||
.modal-close:hover { color: var(--fg); }
|
||||
.modal-body { padding: 20px; font-size: 13px; line-height: 1.7; color: var(--fg); }
|
||||
.modal-body h3 { font-size: 14px; margin: 16px 0 6px; }
|
||||
.modal-body h3:first-child { margin-top: 0; }
|
||||
.modal-body ul { margin: 4px 0 12px 20px; }
|
||||
.modal-body li { margin-bottom: 4px; }
|
||||
.modal-body .warn { background: #fef9e7; border-left: 3px solid #f59e0b; padding: 8px 12px; border-radius: 0 6px 6px 0; margin: 8px 0; font-size: 12px; }
|
||||
.modal-body code { background: var(--grey-light); padding: 1px 4px; border-radius: 3px; font-size: 12px; }
|
||||
|
||||
/* ── Кнопка ? в шапке ───────────────────────────── */
|
||||
.header .help-btn { margin-left: auto; width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--border); background: var(--card); cursor: pointer; font-size: 15px; font-weight: 600; color: var(--muted); display: flex; align-items: center; justify-content: center; transition: all .15s; }
|
||||
.header .help-btn:hover { border-color: var(--brand); color: var(--brand); background: #eff6ff; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
@@ -64,9 +84,80 @@
|
||||
<a href="/">Сверка договоров</a>
|
||||
<span class="sep">|</span>
|
||||
<strong>DrHider</strong>
|
||||
<span style="font-size:11px;color:var(--muted);">v1.3</span>
|
||||
<span style="font-size:11px;color:var(--muted);">v1.4</span>
|
||||
<button class="help-btn" onclick="openModal()" title="О сервисе">?</button>
|
||||
</header>
|
||||
|
||||
<!-- Модальное окно -->
|
||||
<div class="modal-overlay" id="modalOverlay" onclick="if(event.target===this)closeModal()">
|
||||
<div class="modal">
|
||||
<div class="modal-header">
|
||||
<h2>🛡️ DrHider — справка</h2>
|
||||
<button class="modal-close" onclick="closeModal()">✕</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<h3>📌 Что делает</h3>
|
||||
<p>Обезличивает документы перед загрузкой в сервис сверки договоров. Заменяет персональные данные, реквизиты компаний, телефоны, email и другие чувствительные данные на фиктивные, но реалистичные значения. <strong>Одна и та же сущность во всех файлах заменяется одинаково</strong> — можно сопоставлять документы между собой.</p>
|
||||
|
||||
<h3>⚙️ Как работает</h3>
|
||||
<ul>
|
||||
<li><strong>Два прохода:</strong> сначала сбор всех сущностей из всех файлов → построение единого словаря замен → применение замен.</li>
|
||||
<li><strong>Всё в памяти:</strong> файлы не записываются на диск и не сохраняются в базе. После обработки данные удаляются.</li>
|
||||
<li><strong>mapping.csv</strong> — внутри ZIP лежит таблица «тип → оригинал → замена» для аудита.</li>
|
||||
</ul>
|
||||
|
||||
<h3>✅ Что распознаётся и заменяется</h3>
|
||||
<ul>
|
||||
<li>📞 Телефоны (+7, 8-800, ...)</li>
|
||||
<li>📧 Email-адреса</li>
|
||||
<li>🏢 Компании: ООО, ЗАО, АО, ПАО, ИП, ТОО (включая юникод-кавычки «» и "")</li>
|
||||
<li>👤 ФИО (кириллица): Иванов А.П., Петрова Мария Сергеевна</li>
|
||||
<li>🔢 Реквизиты: ИНН (10/12), ОГРН, КПП, БИК</li>
|
||||
<li>💳 Банковские счета: р/с, кор/сч, корреспондентский счёт</li>
|
||||
<li>📄 Паспортные данные: серия + номер</li>
|
||||
</ul>
|
||||
|
||||
<h3>🧠 LLM-NER (нейросеть)</h3>
|
||||
<p>Для поиска имён, названий компаний и адресов, которые не попадают под регулярные выражения, используется языковая модель. Работает не мгновенно — для больших документов добавляет 5–30 секунд.</p>
|
||||
|
||||
<h3>✅ Форматы файлов</h3>
|
||||
<ul>
|
||||
<li><strong>.docx</strong> — полная замена с сохранением структуры документа. ⚠️ Форматирование (жирный, курсив) заменённых фрагментов может сброситься.</li>
|
||||
<li><strong>.pdf</strong> — текст извлекается и обфусцируется. Результат: <code>.txt</code>. Форматирование, таблицы и графика не сохраняются.</li>
|
||||
<li><strong>.doc</strong> — бинарный формат, <strong>не обфусцируется</strong>. Файл возвращается как есть. Конвертируйте в .docx перед загрузкой.</li>
|
||||
<li><strong>.zip</strong> — автоматически распаковывается, все файлы внутри обрабатываются.</li>
|
||||
</ul>
|
||||
|
||||
<h3>⚠️ Ограничения и возможные ошибки</h3>
|
||||
<div class="warn">
|
||||
<strong>Ложные пропуски:</strong> сущность может быть не найдена, если она записана в нестандартном формате (например, телефон через точку: <code>+7.495.123.44.55</code>).
|
||||
</div>
|
||||
<div class="warn">
|
||||
<strong>Ложные срабатывания:</strong> короткие слова (например, фамилия «Иванов») могут быть заменены внутри更长ших слов («Ивановский» → ...ский). Минимизировано, но не исключено полностью.
|
||||
</div>
|
||||
<div class="warn">
|
||||
<strong>.doc не обрабатывается:</strong> старые Word-файлы возвращаются без изменений.
|
||||
</div>
|
||||
<div class="warn">
|
||||
<strong>PDF → текст:</strong> таблицы, графика и форматирование теряются.
|
||||
</div>
|
||||
<div class="warn">
|
||||
<strong>Сканы/изображения:</strong> текст на картинках не распознаётся (нет OCR).
|
||||
</div>
|
||||
|
||||
<h3>🔒 Приватность</h3>
|
||||
<ul>
|
||||
<li>Файлы не покидают сервер Nubes.</li>
|
||||
<li>Ничего не записывается в базу данных.</li>
|
||||
<li>После отправки ZIP-архива все данные в памяти удаляются.</li>
|
||||
</ul>
|
||||
|
||||
<h3>📊 mapping.csv</h3>
|
||||
<p>В выходном ZIP всегда есть файл <code>mapping.csv</code> с колонками: <code>тип_данных, оригинал, замена</code>. Позволяет при необходимости восстановить исходные значения (храните этот файл отдельно и безопасно).</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<main>
|
||||
<h1>🛡️ DrHider — обфускация документов</h1>
|
||||
<p class="sub">Загрузите документы — получите ZIP с обезличенными копиями и таблицей соответствия. Без сохранения на сервере.</p>
|
||||
@@ -153,6 +244,11 @@ BTN.onclick = () => {
|
||||
function setStatus(c,m) { STATUS.className = 'show '+c; STATUS.textContent = m; }
|
||||
function esc(s) { return s.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); }
|
||||
function fmt(n) { return n>1e6 ? (n/1e6).toFixed(1)+' MB' : n>1e3 ? (n/1e3).toFixed(0)+' KB' : n+' B'; }
|
||||
|
||||
// ── Модальное окно ─────────────────────────────────────────────
|
||||
function openModal() { document.getElementById('modalOverlay').classList.add('show'); }
|
||||
function closeModal() { document.getElementById('modalOverlay').classList.remove('show'); }
|
||||
document.addEventListener('keydown', e => { if (e.key === 'Escape') closeModal(); });
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user