접속설정 페이지, 기능 추가.

강석 최 2022-12-01 18:33:01 +09:00
parent 5068c2e10f
commit ecd4237209
9 changed files with 379 additions and 163 deletions

View File

@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -69,6 +70,12 @@ public class BaseController {
return mav; return mav;
} }
@GetMapping("/resetSession")
public ModelAndView resetSession(@AuthenticationPrincipal UserInfo loginUser, HttpServletRequest request){
setSession(loginUser, request.getSession());
return new ModelAndView("redirect:/dashboard");
}
public void setSession(@AuthenticationPrincipal UserInfo loginUser, HttpSession session){ public void setSession(@AuthenticationPrincipal UserInfo loginUser, HttpSession session){
loginUser.setDownOrganCdList(organConfigService.selectDownOrganListWhereUserOgCd(loginUser.getOgCd())); loginUser.setDownOrganCdList(organConfigService.selectDownOrganListWhereUserOgCd(loginUser.getOgCd()));
loginUser.setUpOrganCdList(organConfigService.selectUpOrganListWhereUserOgCd(loginUser.getOgCd())); loginUser.setUpOrganCdList(organConfigService.selectUpOrganListWhereUserOgCd(loginUser.getOgCd()));

View File

@ -127,7 +127,8 @@ public class SecurityConfig{
"/faStatistics/**", "/faStatistics/**",
"/translator/**", "/translator/**",
"/police/**", "/police/**",
"/sri/**" "/sri/**",
"/resetSession"
).hasRole(Role.USER.name()) // USER 접근 허용 ).hasRole(Role.USER.name()) // USER 접근 허용
.antMatchers( .antMatchers(
"/authMgt/**", "/authMgt/**",

View File

@ -1,5 +1,7 @@
package com.dbnt.faisp.main.userInfo; package com.dbnt.faisp.main.userInfo;
import com.dbnt.faisp.config.BaseController;
import com.dbnt.faisp.config.SecurityConfig;
import com.dbnt.faisp.kwms.service.KwmsService; import com.dbnt.faisp.kwms.service.KwmsService;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService; import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
import com.dbnt.faisp.main.userInfo.model.UserInoutLog; import com.dbnt.faisp.main.userInfo.model.UserInoutLog;
@ -9,9 +11,14 @@ import com.dbnt.faisp.main.userInfo.model.UserInfo;
import com.dbnt.faisp.main.userInfo.service.UserLogService; import com.dbnt.faisp.main.userInfo.service.UserLogService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import java.security.Principal;
import java.util.List; import java.util.List;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
@ -27,12 +34,13 @@ public class UserMgtController {
private final KwmsService kwmsService; private final KwmsService kwmsService;
@GetMapping("/userMgtPage") @GetMapping("/userMgtPage")
public ModelAndView codeMgtPage(UserInfo userInfo) { public ModelAndView userMgtPage(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo) {
ModelAndView mav = new ModelAndView("adminPage/userMgt/userMgt"); ModelAndView mav = new ModelAndView("adminPage/userMgt/userMgt");
userInfo.setQueryInfo(); userInfo.setQueryInfo();
if(userInfo.getUserStatus() == null || userInfo.getUserStatus().equals("")) { if(userInfo.getUserStatus() == null || userInfo.getUserStatus().equals("")) {
userInfo.setUserStatus("USC003"); userInfo.setUserStatus("USC003");
} }
userInfo.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo)); mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo));
userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo)); userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo));
userInfo.setPaginationInfo(); userInfo.setPaginationInfo();
@ -41,7 +49,7 @@ public class UserMgtController {
} }
@GetMapping("/userEditModal") @GetMapping("/userEditModal")
public ModelAndView menuEditModal(UserInfo userInfo){ public ModelAndView userEditModal(UserInfo userInfo){
ModelAndView mav = new ModelAndView("adminPage/userMgt/userEditModal"); ModelAndView mav = new ModelAndView("adminPage/userMgt/userEditModal");
mav.addObject("ogList", codeMgtService.selectCodeMgtList("OG")); mav.addObject("ogList", codeMgtService.selectCodeMgtList("OG"));
mav.addObject("ofcList", codeMgtService.selectCodeMgtList("OFC")); mav.addObject("ofcList", codeMgtService.selectCodeMgtList("OFC"));
@ -120,4 +128,23 @@ public class UserMgtController {
mav.addObject("searchParams", inoutLog); mav.addObject("searchParams", inoutLog);
return mav; return mav;
} }
@GetMapping("/accessChangePage")
public ModelAndView accessChangePage(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo){
ModelAndView mav = new ModelAndView("adminPage/userMgt/accessChange");
userInfo.setQueryInfo();
userInfo.setUserStatus("USC003");
userInfo.setUserRole(loginUser.getUserRole());
userInfo.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo));
userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo));
userInfo.setPaginationInfo();
mav.addObject("searchParams", userInfo);
return mav;
}
@PostMapping("/changeAccessUser")
public void changeAccessUser(UserInfo userInfo){
UserDetails user = userInfoService.loadUserByUsername(userInfo.getUserId());
Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} }

View File

@ -7,28 +7,40 @@
<sql id="selectUserInfoWhere"> <sql id="selectUserInfoWhere">
<where> <where>
<choose> <choose>
<when test="userStatus != null and userStatus != ''"> <when test='userStatus != null and userStatus != ""'>
user_status = #{userStatus} user_status = #{userStatus}
</when> </when>
<otherwise> <otherwise>
user_status != 'D' user_status != 'D'
</otherwise> </otherwise>
</choose> </choose>
<if test="userId != null and userId != ''"> <if test='userId != null and userId != ""'>
and user_id like '%'||#{userId}||'%' and user_id like '%'||#{userId}||'%'
</if> </if>
<if test="userNm != null and userNm != ''"> <if test='userNm != null and userNm != ""'>
and user_nm like '%'||#{userNm}||'%' and user_nm like '%'||#{userNm}||'%'
</if> </if>
<if test="ogCd != null and ogCd != ''"> <if test='ogCd != null and ogCd != ""'>
and og_cd = #{ogCd} and og_cd = #{ogCd}
</if> </if>
<if test="ofcCd != null and ofcCd != ''"> <if test='ofcCd != null and ofcCd != ""'>
and ofc_cd = #{ofcCd} and ofc_cd = #{ofcCd}
</if> </if>
<if test="titleCd != null and titleCd != ''"> <if test='titleCd != null and titleCd != ""'>
and title_cd = #{titleCd} and title_cd = #{titleCd}
</if> </if>
<if test='userRole == "ROLE_ADMIN,ROLE_SUB_ADMIN,ROLE_USER"'>
and user_role like '%ROLE_USER'
</if>
<if test='userRole == "ROLE_SUB_ADMIN,ROLE_USER"'>
and (user_role = 'ROLE_SUB_ADMIN,ROLE_USER' or user_role = 'ROLE_USER')
</if>
<if test="downOrganCdList != null">
and og_cd in
<foreach collection="downOrganCdList" item="organCd" separator="," open="(" close=")">
#{organCd}
</foreach>
</if>
</where> </where>
</sql> </sql>
<select id="selectUserInfoList" resultType="UserInfo" parameterType="UserInfo"> <select id="selectUserInfoList" resultType="UserInfo" parameterType="UserInfo">

View File

