Files
sechenov/public/index.html

433 lines
22 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Авторизация и регистрация</title>
<!-- REAL Sechenov CSS (downloaded + path-rewritten) -->
<link rel="stylesheet" href="/assets/css/bootstrap.min.css">
<link rel="stylesheet" href="/assets/css/proxima.css">
<link rel="stylesheet" href="/assets/css/styles-v1.css">
<link rel="stylesheet" href="/assets/css/template-styles-main.css">
<style>
/* ── Body: plain white (body-line.jpg is for the main page, not auth) ── */
body { background: #fff; }
/* ── Lang selector + bell as simple icons (no BitrixCMS dropdown machinery) ── */
.notifications-button, .lang-selector-button { display: inline-block; margin-left: 2px; }
.notifications-button .btn-secondary,
.lang-selector-button .btn-secondary {
background: #fff; border: 1px solid #e1e1e1; color: #003571;
padding: 6px 10px; border-radius: 4px; cursor: pointer;
vertical-align: middle; display: inline-block; line-height: 1;
}
.notifications-button .btn-secondary:hover,
.lang-selector-button .btn-secondary:hover { background: #f5f5f5; }
.bellicon { font-size: 18px; color: #003571; }
.flag-icon-ru {
display: inline-block; width: 20px; height: 15px;
background: linear-gradient(to bottom, #fff 0%, #fff 33%, #0039a6 33%, #0039a6 66%, #d52b1e 66%, #d52b1e 100%);
vertical-align: middle; border: 1px solid #ddd;
}
/* ── Chat section (white theme, below footer) ── */
.chat-wrapper {
background: #fff;
border-top: 4px solid #003571;
padding: 30px 0 50px;
font-family: proxima_nova_rgregular, Arial, sans-serif;
}
.chat-wrapper .container { background: #fff; padding-top: 0; }
.chat-wrapper h2 {
font-family: proxima_nova_rgbold, Arial, sans-serif;
color: #003571; margin-top: 0;
}
.chat-wrapper .page-header { margin-top: 0; border-bottom: 1px solid #eee; }
.chat-toolbar { display: flex; gap: 12px; align-items: center; margin-bottom: 14px; }
.chat-toolbar label { font-size: 14px; color: #555; margin: 0; font-weight: normal; }
.chat-toolbar select {
border: 1px solid #ccc; border-radius: 4px; padding: 5px 10px;
font-size: 14px; color: #333; background: #fff;
font-family: proxima_nova_rgregular, Arial, sans-serif;
}
#chat-status { margin-left: auto; font-size: 13px; color: #888; }
.chat-panels {
display: flex; border: 1px solid #ddd; border-radius: 2px;
overflow: hidden; height: 380px; background: #fff;
}
.chat-pane { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
.chat-pane + .chat-pane { border-left: 1px solid #ddd; }
.chat-pane-label {
padding: 8px 14px; font-size: 11px; text-transform: uppercase;
letter-spacing: .06em; color: #999;
border-bottom: 1px solid #eee; background: #fafafa;
}
#chat-input {
flex: 1; border: none; padding: 14px;
font-size: 14px; line-height: 1.6; resize: none;
color: #333; background: #fff;
font-family: proxima_nova_rgregular, Arial, sans-serif;
}
#chat-input:focus { outline: none; }
#chat-input::placeholder { color: #bbb; }
#chat-output {
flex: 1; padding: 14px; overflow-y: auto;
font-size: 14px; line-height: 1.7; white-space: pre-wrap;
word-break: break-word; color: #333; background: #fff;
}
#chat-output.empty { color: #bbb; font-style: italic; }
#chat-output code {
background: #f5f5f5; padding: 1px 5px; border-radius: 3px;
font-family: Consolas, monospace; font-size: 13px; color: #c7254e;
}
#chat-output pre {
background: #f5f5f5; border: 1px solid #e0e0e0; border-radius: 4px;
padding: 10px; overflow-x: auto; margin: 6px 0;
}
#chat-output pre code { background: none; padding: 0; color: #333; }
.chat-actions { margin-top: 14px; display: flex; gap: 10px; align-items: center; }
.chat-spinner {
display: none; width: 14px; height: 14px;
border: 2px solid #ddd; border-top-color: #003571;
border-radius: 50%; animation: cspin .7s linear infinite;
}
@keyframes cspin { to { transform: rotate(360deg); } }
#chat-timer { font-size: 12px; color: #aaa; }
/* Slight override to keep well-lg radius 0 like real portal */
.well-lg { border-radius: 0; }
</style>
</head>
<body role="document">
<!-- ══════ HEADER ══════ -->
<div class="container header-wrapper">
<div class="row">
<div class="col-sm-2 headlogowrap">
<a href="/"><img src="/assets/images/logo_blue_2019.png" class="img-responsive" alt="Sechenov"></a>
</div>
<div class="col-md-offset-1 col-md-9 col-sm-10 headtextwrap">
<h2>Информационная система</h2>
<h3>«Университет — обучающийся»</h3>
<form role="search" class="gtloginbutton navbar-form navbar-right noborder gtxinmenu">
<div class="btn-group pull-right" role="group">
<button type="button" class="btn btn-warning">
<span class="glyphicon glyphicon-log-in" aria-hidden="true"></span> Авторизация
</button>
<div class="dropdown notifications-button">
<a class="btn btn-secondary dropdown-toggle" href="javascript:void(0)" aria-haspopup="true" aria-expanded="false">
<i class="glyphicon glyphicon-bell bellicon" aria-hidden="true"></i>
</a>
</div>
<div class="dropdown lang-selector-button">
<a class="btn btn-secondary dropdown-toggle" href="javascript:void(0)" aria-haspopup="true" aria-expanded="false">
<i class="flag-icon flag-icon-squared flag-icon-ru" aria-hidden="true"></i>
</a>
</div>
</div>
<div class="clear"></div>
</form>
</div>
</div>
</div>
<!-- ══════ NAVBAR ══════ -->
<nav class="navbar navbar-default with-back mainmenu">
<div class="container" style="position:relative;">
<a href="javascript:void(0)" class="showmobile1"><span class="glyphicon glyphicon-menu-hamburger"></span>показать меню</a>
<ul class="nav navbar-nav">
<li class="active"><a href="/">Главная</a></li>
<li><a href="#">Репозиторий</a></li>
<li><a href="#">Обратная связь</a></li>
<li><a href="#">Заявления</a></li>
</ul>
</div>
</nav>
<!-- ══════ MAIN ══════ -->
<div class="container theme-showcase" role="main">
<div class="row">
<div class="col-sm-7 col-xs-12">
<div class="page-header">
<h1>Авторизация и регистрация</h1>
</div>
</div>
<div class="col-sm-5 col-xs-12">
<div id="clock" data-time=""><span id="clkDate"></span> <span id="clkTime"></span></div>
</div>
</div>
<p class="alert alert-info">
При наличии каких либо технических проблем, в первую очередь рекомендуем очистить кеш браузера и обновить версию браузера при необходимости.
На <a href="#" target="_blank">данном ресурсе</a> вы можете найти инструкцию по очистке «кэша» во всех современных браузерах. После чего рекомендуем авторизоваться в ЛКО.
</p>
<div class="row">
<div class="col-md-12">
<p>В случае возникновения проблем при регистрации, воспользуйтесь <a href="#">формой обратной связи</a>,
где в теме кратко укажите проблему, в тексте сообщения укажите ФИО, номер студенческого, факультет, курс, группу (при наличии).
<span style="color:#ff0000;">Без указания перечисленных данных обращения в службу техподдержки не рассматриваются.</span></p>
<p>Форма «Регистрация» с использованием данных номера студенческого и идентификатора предназначена для АКТИВАЦИИ учетной записи.
После активации она работать не будет! Форма «Авторизации» предназначена для входа ПОСЛЕ активации учетной записи
с использованием данных электронного адреса и пароля, который был отправлен по электронному адресу, указанному при активации
или внесенному в последствии в Профиль.</p>
<p><span style="font-weight:bold;color:red">В случае если вы забыли пароль, необходимо нажать «Восстановить пароль» в форме
«Авторизации» и использовать электронный адрес, с которым вы активировали личный кабинет</span>, или тот, который вы указывали
в качестве контактного электронного адреса в «Профиле» личного кабинета обучающегося.
Инструкция доступна по ссылке <a href="#">https://student.sechenov.ru/howto.php</a></p>
<p>При возникновении вопросов/проблем с ЦТ необходимо выбирать соответствующий пункт в причинах на форме.
Письма, отправленные не через форму обратной связи с выбором соответствующей причины, а по электронной почте рассматриваться не будут.</p>
<br>
<p><span style="color:#ff0000;">Уважаемые первокурсники! Убедительная просьба не блокировать кампусные карты МИР в личном кабинете Сбербанк Онлайн!</span></p>
</div>
</div>
<div class="row row--forms">
<!-- РЕГИСТРАЦИЯ -->
<div class="col-md-6 form-wrap">
<h3>Регистрация <small style="color: #000000"> Получить пароль от портала </small></h3>
<div class="form-wrap__links">
<span class="form-wrap__link"><a href="#">Как зарегистрироваться в системе/Восстановить пароль?</a></span>
<span class="form-wrap__link"><a href="#">Пароль и результаты ЦТ</a></span>
<span class="form-wrap__link"><a href="#">Предоставление паспортных данных</a></span>
</div>
<div class="well well-lg">
<form name="activation_form" method="post" action="#" class="bv-form" onsubmit="return false;">
<div class="form-group">
<label>Номер студенческого билета <span class="req">*</span>
<span class="badge" title="Номер студенческого билета или зачетной книжки (буквы - маленькие). 12 цифр!">?</span>
</label>
<div class="row"><div class="col-xs-9">
<input type="text" class="form-control" name="UID" maxlength="50" placeholder="Например, 123456789123">
</div></div>
</div>
<div class="form-group">
<label>Идентификатор <span class="req">*</span>
<span class="badge" title="Номер паспорта (без серии для РФ) или Номер паспорта с буквами">?</span>
</label>
<div class="row"><div class="col-xs-9">
<input type="password" class="form-control" name="ID" maxlength="50" placeholder="Например, 1122345678">
</div></div>
</div>
<div class="checkbox">
<label>
<input type="checkbox" class="agreement_checkbox"> Даю согласие на передачу и обработку персональных данных
</label>
</div>
<button type="submit" class="btn btn-primary btn-block disabled" disabled>Получить пароль</button>
</form>
</div>
</div>
<!-- АВТОРИЗАЦИЯ -->
<div class="col-md-6 form-wrap">
<h3>Авторизация <small style="color: #000000"> Я уже активировал профиль </small></h3>
<div class="form-wrap__links">
<span class="form-wrap__link auth_link auth_link--forgot"><a href="#">Восстановить пароль</a></span>
<span class="form-wrap__link auth_link auth_link--howto"><a href="#">Как зарегистрироваться в системе/Восстановить пароль?</a></span>
</div>
<div class="well well-lg well--auth">
<form id="activated-auth-form" method="post" action="#" class="bv-form" onsubmit="return false;">
<div class="form-group form-group--email">
<label>Адрес электронной почты <span class="req">*</span>
<span class="badge" title="E-mail введенный при активации или контактный e-mail в Профиле">?</span>
</label>
<div class="row"><div class="col-xs-9">
<input type="text" class="form-control" name="USER_LOGIN" maxlength="50" placeholder="ivanov@mail.ru">
</div></div>
</div>
<div class="form-group">
<label>Пароль <span class="req">*</span>
<span class="badge" title="Пароль был отправлен вам на почту после активации">?</span>
</label>
<div class="row"><div class="col-xs-9">
<input type="password" class="form-control" name="USER_PASSWORD" maxlength="50" placeholder="******">
</div></div>
</div>
<div class="checkbox">
<label>
<input type="checkbox" class="agreement_checkbox"> Даю согласие на передачу и обработку персональных данных
</label>
</div>
<button type="submit" class="btn btn-warning btn-block disabled" disabled>Авторизация</button>
</form>
</div>
</div>
</div>
</div>
<!-- ══════ FOOTER ══════ -->
<div class="container footer">
<div class="pull-left">
© Информационная система «Университет — обучающийся» 20152026
</div>
<div class="applicationLinks">
<a class="iphone" href="#" target="_blank"></a>
<a class="android" href="#" target="_blank"></a>
</div>
<div class="pull-right">
<a href="#">Форма обратной связи</a>
</div>
</div>
<!-- ══════ CLAUDE CHAT (белая тема) ══════ -->
<div class="chat-wrapper">
<div class="container">
<div class="page-header">
<h2>Claude Chat</h2>
</div>
<div class="chat-toolbar">
<label for="modelSel">Модель:</label>
<select id="modelSel">
<option value="sonnet">Sonnet 4.6</option>
<option value="haiku">Haiku 4.5</option>
</select>
<span id="chat-status"></span>
</div>
<div class="chat-panels">
<div class="chat-pane">
<div class="chat-pane-label">Запрос</div>
<textarea id="chat-input" placeholder="Вставьте текст сюда... (Ctrl+Enter — отправить)"></textarea>
</div>
<div class="chat-pane">
<div class="chat-pane-label">Ответ</div>
<div id="chat-output" class="empty">Ответ появится здесь...</div>
</div>
</div>
<div class="chat-actions">
<button id="sendBtn" class="btn btn-primary">Отправить</button>
<button id="clearBtn" class="btn btn-default">Очистить</button>
<div class="chat-spinner" id="spinner"></div>
<span id="chat-timer"></span>
</div>
</div>
</div>
<script>
/* ── LIVE CLOCK ── */
function pad(n){ return String(n).padStart(2,'0'); }
function tick() {
const n = new Date();
document.getElementById('clkDate').textContent =
`${pad(n.getDate())}.${pad(n.getMonth()+1)}.${n.getFullYear()}`;
document.getElementById('clkTime').textContent =
`${pad(n.getHours())}:${pad(n.getMinutes())}:${pad(n.getSeconds())}`;
}
tick();
setInterval(tick, 1000);
/* ── Checkbox → enables submit ── */
document.querySelectorAll('.agreement_checkbox').forEach(cb => {
cb.addEventListener('change', function() {
const btn = this.closest('.well').querySelector('button[type=submit]');
if (this.checked) { btn.classList.remove('disabled'); btn.removeAttribute('disabled'); }
else { btn.classList.add('disabled'); btn.setAttribute('disabled','disabled'); }
});
});
/* ── CHAT CLIENT ── */
const inputEl = document.getElementById('chat-input');
const outputEl = document.getElementById('chat-output');
const sendBtn = document.getElementById('sendBtn');
const clearBtn = document.getElementById('clearBtn');
const modelSel = document.getElementById('modelSel');
const statusEl = document.getElementById('chat-status');
const spinnerEl= document.getElementById('spinner');
const timerEl = document.getElementById('chat-timer');
let timerInterval = null;
function setLoading(on) {
sendBtn.disabled = on;
spinnerEl.style.display = on ? 'inline-block' : 'none';
if (on) {
const start = Date.now();
timerInterval = setInterval(() => {
timerEl.textContent = ((Date.now()-start)/1000).toFixed(1)+'s';
}, 100);
} else clearInterval(timerInterval);
}
function renderMarkdown(text) {
let html = text.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
html = html.replace(/```[\w]*\n?([\s\S]*?)```/g, (_,c) => `<pre><code>${c.trim()}</code></pre>`);
html = html.replace(/`([^`]+)`/g, '<code>$1</code>');
html = html.replace(/\*\*([^*]+)\*\*/g, '<strong>$1</strong>');
return html;
}
async function send() {
const text = inputEl.value.trim();
if (!text) return;
outputEl.className = '';
outputEl.innerHTML = '';
setLoading(true);
statusEl.textContent = 'Генерирую...';
let fullText = '';
try {
const resp = await fetch('/api/chat', {
method: 'POST',
headers: {'Content-Type':'application/json'},
body: JSON.stringify({text, model: modelSel.value}),
});
const reader = resp.body.getReader();
const decoder = new TextDecoder();
let buf = '';
while (true) {
const {done, value} = await reader.read();
if (done) break;
buf += decoder.decode(value, {stream:true});
const parts = buf.split('\n\n');
buf = parts.pop();
for (const part of parts) {
if (!part.startsWith('data: ')) continue;
const raw = part.slice(6).trim();
if (raw === '[DONE]') continue;
try {
const obj = JSON.parse(raw);
if (obj.error) {
outputEl.innerHTML += `<span style="color:#a94442">${obj.error}</span>`;
} else if (obj.text) {
fullText += obj.text;
outputEl.innerHTML = renderMarkdown(fullText);
outputEl.scrollTop = outputEl.scrollHeight;
}
} catch(e) {}
}
}
} catch(e) {
outputEl.innerHTML = `<span style="color:#a94442">Ошибка: ${e.message}</span>`;
} finally {
setLoading(false);
statusEl.textContent = fullText ? `${fullText.length} символов` : '';
}
}
sendBtn.addEventListener('click', send);
inputEl.addEventListener('keydown', e => { if (e.ctrlKey && e.key==='Enter') send(); });
clearBtn.addEventListener('click', () => {
inputEl.value = '';
outputEl.innerHTML = 'Ответ появится здесь...';
outputEl.className = 'empty';
statusEl.textContent = '';
timerEl.textContent = '';
});
</script>
</body>
</html>