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

강석 최 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.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;
@ -69,6 +70,12 @@ public class BaseController {
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){
loginUser.setDownOrganCdList(organConfigService.selectDownOrganListWhereUserOgCd(loginUser.getOgCd()));
loginUser.setUpOrganCdList(organConfigService.selectUpOrganListWhereUserOgCd(loginUser.getOgCd()));

View File

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

View File

@ -1,5 +1,7 @@
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.main.codeMgt.service.CodeMgtService;
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 lombok.RequiredArgsConstructor;
import java.security.Principal;
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.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@ -27,12 +34,13 @@ public class UserMgtController {
private final KwmsService kwmsService;
@GetMapping("/userMgtPage")
public ModelAndView codeMgtPage(UserInfo userInfo) {
public ModelAndView userMgtPage(@AuthenticationPrincipal UserInfo loginUser, UserInfo userInfo) {
ModelAndView mav = new ModelAndView("adminPage/userMgt/userMgt");
userInfo.setQueryInfo();
if(userInfo.getUserStatus() == null || userInfo.getUserStatus().equals("")) {
userInfo.setUserStatus("USC003");
}
userInfo.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("userInfoList", userInfoService.selectUserInfoList(userInfo));
userInfo.setContentCnt(userInfoService.selectUserInfoListCnt(userInfo));
userInfo.setPaginationInfo();
@ -41,7 +49,7 @@ public class UserMgtController {
}
@GetMapping("/userEditModal")
public ModelAndView menuEditModal(UserInfo userInfo){
public ModelAndView userEditModal(UserInfo userInfo){
ModelAndView mav = new ModelAndView("adminPage/userMgt/userEditModal");
mav.addObject("ogList", codeMgtService.selectCodeMgtList("OG"));
mav.addObject("ofcList", codeMgtService.selectCodeMgtList("OFC"));
@ -120,4 +128,23 @@ public class UserMgtController {
mav.addObject("searchParams", inoutLog);
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">
<where>
<choose>
<when test="userStatus != null and userStatus != ''">
<when test='userStatus != null and userStatus != ""'>
user_status = #{userStatus}
</when>
<otherwise>
user_status != 'D'
</otherwise>
</choose>
<if test="userId != null and userId != ''">
<if test='userId != null and userId != ""'>
and user_id like '%'||#{userId}||'%'
</if>
<if test="userNm != null and userNm != ''">
<if test='userNm != null and userNm != ""'>
and user_nm like '%'||#{userNm}||'%'
</if>
<if test="ogCd != null and ogCd != ''">
<if test='ogCd != null and ogCd != ""'>
and og_cd = #{ogCd}
</if>
<if test="ofcCd != null and ofcCd != ''">
<if test='ofcCd != null and ofcCd != ""'>
and ofc_cd = #{ofcCd}
</if>
<if test="titleCd != null and titleCd != ''">
<if test='titleCd != null and titleCd != ""'>
and title_cd = #{titleCd}
</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>
</sql>
<select id="selectUserInfoList" resultType="UserInfo" parameterType="UserInfo">

View File

@ -1,71 +1,71 @@
$(document).on('click', '#addCellPhone', function (){
showModal(null);
showModal(null);
})
$(document).on('change', '#mgtOrgan', function (){
const ogCd = $(this).val();
if(ogCd != ''){
changeManager(ogCd);
const ogCd = $(this).val();
if(ogCd != ''){
changeManager(ogCd);
}else{
$("#pUserSeq").prop('disabled',true);
$("#pUserSeq").val('');
$("#pUserSeq").prop('disabled',true);
$("#pUserSeq").val('');
}
});
function changeManager(ogCd){
$.ajax({
url: '/equip/cellPhoneSelecBox',
data: {
ogCd,
},
type: 'GET',
dataType:"html",
success: function(html){
$("#pUserSeq").empty().append(html);
$("#pUserSeq").prop('disabled',false);
},
error:function(){
}
});
$.ajax({
url: '/equip/cellPhoneSelecBox',
data: {
ogCd,
},
type: 'GET',
dataType:"html",
success: function(html){
$("#pUserSeq").empty().append(html);
$("#pUserSeq").prop('disabled',false);
},
error:function(){
}
});
}
$(document).on('click', '#saveCellPhone', function (){
if(Validation()){
if(confirm("저장하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false;
contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/equip/saveCellPhone",
processData: false,
contentType: false,
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
if(Validation()){
if(confirm("저장하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false;
contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/equip/saveCellPhone",
processData: false,
contentType: false,
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}
}
})
$(document).on('click', '.cellPhoneTr', function (event){
const target = event.target;
if(!(target.className === "cpChk" ||$(target).parents("td").length>0)){
const phoneKey = (Number($(this).find(".phoneKey").val()));
showModal(phoneKey);
}
const target = event.target;
if(!(target.className === "cpChk" ||$(target).parents("td").length>0)){
const phoneKey = (Number($(this).find(".phoneKey").val()));
showModal(phoneKey);
}
});
function showModal(phoneKey){
$.ajax({
function showModal(phoneKey){
$.ajax({
url: '/equip/cellPhoneEditModal',
data: {phoneKey: phoneKey},
type: 'GET',
@ -74,7 +74,7 @@ function showModal(phoneKey){
$("#cellPhoneEditModalContent").empty().append(html);
$("#cellPhoneEditModal").modal('show');
if(phoneKey == null){
changeManager($("#mgtOrgan").val());
changeManager($("#mgtOrgan").val());
}
},
error:function(){
@ -84,29 +84,29 @@ function showModal(phoneKey){
}
$(document).on('click', '#updateCellPhone', function (){
if(Validation()){
if(confirm("수정하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false;
contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/equip/saveCellPhone",
processData: false,
contentType: false,
success : function(result) {
alert("수정되었습니다.");
contentFade("out");
showModal(result);
},
error : function(xhr, status) {
alert("수정에 실패하였습니다.")
contentFade("out");
}
})
}
}
if(Validation()){
if(confirm("수정하시겠습니까?")){
document.getElementById("mgtOrgan").disabled = false;
contentFade("in");
const formData = new FormData($("#cellPhoneEditFm")[0]);
$.ajax({
type : 'POST',
data : formData,
url : "/equip/saveCellPhone",
processData: false,
contentType: false,
success : function(result) {
alert("수정되었습니다.");
contentFade("out");
showModal(result);
},
error : function(xhr, status) {
alert("수정에 실패하였습니다.")
contentFade("out");
}
})
}
}
})
$(document).ready( function() {
@ -116,93 +116,93 @@ $(document).ready( function() {
});
$(document).on('click', '#deleteCellPhone', function (){
if($('input:checkbox[name=cpChk]:checked').length < 1){
alert("게시물을 선택해주세요")
return false;
}
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = [];
$('input:checkbox[name=cpChk]:checked').each(function (idx, el){
checkArr.push({});
const target = $(el);
checkArr[idx].phoneKey = Number(target.parents('tr').find('.phoneKey').val());
})
deleteCellPhone(checkArr);
if($('input:checkbox[name=cpChk]:checked').length < 1){
alert("게시물을 선택해주세요")
return false;
}
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = [];
$('input:checkbox[name=cpChk]:checked').each(function (idx, el){
checkArr.push({});
const target = $(el);
checkArr[idx].phoneKey = Number(target.parents('tr').find('.phoneKey').val());
})
deleteCellPhone(checkArr);
}
}
})
$(document).on('click', '#deleteCellPhoneM', function (){
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = [];
checkArr.push({});
checkArr[0].phoneKey = Number( $('input[name=phoneKey]').val());
deleteCellPhone(checkArr);
}
if(confirm("선택한 대상을 삭제처리 하시겠습니까?")){
const checkArr = [];
checkArr.push({});
checkArr[0].phoneKey = Number( $('input[name=phoneKey]').val());
deleteCellPhone(checkArr);
}
})
function deleteCellPhone(checkArr){
$.ajax({
type : 'POST',
url : "/equip/deleteCellPhone",
data : JSON.stringify(checkArr),
contentType: 'application/json',
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function() {
alert("삭제처리 되었습니다.");
location.reload();
},
error : function(xhr, status) {
alert("삭제처리에 실패하였습니다");
}
})
$.ajax({
type : 'POST',
url : "/equip/deleteCellPhone",
data : JSON.stringify(checkArr),
contentType: 'application/json',
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function() {
alert("삭제처리 되었습니다.");
location.reload();
},
error : function(xhr, status) {
alert("삭제처리에 실패하였습니다");
}
})
}
$(document).on('click', '#goExcel', function (){
if(confirm("엑셀로 다운로드 하시겠습니까?")){
$('input[name=excel]').val('Y');
$('#searchFm').submit();
$('input[name=excel]').val('');
}else{
false;
}
if(confirm("엑셀로 다운로드 하시겠습니까?")){
$('input[name=excel]').val('Y');
$('#searchFm').submit();
$('input[name=excel]').val('');
}else{
false;
}
})
function Validation(){
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 regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
if($('#mgtOrgan').val() == ""){
alert("관리처를 선택해주세요.");
$('#mgtOrgan').focus();
flag = false;
}
if($('#pUserSeq').val() == ""){
alert("사용자를 선택해주세요.");
$('#pUserSeq').focus();
flag = false;
}
if($('#telNo').val() != ""){
if(!regExp.test($("input[id='telNo']").val())) {
alert("전화번호 형식이 맞지않습니다.");
$('#telNo').focus();
flag = false;
}
}
if($('#extMail').val() != ""){
if(!emailRule.test($("input[id='extMail']").val())) {
alert("이메일 형식이 맞지않습니다.");
$('#extMail').focus();
flag = false;
}
}
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 regExp = /^\d{2,3}-\d{3,4}-\d{4}$/;
if($('#mgtOrgan').val() == ""){
alert("관리처를 선택해주세요.");
$('#mgtOrgan').focus();
flag = false;
}
if($('#pUserSeq').val() == ""){
alert("사용자를 선택해주세요.");
$('#pUserSeq').focus();
flag = false;
}
if($('#telNo').val() != ""){
if(!regExp.test($("input[id='telNo']").val())) {
alert("전화번호 형식이 맞지않습니다.");
$('#telNo').focus();
flag = false;
}
}
if($('#extMail').val() != ""){
if(!emailRule.test($("input[id='extMail']").val())) {
alert("이메일 형식이 맞지않습니다.");
$('#extMail').focus();
flag = false;
}
}
return flag;
}
$(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>
</select>
</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">
<select class="form-select form-select-sm" name="isEvictionDt" th:value="${searchParams.isEvictionDt}">
<option value="">퇴거여부</option>
@ -174,7 +167,6 @@
<option value="N" th:selected="${searchParams.isConsignmentStartDt eq 'N'}">X</option>
</select>
</div>
<div class="col-2"></div>
<div class="col-2">
<select class="form-select form-select-sm" name="isConfiscationDt" th:value="${searchParams.isConfiscationDt}">
<option value="">침몰여부</option>
@ -182,6 +174,7 @@
<option value="N" th:selected="${searchParams.isConfiscationDt eq 'N'}">X</option>
</select>
</div>
<div class="col-2"></div>
<div class="col-2">
<select class="form-select form-select-sm" name="boatDisposalType" th:value="${searchParams.boatDisposalType}">
<option value="">폐선종류</option>
@ -191,6 +184,13 @@
</th:block>
</select>
</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">
<input class="form-control form-control-sm" name="handoverSeaPointDetail" id="handoverSeaPointDetail" placeholder="직접인계 해점" th:value="${searchParams.handoverSeaPointDetail}">
</div>

View File

@ -29,7 +29,7 @@
<li><a href="/userMgt/userMgtPage" 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="#" class="dropdown-item disabled">접속설정</a></li>
<li><a href="/userMgt/accessChangePage" class="dropdown-item">접속설정</a></li>
</th:block>
</ul>
</li>