관서설정 작업중.

강석 최 2022-08-30 18:25:46 +09:00
parent 0b18e4b0ce
commit 4ae0354227
7 changed files with 201 additions and 17 deletions

View File

@ -59,8 +59,17 @@ public class SecurityConfig{
@Bean @Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeRequests() // 페이지 권한 설정 http.authorizeRequests() // 페이지 권한 설정
.antMatchers("/dashboard", "/refreshSession").hasRole(Role.USER.name()) // USER, ADMIN 접근 허용 .antMatchers(
.antMatchers("/codeMgt/**", "/menuMgt/**", "/authMgt/**","/userMgt/**").hasRole(Role.ADMIN.name()) // ADMIN만 접근 허용 "/dashboard",
"/refreshSession"
).hasRole(Role.USER.name()) // USER, ADMIN 접근 허용
.antMatchers(
"/codeMgt/**",
"/menuMgt/**",
"/authMgt/**",
"/userMgt/**",
"/organMgt/**"
).hasRole(Role.ADMIN.name()) // ADMIN만 접근 허용
.antMatchers("/login").permitAll() // 로그인 페이지는 권한 없이 접근 허용 .antMatchers("/login").permitAll() // 로그인 페이지는 권한 없이 접근 허용
.and() // 로그인 설정 .and() // 로그인 설정
.formLogin() .loginPage("/login") // Custom login form 사용 .formLogin() .loginPage("/login") // Custom login form 사용

View File

@ -1,17 +1,23 @@
package com.dbnt.faisp.controller; package com.dbnt.faisp.controller;
import com.dbnt.faisp.codeMgt.CodeMgtService;
import com.dbnt.faisp.codeMgt.model.CodeMgt;
import com.dbnt.faisp.organMgt.OrganConfigService; import com.dbnt.faisp.organMgt.OrganConfigService;
import com.dbnt.faisp.organMgt.model.OrganConfig;
import com.dbnt.faisp.userInfo.model.UserInfo; import com.dbnt.faisp.userInfo.model.UserInfo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import java.util.*;
@RestController @RestController
@RequiredArgsConstructor @RequiredArgsConstructor
@RequestMapping("/organMgt") @RequestMapping("/organMgt")
public class OrganConfigController { public class OrganConfigController {
private final OrganConfigService organConfigService; private final OrganConfigService organConfigService;
private final CodeMgtService codeMgtService;
@GetMapping("/organMgtPage") @GetMapping("/organMgtPage")
public ModelAndView organMgtPage(UserInfo userInfo) { public ModelAndView organMgtPage(UserInfo userInfo) {
@ -20,4 +26,36 @@ public class OrganConfigController {
return mav; return mav;
} }
@GetMapping("/selectOrganList")
public Map<String, List<Object>> selectOrganList(){
List<CodeMgt> organList = codeMgtService.selectCodeMgtList("OG");
List<OrganConfig> usedOrganList = organConfigService.selectSavedOrganList();
List<CodeMgt> notUsedOrganList = new ArrayList<>();
for(CodeMgt organCode: organList){
if(!organCode.getItemCd().equals("OG001")){
boolean usedFlag = false;
for(OrganConfig usedOrgan: usedOrganList){
if(organCode.getItemCd().equals(usedOrgan.getOrganCd())){
usedFlag = true;
usedOrgan.setOrganNm(organCode.getItemValue());
break;
}
}
if(!usedFlag){
notUsedOrganList.add(organCode);
}
}
}
Map<String, List<Object>> returnMap = new HashMap<>();
returnMap.put("notUsedOrganList", Collections.singletonList(notUsedOrganList));
returnMap.put("usedOrganList", Collections.singletonList(usedOrganList));
return returnMap;
}
@PostMapping("/saveOrganConfig")
@ResponseBody
public Integer saveOrganConfig(@RequestBody List<OrganConfig> organConfigList){
return organConfigService.saveOrganConfig(organConfigList);
}
} }

View File

@ -1,10 +1,22 @@
package com.dbnt.faisp.organMgt; package com.dbnt.faisp.organMgt;
import com.dbnt.faisp.organMgt.model.OrganConfig;
import com.dbnt.faisp.organMgt.repository.OrganConfigRepository;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class OrganConfigService { public class OrganConfigService {
private final OrganConfigRepository organConfigRepository;
public List<OrganConfig> selectSavedOrganList() {
return organConfigRepository.findAll();
}
public Integer saveOrganConfig(List<OrganConfig> organConfigList) {
return organConfigRepository.saveAll(organConfigList).size();
}
} }

View File

@ -26,5 +26,6 @@ public class OrganConfig {
private String parentOrgan; private String parentOrgan;
@Transient @Transient
private List<OrganConfig> organConfigList; private String organNm;
} }

View File

@ -14,4 +14,9 @@
top: 50%; top: 50%;
transform: translate(-50%, -50%); transform: translate(-50%, -50%);
background-color: #ffffff; background-color: #ffffff;
}
.activeTr{
--bs-bg-opacity: 0.25;
background-color: rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important;
} }

View File

