generated from mirzaev/pot
	разработана аутентификация и регистрация аккаунта
This commit is contained in:
		
							
								
								
									
										410
									
								
								mirzaev/site/account/system/views/pages/entry.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										410
									
								
								mirzaev/site/account/system/views/pages/entry.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,410 @@ | ||||
| {% block css %} | ||||
| <link type="text/css" rel="stylesheet" href="/css/account.css"> | ||||
| <link type="text/css" rel="stylesheet" href="/css/icons/arrow_right.css"> | ||||
| <link type="text/css" rel="stylesheet" href="/css/icons/nametag.css"> | ||||
| <link type="text/css" rel="stylesheet" href="/css/icons/keyhole.css"> | ||||
| <link type="text/css" rel="stylesheet" href="/css/icons/user_add.css"> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block body %} | ||||
| <div class="column"> | ||||
|   <section id="entry" class="panel medium"> | ||||
|     <section class="header unselectable"> | ||||
|       <h1>Идентификация</h1> | ||||
|     </section> | ||||
|     <section class="body"> | ||||
|       <label id="login"> | ||||
|         <i class="nametag"></i> | ||||
|         <input name="login" type="text" placeholder="Входной псевдоним" | ||||
|           value="{{ account.login ?? session.buffer.login ?? cookie.buffer_login }}" | ||||
|           onkeypress="if (event.keyCode === 13) __login()" autofocus> | ||||
|         <button class="accept" onclick="__login()"><i class="arrow right"></i></button> | ||||
|       </label> | ||||
|       <label id="password" class="hidden"> | ||||
|         <i class="keyhole"></i> | ||||
|         <input name="password" type="password" placeholder="Пароль" autocomplete="current-password" | ||||
|           onkeypress="if (event.keyCode === 13) __password()"> | ||||
|         <button class="accept" onclick="__password()"><i class="arrow right"></i></button> | ||||
|       </label> | ||||
|       <label id="invite" class="hidden"> | ||||
|         <i class="user add"></i> | ||||
|         <input name="invite" type="text" placeholder="Ключ приглашения" | ||||
|           onkeypress="if (event.keyCode === 13) __invite()"> | ||||
|         <button class="accept" onclick="__invite()"><i class="arrow right"></i></button> | ||||
|       </label> | ||||
|     </section> | ||||
|   </section> | ||||
|   <section id="errors" class="panel medium animation window hidden" style="--height: 300px"> | ||||
|     <section class="body"> | ||||
|       <dl></dl> | ||||
|     </section> | ||||
|   </section> | ||||
| </div> | ||||
| <section id="mnemonic" class="panel small hidden"> | ||||
|   <section class="header unselectable"> | ||||
|     <h2>Мнемонические</h2> | ||||
|   </section> | ||||
|   <section class="body"> | ||||
|     <ul></ul> | ||||
|   </section> | ||||
| </section> | ||||
| <section id="classic" class="panel small hidden"> | ||||
|   <section class="header unselectable"> | ||||
|     <h2>Классические</h2> | ||||
|   </section> | ||||
|   <section class="body"> | ||||
|     <ul></ul> | ||||
|   </section> | ||||
| </section> | ||||
| <script> | ||||
|   // Инициализация функций в глобальной области видимости | ||||
|   let _login, __login, _password, __password, _invite, __invite, _errors; | ||||
|  | ||||
|   document.addEventListener('damper.initialized', function (e) { | ||||
|     // Инициализирован демпфер | ||||
|  | ||||
|     // Инициализация HTML-элемента с блоком входа в аккаунт | ||||
|     const entry = {wrap: document.getElementById('entry')}; | ||||
|     entry.title = entry.wrap.getElementsByTagName('h1')[0]; | ||||
|  | ||||
|     // Инициализация HTML-элемента с блоком мнемонических паролей | ||||
|     const mnemonic = {wrap: document.getElementById('mnemonic')}; | ||||
|     mnemonic.list = mnemonic.wrap.getElementsByTagName('ul')[0]; | ||||
|  | ||||
|     // Инициализация HTML-элемента с блоком классических паролей | ||||
|     const classic = {wrap: document.getElementById('classic')}; | ||||
|     classic.list = classic.wrap.getElementsByTagName('ul')[0]; | ||||
|  | ||||
|     // Инициализация HTML-элемента с блоком ошибок | ||||
|     const errors = {wrap: document.getElementById('errors')}; | ||||
|     errors.list = errors.wrap.getElementsByTagName('dl')[0]; | ||||
|  | ||||
|     // Инициализация HTML-элементов-оболочек полей ввода | ||||
|     const labels = { | ||||
|       login: {label: document.getElementById('login')}, | ||||
|       password: {label: document.getElementById('password')}, | ||||
|       invite: {label: document.getElementById('invite')} | ||||
|     }; | ||||
|     labels.login.input = labels.login.label.querySelector('input[name=login]'); | ||||
|     labels.password.input = labels.password.label.querySelector('input[name=password]'); | ||||
|     labels.invite.input = labels.invite.label.querySelector('input[name=invite]'); | ||||
|  | ||||
|     /** | ||||
|      * Отправить входной псевдоним на сервер | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     _login = e.detail.damper(async () => { | ||||
|       // Деинициализация индикатора и анимации об ошибке | ||||
|       labels.login.input.classList.remove('error'); | ||||
|  | ||||
|       // Запрос к серверу | ||||
|       const response = await session.login(labels.login.input.value); | ||||
|  | ||||
|       if (_errors(response.errors)) { | ||||
|         // Сгенерированы ошибки | ||||
|  | ||||
|         // Разлокировка поля ввода | ||||
|         labels.login.input.disabled = false;; | ||||
|  | ||||
|         // Инициализация отображения ошибки | ||||
|         labels.login.input.classList.add('error'); | ||||
|  | ||||
|         // Фокусировка на поле ввода | ||||
|         labels.login.input.focus(); | ||||
|       } else { | ||||
|         // Не сгенерированы ошибки (подразумевается их отсутствие) | ||||
|  | ||||
|         if (typeof response.exist === 'boolean') | ||||
|           if (response.exist) { | ||||
|             // Найден аккаунт | ||||
|  | ||||
|             // Инициализация интерфейса аутентификации | ||||
|             entry.title.innerText = 'Аутентификация'; | ||||
|             labels.login.label.classList.add('hidden'); | ||||
|             labels.password.label.classList.remove('hidden'); | ||||
|             labels.password.input.focus(); | ||||
|           } else { | ||||
|             // Не найден аккаунт | ||||
|  | ||||
|             // Инициализация интерфейса регистрации | ||||
|             entry.title.innerText = 'Регистрация'; | ||||
|             labels.login.label.classList.add('hidden'); | ||||
|             labels.invite.label.classList.remove('hidden'); | ||||
|             labels.invite.input.focus(); | ||||
|           } | ||||
|       } | ||||
|     }, 500); | ||||
|  | ||||
|     /** | ||||
|      * Отправить входной псевдоним на сервер с дополнительной подготовкой | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     __login = () => { | ||||
|       // Блокировка поля ввода | ||||
|       labels.login.input.disabled = true; | ||||
|  | ||||
|       // Реинициализация блока ошибок | ||||
|       _errors(); | ||||
|  | ||||
|       // Запуск процесса отправки входного псевдонима | ||||
|       _login(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Отправить пароль на сервер | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     _password = e.detail.damper(async () => { | ||||
|       // Деинициализация индикатора и анимации об ошибке | ||||
|       labels.password.input.classList.remove('error'); | ||||
|  | ||||
|       // Запрос к серверу | ||||
|       const response = await session.password(labels.password.input.value); | ||||
|  | ||||
|       if (_errors(response.errors)) { | ||||
|         // Сгенерированы ошибки | ||||
|  | ||||
|         // Разлокировка поля ввода | ||||
|         labels.password.input.disabled = false; | ||||
|  | ||||
|         // Инициализация отображения ошибки | ||||
|         labels.password.input.classList.add('error'); | ||||
|  | ||||
|         // Фокусировка на поле ввода | ||||
|         labels.password.input.focus(); | ||||
|       } else { | ||||
|         // Не сгенерированы ошибки (подразумевается их отсутствие) | ||||
|  | ||||
|         if (typeof response.verify === 'boolean') | ||||
|           if (response.verify) { | ||||
|             // Пройдена проверка пароля на соответствие требованиям | ||||
|  | ||||
|             if (response.account) { | ||||
|               // Инициализирован аккаунт | ||||
|                | ||||
|                | ||||
|             } | ||||
|           } | ||||
|       } | ||||
|     }, 500); | ||||
|  | ||||
|     /** | ||||
|      * Отправить пароль на сервер с дополнительной подготовкой | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     __password = () => { | ||||
|       // Блокировка поля ввода | ||||
|       labels.password.input.disabled = true; | ||||
|  | ||||
|       // Реинициализация блока ошибок | ||||
|       _errors(); | ||||
|  | ||||
|       // Запуск процесса отправки входного псевдонима | ||||
|       _password(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Отправить код приглашения на сервер | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     _invite = e.detail.damper(async () => { | ||||
|       // Деинициализация индикатора и анимации об ошибке | ||||
|       labels.invite.input.classList.remove('error'); | ||||
|  | ||||
|       // Запрос к серверу | ||||
|       const response = await session.invite(labels.invite.input.value); | ||||
|  | ||||
|       if (_errors(response.errors)) { | ||||
|         // Сгенерированы ошибки | ||||
|  | ||||
|         // Разблокировка поля ввода | ||||
|         labels.invite.input.disabled = false; | ||||
|  | ||||
|         // Инициализация отображения ошибки | ||||
|         labels.invite.input.classList.add('error'); | ||||
|  | ||||
|         // Фокусировка на поле ввода | ||||
|         labels.invite.input.focus(); | ||||
|       } else { | ||||
|         // Не сгенерированы ошибки (подразумевается их отсутствие) | ||||
|  | ||||
|         if (typeof response.exist === 'boolean') | ||||
|           if (response.exist) { | ||||
|             // Найдено приглашение | ||||
|  | ||||
|             // Инициализация интерфейса ввода пароля | ||||
|             labels.invite.label.classList.add('hidden'); | ||||
|             labels.password.input.autocomplete = 'new-password'; | ||||
|             labels.password.label.classList.remove('hidden'); | ||||
|             mnemonic.wrap.classList.remove('hidden'); | ||||
|             classic.wrap.classList.remove('hidden'); | ||||
|  | ||||
|             for (let i = 0; i < 6; i++) { | ||||
|               // Генерация HTML-элементов с примерами мнемонических паролей | ||||
|  | ||||
|               // Инициализация HTML-элемента | ||||
|               const element = document.createElement('li'); | ||||
|  | ||||
|               // Генерация пароля | ||||
|               password.generate(Math.floor(Math.random() * 3) + 2, 'mnemonic') | ||||
|                 .then((responce) => { | ||||
|                   if (responce.password === '') { | ||||
|                     // Не удалось сгенерировать пароль | ||||
|  | ||||
|                     // Перезапуск итерации | ||||
|                     --i; | ||||
|                     return; | ||||
|                   } | ||||
|  | ||||
|                   // Запись пароля | ||||
|                   element.innerText = responce.password; | ||||
|  | ||||
|                   // Запись HTML-элемента с паролем в список | ||||
|                   mnemonic.list.appendChild(element); | ||||
|  | ||||
|                   // Генерация списка с текстом ошибок | ||||
|                   _errors(response.errors); | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             for (let i = 0; i < 8; i++) { | ||||
|               // Генерация HTML-элементов с примерами классических паролей | ||||
|  | ||||
|               // Инициализация HTML-элемента | ||||
|               const element = document.createElement('li'); | ||||
|  | ||||
|               // Генерация пароля | ||||
|               password.generate(Math.floor(Math.random() * 14) + 4) | ||||
|                 .then((responce) => { | ||||
|                   if (responce.password === '') { | ||||
|                     // Не удалось сгенерировать пароль | ||||
|  | ||||
|                     // Перезапуск итерации | ||||
|                     --i; | ||||
|                     return; | ||||
|                   } | ||||
|  | ||||
|                   // Запись пароля | ||||
|                   element.innerText = responce.password; | ||||
|  | ||||
|                   // Запись HTML-элемента с паролем в список | ||||
|                   classic.list.appendChild(element); | ||||
|  | ||||
|                   // Генерация списка с текстом ошибок | ||||
|                   _errors(response.errors); | ||||
|                 }); | ||||
|             } | ||||
|           } | ||||
|       } | ||||
|     }, 500); | ||||
|  | ||||
|     /** | ||||
|      * Отправить код приглашения на сервер с дополнительной подготовкой | ||||
|      * | ||||
|      * @return {void} | ||||
|      */ | ||||
|     __invite = () => { | ||||
|       // Блокировка поля ввода | ||||
|       labels.invite.input.disabled = true; | ||||
|  | ||||
|       // Реинициализация блока ошибок | ||||
|       _errors(); | ||||
|  | ||||
|       // Запуск процесса отправки входного псевдонима | ||||
|       _invite(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сгенерировать HTML-элемент с блоком ошибок | ||||
|      * | ||||
|      * @param {object} registry Реестр ошибок | ||||
|      * @param {bool} reinitialization Реинициализировать? | ||||
|      * | ||||
|      * @return {bool} Сгенерированы ошибки? | ||||
|      */ | ||||
|     _errors = (registry, reinitialization = true) => { | ||||
|       function height() { | ||||
|         // Скрытие HTML-элемента | ||||
|         errors.wrap.style.zIndex = '-99999'; | ||||
|         errors.wrap.style.left = '-99999px'; | ||||
|         errors.wrap.style.top = '-99999px'; | ||||
|         errors.wrap.style.position = 'absolute'; | ||||
|         errors.wrap.style.display = 'var(--display, unset)'; | ||||
|         errors.wrap.style.opacity = '0'; | ||||
|         errors.wrap.style.animationName = 'unset'; | ||||
|  | ||||
|         // Реинициализация переменной с данными о высоте HTML-элемента | ||||
|         errors.wrap.style.setProperty('--height', errors.wrap.offsetHeight + 'px'); | ||||
|  | ||||
|         // Отмена скрытия HTML-элемента | ||||
|         errors.wrap.style.zIndex = | ||||
|           errors.wrap.style.left = | ||||
|           errors.wrap.style.top = | ||||
|           errors.wrap.style.position = | ||||
|           errors.wrap.style.display = | ||||
|           errors.wrap.style.opacity = | ||||
|           errors.wrap.style.animationName = null; | ||||
|       } | ||||
|  | ||||
|       // Удаление ошибок из прошлой генерации | ||||
|       if (reinitialization) errors.list.innerHTML = null; | ||||
|  | ||||
|       for (error in registry) { | ||||
|         // Генерация HTML-элементов с текстами ошибок | ||||
|  | ||||
|         // Инициализация HTML-элемента | ||||
|         const element = document.createElement('dd'); | ||||
|  | ||||
|         if (typeof registry[error] === 'object') { | ||||
|           // Категория ошибок | ||||
|  | ||||
|           // Проверка наличия ошибок | ||||
|           if (registry[error].length === 0) continue; | ||||
|  | ||||
|           // Инициализация HTML-элемента | ||||
|           const element = document.createElement('dt'); | ||||
|  | ||||
|           // Запись текста категории | ||||
|           element.innerText = error; | ||||
|  | ||||
|           // Запись HTML-элемента в список | ||||
|           errors.list.appendChild(element); | ||||
|  | ||||
|           // Реинициализация высоты | ||||
|           height(); | ||||
|  | ||||
|           // Обработка вложенных ошибок (вход в рекурсию) | ||||
|           _errors(registry[error], false); | ||||
|         } else { | ||||
|           // Текст ошибки (подразумевается) | ||||
|  | ||||
|           // Запись текста ошибки | ||||
|           element.innerText = registry[error]; | ||||
|  | ||||
|           // Запись HTML-элемента в список | ||||
|           errors.list.appendChild(element); | ||||
|  | ||||
|           // Реинициализация высоты | ||||
|           height(); | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       // Реинициализация HTML-элемента с текстом ошибок | ||||
|       if (reinitialization && errors.list.childElementCount === 0) errors.wrap.classList.add('hidden'); | ||||
|       else errors.wrap.classList.remove('hidden'); | ||||
|  | ||||
|       return errors.list.childElementCount === 0 ? false : true; | ||||
|     }; | ||||
|   }); | ||||
| </script> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block js %} | ||||
| <script type="text/javascript" src="/js/session.js"></script> | ||||
| <script type="text/javascript" src="/js/password.js"></script> | ||||
| {% endblock %} | ||||
		Reference in New Issue
	
	Block a user