|
|
<!DOCTYPE html> |
|
|
<html lang="fa" dir="rtl"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>ورود به پلتفرم آموزشی - RewardApp</title> |
|
|
<meta name="description" content="ورود به پلتفرم آموزش توسعه وب"> |
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="css/style.css"> |
|
|
<link rel="stylesheet" href="css/auth.css"> |
|
|
<link rel="stylesheet" href="css/responsive.css"> |
|
|
|
|
|
<style> |
|
|
.auth-container { |
|
|
min-height: 100vh; |
|
|
display: flex; |
|
|
align-items: center; |
|
|
justify-content: center; |
|
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
|
|
padding: 20px; |
|
|
} |
|
|
|
|
|
.auth-card { |
|
|
background: white; |
|
|
border-radius: 20px; |
|
|
padding: 40px; |
|
|
box-shadow: 0 20px 60px rgba(0,0,0,0.1); |
|
|
width: 100%; |
|
|
max-width: 400px; |
|
|
} |
|
|
|
|
|
.auth-logo { |
|
|
text-align: center; |
|
|
margin-bottom: 30px; |
|
|
} |
|
|
|
|
|
.auth-logo h1 { |
|
|
color: #4a5568; |
|
|
margin-bottom: 10px; |
|
|
font-size: 24px; |
|
|
} |
|
|
|
|
|
.auth-logo p { |
|
|
color: #718096; |
|
|
font-size: 14px; |
|
|
} |
|
|
|
|
|
.auth-form .form-group { |
|
|
margin-bottom: 20px; |
|
|
} |
|
|
|
|
|
.auth-form label { |
|
|
display: block; |
|
|
margin-bottom: 8px; |
|
|
color: #4a5568; |
|
|
font-weight: 600; |
|
|
} |
|
|
|
|
|
.auth-form input { |
|
|
width: 100%; |
|
|
padding: 12px 16px; |
|
|
border: 2px solid #e2e8f0; |
|
|
border-radius: 10px; |
|
|
font-size: 16px; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.auth-form input:focus { |
|
|
outline: none; |
|
|
border-color: #667eea; |
|
|
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1); |
|
|
} |
|
|
|
|
|
.btn-auth { |
|
|
width: 100%; |
|
|
padding: 12px; |
|
|
background: #667eea; |
|
|
color: white; |
|
|
border: none; |
|
|
border-radius: 10px; |
|
|
font-size: 16px; |
|
|
font-weight: 600; |
|
|
cursor: pointer; |
|
|
transition: all 0.3s ease; |
|
|
} |
|
|
|
|
|
.btn-auth:hover { |
|
|
background: #5a67d8; |
|
|
transform: translateY(-2px); |
|
|
box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3); |
|
|
} |
|
|
|
|
|
.auth-links { |
|
|
text-align: center; |
|
|
margin-top: 20px; |
|
|
padding-top: 20px; |
|
|
border-top: 1px solid #e2e8f0; |
|
|
} |
|
|
|
|
|
.auth-links a { |
|
|
color: #667eea; |
|
|
text-decoration: none; |
|
|
margin: 0 10px; |
|
|
transition: color 0.3s ease; |
|
|
} |
|
|
|
|
|
.auth-links a:hover { |
|
|
color: #5a67d8; |
|
|
text-decoration: underline; |
|
|
} |
|
|
|
|
|
.error-message { |
|
|
background: #fed7d7; |
|
|
color: #742a2a; |
|
|
padding: 10px; |
|
|
border-radius: 8px; |
|
|
margin-bottom: 20px; |
|
|
text-align: center; |
|
|
display: none; |
|
|
} |
|
|
|
|
|
.success-message { |
|
|
background: #c6f6d5; |
|
|
color: #22543d; |
|
|
padding: 10px; |
|
|
border-radius: 8px; |
|
|
margin-bottom: 20px; |
|
|
text-align: center; |
|
|
display: none; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div class="auth-container"> |
|
|
<div class="auth-card"> |
|
|
<div class="auth-logo"> |
|
|
<h1>🎓 RewardApp</h1> |
|
|
<p>پلتفرم آموزش توسعه وب</p> |
|
|
</div> |
|
|
|
|
|
<div id="errorMessage" class="error-message"></div> |
|
|
<div id="successMessage" class="success-message"></div> |
|
|
|
|
|
<form id="loginForm" class="auth-form"> |
|
|
<div class="form-group"> |
|
|
<label for="username">نام کاربری</label> |
|
|
<input |
|
|
type="text" |
|
|
id="username" |
|
|
name="username" |
|
|
placeholder="نام کاربری خود را وارد کنید" |
|
|
required |
|
|
> |
|
|
</div> |
|
|
|
|
|
<div class="form-group"> |
|
|
<label for="password">رمز عبور</label> |
|
|
<input |
|
|
type="password" |
|
|
id="password" |
|
|
name="password" |
|
|
placeholder="رمز عبور خود را وارد کنید" |
|
|
required |
|
|
> |
|
|
</div> |
|
|
|
|
|
<button type="submit" class="btn-auth">ورود به سیستم</button> |
|
|
</form> |
|
|
|
|
|
<div class="auth-links"> |
|
|
<a href="register.html">حساب کاربری ندارید؟ ثبت نام</a> |
|
|
<br> |
|
|
<a href="index.html">بازگشت به صفحه اصلی</a> |
|
|
</div> |
|
|
|
|
|
<div class="demo-accounts" style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #e2e8f0;"> |
|
|
<h3 style="text-align: center; color: #718096; font-size: 14px; margin-bottom: 15px;">حسابهای دمو:</h3> |
|
|
<div style="display: grid; gap: 10px; font-size: 12px;"> |
|
|
<div style="display: flex; justify-content: space-between;"> |
|
|
<span>دانشجو:</span> |
|
|
<span><strong>student</strong> / <strong>password123</strong></span> |
|
|
</div> |
|
|
<div style="display: flex; justify-content: space-between;"> |
|
|
<span>مدیر:</span> |
|
|
<span><strong>admin</strong> / <strong>admin123</strong></span> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
|
|
|
<script src="js/auth/authentication.js"></script> |
|
|
<script src="js/auth/authorization.js"></script> |
|
|
<script src="js/auth/user_management.js"></script> |
|
|
<script src="js/middleware/validation_middleware.js"></script> |
|
|
|
|
|
<script> |
|
|
class LoginPage { |
|
|
constructor() { |
|
|
this.init(); |
|
|
} |
|
|
|
|
|
init() { |
|
|
this.setupEventListeners(); |
|
|
this.checkExistingAuth(); |
|
|
} |
|
|
|
|
|
setupEventListeners() { |
|
|
const loginForm = document.getElementById('loginForm'); |
|
|
if (loginForm) { |
|
|
loginForm.addEventListener('submit', (e) => { |
|
|
e.preventDefault(); |
|
|
this.handleLogin(); |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
document.addEventListener('click', () => { |
|
|
this.hideMessages(); |
|
|
}); |
|
|
} |
|
|
|
|
|
checkExistingAuth() { |
|
|
if (authManager.isAuthenticated()) { |
|
|
this.showMessage('شما قبلاً وارد شدهاید. در حال انتقال...', 'success'); |
|
|
setTimeout(() => { |
|
|
window.location.href = 'index.html'; |
|
|
}, 2000); |
|
|
} |
|
|
} |
|
|
|
|
|
async handleLogin() { |
|
|
const formData = new FormData(document.getElementById('loginForm')); |
|
|
const data = { |
|
|
username: formData.get('username').trim(), |
|
|
password: formData.get('password') |
|
|
}; |
|
|
|
|
|
|
|
|
const validation = ValidationMiddleware.validateLoginData(data); |
|
|
if (!validation.isValid) { |
|
|
this.showMessage(validation.errors.join(' • '), 'error'); |
|
|
return; |
|
|
} |
|
|
|
|
|
|
|
|
const result = authManager.loginUser(data.username, data.password); |
|
|
|
|
|
if (result.success) { |
|
|
this.showMessage('ورود موفقیتآمیز! در حال انتقال...', 'success'); |
|
|
|
|
|
|
|
|
authManager.setToken(result.token); |
|
|
authManager.setCurrentUser(result.user); |
|
|
|
|
|
setTimeout(() => { |
|
|
window.location.href = 'index.html'; |
|
|
}, 1500); |
|
|
} else { |
|
|
this.showMessage(result.message || 'خطا در ورود به سیستم', 'error'); |
|
|
} |
|
|
} |
|
|
|
|
|
showMessage(message, type = 'error') { |
|
|
const errorElement = document.getElementById('errorMessage'); |
|
|
const successElement = document.getElementById('successMessage'); |
|
|
|
|
|
if (type === 'error') { |
|
|
errorElement.textContent = message; |
|
|
errorElement.style.display = 'block'; |
|
|
successElement.style.display = 'none'; |
|
|
} else { |
|
|
successElement.textContent = message; |
|
|
successElement.style.display = 'block'; |
|
|
errorElement.style.display = 'none'; |
|
|
} |
|
|
|
|
|
|
|
|
setTimeout(() => { |
|
|
this.hideMessages(); |
|
|
}, 5000); |
|
|
} |
|
|
|
|
|
hideMessages() { |
|
|
document.getElementById('errorMessage').style.display = 'none'; |
|
|
document.getElementById('successMessage').style.display = 'none'; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', () => { |
|
|
new LoginPage(); |
|
|
}); |
|
|
|
|
|
|
|
|
window.addEventListener('error', (event) => { |
|
|
console.error('Global error:', event.error); |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |