Compare commits
2 Commits
88348bda99
...
378c929f7d
| Author | SHA1 | Date |
|---|---|---|
|
|
378c929f7d | |
|
|
4ae0354227 |
|
|
@ -59,8 +59,17 @@ public class SecurityConfig{
|
|||
@Bean
|
||||
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||
http.authorizeRequests() // 페이지 권한 설정
|
||||
.antMatchers("/dashboard", "/refreshSession").hasRole(Role.USER.name()) // USER, ADMIN 접근 허용
|
||||
.antMatchers("/codeMgt/**", "/menuMgt/**", "/authMgt/**","/userMgt/**").hasRole(Role.ADMIN.name()) // ADMIN만 접근 허용
|
||||
.antMatchers(
|
||||
"/dashboard",
|
||||
"/refreshSession"
|
||||
).hasRole(Role.USER.name()) // USER, ADMIN 접근 허용
|
||||
.antMatchers(
|
||||
"/codeMgt/**",
|
||||
"/menuMgt/**",
|
||||
"/authMgt/**",
|
||||
"/userMgt/**",
|
||||
"/organMgt/**"
|
||||
).hasRole(Role.ADMIN.name()) // ADMIN만 접근 허용
|
||||
.antMatchers("/login").permitAll() // 로그인 페이지는 권한 없이 접근 허용
|
||||
.and() // 로그인 설정
|
||||
.formLogin() .loginPage("/login") // Custom login form 사용
|
||||
|
|
|
|||
|
|
@ -1,17 +1,23 @@
|
|||
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.model.OrganConfig;
|
||||
import com.dbnt.faisp.userInfo.model.UserInfo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@RequestMapping("/organMgt")
|
||||
public class OrganConfigController {
|
||||
private final OrganConfigService organConfigService;
|
||||
private final CodeMgtService codeMgtService;
|
||||
|
||||
@GetMapping("/organMgtPage")
|
||||
public ModelAndView organMgtPage(UserInfo userInfo) {
|
||||
|
|
@ -20,4 +26,36 @@ public class OrganConfigController {
|
|||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,10 +1,22 @@
|
|||
package com.dbnt.faisp.organMgt;
|
||||
|
||||
import com.dbnt.faisp.organMgt.model.OrganConfig;
|
||||
import com.dbnt.faisp.organMgt.repository.OrganConfigRepository;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,5 +26,6 @@ public class OrganConfig {
|
|||
private String parentOrgan;
|
||||
|
||||
@Transient
|
||||
private List<OrganConfig> organConfigList;
|
||||
private String organNm;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,3 +15,8 @@
|
|||
transform: translate(-50%, -50%);
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.activeTr{
|
||||
--bs-bg-opacity: 0.25;
|
||||
background-color: rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important;
|
||||
}
|
||||
|
|
@ -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 (){
|
||||
addTr('middleTbody')
|
||||
|
|
@ -9,13 +27,114 @@ $(document).on('click', '#bottomAddBtn', 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){
|
||||
if(notUsedOrganList.length===0){
|
||||
alert("추가할 수 있는 관서가 없습니다.")
|
||||
}else{
|
||||
let options = '';
|
||||
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></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>'
|
||||
)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -16,16 +16,16 @@
|
|||
<div class="row">
|
||||
<div class="col-6">
|
||||
<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 class="row justify-content-start">
|
||||
<div class="col-3" id="middleOrganDiv">
|
||||
<div class="col-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<table class="table table-striped">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
|
|
@ -43,18 +43,18 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-3" id="bottomOrganDiv">
|
||||
<div class="col-3">
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<table class="table table-striped">
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
<th>관할서</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tbody id="bottomTbody">
|
||||
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
|
|
|||
Loading…
Reference in New Issue