최초 커밋

master
mjkhan21 1 year ago
commit d4a18aef89

69
.gitignore vendored

@ -0,0 +1,69 @@
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/
### 로그 ###
logs/
### 프로젝트 내 생성되는 파일 ###
files/
### 시군구별 설정파일 ###
src/main/resources/application.yml
src/main/resources/xit-crypto.conf
src/main/resources/xit-syslog.conf
src/main/resources/intf-conf
src/main/resources/intf-conf/disabled-parking.conf
src/main/resources/intf-conf/file-job.conf
src/main/resources/intf-conf/gpki.conf
src/main/resources/intf-conf/lntris.conf
src/main/resources/intf-conf/xit-lvis.properties
src/main/resources/template
src/main/resources/template/disabled-parking-request.xml
src/main/resources/spring
src/main/resources/spring/context-scheduler.xml
src/main/resources/ssl
src/main/resources/ssl/fims.cer
src/main/resources/ssl/fimskeystore.pkcs12
src/main/resources/ssl/fimstrust.pkcs12
src/main/resources/.keystore
src/main/resources/log4jdbc.log4j2.properties
src/main/resources/logback-spring.xml
src/main/resources/sgg.txt

Binary file not shown.

@ -0,0 +1,18 @@
# 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
#
# https://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.
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.7/apache-maven-3.8.7-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.1/maven-wrapper-3.1.1.jar

1840
.pmd

File diff suppressed because it is too large Load Diff

@ -0,0 +1,11 @@
# 과태료 통합 관리 시스템
### 시군구별 설정 파일
```text
로컬에서 서버 기동시
https://nas.xit.co.kr:5001(211.119.124.120)의 네트워크 드라이브에서
"/03. 연구개발실/fims설정파일"에 시군구별 폴더가 있고 해당 시군구 폴더의 파일들을
src/main/resources폴더로 복사 후 기동한다.
```

316
mvnw vendored

@ -0,0 +1,316 @@
#!/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
#
# https://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.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /usr/local/etc/mavenrc ] ; then
. /usr/local/etc/mavenrc
fi
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
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"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`\\unset -f command; \\command -v java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

188
mvnw.cmd vendored

@ -0,0 +1,188 @@
@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 https://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 Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% ^
%JVM_CONFIG_MAVEN_PROPS% ^
%MAVEN_OPTS% ^
%MAVEN_DEBUG_OPTS% ^
-classpath %WRAPPER_JAR% ^
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%"=="on" pause
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
cmd /C exit /B %ERROR_CODE%

@ -0,0 +1,78 @@
<?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>2.7.18</version>
<relativePath/>
</parent>
<groupId>xit-app</groupId>
<artifactId>fims-chongno</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>fims-chongno</name>
<description>특별관리지역 통행제한 과태료 시스템</description>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>17</java.version>
</properties>
<repositories>
<repository>
<id>maven-public</id>
<url>https://nas.xit.co.kr:8888/repository/maven-public/</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-public</id>
<url>https://nas.xit.co.kr:8888/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
<dependencies>
<!-- 1.fims-java-* -->
<dependency>
<groupId>cokr.xit.app</groupId>
<artifactId>fims-java-all</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cokr.xit.app</groupId>
<artifactId>fims-web-all</artifactId>
<version>1.0.0-SNAPSHOT</version>
</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,57 @@
package cokr.xit.fims.chongno;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.List;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.io.ClassPathResource;
import cokr.xit.base.ServletCustomizer;
import cokr.xit.fims.SpringBootApplicationBridge;
import cokr.xit.fims.task.TaskMvcConfig;
@ImportAutoConfiguration({ServletCustomizer.class,TaskMvcConfig.class})
@ComponentScan(basePackageClasses = cokr.xit.applib.HttpStatusCodeExceptionControllerAdvice.class)
public class MainApplication extends SpringBootApplicationBridge {
public static void main(String[] args) {
allowRestrictedHeaders();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new ClassPathResource("sgg.txt").getInputStream()));
String sgg = in.readLine();
System.setProperty("sgg", sgg);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
SpringApplication.run(MainApplication.class, args);
}
public static void allowRestrictedHeaders() {
String allowRestrictedHeaders = System.getProperty("jdk.httpclient.allowRestrictedHeaders");
if(allowRestrictedHeaders == null) {
allowRestrictedHeaders = "";
}
List<String> allowRestrictedHeadersArr = Arrays.asList(allowRestrictedHeaders.split(","));
String[] items = {"connection","host","content-length","expect","upgrade"};
for(String item : items) {
if(!allowRestrictedHeadersArr.contains(item)) {
if(!allowRestrictedHeaders.equals("")) {
allowRestrictedHeaders += ",";
}
allowRestrictedHeaders += item;
}
}
System.setProperty("jdk.httpclient.allowRestrictedHeaders", allowRestrictedHeaders);
}
}

@ -0,0 +1,838 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<div class="wrapper-dashboard">
<div id="card1" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-cctv-fixed w-px-30 d-block" title="고정형CCTV"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-crackdown-road w-px-30 d-block" title="도보"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-cctv-drive w-px-30 d-block" title="주행형CCTV"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card1-4">
<span class="skeleton">?/?</span>
</p>
<i class="svg-crackdown-minwon w-px-30 d-block" title="민원"></i>
</div>
</div>
<div class="card-footer ms-auto">
<a href="#" id="btnGoToCrdn">단속관리 바로가기 ></a>
</div>
</div>
<div id="card2" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card2-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-target-lvy w-px-30 d-block" title="등록대상"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card2-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-target-transfer w-px-30 d-block" title="이첩대상"></i>
</div>
</div>
<div class="card-footer ms-auto">
</div>
</div>
<div id="card3" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card3-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-guide w-px-30 d-block" title="계도장 발송현황"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card3-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-before w-px-30 d-block" title="사전통보 발송현황"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card3-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-nop w-px-30 d-block" title="고지서 발송현황"></i>
</div>
</div>
<div class="card-footer ms-auto">
</div>
</div>
<div id="card4" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card4-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-rcp w-px-30 d-block" title="접수"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card4-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-decision w-px-30 d-block" title="수용/미수용"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card4-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-selfdrop w-px-30 d-block" title="자진취하"></i>
</div>
</div>
<div class="card-footer ms-auto">
<a href="#" id="btnGoToOpnn">의견진술관리 바로가기 ></a>
</div>
</div>
</div>
<div class="wrapper-dashboard">
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">단속 자료 통계(유형별)</h5>
<div>건수(최근 15일)</div>
</div>
<div class="card-body d-flex justify-content-center" id="lineChartCardBody">
<canvas id="lineChart" class="chartjs mh-px-300" data-height="500"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">단속통계</h5>
<div>처리유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart1CardBody">
<canvas id="doughnutChart1" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">발송통계</h5>
<div>발송유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart2CardBody">
<canvas id="doughnutChart2" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">의견진술통계</h5>
<div>처리유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart3CardBody">
<canvas id="doughnutChart3" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
</div>
<c:set var="dashboardScript" scope="request">
LoadScript("chartScript",wctx.url("/webjars/3rd-party/sneat/libs/chartjs/chartjs.js"));
var falseLineChart = `<svg xmlns="http://www.w3.org/2000/svg" class="skeleton"
height="250" viewBox="0 0 24 24">
<path class="skeleton" d="M3 3v17a1 1 0 0 0 1 1h17v-2H5V3H3z"></path>
<path class="skeleton" d="M15.293 14.707a.999.999 0 0 0 1.414 0l5-5-1.414-1.414L16 12.586l-2.293-2.293a.999.999 0 0 0-1.414 0l-5 5 1.414 1.414L13 12.414l2.293 2.293z"></path>
</svg>`;
var falseDoughnutChart = `<svg xmlns="http://www.w3.org/2000/svg" class="skeleton"
height="250" viewBox="0 0 24 24">
<path class="skeleton" d="M13 6c2.507.423 4.577 2.493 5 5h4c-.471-4.717-4.283-8.529-9-9v4z"></path>
<path class="skeleton" d="M18 13c-.478 2.833-2.982 4.949-5.949 4.949-3.309 0-6-2.691-6-6C6.051 8.982 8.167 6.478 11 6V2c-5.046.504-8.949 4.773-8.949 9.949 0 5.514 4.486 10 10 10 5.176 0 9.445-3.903 9.949-8.949h-4z"></path>
</svg>`;
var statReqArr = [];
fnMakeSkeleton();
AppSupport.sleep(3000).then(() => fnMakeStatReq($("#layout-navbar input[name='taskSeCd']:checked").val()));
//데이터 로딩 전 이미지 표시
function fnMakeSkeleton(){
$("#lineChart").hide();
$("#doughnutChart1").hide();
$("#doughnutChart2").hide();
$("#doughnutChart3").hide();
$("#lineChartCardBody").append(falseLineChart);
$("#doughnutChart1CardBody").append(falseDoughnutChart);
$("#doughnutChart2CardBody").append(falseDoughnutChart);
$("#doughnutChart3CardBody").append(falseDoughnutChart);
}
//통계 요청 데이터 생성(여러 건)
function fnMakeStatReq(taskSeCd){
var lastDay = TODAY().replaceAll("-","");
var firstDay = DateSupport.getAddDay(-14).replaceAll("-","");
var defaultQuery = {};
//단속구분별 전체/완료 건수
defaultQuery = {
structureType : "dummy",
statDomain : "crdn",
groupInfoList : [
{
refCol : "CRDN_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM002"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM002",
sourceCodes : ["08","09","10","11"],
targetCode : "minwon",
targetCodeVal : "민원"
},
{
sourceGroup : "FIM002",
sourceCodes : ["06","13"],
targetCode : "dobo",
targetCodeVal : "도보"
}
],
fixedItemId : ["01","02","minwon","dobo"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card1",
statType : "progressAndTotal"
});
//초기자료처리별 전체/완료건수
defaultQuery = {
structureType : "dummy",
statDomain : "crdn",
groupInfoList : [
{
refCol : "등록대상이첩대상구분",
ctgrType : "code",
dtlCtgr : "FIM999"
}
],
fixedItemId : ["등록대상","이첩대상"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card2",
statType : "progressAndTotal"
});
//발송문서별 전체/완료 건수
defaultQuery = {
structureType : "dummy",
statDomain : "sndb",
groupInfoList : [
{
refCol : "SNDNG_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM047"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM047",
sourceCodes : ["01","02"],
targetCode : "satong",
targetCodeVal : "사전통지서"
}
],
fixedItemId : ["satong", "03", "11"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card3",
statType : "progressAndTotal"
});
//의견진술자료상태
defaultQuery = {
structureType : "dummy",
statDomain : "excl",
groupInfoList : [
{
refCol : "OPNN_SBMSN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM031"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM031",
sourceCodes : ["01","02"],
targetCode : "acceptOrNonAccept",
targetCodeVal : "수용/미수용"
}
],
fixedItemId : ["00", "acceptOrNonAccept", "03"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card4",
statType : "progressAndTotal"
});
//단속구분별 최근n일 건수
defaultQuery = {
structureType : "aggregate",
statDomain : "crdn",
groupInfoList : [
{
refCol : "CRDN_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM002"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM002",
sourceCodes : ["08","09","10","11"],
targetCode : "minwon",
targetCodeVal : "민원"
},
{
sourceGroup : "FIM002",
sourceCodes : ["06","13"],
targetCode : "dobo",
targetCodeVal : "도보"
}
],
fixedItemId : ["01","02","dobo","minwon"],
namedNumberValueSeperator : "lastFewDays",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "CRDN_YMD",
dayRange : 15
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "lineChart",
statType : "line"
});
//초기자료처리별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "crdnSttsHstry",
groupInfoList : [
{
refCol : "CRDN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM010"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM010",
sourceCodes : ["21"],
targetCode : "dansokProcess",
targetCodeVal : "단속"
}
],
fixedItemId : ["dansokProcess","81","83"],
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart1",
statType : "doughnut"
});
//발송문서종류별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "sndb",
groupInfoList : [
{
refCol : "SNDNG_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM047"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM047",
sourceCodes : ["01","02"],
targetCode : "satong",
targetCodeVal : "사전통지서"
}
],
fixedItemId : ["satong", "03", "11"],
taskSeCd : taskSeCd,
dayColumn : "SNDNG_YMD",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart2",
statType : "doughnut"
});
//의견진술결과별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "excl",
groupInfoList : [
{
refCol : "OPNN_SBMSN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM031"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
fixedItemId : ["01", "02", "03"],
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = FimsSupport.fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart3",
statType : "doughnut"
});
fnLoadStatisticsData();
}
//통계 데이터 조회
function fnLoadStatisticsData(){
var statArr = statReqArr.pop();
ajax.get({
url : wctx.url("/stat/stat01/010/info.do"),
data : statArr.query,
success : (resp) => {
var statData = resp.stat;
if(statData != null && statData.statItems != null){
fnRenderDashboardContents(statData, statArr.cursor , statArr.statType);
}
if(statReqArr.length != 0){
fnLoadStatisticsData();
}
}
});
}
//대시보드 콘텐츠 표시
function fnRenderDashboardContents(returnData, cursor, statType){
if(statType == "progressAndTotal"){
fnRenderProgressAndTotal(returnData, cursor);
return;
}
if(statType == "line"){
fnRenderLine(returnData, cursor);
return;
}
if(statType == "doughnut"){
fnRenderDoughnut(returnData, cursor);
return;
}
}
//진행건수,전체건수 표시
function fnRenderProgressAndTotal(returnData, cursor){
for(var i=0; i < returnData.statItems.length; i++){
var icon = $("#"+cursor).find("i[title='" + returnData.statItems[i].itemName[0] + "']");
var p = icon.prev("p");
p.html(returnData.statItems[i].numberValue[0] + "/" + returnData.statItems[i].numberValue[1]);
}
if(cursor == "card1"){
FimsSupport.mappingButtonAndMenu("btnGoToCrdn","단속 관리");
return;
}
if(cursor == "card2"){
FimsSupport.mappingButtonAndMenu("btnGoToOpnn","의견제출 관리");
return;
}
}
//라인차트 표시
function fnRenderLine(returnData, cursor){
var yellowColor = '#ffe800';
var cyanColor = '#28dac6';
var orangeLightColor = '#FDAC34';
var redColor = '#FF3E1D';
var indigoColor = '#696CFF';
var ctgrColorSet = [yellowColor,cyanColor,orangeLightColor,redColor,indigoColor];
var borderColor = '#f0f0f0';
var gridColor = '#f0f0f0';
var tickColor = 'rgba(0, 0, 0, 0.75)'; // x & y axis tick color
$("#"+cursor).siblings("svg").remove();
$("#"+cursor).show();
var maxOfStat = 0;
var minOfStat = 0;
var datasets = [];
for(var i=0; i < returnData.statItems.length; i++){
var defaultObject = {
tension: 0.5,
pointStyle: 'circle',
fill: false,
pointRadius: 1,
pointHoverRadius: 5,
pointHoverBorderWidth: 5,
pointBorderColor: 'transparent',
pointHoverBorderColor: config.colors.cardColor
};
defaultObject.label = returnData.statItems[i].itemName[0];
defaultObject.data = returnData.statItems[i].numberValue;
var maxOfStatItem = Math.max(defaultObject.data);
var minOfStatItem = Math.min(defaultObject.data);
if(maxOfStatItem > maxOfStat){
maxOfStat = maxOfStatItem;
}
if(minOfStatItem < minOfStat){
minOfStat = minOfStatItem;
}
defaultObject.backgroundColor = ctgrColorSet[i % ctgrColorSet.length];
defaultObject.pointHoverBackgroundColor = ctgrColorSet[i % ctgrColorSet.length];
defaultObject.borderColor = ctgrColorSet[i % ctgrColorSet.length];
datasets.push(defaultObject);
}
var xAxisLabels = returnData.numberValueLabel;
var yAxisConf = initYAxis(maxOfStat, minOfStat);
var lineChart = document.getElementById(cursor);
if (lineChart) {
var lineChartVar = new Chart(lineChart, {
type: 'line',
data: {
labels: xAxisLabels,
datasets: datasets
},
options: {
lineTension : 0,
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
grid: {
color: borderColor,
drawBorder: false,
borderColor: borderColor
},
ticks: {
color: "black"
}
},
y: {
scaleLabel: {
display: true
},
min: yAxisConf.yAxisMin,
max: yAxisConf.yAxisMax,
ticks: {
color: "black",
stepSize: yAxisConf.yAxisStep
},
grid: {
color: borderColor,
drawBorder: false,
borderColor: borderColor
}
}
},
plugins: {
tooltip: {
rtl: true,
backgroundColor: config.colors.cardColor,
titleColor: config.colors.headingColor,
bodyColor: config.colors.bodyColor,
borderWidth: 1,
borderColor: borderColor
},
legend: {
position: 'left',
align: 'stretch',
rtl: true,
labels: {
usePointStyle: true,
padding: 6,
boxWidth: 12,
boxHeight: 30,
color: "black"
}
}
}
}
});
}
return;
}
//도넛차트 표시
function fnRenderDoughnut(returnData, cursor){
var yellowColor = '#ffe800';
var cyanColor = '#28dac6';
var orangeLightColor = '#FDAC34';
var redColor = '#FF3E1D';
var indigoColor = '#696CFF';
var ctgrColorSet = [yellowColor,cyanColor,orangeLightColor,redColor,indigoColor];
var borderColor = '#f0f0f0';
var gridColor = '#f0f0f0';
var tickColor = 'rgba(0, 0, 0, 0.75)'; // x & y axis tick color
var cardColor = config.colors.cardColor;
var headingColor = config.colors.headingColor;
var labelColor = config.colors.textMuted;
var legendColor = config.colors.bodyColor;
$("#"+cursor).siblings("svg").remove();
$("#"+cursor).show();
var lebels = [];
var datas = [];
var colors = [];
for(var i=0; i < returnData.statItems.length; i++){
lebels.push(returnData.statItems[i].itemName[0]);
datas.push(returnData.statItems[i].numberValue[0]);
colors.push(ctgrColorSet[i % ctgrColorSet.length]);
}
var doughnutChart = document.getElementById(cursor);
if (doughnutChart) {
var doughnutChartVar = new Chart(doughnutChart, {
type: 'doughnut',
data: {
labels: lebels,
datasets: [
{
data: datas,
backgroundColor: colors,
borderWidth: 1,
pointStyle: 'rectRounded'
}
]
},
options: {
responsive: true,
animation: {
duration: 500
},
cutout: '68%',
plugins: {
legend: {
display: true,
position : 'left'
},
tooltip: {
callbacks: {
label: function (context) {
const label = context.label || '';
const value = context.parsed;
const output = ' ' + label + ' : ' + value + ' 건';
return output;
}
},
// Updated default tooltip UI
rtl: true,
backgroundColor: cardColor,
titleColor: headingColor,
bodyColor: legendColor,
borderWidth: 1,
borderColor: borderColor
}
}
}
});
}
return;
}
//차트y축 표시최대값,표시최소값,간격 설정
function initYAxis(max, min){
if(max <= 10){
var yAxisConf = {
yAxisMax : 10,
yAxisMin : 0,
yAxisStep : 2
};
return yAxisConf;
}
if(max <= 100){
var yAxisConf = {
yAxisMax : 100,
yAxisMin : 0,
yAxisStep : 20
};
return yAxisConf;
}
var yAxisMax = Math.ceil(max / 100) * 100
var yAxisMin = Math.floor(min / 100) * 100;
if(yAxisMax - yAxisMin <= 100){
yAxisMin = yAxisMax - 100;
}
var yAxisStep = (yAxisMax - yAxisMin)/5;
var yAxisConf = {
yAxisMax : yAxisMax,
yAxisMin : yAxisMin,
yAxisStep : yAxisStep
};
return yAxisConf;
}
</c:set>

