6 changed files with 548 additions and 132 deletions
-
129src/main/java/com/gcc_manpower/gccservicedocuments/controller/GccServiceDocumentsController.java
-
114src/main/java/com/gcc_manpower/gccservicedocuments/service/GccServiceDocumentsService.java
-
4src/main/resources/application.properties
-
115src/main/resources/templates/gccservicedocuments/login.html
-
203src/main/resources/templates/gccservicedocuments/upload.html
-
115src/main/resources/templates/gccservicedocuments/view.html
@ -1,5 +1,5 @@ |
|||||
spring.profiles.active=local |
|
||||
#spring.profiles.active=prod |
|
||||
|
#spring.profiles.active=local |
||||
|
spring.profiles.active=prod |
||||
spring.application.name=gcc-manpower |
spring.application.name=gcc-manpower |
||||
server.servlet.session.timeout=10m |
server.servlet.session.timeout=10m |
||||
|
|
||||
@ -0,0 +1,115 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html xmlns:th="http://www.thymeleaf.org" lang="en"> |
||||
|
|
||||
|
<head> |
||||
|
<meta charset="UTF-8"> |
||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
|
<title>GCC Service Documents - Login</title> |
||||
|
|
||||
|
<!-- CSRF Tokens --> |
||||
|
<meta th:if="${_csrf != null}" name="_csrf" th:content="${_csrf.token}" /> |
||||
|
<meta th:if="${_csrf != null}" name="_csrf_header" th:content="${_csrf.headerName}" /> |
||||
|
|
||||
|
<!-- Include CSS --> |
||||
|
<link rel="stylesheet" type="text/css" th:href="@{/assets/css/login-form-styles.css}"> |
||||
|
|
||||
|
<!-- Awesome Font --> |
||||
|
<link th:href="@{/assets/font-awesome-6.5.2/css/all.min.css}" rel="stylesheet" type="text/css"> |
||||
|
</head> |
||||
|
|
||||
|
<body> |
||||
|
<div class="container"> |
||||
|
<img th:src="@{/assets/header-images/gcc1.png}" alt="Greater Chennai Corporation" class="small-logo"> |
||||
|
<h3>GREATER CHENNAI CORPORATION</h3> |
||||
|
<h4>பெருநகர சென்னை மாநகராட்சி</h4> |
||||
|
<br> |
||||
|
<h3>GCC Training Services Documents</h3> |
||||
|
<br> |
||||
|
<h2>Login</h2> |
||||
|
|
||||
|
<div id="error-box" |
||||
|
style="color: #c0392b; font-weight: 500; font-size: 0.85rem; margin-bottom: 1.5rem; text-align: center; display: none;"> |
||||
|
<i class="fa-solid fa-circle-exclamation"></i> <span id="error-text">Invalid username or password!</span> |
||||
|
</div> |
||||
|
|
||||
|
<form id="loginForm" onsubmit="handleLogin(event)"> |
||||
|
<div class="input-field"> |
||||
|
<input type="text" name="usrName" id="usrName" placeholder="Enter Username" required |
||||
|
autocomplete="username"> |
||||
|
<div class="underline"></div> |
||||
|
</div> |
||||
|
<div class="input-field"> |
||||
|
<input type="password" name="usrPass" id="usrPass" placeholder="Enter Password" required |
||||
|
autocomplete="current-password"> |
||||
|
<div class="underline"></div> |
||||
|
</div> |
||||
|
<input type="submit" value="Login" id="submit-btn"> |
||||
|
</form> |
||||
|
</div> |
||||
|
|
||||
|
<!-- Footer Fragment --> |
||||
|
<th:block th:replace="~{fragments/footer :: footer}"></th:block> |
||||
|
|
||||
|
<!-- Custom JS --> |
||||
|
<script th:inline="javascript"> |
||||
|
const contextPath = /*[[@{/}]]*/ ''; |
||||
|
</script> |
||||
|
|
||||
|
<script> |
||||
|
function handleLogin(event) { |
||||
|
event.preventDefault(); |
||||
|
|
||||
|
const errorBox = document.getElementById("error-box"); |
||||
|
const errorText = document.getElementById("error-text"); |
||||
|
const submitBtn = document.getElementById("submit-btn"); |
||||
|
|
||||
|
errorBox.style.display = "none"; |
||||
|
submitBtn.disabled = true; |
||||
|
submitBtn.value = 'Authenticating...'; |
||||
|
|
||||
|
const username = document.getElementById("usrName").value; |
||||
|
const password = document.getElementById("usrPass").value; |
||||
|
|
||||
|
const urlParams = new URLSearchParams(); |
||||
|
urlParams.append('usrName', username); |
||||
|
urlParams.append('usrPass', password); |
||||
|
|
||||
|
// Fetch CSRF tokens |
||||
|
const csrfToken = document.querySelector("meta[name='_csrf']")?.getAttribute("content"); |
||||
|
const csrfHeader = document.querySelector("meta[name='_csrf_header']")?.getAttribute("content"); |
||||
|
|
||||
|
const headers = { |
||||
|
'Content-Type': 'application/x-www-form-urlencoded' |
||||
|
}; |
||||
|
if (csrfToken && csrfHeader) { |
||||
|
headers[csrfHeader] = csrfToken; |
||||
|
} |
||||
|
|
||||
|
fetch(contextPath + 'gccservicedocuments/api/login', { |
||||
|
method: 'POST', |
||||
|
headers: headers, |
||||
|
body: urlParams |
||||
|
}) |
||||
|
.then(response => response.json()) |
||||
|
.then(data => { |
||||
|
if (data.result) { |
||||
|
window.location.href = contextPath + 'gccservicedocuments/view'; |
||||
|
} else { |
||||
|
submitBtn.disabled = false; |
||||
|
submitBtn.value = 'Login'; |
||||
|
errorText.textContent = data.error || "Authentication failed."; |
||||
|
errorBox.style.display = "block"; |
||||
|
} |
||||
|
}) |
||||
|
.catch(err => { |
||||
|
console.error("Login Error:", err); |
||||
|
submitBtn.disabled = false; |
||||
|
submitBtn.value = 'Login'; |
||||
|
errorText.textContent = "Network error. Please try again later."; |
||||
|
errorBox.style.display = "block"; |
||||
|
}); |
||||
|
} |
||||
|
</script> |
||||
|
</body> |
||||
|
|
||||
|
</html> |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue