initial commit
This commit is contained in:
33
.gitignore
vendored
Executable file
33
.gitignore
vendored
Executable file
@@ -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/
|
11
Dockerfile
Executable file
11
Dockerfile
Executable file
@@ -0,0 +1,11 @@
|
||||
# Use the official OpenJDK base image
|
||||
FROM openjdk:21-jdk-slim
|
||||
|
||||
# Set the working directory in the container
|
||||
WORKDIR /app
|
||||
|
||||
# Copy the JAR file into the container
|
||||
COPY target/portfolio-website-0.0.1.jar /app/app.jar
|
||||
|
||||
# Specify the command to run the JAR file
|
||||
ENTRYPOINT ["java", "-jar", "app.jar"]
|
259
mvnw
vendored
Executable file
259
mvnw
vendored
Executable file
@@ -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
mvnw.cmd
vendored
Executable file
149
mvnw.cmd
vendored
Executable file
@@ -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"
|
107
pom.xml
Executable file
107
pom.xml
Executable file
@@ -0,0 +1,107 @@
|
||||
<?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.2</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>com.codenetworkz</groupId>
|
||||
<artifactId>portfolio-website</artifactId>
|
||||
<version>0.0.1</version>
|
||||
<name>portfolio-website</name>
|
||||
<description>portfolio-website</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-actuator</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-validation</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-mail</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
<!-- <dependency>-->
|
||||
<!-- <groupId>org.springframework.boot</groupId>-->
|
||||
<!-- <artifactId>spring-boot-devtools</artifactId>-->
|
||||
<!-- <scope>runtime</scope>-->
|
||||
<!-- <optional>true</optional>-->
|
||||
<!-- </dependency>-->
|
||||
<dependency>
|
||||
<groupId>io.micrometer</groupId>
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.mysql</groupId>
|
||||
<artifactId>mysql-connector-j</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
@@ -0,0 +1,14 @@
|
||||
package com.codenetworkz.portfoliowebsite;
|
||||
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
|
||||
@SpringBootApplication
|
||||
public class PortfolioWebsiteApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(PortfolioWebsiteApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,7 @@
|
||||
package com.codenetworkz.portfoliowebsite.config;
|
||||
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
|
||||
@EnableScheduling
|
||||
public class EnableSchedulerConfig {
|
||||
}
|
7
src/main/java/com/codenetworkz/portfoliowebsite/config/WebConfig.java
Executable file
7
src/main/java/com/codenetworkz/portfoliowebsite/config/WebConfig.java
Executable file
@@ -0,0 +1,7 @@
|
||||
package com.codenetworkz.portfoliowebsite.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
@Configuration
|
||||
public class WebConfig implements WebMvcConfigurer {
|
||||
}
|
@@ -0,0 +1,41 @@
|
||||
package com.codenetworkz.portfoliowebsite.controllers;
|
||||
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.models.ContactForm;
|
||||
import com.codenetworkz.portfoliowebsite.services.ContactFormService;
|
||||
import jakarta.validation.Valid;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
@Controller
|
||||
public class ContactController {
|
||||
|
||||
Logger logger = Logger.getLogger(ContactController.class.getName());
|
||||
|
||||
private ContactFormService contactFormService;
|
||||
|
||||
public ContactController(ContactFormService contactFormService) {
|
||||
this.contactFormService = contactFormService;
|
||||
}
|
||||
@GetMapping("/contact")
|
||||
public String contactViewPage() {
|
||||
return "contactus";
|
||||
}
|
||||
|
||||
@PostMapping("/add")
|
||||
public String saveContact(@Valid @RequestParam("fullName") String fullName, @RequestParam("email") String email, @RequestParam("phone") String phone, @RequestParam("message") String message) {
|
||||
|
||||
Optional<ContactForm> contactForm = contactFormService.saveContactDetails(fullName, email, phone, message);
|
||||
|
||||
if(contactForm.isPresent()){
|
||||
return "redirect:/result";
|
||||
}
|
||||
logger.info("Testomg nodat ");
|
||||
return "redirect:/contact";
|
||||
}
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
package com.codenetworkz.portfoliowebsite.controllers;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.exceptions.InternalServerException;
|
||||
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice;
|
||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||
|
||||
@ControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
@ExceptionHandler(InternalServerException.class)
|
||||
public String handleInternalServerException(InternalServerException ex, Model model) {
|
||||
model.addAttribute("errorMessage", ex.getMessage());
|
||||
model.addAttribute("errorCode", 500);
|
||||
return "error"; // Name of the Thymeleaf template
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,45 @@
|
||||
package com.codenetworkz.portfoliowebsite.controllers;
|
||||
|
||||
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
@Controller
|
||||
public class PortfolioController {
|
||||
|
||||
@GetMapping("/")
|
||||
public String homeViewPage() {
|
||||
return "index";
|
||||
}
|
||||
|
||||
@GetMapping("/resume")
|
||||
public String resumeViewPage() {
|
||||
return "resume";
|
||||
}
|
||||
|
||||
@GetMapping("/projects")
|
||||
public String projectViewPage() {
|
||||
return "projects";
|
||||
}
|
||||
|
||||
@GetMapping("/result")
|
||||
public String resultViewPage() {
|
||||
return "result";
|
||||
}
|
||||
|
||||
@GetMapping("faq")
|
||||
public String faqViewPage() {
|
||||
return "faq";
|
||||
}
|
||||
|
||||
@GetMapping("privacy")
|
||||
public String privacyViewPage() {
|
||||
return "privacy";
|
||||
}
|
||||
|
||||
@GetMapping("terms")
|
||||
public String termsViewPage() {
|
||||
return "terms";
|
||||
}
|
||||
|
||||
}
|
57
src/main/java/com/codenetworkz/portfoliowebsite/crons/MailSenderCron.java
Executable file
57
src/main/java/com/codenetworkz/portfoliowebsite/crons/MailSenderCron.java
Executable file
@@ -0,0 +1,57 @@
|
||||
package com.codenetworkz.portfoliowebsite.crons;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.exceptions.InternalServerException;
|
||||
import com.codenetworkz.portfoliowebsite.models.ContactForm;
|
||||
import com.codenetworkz.portfoliowebsite.models.Status;
|
||||
import com.codenetworkz.portfoliowebsite.repositories.ContactFormRepository;
|
||||
import com.codenetworkz.portfoliowebsite.services.EmailSendService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
@Component
|
||||
public class MailSenderCron {
|
||||
|
||||
private final ContactFormRepository contactFormRepository;
|
||||
private final EmailSendService emailSendService;
|
||||
|
||||
@Value("${spring.mail.username}")
|
||||
private String recipientEmail;
|
||||
|
||||
@Value("${message.contractus.subject}")
|
||||
private String subject;
|
||||
|
||||
public MailSenderCron(ContactFormRepository contactFormRepository, EmailSendService emailSendService) {
|
||||
this.contactFormRepository = contactFormRepository;
|
||||
this.emailSendService= emailSendService;
|
||||
}
|
||||
|
||||
// ┌───────────── second (0-59)
|
||||
// │ ┌───────────── minute (0 - 59)
|
||||
// │ │ ┌───────────── hour (0 - 23)
|
||||
// │ │ │ ┌───────────── day of the month (1 - 31)
|
||||
// │ │ │ │ ┌───────────── month (1 - 12) (or JAN-DEC)
|
||||
// │ │ │ │ │ ┌───────────── day of the week (0 - 7)
|
||||
// │ │ │ │ │ │ (0 or 7 is Sunday, or MON-SUN)
|
||||
// │ │ │ │ │ │
|
||||
// * * * * * *
|
||||
|
||||
//ervery 30 days cron run in backgraond
|
||||
// @Scheduled(cron = "0 0 0 1/2 * *")
|
||||
@Scheduled(cron = "0 */2 * * * *")
|
||||
public void sendPendingMessageEmail() throws InternalServerException{
|
||||
LocalDate last2Day = LocalDate.now().minusDays(2);
|
||||
List<ContactForm> sendMails = contactFormRepository.findAllBySendMessageAndCreateAtIsBefore(Status.No, last2Day);
|
||||
try {
|
||||
sendMails.forEach(sendMail -> {
|
||||
sendMail.setSendMessage(Status.No);
|
||||
emailSendService.sendEmail(sendMail.getEmail(), subject, sendMail.getMessage(), recipientEmail);
|
||||
contactFormRepository.save(sendMail);});
|
||||
}catch (Exception e){
|
||||
throw new InternalServerException("There is problem with database, please try after same time.");
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,8 @@
|
||||
package com.codenetworkz.portfoliowebsite.exceptions;
|
||||
|
||||
public class InternalServerException extends Exception {
|
||||
|
||||
public InternalServerException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
41
src/main/java/com/codenetworkz/portfoliowebsite/models/BaseModel.java
Executable file
41
src/main/java/com/codenetworkz/portfoliowebsite/models/BaseModel.java
Executable file
@@ -0,0 +1,41 @@
|
||||
package com.codenetworkz.portfoliowebsite.models;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.*;
|
||||
import org.springframework.data.annotation.CreatedDate;
|
||||
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@MappedSuperclass
|
||||
public class BaseModel {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
private Long id;
|
||||
|
||||
@CreatedDate
|
||||
@Column(updatable = false)
|
||||
private LocalDateTime createAt;
|
||||
|
||||
@Size(max = 20)
|
||||
@Column(updatable = false, length = 20)
|
||||
private String createdBy;
|
||||
|
||||
|
||||
|
||||
@PrePersist
|
||||
protected void onCreate() {
|
||||
if (this.createAt == null) {
|
||||
this.createAt = LocalDateTime.now();
|
||||
}
|
||||
}
|
||||
}
|
38
src/main/java/com/codenetworkz/portfoliowebsite/models/ContactForm.java
Executable file
38
src/main/java/com/codenetworkz/portfoliowebsite/models/ContactForm.java
Executable file
@@ -0,0 +1,38 @@
|
||||
package com.codenetworkz.portfoliowebsite.models;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.models.BaseModel;
|
||||
import jakarta.persistence.Entity;
|
||||
import jakarta.persistence.EnumType;
|
||||
import jakarta.persistence.Enumerated;
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.Size;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Entity
|
||||
public class ContactForm extends BaseModel {
|
||||
|
||||
|
||||
@Size(min = 3, max = 50, message = "Full Name should be more then 3 and less then 50 character required.")
|
||||
private String fullName;
|
||||
|
||||
@Email(message = "enter valid Email ID")
|
||||
private String email;
|
||||
|
||||
@Size(min = 8, max = 12, message = "Phone No should be more then 8 and less then 12 character required.")
|
||||
private String phone;
|
||||
|
||||
|
||||
@Size(min = 10, max = 255, message = "Message should be more then 10 and less then 255 character required.")
|
||||
private String message;
|
||||
|
||||
@Enumerated(EnumType.STRING)
|
||||
private Status sendMessage;
|
||||
|
||||
}
|
6
src/main/java/com/codenetworkz/portfoliowebsite/models/Status.java
Executable file
6
src/main/java/com/codenetworkz/portfoliowebsite/models/Status.java
Executable file
@@ -0,0 +1,6 @@
|
||||
package com.codenetworkz.portfoliowebsite.models;
|
||||
|
||||
public enum Status {
|
||||
Yes,
|
||||
No
|
||||
}
|
@@ -0,0 +1,18 @@
|
||||
package com.codenetworkz.portfoliowebsite.repositories;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.models.ContactForm;
|
||||
import com.codenetworkz.portfoliowebsite.models.Status;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
@Repository
|
||||
public interface ContactFormRepository extends JpaRepository<ContactForm, Long> {
|
||||
|
||||
// List<ContactForm> findAllBySendMessageIsBefore(Status status, LocalDate last2Day);
|
||||
|
||||
List<ContactForm> findAllBySendMessageAndCreateAtIsBefore(Status status, LocalDate last2Day);
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
package com.codenetworkz.portfoliowebsite.services;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.models.ContactForm;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
public interface ContactFormService
|
||||
{
|
||||
Optional<ContactForm> saveContactDetails(String fullName, String email, String phone, String message);
|
||||
|
||||
}
|
@@ -0,0 +1,6 @@
|
||||
package com.codenetworkz.portfoliowebsite.services;
|
||||
|
||||
public interface EmailSendService {
|
||||
|
||||
void sendEmail(String to, String subject, String message, String from);
|
||||
}
|
@@ -0,0 +1,47 @@
|
||||
package com.codenetworkz.portfoliowebsite.services.impl;
|
||||
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.models.ContactForm;
|
||||
import com.codenetworkz.portfoliowebsite.models.Status;
|
||||
import com.codenetworkz.portfoliowebsite.repositories.ContactFormRepository;
|
||||
import com.codenetworkz.portfoliowebsite.services.ContactFormService;
|
||||
import com.codenetworkz.portfoliowebsite.services.EmailSendService;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Optional;
|
||||
|
||||
@Service
|
||||
public class ContactFormServiceImpl implements ContactFormService {
|
||||
|
||||
private final ContactFormRepository contactFormRepository;
|
||||
private final EmailSendService emailSendService;
|
||||
|
||||
@Value("${spring.mail.username}")
|
||||
private String recipientEmail;
|
||||
|
||||
@Value("${message.contractus.subject}")
|
||||
private String subject;
|
||||
|
||||
public ContactFormServiceImpl(ContactFormRepository contactFormRepository, EmailSendService emailSendService) {
|
||||
this.contactFormRepository = contactFormRepository;
|
||||
this.emailSendService= emailSendService;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Optional<ContactForm> saveContactDetails(String fullName, String email, String phone, String message) {
|
||||
ContactForm contactForm = new ContactForm();
|
||||
contactForm.setFullName(fullName);
|
||||
contactForm.setEmail(email);
|
||||
contactForm.setPhone(phone);
|
||||
contactForm.setMessage(message);
|
||||
contactForm.setSendMessage(Status.Yes);
|
||||
contactForm.setCreateAt(LocalDateTime.now());
|
||||
emailSendService.sendEmail(email, subject, message, recipientEmail);
|
||||
ContactForm save = contactFormRepository.save(contactForm);
|
||||
return Optional.of(save);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,28 @@
|
||||
package com.codenetworkz.portfoliowebsite.services.impl;
|
||||
|
||||
import com.codenetworkz.portfoliowebsite.services.EmailSendService;
|
||||
import lombok.Value;
|
||||
import org.springframework.mail.MailSender;
|
||||
import org.springframework.mail.SimpleMailMessage;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
||||
@Service
|
||||
public class EmilSendServiceImpl implements EmailSendService {
|
||||
|
||||
private final MailSender mailSender;
|
||||
|
||||
EmilSendServiceImpl(MailSender mailSender){
|
||||
this.mailSender = mailSender;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEmail(String to, String subject, String message, String from) {
|
||||
SimpleMailMessage mailMessage=new SimpleMailMessage();
|
||||
mailMessage.setTo(to);
|
||||
mailMessage.setSubject(subject);
|
||||
mailMessage.setFrom(from);
|
||||
mailMessage.setText(message);
|
||||
mailSender.send(mailMessage);
|
||||
}
|
||||
}
|
29
src/main/resources/application.properties
Executable file
29
src/main/resources/application.properties
Executable file
@@ -0,0 +1,29 @@
|
||||
spring.application.name=portfolio-website
|
||||
spring.application.version=0.0.1
|
||||
server.port=8081
|
||||
|
||||
spring.thymeleaf.prefix=classpath:/templates/
|
||||
spring.thymeleaf.suffix=.html
|
||||
spring.thymeleaf.mode=HTML
|
||||
spring.thymeleaf.encoding=UTF-8
|
||||
spring.thymeleaf.cache=false
|
||||
|
||||
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/portfolio_db
|
||||
spring.datasource.username=root
|
||||
spring.datasource.password=Pa$$w0rd
|
||||
spring.jpa.hibernate.ddl-auto=update
|
||||
spring.jpa.show-sql=true
|
||||
spring.datasource.hikari.connection-timeout=60000
|
||||
|
||||
spring.mail.host=smtp.gmail.com
|
||||
spring.mail.port=587
|
||||
spring.mail.username=dholerobin@gmail.com
|
||||
spring.mail.password=myqc care axin tlzt
|
||||
spring.mail.properties.mail.smtp.auth=true
|
||||
spring.mail.properties.mail.smtp.starttls.enable=true
|
||||
#logging.level.root=DEBUG
|
||||
spring.jmx.enabled=true
|
||||
|
||||
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
|
||||
|
||||
message.contractus.subject=Receive a suggestion for contact form.
|
9
src/main/resources/banner.txt
Executable file
9
src/main/resources/banner.txt
Executable file
@@ -0,0 +1,9 @@
|
||||
______ ______ _____ ______ __ __ ______ ______ __ __ ______ ______ __ __ ______
|
||||
/\ ___\ /\ __ \ /\ __-. /\ ___\ /\ "-.\ \ /\ ___\ /\__ _\ /\ \ _ \ \ /\ __ \ /\ == \ /\ \/ / /\___ \
|
||||
\ \ \____ \ \ \/\ \ \ \ \/\ \ \ \ __\ \ \ \-. \ \ \ __\ \/_/\ \/ \ \ \/ ".\ \ \ \ \/\ \ \ \ __< \ \ _"-. \/_/ /__
|
||||
\ \_____\ \ \_____\ \ \____- \ \_____\ \ \_\\"\_\ \ \_____\ \ \_\ \ \__/".~\_\ \ \_____\ \ \_\ \_\ \ \_\ \_\ /\_____\
|
||||
\/_____/ \/_____/ \/____/ \/_____/ \/_/ \/_/ \/_____/ \/_/ \/_/ \/_/ \/_____/ \/_/ /_/ \/_/\/_/ \/_____/
|
||||
|
||||
${spring.application.name} ${spring.application.version}
|
||||
Powered by Spring Boot ${spring-boot.version}
|
||||
Developed By Code NetworkZ pvt.ltd.
|
BIN
src/main/resources/static/assets/favicon.ico
Executable file
BIN
src/main/resources/static/assets/favicon.ico
Executable file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
BIN
src/main/resources/static/assets/profile.png
Executable file
BIN
src/main/resources/static/assets/profile.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 1.2 MiB |
11737
src/main/resources/static/css/styles.css
Executable file
11737
src/main/resources/static/css/styles.css
Executable file
File diff suppressed because it is too large
Load Diff
19
src/main/resources/static/js/scripts.js
Executable file
19
src/main/resources/static/js/scripts.js
Executable file
@@ -0,0 +1,19 @@
|
||||
tinymce.init({
|
||||
selector: '#default',
|
||||
plugins: [
|
||||
// Core editing features
|
||||
'anchor', 'autolink', 'charmap', 'codesample', 'emoticons', 'image', 'link', 'lists', 'media', 'searchreplace', 'table', 'visualblocks', 'wordcount',
|
||||
// Your account includes a free trial of TinyMCE premium features
|
||||
// Try the most popular premium features until Sep 12, 2024:
|
||||
'checklist', 'mediaembed', 'casechange', 'export', 'formatpainter', 'pageembed', 'a11ychecker', 'tinymcespellchecker', 'permanentpen', 'powerpaste', 'advtable', 'advcode', 'editimage', 'advtemplate', 'ai', 'mentions', 'tinycomments', 'tableofcontents', 'footnotes', 'mergetags', 'autocorrect', 'typography', 'inlinecss', 'markdown',
|
||||
],
|
||||
toolbar: 'undo redo | blocks fontfamily fontsize | bold italic underline strikethrough | link image media table mergetags | addcomment showcomments | spellcheckdialog a11ycheck typography | align lineheight | checklist numlist bullist indent outdent | emoticons charmap | removeformat',
|
||||
tinycomments_mode: 'embedded',
|
||||
tinycomments_author: 'Author name',
|
||||
mergetags_list: [
|
||||
{ value: 'First.Name', title: 'First Name' },
|
||||
{ value: 'Email', title: 'Email' },
|
||||
],
|
||||
ai_request: (request, respondWith) => respondWith.string(() => Promise.reject('See docs to implement AI Assistant')),
|
||||
});
|
||||
|
BIN
src/main/resources/static/robin_rajendra_dhole_resume.pdf
Normal file
BIN
src/main/resources/static/robin_rajendra_dhole_resume.pdf
Normal file
Binary file not shown.
59
src/main/resources/templates/contactus.html
Executable file
59
src/main/resources/templates/contactus.html
Executable file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Contact Us - Code NetworkZ</title>
|
||||
|
||||
</head>
|
||||
<body class="d-flex flex-column">
|
||||
<main class="flex-shrink-0">
|
||||
|
||||
<!-- Page content-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="container px-5">
|
||||
<!-- Contact form-->
|
||||
<div class="bg-light rounded-4 py-5 px-4 px-md-5">
|
||||
<div class="text-center mb-5">
|
||||
<div class="feature bg-primary bg-gradient-primary-to-secondary text-white rounded-3 mb-3"><i class="bi bi-envelope"></i></div>
|
||||
<h1 class="fw-bolder">Get in touch</h1>
|
||||
<p class="lead fw-normal text-muted mb-0">Let's work together!</p>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-center">
|
||||
<div class="col-lg-8 col-xl-6">
|
||||
<form action="add" method="post" class="mt-5">
|
||||
<!-- Name input-->
|
||||
<div class="form-floating mb-3">
|
||||
<input class="form-control" id="name" type="text" name="fullName" placeholder="Enter your name..." />
|
||||
<label for="name">Full name</label>
|
||||
<!-- <p tl:if="${#fields.hasErrors('fullName')}" tl:errorclass="text-danger" tl:errors="${contactobj.fullName}"></p>-->
|
||||
</div>
|
||||
<!-- Email address input-->
|
||||
<div class="form-floating mb-3">
|
||||
<input class="form-control" id="email" type="email" name="email" placeholder="name@example.com" />
|
||||
<label for="email">Email address</label>
|
||||
<!-- <p tl:if="${#fields.hasErrors('email')}" tl:errorclass="text-danger" tl:errors="${contactobj.email}"></p>-->
|
||||
</div>
|
||||
<!-- Phone number input-->
|
||||
<div class="form-floating mb-3">
|
||||
<input class="form-control" id="phone" type="tel" name="phone" placeholder="(123) 456-7890" />
|
||||
<label for="phone">Phone number</label>
|
||||
<!-- <p tl:if="${#fields.hasErrors('phone')}" tl:errorclass="text-danger" tl:errors="${contactobj.phone}"></p>-->
|
||||
</div>
|
||||
<!-- Message input-->
|
||||
<div class="form-floating mb-3">
|
||||
<textarea class="form-control" id="message" type="text" name="message" placeholder="Enter your message here..." style="height: 10rem"></textarea>
|
||||
<label for="message">Message</label>
|
||||
<!-- <p tl:if="${#fields.hasErrors('message')}" tl:errorclass="text-danger" tl:errors="${contactobj.message}"></p>-->
|
||||
</div>
|
||||
<!-- Submit Button-->
|
||||
<div class="d-grid"><button class="btn btn-primary btn-lg" type="submit">Submit</button></div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
</body>
|
||||
</html>
|
29
src/main/resources/templates/error.html
Executable file
29
src/main/resources/templates/error.html
Executable file
@@ -0,0 +1,29 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Error Page</title>
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
<main class="flex-shrink-0 ">
|
||||
<!-- Navigation-->
|
||||
|
||||
<!-- Projects Section-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="center-screen px-5 mb-5">
|
||||
<div class="text-center error-page">
|
||||
|
||||
<div class="error-page-content">
|
||||
<h1>500</h1>
|
||||
<h2>An internal error has occured</h2>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi</p>
|
||||
<a href="/" class="btn btn-primary">Back To Home</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
76
src/main/resources/templates/faq.html
Executable file
76
src/main/resources/templates/faq.html
Executable file
@@ -0,0 +1,76 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>FAQ</title>
|
||||
<link rel="canonical" href="https://getbootstrap.com/docs/5.2/examples/cheatsheet/">
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
|
||||
<!-- Projects Section-->
|
||||
<!-- Projects Section-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="container px-5 mb-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bolder mb-0"><span class="text-gradient d-inline">FAQs</span></h1>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-start">
|
||||
|
||||
|
||||
<div class="bd-example-snippet bd-code-snippet"><div class="bd-example">
|
||||
<div class="accordion" id="accordionExample">
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingOne">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
|
||||
Accordion Item #1
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseOne" class="accordion-collapse collapse show" aria-labelledby="headingOne" data-bs-parent="#accordionExample" style="">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the first item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingTwo">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||
Accordion Item #2
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingThree">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||
Accordion Item #3
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseThree" class="accordion-collapse collapse" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
234
src/main/resources/templates/index.html
Executable file
234
src/main/resources/templates/index.html
Executable file
@@ -0,0 +1,234 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
||||
<meta name="description" content="" />
|
||||
<meta name="author" content="" />
|
||||
<title>HOME - robindhole.in</title>
|
||||
<!-- Favicon-->
|
||||
<link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
|
||||
<!-- Custom Google font-->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
|
||||
<!-- Bootstrap icons-->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css" rel="stylesheet" />
|
||||
<!-- Core theme CSS (includes Bootstrap)-->
|
||||
<link href="css/styles.css" rel="stylesheet" />
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-white py-3">
|
||||
<div class="container px-5">
|
||||
<a class="navbar-brand" href="index.html"><span class="fw-bolder text-primary">Robin Dhole</span></a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 small fw-bolder">
|
||||
<li class="nav-item"><a class="nav-link" href="/">Home</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/resume">Resume</a></li>
|
||||
<li class="nav-item"><a class="nav-link" href="/projects">Projects</a></li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="dropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
Tools
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuLink">
|
||||
<li><a class="dropdown-item" href="https://it-tools.robindhole.in/">IT-Tools</a></li>
|
||||
<li><a class="dropdown-item" href="https://draw.robindhole.in/">Draw.io</a></li>
|
||||
<li><a class="dropdown-item" href="https://search.robindhole.in/">Search Engine</a></li>
|
||||
<li><a class="dropdown-item" href="https://git.robindhole.in/">Gitea</a></li>
|
||||
<li><a class="dropdown-item" href="https://school.robindhole.in/kolibri">Kids Learning Kit</a></li>
|
||||
<li><a class="dropdown-item" href="https://school.robindhole.in/kiwix/">Doc Library</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item"><a class="nav-link" href="/contact">Contact</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<!-- Header-->
|
||||
<header class="py-5">
|
||||
<div class="container px-5 pb-5">
|
||||
<div class="row gx-5 align-items-center">
|
||||
<div class="col-xxl-5">
|
||||
<!-- Header text content-->
|
||||
<div class="text-center text-xxl-start">
|
||||
<div class="badge bg-gradient-primary-to-secondary text-white mb-4"><div class="text-uppercase">Design · Development · Deploy · Scale ·</div></div>
|
||||
<div class="fs-3 fw-light text-muted">I can help your business to</div>
|
||||
<h1 class="display-3 fw-bolder mb-5"><span class="text-gradient d-inline">Get online and grow fast</span></h1>
|
||||
<div class="d-grid gap-3 d-sm-flex justify-content-sm-center justify-content-xxl-start mb-3">
|
||||
<a class="btn btn-primary btn-lg px-5 py-3 me-sm-3 fs-6 fw-bolder" href="/resume">Resume</a>
|
||||
<a class="btn btn-outline-dark btn-lg px-5 py-3 fs-6 fw-bolder" href="/projects">Projects</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xxl-7">
|
||||
<!-- Header profile picture-->
|
||||
<div class="d-flex justify-content-center mt-5 mt-xxl-0">
|
||||
<div class="profile bg-gradient-primary-to-secondary">
|
||||
<!-- TIP: For best results, use a photo with a transparent background like the demo example below-->
|
||||
<!-- Watch a tutorial on how to do this on YouTube (link)-->
|
||||
<img class="profile-img" src="assets/profile.png" alt="..." />
|
||||
<div class="dots-1">
|
||||
<!-- SVG Dots-->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 191.6 1215.4" style="enable-background: new 0 0 191.6 1215.4" xml:space="preserve">
|
||||
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)">
|
||||
<path d="M227.7,12788.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,12801.6,289.7,12808.6,227.7,12788.6z"></path>
|
||||
<path d="M1507.7,12788.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,12801.6,1569.7,12808.6,1507.7,12788.6z"></path>
|
||||
<path d="M227.7,11508.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,11521.6,289.7,11528.6,227.7,11508.6z"></path>
|
||||
<path d="M1507.7,11508.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,11521.6,1569.7,11528.6,1507.7,11508.6z"></path>
|
||||
<path d="M227.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,10241.6,289.7,10248.6,227.7,10228.6z"></path>
|
||||
<path d="M1507.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,10241.6,1569.7,10248.6,1507.7,10228.6z"></path>
|
||||
<path d="M227.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,8961.6,289.7,8968.6,227.7,8948.6z"></path>
|
||||
<path d="M1507.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,8961.6,1569.7,8968.6,1507.7,8948.6z"></path>
|
||||
<path d="M227.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,7681.6,289.7,7688.6,227.7,7668.6z"></path>
|
||||
<path d="M1507.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,7681.6,1569.7,7688.6,1507.7,7668.6z"></path>
|
||||
<path d="M227.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,6401.6,289.7,6408.6,227.7,6388.6z"></path>
|
||||
<path d="M1507.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,6401.6,1569.7,6408.6,1507.7,6388.6z"></path>
|
||||
<path d="M227.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,5121.6,289.7,5128.6,227.7,5108.6z"></path>
|
||||
<path d="M1507.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,5121.6,1569.7,5128.6,1507.7,5108.6z"></path>
|
||||
<path d="M227.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,3841.6,289.7,3848.6,227.7,3828.6z"></path>
|
||||
<path d="M1507.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,3841.6,1569.7,3848.6,1507.7,3828.6z"></path>
|
||||
<path d="M227.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,2561.6,289.7,2568.6,227.7,2548.6z"></path>
|
||||
<path d="M1507.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,2561.6,1569.7,2568.6,1507.7,2548.6z"></path>
|
||||
<path d="M227.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,1281.6,289.7,1288.6,227.7,1268.6z"></path>
|
||||
<path d="M1507.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,1281.6,1569.7,1288.6,1507.7,1268.6z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
<!-- END of SVG dots-->
|
||||
</div>
|
||||
<div class="dots-2">
|
||||
<!-- SVG Dots-->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 191.6 1215.4" style="enable-background: new 0 0 191.6 1215.4" xml:space="preserve">
|
||||
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)">
|
||||
<path d="M227.7,12788.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,12801.6,289.7,12808.6,227.7,12788.6z"></path>
|
||||
<path d="M1507.7,12788.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,12801.6,1569.7,12808.6,1507.7,12788.6z"></path>
|
||||
<path d="M227.7,11508.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,11521.6,289.7,11528.6,227.7,11508.6z"></path>
|
||||
<path d="M1507.7,11508.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,11521.6,1569.7,11528.6,1507.7,11508.6z"></path>
|
||||
<path d="M227.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,10241.6,289.7,10248.6,227.7,10228.6z"></path>
|
||||
<path d="M1507.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,10241.6,1569.7,10248.6,1507.7,10228.6z"></path>
|
||||
<path d="M227.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,8961.6,289.7,8968.6,227.7,8948.6z"></path>
|
||||
<path d="M1507.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,8961.6,1569.7,8968.6,1507.7,8948.6z"></path>
|
||||
<path d="M227.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,7681.6,289.7,7688.6,227.7,7668.6z"></path>
|
||||
<path d="M1507.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,7681.6,1569.7,7688.6,1507.7,7668.6z"></path>
|
||||
<path d="M227.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,6401.6,289.7,6408.6,227.7,6388.6z"></path>
|
||||
<path d="M1507.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,6401.6,1569.7,6408.6,1507.7,6388.6z"></path>
|
||||
<path d="M227.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,5121.6,289.7,5128.6,227.7,5108.6z"></path>
|
||||
<path d="M1507.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,5121.6,1569.7,5128.6,1507.7,5108.6z"></path>
|
||||
<path d="M227.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,3841.6,289.7,3848.6,227.7,3828.6z"></path>
|
||||
<path d="M1507.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,3841.6,1569.7,3848.6,1507.7,3828.6z"></path>
|
||||
<path d="M227.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,2561.6,289.7,2568.6,227.7,2548.6z"></path>
|
||||
<path d="M1507.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,2561.6,1569.7,2568.6,1507.7,2548.6z"></path>
|
||||
<path d="M227.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,1281.6,289.7,1288.6,227.7,1268.6z"></path>
|
||||
<path d="M1507.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,1281.6,1569.7,1288.6,1507.7,1268.6z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
<!-- END of SVG dots-->
|
||||
</div>
|
||||
<div class="dots-3">
|
||||
<!-- SVG Dots-->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 191.6 1215.4" style="enable-background: new 0 0 191.6 1215.4" xml:space="preserve">
|
||||
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)">
|
||||
<path d="M227.7,12788.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,12801.6,289.7,12808.6,227.7,12788.6z"></path>
|
||||
<path d="M1507.7,12788.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,12801.6,1569.7,12808.6,1507.7,12788.6z"></path>
|
||||
<path d="M227.7,11508.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,11521.6,289.7,11528.6,227.7,11508.6z"></path>
|
||||
<path d="M1507.7,11508.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,11521.6,1569.7,11528.6,1507.7,11508.6z"></path>
|
||||
<path d="M227.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,10241.6,289.7,10248.6,227.7,10228.6z"></path>
|
||||
<path d="M1507.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,10241.6,1569.7,10248.6,1507.7,10228.6z"></path>
|
||||
<path d="M227.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,8961.6,289.7,8968.6,227.7,8948.6z"></path>
|
||||
<path d="M1507.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,8961.6,1569.7,8968.6,1507.7,8948.6z"></path>
|
||||
<path d="M227.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,7681.6,289.7,7688.6,227.7,7668.6z"></path>
|
||||
<path d="M1507.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,7681.6,1569.7,7688.6,1507.7,7668.6z"></path>
|
||||
<path d="M227.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,6401.6,289.7,6408.6,227.7,6388.6z"></path>
|
||||
<path d="M1507.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,6401.6,1569.7,6408.6,1507.7,6388.6z"></path>
|
||||
<path d="M227.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,5121.6,289.7,5128.6,227.7,5108.6z"></path>
|
||||
<path d="M1507.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,5121.6,1569.7,5128.6,1507.7,5108.6z"></path>
|
||||
<path d="M227.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,3841.6,289.7,3848.6,227.7,3828.6z"></path>
|
||||
<path d="M1507.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,3841.6,1569.7,3848.6,1507.7,3828.6z"></path>
|
||||
<path d="M227.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,2561.6,289.7,2568.6,227.7,2548.6z"></path>
|
||||
<path d="M1507.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,2561.6,1569.7,2568.6,1507.7,2548.6z"></path>
|
||||
<path d="M227.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,1281.6,289.7,1288.6,227.7,1268.6z"></path>
|
||||
<path d="M1507.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,1281.6,1569.7,1288.6,1507.7,1268.6z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
<!-- END of SVG dots-->
|
||||
</div>
|
||||
<div class="dots-4">
|
||||
<!-- SVG Dots-->
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 191.6 1215.4" style="enable-background: new 0 0 191.6 1215.4" xml:space="preserve">
|
||||
<g transform="translate(0.000000,1280.000000) scale(0.100000,-0.100000)">
|
||||
<path d="M227.7,12788.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,12801.6,289.7,12808.6,227.7,12788.6z"></path>
|
||||
<path d="M1507.7,12788.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,12801.6,1569.7,12808.6,1507.7,12788.6z"></path>
|
||||
<path d="M227.7,11508.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,11521.6,289.7,11528.6,227.7,11508.6z"></path>
|
||||
<path d="M1507.7,11508.6c-151-50-253-216-222-362c25-119,136-230,254-255c194-41,395,142,375,339c-11,105-90,213-190,262 C1663.7,11521.6,1569.7,11528.6,1507.7,11508.6z"></path>
|
||||
<path d="M227.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,10241.6,289.7,10248.6,227.7,10228.6z"></path>
|
||||
<path d="M1507.7,10228.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,10241.6,1569.7,10248.6,1507.7,10228.6z"></path>
|
||||
<path d="M227.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,8961.6,289.7,8968.6,227.7,8948.6z"></path>
|
||||
<path d="M1507.7,8948.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,8961.6,1569.7,8968.6,1507.7,8948.6z"></path>
|
||||
<path d="M227.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,7681.6,289.7,7688.6,227.7,7668.6z"></path>
|
||||
<path d="M1507.7,7668.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,7681.6,1569.7,7688.6,1507.7,7668.6z"></path>
|
||||
<path d="M227.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,6401.6,289.7,6408.6,227.7,6388.6z"></path>
|
||||
<path d="M1507.7,6388.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,6401.6,1569.7,6408.6,1507.7,6388.6z"></path>
|
||||
<path d="M227.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,5121.6,289.7,5128.6,227.7,5108.6z"></path>
|
||||
<path d="M1507.7,5108.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,5121.6,1569.7,5128.6,1507.7,5108.6z"></path>
|
||||
<path d="M227.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,3841.6,289.7,3848.6,227.7,3828.6z"></path>
|
||||
<path d="M1507.7,3828.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,3841.6,1569.7,3848.6,1507.7,3828.6z"></path>
|
||||
<path d="M227.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,2561.6,289.7,2568.6,227.7,2548.6z"></path>
|
||||
<path d="M1507.7,2548.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,2561.6,1569.7,2568.6,1507.7,2548.6z"></path>
|
||||
<path d="M227.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C383.7,1281.6,289.7,1288.6,227.7,1268.6z"></path>
|
||||
<path d="M1507.7,1268.6c-105-35-200-141-222-248c-43-206,163-412,369-369c155,32,275,190,260,339c-11,105-90,213-190,262 C1663.7,1281.6,1569.7,1288.6,1507.7,1268.6z"></path>
|
||||
</g>
|
||||
</svg>
|
||||
<!-- END of SVG dots-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- About Section-->
|
||||
<section class="bg-light py-5">
|
||||
<div class="container px-5">
|
||||
<div class="row gx-5 justify-content-center">
|
||||
<div class="col-xxl-8">
|
||||
<div class="text-center my-5">
|
||||
<h2 class="display-5 fw-bolder"><span class="text-gradient d-inline">About Me</span></h2>
|
||||
<p class="lead fw-light mb-4" >Hi, I'm Robin Dhole, a Java developer with a deep passion for working with computers and Linux-based systems. In my professional journey, I focus on developing solutions in the insurance and supply chain domains, where I leverage my expertise to build efficient, scalable applications that meet the unique challenges of these industries.
|
||||
<br />
|
||||
In addition to my work as a developer, I am an avid enthusiast of self-hosting services. I enjoy managing my own servers and deploying applications that I can control and scale as needed. I'm also highly experienced with Linux, particularly Proxmox, which I use for virtualization and container management to create flexible and reliable environments for my projects.
|
||||
<br />
|
||||
Whether it's building software for complex industries like insurance and supply chain or experimenting with new server setups, I’m always excited to push the boundaries of what I can achieve with technology. If you share an interest in development, Linux, or self-hosted services, feel free to connect—I love collaborating and learning from fellow tech enthusiasts!
|
||||
<p class="text-muted">If you're just curious about my story, or you just want to grab my résumé, you're in the right spot.</p>
|
||||
<div class="d-flex justify-content-center fs-2 gap-4">
|
||||
<a class="text-gradient" href="https://in.linkedin.com/in/dholerobin"><i class="bi bi-linkedin"></i></a>
|
||||
<a class="text-gradient" href="https://git.robindhole.in/explore/repos"><i class="bi bi-github"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- Footer-->
|
||||
<footer class="bg-white py-4 mt-auto">
|
||||
<div class="container px-5">
|
||||
<div class="row align-items-center justify-content-between flex-column flex-sm-row">
|
||||
<div class="col-auto"><div class="small m-0">Copyright © Robin Dhole 2025</div></div>
|
||||
<div class="col-auto">
|
||||
<a class="small" href="/privacy">Privacy</a>
|
||||
<span class="mx-1">·</span>
|
||||
<a class="small" href="terms">Terms</a>
|
||||
<span class="mx-1">·</span>
|
||||
<a class="small" href="contact">Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- Bootstrap core JS-->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<!-- Core theme JS-->
|
||||
<script src="js/scripts.js"></script>
|
||||
</body>
|
||||
</html>
|
98
src/main/resources/templates/layout.html
Executable file
98
src/main/resources/templates/layout.html
Executable file
@@ -0,0 +1,98 @@
|
||||
<!doctype html>
|
||||
<html lang="en"
|
||||
th:fragment="parent(content,title,script)"
|
||||
xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
|
||||
<meta name="description" content />
|
||||
<meta name="author" content />
|
||||
<title data-th-replace="${title}">Robin Dhole</title>
|
||||
<!-- Favicon-->
|
||||
<link rel="icon" type="image/x-icon" data-th-href="@{'assets/favicon.ico'}" />
|
||||
<!-- Custom Google font-->
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet" />
|
||||
<!-- Bootstrap icons-->
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.8.1/font/bootstrap-icons.css" rel="stylesheet" />
|
||||
<!-- Core theme CSS (includes Bootstrap)-->
|
||||
<link data-th-href="@{'/css/styles.css'}" rel="stylesheet" />
|
||||
|
||||
</head>
|
||||
<body class="d-flex flex-column">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-white py-3">
|
||||
<div class="container px-5">
|
||||
<a class="navbar-brand" data-th-href="@{'/'}"><span class="fw-bolder text-primary">Robin Dhole</span></a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
|
||||
<div class="collapse navbar-collapse" id="navbarSupportedContent">
|
||||
<ul class="navbar-nav ms-auto mb-2 mb-lg-0 small fw-bolder">
|
||||
<li class="nav-item"><a class="nav-link" data-th-href="@{'/'}">Home</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-th-href="@{'/resume'}">Resume</a></li>
|
||||
<li class="nav-item"><a class="nav-link" data-th-href="@{'/projects'}">Projects</a></li>
|
||||
<li class="nav-item dropdown">
|
||||
<a class="nav-link dropdown-toggle" href="#" id="dropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
Tools
|
||||
</a>
|
||||
<ul class="dropdown-menu" aria-labelledby="dropdownMenuLink">
|
||||
<li><a class="dropdown-item" href="https://it-tools.robindhole.in/">IT-Tools</a></li>
|
||||
<li><a class="dropdown-item" href="https://draw.robindhole.in/">Draw.io</a></li>
|
||||
<li><a class="dropdown-item" href="https://search.robindhole.in/">Search Engine</a></li>
|
||||
<li><a class="dropdown-item" href="https://git.robindhole.in/">Gitea</a></li>
|
||||
<li><a class="dropdown-item" href="https://school.robindhole.in/kolibri">Kids Learning Kit</a></li>
|
||||
<li><a class="dropdown-item" href="https://school.robindhole.in/kiwix/">Doc Library</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item"><a class="nav-link" data-th-href="@{'/contact'}">Contact</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<!-- Page content-->
|
||||
|
||||
<section class="py-5" data-th-replace="${content}">
|
||||
<div class="container px-5">
|
||||
<!-- Contact form-->
|
||||
<div class="bg-light rounded-4 py-5 px-4 px-md-5">
|
||||
<div class="text-center mb-5">
|
||||
<div class="feature bg-primary bg-gradient-primary-to-secondary text-white rounded-3 mb-3"><i class="bi bi-envelope"></i></div>
|
||||
<h1 class="fw-bolder">Get in touch</h1>
|
||||
<p class="lead fw-normal text-muted mb-0">Let's work together!</p>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-center">
|
||||
<div class="col-lg-8 col-xl-6" >
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<!-- Footer-->
|
||||
<footer class="bg-white py-4 mt-auto">
|
||||
<div class="container px-5">
|
||||
<div class="row align-items-center justify-content-between flex-column flex-sm-row">
|
||||
<div class="col-auto"><div class="small m-0">Copyright © Develop by Robin Dhole 2025</div></div>
|
||||
<div class="col-auto">
|
||||
<a class="small" href="/privacy">Privacy</a>
|
||||
<span class="mx-1">·</span>
|
||||
<a class="small" href="/faq">FAQ</a>
|
||||
<span class="mx-1">·</span>
|
||||
<a class="small" href=/contact>Contact</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<!-- Bootstrap core JS-->
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<!-- Core theme JS-->
|
||||
<script data-th-src="@{'/js/scripts.js'}"></script>
|
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *-->
|
||||
<!-- * * SB Forms JS * *-->
|
||||
<!-- * * Activate your form at https://startbootstrap.com/solution/contact-forms * *-->
|
||||
<!-- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *-->
|
||||
<!--<script src="https://cdn.startbootstrap.com/sb-forms-latest.js"></script>-->
|
||||
</body>
|
||||
</html>
|
202
src/main/resources/templates/privacy.html
Executable file
202
src/main/resources/templates/privacy.html
Executable file
@@ -0,0 +1,202 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Privacy Policies</title>
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
|
||||
<!-- Projects Section-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="container px-5 mb-5">
|
||||
<h1>Privacy Policy</h1>
|
||||
<p>Last updated: Jan 01, 2025</p>
|
||||
<p>This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.</p>
|
||||
<h2>Interpretation and Definitions</h2>
|
||||
<h3>Interpretation</h3>
|
||||
<p>The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.</p>
|
||||
<h3>Definitions</h3>
|
||||
<p>For the purposes of this Privacy Policy:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Account</strong> means a unique account created for You to access our Service or parts of our Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Affiliate</strong> means an entity that controls, is controlled by or is under common control with a party, where "control" means ownership of 50% or more of the shares, equity interest or other securities entitled to vote for election of directors or other managing authority.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Company</strong> (referred to as either "the Company", "We", "Us" or "Our" in this Agreement) refers to robindhole.in.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Cookies</strong> are small files that are placed on Your computer, mobile device or any other device by a website, containing the details of Your browsing history on that website among its many uses.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Country</strong> refers to: Maharashtra, India</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Device</strong> means any device that can access the Service such as a computer, a cellphone or a digital tablet.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Personal Data</strong> is any information that relates to an identified or identifiable individual.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Service</strong> refers to the Website.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Service Provider</strong> means any natural or legal person who processes the data on behalf of the Company. It refers to third-party companies or individuals employed by the Company to facilitate the Service, to provide the Service on behalf of the Company, to perform services related to the Service or to assist the Company in analyzing how the Service is used.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Usage Data</strong> refers to data collected automatically, either generated by the use of the Service or from the Service infrastructure itself (for example, the duration of a page visit).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Website</strong> refers to robindhole.in, accessible from <a href="https://robindhole.in." rel="external nofollow noopener" target="_blank">https://robindhole.in</a></p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>You</strong> means the individual accessing or using the Service, or the company, or other legal entity on behalf of which such individual is accessing or using the Service, as applicable.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h2>Collecting and Using Your Personal Data</h2>
|
||||
<h3>Types of Data Collected</h3>
|
||||
<h4>Personal Data</h4>
|
||||
<p>While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Email address</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>First name and last name</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Phone number</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Usage Data</p>
|
||||
</li>
|
||||
</ul>
|
||||
<h4>Usage Data</h4>
|
||||
<p>Usage Data is collected automatically when using the Service.</p>
|
||||
<p>Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.</p>
|
||||
<p>When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.</p>
|
||||
<p>We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.</p>
|
||||
<h4>Tracking Technologies and Cookies</h4>
|
||||
<p>We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:</p>
|
||||
<ul>
|
||||
<li><strong>Cookies or Browser Cookies.</strong> A cookie is a small file placed on Your Device. You can instruct Your browser to refuse all Cookies or to indicate when a Cookie is being sent. However, if You do not accept Cookies, You may not be able to use some parts of our Service. Unless you have adjusted Your browser setting so that it will refuse Cookies, our Service may use Cookies.</li>
|
||||
<li><strong>Web Beacons.</strong> Certain sections of our Service and our emails may contain small electronic files known as web beacons (also referred to as clear gifs, pixel tags, and single-pixel gifs) that permit the Company, for example, to count users who have visited those pages or opened an email and for other related website statistics (for example, recording the popularity of a certain section and verifying system and server integrity).</li>
|
||||
</ul>
|
||||
<p>Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. You can learn more about cookies on <a href="https://www.termsfeed.com/blog/cookies/#What_Are_Cookies" target="_blank">TermsFeed website</a> article.</p>
|
||||
<p>We use both Session and Persistent Cookies for the purposes set out below:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Necessary / Essential Cookies</strong></p>
|
||||
<p>Type: Session Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies are essential to provide You with services available through the Website and to enable You to use some of its features. They help to authenticate users and prevent fraudulent use of user accounts. Without these Cookies, the services that You have asked for cannot be provided, and We only use these Cookies to provide You with those services.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Cookies Policy / Notice Acceptance Cookies</strong></p>
|
||||
<p>Type: Persistent Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies identify if users have accepted the use of cookies on the Website.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Functionality Cookies</strong></p>
|
||||
<p>Type: Persistent Cookies</p>
|
||||
<p>Administered by: Us</p>
|
||||
<p>Purpose: These Cookies allow us to remember choices You make when You use the Website, such as remembering your login details or language preference. The purpose of these Cookies is to provide You with a more personal experience and to avoid You having to re-enter your preferences every time You use the Website.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.</p>
|
||||
<h3>Use of Your Personal Data</h3>
|
||||
<p>The Company may use Personal Data for the following purposes:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>To provide and maintain our Service</strong>, including to monitor the usage of our Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To manage Your Account:</strong> to manage Your registration as a user of the Service. The Personal Data You provide can give You access to different functionalities of the Service that are available to You as a registered user.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For the performance of a contract:</strong> the development, compliance and undertaking of the purchase contract for the products, items or services You have purchased or of any other contract with Us through the Service.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To contact You:</strong> To contact You by email, telephone calls, SMS, or other equivalent forms of electronic communication, such as a mobile application's push notifications regarding updates or informative communications related to the functionalities, products or contracted services, including the security updates, when necessary or reasonable for their implementation.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To provide You</strong> with news, special offers and general information about other goods, services and events which we offer that are similar to those that you have already purchased or enquired about unless You have opted not to receive such information.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>To manage Your requests:</strong> To attend and manage Your requests to Us.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For business transfers:</strong> We may use Your information to evaluate or conduct a merger, divestiture, restructuring, reorganization, dissolution, or other sale or transfer of some or all of Our assets, whether as a going concern or as part of bankruptcy, liquidation, or similar proceeding, in which Personal Data held by Us about our Service users is among the assets transferred.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>For other purposes</strong>: We may use Your information for other purposes, such as data analysis, identifying usage trends, determining the effectiveness of our promotional campaigns and to evaluate and improve our Service, products, services, marketing and your experience.</p>
|
||||
</li>
|
||||
</ul>
|
||||
<p>We may share Your personal information in the following situations:</p>
|
||||
<ul>
|
||||
<li><strong>With Service Providers:</strong> We may share Your personal information with Service Providers to monitor and analyze the use of our Service, to contact You.</li>
|
||||
<li><strong>For business transfers:</strong> We may share or transfer Your personal information in connection with, or during negotiations of, any merger, sale of Company assets, financing, or acquisition of all or a portion of Our business to another company.</li>
|
||||
<li><strong>With Affiliates:</strong> We may share Your information with Our affiliates, in which case we will require those affiliates to honor this Privacy Policy. Affiliates include Our parent company and any other subsidiaries, joint venture partners or other companies that We control or that are under common control with Us.</li>
|
||||
<li><strong>With business partners:</strong> We may share Your information with Our business partners to offer You certain products, services or promotions.</li>
|
||||
<li><strong>With other users:</strong> when You share personal information or otherwise interact in the public areas with other users, such information may be viewed by all users and may be publicly distributed outside.</li>
|
||||
<li><strong>With Your consent</strong>: We may disclose Your personal information for any other purpose with Your consent.</li>
|
||||
</ul>
|
||||
<h3>Retention of Your Personal Data</h3>
|
||||
<p>The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.</p>
|
||||
<p>The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.</p>
|
||||
<h3>Transfer of Your Personal Data</h3>
|
||||
<p>Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.</p>
|
||||
<p>Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.</p>
|
||||
<p>The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.</p>
|
||||
<h3>Delete Your Personal Data</h3>
|
||||
<p>You have the right to delete or request that We assist in deleting the Personal Data that We have collected about You.</p>
|
||||
<p>Our Service may give You the ability to delete certain information about You from within the Service.</p>
|
||||
<p>You may update, amend, or delete Your information at any time by signing in to Your Account, if you have one, and visiting the account settings section that allows you to manage Your personal information. You may also contact Us to request access to, correct, or delete any personal information that You have provided to Us.</p>
|
||||
<p>Please note, however, that We may need to retain certain information when we have a legal obligation or lawful basis to do so.</p>
|
||||
<h3>Disclosure of Your Personal Data</h3>
|
||||
<h4>Business Transactions</h4>
|
||||
<p>If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.</p>
|
||||
<h4>Law enforcement</h4>
|
||||
<p>Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).</p>
|
||||
<h4>Other legal requirements</h4>
|
||||
<p>The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:</p>
|
||||
<ul>
|
||||
<li>Comply with a legal obligation</li>
|
||||
<li>Protect and defend the rights or property of the Company</li>
|
||||
<li>Prevent or investigate possible wrongdoing in connection with the Service</li>
|
||||
<li>Protect the personal safety of Users of the Service or the public</li>
|
||||
<li>Protect against legal liability</li>
|
||||
</ul>
|
||||
<h3>Security of Your Personal Data</h3>
|
||||
<p>The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.</p>
|
||||
<h2>Children's Privacy</h2>
|
||||
<p>Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.</p>
|
||||
<p>If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.</p>
|
||||
<h2>Links to Other Websites</h2>
|
||||
<p>Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.</p>
|
||||
<p>We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.</p>
|
||||
<h2>Changes to this Privacy Policy</h2>
|
||||
<p>We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.</p>
|
||||
<p>We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.</p>
|
||||
<p>You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.</p>
|
||||
<h2>Contact Us</h2>
|
||||
<p>If you have any questions about this Privacy Policy, You can contact us:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>By email: dholerobin@gmail.com</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>By visiting this page on our website: <a href="https://robindhole.in/contact" rel="external nofollow noopener" target="_blank">https://robindhole.in/contact</a></p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
98
src/main/resources/templates/projects.html
Executable file
98
src/main/resources/templates/projects.html
Executable file
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Projects - Code NetworkZ</title>
|
||||
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
|
||||
<!-- Projects Section-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="container px-5 mb-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bolder mb-0"><span class="text-gradient d-inline">Projects</span></h1>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-center">
|
||||
<div class="col-lg-11 col-xl-9 col-xxl-8">
|
||||
<!-- Project Card 1-->
|
||||
<div class="card overflow-hidden shadow rounded-4 border-0 mb-5">
|
||||
<div class="card-body p-0">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="p-5">
|
||||
<h2 class="fw-bolder text-center text-bg-primary">EPIC</h2>
|
||||
<p>Developed EPIC, an office application designed to streamline insurance policy
|
||||
management. EPIC includes features such as premium calculation, medical test
|
||||
scheduling, and comprehensive coverage options for individuals or couples. The
|
||||
application aims to enhance user convenience by providing easy access to a
|
||||
diverse range of insurance policies.</p>
|
||||
<p>Technology:
|
||||
Java 8, Spring Boot, Spring data Jpa, Sleuth, LDAP, Oracle Database, IBM BPM Process Inspector, IBM RestAPI
|
||||
Tester, Azure DevOps with internal GIT to version control, Red hat Enterprise Linux, Kafka/Zookeeper,
|
||||
Log4j/Slf4j, Docker, Spring Tools Suite, Postman, Arcon PAM, VPC, Oracle Developer, SoapUI, Spring API
|
||||
Gateway (Zuul), Discovery Server, Spring Cloud Config service etc.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Project Card 2-->
|
||||
<div class="card overflow-hidden shadow rounded-4 border-0 mb-5" >
|
||||
<div class="card-body p-0">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="p-5">
|
||||
<h2 class="fw-bolder text-center text-bg-primary">SWF</h2>
|
||||
<p class="text-justify">Our web form streamlines insurance policy tasks. Users request claims, financial documents, service updates, and personal detail changes. Queries are sent to the EPIC System for validation. Once verified, EPIC updates the policy.</p>
|
||||
<p>Technology Java 8, Spring Boot, Spring Data JPA, Microsoft TFS/Git, Docker, Jenkins for deployment</p>
|
||||
<a href="https://care.kotaklifeinsurance.com/webform#s" alt="..." target="_blank" class="btn btn-dark btn-lg " tabindex="-1" role="button" aria-disabled="true"> link</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Project Card 2-->
|
||||
<div class="card overflow-hidden shadow rounded-4 border-0 mb-5">
|
||||
<div class="card-body p-0">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="p-5 text-justify">
|
||||
<h2 class="fw-bolder text-center text-bg-primary">AMIGO</h2>
|
||||
<p>Amigo is a user-friendly application for managing insurance policies. It allows
|
||||
users to purchase policies, add nominees, pay premiums, check policy status,
|
||||
download documents, and maintain premium records efficiently.</p>
|
||||
|
||||
<p class="text-bold">Technology : Java, Spring Boot, Spring Data JPA, Microsoft TFS/Git, Docker, Jenkins for deployment.</p>
|
||||
<a href="https://care.kotaklifeinsurance.com/" alt="..." target="_blank" class="btn btn-dark btn-lg" tabindex="-1" role="button" aria-disabled="true"> link</a>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Project Card 2-->
|
||||
<div class="card overflow-hidden shadow rounded-4 border-0 mb-5">
|
||||
<div class="card-body p-0">
|
||||
<div class="d-flex align-items-center">
|
||||
<div class="p-5">
|
||||
<h2 class="fw-bolder text-center text-bg-primary">VDMS</h2>
|
||||
<p>Developed VDMS, a central server application responsible for handling parts and
|
||||
transaction information from a warehouse. Established communication between VDMS
|
||||
and an E-Commerce Application using secure web services, serving as a medium for
|
||||
exchanging data. Implemented a supportive administration system within VDMS,
|
||||
facilitating the generation of transaction reports and graphs. Utilized report
|
||||
manager services to handle the generation and management of transaction reports
|
||||
and graphs, enhancing the administrative capabilities of the system.</p>
|
||||
<p>Technology :Java, JSP, Spring Mvc ,Hibernate, JPA, Oracle etc.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
12
src/main/resources/templates/result.html
Executable file
12
src/main/resources/templates/result.html
Executable file
@@ -0,0 +1,12 @@
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="ISO-8859-1">
|
||||
<title>Thanks for your contacting us</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div>
|
||||
Thanks for your contacting us
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
224
src/main/resources/templates/resume.html
Executable file
224
src/main/resources/templates/resume.html
Executable file
@@ -0,0 +1,224 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Resume - Code NetworkZ</title>
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
|
||||
<!-- Page Content-->
|
||||
<div class="container px-5 my-5" id="content">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bolder mb-0"><span class="text-gradient d-inline">Resume</span></h1>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-center">
|
||||
<div class="col-lg-11 col-xl-9 col-xxl-8">
|
||||
<!-- Experience Section-->
|
||||
<section>
|
||||
<div class="d-flex align-items-center justify-content-between mb-4">
|
||||
<h2 class="text-primary fw-bolder mb-0">Experience</h2>
|
||||
<!-- Download resume button-->
|
||||
<!-- Note: Set the link href target to a PDF file within your project-->
|
||||
<a class="btn btn-primary px-4 py-3" href="robin_rajendra_dhole_resume.pdf">
|
||||
<div class="d-inline-block bi bi-download me-2"></div>
|
||||
Download Resume
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center gx-5">
|
||||
<div class="col text-center text-lg-start mb-4 mb-lg-0">
|
||||
<div class="bg-light p-4 rounded-4">
|
||||
<div class="text-primary fw-bolder mb-2">Oct 2021 - Jul 2023</div>
|
||||
<div class="small fw-bolder">Consultant</div>
|
||||
<div class="small text-muted">MindCraft Software</div>
|
||||
<div class="small text-muted">Mumbai, India</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8">
|
||||
<div>
|
||||
As developers, we build software solutions for insurance domain projects. I am working on Amigo, SWF, and EPIC projects.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Experience Card 2-->
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center gx-5">
|
||||
<div class="col text-center text-lg-start mb-4 mb-lg-0">
|
||||
<div class="bg-light p-4 rounded-4">
|
||||
<div class="text-primary fw-bolder mb-2">Apr 2020 - Oct 2021</div>
|
||||
<div class="small fw-bolder">Java Developer</div>
|
||||
<div class="small text-muted">FX ABS Software Solution </div>
|
||||
<div class="small text-muted">Hyderabad, India</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8"><div>As developers, we build software solutions for Supply Chain domain projects. I am working on VDMS projects.</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<!-- Education Section-->
|
||||
<section>
|
||||
<h2 class="text-secondary fw-bolder mb-4">Education</h2>
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center gx-5">
|
||||
<div class="col text-center text-lg-start mb-4 mb-lg-0">
|
||||
<div class="bg-light p-4 rounded-4">
|
||||
<div class="text-secondary fw-bolder mb-2">2023 - 2024</div>
|
||||
<div class="mb-2">
|
||||
<div class="small fw-bolder">Scaler</div>
|
||||
<div class="small text-muted">Remote, India</div>
|
||||
</div>
|
||||
<div class="fst-italic">
|
||||
<div class="small text-muted">Bachelor's</div>
|
||||
<div class="small text-muted">Arts</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8"><div> Learing problems Solving, Data Structure and Algorithms, Low Level Design and High Level Design</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Education Card 1-->
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center gx-5">
|
||||
<div class="col text-center text-lg-start mb-4 mb-lg-0">
|
||||
<div class="bg-light p-4 rounded-4">
|
||||
<div class="text-secondary fw-bolder mb-2">2013 - 2015</div>
|
||||
<div class="mb-2">
|
||||
<div class="small fw-bolder">YCMOU</div>
|
||||
<div class="small text-muted">Nashik, India</div>
|
||||
</div>
|
||||
<div class="fst-italic">
|
||||
<div class="small text-muted">Bachelor's</div>
|
||||
<div class="small text-muted">Arts</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8"><div>
|
||||
Bachelor's of Arts degree with a focus on Marathi Language and History
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Education Card 1-->
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<div class="row align-items-center gx-5">
|
||||
<div class="col text-center text-lg-start mb-4 mb-lg-0">
|
||||
<div class="bg-light p-4 rounded-4">
|
||||
<div class="text-secondary fw-bolder mb-2">2011 - 2012</div>
|
||||
<div class="mb-2">
|
||||
<div class="small fw-bolder">BCCA</div>
|
||||
<div class="small text-muted">Nagpur, India</div>
|
||||
</div>
|
||||
<div class="fst-italic">
|
||||
<div class="small text-muted">Bachelor's</div>
|
||||
<div class="small text-muted">BCCA (Dropout)</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-8"><div>
|
||||
Bachelor of Commerce in Computer Application (BCCA) degree with a focus on Accounting and Computer knowledge. </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</section>
|
||||
<!-- Divider-->
|
||||
<div class="pb-5"></div>
|
||||
<!-- Skills Section-->
|
||||
<section>
|
||||
<!-- Skillset Card-->
|
||||
<div class="card shadow border-0 rounded-4 mb-5">
|
||||
<div class="card-body p-5">
|
||||
<!-- Professional skills list-->
|
||||
<div class="mb-5">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature bg-primary bg-gradient-primary-to-secondary text-white rounded-3 me-3"><i class="bi bi-tools"></i></div>
|
||||
<h3 class="fw-bolder mb-0"><span class="text-gradient d-inline">Professional Skills</span></h3>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Java Development </div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Statistical Analysis</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Web Development</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">RestFull Api Integration</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Soup Api Integration</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Event Driven Development</div></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Languages list-->
|
||||
<div class="mb-0">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature bg-primary bg-gradient-primary-to-secondary text-white rounded-3 me-3"><i class="bi bi-code-slash"></i></div>
|
||||
<h3 class="fw-bolder mb-0"><span class="text-gradient d-inline">Languages</span></h3>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">HTML</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">CSS</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Bootstrap</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Java</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">SQL</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Spring Boot</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Spring Cloud</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Microservice</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Monolith</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">JSON </div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">XML</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">YML</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Kafka</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Docker</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Kubernetes</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Prometheus</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Splunk</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Zipkin</div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Grafana</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Jenkins</div></div>
|
||||
</div>
|
||||
</div><br />
|
||||
<!-- Languages list-->
|
||||
<div class="mb-0">
|
||||
<div class="d-flex align-items-center mb-4">
|
||||
<div class="feature bg-primary bg-gradient-primary-to-secondary text-white rounded-3 me-3"><i class="bi bi-code-slash"></i></div>
|
||||
<h3 class="fw-bolder mb-0"><span class="text-gradient d-inline">Others Skill</span></h3>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Hardware & Networking</div></div>
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Windows Service Configuration</div></div>
|
||||
<div class="col"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Use Linux like Debian, Fedora, Arch based </div></div>
|
||||
</div>
|
||||
<div class="row row-cols-1 row-cols-md-3 mb-4">
|
||||
<div class="col mb-4 mb-md-0"><div class="d-flex align-items-center bg-light rounded-4 p-3 h-100">Microsft Word/Excel </div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
66
src/main/resources/templates/terms.html
Executable file
66
src/main/resources/templates/terms.html
Executable file
@@ -0,0 +1,66 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en"
|
||||
th:replace="~{layout :: parent(~{::#content},~{::title},~{::script})}">
|
||||
<head>
|
||||
<title>Terms And Conditions</title>
|
||||
</head>
|
||||
<body class="d-flex flex-column h-100 bg-light">
|
||||
<main class="flex-shrink-0">
|
||||
<!-- Navigation-->
|
||||
|
||||
<!-- Projects Section-->
|
||||
<section class="py-5" id="content">
|
||||
<div class="container px-5 mb-5">
|
||||
<div class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bolder mb-0"><span class="text-gradient d-inline">FAQs</span></h1>
|
||||
</div>
|
||||
<div class="row gx-5 justify-content-start">
|
||||
|
||||
|
||||
<div class="bd-example-snippet bd-code-snippet"><div class="bd-example">
|
||||
<div class="accordion" id="accordionExample">
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingOne">
|
||||
<button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
|
||||
Accordion Item #1
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseOne" class="accordion-collapse collapse show" aria-labelledby="headingOne" data-bs-parent="#accordionExample" style="">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the first item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingTwo">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||
Accordion Item #2
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseTwo" class="accordion-collapse collapse" aria-labelledby="headingTwo" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the second item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h4 class="accordion-header" id="headingThree">
|
||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
|
||||
Accordion Item #3
|
||||
</button>
|
||||
</h4>
|
||||
<div id="collapseThree" class="accordion-collapse collapse" aria-labelledby="headingThree" data-bs-parent="#accordionExample">
|
||||
<div class="accordion-body">
|
||||
<strong>This is the third item's accordion body.</strong> It is hidden by default, until the collapse plugin adds the appropriate classes that we use to style each element. These classes control the overall appearance, as well as the showing and hiding via CSS transitions. You can modify any of this with custom CSS or overriding our default variables. It's also worth noting that just about any HTML can go within the <code>.accordion-body</code>, though the transition does limit overflow.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
@@ -0,0 +1,13 @@
|
||||
package com.codenetworkz.portfoliowebsite;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
@SpringBootTest
|
||||
class PortfolioWebsiteApplicationTests {
|
||||
|
||||
@Test
|
||||
void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user