@ -0,0 +1,22 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<!-- Footer -->
<footer class="content-footer footer bg-footer-theme align-self-stretch" style="height:1.5rem">
<div class="container-xxl d-flex flex-wrap justify-content-between py-0 flex-md-row flex-column">
<div class="mb-2 mb-md-0 w-100">
© <span id="footerYear"></span>, made with XIT Base by
<script>
document.getElementById("footerYear").innerText = new Date().getFullYear();
</script>
<a target="_blank" class="footer-link fw-bold"
href="https://xit.co.kr">(주)엑스아이티
</a>
<span class="float-end">
<a target="_blank" class="mx-2 footer-link fw-bold"
href="https://www.enis.go.kr">세외수입시스템
</a>
</span>
</div>
</div>
</footer>
<!-- / Footer -->

@ -0,0 +1,43 @@
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<!DOCTYPE html><c:set var="appName" scope="request">과태료통합관리시스템</c:set>
<html
lang="kr"
class="light-style layout-menu-fixed "
dir="ltr"
data-theme="theme-default"
data-assets-path="<c:url value="/webjars/"/>"
data-template="vertical-menu-template-starter">
<head>
<meta charset="UTF-8">
<title>${appName}</title>
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="<c:url value="/webjars/image/favicon.ico"/>" />
<!-- Fonts -->
<link rel="stylesheet" href="<c:url value="/webjars/fonts/notoSansKr/fontface.css"/>" />
<!-- Icons. Uncomment required icon fonts -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/fonts/boxicons.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/fonts/fontawesome.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/fonts/bootstrap-icons.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/fonts/material-icons.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/fonts/xit-icon.css"/>" />
<!-- Core CSS -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/css/rtl/core.css"/>" class="template-customizer-core-css" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/css/rtl/theme-default.css"/>" class="template-customizer-theme-css" />
<link rel="stylesheet" href="<c:url value="/webjars/css/styles.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/applib/css/overwrite.css?${ver}"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/applib/css/applib.css?${ver}"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/css/fims.css?${ver}"/>" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/perfect-scrollbar/perfect-scrollbar.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/jstree/jstree.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/bootstrap-datepicker/bootstrap-datepicker.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/fullcalendar/fullcalendar.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/bs-stepper/bs-stepper.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/dropzone/dropzone.css"/>" />
</head>

@ -0,0 +1,102 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<div class="spinner-border spinner-border-lg text-primary wait" style="display:none;" role="status">
<span class="visually-hidden">Loading...</span>
</div>
<!-- Core JS -->
<script src="<c:url value="/webjars/3rd-party/sneat/libs/popper/popper.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/js/bootstrap.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/jquery/jquery.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/jquery-ui/1.13.2/jquery-ui.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/js/config.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/perfect-scrollbar/perfect-scrollbar.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/js/helpers.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/js/menu.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/jstree/jstree.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/jstree/jstree-support.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/jquery-sticky/jquery-sticky.js" />"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/bootstrap-datepicker/bootstrap-datepicker.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/block-ui/block-ui.js"/>"></script>
<script src="<c:url value="/webjars/3rd-party/sneat/libs/dropzone/dropzone.js"/>"></script>
<!-- base -->
<script src="<c:url value="/webjars/js/base/base.js"/>"></script>
<script src="<c:url value="/webjars/js/base/dataset.js"/>"></script>
<script src="<c:url value="/webjars/js/base/dataset-support.js"/>"></script>
<script src="<c:url value="/webjars/js/base/upload-support.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/base/code.js"/>"></script>
<script src="<c:url value="/webjars/js/base/code-support.js"/>"></script>
<script src="<c:url value="/webjars/js/base/menu.js"/>"></script>
<script src="<c:url value="/webjars/js/base/menu-support.js"/>"></script>
<script src="<c:url value="/webjars/js/base/actionGroup.js"/>"></script>
<script src="<c:url value="/webjars/js/base/user.js"/>"></script>
<script src="<c:url value="/webjars/js/base/sgg-dept.js"/>"></script>
<script src="<c:url value="/webjars/js/base/authority.js"/>"></script>
<!-- base:사전정의요소 클립보드 저장 -->
<script src="<c:url value="/webjars/js/support/toolPalette.js?${ver}"/>"></script>
<!-- 공통 유틸(applib) -->
<script src="<c:url value="/webjars/applib/js/app-base.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/applib/js/string-support.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/applib/js/date-support.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/applib/js/app-support.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/applib/js/componentization.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/fims-base.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/customElements.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/fims-support.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/fims-componentization.js?${ver}"/>"></script>
<!-- 개발 편의성 유틸 -->
<script src="<c:url value="/webjars/js/fims/cmmn/detect.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/objectInspector.js?${ver}"/>"></script>
<script src="<c:url value="/webjars/js/fims/cmmn/registByXml.js?${ver}"/>"></script>
<!-- endbuild -->
<c:set var="functions" scope="request">
wctx.path = "${pageContext.request.contextPath}";
wctx.version = "${ver}";
wctx.trace = ${!production};
wctx.csrf = {
header:"${_csrf.headerName}",
token:"${_csrf.token}"
};
dialog.title = "과태료통합관리시스템";
dialog.timeout = 0;
<c:if test="${currentUser.authenticated}">
function logout() {
dialog.alert({
content:"로그아웃 하시겠습니까?",
onOK:function(){
var form = $("<form action=\"<c:url value='/logout.do'/>\", method=\"POST\">");
$("<input name=\"${_csrf.parameterName}\" value=\"${_csrf.token}\" type=\"hidden\">").appendTo(form);
form.appendTo("body").submit();
}
});
}</c:if>
<c:if test="${currentUser.hasAuthorities('ROLE_ADMIN')}">
async function selectURL(multiple) {
return new Promise(function(resolve, reject) {
ajax.get({
url:wctx.url("/urls.do"),
data:{multiple:multiple},
success: resp => {
dialog.open({
title:"URL 선택",
content:resp,
getData:() => getSelectedURL(),
onOK:selected => {
resolve(selected);
}
});
}
});
});
}
</c:if>
</c:set>

