This commit is contained in:
@@ -59,63 +59,6 @@
|
|||||||
</MudPaper>
|
</MudPaper>
|
||||||
</MudContainer>
|
</MudContainer>
|
||||||
|
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
const form = document.getElementById('admin-login-form');
|
|
||||||
if (!form || form.dataset.bound === '1') return;
|
|
||||||
form.dataset.bound = '1';
|
|
||||||
form.addEventListener('submit', async function (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
const username = form.querySelector('input[placeholder="사용자명"]')?.value?.trim() || '';
|
|
||||||
const password = form.querySelector('input[placeholder="비밀번호"]')?.value || '';
|
|
||||||
const rememberMe = form.querySelector('input[type="checkbox"]')?.checked || false;
|
|
||||||
const errorBox = form.parentElement.querySelector('.mud-alert');
|
|
||||||
const submitButton = form.querySelector('button[type="submit"]');
|
|
||||||
|
|
||||||
if (submitButton) submitButton.disabled = true;
|
|
||||||
if (errorBox) errorBox.remove();
|
|
||||||
|
|
||||||
try {
|
|
||||||
const response = await fetch('/taxbaik/api/auth/login', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({ username, password })
|
|
||||||
});
|
|
||||||
|
|
||||||
if (!response.ok) {
|
|
||||||
throw new Error('login failed');
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await response.json();
|
|
||||||
if (!data?.accessToken || !data?.refreshToken) {
|
|
||||||
throw new Error('invalid response');
|
|
||||||
}
|
|
||||||
|
|
||||||
localStorage.setItem('accessToken', data.accessToken);
|
|
||||||
localStorage.setItem('refreshToken', data.refreshToken);
|
|
||||||
localStorage.setItem('tokenExpiry', String(Date.now() + (data.expiresIn || 3600) * 1000));
|
|
||||||
if (rememberMe) {
|
|
||||||
localStorage.setItem('admin-remembered-username', username);
|
|
||||||
} else {
|
|
||||||
localStorage.removeItem('admin-remembered-username');
|
|
||||||
}
|
|
||||||
|
|
||||||
window.location.href = '/taxbaik/admin/dashboard';
|
|
||||||
} catch {
|
|
||||||
const existing = form.parentElement.querySelector('.login-error-message');
|
|
||||||
if (existing) existing.remove();
|
|
||||||
const div = document.createElement('div');
|
|
||||||
div.className = 'mud-alert mud-alert-filled-error login-error-message mb-4';
|
|
||||||
div.textContent = '로그인 중 오류가 발생했습니다.';
|
|
||||||
form.parentElement.insertBefore(div, form);
|
|
||||||
} finally {
|
|
||||||
if (submitButton) submitButton.disabled = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private bool isLoading = false;
|
private bool isLoading = false;
|
||||||
private string errorMessage = "";
|
private string errorMessage = "";
|
||||||
|
|||||||
@@ -101,6 +101,61 @@ window.taxbaikAdminSession = {
|
|||||||
|
|
||||||
new MutationObserver(reloadOnRejectedCircuit)
|
new MutationObserver(reloadOnRejectedCircuit)
|
||||||
.observe(modal, { attributes: true, attributeFilter: ['class'] });
|
.observe(modal, { attributes: true, attributeFilter: ['class'] });
|
||||||
|
},
|
||||||
|
|
||||||
|
bindLoginForm: function () {
|
||||||
|
const form = document.getElementById('admin-login-form');
|
||||||
|
if (!form || form.dataset.bound === '1') return;
|
||||||
|
|
||||||
|
form.dataset.bound = '1';
|
||||||
|
form.addEventListener('submit', async function (event) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
const username = form.querySelector('input[placeholder="사용자명"]')?.value?.trim() || '';
|
||||||
|
const password = form.querySelector('input[placeholder="비밀번호"]')?.value || '';
|
||||||
|
const rememberMe = form.querySelector('input[type="checkbox"]')?.checked || false;
|
||||||
|
const existing = form.parentElement.querySelector('.login-error-message');
|
||||||
|
const submitButton = form.querySelector('button[type="submit"]');
|
||||||
|
|
||||||
|
if (existing) existing.remove();
|
||||||
|
if (submitButton) submitButton.disabled = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch('/taxbaik/api/auth/login', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ username, password })
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error('login failed');
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
if (!data?.accessToken || !data?.refreshToken) {
|
||||||
|
throw new Error('invalid response');
|
||||||
|
}
|
||||||
|
|
||||||
|
localStorage.setItem('accessToken', data.accessToken);
|
||||||
|
localStorage.setItem('refreshToken', data.refreshToken);
|
||||||
|
localStorage.setItem('tokenExpiry', String(Date.now() + (data.expiresIn || 3600) * 1000));
|
||||||
|
|
||||||
|
if (rememberMe) {
|
||||||
|
localStorage.setItem('admin-remembered-username', username);
|
||||||
|
} else {
|
||||||
|
localStorage.removeItem('admin-remembered-username');
|
||||||
|
}
|
||||||
|
|
||||||
|
window.location.href = '/taxbaik/admin/dashboard';
|
||||||
|
} catch {
|
||||||
|
const error = document.createElement('div');
|
||||||
|
error.className = 'mud-alert mud-alert-filled-error login-error-message mb-4';
|
||||||
|
error.textContent = '로그인 중 오류가 발생했습니다.';
|
||||||
|
form.parentElement.insertBefore(error, form);
|
||||||
|
} finally {
|
||||||
|
if (submitButton) submitButton.disabled = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user