@ -1,4 +1,22 @@
const organConfigList = [] let notUsedOrganList = [];
let usedOrganList = [];
let selectedMiddleOrganCd = "";
$(function (){
$.ajax({
url: '/organMgt/selectOrganList',
type: 'GET',
dataType:"json",
success: function(data){
notUsedOrganList = data.notUsedOrganList[0];
usedOrganList = data.usedOrganList[0];
setUsedOrganTr("OG001", "OGC002");
},
error:function(){
}
});
})
$(document).on('click', '#middleAddBtn', function (){ $(document).on('click', '#middleAddBtn', function (){
addTr('middleTbody') addTr('middleTbody')
@ -9,13 +27,114 @@ $(document).on('click', '#bottomAddBtn', function (){
}) })
$(document).on('click', '.rowDeleteBtn', function (){ $(document).on('click', '.rowDeleteBtn', function (){
$(this).parents('tr').remove(); const targetTr = $(this).parents('tr');
const selector = targetTr.find("select");
usedOrganList.forEach(function (organ, idx){
if(organ.organCd === selector.val()
|| organ.parentOrgan === selector.val()){
notUsedOrganList.push({
itemCd: organ.organCd,
itemValue: organ.organNm
})
usedOrganList = usedOrganList.splice(0, idx).concat(usedOrganList.splice(idx+1, usedOrganList.length));
}
})
targetTr.remove();
}) })
$(document).on('change', '.organSelector', function () {
const selectedItemCd = this.value;
const selectedItemValue = this.selectedOptions[0].text;
const tbodyId = $(this).parents('tbody').id
usedOrganList.forEach(function (organ, idx){
if(organ.organCd===selectedItemCd){
alert("이미 등록된 관서입니다.")
return null;
}
})
for(var i=0; i<this.options.length; i++){
if(this.options[i].index !== this.options.selectedIndex){
this.options[i].remove();
}
}
usedOrganList.push({
parentOrgan: tbodyId==="middleTbody"?"OG001":selectedMiddleOrganCd,
organCd: selectedItemCd,
organNm: selectedItemValue,
organType: tbodyId==="middleTbody"?"OGC002":"OGC003"
})
notUsedOrganList.forEach(function (organ, idx){
if(organ.itemCd === selectedItemCd){
notUsedOrganList = notUsedOrganList.slice(0,idx).concat(notUsedOrganList.slice(idx+1, notUsedOrganList.length));
}
})
})
$(document).on('click', '.middleTr', function (){
const activeTr = $(".activeTr");
if(activeTr.length>0){
activeTr[0].className = "middleTr";
}
this.className = "middleTr activeTr"
$("#bottomTbody").empty();
selectedMiddleOrganCd = $(this).find("select").val();
setUsedOrganTr(selectedMiddleOrganCd, "OGC003")
$("#bottomBtnRow").show();
$("#emptyTr").hide();
})
$(document).on('click', '#organSaveBtn', function (){
contentFade("in");
$.ajax({
type : 'POST',
url : "/organMgt/saveOrganConfig",
data : JSON.stringify(usedOrganList),
contentType: 'application/json',
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(data) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
})
function addTr(tbody){ function addTr(tbody){
$('#'+tbody).append( if(notUsedOrganList.length===0){
'<tr '+(tbody==="middleTbody"?'class="middleTr"':'')+'>' + alert("추가할 수 있는 관서가 없습니다.")
'<td><button class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button></td>' + }else{
'<td></td>' + let options = '';
'</tr>' notUsedOrganList.forEach(function (organ) {
) options+= '<option value="'+organ.itemCd+'">'+organ.itemValue+'</option>'
});
$('#'+tbody).append(
'<tr '+(tbody==="middleTbody"?'class="middleTr"':'')+'>' +
'<td><button class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button></td>' +
'<td><select class="organSelector form-select-sm">' +
'<option value="">선택해주세요</option>' +
options+
'</select></td>' +
'</tr>'
)
}
}
function setUsedOrganTr(parentOrgan, organType){
const target = organType==="OGC002"?$("#middleTbody"):$("#bottomTbody")
usedOrganList.forEach(function (organ){
if(organ.parentOrgan===parentOrgan && organ.organType===organType){
target.append(
'<tr '+(organType==="OGC002"?'class="middleTr"':'')+'>' +
'<td><button class="btn btn-sm btn-outline-danger rowDeleteBtn"><i class="bi bi-x"></i></button></td>' +
'<td><select class="organSelector form-select-sm">' +
'<option value="'+organ.organCd+'">'+organ.organNm+'</option>' +
'</select></td>' +
'</tr>'
)
}
})
} }

View File

@ -16,16 +16,16 @@
<div class="row"> <div class="row">
<div class="col-6"> <div class="col-6">
<div class="row justify-content-end"> <div class="row justify-content-end">
<button class="col-auto btn btn-success mx-3 my-2" id="codeSaveBtn">저장</button> <button class="col-auto btn btn-success mx-3 my-2" id="organSaveBtn">저장</button>
</div> </div>
</div> </div>
</div> </div>
<div class="row justify-content-start"> <div class="row justify-content-start">
<div class="col-3" id="middleOrganDiv"> <div class="col-3">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<table class="table table-striped"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
@ -43,18 +43,18 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-3" id="bottomOrganDiv"> <div class="col-3">
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<table class="table table-striped"> <table class="table table-hover">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th>관할서</th> <th>관할서</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody id="bottomTbody">
</tbody> </tbody>
<tfoot> <tfoot>