@ -0,0 +1,578 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<!-- Navbar -->
<nav id="layout-navbar" data-doctx="top"
class="layout-navbar navbar container-xxl navbar-expand-xl navbar-detached align-items-center mt-1 mx-0 flex-nowrap">
<div class="layout-menu-toggle navbar-nav align-items-xl-center me-3 me-xl-0 d-xl-none">
<a class="nav-item nav-link px-0 me-xl-4" href="javascript:void(0)">
<i class="bx bx-menu bx-lg"></i>
</a>
</div>
<div class="navbar-nav-right d-flex align-items-center" id="navbar-collapse">
<!-- /Search -->
<div class="ms-1 me-1 min-w-max-c">
<select id="fastBy--top" class="form-select" title="검색구분">
<option value="vhrno">차량번호</option>
<option value="rtpyrNm">납부자명</option>
<option value="rtpyrNo">납부자번호</option>
<option value="cvlcptAplcntNm">신고인명</option>
</select>
<input type="text" id="fastTerm--top" class="form-control" title="검색어" />
<button type="button" id="btnFastSearch--top" class="btn btn-outline-dark bg-orange" title="통합조회">
<i class="bx bx-search"></i>통합조회
</button>
</div>
<div class="me-1 min-w-max-c">
<div class="form-check-inline custom-option custom-option-basic me-1 border-default bg-top-checkbox">
<label for="securityMode--top" class="form-check-label custom-option-content d-flex justify-content-center pt-1 pb-1">
<input type="checkbox" id="securityMode--top" name="securityMode"
class="form-check-input me-1 align-self-center" value="Y" />
<span class="text-center">
보안모드<br/><kbd>F9</kbd>
</span>
</label>
</div>
<div class="form-check-inline custom-option custom-option-basic me-1 border-default bg-top-checkbox">
<label for="photoMask--top" class="form-check-label custom-option-content d-flex justify-content-center pt-1 pb-1">
<input type="checkbox" id="photoMask--top" name="photoMask"
class="form-check-input me-1 align-self-center" value="Y" checked />
<span class="text-center">
단속사진 모자이크<br/><kbd>F10</kbd>
</span>
</label>
</div>
<button type="button" id="btnOpenTempFileUploadWindow" class="btn btn-outline-dark">
외부자료 파일 처리
</button>
<button type="button" id="btnOpenSelectStngDialog" class="btn btn-outline-dark">
특화설정
</button>
<button type="button" id="btnGoToCvlcptDscsn" class="btn btn-outline-dark">
종합민원관리
</button>
<button type="button" id="btnGoToSchdl" class="btn btn-outline-dark">
일정관리
</button>
<button type="button" id="btnGoToNtc" class="btn btn-outline-dark">
공지사항
</button>
<button type="button" id="btnDownloadMenual--top" class="btn btn-primary"
>사용자 메뉴얼
</button>
</div>
<span class="ms-auto">
<ul class="navbar-nav flex-row align-items-center">
<!-- Style Switcher -->
<li class="nav-item me-2 me-xl-0">
<a class="nav-link style-switcher-toggle hide-arrow" href="javascript:void(0);">
<i class="bx bx-lg"></i>
</a>
</li>
<!--/ Style Switcher -->
<!-- User -->
<li id="userNav--top" class="nav-item navbar-dropdown dropdown-user dropdown">
<a href="javascript:void(0);" data-bs-toggle="dropdown"
class="d-flex align-items-center nav-link dropdown-toggle hide-arrow">
<div class="avatar d-flex">
<img src="<c:url value="/webjars/img/user-circle-solid-24.svg"/>" alt
class="w-px-40 h-auto rounded-circle" />
<div class="d-flex flex-column">
<span class="fw-semibold text-black">${currentUser.name}</span>
<small class="text-black">${currentUser.account}</small>
</div>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li>
<a class="dropdown-item" href="#">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar avatar-online">
<img src="<c:url value="/webjars/img/user-circle-solid-24.svg"/>" alt
class="w-px-40 h-auto rounded-circle" />
</div>
</div>
<div class="flex-grow-1">
<span class="fw-semibold d-block">${currentUser.name}</span>
<small class="text-muted">${currentUser.account}</small>
</div>
</div>
</a>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li onclick="fnOpenMyInfo();">
<a class="dropdown-item" href="javascript:void(0);">
<i class="bx bx-user me-2"></i>
<span class="align-middle">계정 정보 수정</span>
</a>
</li>
<li onclick="fnOpenChangePassword();">
<a class="dropdown-item" href="javascript:void(0);">
<i class="bx bx-user me-2"></i>
<span class="align-middle">비밀번호 변경</span>
</a>
</li>
<li>
<div id="taskSeCd--Top" class="d-flex flex-column align-items-center">
</div>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<a class="dropdown-item" href="#" onclick="showHelp();">
<i class="bx bx-support me-2"></i>
<span class="align-middle">Help</span>
</a>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<a id="btnCancelAccount--Top" class="dropdown-item" href="#" onclick="fnCancelAccount();">
<i class="bx bx-exit me-2"></i>
<span class="align-middle">
회원탈퇴
</span>
</a>
</li>
<li onclick="logout();">
<a class="dropdown-item">
<i class="bx bx-power-off me-2"></i>
<span class="align-middle">로그아웃</span>
</a>
</li>
</ul>
</li>
<!--/ User -->
</ul>
</span>
</div>
</nav>
<template id="selectStngButtonsTemplate">
<span class="row g-3 d-flex flex-column">
<button type="button" class="btn btn-xl btn-primary" onclick="fnOpenEqmCrdnLayoutStngDialog();">수신단속파일(장비) 서식 설정</button>
<button type="button" class="btn btn-xl btn-primary" onclick="fnOpenOtptStngDialog();">출력물 서식 설정</button>
<button type="button" class="btn btn-xl btn-primary" onclick="fnOpenOutsourcingStngDialog();">고지서 외주요청파일 서식 설정</button>
<button type="button" class="btn btn-xl btn-primary" onclick="fnOpenExtrStngDialog();">pdf 고지서 정보 추출 설정</button>
</span>
</template>
<c:set var="topScript" scope="request">
async function fnOpenTempFileUploadWindow(){
var resp = await fetch(wctx.url("/webjars/html/fileUpload.html"));
var template = await resp.text();
dialog.open({
id : "fileUploadDialog",
title: "파일 업로드",
size : "lg",
content: template,
init : () => {
AppSupport.setDialogZindex();
}
});
}
/*--------------------- 설정 선택 다이얼로그 표시 ---------------------*/
function fnOpenSelectStngDialog(){
dialog.open({
id : "selectStngDialog",
title : "설정 선택",
content : document.getElementById("selectStngButtonsTemplate").innerHTML,
size : "md",
init : () => {},
onClose : () => {}
});
}
/*--------------------- 장비단속레이아웃 설정 메인 화면 표시 ---------------------*/
function fnOpenEqmCrdnLayoutStngDialog(){
dialog.close("selectStngDialog");
var url = wctx.url("/crdn/crdn01/010/main.do");
ajax.post({
url : url,
data : {},
success : (resp) => {
let dialogName = "eqmCrdnLayoutStngDialog";
let dialogId = dialogName+"-"+uuid();
dialog.open({
id : dialogId,
title : "장비단속 레이아웃 설정",
size : "xxl",
content : resp,
init : () => {
$("#"+dialogId).attr("name", dialogName);
$("#"+dialogId).attr("data-ref-doctx","top");
let refDlgId = pageObject["top"].refDlgId(dialogName);
$("#"+refDlgId).find("form[name='frmSearch']").find("[name='sggCd']").val(MY_INFO.info.sggCd);
},
onClose : () => { }
});
}
});
}
/*--------------------- 출력물 설정 메인 화면 표시 ---------------------*/
function fnOpenOtptStngDialog(){
dialog.close("selectStngDialog");
var url = wctx.url("/stng/stng01/010/main.do");
ajax.post({
url : url,
data : {},
success : (resp) => {
let dialogName = "otptStngDialog";
let dialogId = dialogName+"-"+uuid();
dialog.open({
id : dialogId,
title : "출력설정",
size : "xxl",
content : resp,
init : () => {
$("#"+dialogId).attr("name", dialogName);
$("#"+dialogId).attr("data-ref-doctx","top");
let refDlgId = pageObject["top"].refDlgId(dialogName);
$("#"+refDlgId).find("form[name='frmSearch']").find("[name='sggCd']").val(MY_INFO.info.sggCd);
},
onClose : () => { }
});
}
});
}
/*--------------------- 고지서 외주요청파일 서식 설정 ---------------------*/
function fnOpenOutsourcingStngDialog(){
dialog.close("selectStngDialog");
var url = wctx.url("/stng/stng01/030/main.do");
ajax.post({
url : url,
data : {},
success : (resp) => {
let dialogName = "outsourcingStngDialog";
let dialogId = dialogName+"-"+uuid();
dialog.open({
id : dialogId,
title : "외주요청파일 서식 설정",
size : "xxl",
content : resp,
init : () => {
$("#"+dialogId).attr("name", dialogName);
$("#"+dialogId).attr("data-ref-doctx","top");
let refDlgId = pageObject["top"].refDlgId(dialogName);
$("#"+refDlgId).find("form[name='frmSearch']").find("[name='sggCd']").val(MY_INFO.info.sggCd);
},
onClose : () => { }
});
}
});
}
/*--------------------- PDF자료 추출 설정 메인 화면 표시 ---------------------*/
function fnOpenExtrStngDialog(){
dialog.close("selectStngDialog");
var url = wctx.url("/stng/stng01/020/main.do");
ajax.post({
url : url,
data : {},
success : (resp) => {
let dialogName = "extrStngDialog";
let dialogId = dialogName+"-"+uuid();
dialog.open({
id : dialogId,
title : "PDF자료 추출 설정",
size : "xxl",
content : resp,
init : () => {
$("#"+dialogId).attr("name", dialogName);
$("#"+dialogId).attr("data-ref-doctx","top");
let refDlgId = pageObject["top"].refDlgId(dialogName);
$("#"+refDlgId).find("form[name='frmSearch']").find("[name='sggCd']").val(MY_INFO.info.sggCd);
},
onClose : () => { }
});
}
});
}
function fnOpenMyInfo(){
var popupWidth = 950;
var popupHeight = 500;
var popupX = (window.screen.width / 2) - (popupWidth / 2);
var popupY= (window.screen.height / 2) - (popupHeight / 2);
var popup = window.open(
wctx.url("/user/openMyInfo.do")
,"changeMyInfo"
,"width="+popupWidth+", height="+popupHeight+", left="+popupX+", top="+popupY
);
popup.onload = () => {
popup.addEventListener('beforeunload', function() {
$.unblockUI();
});
};
}
function fnOpenChangePassword(){
ajax.get({
url : wctx.url("/user/changePassword.do"),
data : { },
success : (resp) => {
dialog.open({
id : "changePasswordDialog",
title : "비밀번호 변경",
content : resp,
size : "md",
init : () => {},
onClose : () => {}
});
}
});
}
async function fnCancelAccount(){
let ok = await confirm2("탈퇴하시겠습니까?");
if(ok){
ajax.get({
url : wctx.url("/user/cancelAccount.do"),
data : { },
success : (resp) => {
if(resp.saved){
alert('탈퇴되었습니다.');
var form = $("<form action=\"/logout.do\", method=\"POST\">");
$("<input name=\"${_csrf.parameterName}\" value=\"${_csrf.token}\" type=\"hidden\">").appendTo(form);
form.appendTo("body").submit();
}
}
});
}
}
function showHelp(){
dialog.alert({
content : "문의전화 : 070-4490-74XX"
+"<br/>"
+"<button type='button' class='btn btn-primary' onclick='remoteRequest();'>원격지원</button>",
timeout : 0,
init : function() {
AppSupport.setDialogZindex();
AppSupport.focusClose();
},
});
}
function remoteRequest(){
window.open("https://81.223.kr/xit-1.exe", '_blank');
}
/*
* 보안모드 토글 처리
*/
function fn_securityModeToggle(flag, elementId){
var executionArea;
if(elementId){
executionArea = $("#"+elementId);
} else {
executionArea = $(document);
}
var targets = executionArea.find("input.privacy");
for(let i=0; i< targets.length; i++){
let originId = targets[i].id;
let originValue= targets[i].value;
let maskingValue = originValue.replaceAll(/./g, "*");
document.getElementById("mask-"+originId).value = maskingValue;
}
if(flag){ //개인정보 숨김
//입력상자
$("input.privacy").attr("hidden","hidden");
$("input.privacy-mask").removeAttr("hidden");
//그리드
$("body").addClass("root-privacy-on");
} else { //개인정보 표시
//입력상자
$("input.privacy").removeAttr("hidden");
$("input.privacy-mask").attr("hidden","hidden");
//그리드
$("body").removeClass("root-privacy-on");
}
}
/*
* 단속사진 마스킹
*/
function fn_photoMask(flag, element){
var executionArea;
var isImg = false;
if(element){
if(element.tagName == "IMG"){
isImg = true;
}
executionArea = $(element);
} else {
executionArea = $(document);
}
var targets;
if(isImg){
targets = executionArea.filter("[data-crdn-photo-id]");
} else {
targets = executionArea.find("[data-crdn-photo-id]");
}
for(var i=0; i < targets.length; i++){
var target = targets[i];
var dataset = target.dataset;
var targetId = dataset.crdnPhotoId;
$("div[data-ref='"+dataset.crdnPhotoId+"']").remove();
if(dataset.crdnPhotoId != null && dataset.crdnPhotoId != ""
&& dataset.mosaic != null && dataset.mosaic != ""
&& flag){
var mosaicInfoArr = dataset.mosaic.split("|");
var zoomX = target.width / target.naturalWidth;
var zoomY = target.height / target.naturalHeight;
for(var j=0; j < mosaicInfoArr.length; j++){
var mosaicInfo = mosaicInfoArr[j].split(",");
var x2 = mosaicInfo[0] * zoomX
var y2 = mosaicInfo[1] * zoomY
var w2 = mosaicInfo[2] * zoomX
var h2 = mosaicInfo[3] * zoomY
var mosaic = document.createElement("div");
mosaic.style["position"] = "absolute";
mosaic.style["top"] = y2 + "px";
mosaic.style["left"] = x2 + "px";
mosaic.style["width"] = w2 + "px";
mosaic.style["height"] = h2 + "px";
mosaic.style["background-color"] = "black";
mosaic.setAttribute("data-ref", targetId);
$(target).after(mosaic);
}
}
}
}
/*--------------------- 통합조회 버튼 클릭 이벤트 ---------------------*/
$("#btnFastSearch--top").on( "click", function() {
fnGlobalFastSearch();
});
$("#fastTerm--top").onEnterPress(fnGlobalFastSearch);
function fnGlobalFastSearch(){
var integrationSearchUrl = wctx.url("/sprt/sprt01/010/main.do");
if(mainTabs.getDataset().find(i => i.url == integrationSearchUrl) != null){
mainTabs.close(integrationSearchUrl);
}
if($("#fastTerm--top").val() != ""){
fastSearch = true;
}
openMenu(integrationSearchUrl);
}
/*--------------------- 종합민원관리 클릭 이벤트 ---------------------*/
FimsSupport.mappingButtonAndMenu("btnGoToCvlcptDscsn","민원상담");
/*--------------------- 일정관리 클릭 이벤트 ---------------------*/
FimsSupport.mappingButtonAndMenu("btnGoToNtc","공지사항");
/*--------------------- 공지사항 클릭 이벤트 ---------------------*/
FimsSupport.mappingButtonAndMenu("btnGoToSchdl","일정관리");
/*--------------------- 사용자 메뉴얼 클릭 이벤트 ---------------------*/
$("#btnDownloadMenual--top").on( "click", function() {
FimsSupport.fnMenualDownload();
});
/*--------------------- 보안모드 체크박스 클릭 이벤트 ---------------------*/
$("#securityMode--top").on( "click", function() {
if($("#securityMode--top").is(":checked")){
fn_securityModeToggle(true);
} else {
fn_securityModeToggle(false);
}
});
/*--------------------- 단속사진 모자이크 체크박스 클릭 이벤트 ---------------------*/
$("#photoMask--top").on( "click", function() {
if($("#photoMask--top").is(":checked")){
fn_photoMask(true);
} else {
fn_photoMask(false);
}
});
/*--------------------- 외부자료 파일 처리 ---------------------*/
$("#btnOpenTempFileUploadWindow").on( "click", function() {
fnOpenTempFileUploadWindow();
});
/*--------------------- 특화 설정 ---------------------*/
$("#btnOpenSelectStngDialog").on( "click", function() {
fnOpenSelectStngDialog();
});
</c:set>

@ -0,0 +1,41 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<!-- Menu -->
<aside id="layout-menu" class="layout-menu menu-vertical menu bg-menu-theme">
<div class="app-brand demo">
<a href="javascript:fnHome();" class="app-brand-link">
<span class="app-brand-logo demo">
<img id="symbol--left"
src="<c:url value='/'/>webjars/img/login/mainLogo_01.png"
width="36px" height="36px" alt="symbol" />
</span>
<span id="home" class="app-brand-text demo menu-text fw-bold ms-2 text-center">
과태료통합관리시스템
</span>
</a>
<a href="javascript:void(0);" class="layout-menu-toggle menu-link text-large ms-auto">
<i class="bx bx-chevron-left bx-lg align-middle"></i>
</a>
</div>
<div class="menu-inner-shadow"></div>
<ul id="menus" class="menu-inner py-1">
</ul>
</aside>
<!-- / Menu -->
<c:set var="userMenus" scope="request">
function fnHome(){
top.location.href = wctx.url("/")+"?taskSeCd="+$("#layout-navbar input[name='taskSeCd']:checked").val();
}
let userMenus = ${userMenus};
let menuSupport = new MenuSupport("#layout-menu");
function setUserMenus(menus) {
menuSupport.setMenuInfo(menus).setActive(wctx.current());
let currentMenu = menuSupport.getMenu(wctx.current());
if (currentMenu)
setPageTitle(currentMenu.name);
}
setUserMenus(userMenus);
</c:set>

