초기소스

This commit is contained in:
jazz
2025-10-29 17:08:05 +09:00
parent e531aa9540
commit 439a379a02
7551 changed files with 1234427 additions and 3 deletions

View File

@@ -0,0 +1,440 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ page import="java.util.Date" %>
<%--
Class Name : EmailPassivSndngC.jsp
Description : 이메일 수동 발송 폼
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-05-22 이대환 최초 생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<%-- 공통 include --%>
<%@include file ="/WEB-INF/views/comm/mngr/Include.jsp" %>
<link rel="stylesheet" href="<c:url value='/daumeditor/css/editor.css'/>">
<script src="<c:url value='/daumeditor/js/editor_loader.js?environment=development'/>"></script>
<style type="text/css">
.page-title.fixed { left: 0;}
</style>
</head>
<script>
$(document).ready(function () {
$('.rjctCopy').hide();
/**********************************************
* 이메일 수신거부 링크 입력 이벤트
***********************************************/
$("input[name='recptnRjctUrl']").change(function() {
$('.rjctCopy').hide();
});
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('mbrInfo')) {
$('.mbrInfo').val(urlParams.get('mbrInfo'));
$('.srchMbrCnt').html(urlParams.get('sndngCnt')+' 명');
}
});
/* ********************************************************
* 이메일 수동 발송 TAB _ 받는 사람 콤보박스
******************************************************** */
const fn_clear_recpntEmail = function() {
$('#recpntEmail').val('');
$('.mbrInfo').val('');
$('.srchMbrCnt').html('0 명');
}
/* ********************************************************
* 이메일 수동 발송 TAB _ 최근 발송한 이메일
******************************************************** */
const fn_apply_rcntEmail = function(getvalue) {
if(!getvalue){
fn_reset_form('selectSndng');
Editor.modify({
"content": " "
});
}else{
$.ajax({
type: 'post',
url: '/mngr/ntcn/email/selectEmailSndngDtl',
data: 'emailLogInnb='+getvalue,
success: function (result) {
Editor.modify({
"content": result.boCtrlMap.cn
});
}
});
}
}
/**********************************************
* 이메일 수신거부 링크 처리
***********************************************/
const recptnRjct = function(lang) {
var rjctInput = $('input[name="recptnRjctUrl"]');
let recptnRjctUrl = rjctInput.val();
const urlParams = new URLSearchParams(recptnRjctUrl.split('?')[1]);
let langInner;
switch (lang) {
case 'ko':
langInner = '수신거부';
break;
case 'en':
langInner = 'Click here';
break;
default :
$.ajax({
type: 'get',
// url: 'http://'+recptnRjctUrl+'?mbrInnb={mbrInnb}',
url: recptnRjctUrl+'?mbrInnb=',
dataType: 'text',
error : function(request, status, error) {
//loadingStop();
alert("잘못된 URL입니다.");
$(".rjctCopy").hide();
} ,
success: function(data, status, request) {
//loadingStop();
alert('정상 URL입니다.');
$('.rjctCopy').show();
}
});
}
if(lang){
let recptnRjctTag = '<a href="https://' + recptnRjctUrl + '?mbrInnb={mbrInnb}">' + langInner + '</a>';
prompt('복사되었습니다.',recptnRjctTag)
}
}
/**********************************************
* 이메일 수동 발송 등록
***********************************************/
const fn_regist_Email = function() {
$("#cn").val(Editor.getContent());
if(validateEmail($('#sndrEmail'), $('#recpntEmail'), $('.mbrInfo'), $('#sj'), $('#cn'), $('#legalResp'))){
if (confirm('이메일 수동 발송을 <spring:message code="confirm.common.save"/>')) {
$.ajax({
type : 'post',
url : '/mngr/ntcn/email/insertEmailSndng',
data : $('form').serialize(),
dataType: 'text',
success : function(data) {
alert('<spring:message code="success.common.insert"/>');
location.replace('/mngr/ntcn/email/selectEmailPassivSndngManage');
},
error : function(request, status, error) {
console.log(error)
}
});
}
}
}
/**********************************************
* 이메일 형식 유효성 체크 (올바른 이메일 형식이 아닐 때 True)
***********************************************/
const emailCheck = function(email_address) {
email_regex = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/i;
if(email_regex.test(email_address)){
return false;
}else{
return true;
}
}
/**********************************************
* 이메일 발송 유효성 체크
***********************************************/
const validateEmail = function(sndrEmail, recpntEmail, mbrInfo, sj, cn, legalResp) {
if (sndrEmail.val().trim() === '') {
alert('보내는 사람 이메일을 입력하십시오');
sndrEmail.focus();
return false;
}
if (emailCheck(sndrEmail.val())) {
alert('올바른 이메일 형식이 아닙니다(보내는 사람)');
sndrEmail.focus();
return false;
}
const recpntEmailValue = recpntEmail.val().trim();
const mbrInfoValue = mbrInfo.val().trim();
if (!recpntEmailValue && !mbrInfoValue) {
alert('받는 사람 이메일을 입력하십시오');
recpntEmail.focus();
return false;
}
if(recpntEmailValue){
if (recpntEmailValue.indexOf(',') === -1 && emailCheck(recpntEmailValue)) {
alert('올바른 이메일 형식이 아닙니다(받는 사람 - 직접 입력)');
recpntEmail.focus();
return false;
}
if (recpntEmailValue.indexOf(',') !== -1) {
const parts = recpntEmailValue.split(',').map(part => part.trim());
for (let index = 0; index < parts.length; index++) {
if (emailCheck(parts[index])) {
alert('올바른 이메일 형식이 아닙니다(받는 사람 : '+(index+1)+'번째)');
recpntEmail.focus();
return false;
}
}
}
}
if (sj.val().trim() === '') {
alert('이메일 제목을 입력하십시오');
sj.focus();
return false;
}
if (cn.val().trim() === '') {
alert('이메일 내용을 입력하십시오');
return false;
}
if (!legalResp.prop('checked')) {
alert('정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의하십시오');
legalResp.focus();
return false;
}
return true;
}
</script>
<body>
<form id='tx_editor_form' name="tx_editor_form">
<section class="content-section">
<div class="page-title">
<h2 class="page-title__title">이메일</h2>
<div class="page-title__btn-container">
<button type="button" class="btn primary" onclick="fn_regist_Email()" id="emailSndngBtn">발송하기</button>
</div>
</div>
<div class="table-wrapper">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>보내는 사람</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="sndrEmail" id="sndrEmail"
placeholder="메일 주소 입력">
</div>
</td>
</tr>
<tr>
<th>받는 사람 (검색 입력)</th>
<td>
<div class="td-inner">
<input type="hidden" class="input-text mbrInfo" name="mbrInfo"/>
<span class="fw-500 fs-15 ml-5 srchMbrCnt">0 명</span>
<button type="button" id="mbrSrchBtn"
class="btn xsm primary" title="회원 검색 새창열림" onclick="fn_open_modal('#modalDiv',
'#member-search',
'/mngr/ntcn/email/selectMbrSrchPopupRForm',
{'actionDv' : 'email'}); return false;">
회원검색
</button>
</div>
</td>
</tr>
<tr>
<th>받는 사람 (직접 입력)</th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" title="해당 인풋에 대한 설명" name="recpntEmail" id="recpntEmail"
placeholder="메일 주소는 ,(콤마)로 구분하여 입력">
</div>
</td>
</tr>
<%-- <tr>
<th>받는 사람 (엑셀 입력)</th>
<td>
<div class="td-inner">
<div class="table-wrapper" style="width: 600px;">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col>
<col style="width:20%;">
</colgroup>
<thead>
<tr>
<th>엑셀 파일 업로드</th>
<th>
<button class="circle-btn add"><span
class="visually-hidden">추가</span></button>
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input class="input-text md" type="text"
title="해당 인풋에 대한 설명" placeholder=""
value="111">
<div class="input-file">
<input type="file" id="f-1">
<label for="f-1">첨부 파일</label>
</div>
</td>
<td>
<button class="circle-btn delete"><span
class="visually-hidden">삭제</span></button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</td>
</tr> --%>
<tr>
<th>최근 이메일 불러오기</th>
<td>
<div class="td-inner">
<div class="select-box">
<select class="lg" onchange="fn_apply_rcntEmail(this.value)" title="해당 셀렉트에 대한 설명">
<option value="">최근 발송한 이메일 선택</option>
<c:forEach items="${ resultListMap.boCtrlMap }" var="list" varStatus="status">
<option value="${list.emailLogInnb}">
[<c:out value="${list.registDt}"/>] <c:out value="${list.sj}"/>
</option>
</c:forEach>
</select>
</div>
</div>
</td>
</tr>
<tr>
<th>제목</th>
<td>
<div class="td-inner vertical">
<input class="input-text xl" type="text" title="제목" id="sj" name="sj"
placeholder="메일 제목을 입력하세요.">
<div class="gray-7">
<p class="fyi">‘정보통신망이용 촉진 및 정보 보호 등의 관한 법률 및 시행령’에 따라 광고 전송 시 제목에 (광고)를 표시해주세요.</p>
</div>
</div>
</td>
</tr>
<tr>
<th>내용</th>
<td>
<div class="td-inner">
<%@ include file="EmailPassivSndngEditor.jsp" %>
<textarea class="textarea" id="cn" name="cn" style="display: none"></textarea>
<div class="gray-7">
<p class="fyi">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’에 규정된 광고 전송 사업자의 의무사항을 준수하세요.
<button type="button" class="mini-info-btn mb-3" data-info="info01">?</button>
</p>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h3 class="content-section__title">수신 거부 안내</h3>
<div class="table-wrapper">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>수신 거부 링크
<button type="button" class="mini-info-btn mb-3" data-info="info02">?</button>
</th>
<td>
<div class="td-inner">
https://
<input class="input-text md" type="text" title="해당 인풋에 대한 설명" name="recptnRjctUrl" value="/mngr/ntcn/email/updateMarktRecptnArgeAt">
?mbrInnb={mbrInnb}
<div class="manage-btn-container">
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('ko')">한글 복사</button>
<button type="button" class="btn xsm outline rjctCopy" onclick="recptnRjct('en')">영문 복사</button>
<button type="button" class="btn xsm gray" onclick="recptnRjct()">정상 여부 확인</button>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="b-checkbox-container justify-center fs-16 mt-30">
<label class="b-checkbox checkbox">
<input type="checkbox" id="legalResp">
<span class="check"></span>
<span class="control-label">‘정보통신망이용 촉진 및 정보보호등에 관한 법률 및 시행령’ 위반에 따른 책임은 당사에게 있음에 동의합니다.</span>
</label>
</div>
</section>
</form>
<!-- <button class="btn primary" style="display: block; margin: 0 auto;" onclick="fn_regist_Email()" id="emailSndngBtn">발송하기</button> -->
<div id="modalDiv">
</div>
<!-- 툴팁 클릭 컨텐츠 -->
<!-- 버튼의 data-info값과 id를 통일시켜야함 -->
<div id="info01" class="mini-info-content" style="width: 280px;">
<div class="mini-info-content__header">
<h5 class="mini-info-content__title">정보통신망 이용촉진 및 정보보호 등에 관한 법률</h5>
<button class="mini-info-content__close"><span class="visually-hidden">닫기</span></button>
</div>
<div class="mini-info-content__content">
<p>
<a href="https://www.lawnb.com/lawinfo/contents_view.asp?cid=00EB2355AF5D4259BD60F91473F0232C">제50조 (영리목적의 광고성 정보 전송 제한)</a>
<p>
<p>
<a href="https://www.lawnb.com/lawinfo/contents_view.asp?cid=00EB2355AF5D4259BD60F91473F0232C">제76조 (과태료)</a>
</p>
</div>
<br>
<div class="mini-info-content__header">
<h5 class="mini-info-content__title">한국인터넷진흥원 (KISA)</h5>
</div>
<div class="mini-info-content__content">
<p>
<a href="https://spam.kisa.or.kr/kor/rule/rule03.jsp">광고정보 전송 시 준수사항</a>
<p>
<p>
<a href="https://spam.kisa.or.kr/kor/way/way04.jsp">광고전송가이드</a>
</p>
</div>
</div>
<div id="info02" class="mini-info-content" style="width: 280px;">
<div class="mini-info-content__header">
<h5 class="mini-info-content__title">링크 안내</h5>
<button class="mini-info-content__close"><span class="visually-hidden">닫기</span></button>
</div>
<div class="mini-info-content__content">
<p>‘정보통신망이용 촉진 및 정보보호등의 관한 법률 및 시행령’에 따라 수신거부 링크 주소를 알려 드립니다.<p>
<p style="color : red">반드시 링크 주소는 정상 동작 여부를 확인하신 후에 복사하여 이용하시기 바랍니다.</p>
</div>
</div>
</body>
</html>