@ -1,71 +1,71 @@
$(document).on('click', '#addCellPhone', function (){ $(document).on('click', '#addCellPhone', function (){
showModal(null); showModal(null);
}) })
$(document).on('change', '#mgtOrgan', function (){ $(document).on('change', '#mgtOrgan', function (){
const ogCd = $(this).val(); const ogCd = $(this).val();
if(ogCd != ''){ if(ogCd != ''){
changeManager(ogCd); changeManager(ogCd);
}else{ }else{
$("#pUserSeq").prop('disabled',true); $("#pUserSeq").prop('disabled',true);
$("#pUserSeq").val(''); $("#pUserSeq").val('');
} }
}); });
function changeManager(ogCd){ function changeManager(ogCd){
$.ajax({ $.ajax({
url: '/equip/cellPhoneSelecBox', url: '/equip/cellPhoneSelecBox',
data: { data: {
ogCd, ogCd,
}, },
type: 'GET', type: 'GET',
dataType:"html", dataType:"html",
success: function(html){ success: function(html){
$("#pUserSeq").empty().append(html); $("#pUserSeq").empty().append(html);
$("#pUserSeq").prop('disabled',false); $("#pUserSeq").prop('disabled',false);
}, },
error:function(){ error:function(){
} }
}); });
} }
$(document).on('click', '#saveCellPhone', function (){ $(document).on('click', '#saveCellPhone', function (){
if(Validation()){ if(Validation()){
if(confirm("저장하시겠습니까?")){ if(confirm("저장하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false; document.getElementById("mgtOrgan").disabled = false;
contentFade("in"); contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]); const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({ $.ajax({
type : 'POST', type : 'POST',
data : formData, data : formData,
url : "/equip/saveCellPhone", url : "/equip/saveCellPhone",
processData: false, processData: false,
contentType: false, contentType: false,
success : function(result) { success : function(result) {
alert("저장되었습니다."); alert("저장되었습니다.");
contentFade("out"); contentFade("out");
location.reload(); location.reload();
}, },
error : function(xhr, status) { error : function(xhr, status) {
alert("저장에 실패하였습니다.") alert("저장에 실패하였습니다.")
contentFade("out"); contentFade("out");
} }
}) })
}
} }
}
}) })
$(document).on('click', '.cellPhoneTr', function (event){ $(document).on('click', '.cellPhoneTr', function (event){
const target = event.target; const target = event.target;
if(!(target.className === "cpChk" ||$(target).parents("td").length>0)){ if(!(target.className === "cpChk" ||$(target).parents("td").length>0)){
const phoneKey = (Number($(this).find(".phoneKey").val())); const phoneKey = (Number($(this).find(".phoneKey").val()));
showModal(phoneKey); showModal(phoneKey);
} }
}); });
function showModal(phoneKey){ function showModal(phoneKey){
$.ajax({ $.ajax({
url: '/equip/cellPhoneEditModal', url: '/equip/cellPhoneEditModal',
data: {phoneKey: phoneKey}, data: {phoneKey: phoneKey},
type: 'GET', type: 'GET',
@ -74,7 +74,7 @@ function showModal(phoneKey){
$("#cellPhoneEditModalContent").empty().append(html); $("#cellPhoneEditModalContent").empty().append(html);
$("#cellPhoneEditModal").modal('show'); $("#cellPhoneEditModal").modal('show');
if(phoneKey == null){ if(phoneKey == null){
changeManager($("#mgtOrgan").val()); changeManager($("#mgtOrgan").val());
} }
}, },
error:function(){ error:function(){
@ -84,29 +84,29 @@ function showModal(phoneKey){
} }
$(document).on('click', '#updateCellPhone', function (){ $(document).on('click', '#updateCellPhone', function (){
if(Validation()){ if(Validation()){
if(confirm("수정하시겠습니까?")){ if(confirm("수정하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false; document.getElementById("mgtOrgan").disabled = false;
contentFade("in"); contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]); const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({ $.ajax({
type : 'POST', type : 'POST',
data : formData, data : formData,
url : "/equip/saveCellPhone", url : "/equip/saveCellPhone",
processData: false, processData: false,
contentType: false, contentType: false,
success : function(result) { success : function(result) {
alert("수정되었습니다."); alert("수정되었습니다.");
contentFade("out"); contentFade("out");
showModal(result); showModal(result);
}, },
error : function(xhr, status) { error : function(xhr, status) {
alert("수정에 실패하였습니다.") alert("수정에 실패하였습니다.")
contentFade("out"); contentFade("out");
} }
}) })
} }
} }
}) })
$(document).ready( function() { $(document).ready( function() {
@ -116,93 +116,93 @@ $(document).ready( function() {
}); });
$(document).on('click', '#deleteCellPhone', function (){ $(document).on('click', '#deleteCellPhone', function (){
if($('input:checkbox[name=cpChk]:checked').length < 1){ if($('input:checkbox[name=cpChk]:checked').length < 1){
alert("게시물을 선택해주세요") alert("게시물을 선택해주세요")
return false; return false;
} }
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){ if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = []; const checkArr = [];
$('input:checkbox[name=cpChk]:checked').each(function (idx, el){ $('input:checkbox[name=cpChk]:checked').each(function (idx, el){
checkArr.push({}); checkArr.push({});
const target = $(el); const target = $(el);
checkArr[idx].phoneKey = Number(target.parents('tr').find('.phoneKey').val()); checkArr[idx].phoneKey = Number(target.parents('tr').find('.phoneKey').val());
}) })
deleteCellPhone(checkArr); deleteCellPhone(checkArr);
} }
}) })
$(document).on('click', '#deleteCellPhoneM', function (){ $(document).on('click', '#deleteCellPhoneM', function (){
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){ if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = []; const checkArr = [];
checkArr.push({}); checkArr.push({});
checkArr[0].phoneKey = Number( $('input[name=phoneKey]').val()); checkArr[0].phoneKey = Number( $('input[name=phoneKey]').val());
deleteCellPhone(checkArr); deleteCellPhone(checkArr);
} }
}) })
function deleteCellPhone(checkArr){ function deleteCellPhone(checkArr){
$.ajax({ $.ajax({
type : 'POST', type : 'POST',
url : "/equip/deleteCellPhone", url : "/equip/deleteCellPhone",
data : JSON.stringify(checkArr), data : JSON.stringify(checkArr),
contentType: 'application/json', contentType: 'application/json',
beforeSend: function (xhr){ beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
}, },
success : function() { success : function() {
alert("삭제처리 되었습니다."); alert("삭제처리 되었습니다.");
location.reload(); location.reload();
}, },
error : function(xhr, status) { error : function(xhr, status) {
alert("삭제처리에 실패하였습니다"); alert("삭제처리에 실패하였습니다");
} }
}) })
} }
$(document).on('click', '#goExcel', function (){ $(document).on('click', '#goExcel', function (){
if(confirm("엑셀로 다운로드 하시겠습니까?")){ if(confirm("엑셀로 다운로드 하시겠습니까?")){
$('input[name=excel]').val('Y'); $('input[name=excel]').val('Y');
$('#searchFm').submit(); $('#searchFm').submit();
$('input[name=excel]').val(''); $('input[name=excel]').val('');
}else{ }else{
false; false;
} }
}) })
function Validation(){ function Validation(){
let flag = true; let flag = true;
const emailRule = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i; const emailRule = /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i;
const regExp = /^\d{2,3}-\d{3,4}-\d{4}$/; const regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
if($('#mgtOrgan').val() == ""){ if($('#mgtOrgan').val() == ""){
alert("관리처를 선택해주세요."); alert("관리처를 선택해주세요.");
$('#mgtOrgan').focus(); $('#mgtOrgan').focus();
flag = false; flag = false;
} }
if($('#pUserSeq').val() == ""){ if($('#pUserSeq').val() == ""){
alert("사용자를 선택해주세요."); alert("사용자를 선택해주세요.");
$('#pUserSeq').focus(); $('#pUserSeq').focus();
flag = false; flag = false;
} }
if($('#telNo').val() != ""){ if($('#telNo').val() != ""){
if(!regExp.test($("input[id='telNo']").val())) { if(!regExp.test($("input[id='telNo']").val())) {
alert("전화번호 형식이 맞지않습니다."); alert("전화번호 형식이 맞지않습니다.");
$('#telNo').focus(); $('#telNo').focus();
flag = false; flag = false;
} }
} }
if($('#extMail').val() != ""){ if($('#extMail').val() != ""){
if(!emailRule.test($("input[id='extMail']").val())) { if(!emailRule.test($("input[id='extMail']").val())) {
alert("이메일 형식이 맞지않습니다."); alert("이메일 형식이 맞지않습니다.");
$('#extMail').focus(); $('#extMail').focus();
flag = false; flag = false;
} }
} }
return flag; return flag;
} }
$(document).on('click', '#btn-close', function (){ $(document).on('click', '#btn-close', function (){
location.reload(); location.reload();
}) })

View File

@ -0,0 +1,26 @@
$(document).on('click', '.userInfoTr', function (){
const selectedTr = $(this);
if(confirm(selectedTr.find(".userNm").val()+"으로 접속 정보를 변경하시겠습니까?")){
contentFade("in");
const formData = new FormData();
formData.append("userSeq", selectedTr.find(".userSeq").val());
formData.append("userId", selectedTr.find(".userId").val());
$.ajax({
type : 'POST',
data : formData,
url : "/userMgt/changeAccessUser",
processData: false,
contentType: false,
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(result) {
location.href = "/resetSession";
},
error : function(xhr, status) {
alert("다시 시도해주십시오.")
contentFade("out");
}
})
}
})

View File

@ -0,0 +1,143 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<script type="text/javascript" th:src="@{/js/userMgt/accessChange.js}"></script>
</th:block>
<div layout:fragment="content">
<main>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<h4>접속 설정</h4>
<div class="card bg-light">
<div class="card-body">
<form method="get" th:action="@{/userMgt/accessChangePage}">
<input type="hidden" name="userStatus" id="userStatus" th:value="${searchParams.userStatus}">
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
<div class="row justify-content-between py-1">
<div class="col-auto">
<select class="form-select form-select-sm" name="rowCnt" id="rowCnt">
<th:block th:each="num : ${#numbers.sequence(1,5)}">
<option th:value="${num*10}" th:text="${num*10}" th:selected="${searchParams.rowCnt==num*10}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<div class="row justify-content-end">
<div class="col-auto">
<select class="form-select form-select-sm" name="ogCd">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ogCd==commonCode.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="ofcCd">
<option value="">부서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.ofcCd==commonCode.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="titleCd">
<option value="">계급 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('JT')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${searchParams.titleCd==commonCode.itemCd}"></option>
</th:block>
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userNm" placeholder="사용자명" th:value="${searchParams.userNm}">
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" name="userId" placeholder="사용자 아이디" th:value="${searchParams.userId}">
</div>
<div class="col-auto">
<input type="submit" class="btn btn-sm btn-primary" id="searchBtn" value="검색">
</div>
</div>
</div>
</div>
</form>
<div class="card">
<div class="card-body">
<div class="row">
<div class="col-12">
<table class="table table-sm table-hover table-bordered">
<thead>
<tr class="table-secondary">
<th>소속</th>
<th>부서</th>
<th>계급</th>
<th>성명</th>
<th>아이디</th>
<th>식별번호</th>
<th>등록일</th>
</tr>
</thead>
<tbody class="table-group-divider">
<tr class="userInfoTr" th:each="userInfo:${userInfoList}">
<input type="hidden" class="userSeq" th:value="${userInfo.userSeq}">
<input type="hidden" class="userId" th:value="${userInfo.userId}">
<input type="hidden" class="userNm" th:value="${userInfo.userNm}">
<td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<th:block th:if="${commonCode.itemCd == userInfo.ogCd}" th:text="${commonCode.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<th:block th:if="${commonCode.itemCd == userInfo.ofcCd}" th:text="${commonCode.itemValue}"></th:block>
</th:block>
</td>
<td>
<th:block th:each="commonCode:${session.commonCode.get('JT')}">
<th:block th:if="${commonCode.itemCd == userInfo.titleCd}" th:text="${commonCode.itemValue}"></th:block>
</th:block>
</td>
<td th:text="${userInfo.userNm}"></td>
<td th:text="${userInfo.userId}"></td>
<td th:text="${userInfo.dicCode}"></td>
<td th:text="${#temporals.format(userInfo.wrtDt, 'yyyy-MM-dd HH:mm:ss')}"></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row justify-content-center">
<div class="col-auto">
<nav aria-label="Page navigation">
<ul class="pagination mb-0">
<th:block th:if="${searchParams.pageIndex>3}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)-3}">
<a class="page-link" href="#" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
</th:block>
<th:block th:each="num : ${#numbers.sequence(searchParams.startNum, searchParams.endNum)}">
<li class="page-item" th:data-pageindex="${num}" th:classappend="${searchParams.pageIndex==num?'active':''}">
<a class="page-link" href="#" th:text="${num}"></a>
</li>
</th:block>
<th:block th:if="${searchParams.maxNum>searchParams.endNum+2}">
<li class="page-item" th:data-pageindex="${(searchParams.pageIndex)+3}">
<a class="page-link" href="#" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</th:block>
</ul>
</nav>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</html>

View File

@ -146,13 +146,6 @@
<option value="N" th:selected="${searchParams.isDamboUnpaidAmount eq 'N'}">X</option> <option value="N" th:selected="${searchParams.isDamboUnpaidAmount eq 'N'}">X</option>
</select> </select>
</div> </div>
<div class="col-2">
<select class="form-select form-select-sm" name="isDirectHandoverDt" th:value="${searchParams.isDirectHandoverDt}">
<option value="">직접인계 여부</option>
<option value="Y" th:selected="${searchParams.isDirectHandoverDt eq 'Y'}">O</option>
<option value="N" th:selected="${searchParams.isDirectHandoverDt eq 'N'}">X</option>
</select>
</div>
<div class="col-2"> <div class="col-2">
<select class="form-select form-select-sm" name="isEvictionDt" th:value="${searchParams.isEvictionDt}"> <select class="form-select form-select-sm" name="isEvictionDt" th:value="${searchParams.isEvictionDt}">
<option value="">퇴거여부</option> <option value="">퇴거여부</option>
@ -174,7 +167,6 @@
<option value="N" th:selected="${searchParams.isConsignmentStartDt eq 'N'}">X</option> <option value="N" th:selected="${searchParams.isConsignmentStartDt eq 'N'}">X</option>
</select> </select>
</div> </div>
<div class="col-2"></div>
<div class="col-2"> <div class="col-2">
<select class="form-select form-select-sm" name="isConfiscationDt" th:value="${searchParams.isConfiscationDt}"> <select class="form-select form-select-sm" name="isConfiscationDt" th:value="${searchParams.isConfiscationDt}">
<option value="">침몰여부</option> <option value="">침몰여부</option>
@ -182,6 +174,7 @@
<option value="N" th:selected="${searchParams.isConfiscationDt eq 'N'}">X</option> <option value="N" th:selected="${searchParams.isConfiscationDt eq 'N'}">X</option>
</select> </select>
</div> </div>
<div class="col-2"></div>
<div class="col-2"> <div class="col-2">
<select class="form-select form-select-sm" name="boatDisposalType" th:value="${searchParams.boatDisposalType}"> <select class="form-select form-select-sm" name="boatDisposalType" th:value="${searchParams.boatDisposalType}">
<option value="">폐선종류</option> <option value="">폐선종류</option>
@ -191,6 +184,13 @@
</th:block> </th:block>
</select> </select>
</div> </div>
<div class="col-2">
<select class="form-select form-select-sm" name="isDirectHandoverDt" th:value="${searchParams.isDirectHandoverDt}">
<option value="">직접인계 여부</option>
<option value="Y" th:selected="${searchParams.isDirectHandoverDt eq 'Y'}">O</option>
<option value="N" th:selected="${searchParams.isDirectHandoverDt eq 'N'}">X</option>
</select>
</div>
<div class="col-2"> <div class="col-2">
<input class="form-control form-control-sm" name="handoverSeaPointDetail" id="handoverSeaPointDetail" placeholder="직접인계 해점" th:value="${searchParams.handoverSeaPointDetail}"> <input class="form-control form-control-sm" name="handoverSeaPointDetail" id="handoverSeaPointDetail" placeholder="직접인계 해점" th:value="${searchParams.handoverSeaPointDetail}">
</div> </div>

View File

@ -29,7 +29,7 @@
<li><a href="/userMgt/userMgtPage" class="dropdown-item">외사경찰관리</a></li> <li><a href="/userMgt/userMgtPage" class="dropdown-item">외사경찰관리</a></li>
<li><a href="/authMgt/authMgtPage" class="dropdown-item">권한설정</a></li> <li><a href="/authMgt/authMgtPage" class="dropdown-item">권한설정</a></li>
<li><a href="/userMgt/userLog/requestLog" class="dropdown-item">사용자로그</a></li> <li><a href="/userMgt/userLog/requestLog" class="dropdown-item">사용자로그</a></li>
<li><a href="#" class="dropdown-item disabled">접속설정</a></li> <li><a href="/userMgt/accessChangePage" class="dropdown-item">접속설정</a></li>
</th:block> </th:block>
</ul> </ul>
</li> </li>