@ -0,0 +1,459 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<jsp:include page="/WEB-INF/jsp/include/head.jsp" />
<body>
<div class="layout-wrapper layout-content-navbar layout-without-menu">
<div class="layout-container">
<div class="layout-page">
<div class="content-wrapper mt-0">
<jsp:include page="/WEB-INF/jsp/include/userMenus.jsp" />
<div class="content-body menu-aware">
<div class="sticky-wrapper">
<div class="sticky-element">
<jsp:include page="/WEB-INF/jsp/include/top.jsp" />
<ul id="menu-tabs" class="nav nav-tabs mt-1" role="tablist"
style="--bs-nav-link-padding-y: .125rem; background-image: linear-gradient(#8AB9DB, whitesmoke);">
</ul>
</div>
</div>
<template id="main-tab">
<li class="nav-item" role="presentation">
<div class="nav-link border-bottom-0" data-bs-toggle="tab" data-bs-target="{tab-target}"
role="tab" aria-controls="{index}" tabindex="-1">
<span onclick="openMenu('{url}');" class="w-px-150 text-truncate">{name}</span>
<span onclick="mainTabs.close('{url}')" class="ms-2">&times;</span>
</div>
</li>
</template>
<div id="main-tab-content" class="tab-content shadowed">
<div id="dashboard" class="tab-pane fade" role="tabpanel">
<jsp:include page="/WEB-INF/jsp/dashboard.jsp" />
</div>
</div>
<template id="tab-pane">
<div id="{index}" class="tab-pane fade" role="tabpanel">{inner-content}</div>
</template>
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
</div>
</div>
</div>
</div>
</div>
<div id="selectTaskModal" class="modal fade h-auto" tabindex="-1" aria-hidden="true"
data-bs-backdrop="static" data-bs-focus="false" data-bs-keyboard="false">
<div class="modal-dialog modal-sm" role="document">
<div class="modal-content">
<div class="modal-body modal-body-min">
<div class="h3 fw-bold text-center">업무를 선택하세요.</div>
<span id="selectTaskButtons" class="row g-3 d-flex flex-column">
</span>
</div>
</div>
</div>
</div>
<jsp:include page="/WEB-INF/jsp/include/tail.jsp" />
<!-- 자동 로그아웃 -->
<script src="<c:url value="/webjars/3rd-party/sneat/libs/idletimer/idletimer.js"/>"></script>
<c:set var="onload">
</c:set>
<script>
//단축키 등록
FimsSupport.registShortcutKey();
let sticky = {id: -1, index: "dashboard", name: "대시보드", url: "/dashboard.do", parentID: null, description: "대시보드"};
let mainTabs = new TabControl({
sticky: sticky,
getMenu: (url) => menuSupport.getMenu(url),
onDatasetChange: tabs => {
let template = document.getElementById("main-tab").innerHTML,
toTab = (tmpl, item) => tmpl.replace(/{tab-target}/gi, "#" + "{index}"),
tags = mainTabs.inStrings(template, toTab);
document.getElementById("menu-tabs").innerHTML = tags.join("");
$("#menu-tabs .nav-item").eq(0).find("span.ms-2").remove();
},
onCurrentChange: tab => {
if (!tab || !tab.data) return;
let url = tab.data.url;
menuSupport.setActive(url);
document.querySelector("#menu-tabs li span[onclick=\"openMenu('" + url + "');\"]").click();
let currentPane = document.querySelector("#" + tab.data.index);
if (!currentPane) {
let template = document.getElementById("tab-pane").innerHTML,
html = tab.inString(template);
if (tab.data.content) {
html = html.replace(/{inner-content}/, tab.data.content);
delete tab.data.content;
$("#main-tab-content").append(html);
}
}
document.querySelectorAll("#main-tab-content > div.tab-pane")
.forEach(tabPane => {
let current = tab.data.index == tabPane.getAttribute("id");
if (current)
tabPane.classList.add("show", "active");
else
tabPane.classList.remove("show", "active");
});
},
onRemove: tabs => {
let mainTab = document.querySelector("#main-tab-content");
tabs.forEach(tab => {
let tabPane = document.querySelector("#" + tab.data.index);
if (!tabPane) return;
mainTab.removeChild(tabPane);
delete tabPane;
});
mainTabs.onDatasetChange();
}
});
function openMenu(url) {
mainTabs.open(url)
}
$(".sticky-element").sticky({
topSpacing: $(".nav-bar").height() + 1,
width: "100%",
zIndex: 9
});
const FETCH_XXS = 10;
const FETCH_XS = 30;
const FETCH_SM = 50;
const FETCH_MD = 100;
const FETCH_LG = 300;
const FETCH_XL = 500;
const FETCH_XXL = 1000;
const DEFAULT_FETCH_SIZE = 30;
//자동 로그아웃
const ONE_MINUTE = 60 * 1000;
let sessionConfig = 30 * ONE_MINUTE;
$.idleTimer(sessionConfig);
$(document).bind("idle.idleTimer", function(){
$.idleTimer('destroy');
ajax.post({
url : wctx.url("/logout.do"),
data : { "${_csrf.parameterName}" : "${_csrf.token}" },
success : async function(){
var ok = await alert2("세션이 종료되어 로그아웃되었습니다.");
if(ok){
location.href = wctx.url("/login.do");
}
}
});
});
let fastSearch = false;
var pageObject = {};
pageObject.help = function(){
console.log("pageObject : 로드된 페이지이름(서버에서 반환하는 pageName변수 또는 jsp파일명)을 하위 키로 갖는 전역객체");
};
pageObject.childReq = [];
pageObject.parentRes = [];
pageObject.top = newDoctxFinder("top");
function LoadScript(scriptId, scriptPath){
if(document.getElementById(scriptId) == null){
$("body").append("<script id='"+scriptId+"' src='"+scriptPath+"' />");
}
}
async function LoadJson(path){
let resp = await fetch(path);
return await resp.json();
}
function FindObject(objectName, pageName){
if(pageName == undefined || pageName == null || pageName == ""){
return window[objectName];
} else {
return pageObject[pageName][objectName];
}
}
function RegistObject(objectName, def, pageName){
if(pageName == undefined || pageName == null || pageName == ""){
window[objectName] = def;
return window[objectName];
} else {
pageObject[pageName][objectName] = def;
return pageObject[pageName][objectName];
}
}
var ALL_TASK = {};
var MY_INFO = {};
var SYS_LINK_INFO = {};
var PARAM_TASK = "${param.taskSeCd}";
async function fnGetAllTask(){
return new Promise((resolve, reject) => {
$.ajax({
type: "get",
url: wctx.url("/code/getAllTaskSeCd.do"),
data: {},
dataType: 'json',
success: function(resp, textStatus, jqXHR) {
ALL_TASK = resp.allTask;
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
async function fnCheckSggTask(){
return new Promise((resolve, reject) => {
$.ajax({
type: "get",
url: wctx.url("/code/sggHasTask.do"),
data: {},
dataType: 'json',
success: function(resp, textStatus, jqXHR) {
if(resp.sggHasTask == "Y" || "${currentUser.user.getCntnSeCd()}" == "02"){
resolve({resp, textStatus, jqXHR});
} else {
reject("시군구 업무 설정이 없습니다.");
}
},
error: function(jqXHR, textStatus, error) {
}
});
});
}
async function fnGetSysLinkInfo(){
return new Promise((resolve, reject) => {
$.ajax({
type: "get",
url: wctx.url("/user/sysLinkInfo.do"),
data: {},
dataType: 'json',
success: function(resp, textStatus, jqXHR) {
SYS_LINK_INFO = resp.sysLinkInfo;
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
async function fnGetMyInfo(){
return new Promise((resolve, reject) => {
$.ajax({
type: "get",
url: wctx.url("/user/myInfo.do"),
data: {},
dataType: 'json',
success: function(resp, textStatus, jqXHR) {
MY_INFO = resp.myInfo;
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
function fnSelectDefaultTask(taskSeCd){
ajax.get({
url : wctx.url("/user/saveDefaultTask.do"),
data : {
"taskSeCd" : taskSeCd
},
success : (resp) => {
if(resp.saved){
$("#selectTaskModal").modal("hide");
initIndexPage(true, PARAM_TASK, taskSeCd);
}
}
});
}
function initIndexPage(isPublicOfficer, paramTask, userDefaultTask){
if(!isPublicOfficer){
$("#home").html("과태료통합관리시스템<br/>("+"임대기업사용자"+")");
$("#btnOpenTempFileUploadWindow").remove();
$("#btnOpenSelectStngDialog").remove();
$("#btnGoToCvlcptDscsn").remove();
$("#btnGoToSchdl").remove();
$("#btnDownloadMenual--top").remove();
$("#btnGoToNtc").remove();
return;
}
$("#btnCancelAccount--Top").remove();
if(paramTask != "" || $("#layout-navbar").find("input[name='taskSeCd'][value='"+paramTask+"']").length > 0){
$("#layout-navbar input[name='taskSeCd'][value='"+paramTask+"']").prop("checked", true);
} else if(userDefaultTask != "" || $("#layout-navbar").find("input[name='taskSeCd'][value='"+userDefaultTask+"']").length > 0){
$("#layout-navbar input[name='taskSeCd'][value='"+userDefaultTask+"']").prop("checked", true);
} else {
$("#layout-navbar input[name='taskSeCd']").eq(0).prop("checked", true);
}
//좌측상단제목, 최상단 배경색
var checkedId = $("#layout-navbar input[name='taskSeCd']:checked")[0].id;
var checkedText = $("label[for='"+checkedId+"']").text();
$("#home").html("과태료통합관리시스템<br/>("+checkedText+")");
var taskTheme = "task-theme-" + $("#layout-navbar input[name='taskSeCd']:checked").val().toLowerCase();
$("#layout-navbar").addClass(taskTheme);
//대시보드 로드
${dashboardScript}
}
${functions}
${topScript}
${userMenus}
$(function(){
${onload}
mainTabs.getTab(sticky.url);
fnGetAllTask()
.then(() => { return fnCheckSggTask(); })
.then(() => { return fnGetSysLinkInfo(); })
.then(() => { return fnGetMyInfo(); })
.then(() => {
var msg = "";
var available = true;
if(MY_INFO.user.status == "A" || MY_INFO.user.status == "D" || MY_INFO.user.locked == "Y"){
if(MY_INFO.user.status == "A"){
msg = "계정이 미승인 상태입니다.";
} else if(MY_INFO.user.status == "D"){
msg = "삭제된 계정입니다.";
} else if(MY_INFO.user.locked == "Y"){
msg = "잠금처리된 계정입니다.";
}
available = false;
}
if(!(MY_INFO.info.isAdmin)){
if(MY_INFO.info.isPublicOfficer){
if(!(MY_INFO.info.hasTaskAuth)){
msg = "계정에 부여된 업무권한이 없습니다.";
available = false;
}
}
}
if(msg != ""){
alert(msg);
}
//로그아웃
if(!available){
var form = $("<form action=\"/logout.do\", method=\"POST\">");
$("<input name=\"${_csrf.parameterName}\" value=\"${_csrf.token}\" type=\"hidden\">").appendTo(form);
form.appendTo("body").submit();
return;
}
//지자체 심볼
if(MY_INFO.info.sggSymbolPath != ""){
$("#symbol--left").attr("src", MY_INFO.info.sggSymbolPath);
}
//사용하지 않는 연계와 관련된 메뉴 제거
//새올민원 관련 메뉴 제거
if(SYS_LINK_INFO == null || SYS_LINK_INFO.CVLCPT_LINK_SE_CD != '01'){
var saeolMenuUrl = wctx.url("/cvlc/cvlc04/010/main.do");
$("ul[id='menus']").find("li[class='menu-item']").each(function(){
if($(this).children("a[onclick]").length > 0){
let oc = $(this).children("a[onclick]").attr("onclick").split("'");
if(oc.length == 3 && oc[1] == saeolMenuUrl){
$(this).remove();
}
}
});
}
if(MY_INFO.info.isPublicOfficer){
//사용자별 선택가능한 업무 렌더링
$("#selectTaskButtons").html("");
for(var i=0; i < MY_INFO.info.taskForUser.length; i++){
var taskCd = MY_INFO.info.taskForUser[i];
var taskNm = ALL_TASK[taskCd];
var radio = "";
radio += "<span>";
radio += "<input type='radio' id='taskSeCd"+(i+1)+"--top' name='taskSeCd' value='"+taskCd+"' title='"+taskNm+"' />";
radio += "<label for='taskSeCd"+(i+1)+"--top'>"+taskNm+"</label>";
radio += "</span>";
$("#taskSeCd--Top").append(radio);
var button = `<button type="button" class="btn btn-xl btn-primary" onclick="fnSelectDefaultTask('`
+taskCd
+`');">`
+taskNm
+`</button>`;
$("#selectTaskButtons").append(button);
}
$("#layout-navbar input[name='taskSeCd']").on("click", function(){
$("#userNav--top").click();
window.open(wctx.url("/")+"?taskSeCd="+this.value, "_blank", "");
return false;
});
//업무선택 모달 다이얼로그
if(MY_INFO.info.defaultTask == null || MY_INFO.info.defaultTask == ""){
$("#selectTaskModal").modal("show");
return;
} else {
initIndexPage(true, PARAM_TASK, MY_INFO.info.defaultTask);
return;
}
} else {
initIndexPage(false, "", "");
}
}).catch((msg) => {
alert(msg);
var form = $("<form action=\"/logout.do\", method=\"POST\">");
$("<input name=\"${_csrf.parameterName}\" value=\"${_csrf.token}\" type=\"hidden\">").appendTo(form);
form.appendTo("body").submit();
return;
});
});
</script>
</body>
</html>

@ -0,0 +1,332 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<!DOCTYPE html>
<html
lang="kr"
class="light-style layout-navbar-fixed layout-menu-fixed "
dir="ltr"
data-theme="theme-default"
data-assets-path="<c:url value="/webjars/"/>"
data-template="vertical-menu-template-starter">
<head>
<meta charset="UTF-8">
<title>과태료통합관리시스템</title>
<!-- Favicon -->
<link rel="icon" type="image/x-icon" href="<c:url value="/webjars/image/favicon.ico"/>" />
<!-- Fonts -->
<link rel="stylesheet" href="<c:url value="/webjars/fonts/notoSansKr/fontface.css"/>" />
<!-- Icons. Uncomment required icon fonts -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/fonts/boxicons.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/fonts/fontawesome.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/fonts/xit-icon.css"/>" />
<!-- Core CSS -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/css/rtl/core.css"/>" class="template-customizer-core-css" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/css/rtl/theme-default.css"/>" class="template-customizer-theme-css" />
<link rel="stylesheet" href="<c:url value="/webjars/css/styles.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/applib/css/overwrite.css?${ver}"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/applib/css/applib.css?${ver}"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/css/fims.css?${ver}"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/css/fims-login.css?${ver}"/>" />
<!-- Vendors CSS -->
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/perfect-scrollbar/perfect-scrollbar.css"/>" />
<link rel="stylesheet" href="<c:url value="/webjars/3rd-party/sneat/libs/bootstrap-datepicker/bootstrap-datepicker.css"/>" />
</head>
<body>
<div class="login_bg" hidden>
<div class="header_wrap">
<h1 class="logo">
<img src="<c:url value='/'/>webjars/img/login/mainLogo_02.png" alt="Logo Image" />
<span id="userFor" hidden>(임대기업사용자)</span>
<span class="float-end mt-4 me-5">
<button id="btnDownMenual" type="button" onclick="FimsSupport.fnMenualDownload();" class="btn btn-primary" hidden>사용자 메뉴얼</button>
</span>
</h1>
</div>
<div class="login_text">
<p class="main_img"><img src="<c:url value='/'/>webjars/img/login/loginDeco_02.png" alt=""></img></p>
<form id="formAuthentication" method="post">
<input type="hidden" id="cntnSeCd" name="cntnSeCd" />
<div class="input_wrap">
<div class="input-group" id="orgDiv">
</div>
<div class="input-group">
<input type="text" id="userId" value="${cookie['userAccount'].getValue()}"
required title="계정 입력" class="typeText required form-control inp-long" placeholder="계정" autofocus/>
</div>
<div class="input-group input-group-merge mt-2">
<input type="password" id="password"
required title="비밀번호 입력" class="typePassword required form-control inp-long" placeholder="비밀번호" autocomplete="false" />
<span class="input-group-text cursor-pointer"><i class="bx bxs-lock"></i></span>
</div>
<div class="mt-3 form-chcek">
<input id="remember" type="checkbox" class="form-check-input">
<label class="form-check-label">로그인 정보 유지</label>
</div>
<div class="input_wrap2">
<!--
<a href="#" onclick="javascript:fn_FindId(); return false;">아이디 찾기</a>
<a href="#" onclick="javascript:fn_FindPw(); return false;" class="line">비밀번호 찾기</a>
-->
<a href="#" onclick="javascript:fnOpenSignup_step1(); return false;" class="line">회원가입</a>
</div>
</div>
<input type="hidden" name="message" value="${message}" />
<input type="hidden" name="userSe" value="USR"/>
<input name="j_username" type="hidden"/>
</form>
<div class="btn_wrap">
<input type="button" onclick="login()" class="typeButton" title="로그인" value="로그인" />
</div>
</div>
</div>
<template id="pbofcLoginTemplate">
<select id="orgID" name="orgID" required title="시군구명" class="form-select mb-2 h-px-40 no-max-w">
<option value="">[기관 선택]</option>
<option value="ADMIN">시스템관리</option>
<c:forEach items="${sggList}" var="item">
<option value="${item.SGG_CD}"
<c:if test="${item.USER_USE_YN == 'N'}"> disabled </c:if>
>${item.SGG_NM}</option>
</c:forEach>
</select>
</template>
<template id="bzentLoginTemplate">
<input type="hidden" id="orgID" name="orgID" required title="시군구명" value="${sysSggCd}" />
</template>
<template id="selectOrgDialogTemplate">
<select class="form-select form-control-sm" id="selectOrg">
<option value="">선택</option>
<c:forEach items="${sggList}" var="item">
<option value="${item.SGG_CD}">${item.SGG_NM}</option>
</c:forEach>
</select>
</template>
<jsp:include page="/WEB-INF/jsp/include/tail.jsp" />
<script type="text/javascript">
${functions}
let sysSgg = "${sysSggCd}";
let cookieOrg = "${cookie['userOrg'].getValue()}";
let cookieUserId = "${cookie['userAccount'].getValue()}";
function login() {
if (!$("#formAuthentication input,select").validInputs()) return;
var params = {
account: $("#userId").val().toUpperCase(),
password:$("#password").val(),
orgID: $("#orgID").val(),
cntnSeCd: $("#cntnSeCd").val(),
rememberCredentials: $("#remember").prop("checked")
};
json.post({
url:wctx.url("/login.do"),
data:params,
success:function(resp) {
if (!(resp.authenticated)) {
dialog.alert({
content:resp.reason,
init : function() {
AppSupport.setDialogZindex();
focusClose();
},
onClose:() => $("#userId").focus()
});
return;
}
if(resp.message){
dialog.alert({
content : resp.message,
init : function() {
AppSupport.setDialogZindex();
focusClose();
},
onOK : function() {
wctx.home();
}
});
return;
}
wctx.home();
}
});
}
/**
* 회원가입 팝업
*/
function fnOpenSignup_step1(){
if($("#cntnSeCd").val() == "01"){
dialog.open({
id : "selectOrgDialog",
title : "기관 선택",
content : document.getElementById("selectOrgDialogTemplate").innerHTML,
size : "sm",
init : () => {
},
onOK : () => {
if($("#selectOrg").val() == ""){
alert("기관을 선택하세요.");
return;
}
dialog.close("selectOrgDialog");
fnOpenSignup_step2($("#selectOrg").val(),"01");
},
onClose : () => {}
});
} else if($("#cntnSeCd").val() == "02"){
fnOpenSignup_step2("${sysSggCd}","02");
}
}
function fnOpenSignup_step2(sggCd,cntnSeCd){
var popupWidth = 950;
var popupHeight = 500;
var popupX = (window.screen.width / 2) - (popupWidth / 2);
var popupY= (window.screen.height / 2) - (popupHeight / 2);
var popup = window.open(wctx.url("/signupPage.do")+"?sggCd="+sggCd+"&cntnSeCd="+cntnSeCd,
"regAccount",
"width="+popupWidth+", height="+popupHeight+", left="+popupX+", top="+popupY);
$.blockUI({message : ""});
popup.onload = () => {
popup.addEventListener('beforeunload', function() {
$.unblockUI();
});
};
}
/**
* 아이디 찾기 팝업
*/
function fn_FindId(){
window.open(".do", "findId", {width: 500, height:300});
}
/**
* 비밀번호 찾기 팝업
*/
function fn_FindPw(){
window.open(".do", "findPw", {width: 500, height:330});
}
function fnIpInfo(flag){
$("#cntnSeCd").val("");
$("#orgDiv").html("");
$("#userId").val("");
$("#password").val("");
$("#btnDownMenual").attr("hidden","hidden");
$("#userFor").attr("hidden","hidden");
$("#remember").prop("checked", false);
let data = {};
if(flag != null){
data.flag = flag;
}
ajax.get({
url:wctx.url("/ipInfo.do"),
data:data,
success:function(resp) {
if(resp.net == "intra"){
PBOFC_login();
} else if(resp.net == "inter"){
BZENT_login();
}
}
});
}
//공무원 로그인
function PBOFC_login(){
$(".login_bg").removeAttr("hidden");
$("#btnDownMenual").removeAttr("hidden");
$("#cntnSeCd").val("01");
$("#orgDiv").html(document.getElementById("pbofcLoginTemplate").innerHTML);
let hasCookie = (cookieOrg != "" && cookieUserId != "");
let selectValue = "";
let isSelectable = false;
if(hasCookie){
selectValue = cookieOrg;
isSelectable = $("#orgID option[value='"+selectValue+"']").not("[disabled]").length;
if(isSelectable){
$("#orgID").val(cookieOrg);
$("#userId").val(cookieUserId);
$("#remember").prop("checked", true);
$("#password").focus();
return;
}
}
selectValue = sysSgg;
isSelectable = $("#orgID option[value='"+selectValue+"']").not("[disabled]").length;
if(isSelectable){
$("#orgID").val(selectValue);
$("#userId").focus();
} else {
$("#orgID").focus();
}
}
//업체 로그인
function BZENT_login(){
$(".login_bg").removeAttr("hidden");
$("#userFor").removeAttr("hidden");
$("#cntnSeCd").val("02");
$("#orgDiv").html(document.getElementById("bzentLoginTemplate").innerHTML);
let hasCookie = (cookieUserId != "");
if(hasCookie){
$("#userId").val(cookieUserId);
$("#remember").prop("checked", true);
$("#password").focus();
} else {
$("#userId").focus();
}
}
$("#formAuthentication input").onEnterPress(login);
document.addEventListener('keydown', (event) => {
if(event.key == "F5"){
event.preventDefault();
fnIpInfo('inter');
}
});
$(function(){
fnIpInfo();
});
</script>
</body>
</html>
Loading…
Cancel
Save