Browse Source

separate birth and death into two pages

master
AJITHKUMAR12 1 year ago
parent
commit
5f25eb6848
  1. 2
      bin/.gitattributes
  2. 33
      bin/.gitignore
  3. 19
      bin/.mvn/wrapper/maven-wrapper.properties
  4. 259
      bin/mvnw
  5. 149
      bin/mvnw.cmd
  6. 75
      bin/pom.xml
  7. BIN
      bin/src/main/java/com/gcc/crslogs/CrslogsApplication.class
  8. BIN
      bin/src/main/java/com/gcc/crslogs/configuration/AppConfig.class
  9. BIN
      bin/src/main/java/com/gcc/crslogs/controller/ApiController.class
  10. BIN
      bin/src/main/java/com/gcc/crslogs/controller/MainController.class
  11. BIN
      bin/src/main/java/com/gcc/crslogs/service/BirthAndDeathDetailsService.class
  12. 12
      bin/src/main/resources/application-dev.properties
  13. 11
      bin/src/main/resources/application-prod.properties
  14. 1
      bin/src/main/resources/application.properties
  15. 1234
      bin/src/main/resources/templates/modules/crslogspages/birthanddeath.html
  16. 0
      bin/src/main/resources/templates/modules/crslogspages/loginpage.html
  17. BIN
      bin/src/test/java/com/gcc/crslogs/CrslogsApplicationTests.class
  18. 51
      src/main/java/com/gcc/crslogs/controller/MainController.java
  19. 1234
      src/main/resources/templates/modules/crslogspages/birth.html
  20. 840
      src/main/resources/templates/modules/crslogspages/birthloginpage.html
  21. 1234
      src/main/resources/templates/modules/crslogspages/death.html
  22. 840
      src/main/resources/templates/modules/crslogspages/deathloginpage.html

2
bin/.gitattributes

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
bin/.gitignore

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

19
bin/.mvn/wrapper/maven-wrapper.properties

@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

259
bin/mvnw

