Merge branch 'master' of http://118.219.150.34:50501/DBNT/FAISP
commit
fb12964682
|
|
@ -0,0 +1,54 @@
|
||||||
|
package com.dbnt.faisp.controller;
|
||||||
|
|
||||||
|
import com.dbnt.faisp.authMgt.AuthMgtService;
|
||||||
|
import com.dbnt.faisp.codeMgt.CodeMgtService;
|
||||||
|
import com.dbnt.faisp.menuMgt.MenuMgtService;
|
||||||
|
import com.dbnt.faisp.menuMgt.model.MenuMgt;
|
||||||
|
import com.dbnt.faisp.organMgt.OrganConfigService;
|
||||||
|
import com.dbnt.faisp.translator.TranslatorService;
|
||||||
|
import com.dbnt.faisp.translator.model.Translator;
|
||||||
|
import com.dbnt.faisp.userInfo.UserInfoService;
|
||||||
|
import com.dbnt.faisp.userInfo.model.UserInfo;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import org.springframework.web.servlet.ModelAndView;
|
||||||
|
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RequestMapping("/translator")
|
||||||
|
public class TranslatorController {
|
||||||
|
|
||||||
|
private final MenuMgtService menuMgtService;
|
||||||
|
private final UserInfoService userInfoService;
|
||||||
|
private final AuthMgtService authMgtService;
|
||||||
|
private final CodeMgtService codeMgtService;
|
||||||
|
private final TranslatorService translatorSevice;
|
||||||
|
private final OrganConfigService organConfigService;
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/info")
|
||||||
|
public ModelAndView translatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator) {
|
||||||
|
ModelAndView mav = new ModelAndView("translator/translator");
|
||||||
|
translator.setOrganCdList(organConfigService.selectOrganListWhereUserOgCd(loginUser.getOgCd()));
|
||||||
|
System.out.println("@@="+translator.getOrganCdList());
|
||||||
|
translator.setQueryInfo();
|
||||||
|
mav.addObject("translatorList", translatorSevice.selectTranslatorList(translator));
|
||||||
|
translator.setContentCnt(translatorSevice.selectTranslatorListCnt(translator));
|
||||||
|
translator.setPaginationInfo();
|
||||||
|
mav.addObject("searchParams", translator);
|
||||||
|
return mav;
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/insertTranslatorInfo")
|
||||||
|
public String insertTranslatorInfo(@AuthenticationPrincipal UserInfo loginUser,Translator translator) {
|
||||||
|
translator.setWrtNm(loginUser.getUserId());
|
||||||
|
translator.setWrtOrgan(loginUser.getOgCd());
|
||||||
|
return translatorSevice.insertTranslatorInfo(translator);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
package com.dbnt.faisp.translator;
|
||||||
|
|
||||||
|
import com.dbnt.faisp.menuMgt.mapper.MenuMgtMapper;
|
||||||
|
import com.dbnt.faisp.menuMgt.model.MenuMgt;
|
||||||
|
import com.dbnt.faisp.menuMgt.repository.MenuMgtRepository;
|
||||||
|
import com.dbnt.faisp.translator.mapper.TranslatorMapper;
|
||||||
|
import com.dbnt.faisp.translator.model.Translator;
|
||||||
|
import com.dbnt.faisp.translator.repository.TranslatorRepository;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.persistence.Transient;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class TranslatorService {
|
||||||
|
|
||||||
|
private final TranslatorRepository translatorRepository;
|
||||||
|
private final TranslatorMapper translatorMapper;
|
||||||
|
|
||||||
|
|
||||||
|
public String insertTranslatorInfo(Translator translator) {
|
||||||
|
translator.setWrtDt(LocalDateTime.now());
|
||||||
|
return translatorRepository.save(translator).getTrName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<Translator> selectTranslatorList(Translator translator) {
|
||||||
|
return translatorMapper.selectTranslatorList(translator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Integer selectTranslatorListCnt(Translator translator) {
|
||||||
|
return translatorMapper.selectTranslatorListCnt(translator);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.dbnt.faisp.translator.mapper;
|
||||||
|
|
||||||
|
import com.dbnt.faisp.translator.model.Translator;
|
||||||
|
import com.dbnt.faisp.userInfo.model.UserInfo;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface TranslatorMapper {
|
||||||
|
|
||||||
|
List<Translator> selectTranslatorList(Translator translator);
|
||||||
|
|
||||||
|
Integer selectTranslatorListCnt(Translator translator);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
package com.dbnt.faisp.translator.model;
|
||||||
|
|
||||||
|
import com.dbnt.faisp.authMgt.model.AccessConfig;
|
||||||
|
import com.dbnt.faisp.authMgt.model.ApprovalConfig;
|
||||||
|
import com.dbnt.faisp.config.BaseModel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
import org.springframework.security.core.GrantedAuthority;
|
||||||
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@Entity
|
||||||
|
@NoArgsConstructor
|
||||||
|
@DynamicInsert
|
||||||
|
@DynamicUpdate
|
||||||
|
@Table(name = "translator_info")
|
||||||
|
public class Translator extends BaseModel implements Serializable{
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
@Column(name = "translator_key")
|
||||||
|
private Integer translatorKey;
|
||||||
|
@Column(name = "version_no")
|
||||||
|
private Integer versionNo;
|
||||||
|
@Column(name = "ogdp1")
|
||||||
|
private String ogdp1;
|
||||||
|
@Column(name = "tr_lang")
|
||||||
|
private String trLang;
|
||||||
|
@Column(name = "tr_career")
|
||||||
|
private String trCareer;
|
||||||
|
@Column(name = "tr_name")
|
||||||
|
private String trName;
|
||||||
|
@Column(name = "tr_sex")
|
||||||
|
private String trSex;
|
||||||
|
@Column(name = "tr_phone")
|
||||||
|
private String trPhone;
|
||||||
|
@Column(name = "tr_nny")
|
||||||
|
private String trNny;
|
||||||
|
@Column(name = "tr_age")
|
||||||
|
private String trAge;
|
||||||
|
@Column(name = "tr_edu")
|
||||||
|
private String trEdu;
|
||||||
|
@Column(name = "tr_cft")
|
||||||
|
private String trCft;
|
||||||
|
@Column(name = "tr_visa")
|
||||||
|
private String trVisa;
|
||||||
|
@Column(name = "apt_dt")
|
||||||
|
private String aptDt;
|
||||||
|
@Column(name = "dml_yn")
|
||||||
|
private String dmlYn;
|
||||||
|
@Column(name = "remark")
|
||||||
|
private String remark;
|
||||||
|
@Column(name = "wrt_nm")
|
||||||
|
private String wrtNm;
|
||||||
|
@Column(name = "wrt_dt")
|
||||||
|
private LocalDateTime wrtDt;
|
||||||
|
@Column(name = "wrt_organ")
|
||||||
|
private String wrtOrgan;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Translator [translatorKey=" + translatorKey + ", versionNo=" + versionNo + ", ogdp1=" + ogdp1 + ", trLang="
|
||||||
|
+ trLang + ", trCareer=" + trCareer + ", trName=" + trName + ", trSex=" + trSex + ", trPhone=" + trPhone
|
||||||
|
+ ", trNny=" + trNny + ", trAge=" + trAge + ", trCft=" + trCft + ", trVisa=" + trVisa + ", aptDt=" + aptDt
|
||||||
|
+ ", dmlYn=" + dmlYn + ", remark=" + remark + ", wrtNm=" + wrtNm + ", wrtDt=" + wrtDt + "]";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.dbnt.faisp.translator.repository;
|
||||||
|
|
||||||
|
import com.dbnt.faisp.translator.model.Translator;
|
||||||
|
import com.dbnt.faisp.userInfo.model.UserInfo;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
|
||||||
|
public interface TranslatorRepository extends JpaRepository<Translator, Integer> {
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<mapper namespace="com.dbnt.faisp.translator.mapper.TranslatorMapper">
|
||||||
|
|
||||||
|
<select id="selectTranslatorList" resultType="Translator" parameterType="Translator">
|
||||||
|
select
|
||||||
|
translator_key,
|
||||||
|
(select item_value from code_mgt where item_cd = ogdp1) as ogdp1,
|
||||||
|
(select item_value from code_mgt where item_cd = tr_lang) as tr_lang,
|
||||||
|
tr_career,
|
||||||
|
tr_name,
|
||||||
|
(select item_value from code_mgt where item_cd = tr_sex) as tr_sex,
|
||||||
|
tr_age,
|
||||||
|
(select item_value from code_mgt where item_cd = tr_nny) as tr_nny,
|
||||||
|
(select item_value from code_mgt where item_cd = tr_edu) as tr_edu,
|
||||||
|
tr_cft,
|
||||||
|
(select item_value from code_mgt where item_cd = tr_visa) as tr_visa,
|
||||||
|
dml_yn,
|
||||||
|
apt_dt,
|
||||||
|
tr_phone
|
||||||
|
from translator_info
|
||||||
|
where wrt_organ in
|
||||||
|
<foreach collection="organCdList" item="item" index="index" separator="," open="(" close=")">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
order by translator_key desc
|
||||||
|
limit #{rowCnt} offset #{firstIndex}
|
||||||
|
</select>
|
||||||
|
|
||||||
|
<select id="selectTranslatorListCnt" resultType="int" parameterType="Translator">
|
||||||
|
select count(*)
|
||||||
|
from translator_info
|
||||||
|
where wrt_organ in
|
||||||
|
<foreach collection="organCdList" item="item" index="index" separator="," open="(" close=")">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
|
||||||
|
|
||||||
|
$(document).on('click', '#saveBtn', function (){
|
||||||
|
if(confirm("저장하시겠습니까?")){
|
||||||
|
contentFade("in");
|
||||||
|
const formData = new FormData($("#translatorInsert")[0]);
|
||||||
|
$.ajax({
|
||||||
|
type : 'POST',
|
||||||
|
data : formData,
|
||||||
|
url : "/translator/insertTranslatorInfo",
|
||||||
|
processData: false,
|
||||||
|
contentType: false,
|
||||||
|
success : function(result) {
|
||||||
|
|
||||||
|
alert("저장되었습니다.\n담당자 승인 후 로그인 가능합니다.")
|
||||||
|
|
||||||
|
contentFade("out");
|
||||||
|
location.reload;
|
||||||
|
},
|
||||||
|
error : function(xhr, status) {
|
||||||
|
alert("저장에 실패하였습니다.")
|
||||||
|
contentFade("out");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function valueCheck(form){
|
||||||
|
const targetForm = $("#"+form);
|
||||||
|
const userId = targetForm.find("#userId").val();
|
||||||
|
const password = targetForm.find("#modalPassword");
|
||||||
|
const passwordConfirm = targetForm.find("#passwordConfirm");
|
||||||
|
const userNm = targetForm.find("#userNm").val();
|
||||||
|
const ogCd = targetForm.find("#ogCd").val();
|
||||||
|
const ofcCd = targetForm.find("#ofcCd").val();
|
||||||
|
let returnFlag = true;
|
||||||
|
|
||||||
|
if(!userId){
|
||||||
|
alert("아이디를 입력해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}else{
|
||||||
|
const idReg = /^[a-z]+[a-z0-9]{5,19}$/g;
|
||||||
|
if(!idReg.test(userId)){
|
||||||
|
returnFlag = false;
|
||||||
|
alert("아이디 조건이 맞지 않습니다.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!password[0].disabled && !password.val()){
|
||||||
|
alert("비밀번호를 입력해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
if(!password[0].disabled && !passwordConfirm.val()){
|
||||||
|
alert("비밀번호 확인을 입력해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
if(!userNm){
|
||||||
|
alert("이름 입력해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
if(returnFlag){
|
||||||
|
const passwordReg = /^(?=.*[a-zA-z])(?=.*[0-9])(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+]).{8,16}$/;
|
||||||
|
if(!password[0].disabled){
|
||||||
|
if(!passwordReg.test(password.val())){
|
||||||
|
alert("비밀번호 조건이 맞지 않습니다.")
|
||||||
|
returnFlag = false;
|
||||||
|
}else{
|
||||||
|
if(password.val() !== passwordConfirm.val()){
|
||||||
|
alert("비밀번호가 같지 않습니다.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!ogCd){
|
||||||
|
alert("관서를 선택해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
if(!ofcCd){
|
||||||
|
alert("부서를 선택해주세요.");
|
||||||
|
returnFlag = false;
|
||||||
|
}
|
||||||
|
return returnFlag;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,301 @@
|
||||||
|
<!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/translator/translator.js}"></script>
|
||||||
|
</th:block>
|
||||||
|
<div layout:fragment="content">
|
||||||
|
<main class="pt-3">
|
||||||
|
<h4>민간 통역인 현황</h4>
|
||||||
|
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
|
||||||
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
|
||||||
|
<div class="row mx-0">
|
||||||
|
<div class="col-12 card text-center">
|
||||||
|
<div class="card-body">
|
||||||
|
<!-- <form method="get" th:action="@{/authMgt/authMgtPage}">
|
||||||
|
<input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">
|
||||||
|
<div class="row justify-content-between pe-3 py-1">
|
||||||
|
<div class="col-auto">
|
||||||
|
<select class="form-select" 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">
|
||||||
|
<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>
|
||||||
|
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form> -->
|
||||||
|
<div class="row justify-content-start">
|
||||||
|
<div class="col-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="row">
|
||||||
|
<table class="table table-striped">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>연번</th>
|
||||||
|
<th>관서명</th>
|
||||||
|
<th>언어</th>
|
||||||
|
<th>경력</th>
|
||||||
|
<th>성명</th>
|
||||||
|
<th>성별</th>
|
||||||
|
<th>나이</th>
|
||||||
|
<th>국적</th>
|
||||||
|
<th>학력</th>
|
||||||
|
<th>자격증</th>
|
||||||
|
<th>비자</th>
|
||||||
|
<th>해촉</th>
|
||||||
|
<th>위촉일</th>
|
||||||
|
<th>연락처</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr class="userInfoTr" th:each="trInfo:${translatorList}">
|
||||||
|
<td th:text="${trInfo.translatorKey}"></td>
|
||||||
|
<td th:text="${trInfo.ogdp1}"></td>
|
||||||
|
<td th:text="${trInfo.trLang}"></td>
|
||||||
|
<td th:text="${trInfo.trCareer}"></td>
|
||||||
|
<td th:text="${trInfo.trName}"></td>
|
||||||
|
<td th:text="${trInfo.trAge}"></td>
|
||||||
|
<td th:text="${trInfo.trSex}"></td>
|
||||||
|
<td th:text="${trInfo.trNny}"></td>
|
||||||
|
<td th:text="${trInfo.trEdu}"></td>
|
||||||
|
<th:block th:if="${not #strings.isEmpty(trInfo.trCft)}">
|
||||||
|
<td>O</td>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:if="${#strings.isEmpty(trInfo.trCft)}">
|
||||||
|
<td>X</td>
|
||||||
|
</th:block>
|
||||||
|
<td th:text="${trInfo.trVisa}"></td>
|
||||||
|
<th:block th:if="${trInfo.dmlYn == 'Y'}">
|
||||||
|
<td>●</td>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:if="${trInfo.dmlYn == 'N'}">
|
||||||
|
<td></td>
|
||||||
|
</th:block>
|
||||||
|
<td th:text="${trInfo.aptDt}"></td>
|
||||||
|
<td th:text="${trInfo.trPhone}"></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-auto">
|
||||||
|
<nav aria-label="Page navigation">
|
||||||
|
<ul class="pagination">
|
||||||
|
<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">«</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">»</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</th:block>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<div class="col-auto">
|
||||||
|
<button data-bs-toggle="modal" data-bs-target="#translatorInsertModal">등록</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<div class="modal fade" id="translatorInsertModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="userInsertModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-lg">
|
||||||
|
<div class="modal-content ">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="translatorInsertModalLabel">통역인 등록</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<form id="translatorInsert" action="#" method="post">
|
||||||
|
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
|
||||||
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="ogCd" class="col-sm-2 col-form-label text-center">관서</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="ogdp1">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">언어</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="trLang">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('LGG')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">경력</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<input type="text" class="form-control" id="trCareer" name="trCareer">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="ogCd" class="col-sm-2 col-form-label text-center">성명</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<input type="text" class="form-control" id="trName" name="trName">
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">성별</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="trSex">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('SEX')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">연락처</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<input type="text" class="form-control" id="trPhone" name="trPhone">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="ogCd" class="col-sm-2 col-form-label text-center">국적</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="trNny">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('NNY')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">나이</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<input type="text" class="form-control" id="trAge" name="trAge">
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">학력</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<select class="form-select form-select-sm" name="trEdu">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('EDU')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="ogCd" class="col-sm-2 col-form-label text-center">자격증</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<input type="text" class="form-control" id="trCft" name="trCft">
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">비자</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="trVisa">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('VISA')}">
|
||||||
|
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}"></option>
|
||||||
|
</th:block>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<label for="ofcCd" class="col-sm-1 col-form-label text-center">위촉일</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<!-- <input type="date" class="form-control" id="aptDt" name="aptDt"> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<label for="ogCd" class="col-sm-2 col-form-label text-center">해촉</label>
|
||||||
|
<div class="col-sm-2">
|
||||||
|
<select class="form-select form-select-sm" name="dmlYn">
|
||||||
|
<option value="">선택</option>
|
||||||
|
<option value="Y">예</option>
|
||||||
|
<option value="N">아니오</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-3 row">
|
||||||
|
<label for="tel" class="col-sm-2 col-form-label text-center">비고</label>
|
||||||
|
<div class="col-sm-4">
|
||||||
|
<textarea class="form-control" id="remark"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="closeModalBtn">닫기</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="saveBtn">등록</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="modal fade" id="authEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="authEditModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-lg modal-dialog-scrollable">
|
||||||
|
<div class="modal-content" id="authEditModalContent">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="menuEditModalLabel">권한 편집</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<ul class="nav nav-tabs" id="userTab" role="tablist">
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link active" id="accessTab" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">메뉴</button>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item" role="presentation">
|
||||||
|
<button class="nav-link" id="approvalTab" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">결재</button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content border border-top-0" id="configInfo">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="saveAuthBtn">저장</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</html>
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<input type="hidden" id="userSeq" th:value="${userInfo.userSeq}">
|
||||||
|
<div class="tab-pane fade show active" id="accessTabPanel" role="tabpanel" aria-labelledby="accessTab" tabindex="0">
|
||||||
|
<table class="table table-hover text-center" id="accessEditTable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>대분류</th>
|
||||||
|
<th>중분류</th>
|
||||||
|
<th>소분류</th>
|
||||||
|
<th>관리</th>
|
||||||
|
<th>작성</th>
|
||||||
|
<th>조회</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr th:each="accessConfig:${userInfo.accessConfigList}">
|
||||||
|
<input type="hidden" class="menuKey" th:value="${accessConfig.menuKey}">
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('CAT1')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq accessConfig.cat1Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}"></td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('CAT2')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq accessConfig.cat2Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}"></td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:if="${#strings.isEmpty(accessConfig.cat3Cd)}">
|
||||||
|
<td></td>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:unless="${#strings.isEmpty(accessConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq accessConfig.cat3Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}"></td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC003' eq accessConfig.accessAuth}" value="ACC003">
|
||||||
|
</td>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC002' eq accessConfig.accessAuth}" value="ACC002">
|
||||||
|
</td>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('accessAuth',accessConfig.menuKey)}" th:checked="${'ACC001' eq accessConfig.accessAuth}" value="ACC001">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane fade" id="approvalTabPanel" role="tabpanel" aria-labelledby="approvalTab" tabindex="0">
|
||||||
|
<table class="table table-hover text-center" id="approvalEditTable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>대분류</th>
|
||||||
|
<th>중분류</th>
|
||||||
|
<th>소분류</th>
|
||||||
|
<th>계장대행</th>
|
||||||
|
<th>계장</th>
|
||||||
|
<th>과장대행</th>
|
||||||
|
<th>과장</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr th:each="approvalConfig:${userInfo.approvalConfigList}">
|
||||||
|
<input type="hidden" class="menuKey" th:value="${approvalConfig.menuKey}">
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('CAT1')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat1Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}">.</td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:each="commonCode:${session.commonCode.get('CAT2')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat2Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}">.</td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:if="${#strings.isEmpty(approvalConfig.cat3Cd)}">
|
||||||
|
<td></td>
|
||||||
|
</th:block>
|
||||||
|
<th:block th:unless="${#strings.isEmpty(approvalConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}">
|
||||||
|
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat3Cd}">
|
||||||
|
<td th:text="${commonCode.itemValue}"></td>
|
||||||
|
</th:block>
|
||||||
|
</th:block>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC004' eq approvalConfig.approvalAuth}" value="APC004">
|
||||||
|
</td>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC003' eq approvalConfig.approvalAuth}" value="APC003">
|
||||||
|
</td>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC002' eq approvalConfig.approvalAuth}" value="APC002">
|
||||||
|
</td>
|
||||||
|
<td class="radioTd">
|
||||||
|
<input type="radio" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:checked="${'APC001' eq approvalConfig.approvalAuth}" value="APC001">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</html>
|
||||||
Loading…
Reference in New Issue