@ -0,0 +1,259 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.2
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
trim() {
# MWRAPPER-139:
# Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
# Needed for removing poorly interpreted newline sequences when running in more
# exotic environments such as mingw bash on Windows.
printf "%s" "${1}" | tr -d '[:space:]'
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl=$(trim "${value-}") ;;
distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

149
bin/mvnw.cmd

@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

75
bin/pom.xml

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gcc</groupId>
<artifactId>crslogs</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>crslogs</name>
<description>crs_logs</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- Spring Boot Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

BIN
bin/src/main/java/com/gcc/crslogs/CrslogsApplication.class

BIN
bin/src/main/java/com/gcc/crslogs/configuration/AppConfig.class

BIN
bin/src/main/java/com/gcc/crslogs/controller/ApiController.class

BIN
bin/src/main/java/com/gcc/crslogs/controller/MainController.class

BIN
bin/src/main/java/com/gcc/crslogs/service/BirthAndDeathDetailsService.class

12
bin/src/main/resources/application-dev.properties

@ -0,0 +1,12 @@
spring.application.name=crslogs
spring.datasource.url=jdbc:mysql://localhost:3306/crs_logs
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.show-sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8076
app.getOtpUrl=https://tmegov.onex-aura.com/api/sms?

11
bin/src/main/resources/application-prod.properties

@ -0,0 +1,11 @@
spring.application.name=crslogs
spring.datasource.url=jdbc:mysql://gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com:3306/crs_logs
spring.datasource.username=root
spring.datasource.password=gcc-facial-password
spring.jpa.show-sql=true
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
server.port=8076
app.getOtpUrl=https://tmegov.onex-aura.com/api/sms?

1
bin/src/main/resources/application.properties

@ -0,0 +1 @@
spring.profiles.active=dev

1234
bin/src/main/resources/templates/modules/crslogspages/birthanddeath.html
File diff suppressed because it is too large
View File

0
src/main/resources/templates/modules/crslogspages/loginpage.html → bin/src/main/resources/templates/modules/crslogspages/loginpage.html

BIN
bin/src/test/java/com/gcc/crslogs/CrslogsApplicationTests.class

51
src/main/java/com/gcc/crslogs/controller/MainController.java

@ -13,13 +13,16 @@ import jakarta.servlet.http.HttpSession;
@RequestMapping(value = { "/crs" }) @RequestMapping(value = { "/crs" })
public class MainController { public class MainController {
@GetMapping(value = { "", "/", "/loginpage" })
@GetMapping(value = { "", "/", "/birthloginpage","/deathloginpage" })
public String requestform(Model model) {
return "modules/crslogspages/loginpage";
public String requestbirthform(Model model) {
return "modules/crslogspages/birthloginpage";
}
public String requestdeathform(Model model) {
return "modules/crslogspages/deathloginpage";
} }
@GetMapping("/birthanddeath")
/*@GetMapping("/birthanddeath")
public String birthform(HttpServletRequest request, Model model) { public String birthform(HttpServletRequest request, Model model) {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
session.setMaxInactiveInterval(10 * 60); session.setMaxInactiveInterval(10 * 60);
@ -34,15 +37,49 @@ public class MainController {
// User is logged in // User is logged in
return "modules/crslogspages/birthanddeath"; return "modules/crslogspages/birthanddeath";
} }
*/
@GetMapping("/birth")
public String birthPage(HttpServletRequest request, Model model) {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(10 * 60);
String username = (String) session.getAttribute("userName");
if (username == null || username.isEmpty()) {
return "modules/crslogspages/birthloginpage";
}
return "modules/crslogspages/birth";
}
@GetMapping("/logout")
public String logoutForm(HttpServletRequest request) {
@GetMapping("/death")
public String deathPage(HttpServletRequest request, Model model) {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(10 * 60);
String username = (String) session.getAttribute("userName");
if (username == null || username.isEmpty()) {
return "modules/crslogspages/deathloginpage";
}
return "modules/crslogspages/death";
}
@GetMapping("/birthlogout")
public String logoutbirthForm(HttpServletRequest request) {
HttpSession session = request.getSession(); HttpSession session = request.getSession();
session.setMaxInactiveInterval(10 * 60); session.setMaxInactiveInterval(10 * 60);
session.invalidate(); session.invalidate();
return "modules/crslogspages/loginpage";
return "modules/crslogspages/birth";
}
@GetMapping("/deathlogout")
public String logoutdeathForm(HttpServletRequest request) {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(10 * 60);
session.invalidate();
return "modules/crslogspages/death";
} }
} }

1234
src/main/resources/templates/modules/crslogspages/birth.html
File diff suppressed because it is too large
View File

840
src/main/resources/templates/modules/crslogspages/birthloginpage.html

@ -0,0 +1,840 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GCC - Birth And Death</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
<!-- Include Bootstrap Icons CDN in <head> if not already -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
<!-- <link th:href="@{/styles/loginpage.css}" rel="stylesheet" /> -->
<style>
/* Header Styling */
.header {
background-color: #134356;
padding: 10px 20px;
color: rgb(255, 255, 255);
font-family: Arial, sans-serif;
}
.header .logo img {
height: 60px;
}
.header .center-text {
text-align: center;
font-size: 24px;
}
.header .menu-btn {
background-color: transparent;
border: none;
font-size: 24px;
color: white;
}
.header .menu-btn:hover {
color: #ccc;
}
/* Menu Dropdown */
.menu-dropdown {
position: absolute;
top: 80px;
right: 20px;
background-color: #1d495a;
padding: 10px;
display: none;
flex-direction: column;
z-index: 1000; /* Add z-index to bring the menu above other elements */
}
.menu-dropdown a {
color: white;
margin-bottom: 5px;
text-decoration: none;
}
.menu-dropdown a:hover {
text-decoration: underline;
}
/* otp*/
.otp-input-box {
display: flex;
justify-content: center;
gap: 10px;
/* Adjust spacing between the inputs */
}
.otp-input {
width: 50px;
/* Width for a square input */
height: 50px;
/* Height for a square input */
font-size: 24px;
/* Make the digits larger */
text-align: center;
/* Center the digit inside the box */
border: 1px solid #ccc;
/* Optional: add a border */
border-radius: 5px;
/* Optional: rounded corners */
outline: none;
/* Remove default focus outline */
transition: border-color 0.3s ease;
}
.otp-input:focus {
border-color: #007bff;
/* Change border color on focus */
}
/* otp*/
/*send otp styles*/
.input-group .form-control {
border-right: 0;
/* Remove right border of the input to blend with the button */
}
.input-group-append .btn {
border-left: 0;
/* Remove left border of the button */
}
.bottom-container {
margin-bottom: 50px; /* Adjust as needed */
}
/* Mobile Specific Styling */
@media (max-width: 768px) {
.header {
display: flex;
justify-content: space-between;
align-items: center;
}
.center-text {
font-size: 18px !important;
flex-grow: 1;
text-align: center;
}
.menu-dropdown {
right: 0;
left: 0;
z-index: 1000; /* Add z-index to bring the menu above other elements */
}
}
.button-wrapper {
display: flex;
justify-content: center;
margin-top: 20px; /* adds space from the top */
}
#registersubmit {
background-color: #0c4f63;
border: none;
width: 150px; /* optional: set fixed width */
}
#submitBtn {
background-color: #0c4f63;
border: none;
width: 150px; /* optional: set fixed width */
}
</style>
</head>
<body style="background-color: #ebf1fa;">
<!-- Header Start-->
<header>
<div class="header d-flex justify-content-between align-items-center">
<!-- Left: Logo -->
<div class="logo">
<a href="https://chennaicorporation.gov.in/gcc/" >
<img src="https://gccservices.in/gcc/assets/images/logo.png" alt="Logo">
</a>
</div>
<!-- Center: Text -->
<div class="center-text">
GREATER CHENNAI
CORPORATION
</div>
<div class="center">
<a href="https://chennaicorporation.gov.in/gcc/" >
<i class="bi bi-house-fill" style="font-size: 40px; color:#93adc8"></i>
</a>
</div>
</div>
</header>
<!-- Header End-->
<main class="container mt-4">
<!-- First Card -->
<!-- Register Card -->
<!-- Register Card -->
<div class="card register-card mx-auto mt-5" style="max-width: 400px; background-color: rgba(44, 84, 103, 0.1); backdrop-filter: blur(10px); border-radius: 20px; border: 1px solid #ffffff40; display:none;">
<div class="card-body ">
<h4 class="text-center mb-4" style="color: #004865;"><strong>Registration of Birth Certificate Download</strong></h4>
<hr>
<!-- Name -->
<div class="form-group">
<label for="name">Name</label><span class="text-danger">*</span>
<input type="text" class="form-control " id="name" placeholder="Enter your name" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')">
</div>
<!-- Phone -->
<div class="form-group">
<label for="phone">Mobile No</label><span class="text-danger">*</span>
<input type="text" class="form-control" id="phone" placeholder="Enter Mobile number" oninput="validatePhoneNumber(this)">
</div>
<!-- Address -->
<!-- <div class="form-group">
<label for="address">Address</label><span class="text-danger">*</span>
<textarea class="form-control" id="address" rows="2" placeholder="Enter your Address"></textarea>
</div> -->
<div class="button-wrapper">
<button type="submit" class="btn btn-primary" id="registersubmit">Register</button>
</div>
<div class="text-center mt-3 mb-2">
<label>
If you already have an account,
<a href="#" id="showLoginCardBtn">click here to login</a>.
</label>
</div>
</div>
</div>
<div class="card login-card mx-auto mt-5" style="max-width: 400px; background-color: rgba(44, 84, 103, 0.1); backdrop-filter: blur(10px); border-radius: 20px; border: 1px solid #ffffff40; " >
<div class="card-body ">
<h4 class="text-center mb-4" style="color: #004865;"><strong>Birth Certificate Download</strong></h4>
<hr>
<!-- Phone -->
<div class="form-group">
<label for="phone">Mobile No</label>
<span class="text-danger">*</span>
<input type="text"
id="phoneNumber" class="form-control"
placeholder="Enter Registered Mobile number"
oninput="validatePhoneNumber(this)">
</div>
<div class="button-wrapper">
<button type="submit" class="btn btn-primary" id="submitBtn">Login</button>
</div>
<div class="text-center mt-3 mb-2">
<label>
If you don't have an account,
<a href="#" id="showRegisterCardBtn">click here to Register</a>.
</label>
</div>
</div>
</div>
</main>
<!-- OTP Modal -->
<div class="modal fade" id="otpForm" tabindex="-1" role="dialog"
aria-labelledby="otpFormLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="" onsubmit="return verifyOtp(1); "> <!--1 mentioned for existing user login -->
<div class="modal-header">
<h6 class="modal-title m-0" id="exampleModalDefaultLabel">OTP
Login</h6>
<button type="button" class="close" data-bs-dismiss="modal"
aria-label="Close"
style="color: black; border: white; background-color: white;">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row ">
<div class="mb-3" style="text-align: center;">
<img src="https://gccservices.in/gcc/files/c_d/otp.png"
width="50%" alt="Mobileotp">
</div>
</div>
<div class="row d-flex justify-content-center align-items-center">
<div class="mb-0">
<h4>OTP Verification</h4>
<p class="text-mute">
Enter the OTP sent to <b class="text-info" id="mobilenotxt"></b>
</p>
<p class="text-danger" id="otperror"></p>
</div>
</div>
<div class="row d-flex justify-content-center align-items-center">
<div class="mb-3 ">
<div class="otp-input-box">
<input type="text" maxlength="1" class="otp-input" id="otp1"
required /> <input type="text" maxlength="1"
class="otp-input" id="otp2" required /> <input type="text"
maxlength="1" class="otp-input" id="otp3" required /> <input
type="text" maxlength="1" class="otp-input" id="otp4" required />
<input type="text" maxlength="1" class="otp-input" id="otp5"
required />
</div>
</div>
</div>
<div class="mb-3 text-center">
<div id="resend-containers">
<p class="mb-0">Didn't receive OTP?</p>
<p class="mb-0 text-info" id="resendlink"></p>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary" id="but">Verify
OTP</button>
</div>
</form>
</div>
</div>
</div>
<!-- jQuery (Only load it once) -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- Popper.js (Required for Bootstrap 4) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
<!-- Bootstrap JS -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<!-- SweetAlert JS (optional if you plan to use it) -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- <script th:src="@{/script/loginpage.js}"></script> -->
<script>
document.addEventListener("DOMContentLoaded", function () {
const registerCard = document.querySelector(".register-card");
const loginCard = document.querySelector(".login-card");
function clearRegisterForm() {
document.getElementById("name").value = "";
document.getElementById("phone").value = "";
//document.getElementById("address").value = "";
}
function clearLoginForm() {
document.getElementById("phoneNumber").value = "";
}
document.getElementById("showRegisterCardBtn").addEventListener("click", function (e) {
e.preventDefault();
clearLoginForm();
loginCard.style.display = "none";
registerCard.style.display = "block";
});
document.getElementById("showLoginCardBtn").addEventListener("click", function (e) {
e.preventDefault();
clearRegisterForm();
registerCard.style.display = "none";
loginCard.style.display = "block";
});
});
$(document).ready(function () {
// Show Login Card when "Login" is clicked from Register Card
$('#showLoginCardBtn').on('click', function (e) {
e.preventDefault();
$('.register-card').hide();
$('.login-card').show();
});
// Show Register Card when "Register" is clicked from Login Card
$('#showRegisterCardBtn').on('click', function (e) {
e.preventDefault();
$('.login-card').hide();
$('.register-card').show();
});
// When OTP modal is closed
$('#otpForm').on('hidden.bs.modal', function () {
// Clear all OTP input fields
$('.otp-input').val('');
// Clear OTP error message
$('#otperror').text('');
// Restart the countdown
startCountdown();
});
});
function validatePhoneNumber(input) {
// Remove non-numeric characters
let value = input.value.replace(/[^0-9]/g, '');
// Prevent input if first digit is 0
if (value.length === 1 && value[0] === '0') {
value = '';
}
// Enforce Indian mobile format: starts with 6-9 and has exactly 10 digits
if (value.length > 10) {
value = value.slice(0, 10);
}
// Update input value
input.value = value;
// Optional: check for invalid numbers starting with digits other than 6-9
if (value.length === 10 && !/^[6-9]\d{9}$/.test(value)) {
Swal.fire({
title: "Invalid Mobile Number",
text: "Please enter a valid 10-digit Indian mobile number starting with 6-9.",
icon: "error",
confirmButtonText: "OK",
allowOutsideClick: false
});
input.value = "";
}
}
$('#registersubmit').click(function (event) {
event.preventDefault();
const name = $('#name').val().trim();
const mobileNumber = $('#phone').val().trim();
//const address = $('#address').val().trim();
if (!name) {
Swal.fire({ icon: 'warning', title: 'Missing Name', text: 'Please enter your name.' });
return;
}
if (!mobileNumber || mobileNumber.length !== 10) {
Swal.fire({ title: "Invalid Mobile Number", text: "Please enter a valid 10-digit mobile number.", icon: "error" });
return;
}
// Step 1: Check if user already exists
$.ajax({
type: "POST",
url: '/crs/api/checkUser',
data: { mobile: mobileNumber },
success: function (response) {
if (response.exists) {
Swal.fire({
title: "Already Registered",
text: "This mobile number is already registered. Please login.",
icon: "info"
});
} else {
// Step 2: Send OTP
sendOtp(mobileNumber);
// Step 3: Wait for user to manually click Verify inside OTP modal,
// and if successful, call verifyOtp with a callback
$('#but').off('click').on('click', function () {
verifyOtp(2,function () { // 2 is mentioned for new user registration
// Step 4: Save new user only after OTP success
$.ajax({
url: '/crs/api/saveNewUser',
type: 'POST',
data: {
user_name: name,
user_mobile: mobileNumber
},
success: function () {
Swal.fire({
icon: 'success',
title: 'Registration Successful',
//text: 'Redirecting...'
}).then(() => {
$('#name').val('');
$('#phone').val('');
// $('#address').val('');
window.location.href = "/crs/loginpage";
});
},
error: function (xhr) {
let message = 'An error occurred.';
if (xhr.responseJSON && xhr.responseJSON.message) {
message = xhr.responseJSON.message;
}
Swal.fire({ icon: 'error', title: 'Failed', text: message });
}
});
});
});
}
},
error: function () {
Swal.fire({
title: "Server Error",
text: "Unable to check user status.",
icon: "error"
});
}
});
});
$('#submitBtn').click(function (event) {
event.preventDefault();
let mobileNumber = $('#phoneNumber').val().trim();
if (!mobileNumber || mobileNumber.length !== 10) {
Swal.fire({
title: "Invalid Mobile Number",
text: "Please enter a valid 10-digit mobile number.",
icon: "error",
confirmButtonText: "OK",
allowOutsideClick: false
});
return;
}
// Step 1: Check if user exists
$.ajax({
type: "POST",
url: '/crs/api/checkUser',
data: { mobile: mobileNumber },
success: function (response) {
if (response.exists) {
// Step 2: Send OTP to registered user
sendOtp(mobileNumber);
// Step 3: Bind OTP verify for login
$('#but').off('click').on('click', function () {
verifyOtp(1, function () {
// Step 4: Redirect to birth & death page ONLY after OTP success
window.location.href = "/crs/birth";
});
});
} else {
// Not registered
Swal.fire({
title: "User Not Found",
text: "This mobile number is not registered. Please register to continue.",
icon: "warning",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
window.location.reload(); // Optionally show registration card instead
});
}
},
error: function () {
Swal.fire({
title: "Server Error",
text: "Unable to check user status. Please try again later.",
icon: "error",
confirmButtonText: "OK"
});
}
});
});
function sendOtp(mobileNumber) {
Swal.fire({
title: 'Processing OTP...',
text: 'Please wait while we send the OTP.',
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
let minDisplayTime = 5000;
let startTime = new Date().getTime();
$.ajax({
type: "GET",
url: '/crs/api/sendOTP',
data: { 'mobile': mobileNumber },
dataType: 'json',
success: function (response) {
let elapsedTime = new Date().getTime() - startTime;
let delay = Math.max(0, minDisplayTime - elapsedTime);
setTimeout(function () {
Swal.close();
//console.log("OTP sent response:", response);
$('#mobilenotxt').html(mobileNumber);
$('#otpForm').modal({
backdrop: 'static',
keyboard: false
}).modal('show');
startCountdown();
}, delay);
},
error: function () {
Swal.fire({
title: "Server Error",
text: "There was an issue sending your OTP. Please try again later.",
icon: "error",
confirmButtonText: "OK"
});
}
});
}
function verifyOtp(flag, onSuccessCallback) {
//alert("inside line 849")
Swal.fire({
title: 'Verifying OTP...',
text: 'Please wait while we verify the OTP.',
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
const minDisplayTime = 2000;
const startTime = new Date().getTime();
let otpValue = '';
$('.otp-input').each(function () {
otpValue += $(this).val();
});
const mobileNumber = $('#mobilenotxt').text().trim();
$.ajax({
type: "GET",
url: '/crs/api/verifyOTP',
data: {'otp': otpValue, 'mobNo': mobileNumber, 'flag': flag},
dataType: 'json',
success: function (response) {
//console.log("response...",response);
if (response.userName) {
localStorage.setItem("userName", response.userName);
}
const elapsedTime = new Date().getTime() - startTime;
const delay = Math.max(0, minDisplayTime - elapsedTime);
setTimeout(function () {
Swal.close();
if (response.status === "Success") {
//alert("inside line 890 " + response.userName);
//console.log("Welcome, " , response.userName);
Swal.fire({
title: "OTP Verified!",
text: "Your OTP has been successfully verified.",
icon: "success",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
$('#otpForm').modal('hide');
//$('#sendOtpButton').hide();
$('#phoneNumber').prop('disabled', true);
$('#verifiedOTP').prop('disabled', false).css('display', 'block');
if (typeof onSuccessCallback === 'function') {
onSuccessCallback(); // ✅ Call the registration save logic here
}
/* if(flag==1){
window.location.href = "/birthanddeath";
}else{
window.location.href = "/loginpage";
} */
//saveDetails();
});
} else {
Swal.fire({
title: "OTP Incorrect",
text: "The OTP you entered is incorrect. Please try again.",
icon: "error",
confirmButtonText: "Retry"
});
}
}, delay);
},
error: function () {
Swal.fire({
title: "Verification Failed",
text: "There was an issue verifying your OTP. Please try again later.",
icon: "error"
});
}
});
return false;
}
// Declare the timeout variable globally
let resendTimeout = null;
// Countdown and resend handler
function startCountdown() {
// Clear any existing countdown interval
if (resendTimeout) {
clearInterval(resendTimeout);
resendTimeout = null;
}
let timeleft = 60;
$('#resendlink').html('Please wait.. <span id="countdown">60</span>s');
resendTimeout = setInterval(function () {
timeleft--;
$('#countdown').text(timeleft);
if (timeleft <= 0) {
clearInterval(resendTimeout);
resendTimeout = null; // Clear reference
$('#resendlink').html('<a href="#" id="resend-link" class="text-info" onclick="return resendOTP();">Resend OTP</a>');
}
}, 1000);
}
// Resend OTP logic
function resendOTP() {
const mobileNumber = $('#mobilenotxt').text().trim();
if (!mobileNumber || mobileNumber.length !== 10) return false;
$.ajax({
type: "GET",
url: '/crs/api/sendOTP',
data: { 'mobile': mobileNumber },
dataType: 'json',
success: function (response) {
Swal.fire({
title: "OTP Resent",
text: "A new OTP has been sent to your mobile.",
icon: "info",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
// Clear all OTP input fields
for (let i = 1; i <= 5; i++) {
$(`#otp${i}`).val('');
}
startCountdown(); // Start countdown again if needed
});
},
error: function () {
Swal.fire({
title: "Error",
text: "Could not resend OTP. Please try again.",
icon: "error"
});
}
});
return false; // prevent default link behavior
}
// For OTP input box
$('.otp-input').on('keyup', function (e) {
var $this = $(this);
if ($this.val().length === 1) {
$this.next('.otp-input').focus();
}
if ($this.val().length === 0) {
$this.prev('.otp-input').focus();
}
});
</script>
</body>
</html>

1234
src/main/resources/templates/modules/crslogspages/death.html
File diff suppressed because it is too large
View File

840
src/main/resources/templates/modules/crslogspages/deathloginpage.html

@ -0,0 +1,840 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GCC - Death</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet">
<!-- Include Bootstrap Icons CDN in <head> if not already -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.5/font/bootstrap-icons.css">
<!-- <link th:href="@{/styles/loginpage.css}" rel="stylesheet" /> -->
<style>
/* Header Styling */
.header {
background-color: #134356;
padding: 10px 20px;
color: rgb(255, 255, 255);
font-family: Arial, sans-serif;
}
.header .logo img {
height: 60px;
}
.header .center-text {
text-align: center;
font-size: 24px;
}
.header .menu-btn {
background-color: transparent;
border: none;
font-size: 24px;
color: white;
}
.header .menu-btn:hover {
color: #ccc;
}
/* Menu Dropdown */
.menu-dropdown {
position: absolute;
top: 80px;
right: 20px;
background-color: #1d495a;
padding: 10px;
display: none;
flex-direction: column;
z-index: 1000; /* Add z-index to bring the menu above other elements */
}
.menu-dropdown a {
color: white;
margin-bottom: 5px;
text-decoration: none;
}
.menu-dropdown a:hover {
text-decoration: underline;
}
/* otp*/
.otp-input-box {
display: flex;
justify-content: center;
gap: 10px;
/* Adjust spacing between the inputs */
}
.otp-input {
width: 50px;
/* Width for a square input */
height: 50px;
/* Height for a square input */
font-size: 24px;
/* Make the digits larger */
text-align: center;
/* Center the digit inside the box */
border: 1px solid #ccc;
/* Optional: add a border */
border-radius: 5px;
/* Optional: rounded corners */
outline: none;
/* Remove default focus outline */
transition: border-color 0.3s ease;
}
.otp-input:focus {
border-color: #007bff;
/* Change border color on focus */
}
/* otp*/
/*send otp styles*/
.input-group .form-control {
border-right: 0;
/* Remove right border of the input to blend with the button */
}
.input-group-append .btn {
border-left: 0;
/* Remove left border of the button */
}
.bottom-container {
margin-bottom: 50px; /* Adjust as needed */
}
/* Mobile Specific Styling */
@media (max-width: 768px) {
.header {
display: flex;
justify-content: space-between;
align-items: center;
}
.center-text {
font-size: 18px !important;
flex-grow: 1;
text-align: center;
}
.menu-dropdown {
right: 0;
left: 0;
z-index: 1000; /* Add z-index to bring the menu above other elements */
}
}
.button-wrapper {
display: flex;
justify-content: center;
margin-top: 20px; /* adds space from the top */
}
#registersubmit {
background-color: #0c4f63;
border: none;
width: 150px; /* optional: set fixed width */
}
#submitBtn {
background-color: #0c4f63;
border: none;
width: 150px; /* optional: set fixed width */
}
</style>
</head>
<body style="background-color: #ebf1fa;">
<!-- Header Start-->
<header>
<div class="header d-flex justify-content-between align-items-center">
<!-- Left: Logo -->
<div class="logo">
<a href="https://chennaicorporation.gov.in/gcc/" >
<img src="https://gccservices.in/gcc/assets/images/logo.png" alt="Logo">
</a>
</div>
<!-- Center: Text -->
<div class="center-text">
GREATER CHENNAI
CORPORATION
</div>
<div class="center">
<a href="https://chennaicorporation.gov.in/gcc/" >
<i class="bi bi-house-fill" style="font-size: 40px; color:#93adc8"></i>
</a>
</div>
</div>
</header>
<!-- Header End-->
<main class="container mt-4">
<!-- First Card -->
<!-- Register Card -->
<!-- Register Card -->
<div class="card register-card mx-auto mt-5" style="max-width: 400px; background-color: rgba(44, 84, 103, 0.1); backdrop-filter: blur(10px); border-radius: 20px; border: 1px solid #ffffff40; display:none;">
<div class="card-body ">
<h4 class="text-center mb-4" style="color: #004865;"><strong>Registration of Death Certificate Download</strong></h4>
<hr>
<!-- Name -->
<div class="form-group">
<label for="name">Name</label><span class="text-danger">*</span>
<input type="text" class="form-control " id="name" placeholder="Enter your name" oninput="this.value = this.value.replace(/[^a-zA-Z\s]/g, '')">
</div>
<!-- Phone -->
<div class="form-group">
<label for="phone">Mobile No</label><span class="text-danger">*</span>
<input type="text" class="form-control" id="phone" placeholder="Enter Mobile number" oninput="validatePhoneNumber(this)">
</div>
<!-- Address -->
<!-- <div class="form-group">
<label for="address">Address</label><span class="text-danger">*</span>
<textarea class="form-control" id="address" rows="2" placeholder="Enter your Address"></textarea>
</div> -->
<div class="button-wrapper">
<button type="submit" class="btn btn-primary" id="registersubmit">Register</button>
</div>
<div class="text-center mt-3 mb-2">
<label>
If you already have an account,
<a href="#" id="showLoginCardBtn">click here to login</a>.
</label>
</div>
</div>
</div>
<div class="card login-card mx-auto mt-5" style="max-width: 400px; background-color: rgba(44, 84, 103, 0.1); backdrop-filter: blur(10px); border-radius: 20px; border: 1px solid #ffffff40; " >
<div class="card-body ">
<h4 class="text-center mb-4" style="color: #004865;"><strong>Death Certificate Download</strong></h4>
<hr>
<!-- Phone -->
<div class="form-group">
<label for="phone">Mobile No</label>
<span class="text-danger">*</span>
<input type="text"
id="phoneNumber" class="form-control"
placeholder="Enter Registered Mobile number"
oninput="validatePhoneNumber(this)">
</div>
<div class="button-wrapper">
<button type="submit" class="btn btn-primary" id="submitBtn">Login</button>
</div>
<div class="text-center mt-3 mb-2">
<label>
If you don't have an account,
<a href="#" id="showRegisterCardBtn">click here to Register</a>.
</label>
</div>
</div>
</div>
</main>
<!-- OTP Modal -->
<div class="modal fade" id="otpForm" tabindex="-1" role="dialog"
aria-labelledby="otpFormLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form action="" onsubmit="return verifyOtp(1); "> <!--1 mentioned for existing user login -->
<div class="modal-header">
<h6 class="modal-title m-0" id="exampleModalDefaultLabel">OTP
Login</h6>
<button type="button" class="close" data-bs-dismiss="modal"
aria-label="Close"
style="color: black; border: white; background-color: white;">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row ">
<div class="mb-3" style="text-align: center;">
<img src="https://gccservices.in/gcc/files/c_d/otp.png"
width="50%" alt="Mobileotp">
</div>
</div>
<div class="row d-flex justify-content-center align-items-center">
<div class="mb-0">
<h4>OTP Verification</h4>
<p class="text-mute">
Enter the OTP sent to <b class="text-info" id="mobilenotxt"></b>
</p>
<p class="text-danger" id="otperror"></p>
</div>
</div>
<div class="row d-flex justify-content-center align-items-center">
<div class="mb-3 ">
<div class="otp-input-box">
<input type="text" maxlength="1" class="otp-input" id="otp1"
required /> <input type="text" maxlength="1"
class="otp-input" id="otp2" required /> <input type="text"
maxlength="1" class="otp-input" id="otp3" required /> <input
type="text" maxlength="1" class="otp-input" id="otp4" required />
<input type="text" maxlength="1" class="otp-input" id="otp5"
required />
</div>
</div>
</div>
<div class="mb-3 text-center">
<div id="resend-containers">
<p class="mb-0">Didn't receive OTP?</p>
<p class="mb-0 text-info" id="resendlink"></p>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
data-bs-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary" id="but">Verify
OTP</button>
</div>
</form>
</div>
</div>
</div>
<!-- jQuery (Only load it once) -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<!-- Popper.js (Required for Bootstrap 4) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js"></script>
<!-- Bootstrap JS -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<!-- SweetAlert JS (optional if you plan to use it) -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- <script th:src="@{/script/loginpage.js}"></script> -->
<script>
document.addEventListener("DOMContentLoaded", function () {
const registerCard = document.querySelector(".register-card");
const loginCard = document.querySelector(".login-card");
function clearRegisterForm() {
document.getElementById("name").value = "";
document.getElementById("phone").value = "";
//document.getElementById("address").value = "";
}
function clearLoginForm() {
document.getElementById("phoneNumber").value = "";
}
document.getElementById("showRegisterCardBtn").addEventListener("click", function (e) {
e.preventDefault();
clearLoginForm();
loginCard.style.display = "none";
registerCard.style.display = "block";
});
document.getElementById("showLoginCardBtn").addEventListener("click", function (e) {
e.preventDefault();
clearRegisterForm();
registerCard.style.display = "none";
loginCard.style.display = "block";
});
});
$(document).ready(function () {
// Show Login Card when "Login" is clicked from Register Card
$('#showLoginCardBtn').on('click', function (e) {
e.preventDefault();
$('.register-card').hide();
$('.login-card').show();
});
// Show Register Card when "Register" is clicked from Login Card
$('#showRegisterCardBtn').on('click', function (e) {
e.preventDefault();
$('.login-card').hide();
$('.register-card').show();
});
// When OTP modal is closed
$('#otpForm').on('hidden.bs.modal', function () {
// Clear all OTP input fields
$('.otp-input').val('');
// Clear OTP error message
$('#otperror').text('');
// Restart the countdown
startCountdown();
});
});
function validatePhoneNumber(input) {
// Remove non-numeric characters
let value = input.value.replace(/[^0-9]/g, '');
// Prevent input if first digit is 0
if (value.length === 1 && value[0] === '0') {
value = '';
}
// Enforce Indian mobile format: starts with 6-9 and has exactly 10 digits
if (value.length > 10) {
value = value.slice(0, 10);
}
// Update input value
input.value = value;
// Optional: check for invalid numbers starting with digits other than 6-9
if (value.length === 10 && !/^[6-9]\d{9}$/.test(value)) {
Swal.fire({
title: "Invalid Mobile Number",
text: "Please enter a valid 10-digit Indian mobile number starting with 6-9.",
icon: "error",
confirmButtonText: "OK",
allowOutsideClick: false
});
input.value = "";
}
}
$('#registersubmit').click(function (event) {
event.preventDefault();
const name = $('#name').val().trim();
const mobileNumber = $('#phone').val().trim();
//const address = $('#address').val().trim();
if (!name) {
Swal.fire({ icon: 'warning', title: 'Missing Name', text: 'Please enter your name.' });
return;
}
if (!mobileNumber || mobileNumber.length !== 10) {
Swal.fire({ title: "Invalid Mobile Number", text: "Please enter a valid 10-digit mobile number.", icon: "error" });
return;
}
// Step 1: Check if user already exists
$.ajax({
type: "POST",
url: '/crs/api/checkUser',
data: { mobile: mobileNumber },
success: function (response) {
if (response.exists) {
Swal.fire({
title: "Already Registered",
text: "This mobile number is already registered. Please login.",
icon: "info"
});
} else {
// Step 2: Send OTP
sendOtp(mobileNumber);
// Step 3: Wait for user to manually click Verify inside OTP modal,
// and if successful, call verifyOtp with a callback
$('#but').off('click').on('click', function () {
verifyOtp(2,function () { // 2 is mentioned for new user registration
// Step 4: Save new user only after OTP success
$.ajax({
url: '/crs/api/saveNewUser',
type: 'POST',
data: {
user_name: name,
user_mobile: mobileNumber
},
success: function () {
Swal.fire({
icon: 'success',
title: 'Registration Successful',
//text: 'Redirecting...'
}).then(() => {
$('#name').val('');
$('#phone').val('');
// $('#address').val('');
window.location.href = "/crs/loginpage";
});
},
error: function (xhr) {
let message = 'An error occurred.';
if (xhr.responseJSON && xhr.responseJSON.message) {
message = xhr.responseJSON.message;
}
Swal.fire({ icon: 'error', title: 'Failed', text: message });
}
});
});
});
}
},
error: function () {
Swal.fire({
title: "Server Error",
text: "Unable to check user status.",
icon: "error"
});
}
});
});
$('#submitBtn').click(function (event) {
event.preventDefault();
let mobileNumber = $('#phoneNumber').val().trim();
if (!mobileNumber || mobileNumber.length !== 10) {
Swal.fire({
title: "Invalid Mobile Number",
text: "Please enter a valid 10-digit mobile number.",
icon: "error",
confirmButtonText: "OK",
allowOutsideClick: false
});
return;
}
// Step 1: Check if user exists
$.ajax({
type: "POST",
url: '/crs/api/checkUser',
data: { mobile: mobileNumber },
success: function (response) {
if (response.exists) {
// Step 2: Send OTP to registered user
sendOtp(mobileNumber);
// Step 3: Bind OTP verify for login
$('#but').off('click').on('click', function () {
verifyOtp(1, function () {
// Step 4: Redirect to birth & death page ONLY after OTP success
window.location.href = "/crs/death";
});
});
} else {
// Not registered
Swal.fire({
title: "User Not Found",
text: "This mobile number is not registered. Please register to continue.",
icon: "warning",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
window.location.reload(); // Optionally show registration card instead
});
}
},
error: function () {
Swal.fire({
title: "Server Error",
text: "Unable to check user status. Please try again later.",
icon: "error",
confirmButtonText: "OK"
});
}
});
});
function sendOtp(mobileNumber) {
Swal.fire({
title: 'Processing OTP...',
text: 'Please wait while we send the OTP.',
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
let minDisplayTime = 5000;
let startTime = new Date().getTime();
$.ajax({
type: "GET",
url: '/crs/api/sendOTP',
data: { 'mobile': mobileNumber },
dataType: 'json',
success: function (response) {
let elapsedTime = new Date().getTime() - startTime;
let delay = Math.max(0, minDisplayTime - elapsedTime);
setTimeout(function () {
Swal.close();
//console.log("OTP sent response:", response);
$('#mobilenotxt').html(mobileNumber);
$('#otpForm').modal({
backdrop: 'static',
keyboard: false
}).modal('show');
startCountdown();
}, delay);
},
error: function () {
Swal.fire({
title: "Server Error",
text: "There was an issue sending your OTP. Please try again later.",
icon: "error",
confirmButtonText: "OK"
});
}
});
}
function verifyOtp(flag, onSuccessCallback) {
//alert("inside line 849")
Swal.fire({
title: 'Verifying OTP...',
text: 'Please wait while we verify the OTP.',
allowOutsideClick: false,
didOpen: () => {
Swal.showLoading();
}
});
const minDisplayTime = 2000;
const startTime = new Date().getTime();
let otpValue = '';
$('.otp-input').each(function () {
otpValue += $(this).val();
});
const mobileNumber = $('#mobilenotxt').text().trim();
$.ajax({
type: "GET",
url: '/crs/api/verifyOTP',
data: {'otp': otpValue, 'mobNo': mobileNumber, 'flag': flag},
dataType: 'json',
success: function (response) {
//console.log("response...",response);
if (response.userName) {
localStorage.setItem("userName", response.userName);
}
const elapsedTime = new Date().getTime() - startTime;
const delay = Math.max(0, minDisplayTime - elapsedTime);
setTimeout(function () {
Swal.close();
if (response.status === "Success") {
//alert("inside line 890 " + response.userName);
//console.log("Welcome, " , response.userName);
Swal.fire({
title: "OTP Verified!",
text: "Your OTP has been successfully verified.",
icon: "success",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
$('#otpForm').modal('hide');
//$('#sendOtpButton').hide();
$('#phoneNumber').prop('disabled', true);
$('#verifiedOTP').prop('disabled', false).css('display', 'block');
if (typeof onSuccessCallback === 'function') {
onSuccessCallback(); // ✅ Call the registration save logic here
}
/* if(flag==1){
window.location.href = "/birthanddeath";
}else{
window.location.href = "/loginpage";
} */
//saveDetails();
});
} else {
Swal.fire({
title: "OTP Incorrect",
text: "The OTP you entered is incorrect. Please try again.",
icon: "error",
confirmButtonText: "Retry"
});
}
}, delay);
},
error: function () {
Swal.fire({
title: "Verification Failed",
text: "There was an issue verifying your OTP. Please try again later.",
icon: "error"
});
}
});
return false;
}
// Declare the timeout variable globally
let resendTimeout = null;
// Countdown and resend handler
function startCountdown() {
// Clear any existing countdown interval
if (resendTimeout) {
clearInterval(resendTimeout);
resendTimeout = null;
}
let timeleft = 60;
$('#resendlink').html('Please wait.. <span id="countdown">60</span>s');
resendTimeout = setInterval(function () {
timeleft--;
$('#countdown').text(timeleft);
if (timeleft <= 0) {
clearInterval(resendTimeout);
resendTimeout = null; // Clear reference
$('#resendlink').html('<a href="#" id="resend-link" class="text-info" onclick="return resendOTP();">Resend OTP</a>');
}
}, 1000);
}
// Resend OTP logic
function resendOTP() {
const mobileNumber = $('#mobilenotxt').text().trim();
if (!mobileNumber || mobileNumber.length !== 10) return false;
$.ajax({
type: "GET",
url: '/crs/api/sendOTP',
data: { 'mobile': mobileNumber },
dataType: 'json',
success: function (response) {
Swal.fire({
title: "OTP Resent",
text: "A new OTP has been sent to your mobile.",
icon: "info",
confirmButtonText: "OK",
allowOutsideClick: false
}).then(() => {
// Clear all OTP input fields
for (let i = 1; i <= 5; i++) {
$(`#otp${i}`).val('');
}
startCountdown(); // Start countdown again if needed
});
},
error: function () {
Swal.fire({
title: "Error",
text: "Could not resend OTP. Please try again.",
icon: "error"
});
}
});
return false; // prevent default link behavior
}
// For OTP input box
$('.otp-input').on('keyup', function (e) {
var $this = $(this);
if ($this.val().length === 1) {
$this.next('.otp-input').focus();
}
if ($this.val().length === 0) {
$this.prev('.otp-input').focus();
}
});
</script>
</body>
</html>
Loading…
Cancel
Save