최초 커밋
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
//if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
include_once("../../../common.php");
|
||||
|
||||
extract($_REQUEST);
|
||||
|
||||
//아이디 중복체크
|
||||
if( $ActionKind =="dupl_check" && isset($reg_mb_id) ){
|
||||
$sql = "select count(*) cnt from g5_member where mb_id = TRIM('$reg_mb_id')";
|
||||
$mb = sql_fetch($sql);
|
||||
|
||||
echo $mb["cnt"];
|
||||
exit();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
?>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
if (!function_exists('eng_img_url')) {
|
||||
function eng_img_url($path = '')
|
||||
{
|
||||
$baseUrl = '/eng/img';
|
||||
$cdnBaseUrl = '';
|
||||
|
||||
if ($cdnBaseUrl !== '') {
|
||||
$baseUrl = rtrim($cdnBaseUrl, '/');
|
||||
}
|
||||
|
||||
$path = ltrim((string) $path, '/');
|
||||
|
||||
return $path === '' ? $baseUrl : $baseUrl . '/' . $path;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,407 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>구매하기</title>
|
||||
<link rel="stylesheet" href="../css/reset.css"/>
|
||||
<link rel="stylesheet" href="../css/font.css"/>
|
||||
<link rel="stylesheet" href="../css/style.css"/>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" name="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>">
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- //모든 팝업페이지 경로 -->
|
||||
<!-- 컨텐츠 시작 -->
|
||||
|
||||
<div class="container buy">
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Contact</h2>
|
||||
<span>EG-BIM Purchase Inquiries & Product Information</span>
|
||||
</div>
|
||||
</section>
|
||||
<section class="contents_wrap">
|
||||
|
||||
<div class="ask_area">
|
||||
<div class="ask_l">
|
||||
<span class="mid_tit">Experience the next-generation <br>S/W with <font class="egbim k">EG-BIM S/W</font></span>
|
||||
</div>
|
||||
<div class="ask_r">
|
||||
<span class="sub_text"><em>License usage <font style="color: var(--color-orange)">may be restricted</font></em> if duplicate licenses are detected.</span>
|
||||
<div class="ask_btn">
|
||||
<a href="/eng/bbs/descope_qa_list.php" class="btn_ask" ><i></i>EG-BIM Purchase Inquiry</a>
|
||||
<!-- <a href="#" onclick="alert('문의 게시판은 준비중입니다.'); return false;" class="btn_ask" ><i></i>EG-BIM 구매 문의</a> -->
|
||||
<a href="../download/EGBIM_leaflet_v01.pdf" download class="btn_brochure"><i></i>Brochure</a>
|
||||
<a href="../download/EGBIM_manual.pdf" download class="btn_manual"><i></i>Manual</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="video_area" data-aos="fade-right" data-aos-duration="1000">
|
||||
<div class="vod_wrap"><video autoplay muted loop playsinline><source src="../img/EGBIM_buy.mp4"></video></div>
|
||||
<div class="contact_area">
|
||||
<p>
|
||||
<span class="mid_tit">Purchase Consultation</span>
|
||||
<span class="sub_text">Contact the EG-BIM team directly</span>
|
||||
</p>
|
||||
<div class="line"></div>
|
||||
<ul>
|
||||
<li class="tel"><i></i><a href="tel:0214147434">02 - 2141 - 7434</a></li>
|
||||
<li class="mail"><i></i>baroncs@baroncs.co.kr</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- //컨텐츠 시작 -->
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time)=>{
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
// header('Content-Type: application/json; charset=utf-8');
|
||||
// ini_set('display_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
|
||||
// // 수신
|
||||
// $email = trim($_POST['email'] ?? '');
|
||||
// // $email = 'sdi9429@naver.com';
|
||||
// if (!$email) {
|
||||
// echo json_encode([
|
||||
// 'status' => 'error',
|
||||
// 'message' => '이메일이 전달되지 않았습니다.'
|
||||
// ]);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// // Descope 설정
|
||||
// $management_key = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj'; // 예: P2w0N5fY1K...
|
||||
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 예: PRJ-xxxx
|
||||
|
||||
// // API URL
|
||||
// $url = 'https://api.descope.com/v1/mgmt/user?loginId=' . urlencode($email);
|
||||
|
||||
// // CURL 호출
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// "Authorization: Bearer {$project_id}:{$management_key}",
|
||||
// "Content-Type: application/json"
|
||||
// ]);
|
||||
|
||||
// // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
|
||||
|
||||
// $response = curl_exec($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// $curl_error = curl_error($ch);
|
||||
// curl_close($ch);
|
||||
|
||||
// $response_json = json_decode($response, true);
|
||||
|
||||
// // 처리 로직
|
||||
// if ($http_code === 200 && isset($response_json['user'])) {
|
||||
// // 아이디가 이미 존재 (중복)
|
||||
// echo json_encode([
|
||||
// 'status' => 'duplicate',
|
||||
// 'message' => '이미 등록된 이메일입니다.'
|
||||
// ]);
|
||||
// } elseif ($http_code === 404) {
|
||||
// // 아이디가 존재하지 않음 (사용 가능)
|
||||
// echo json_encode([
|
||||
// 'status' => 'ok',
|
||||
// 'message' => '사용 가능한 이메일입니다.'
|
||||
// ]);
|
||||
// } else {
|
||||
// // 기타 오류
|
||||
// echo json_encode([
|
||||
// 'status' => 'error',
|
||||
// 'message' => 'Descope API 호출 실패',
|
||||
// 'http_code' => $http_code,
|
||||
// 'error_detail' => $response_json,
|
||||
// 'curl_error' => $curl_error
|
||||
// ]);
|
||||
// }
|
||||
// exit;
|
||||
?>
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
// 수신
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
if (!$email) {
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => '이메일이 전달되지 않았습니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Descope 설정
|
||||
$management_key = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
|
||||
$project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP';
|
||||
|
||||
// API URL
|
||||
$url = 'https://api.descope.com/v1/mgmt/user?loginId=' . urlencode($email);
|
||||
|
||||
// CURL 호출
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$project_id}:{$management_key}",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$curl_error = curl_error($ch);
|
||||
curl_close($ch);
|
||||
|
||||
$response_json = json_decode($response, true);
|
||||
|
||||
// ================================
|
||||
// 존재하는 사용자일 때
|
||||
// ================================
|
||||
if ($http_code === 200 && isset($response_json['user'])) {
|
||||
|
||||
$user = $response_json["user"];
|
||||
|
||||
// 비밀번호 여부
|
||||
$hasPassword = $user["providerInfo"]["email"]["password"] ?? false;
|
||||
|
||||
// 추가정보 입력 여부 (completeForm)
|
||||
$completeForm = $user["customAttributes"]["completeForm"] ?? false;
|
||||
|
||||
// -------------------------
|
||||
// 미완성 사용자 감지!!
|
||||
// -------------------------
|
||||
if (!$hasPassword && !$completeForm) {
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'incomplete',
|
||||
'message' => '미완성 사용자입니다. 추가정보 입력이 필요합니다.',
|
||||
'email' => $email
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 완성된 사용자 → 재가입 불가
|
||||
echo json_encode([
|
||||
'status' => 'duplicate',
|
||||
'message' => '이미 등록된 이메일입니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ================================
|
||||
// 신규 사용자 (404)
|
||||
// ================================
|
||||
if ($http_code === 404) {
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'message' => '사용 가능한 이메일입니다.'
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// ================================
|
||||
// 기타 오류
|
||||
// ================================
|
||||
echo json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Descope API 호출 실패',
|
||||
'http_code' => $http_code,
|
||||
'error_detail' => $response_json,
|
||||
'curl_error' => $curl_error
|
||||
]);
|
||||
exit;
|
||||
?>
|
||||
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
function set_descope_session_cookies(array $user): void {
|
||||
$expire = time() + 86400;
|
||||
$cookieOptions = [
|
||||
'expires' => $expire,
|
||||
'path' => '/',
|
||||
'samesite' => 'Lax',
|
||||
];
|
||||
|
||||
$customAttributes = $user['customAttributes'] ?? [];
|
||||
$roleNames = $user['roleNames'] ?? [];
|
||||
|
||||
setcookie('descope_login_id', (string)($user['loginIds'][0] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_id', (string)($user['userId'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_name', (string)($user['name'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_email', (string)($user['email'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_phone', (string)($user['phone'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_custom_attributes', base64_encode(json_encode($customAttributes, JSON_UNESCAPED_UNICODE)), $cookieOptions);
|
||||
setcookie('descope_role_names', base64_encode(json_encode($roleNames, JSON_UNESCAPED_UNICODE)), $cookieOptions);
|
||||
}
|
||||
|
||||
$email = trim($_POST['mb_id'] ?? '');
|
||||
$password = trim($_POST['mb_password'] ?? '');
|
||||
|
||||
|
||||
if (!$email || !$password) {
|
||||
echo json_encode(['status'=>'fail', 'message'=>'아이디와 비밀번호는 필수입력입니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$descope_project_id = "P2wON5fy1K6kyia269VpeIzYP8oP";
|
||||
|
||||
$api_url = "https://api.descope.com/v1/auth/password/signin";
|
||||
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"password" => $password,
|
||||
// "loginOptions" => [ ... ] // 옵션 필요시
|
||||
];
|
||||
$headers = [
|
||||
'Content-Type: application/json',
|
||||
'Authorization: Bearer ' . $descope_project_id,
|
||||
];
|
||||
|
||||
$ch = curl_init($api_url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$res_data = json_decode($response, true);
|
||||
|
||||
if ($http_code === 200 && isset($res_data['sessionJwt'])) {
|
||||
// 로그인 성공 → 실패횟수 초기화
|
||||
$_SESSION['login_fail_count'] = 0;
|
||||
//session으로도 저장
|
||||
$_SESSION['user'] = $res_data['user']; // userId, email 등
|
||||
$_SESSION['sessionJwt'] = $res_data['sessionJwt'];
|
||||
$_SESSION['refreshJwt'] = $res_data['refreshJwt'];
|
||||
set_descope_session_cookies($res_data['user'] ?? []);
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'sessionJwt' => $res_data['sessionJwt'] ?? '',
|
||||
// 'refreshJwt' => $res_data['refreshJwt'] ?? '',
|
||||
'user' => $res_data['user'] ?? [],
|
||||
'session' => $_SESSION,
|
||||
]);
|
||||
// } else {
|
||||
// // $msg = $res_data['errorDescription'] ?? '로그인 실패';
|
||||
// // echo json_encode(['status'=>'fail', 'message'=>$msg]);
|
||||
// // Descope 에러 메시지
|
||||
// $errorMsg = $res_data['errorDescription']
|
||||
// ?? $res_data['errorMessage']
|
||||
// ?? '로그인에 실패했습니다.';
|
||||
|
||||
// // 2) 한글 매핑
|
||||
// if (stripos($errorMsg, 'invalid signin credentials') !== false) {
|
||||
// $msg = '비밀번호가 일치하지 않습니다.';
|
||||
// } elseif (stripos($errorMsg, 'user not found') !== false) {
|
||||
// $msg = "계정을 찾을 수 없습니다.\n로그인에 문제가 있으신 경우 010-8721-7453으로 문의해 주세요.";
|
||||
// } else {
|
||||
// $msg = $errorMsg;
|
||||
// }
|
||||
|
||||
|
||||
// echo json_encode([
|
||||
// 'status' => 'fail',
|
||||
// 'message' => $msg
|
||||
// ]);
|
||||
// }
|
||||
} else {
|
||||
// 실패 → 카운트 증가
|
||||
if (!isset($_SESSION['login_fail_count'])) {
|
||||
$_SESSION['login_fail_count'] = 0;
|
||||
}
|
||||
$_SESSION['login_fail_count']++;
|
||||
$failCount = $_SESSION['login_fail_count'];
|
||||
|
||||
// 에러 메시지 가공
|
||||
$errorMsg = $res_data['errorDescription']
|
||||
?? $res_data['errorMessage']
|
||||
?? '로그인에 실패했습니다.';
|
||||
|
||||
// 한글 매핑
|
||||
if (stripos($errorMsg, 'Login is temporarily locked') !== false) {
|
||||
$msg = "Login is temporarily locked. Please try again later.";
|
||||
} elseif (stripos($errorMsg, 'account locked') !== false) {
|
||||
$msg = "Your account has been locked due to too many login attempts.\nPlease contact the administrator.";
|
||||
} elseif (stripos($errorMsg, 'invalid signin credentials') !== false) {
|
||||
$msg = "The password does not match.";
|
||||
} elseif (stripos($errorMsg, 'user not found') !== false) {
|
||||
$msg = "The account could not be found.\nIf you are experiencing login issues, please contact +82-2-2141-7434";
|
||||
} else {
|
||||
$msg = $errorMsg;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'message' => $msg,
|
||||
'failCount' => $failCount
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
?>
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
// descope_logout.php
|
||||
// session_start();
|
||||
// $_SESSION = [];
|
||||
// if (ini_get("session.use_cookies")) {
|
||||
// $p = session_get_cookie_params();
|
||||
// setcookie(session_name(), '', time()-42000,
|
||||
// $p['path'], $p['domain'], $p['secure'], $p['httponly']
|
||||
// );
|
||||
// }
|
||||
// session_destroy();
|
||||
|
||||
// // ✅ 그누보드 세션 변수도 제거
|
||||
// unset($_SESSION['ss_mb_id'], $_SESSION['ss_mb_level']);
|
||||
|
||||
// http_response_code(200);
|
||||
// echo json_encode(['status'=>'ok']);
|
||||
// exit;
|
||||
session_start();
|
||||
$_SESSION = [];
|
||||
|
||||
foreach (['PHPSESSID', 'G5sessphp', 'descope_login_id', 'descope_user_id', 'descope_user_name', 'descope_user_email', 'descope_user_phone', 'descope_custom_attributes', 'descope_role_names'] as $cookieName) {
|
||||
setcookie($cookieName, '', [
|
||||
'expires' => time() - 42000,
|
||||
'path' => '/',
|
||||
'samesite' => 'Lax',
|
||||
]);
|
||||
}
|
||||
|
||||
session_destroy();
|
||||
|
||||
http_response_code(200);
|
||||
echo json_encode(['status'=>'ok']);
|
||||
exit;
|
||||
?>
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
// ini_set('display_errors', 1);
|
||||
// ini_set('display_startup_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
|
||||
// header('Content-Type: application/json');
|
||||
// // require_once './descope_config.php';
|
||||
|
||||
// $email = trim($_POST['email'] ?? '');
|
||||
// $password = trim($_POST['password'] ?? '');
|
||||
// $refreshJwt = trim($_POST['refreshJwt'] ?? '');
|
||||
|
||||
// if (!$email || !$password || !$refreshJwt) {
|
||||
// echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// // Descope API - 비밀번호 변경 엔드포인트 사용
|
||||
// $url = "https://api.descope.com/v1/auth/password/update";
|
||||
// $data = [
|
||||
// // "loginId" => $email,
|
||||
// "newPassword" => $password,
|
||||
// ];
|
||||
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// "Authorization: Bearer " . $refreshJwt,
|
||||
// "Content-Type: application/json"
|
||||
// ]);
|
||||
// curl_setopt($ch, CURLOPT_POST, 1);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
// $response = curl_exec($ch);
|
||||
// $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// if ($code == 200) {
|
||||
// echo json_encode(['status' => 'ok']);
|
||||
// } else {
|
||||
// $resData = json_decode($response, true);
|
||||
// $msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
|
||||
// echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
|
||||
// }
|
||||
|
||||
// ini_set('display_errors', 1);
|
||||
// ini_set('display_startup_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
// require_once './descope_config.php';
|
||||
|
||||
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$password = trim($_POST['password'] ?? '');
|
||||
$refreshJwt = trim($_POST['refreshJwt'] ?? '');
|
||||
|
||||
// if (!$email || !$password || !$refreshJwt) {
|
||||
// echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
if (!$email || !$password || !$refreshJwt) {
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'message' => '필수값 없음',
|
||||
'debug' => [
|
||||
'email' => $email,
|
||||
'password' => $password,
|
||||
'refreshJwt' => $refreshJwt // <<< 확인!
|
||||
]
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Descope API - 비밀번호 변경 엔드포인트 사용
|
||||
$url = "https://api.descope.com/v1/auth/password/update";
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"newPassword" => $password,
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$projectId}:{$refreshJwt}",
|
||||
"Content-Type: application/json",
|
||||
// "x-descope-project-id: $projectId"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($code == 200) {
|
||||
echo json_encode(['status' => 'ok']);
|
||||
} else {
|
||||
$resData = json_decode($response, true);
|
||||
$msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
|
||||
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
header('Content-Type: application/json; charset=UTF-8');
|
||||
|
||||
function set_descope_session_cookies(array $user): void {
|
||||
$expire = time() + 86400;
|
||||
$cookieOptions = [
|
||||
'expires' => $expire,
|
||||
'path' => '/',
|
||||
'samesite' => 'Lax',
|
||||
];
|
||||
|
||||
setcookie('descope_login_id', (string)($user['loginIds'][0] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_id', (string)($user['userId'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_name', (string)($user['name'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_email', (string)($user['email'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_user_phone', (string)($user['phone'] ?? ''), $cookieOptions);
|
||||
setcookie('descope_custom_attributes', base64_encode(json_encode($user['customAttributes'] ?? [], JSON_UNESCAPED_UNICODE)), $cookieOptions);
|
||||
setcookie('descope_role_names', base64_encode(json_encode($user['roleNames'] ?? [], JSON_UNESCAPED_UNICODE)), $cookieOptions);
|
||||
}
|
||||
|
||||
$loginId = trim((string)($_POST['loginId'] ?? ''));
|
||||
$sessionJwt = trim((string)($_POST['sessionJwt'] ?? ''));
|
||||
|
||||
if ($loginId === '' || substr_count($sessionJwt, '.') !== 2) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['status' => 'fail', 'message' => 'invalid session payload']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$user = [
|
||||
'userId' => trim((string)($_POST['userId'] ?? $loginId)),
|
||||
'loginIds' => [$loginId],
|
||||
'name' => trim((string)($_POST['userName'] ?? $loginId)),
|
||||
'email' => trim((string)($_POST['email'] ?? $loginId)),
|
||||
'phone' => trim((string)($_POST['phone'] ?? '')),
|
||||
'customAttributes' => [
|
||||
'company' => trim((string)($_POST['company'] ?? '')),
|
||||
'familyCompany' => trim((string)($_POST['familyCompany'] ?? '')),
|
||||
'position' => trim((string)($_POST['position'] ?? '')),
|
||||
'team' => trim((string)($_POST['team'] ?? '')),
|
||||
'familyUniqueKey' => trim((string)($_POST['familyUniqueKey'] ?? '')),
|
||||
],
|
||||
'roleNames' => array_values(array_filter([trim((string)($_POST['userRole'] ?? ''))])),
|
||||
];
|
||||
|
||||
$_SESSION['user'] = $user;
|
||||
$_SESSION['sessionJwt'] = $sessionJwt;
|
||||
set_descope_session_cookies($user);
|
||||
|
||||
echo json_encode(['status' => 'ok']);
|
||||
exit;
|
||||
?>
|
||||
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
// header('Content-Type: application/json');
|
||||
|
||||
// require_once './descope_config.php'; // Descope API 키 등 공통설정
|
||||
|
||||
// $email = trim($_POST['email'] ?? '');
|
||||
|
||||
// if (!$email) {
|
||||
// echo json_encode(['status' => 'fail', 'message' => '이메일 없음']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// // Descope OTP 메일 전송 (예: signup/send/otp)
|
||||
// $url = 'https://api.descope.com/v1/auth/magiclink/email/send'; // API 버전에 맞게!
|
||||
// $data = [
|
||||
// "loginId" => $email,
|
||||
// "user" => ["email" => $email]
|
||||
// ];
|
||||
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// "Authorization: Bearer " . $DESCOPE_API_KEY,
|
||||
// "Content-Type: application/json"
|
||||
// ]);
|
||||
// curl_setopt($ch, CURLOPT_POST, 1);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
// $response = curl_exec($ch);
|
||||
// $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// if ($code == 200) {
|
||||
// echo json_encode(['status' => 'ok']);
|
||||
// } else {
|
||||
// echo json_encode(['status' => 'fail', 'message' => 'OTP 발송 실패', 'raw' => $response]);
|
||||
// }
|
||||
?>
|
||||
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
$email = $_POST['email'] ?? '';
|
||||
// $email = 'sdi9429@naver.com';
|
||||
// $redirectUrl = 'https://eg-bim.com/eng/index.php?popup=pwreset';
|
||||
if (!$email) exit(json_encode(['status'=>'fail', 'message'=>'이메일 누락']));
|
||||
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP";
|
||||
$url = "https://api.descope.com/v1/auth/password/reset";
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"redirectUrl" => 'https://eg-bim.co.kr/eng/index.php?popup=pwreset'
|
||||
];
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$api_key}",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
$res = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
if ($http_code == 200) {
|
||||
$res_data = json_decode($res, true); // 응답 파싱
|
||||
$linkId = $res_data['linkId'] ?? '';
|
||||
echo json_encode([
|
||||
'status'=>'ok',
|
||||
'linkId'=>$linkId,
|
||||
'raw_response'=>$res_data // (디버깅용 전체도 같이 보고 싶으면)
|
||||
]);
|
||||
} else {
|
||||
echo json_encode(['status'=>'fail','message'=>'Failed to send.']);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
// // descope_session.php
|
||||
|
||||
// // 1) 에러 출력 (개발용)
|
||||
// // ini_set('display_errors', 1);
|
||||
// // error_reporting(E_ALL);
|
||||
|
||||
// // 2) 세션 시작 (중복 호출 방지)
|
||||
// if (session_status() === PHP_SESSION_NONE) {
|
||||
// session_start();
|
||||
// }
|
||||
|
||||
// // 3) 로그인 검사
|
||||
// // 로그인 시 $_SESSION['user']['userId'] 와 $_SESSION['user']['loginIds'][0] 를 설정해 두었다면
|
||||
// // if (empty($_SESSION['user']['userId'])) {
|
||||
// // // 로그인 필요 알림 후 로그인 페이지로 이동
|
||||
// // echo <<<HTML
|
||||
// // <script>
|
||||
// // alert('Q&A를 이용하시려면 로그인이 필요합니다.');
|
||||
// // window.location.href = '/egbim/index.php';
|
||||
// // </script>
|
||||
// // HTML;
|
||||
// // exit;
|
||||
// // }
|
||||
|
||||
// // ✅ Descope 로그인 성공 시 g5_member 세션 동기화
|
||||
// $loginId = $_SESSION['user']['loginIds'][0] ?? '';
|
||||
// if ($loginId === 'b24014@hanmaceng.co.kr') {
|
||||
// // g5_member 계정이 이미 존재한다고 가정
|
||||
// $_SESSION['ss_mb_id'] = $loginId;
|
||||
// $_SESSION['ss_mb_level'] = 10;
|
||||
|
||||
// $is_member = true;
|
||||
// $is_admin = 'super';
|
||||
|
||||
// $member = [
|
||||
// 'mb_id' => $loginId,
|
||||
// 'mb_name' => $_SESSION['user']['name'] ?? '관리자',
|
||||
// 'mb_email' => $_SESSION['user']['email'] ?? '',
|
||||
// 'mb_level' => 10,
|
||||
// 'mb_nick' => '관리자',
|
||||
// ];
|
||||
// }
|
||||
// // Descope 로그인 성공 시 (예: descope_session.php 내부)
|
||||
// if (!empty($_SESSION['user']['loginIds'][0])) {
|
||||
// $loginId = $_SESSION['user']['loginIds'][0];
|
||||
|
||||
// // g5_member 테이블에 계정이 존재한다고 가정
|
||||
// $_SESSION['ss_mb_id'] = $loginId;
|
||||
// $_SESSION['ss_mb_level'] = 10; // 관리자 레벨
|
||||
|
||||
// // 그누보드 전역 변수 보정
|
||||
// $is_member = true;
|
||||
// $is_admin = 'super';
|
||||
|
||||
// $member = [
|
||||
// 'mb_id' => $loginId,
|
||||
// 'mb_name' => $_SESSION['user']['name'] ?? '관리자',
|
||||
// 'mb_email' => $_SESSION['user']['email'] ?? '',
|
||||
// 'mb_level' => 10,
|
||||
// 'mb_nick' => '관리자',
|
||||
// ];
|
||||
// }
|
||||
// descope_session.php
|
||||
|
||||
// 1) 세션 시작
|
||||
if (session_status() === PHP_SESSION_NONE) {
|
||||
session_start();
|
||||
}
|
||||
|
||||
if (empty($_SESSION['user']['userId']) && !empty($_COOKIE['descope_login_id'])) {
|
||||
$customAttributes = json_decode(base64_decode($_COOKIE['descope_custom_attributes'] ?? ''), true);
|
||||
$roleNames = json_decode(base64_decode($_COOKIE['descope_role_names'] ?? ''), true);
|
||||
$loginIdFromCookie = trim((string)($_COOKIE['descope_login_id'] ?? ''));
|
||||
|
||||
$_SESSION['user'] = [
|
||||
'userId' => trim((string)($_COOKIE['descope_user_id'] ?? $loginIdFromCookie)),
|
||||
'loginIds' => $loginIdFromCookie !== '' ? [$loginIdFromCookie] : [],
|
||||
'name' => trim((string)($_COOKIE['descope_user_name'] ?? '')),
|
||||
'email' => trim((string)($_COOKIE['descope_user_email'] ?? '')),
|
||||
'phone' => trim((string)($_COOKIE['descope_user_phone'] ?? '')),
|
||||
'customAttributes' => is_array($customAttributes) ? $customAttributes : [],
|
||||
'roleNames' => is_array($roleNames) ? $roleNames : [],
|
||||
];
|
||||
}
|
||||
|
||||
// 2) 로그인 검사 (비로그인 차단)
|
||||
// if (empty($_SESSION['user']['userId'])) {
|
||||
// // 세션 없으면 바로 차단
|
||||
// session_destroy();
|
||||
// echo "<script>
|
||||
// alert('로그인이 필요합니다.');
|
||||
// // 로그인 팝업 자동 오픈 플래그 전달
|
||||
// window.location.href = '/egbim/index.php?popup=login';
|
||||
// </script>";
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// 3) 로그인 정보 추출
|
||||
$loginIds = $_SESSION['user']['loginIds'] ?? [];
|
||||
$loginId = (is_array($loginIds) && !empty($loginIds)) ? $loginIds[0] : '';
|
||||
|
||||
$userName = $_SESSION['user']['name'] ?? '';
|
||||
$userEmail = $_SESSION['user']['email'] ?? '';
|
||||
|
||||
// 4) 관리자/일반 사용자 구분
|
||||
$ADMIN_EMAILS = [
|
||||
'kjy0426@hanmaceng.co.kr',
|
||||
'b24014@hanmaceng.co.kr',
|
||||
'b23065@hanmaceng.co.kr',
|
||||
'shyeom1@samaneng.com',
|
||||
'cjy627@hanmaceng.co.kr',
|
||||
'b23072@hanmaceng.co.kr',
|
||||
'cozyjin@hanmaceng.co.kr',
|
||||
'm24031@hanmaceng.co.kr',
|
||||
'b24051@hanmaceng.co.kr',
|
||||
'rmsgud1202@hanmaceng.co.kr',
|
||||
'm21318@hanmaceng.co.kr',
|
||||
'b25023@hanmaceng.co.kr',
|
||||
'sdi9429@naver.com',
|
||||
'junsuy@hanmail.net',
|
||||
'ilphilo92@gmail.com'
|
||||
];
|
||||
// $isAdmin = in_array($loginId, $ADMIN_EMAILS, true);
|
||||
$isAdmin = $loginId && in_array($loginId, $ADMIN_EMAILS, true);
|
||||
|
||||
// ✅ 그누보드 전역 세션 동기화
|
||||
if ($loginId) {
|
||||
$_SESSION['ss_mb_id'] = $loginId;
|
||||
$_SESSION['ss_mb_level'] = $isAdmin ? 10 : 2;
|
||||
|
||||
$is_member = true;
|
||||
$is_admin = $isAdmin ? 'super' : '';
|
||||
|
||||
$member = [
|
||||
'mb_id' => $loginId,
|
||||
'mb_name' => $userName ?: $loginId,
|
||||
'mb_email' => $userEmail,
|
||||
'mb_level' => $_SESSION['ss_mb_level'],
|
||||
'mb_nick' => $userName ?: $loginId,
|
||||
];
|
||||
} else {
|
||||
// ✅ 비회원: 로그인 세션 없음
|
||||
$is_member = false;
|
||||
$is_admin = '';
|
||||
$member = [];
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,205 @@
|
||||
<?php
|
||||
// header('Content-Type: application/json; charset=utf-8');
|
||||
// ini_set('display_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
|
||||
// $email = trim($_POST['email'] ?? '');
|
||||
// $password = trim($_POST['password'] ?? '');
|
||||
|
||||
// if (!$email || !$password) {
|
||||
// echo json_encode(['status' => 'error', 'message' => '이메일 또는 비밀번호가 없습니다.']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 너의 Descope 프로젝트 ID
|
||||
|
||||
// $url = 'https://api.descope.com/v1/auth/password/signup';
|
||||
// $data = [
|
||||
// "email" => $email,
|
||||
// "password" => $password
|
||||
// ];
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_POST, true);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
|
||||
// "loginId" => $email,
|
||||
// "user" => [
|
||||
// "loginId" => $email,
|
||||
// "email" => $email
|
||||
// ],
|
||||
// "password" => $password
|
||||
// ]));
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// "Content-Type: application/json",
|
||||
// "Authorization: Bearer $project_id"
|
||||
// ]);
|
||||
// $response = curl_exec($ch);
|
||||
// $err = curl_error($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// if ($http_code === 200) {
|
||||
// echo json_encode(['status' => 'ok']);
|
||||
// } else {
|
||||
// $response_json = json_decode($response, true);
|
||||
// echo json_encode([
|
||||
// 'status' => 'error',
|
||||
// 'message' => $response_json['errorDescription'] ?? 'Descope API 호출 실패',
|
||||
// 'code' => $http_code,
|
||||
// 'error' => $err
|
||||
// ]);
|
||||
// }
|
||||
|
||||
// exit;
|
||||
?>
|
||||
<?php
|
||||
// ini_set('display_errors', 1);
|
||||
// ini_set('display_startup_errors', 1);
|
||||
// error_reporting(E_ALL);
|
||||
// header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
// // $email = trim($_POST['email'] ?? '');
|
||||
// // $password = trim($_POST['password'] ?? '');
|
||||
// $email = 'sdi9429@gmail.com';
|
||||
|
||||
// // if (!$email || !$password) {
|
||||
// // echo json_encode(['status' => 'error', 'message' => '이메일 또는 비밀번호가 없습니다.']);
|
||||
// // exit;
|
||||
// // }
|
||||
// if (!$email) {
|
||||
// echo json_encode(['status' => 'error', 'message' => '이메일이 없습니다.']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// $project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // Descope 프로젝트 ID
|
||||
|
||||
// // // 1. 비밀번호 회원가입 (Password Signup)
|
||||
// // $url_signup = 'https://api.descope.com/v1/auth/password/signup';
|
||||
// // $signup_data = [
|
||||
// // "loginId" => $email,
|
||||
// // "user" => [
|
||||
// // "loginId" => $email,
|
||||
// // "email" => $email
|
||||
// // ],
|
||||
// // "password" => $password
|
||||
// // ];
|
||||
|
||||
// // $ch = curl_init($url_signup);
|
||||
// // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// // curl_setopt($ch, CURLOPT_POST, true);
|
||||
// // curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($signup_data));
|
||||
// // curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// // "Content-Type: application/json",
|
||||
// // "Authorization: Bearer $project_id"
|
||||
// // ]);
|
||||
// // $response_signup = curl_exec($ch);
|
||||
// // $err_signup = curl_error($ch);
|
||||
// // $http_code_signup = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// // curl_close($ch);
|
||||
|
||||
// // if ($http_code_signup !== 200) {
|
||||
// // $response_json = json_decode($response_signup, true);
|
||||
// // echo json_encode([
|
||||
// // 'status' => 'error',
|
||||
// // 'message' => $response_json['errorDescription'] ?? 'Descope 회원가입 API 호출 실패',
|
||||
// // 'code' => $http_code_signup,
|
||||
// // 'error' => $err_signup
|
||||
// // ]);
|
||||
// // exit;
|
||||
// // }
|
||||
|
||||
// // 2. OTP 이메일 전송
|
||||
// $url = "https://api.descope.com/v1/auth/otp/signup/email";
|
||||
// $data = [
|
||||
// "loginId" => $email, // 이메일 주소
|
||||
// "email" => $email
|
||||
// ];
|
||||
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_POST, true);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
// "Content-Type: application/json",
|
||||
// "Authorization: Bearer $project_id"
|
||||
// ]);
|
||||
// $response = curl_exec($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// // if ($http_code === 200) {
|
||||
// // echo json_encode(['status' => 'ok']);
|
||||
// // } else {
|
||||
// // $response_json = json_decode($response, true);
|
||||
// // echo json_encode([
|
||||
// // 'status' => 'error',
|
||||
// // 'message' => $response_json['errorDescription'] ?? 'Descope API 호출 실패',
|
||||
// // 'code' => $http_code
|
||||
// // ]);
|
||||
// // }
|
||||
|
||||
// // sessionJwt는 반드시 프론트에 넘겨야 함!
|
||||
// if ($http_code === 200 && !empty($res_data['sessionJwt'])) {
|
||||
// echo json_encode(['status'=>'ok', 'sessionJwt'=>$res_data['sessionJwt']]);
|
||||
// } else {
|
||||
// $msg = $res_data['errorDescription'] ?? 'Descope OTP 발송 실패';
|
||||
// echo json_encode(['status'=>'fail', 'message'=>$msg, 'debug'=>$res_data]);
|
||||
// }
|
||||
|
||||
// echo json_encode([
|
||||
// 'status'=>'debug',
|
||||
// 'raw'=> $response, // $response: curl_exec 결과
|
||||
// 'php_error'=> error_get_last()
|
||||
// ]);
|
||||
|
||||
// exit;
|
||||
?>
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
|
||||
// 생략 가능: $email = 'test123@test.com';
|
||||
|
||||
$project_id = 'P2wON5fy1K6kyia269VpeIzYP8oP'; // 실제 프로젝트 ID로 변경
|
||||
|
||||
$url = "https://api.descope.com/v1/auth/otp/signup/email";
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"email" => $email
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Content-Type: application/json",
|
||||
"Authorization: Bearer $project_id"
|
||||
]);
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$res_data = json_decode($response, true); // 항상 선언
|
||||
|
||||
if ($http_code === 200 && isset($res_data['maskedEmail'])) {
|
||||
// 성공 케이스
|
||||
echo json_encode(['status' => 'ok', 'maskedEmail' => $res_data['maskedEmail']]);
|
||||
} else {
|
||||
// 실패 케이스
|
||||
$msg = $res_data['errorDescription'] ?? 'Descope OTP 발송 실패';
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'message' => $msg,
|
||||
'debug' => $res_data
|
||||
]);
|
||||
}
|
||||
exit;
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
$email = $_POST['email'] ?? '';
|
||||
if (!$email) exit(json_encode(['status'=>'fail', 'message'=>'이메일 누락']));
|
||||
|
||||
// 아래 내용은 실제 사용중인 Descope OTP 전송 API와 맞게 수정해야 함
|
||||
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP";
|
||||
$url = "https://api.descope.com/v1/auth/otp/signup/email";
|
||||
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$api_key}",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
$res = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($http_code == 200) {
|
||||
echo json_encode(['status'=>'ok']);
|
||||
} else {
|
||||
echo json_encode(['status'=>'fail','message'=>'OTP 재전송 실패']);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
session_start();
|
||||
// -- JSON 응답 보장 --
|
||||
header('Content-Type: application/json; charset=UTF-8');
|
||||
|
||||
// -- 실서비스 전에는 환경변수 사용 권장 --
|
||||
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
|
||||
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
|
||||
|
||||
// -- POST 입력값 (여기서 name 값 등 반드시 필수체크 필요!) --
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$name = trim($_POST['name'] ?? '');
|
||||
$password = trim($_POST['password'] ?? '');
|
||||
$family = trim($_POST['familyCompany'] ?? ''); // Machine Name: familycompany
|
||||
$familyUniqueKey = trim($_POST['familyUniqueKey'] ?? ''); // Machine Name: familyUniqueKey
|
||||
$team = trim($_POST['team'] ?? ''); // Machine Name: team
|
||||
$position = trim($_POST['position'] ?? ''); // Machine Name: position
|
||||
$hp = trim($_POST['phone'] ?? ''); // phone
|
||||
// $completeForm = ($_POST['completeForm'] ?? '') ? true : false; // Boolean 처리
|
||||
$completeForm = filter_var($_POST['completeForm'] ?? false, FILTER_VALIDATE_BOOLEAN);
|
||||
$refreshJwt = trim($_POST['refreshJwt']);
|
||||
// $refreshJwt = $_SESSION['refreshJwt'] ?? '';
|
||||
$company = trim($_POST['company'] ?? ''); // Machine Name: company 외부사용자 회사명
|
||||
|
||||
// if (!$refreshJwt) {
|
||||
// // 필수 값 누락시 에러 반환
|
||||
// echo json_encode(["error" => "refreshJWT is missing"]);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
if (!$refreshJwt) {
|
||||
echo json_encode([
|
||||
"status" => "fail",
|
||||
"message" => "세션이 만료되었습니다. 다시 로그인해 주세요."
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
$internalDomains = [
|
||||
"hanmaceng.co.kr",
|
||||
"samaneng.com",
|
||||
"jangheon.co.kr",
|
||||
"hallasanup.com",
|
||||
"pre-cast.co.kr",
|
||||
"baroncs.co.kr"
|
||||
];
|
||||
|
||||
$domain = explode('@', $email)[1] ?? '';
|
||||
// if (in_array($domain, $internalDomains)) {
|
||||
// $tenantId = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; //내부
|
||||
// } else {
|
||||
// $tenantId = "T2x4TDzxasp7auPCPcN8uOrxXchh"; //외부
|
||||
// }
|
||||
|
||||
if (in_array($domain, $internalDomains)) {
|
||||
// 내부 사용자 → 내부 tenant 하나만
|
||||
$userTenants = [
|
||||
[
|
||||
"tenantId" => "T2wQcWCBhUfJgUWHWgNwLg4iUDVY" // 내부 tenantId
|
||||
]
|
||||
];
|
||||
} else {
|
||||
// 외부 사용자 → customer + egbim 두 개 tenant 자동 등록
|
||||
$userTenants = [
|
||||
[
|
||||
"tenantId" => "T2x4TDzxasp7auPCPcN8uOrxXchh" // customer tenantId
|
||||
],
|
||||
[
|
||||
"tenantId" => "T2yGFrGSnFX601G22JOMojJX7OMd" // egbim tenantId
|
||||
]
|
||||
];
|
||||
}
|
||||
|
||||
//라이센스 만료일 계산
|
||||
$now = new DateTime('now', new DateTimeZone('Asia/Seoul'));
|
||||
$expiry = (clone $now)->modify('+90 days')->format(DateTime::ATOM);
|
||||
|
||||
// -- Custom Attribute 실제 Machine Name에 맞춰서 할당 (Descope 콘솔 기준) --
|
||||
$custom = [
|
||||
"familyCompany" => $family, // 소속 가족사
|
||||
"familyUniqueKey" => $familyUniqueKey, // 사번
|
||||
"team" => $team, // 소속팀
|
||||
"position" => $position, // 직위
|
||||
"completeForm" => $completeForm, // 정보입력완료 (Boolean)
|
||||
// "egBimLExpiryDate" => $expiry //egbim 라이센스 만료일
|
||||
// 필요하면 추가로 다른 Machine Name도 사용 가능
|
||||
];
|
||||
|
||||
if (! in_array($domain, $internalDomains, true)) {
|
||||
$custom["egBimLExpiryDate"] = $expiry;
|
||||
}
|
||||
|
||||
if ($company) {
|
||||
$custom["company"] = $company; // 외부사용자 회사명 추가
|
||||
}
|
||||
|
||||
// -- 1. 사용자 정보 업데이트 --
|
||||
$update_body = [
|
||||
"loginId" => $email,
|
||||
"email" => $email,
|
||||
"name" => $name,
|
||||
"phone" => $hp,
|
||||
"verifiedPhone" => false,
|
||||
"customAttributes" => $custom,
|
||||
// "roleNames" => [ "Default User" ],
|
||||
"userTenants" => $userTenants
|
||||
];
|
||||
|
||||
$ch = curl_init('https://api.descope.com/v1/mgmt/user/update');
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_CUSTOMREQUEST => "POST",
|
||||
CURLOPT_HTTPHEADER => [
|
||||
"Content-Type: application/json",
|
||||
"Authorization: Bearer {$projectId}:{$managementKey}"
|
||||
],
|
||||
CURLOPT_POSTFIELDS => json_encode($update_body),
|
||||
]);
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$res_data = json_decode($response, true);
|
||||
|
||||
// -- 1-1. 사용자 정보 업데이트 실패시 --
|
||||
if ($http_code !== 200) {
|
||||
$msg = $res_data['errorDescription'] ?? 'Descope 정보 업데이트 실패';
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'step' => 'info',
|
||||
'message' => $msg,
|
||||
'raw' => $response
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// -- 2. 비밀번호 변경 (입력값이 있을 경우) --
|
||||
if ($password) {
|
||||
$pw_body = [
|
||||
"loginId" => $email,
|
||||
"newPassword" => $password
|
||||
];
|
||||
|
||||
error_log("Descope password update payload: " . json_encode($pw_body));
|
||||
error_log("Using refreshJwt for password update: " . $refreshJwt);
|
||||
|
||||
$ch2 = curl_init('https://api.descope.com/v1/auth/password/update');
|
||||
curl_setopt_array($ch2, [
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_CUSTOMREQUEST => "POST",
|
||||
CURLOPT_HTTPHEADER => [
|
||||
"Content-Type: application/json",
|
||||
"Authorization: Bearer {$projectId}:{$refreshJwt}"
|
||||
],
|
||||
CURLOPT_POSTFIELDS => json_encode($pw_body),
|
||||
]);
|
||||
$response2 = curl_exec($ch2);
|
||||
$http_code2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch2);
|
||||
|
||||
$res_data2 = json_decode($response2, true);
|
||||
|
||||
if ($http_code2 !== 200) {
|
||||
$msg2 = $res_data2['errorDescription'] ?? 'Descope 비밀번호 변경 실패';
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'step' => 'password',
|
||||
'message' => $msg2,
|
||||
'raw' => $response2
|
||||
]);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// -- 3. 모두 성공 --
|
||||
echo json_encode(['status' => 'ok']);
|
||||
?>
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
header('Content-Type: application/json');
|
||||
require_once './descope_config.php';
|
||||
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$password = trim($_POST['password'] ?? '');
|
||||
$refreshJwt = trim($_POST['refreshJwt'] ?? '');
|
||||
|
||||
if (!$email || !$password || !$refreshJwt) {
|
||||
echo json_encode(['status' => 'fail', 'message' => '필수값 없음']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Descope API - 비밀번호 변경 엔드포인트 사용
|
||||
$url = "https://api.descope.com/v1/auth/password/update";
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"newPassword" => $password,
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer " . $refreshJwt,
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($code == 200) {
|
||||
echo json_encode(['status' => 'ok']);
|
||||
} else {
|
||||
$resData = json_decode($response, true);
|
||||
$msg = $resData['errorDescription'] ?? '비밀번호 변경 실패';
|
||||
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
|
||||
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
|
||||
$loginId = 'sdi9429@gmail.com'; // 테스트할 사용자
|
||||
$status = 'disabled'; // 또는 'enabled'
|
||||
|
||||
$headers = [
|
||||
"Content-Type: application/json",
|
||||
"Authorization: Bearer {$projectId}:{$managementKey}"
|
||||
];
|
||||
|
||||
$body = [
|
||||
"loginId" => $loginId,
|
||||
"status" => $status
|
||||
];
|
||||
|
||||
$ch = curl_init('https://api.descope.com/v1/mgmt/user/update/status');
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
// 결과 출력
|
||||
header('Content-Type: application/json');
|
||||
echo json_encode([
|
||||
'httpCode' => $httpCode,
|
||||
'response' => json_decode($response, true)
|
||||
]);
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
// header('Content-Type: application/json');
|
||||
|
||||
// $management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K2ycqpjeh1voPBdxXxzB3ScZOQ6v9aiLmU2cIj70X1H8Kcoz0KWfCWmofUwAsAkJroXA8QC';
|
||||
|
||||
// // userId 또는 loginId 사용 가능
|
||||
// $userId = $_POST['userId'] ?? '';
|
||||
// $loginId = $_POST['loginId'] ?? '';
|
||||
|
||||
// if (!$userId && !$loginId) {
|
||||
// echo json_encode(['status' => 'fail', 'message' => 'userId 또는 loginId 누락']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// $url = "https://api.descope.com/v1/mgmt/user/delete";
|
||||
|
||||
// $payload = json_encode([
|
||||
// "userId" => $userId,
|
||||
// "loginId" => $loginId
|
||||
// ]);
|
||||
|
||||
// $headers = [
|
||||
// "Authorization: Bearer $management_key",
|
||||
// "Content-Type: application/json"
|
||||
// ];
|
||||
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
|
||||
// $response = curl_exec($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// if ($http_code === 200) {
|
||||
// echo json_encode(['status' => 'ok', 'message' => '탈퇴 성공']);
|
||||
// } else {
|
||||
// echo json_encode([
|
||||
// 'status' => 'fail',
|
||||
// 'message' => '탈퇴 실패',
|
||||
// 'code' => $http_code,
|
||||
// 'response' => $response
|
||||
// ]);
|
||||
// }
|
||||
?>
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// TODO: 환경변수/별도 설정파일에서 읽어오세요.
|
||||
$management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
|
||||
|
||||
$userId = $_POST['userId'] ?? '';
|
||||
$loginId = $_POST['loginId'] ?? '';
|
||||
|
||||
if (!$userId && !$loginId) {
|
||||
echo json_encode(['status' => 'fail', 'message' => 'userId 또는 loginId가 필요합니다.']);
|
||||
exit;
|
||||
}
|
||||
|
||||
$url = "https://api.descope.com/v1/mgmt/user/delete";
|
||||
$payload = [];
|
||||
if ($userId) $payload['userId'] = $userId;
|
||||
if ($loginId) $payload['loginId'] = $loginId;
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$management_key}",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
$err = curl_error($ch);
|
||||
curl_close($ch);
|
||||
|
||||
if ($err) {
|
||||
echo json_encode(['status' => 'fail', 'message' => 'cURL error', 'error' => $err]);
|
||||
exit;
|
||||
}
|
||||
|
||||
if ($http_code === 200) {
|
||||
echo json_encode(['status' => 'ok', 'message' => '탈퇴 처리 완료']);
|
||||
} else {
|
||||
echo json_encode([
|
||||
'status' => 'fail',
|
||||
'message' => 'Descope delete 실패',
|
||||
'code' => $http_code,
|
||||
'res' => $response
|
||||
]);
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,347 @@
|
||||
<?php
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/eng/skin/member/basic/descope_session.php';
|
||||
require_once $_SERVER['DOCUMENT_ROOT'].'/eng/bbs/userlist_admin_guard.php';
|
||||
?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Descope 유저 리스트</title>
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
|
||||
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
|
||||
<style>
|
||||
#tableContainer { max-height: 80vh; overflow-y: auto; overflow-x: hidden; }
|
||||
#floatingScroll {
|
||||
position: sticky; bottom: 0; left: 0; right: 0;
|
||||
height: 16px; overflow-x: auto; overflow-y: hidden;
|
||||
background: #f9f9f9; border-top: 1px solid #ccc; z-index: 50;
|
||||
}
|
||||
#floatingScrollInner { height: 1px; }
|
||||
thead th { position: sticky; top: 0; z-index: 60; background: #e5e7eb; }
|
||||
</style>
|
||||
</head>
|
||||
<body class="bg-gray-100 p-6">
|
||||
<div class="max-w-[1800px] mx-auto pb-10 bg-white shadow rounded-lg pl-5 pt-5 pr-5">
|
||||
<h1 class="text-2xl font-bold mb-4">Descope 유저 리스트</h1>
|
||||
|
||||
<!-- ✅ 검색 영역 -->
|
||||
<div class="flex items-center gap-2 mb-4">
|
||||
<select id="mode" class="border px-2 py-1 rounded">
|
||||
<option value="created">가입일 기준</option>
|
||||
<option value="lastSignIn">마지막 로그인 기준</option>
|
||||
<option value="license">라이센스 만료일 기준</option>
|
||||
<option value="serverLogin">최근 로그인 기준 (EGBIM)</option> <!-- ✅ 추가 -->
|
||||
</select>
|
||||
<input type="text" id="startDate" placeholder="시작일" class="border px-2 py-1 rounded">
|
||||
<span>~</span>
|
||||
<input type="text" id="endDate" placeholder="종료일" class="border px-2 py-1 rounded">
|
||||
<button id="filterBtn" class="bg-blue-500 text-white px-4 py-1 rounded">검색</button>
|
||||
<button id="resetBtn" class="bg-gray-400 text-white px-4 py-1 rounded">초기화</button>
|
||||
|
||||
<!-- ✅ 테넌트 체크박스 -->
|
||||
<div id="tenantFilter" class="flex items-center gap-2 ml-4">
|
||||
<label><input type="checkbox" name="tenant" value="Hanmac Family"> Hanmac Family</label>
|
||||
<label><input type="checkbox" name="tenant" value="Customer"> Customer</label>
|
||||
<label><input type="checkbox" name="tenant" value="egBIM-edu"> egBIM-edu</label>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- ✅ CSV 대량 생성 버튼 -->
|
||||
<button id="btn-import-descope" class="bg-green-600 text-white px-4 py-1 rounded hover:bg-green-700">계정 일괄 생성</button>
|
||||
|
||||
<!-- ✅ CSV Import 팝업 -->
|
||||
<div id="importModal" class="fixed inset-0 bg-black bg-opacity-40 flex items-center justify-center hidden z-50">
|
||||
<div class="bg-white rounded-lg shadow-lg p-6 w-[590px] max-w-[90%] relative">
|
||||
<h2 class="text-lg font-semibold mb-4">Descope 대량 생성</h2>
|
||||
|
||||
<label class="block text-sm font-medium mb-1">Google Sheet CSV URL</label>
|
||||
<input id="csvUrl" type="url"
|
||||
class="w-full border px-3 py-2 rounded mb-3"
|
||||
placeholder="https://docs.google.com/spreadsheets/d/.../export?format=csv&gid=..." />
|
||||
|
||||
<label class="block text-sm font-medium mb-1">egBIM 라이선스 만료일</label>
|
||||
<input id="expiry" type="date" class="w-full border px-3 py-2 rounded mb-3" />
|
||||
|
||||
<!-- <label class="inline-flex items-center mb-4">
|
||||
<input id="sendReset" type="checkbox" class="mr-2" checked>
|
||||
<span>비밀번호 재설정 메일 발송</span>
|
||||
</label> -->
|
||||
|
||||
<!-- ✅ Tenant Type 선택 -->
|
||||
<label class="block text-sm font-medium mb-1">소속 테넌트 선택</label>
|
||||
<div class="flex gap-4 mb-3">
|
||||
<label class="flex items-center gap-1">
|
||||
<input type="radio" name="tenant_type" value="customer" checked />
|
||||
<span>Customer (외부)</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-1">
|
||||
<input type="radio" name="tenant_type" value="family" />
|
||||
<span>Hanmac Family (내부)</span>
|
||||
</label>
|
||||
<label class="flex items-center gap-1">
|
||||
<input type="radio" name="tenant_type" value="edu" />
|
||||
<span>egBIM-edu (교육용)</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div id="importMsg" class="text-gray-500 text-sm mb-4"></div>
|
||||
|
||||
<div class="flex justify-end gap-2">
|
||||
<button id="importCancel" class="px-4 py-1 bg-gray-400 text-white rounded">취소</button>
|
||||
<button id="importRun" class="px-4 py-1 bg-blue-600 text-white rounded">실행</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ✅ 우측 검색창 -->
|
||||
<div class="flex justify-end flex-1">
|
||||
<input type="text" id="keyword" placeholder="소속 가족사 / 외부회사 검색"
|
||||
class="border px-2 py-1 rounded w-72">
|
||||
<button id="keywordBtn"
|
||||
class="ml-2 bg-blue-500 text-white px-4 py-1 rounded">검색</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ✅ 테이블 -->
|
||||
<div id="tableContainer" class="w-full pb-10 bg-white shadow rounded-lg overflow-x-auto">
|
||||
<table id="userTableWrapper"
|
||||
class="min-w-[2500px] text-sm text-center text-gray-700 border table-fixed">
|
||||
<thead class="bg-gray-200 text-xs uppercase">
|
||||
<tr>
|
||||
<th class="px-4 py-2 w-12">#</th>
|
||||
<th class="px-4 py-2 min-w-[150px]">Login ID</th>
|
||||
<th class="px-4 py-2 min-w-[160px]">Display Name</th>
|
||||
<th class="px-4 py-2 min-w-[140px]">직위</th>
|
||||
<th class="px-4 py-2 min-w-[180px]">Phone</th>
|
||||
<th class="px-4 py-2 min-w-[250px]">Created Time</th>
|
||||
<th class="px-4 py-2 min-w-[220px]">Tenants</th>
|
||||
<th class="px-4 py-2 min-w-[160px]">소속 가족사</th>
|
||||
<th class="px-4 py-2 min-w-[200px]">소속회사(외부용)</th>
|
||||
<th class="px-4 py-2 min-w-[100px]">Status</th>
|
||||
<th class="px-4 py-2 min-w-[220px]">Email</th>
|
||||
<th class="px-4 py-2 min-w-[140px]">정보입력완료</th>
|
||||
<th class="px-4 py-2 min-w-[200px]">egBIM 라이센스 만료일</th>
|
||||
<th class="px-4 py-2 min-w-[120px]">사번</th>
|
||||
<th class="px-4 py-2 min-w-[180px]">마지막 접속 IP</th>
|
||||
<th class="px-4 py-2 min-w-[200px]">Beps 마지막 로그인날짜</th>
|
||||
<th class="px-4 py-2 min-w-[210px]">egBIM 최근 로그인</th>
|
||||
<th class="px-4 py-2 min-w-[200px]">소속센터/부/실</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="userTable" class="divide-y"></tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div id="floatingScroll"><div id="floatingScrollInner"></div></div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function formatDate(value) {
|
||||
if (!value) return "";
|
||||
let ts = parseInt(value, 10);
|
||||
if (isNaN(ts)) return value;
|
||||
if (ts < 1e12) ts *= 1000; // 초 단위 → 밀리초 보정
|
||||
return new Date(ts).toLocaleString("ko-KR");
|
||||
}
|
||||
|
||||
// ✅ EGBIM DB에서 오는 VARCHAR (ex: "2025-09-16 18:49:48") 전용 포맷터
|
||||
function formatServerLogin(value) {
|
||||
if (!value) return "-";
|
||||
// "2025-09-16 18:49:48"
|
||||
const parts = value.split(" ");
|
||||
if (parts.length < 2) return value;
|
||||
|
||||
const datePart = parts[0].replace(/-/g, ". "); // "2025. 09. 16"
|
||||
const timePart = parts[1]; // "18:49:48"
|
||||
|
||||
let [h, m, s] = timePart.split(":").map(Number);
|
||||
const meridiem = h >= 12 ? "오후" : "오전";
|
||||
if (h === 0) h = 12;
|
||||
else if (h > 12) h -= 12;
|
||||
|
||||
return `${datePart}. ${meridiem} ${h}:${String(m).padStart(2,"0")}:${String(s).padStart(2,"0")}`;
|
||||
}
|
||||
|
||||
function loadUserList(start=null, end=null, mode="created") {
|
||||
let url = "/eng/bbs/descope_user_list.php";
|
||||
const params = [];
|
||||
if (start) params.push("start=" + encodeURIComponent(start));
|
||||
if (end) params.push("end=" + encodeURIComponent(end));
|
||||
if (mode) params.push("mode=" + encodeURIComponent(mode));
|
||||
|
||||
const keyword = $("#keyword").val().trim();
|
||||
if (keyword) params.push("keyword=" + encodeURIComponent(keyword));
|
||||
|
||||
const tenants = $("input[name='tenant']:checked")
|
||||
.map(function(){ return this.value; })
|
||||
.get();
|
||||
if (tenants.length) {
|
||||
params.push("tenants=" + encodeURIComponent(tenants.join(",")));
|
||||
}
|
||||
if (params.length) url += "?" + params.join("&");
|
||||
|
||||
$.getJSON(url, function(data) {
|
||||
let rows = "";
|
||||
if (data.status === "ok" && data.users) {
|
||||
data.users.forEach((u, idx) => {
|
||||
let tenantInfo = "";
|
||||
if (u.userTenants && Array.isArray(u.userTenants)) {
|
||||
tenantInfo = u.userTenants.map(t => t.tenantName || "").join("<br>");
|
||||
}
|
||||
rows += `
|
||||
<tr class="hover:bg-gray-50">
|
||||
<td class="px-4 py-2 text-center">${idx+1}</td>
|
||||
<td class="px-4 py-2">${u.loginIds?.[0] || "-"}</td>
|
||||
<td class="px-4 py-2">${u.name || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.position || "-"}</td>
|
||||
<td class="px-4 py-2">${u.phone || "-"}</td>
|
||||
<td class="px-4 py-2">${formatDate(u.createdTime) || "-"}</td>
|
||||
<td class="px-4 py-2">${tenantInfo || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.familyCompany || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.company || "-"}</td>
|
||||
<td class="px-4 py-2">${u.status || "-"}</td>
|
||||
<td class="px-4 py-2">${u.email || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.completeForm ? "완료" : "미완료"}</td>
|
||||
<td class="px-4 py-2">${formatDate(u.customAttributes?.egBimLExpiryDate) || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.familyUniqueKey || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.lastAccessIp || "-"}</td>
|
||||
<td class="px-4 py-2">${formatDate(u.customAttributes?.lastSignInDate) || "-"}</td>
|
||||
<!-- ✅ EGBIM 최근 로그인 표시 -->
|
||||
<td class="px-4 py-2">${formatServerLogin(u.customAttributes?.serverLastLogin) || "-"}</td>
|
||||
<td class="px-4 py-2">${u.customAttributes?.team || "-"}</td>
|
||||
</tr>`;
|
||||
});
|
||||
} else {
|
||||
rows = `<tr><td colspan="18" class="text-center text-red-500">데이터 없음</td></tr>`;
|
||||
}
|
||||
$("#userTable").html(rows);
|
||||
|
||||
const $tableContainer = $("#tableContainer");
|
||||
const $scroll = $("#floatingScroll");
|
||||
const $scrollInner = $("#floatingScrollInner");
|
||||
|
||||
function syncWidth() {
|
||||
const tableWidth = $("#userTableWrapper").outerWidth();
|
||||
const containerWidth = $tableContainer.width();
|
||||
$scrollInner.width(Math.max(tableWidth, containerWidth));
|
||||
}
|
||||
|
||||
$scroll.off("scroll").on("scroll", () =>
|
||||
$tableContainer.scrollLeft($scroll.scrollLeft())
|
||||
);
|
||||
$tableContainer.off("scroll").on("scroll", () =>
|
||||
$scroll.scrollLeft($tableContainer.scrollLeft())
|
||||
);
|
||||
|
||||
setTimeout(syncWidth, 500);
|
||||
$(window).off("resize.syncScroll").on("resize.syncScroll", syncWidth);
|
||||
});
|
||||
}
|
||||
|
||||
// ✅ 체크박스 클릭 시 즉시 필터링
|
||||
$(document).on("change", "input[name='tenant']", function() {
|
||||
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
flatpickr("#startDate", { dateFormat: "Y-m-d" });
|
||||
flatpickr("#endDate", { dateFormat: "Y-m-d" });
|
||||
|
||||
$("#filterBtn").on("click", function() {
|
||||
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
|
||||
});
|
||||
|
||||
$("#resetBtn").on("click", function() {
|
||||
$("#startDate").val("");
|
||||
$("#endDate").val("");
|
||||
$("#mode").val("created");
|
||||
$("input[name='tenant']").prop("checked", false);
|
||||
$("#keyword").val(""); // ✅ 검색창 초기화
|
||||
loadUserList();
|
||||
});
|
||||
|
||||
$("#keywordBtn").on("click", function() {
|
||||
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
|
||||
});
|
||||
$("#keyword").on("keypress", function(e) {
|
||||
if (e.which === 13) {
|
||||
loadUserList($("#startDate").val(), $("#endDate").val(), $("#mode").val());
|
||||
}
|
||||
});
|
||||
|
||||
loadUserList();
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<script>
|
||||
$(function(){
|
||||
// ✅ 모달 열기
|
||||
$("#btn-import-descope").on("click", () => {
|
||||
$("#importModal").removeClass("hidden");
|
||||
$("#importMsg").text("");
|
||||
$("#importRun").prop("disabled", false).text("실행");
|
||||
});
|
||||
|
||||
// ✅ 모달 닫기 (밖 클릭 포함)
|
||||
$("#importCancel, #importModal").on("click", (e) => {
|
||||
if (e.target.id === "importCancel" || e.target.id === "importModal") {
|
||||
$("#importModal").addClass("hidden");
|
||||
}
|
||||
});
|
||||
|
||||
// ✅ 실행 버튼 클릭
|
||||
$("#importRun").on("click", async () => {
|
||||
const csvUrl = $("#csvUrl").val().trim();
|
||||
const expiry = $("#expiry").val().trim();
|
||||
const tenantType = $('input[name="tenant_type"]:checked').val(); // ✅ 올바른 name 참조
|
||||
|
||||
if (!csvUrl) {
|
||||
$("#importMsg").text("❗ CSV URL을 입력하세요.");
|
||||
return;
|
||||
}
|
||||
|
||||
$("#importRun").prop("disabled", true).text("실행 중...");
|
||||
$("#importMsg").html("<span class='text-blue-600'>처리 중입니다... 잠시만 기다려주세요.</span>");
|
||||
|
||||
try {
|
||||
const res = await fetch("/eng/bbs/descope_import.php", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
csv_url: csvUrl,
|
||||
expiry: expiry,
|
||||
tenant_type: tenantType // ✅ 서버로 전달
|
||||
})
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
console.log("📦 응답:", data);
|
||||
|
||||
if (data.status === "ok") {
|
||||
$("#importMsg").html(`
|
||||
✅ 완료: <b>${data.created}</b> 생성 /
|
||||
<b>${data.updated}</b> 갱신 /
|
||||
<b>${data.failed}</b> 실패
|
||||
`);
|
||||
|
||||
if (data.failed > 0 && data.errors?.length) {
|
||||
console.warn("실패 목록:", data.errors);
|
||||
$("#importMsg").append(`<br><span class='text-gray-600'>일부 실패 로그는 콘솔에서 확인하세요.</span>`);
|
||||
}
|
||||
|
||||
} else {
|
||||
$("#importMsg").html(`❌ 실패: ${data.message || "서버 오류"}`);
|
||||
console.error("서버 응답:", data);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("통신 오류:", err);
|
||||
$("#importMsg").html("<span class='text-red-600'>❌ 통신 오류가 발생했습니다.</span>");
|
||||
} finally {
|
||||
$("#importRun").prop("disabled", false).text("실행");
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
// header('Content-Type: application/json');
|
||||
|
||||
// $management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K2ycqpjeh1voPBdxXxzB3ScZOQ6v9aiLmU2cIj70X1H8Kcoz0KWfCWmofUwAsAkJroXA8QC';
|
||||
// $loginId = $_POST['loginId'] ?? '';
|
||||
|
||||
// $url = "https://api.descope.com/v2/mgmt/user/search";
|
||||
// $payload = json_encode([
|
||||
// "loginId" => $loginId,
|
||||
// "limit" => 1
|
||||
// ]);
|
||||
|
||||
// $headers = [
|
||||
// "Authorization: Bearer $management_key",
|
||||
// "Content-Type: application/json"
|
||||
// ];
|
||||
|
||||
// $ch = curl_init($url);
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
// $response = curl_exec($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// if ($http_code === 200) {
|
||||
// $res = json_decode($response, true);
|
||||
|
||||
// if (!empty($res['users'][0])) {
|
||||
// // ✅ 먼저 $user에 복사
|
||||
// $user = $res['users'][0];
|
||||
|
||||
// // ✅ 값이 없으면 테스트용 기본값 삽입
|
||||
// $user['name'] = $user['name'] ?: '홍길동';
|
||||
// $user['phone'] = $user['phone'] ?: '01012345678';
|
||||
// $user['customAttributes']['company'] = $user['customAttributes']['company'] ?? '한맥ENG';
|
||||
// $user['customAttributes']['team'] = $user['customAttributes']['team'] ?? '설계팀';
|
||||
// $user['customAttributes']['employeeId'] = $user['customAttributes']['employeeId'] ?? 'HM2024';
|
||||
|
||||
// // ✅ 수정된 $user 사용
|
||||
// echo json_encode(['status' => 'ok', 'user' => $user]);
|
||||
// } else {
|
||||
// echo json_encode(['status' => 'fail', 'message' => '사용자를 찾을 수 없음']);
|
||||
// }
|
||||
// } else {
|
||||
// echo json_encode(['status' => 'fail', 'message' => 'Descope API 오류', 'code' => $http_code]);
|
||||
// }
|
||||
?>
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$management_key = 'P2wON5fy1K6kyia269VpeIzYP8oP:K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj';
|
||||
$loginId = $_POST['loginId'] ?? '';
|
||||
|
||||
$url = "https://api.descope.com/v2/mgmt/user/search";
|
||||
$payload = json_encode([
|
||||
"loginId" => $loginId,
|
||||
"limit" => 1
|
||||
]);
|
||||
|
||||
$headers = [
|
||||
"Authorization: Bearer $management_key",
|
||||
"Content-Type: application/json"
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
if ($http_code === 200) {
|
||||
$res = json_decode($response, true);
|
||||
|
||||
if (!empty($res['users'][0])) {
|
||||
$user = $res['users'][0];
|
||||
|
||||
// ✅ 실제 값이 있으면 그대로 사용, 없으면 빈 문자열
|
||||
$user['name'] = $user['name'] ?? '';
|
||||
$user['phone'] = $user['phone'] ?? '';
|
||||
$user['customAttributes']['company'] = $user['customAttributes']['company'] ?? '';
|
||||
$user['customAttributes']['team'] = $user['customAttributes']['team'] ?? '';
|
||||
$user['customAttributes']['employeeId'] = $user['customAttributes']['employeeId'] ?? '';
|
||||
|
||||
echo json_encode(['status' => 'ok', 'user' => $user]);
|
||||
} else {
|
||||
echo json_encode(['status' => 'fail', 'message' => '사용자를 찾을 수 없음']);
|
||||
}
|
||||
} else {
|
||||
echo json_encode(['status' => 'fail', 'message' => 'Descope API 오류', 'code' => $http_code]);
|
||||
}
|
||||
@@ -0,0 +1,204 @@
|
||||
<?php
|
||||
// // descope_verify.php
|
||||
|
||||
// // _GNUBOARD_ 등 시스템 상수 포함 필요
|
||||
// include_once('../../common.php');
|
||||
|
||||
// // POST 데이터 받기
|
||||
// $otp_code = trim($_POST['otp_code'] ?? '');
|
||||
// $email = trim($_POST['email'] ?? '');
|
||||
|
||||
// // $email = 'sdi9429@gmail.com'; // ★ 실제 인증번호 메일 받은 주소
|
||||
// // $otp_code = '378484';
|
||||
|
||||
// if (strlen($otp_code) !== 6) {
|
||||
// echo json_encode(['status'=>'fail', 'message'=>'잘못된 인증번호']);
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// // 1. Descope API에 검증 요청 (curl 또는 file_get_contents)
|
||||
// $descope_project_id = "P2wON5fy1K6kyia269VpeIzYP8oP";
|
||||
// $descope_api_url = "https://api.descope.com/v1/auth/otp/verify/email"; // email 인증 기준
|
||||
|
||||
// // $data = [
|
||||
// // 'loginId' => $email, // 이메일 아이디
|
||||
// // 'code' => $otp_code, // 입력받은 6자리 코드
|
||||
// // ];
|
||||
|
||||
// // $headers = [
|
||||
// // 'Content-Type: application/json',
|
||||
// // 'Accept: application/json',
|
||||
// // "x-descope-project-id: $descope_project_id"
|
||||
// // ];
|
||||
|
||||
// // $ch = curl_init();
|
||||
// // curl_setopt($ch, CURLOPT_URL, $descope_api_url);
|
||||
// // curl_setopt($ch, CURLOPT_POST, true);
|
||||
// // curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
// // curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
// // curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
|
||||
// // $response = curl_exec($ch);
|
||||
// // $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// // curl_close($ch);
|
||||
|
||||
// // $res_data = json_decode($response, true);
|
||||
|
||||
// // if ($http_code === 200 && isset($res_data['user'])) {
|
||||
// // // 인증 성공
|
||||
// // echo json_encode(['status'=>'ok']);
|
||||
// // } else {
|
||||
// // // 실패, 에러 메시지 출력
|
||||
// // $msg = $res_data['errorDescription'] ?? '인증 실패';
|
||||
// // echo json_encode(['status'=>'fail', 'message'=>$msg]);
|
||||
// // }
|
||||
|
||||
|
||||
|
||||
// $data = [
|
||||
// 'loginId' => $email,
|
||||
// 'code' => $otp_code,
|
||||
// ];
|
||||
// $headers = [
|
||||
// 'Content-Type: application/json',
|
||||
// 'Authorization: Bearer ' . $descope_project_id,
|
||||
// ];
|
||||
// $ch = curl_init('https://api.descope.com/v1/auth/otp/verify/email');
|
||||
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
// curl_setopt($ch, CURLOPT_POST, true);
|
||||
// curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
// curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
// $response = curl_exec($ch);
|
||||
// $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
// curl_close($ch);
|
||||
|
||||
// $res_data = json_decode($response, true);
|
||||
// if ($http_code === 200 && isset($res_data['sessionJwt'])) {
|
||||
// // 인증 성공
|
||||
// echo json_encode([
|
||||
// 'status'=>'ok',
|
||||
// 'refreshJwt' => $res_data['refreshJwt'] ?? '',
|
||||
// ]);
|
||||
// } else {
|
||||
// // 인증 실패
|
||||
// $msg = $res_data['errorDescription'] ?? '인증 실패';
|
||||
// echo json_encode(['status'=>'fail', 'message'=>$msg]);
|
||||
// }
|
||||
// exit;
|
||||
?>
|
||||
<?php
|
||||
// descope_verify.php
|
||||
|
||||
header('Content-Type: application/json; charset=UTF-8');
|
||||
|
||||
$commonPath = dirname(__DIR__, 3) . '/common.php';
|
||||
if (file_exists($commonPath)) {
|
||||
include_once($commonPath);
|
||||
}
|
||||
|
||||
// POST 데이터 받기
|
||||
$otp_code = trim($_POST['otp_code'] ?? '');
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
|
||||
if (strlen($otp_code) !== 6 || !$email) {
|
||||
echo json_encode(['status'=>'fail', 'message'=>'잘못된 입력']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Descope 설정
|
||||
$projectId = 'P2wON5fy1K6kyia269VpeIzYP8oP';
|
||||
$managementKey = 'K32l5ORmzy32OvaaPvpdZsMY3JmKQb7a3vvrl10PgjlJUGk3K7EssMH3uW5VGQSbrgtEdPj'; // baron Access Key
|
||||
|
||||
// 1. OTP 인증 요청
|
||||
$data = [
|
||||
'loginId' => $email,
|
||||
'code' => $otp_code,
|
||||
];
|
||||
|
||||
$headers = [
|
||||
'Content-Type: application/json',
|
||||
'Authorization: Bearer ' . $projectId,
|
||||
];
|
||||
|
||||
$ch = curl_init('https://api.descope.com/v1/auth/otp/verify/email');
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch, CURLOPT_POST, true);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
|
||||
$response = curl_exec($ch);
|
||||
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
// 응답 파싱
|
||||
$res_data = json_decode($response, true);
|
||||
|
||||
if ($http_code === 200 && isset($res_data['user'])) {
|
||||
$user = $res_data['user'];
|
||||
$userId = $user['userId'] ?? '';
|
||||
$email = $user['email'] ?? '';
|
||||
$refreshJwt = $res_data['refreshJwt'] ?? '';
|
||||
|
||||
// 도메인 분리
|
||||
$domain = explode('@', $email)[1];
|
||||
$internalDomains = [
|
||||
"hanmaceng.co.kr",
|
||||
"samaneng.com",
|
||||
"jangheon.co.kr",
|
||||
"hallasanup.com",
|
||||
"pre-cast.co.kr",
|
||||
"baroncs.co.kr"
|
||||
];
|
||||
|
||||
// 테넌트 결정
|
||||
if (in_array($domain, $internalDomains)) {
|
||||
$tenantId = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; // 내부
|
||||
$isInternal = true;
|
||||
} else {
|
||||
$tenantId = "T2x4TDzxasp7auPCPcN8uOrxXchh"; // 외부
|
||||
$isInternal = false;
|
||||
}
|
||||
|
||||
// 2. 테넌트 연결 요청
|
||||
$tenantPayload = [
|
||||
"identifier" => $userId,
|
||||
"tenantId" => $tenantId,
|
||||
"roleNames" => ["Default User"]
|
||||
];
|
||||
|
||||
$ch2 = curl_init('https://api.descope.com/v1/mgmt/user/update/tenant/add');
|
||||
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
|
||||
curl_setopt($ch2, CURLOPT_POST, true);
|
||||
curl_setopt($ch2, CURLOPT_POSTFIELDS, json_encode($tenantPayload));
|
||||
curl_setopt($ch2, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer {$projectId}:{$managementKey}",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
$tenantRes = curl_exec($ch2);
|
||||
$tenantHttpCode = curl_getinfo($ch2, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch2);
|
||||
|
||||
// if ($tenantHttpCode !== 200) {
|
||||
// echo json_encode(['status'=>'fail', 'message'=>'테넌트 연결 실패', 'descope_response' => $tenantRes]);
|
||||
|
||||
// exit;
|
||||
// }
|
||||
|
||||
// ✅ 중복 연결은 오류로 간주하지 않음
|
||||
if ($tenantHttpCode !== 200 && !str_contains($tenantRes, 'Tenant already exists')) {
|
||||
echo json_encode(['status'=>'fail', 'message'=>'테넌트 연결 실패', 'descope_response' => $tenantRes]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// 성공 응답
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'refreshJwt' => $refreshJwt,
|
||||
'loginId' => $email,
|
||||
'isInternal' => $isInternal
|
||||
]);
|
||||
} else {
|
||||
$msg = $res_data['errorDescription'] ?? '인증 실패';
|
||||
echo json_encode(['status'=>'fail', 'message'=>$msg]);
|
||||
}
|
||||
exit;
|
||||
?>
|
||||
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
// descope_verify_magiclink.php
|
||||
header('Content-Type: application/json');
|
||||
|
||||
$api_key = "P2wON5fy1K6kyia269VpeIzYP8oP"; // 본인 Descope API Key로 교체
|
||||
$token = $_POST['token'] ?? '';
|
||||
if (!$token) exit(json_encode(['status'=>'fail', 'message'=>'토큰 없음']));
|
||||
|
||||
$url = "https://api.descope.com/v1/auth/magiclink/verify";
|
||||
$data = [ "token" => $token ];
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer $api_key",
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$resData = json_decode($response, true);
|
||||
|
||||
if ($code == 200 && !empty($resData['refreshJwt'])) {
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'refreshJwt' => $resData['refreshJwt'],
|
||||
'email' => $resData['user']['email'] ?? ($resData['user']['loginIds'][0] ?? '')
|
||||
]);
|
||||
} else {
|
||||
$msg = $resData['errorDescription'] ?? '인증 실패';
|
||||
echo json_encode(['status'=>'fail', 'message'=>$msg, 'raw'=>$resData]);
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -0,0 +1,43 @@
|
||||
<?php
|
||||
header('Content-Type: application/json');
|
||||
require_once './descope_config.php';
|
||||
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$otp_code = trim($_POST['otp_code'] ?? '');
|
||||
|
||||
if (!$email || !$otp_code) {
|
||||
echo json_encode(['status' => 'fail', 'message' => '이메일/OTP 없음']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Descope OTP 인증 (verify)
|
||||
$url = 'https://api.descope.com/v1/auth/otp/verify/email';
|
||||
$data = [
|
||||
"loginId" => $email,
|
||||
"code" => $otp_code
|
||||
];
|
||||
|
||||
$ch = curl_init($url);
|
||||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||||
"Authorization: Bearer " . $DESCOPE_API_KEY,
|
||||
"Content-Type: application/json"
|
||||
]);
|
||||
curl_setopt($ch, CURLOPT_POST, 1);
|
||||
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
$response = curl_exec($ch);
|
||||
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||||
curl_close($ch);
|
||||
|
||||
$resData = json_decode($response, true);
|
||||
|
||||
if ($code == 200 && isset($resData['refreshJwt'])) {
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'refreshJwt' => $resData['refreshJwt'],
|
||||
]);
|
||||
} else {
|
||||
$msg = $resData['errorDescription'] ?? 'OTP 인증 실패';
|
||||
echo json_encode(['status' => 'fail', 'message' => $msg, 'raw' => $response]);
|
||||
}
|
||||
@@ -0,0 +1,651 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>도면관리</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css" />
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/floorplan.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
|
||||
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- //모든 팝업페이지 경로 -->
|
||||
<div class="container floorplan">
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Drawing Management</h2>
|
||||
<span>Efficient Management of Large-Scale Design Drawings</span>
|
||||
</div>
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj k"></i>
|
||||
<span>Provides functions to easily find, review, edit,<br> and plot drawings without opening each file</span>
|
||||
<p>By utilizing drawing information such as project name, drawing title,<br> and drawing number recorded within the file, users can efficiently manage<br> a large number of design drawings with simple search, convenient editing, and batch plotting.</p>
|
||||
</div>
|
||||
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
|
||||
<div class="dia_elements_wrap">
|
||||
<div class="dia_element dia_element01">
|
||||
<i></i>
|
||||
<span class="dia_tit">Convenient drawing search &<br> information viewing</span>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element dia_element02">
|
||||
<i></i>
|
||||
<span class="dia_tit">Batch editing of<br> drawing information</span>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element dia_element03">
|
||||
<i></i>
|
||||
<span class="dia_tit">Batch plotting of<br> multiple drawings</span>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dia_circles_wrap">
|
||||
<div class="circle_dash"></div>
|
||||
<div class="circle_belt"></div>
|
||||
<div class="circle_core">
|
||||
<span>Efficient</span>
|
||||
<span>Drawing<br> Management</span>
|
||||
</div>
|
||||
<div class="circle_dots move">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
<section class="key find layout_fix_left">
|
||||
<div class="left">
|
||||
<div class="mid_tit">
|
||||
<span data-aos="fade-right" data-aos-duration="600">Drawing Search &<br> <em>Information<br class="brk"> Viewing</em></span>
|
||||
</div>
|
||||
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
|
||||
<li class="on"><span><em>01</em>User-Defined Folder</span></li>
|
||||
<li><span><em>02</em>Drawing Information Viewing</span></li>
|
||||
<li><span><em>03</em>Drawing Preview</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="right js__fixLeft_secs">
|
||||
<div id="content1" class="find01">
|
||||
<span class="sub_tit">User-Defined Folder</span>
|
||||
<div class="sub_text">
|
||||
Add frequently used folders to the User-Defined Folder panel by dragging and dropping from the folder explorer, so you can quickly access them when needed.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<object data="<?php echo eng_img_url('find_img_01_01.svg'); ?>" alt="" class="apx"></object>
|
||||
<img src="<?php echo eng_img_url('find_img_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
<b>Add frequently used folders</b><br> to the User-Defined Folder panel
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_find_01.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
<b>Reduce folder search time</b><br> for more efficient work.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content2" class="find02">
|
||||
<span class="sub_tit">Drawing Information Viewing</span>
|
||||
<div class="sub_text">
|
||||
Easily load and check drawing information such as project name, drawing title, and drawing number.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('find_img_02_01.png'); ?>" alt="" class="apx">
|
||||
<img src="<?php echo eng_img_url('find_img_02.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
<b>Instantly view the drawing<br> information you need</b>
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_find_02.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
Improve accuracy<br> and efficiency with<br><b> faster data access</b>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content3" class="find03">
|
||||
<span class="sub_tit">Drawing Preview</span>
|
||||
<div class="sub_text">
|
||||
In dual mode, the drawing preview window can be separated for flexible use.<br> Each preview window can be placed on different monitors,<br> allowing users to conveniently view drawings without opening the actual files.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('find_img_03_02.png'); ?>" alt="" class="apx">
|
||||
<div class="find_03_move">
|
||||
<img src="<?php echo eng_img_url('find_img_03_03.png'); ?>" alt="">
|
||||
<img src="<?php echo eng_img_url('find_img_03_01.png'); ?>" alt="" class="element">
|
||||
<img src="<?php echo eng_img_url('find_img_03.png'); ?>" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
<b>Separate the drawing preview</b><br> window in dual mode
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_find_03.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
View drawings conveniently<br><b> without opening them</b>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="key info layout_fix_left">
|
||||
<div class="left">
|
||||
<div class="mid_tit">
|
||||
<span data-aos="fade-right" data-aos-duration="600">Drawing Information<br> <em>Selection &<br class="brk"> Editing</em></span>
|
||||
</div>
|
||||
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
|
||||
<li class=" on"><span><em>01</em>Edit Drawing Information</span></li>
|
||||
<li><span><em>02</em>Select Drawing Information to View </span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="right js__fixLeft_secs">
|
||||
<div id="content4" class="info01">
|
||||
<span class="sub_tit">Editing Drawing Information</span>
|
||||
<div class="sub_text">
|
||||
Select the desired drawing information to edit multiple drawings at once.<br> Batch editing is supported with an Excel-style drag interface for quick and easy updates.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('info_img_01_01.svg'); ?>" alt="" class="apx">
|
||||
<img src="<?php echo eng_img_url('info_img_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
Batch editing with<br><b> Excel-style drag control</b>
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_info_01.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
<b>Reduce repetitive tasks</b><br> for faster and<br> more accurate edits
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content5" class="info02">
|
||||
<span class="sub_tit">Selecting Drawing Information to View</span>
|
||||
<div class="sub_text">
|
||||
Select which drawing information to display, and easily add or remove it from the drawing list.<br> The interface also indicates which data is currently being modified.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('info_img_02_01.png'); ?>" alt="" class="apx">
|
||||
<img src="<?php echo eng_img_url('info_img_02.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
Select drawing information<br> <b>to add or remove from the list</b>
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_info_02.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
<b>Flexible drawing<br> management</b> for more<br> efficient workflow
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="key print layout_fix_left">
|
||||
<div class="left">
|
||||
<div class="mid_tit">
|
||||
<span data-aos="fade-right" data-aos-duration="600">Plot Option Settings &<br> <em>Batch<br class="brk"> Plotting</em></span>
|
||||
</div>
|
||||
<ul data-aos="fade-right" data-aos-duration="1000" data-aos-delay="300" class="js__fixLeft_tit">
|
||||
<li class="on"><span><em>01</em>Select Files and View Plot Options</span></li>
|
||||
<li><span><em>02</em>Adjust Plot Options & Preview</span></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="right js__fixLeft_secs">
|
||||
<div id="content6" class="print01">
|
||||
<span class="sub_tit">Select Files and View Plot Options</span>
|
||||
<div class="sub_text">
|
||||
The drawing list of the selected folder appears in the explorer,<br> allowing users to select drawings for plotting and check their plot options.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('print_img_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
View the drawing list<br><b> for multiple selections<br> and plot options</b>
|
||||
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_print_01.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
<b>Quickly review drawings</b><br> and process batch output<br> with ease
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="content7" class="print02">
|
||||
<span class="sub_tit">Adjust Plot Options & Preview</span>
|
||||
<div class="sub_text">
|
||||
Plot options can be adjusted individually or in batches,<br> and previewing before plotting is available to ensure accuracy.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('print_img_02.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<div class="top">
|
||||
Adjust plot options<br><b> individually or in batches and<br> preview before plotting</b>
|
||||
</div>
|
||||
<div class="line">
|
||||
<img src="<?php echo eng_img_url('ico_find_tri.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="bottom">
|
||||
<img src="<?php echo eng_img_url('ico_print_02.svg'); ?>" alt="">
|
||||
<div class="bottom_txt">
|
||||
<b>Review plot options</b><br> first to reduce errors<br> and improve accuracy
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- footer -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //footer -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
//console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time) => {
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,501 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>for BIM</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css" />
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/forbim.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
|
||||
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- 컨텐츠 시작 -->
|
||||
<div class="container forbim">
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">for BIM</h2>
|
||||
<span>In the Digital Transformation Era, View Drawings and BIM Models Together</span>
|
||||
</div>
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj k"></i>
|
||||
<span>View 3D BIM Models<br> Alongside Drawings with a Double Click</span>
|
||||
<p>EG-BIM provides a feature that allows users to easily view complex design information<br> that is difficult to check from drawings alone together with BIM models through the 3D Viewer.</p>
|
||||
</div>
|
||||
<div class="visual" data-aos="fade-up" data-aos-duration="1000">
|
||||
<img src="<?php echo eng_img_url('forbim_visual.png'); ?>" alt="">
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="theorys js__dark full_screen">
|
||||
<span class="mid_tit" data-aos="fade-down" data-aos-duration="1000">
|
||||
“ Cross Checking Between<br class="brk"><b class="gr_txt">BIM Model Data</b> & <b class="og_txt">Drawings</b> ”
|
||||
</span>
|
||||
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
|
||||
<div class="dia_elements_wrap">
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>Location Data</li>
|
||||
<li>Shape Data</li>
|
||||
<li>Property Information</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>Longitudinal Section</li>
|
||||
<li>General Drawing</li>
|
||||
<li>Detail Drawing</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dia_circles_wrap">
|
||||
<div class="circle_bim">
|
||||
<div class="circle_belt"></div>
|
||||
<div class="circle_core">
|
||||
<span>BIM Model</span>
|
||||
<i></i>
|
||||
</div>
|
||||
<div class="circle_dots move">
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="circle_floorplan">
|
||||
<div class="circle_belt"></div>
|
||||
<div class="circle_core">
|
||||
<span>Drawing</span>
|
||||
<i></i>
|
||||
</div>
|
||||
<div class="circle_dots move">
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="layout_fix_left process">
|
||||
<div class="left" data-aos="fade-right" data-aos-duration="1000">
|
||||
<div class="bg js__fixLeft_bg on"></div>
|
||||
<div class="bg js__fixLeft_bg"></div>
|
||||
<span class="mid_tit js__fixLeft_tit on">
|
||||
<font class="num">01. </font>Simultaneous<br> <em>Drawing & BIM View</em>
|
||||
</span>
|
||||
<span class="mid_tit js__fixLeft_tit">
|
||||
<font class="num">02. </font><em>Detailed<br> </em>BIM Model View</em>
|
||||
</span>
|
||||
</div>
|
||||
<div class="right js__fixLeft_secs">
|
||||
<span class="mid_tit m" style="display:none;">
|
||||
<font class="num">01. </font>Simultaneous Drawing & BIM View
|
||||
</span>
|
||||
<div id="content1" class="link">
|
||||
<span class="sub_tit">
|
||||
<img src="<?php echo eng_img_url('ico_forbim_link.svg'); ?>" alt="">
|
||||
Data Linkage Between Drawings and BIM Models
|
||||
</span>
|
||||
<div class="sub_text">
|
||||
With data linkage between drawings and BIM models, selected components are displayed in real time, enabling users to view both simultaneously and check their location, shape, and property information.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="fig01"><span>Drawings</span></div>
|
||||
<div class="fig02"><span>BIM Models</span></div>
|
||||
<div class="fig03"><span>Property Information</span></div>
|
||||
<div class="fig04"><span>Real-time display of selected components</span></div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="mid_tit m" style="display:none;">
|
||||
<font class="num">02. </font>Detailed BIM Model View
|
||||
</span>
|
||||
<div id="content2" class="info">
|
||||
<span class="sub_tit">
|
||||
<img src="<?php echo eng_img_url('ico_forbim_check.svg'); ?>" alt="">
|
||||
Check BIM Model Property Information and Geometry
|
||||
</span>
|
||||
<div class="sub_text">
|
||||
<span>
|
||||
Through the various visualization features of the 3D Viewer, users can closely examine the model’s geometry and the interference relationships between each component.
|
||||
</span>
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div><span>Displays component-specific property information, toggles layers On/Off, applies clipping and transparency, and adjusts scale</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time) => {
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
|
||||
if (intro) {
|
||||
intro.style.display = "none";
|
||||
}
|
||||
|
||||
if (mainMask) {
|
||||
mainMask.classList.add('skip');
|
||||
}
|
||||
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 폼메일 시작 { -->
|
||||
<div id="formmail" class="new_win">
|
||||
<h1 id="win_title"><?php echo $name ?>님께 메일보내기</h1>
|
||||
|
||||
<form name="fformmail" action="./formmail_send.php" onsubmit="return fformmail_submit(this);" method="post" enctype="multipart/form-data" style="margin:0px;">
|
||||
<input type="hidden" name="to" value="<?php echo $email ?>">
|
||||
<input type="hidden" name="attach" value="2">
|
||||
<?php if ($is_member) { // 회원이면 ?>
|
||||
<input type="hidden" name="fnick" value="<?php echo get_text($member['mb_nick']) ?>">
|
||||
<input type="hidden" name="fmail" value="<?php echo $member['mb_email'] ?>">
|
||||
<?php } ?>
|
||||
|
||||
<div class="form_01 new_win_con">
|
||||
<h2 class="sound_only">메일쓰기</h2>
|
||||
<ul>
|
||||
<?php if (!$is_member) { ?>
|
||||
<li>
|
||||
<label for="fnick" class="sound_only">이름<strong>필수</strong></label>
|
||||
<input type="text" name="fnick" id="fnick" required class="frm_input full_input required" placeholder="이름">
|
||||
</li>
|
||||
<li>
|
||||
<label for="fmail" class="sound_only">E-mail<strong>필수</strong></label>
|
||||
<input type="text" name="fmail" id="fmail" required class="frm_input full_input required" placeholder="E-mail">
|
||||
</li>
|
||||
<?php } ?>
|
||||
<li>
|
||||
<label for="subject" class="sound_only">제목<strong>필수</strong></label>
|
||||
<input type="text" name="subject" id="subject" required class="frm_input full_input required" placeholder="제목">
|
||||
</li>
|
||||
<li class="chk_box">
|
||||
<span class="sound_only">형식</span>
|
||||
<input type="radio" name="type" value="0" id="type_text" checked>
|
||||
<label for="type_text"><span></span>TEXT</label>
|
||||
|
||||
<input type="radio" name="type" value="1" id="type_html">
|
||||
<label for="type_html"><span></span>HTML</label>
|
||||
|
||||
<input type="radio" name="type" value="2" id="type_both">
|
||||
<label for="type_both"><span></span>TEXT+HTML</label>
|
||||
</li>
|
||||
<li>
|
||||
<label for="content" class="sound_only">내용<strong>필수</strong></label>
|
||||
<textarea name="content" id="content" required class="required"></textarea>
|
||||
</li>
|
||||
<li class="formmail_flie">
|
||||
<div class="file_wr">
|
||||
<label for="file1" class="lb_icon"><i class="fa fa-download" aria-hidden="true"></i><span class="sound_only"> 첨부 파일 1</span></label>
|
||||
<input type="file" name="file1" id="file1" class="frm_file full_input">
|
||||
</div>
|
||||
<div class="frm_info">첨부 파일은 누락될 수 있으므로 메일을 보낸 후 파일이 첨부 되었는지 반드시 확인해 주시기 바랍니다.</div>
|
||||
</li>
|
||||
<li class="formmail_flie">
|
||||
<div class="file_wr">
|
||||
<label for="file2" class="lb_icon"><i class="fa fa-download" aria-hidden="true"></i><span class="sound_only"> 첨부 파일 2</span></label>
|
||||
<input type="file" name="file2" id="file2" class="frm_file full_input">
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sound_only">자동등록방지</span>
|
||||
<?php echo captcha_html(); ?>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="win_btn">
|
||||
<button type="submit" id="btn_submit" class="btn_b02 reply_btn">메일발송</button>
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
with (document.fformmail) {
|
||||
if (typeof fname != "undefined")
|
||||
fname.focus();
|
||||
else if (typeof subject != "undefined")
|
||||
subject.focus();
|
||||
}
|
||||
|
||||
function fformmail_submit(f)
|
||||
{
|
||||
<?php echo chk_captcha_js(); ?>
|
||||
|
||||
if (f.file1.value || f.file2.value) {
|
||||
// 4.00.11
|
||||
if (!confirm("첨부파일의 용량이 큰경우 전송시간이 오래 걸립니다.\n\n메일보내기가 완료되기 전에 창을 닫거나 새로고침 하지 마십시오."))
|
||||
return false;
|
||||
}
|
||||
|
||||
document.getElementById('btn_submit').disabled = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
<!-- } 폼메일 끝 -->
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 54 B |
@@ -0,0 +1,515 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>인터페이스</title>
|
||||
<link rel="stylesheet" href="../css/reset.css"/>
|
||||
<link rel="stylesheet" href="../css/font.css"/>
|
||||
<link rel="stylesheet" href="../css/style.css"/>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/animation.gsap.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
|
||||
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/interface.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
|
||||
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- 컨텐츠 시작 -->
|
||||
<div class="container interface">
|
||||
<div class="mouse_mark js__mouse_mark" style="display:none"><span>SCROLL</span></div>
|
||||
<div class="mouse_mark js__mouse_mark02" style="display:none"><span>SCROLL</span></div>
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Interface</h2>
|
||||
<span>UX design refined through real user experience</span>
|
||||
</div>
|
||||
</section>
|
||||
<section class="route js__mouse_area">
|
||||
<div class="fix">
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj k"></i>
|
||||
<span>Easy & Simple</span>
|
||||
<p>Leave complex work environments behind and <b>enjoy a simple, intuitive interface.</b></p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<ul class="subs">
|
||||
<li class="on">
|
||||
<span class="sub_tit">Interface</span>
|
||||
<span class="mid_tit">Easy & Simple<br> <b>Interface</b></span>
|
||||
<span class="sub_text">
|
||||
Designed with user convenience as the top priority, EG-BIM replaces the complex and cluttered interface with <b>a clean, intuitive menu layout</b> that anyone can use with ease.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">Grouping</span>
|
||||
<span class="mid_tit"><b>Grouped by Function,</b><br> Refined in design</span>
|
||||
<span class="sub_text">
|
||||
The interface is <b>simplified and systemized by function</b>, allowing users to easily locate the tools they need through structured menus.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">Imaging</span>
|
||||
<span class="mid_tit"><b>Visualized</b><br> Information Delivery</span>
|
||||
<span class="sub_text">
|
||||
Object Property Information is displayed visually with images, making it easier for users to understand and improving clarity in information delivery.
|
||||
<ul>
|
||||
<li>Property windows by object type</li>
|
||||
<li>Displays basic, geometric, and positional data</li>
|
||||
<li>Improves readability and work efficiency</li>
|
||||
</ul>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="imgs">
|
||||
<li class="on">
|
||||
<span>File Menu</span>
|
||||
<span>Object Properties Display</span>
|
||||
<span>Workspace Settings</span>
|
||||
<span>Command Icons</span>
|
||||
<span>Spacious Workspace</span>
|
||||
<div class="img_box">
|
||||
<object data="<?php echo eng_img_url('interface_img_01.svg'); ?>"></object>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<span>Object Properties Menu</span>
|
||||
<span>Home Menu</span>
|
||||
<span>Workspace Icon Bar</span>
|
||||
<span>Command Icon Bar</span>
|
||||
<div class="img_box">
|
||||
<object data="<?php echo eng_img_url('interface_img_02.png'); ?>"></object>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<span>Object Property Window</span>
|
||||
<div class="img_box">
|
||||
<object data="<?php echo eng_img_url('interface_img_03.svg'); ?>"></object>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sec1"></div>
|
||||
<div id="sec2"></div>
|
||||
<div id="sec3"></div>
|
||||
</section>
|
||||
|
||||
<section class="dual full_screen" id="dualm">
|
||||
<div class="dual_top js__mouse_area02">
|
||||
<div class="sub_tit">
|
||||
Dual-Monitor Workspace <br>
|
||||
Experience a new workspace with <b>dual-monitor support.</b>
|
||||
</div>
|
||||
<div id="imagesequence" class="pin" style="text-align: center;">
|
||||
<!-- <img id="myimg" src="<?php echo eng_img_url('com_img/comp_1.png'); ?>"> KR sequence -->
|
||||
<img id="myimg" src="<?php echo eng_img_url('com_img/eng/comp_1.png'); ?>"><!-- 영문시퀀스 -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail">
|
||||
<div class="sub_tit">
|
||||
Simultaneous Work<br><b> through Linked Workspace</b>
|
||||
</div>
|
||||
<div class="subs">
|
||||
<div class="element">
|
||||
<div class="exam">
|
||||
<div class="exam_01">
|
||||
<span>Model Space</span>
|
||||
<img src="<?php echo eng_img_url('dual_img01_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="exam_02">
|
||||
<span>Layout Space</span>
|
||||
<img src="<?php echo eng_img_url('dual_img01_02.png'); ?>" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_text">
|
||||
<span>
|
||||
Work seamlessly between model and layout spaces <b>without switching back and forth, thanks to linked workspace functionality.</b>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="element">
|
||||
<div class="exam">
|
||||
<div class="exam_01">
|
||||
<span>Working Drawing</span>
|
||||
<img src="<?php echo eng_img_url('dual_img02_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="exam_02">
|
||||
<span>Reference Drawing</span>
|
||||
<img src="<?php echo eng_img_url('dual_img02_02.png'); ?>" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_text">
|
||||
<span>Separate the workspace for reference drawing <b>to prevent accidental changes, and work safely</b> in read-only mode.</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time)=>{
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
|
||||
// 페이지 로드 시에도 실행하여 초기 상태 확인
|
||||
if (window.innerWidth <= 1200) {
|
||||
const element = document.getElementById('dualm');
|
||||
if (element) {
|
||||
console.log('b')
|
||||
element.removeAttribute('id');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,513 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>인터페이스</title>
|
||||
<link rel="stylesheet" href="../css/reset.css"/>
|
||||
<link rel="stylesheet" href="../css/font.css"/>
|
||||
<link rel="stylesheet" href="../css/style.css"/>
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/2.1.3/TweenMax.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/ScrollMagic.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/animation.gsap.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.7/plugins/debug.addIndicators.min.js"></script>
|
||||
<!-- 듀얼모니터 시퀀스애니메이션 스크립트 -->
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/interface.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
|
||||
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- 컨텐츠 시작 -->
|
||||
<div class="container interface">
|
||||
<div class="mouse_mark js__mouse_mark" style="display:none"><span>SCROLL</span></div>
|
||||
<div class="mouse_mark js__mouse_mark02" style="display:none"><span>SCROLL</span></div>
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Interface</h2>
|
||||
<span>UX design refined through real user experience</span>
|
||||
</div>
|
||||
</section>
|
||||
<section class="route js__mouse_area">
|
||||
<div class="fix">
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj k"></i>
|
||||
<span>Easy & Simple</span>
|
||||
<p>Leave complex work environments behind and <b>enjoy a simple, intuitive interface.</b></p>
|
||||
</div>
|
||||
<div class="content">
|
||||
<ul class="subs">
|
||||
<li class="on">
|
||||
<span class="sub_tit">Interface</span>
|
||||
<span class="mid_tit">Easy & Simple<br> <b>Interface</b></span>
|
||||
<span class="sub_text">
|
||||
Designed with user convenience as the top priority, EG-BIM replaces the complex and cluttered interface with <b>a clean, intuitive menu layout</b> that anyone can use with ease.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">Grouping</span>
|
||||
<span class="mid_tit"><b>Grouped by Function,</b><br> Refined in design</span>
|
||||
<span class="sub_text">
|
||||
The interface is <b>simplified and systemized by function</b>, allowing users to easily locate the tools they need through structured menus.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">Imaging</span>
|
||||
<span class="mid_tit"><b>Visualized</b><br> Information Delivery</span>
|
||||
<span class="sub_text">
|
||||
Object Property Information is displayed visually with images, making it easier for users to understand and improving clarity in information delivery.
|
||||
<ul>
|
||||
<li>Property windows by object type</li>
|
||||
<li>Displays basic, geometric, and positional data</li>
|
||||
<li>Improves readability and work efficiency</li>
|
||||
</ul>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="imgs">
|
||||
<li class="on">
|
||||
<span>File Menu</span>
|
||||
<span>Object Properties Display</span>
|
||||
<span>Workspace Settings</span>
|
||||
<span>Command Icons</span>
|
||||
<span>Spacious Workspace</span>
|
||||
<div class="img_box">
|
||||
<object data="../img/interface_img_01.svg"></object>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<span>Object Properties Menu</span>
|
||||
<span>Home Menu</span>
|
||||
<span>Workspace Icon Bar</span>
|
||||
<span>Command Icon Bar</span>
|
||||
<div class="img_box">
|
||||
<object data="../img/interface_img_02.png"></object>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<span>Object Property Window</span>
|
||||
<div class="img_box">
|
||||
<object data="../img/interface_img_03.svg"></object>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sec1"></div>
|
||||
<div id="sec2"></div>
|
||||
<div id="sec3"></div>
|
||||
</section>
|
||||
|
||||
<section class="dual" id="dualm">
|
||||
<div class="dual_top js__mouse_area02">
|
||||
<div class="sub_tit">
|
||||
Dual-Monitor Workspace <br>
|
||||
Experience a new workspace with <b>dual-monitor support.</b>
|
||||
</div>
|
||||
<div id="imagesequence" class="pin" style="text-align: center;">
|
||||
<img id="myimg" src="../img/com_img/comp_1.png">
|
||||
</div>
|
||||
</div>
|
||||
<div class="detail">
|
||||
<div class="sub_tit">
|
||||
Simultaneous Work<br><b> through Linked Workspace</b>
|
||||
</div>
|
||||
<div class="subs">
|
||||
<div class="element">
|
||||
<div class="exam">
|
||||
<div class="exam_01">
|
||||
<span>Model Space</span>
|
||||
<img src="../img/dual_img01_01.png" alt="">
|
||||
</div>
|
||||
<div class="exam_02">
|
||||
<span>Layout Space</span>
|
||||
<img src="../img/dual_img01_02.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_text">
|
||||
<span>
|
||||
Work seamlessly between model and layout spaces <b>without switching back and forth, thanks to linked workspace functionality.</b>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="element">
|
||||
<div class="exam">
|
||||
<div class="exam_01">
|
||||
<span>Working Drawing</span>
|
||||
<img src="../img/dual_img02_01.png" alt="">
|
||||
</div>
|
||||
<div class="exam_02">
|
||||
<span>Reference Drawing</span>
|
||||
<img src="../img/dual_img02_02.png" alt="">
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_text">
|
||||
<span>Separate the workspace for reference drawing <b>to prevent accidental changes, and work safely</b> in read-only mode.</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time)=>{
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
|
||||
// 페이지 로드 시에도 실행하여 초기 상태 확인
|
||||
if (window.innerWidth <= 1200) {
|
||||
const element = document.getElementById('dualm');
|
||||
if (element) {
|
||||
console.log('b')
|
||||
element.removeAttribute('id');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,166 @@
|
||||
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery-3.6.1.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="<?php echo G5_URL ?>/js/jquery.mousewheel.min.js"></script>
|
||||
<script type="text/javascript" src="<?php echo G5_URL ?>/js/common.js"></script>
|
||||
<script type="text/javascript" src="<?php echo G5_URL ?>/js/include.js"></script>
|
||||
<script type="text/javascript" src="<?php echo G5_URL ?>/js/popup.js?v=20260723"></script>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css">
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_login" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt="sdi"></div>
|
||||
</button>
|
||||
<!--popup_container-->
|
||||
<div class="popup_container login">
|
||||
<!--popup_tit-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1">Login</h1>
|
||||
<h3 class="h_3">
|
||||
Log in to access <br><br class="brk"><strong>1:1 purchase inquiries and <br>product support services.</strong>
|
||||
</h3>
|
||||
</div>
|
||||
<!--//popup_tit-->
|
||||
<!-- popup_contents_wrap -->
|
||||
<div class="popup_contents_wrap">
|
||||
<form id="flogin" name="flogin" action="<?php //echo $login_action_url?>" onsubmit="return flogin_submit(this);" method="post">
|
||||
<input type="hidden" name="url" value="<?php //echo $login_url?>">
|
||||
<div class="input_wrap id">
|
||||
<i class="id"></i><input type="text" name="mb_id" id="login_id" required class="id " placeholder="ID">
|
||||
</div>
|
||||
<div class="input_wrap pw" style="position: relative;">
|
||||
<i class="pw"></i><input type="password" name="mb_password" id="login_pw" required class="pw " size="20" maxLength="20" placeholder="Password" onkeyup="ufn_loginpw_onkeyup(this);">
|
||||
<!-- 👁 Font Awesome 아이콘 -->
|
||||
<i id="toggle_pw"
|
||||
class="fa-solid fa-eye"
|
||||
style="position:absolute; right:10px; top:50%;
|
||||
transform:translateY(-50%);
|
||||
cursor:pointer; color:#888;"></i>
|
||||
<!-- ✅ CapsLock 경고 (커서 오른쪽 표시용) -->
|
||||
<div id="capslock_hint"
|
||||
style="display:none;
|
||||
position:absolute;
|
||||
left:0;
|
||||
bottom:-20px;
|
||||
font-size:13px;
|
||||
color:#f87171;
|
||||
pointer-events:none;
|
||||
animation:fadein 0.15s ease;">
|
||||
⚠️ Caps Lock is on.
|
||||
</div>
|
||||
</div>
|
||||
<style>
|
||||
@keyframes fadein { from { opacity:0; } to { opacity:1; } }
|
||||
</style>
|
||||
<div class="join_btn_wrap">
|
||||
<button type="submit" id="btn_login">Login</button>
|
||||
</div>
|
||||
<div class="btn_go">
|
||||
<div class="go_signup"><a href="javascript:agreement();"><span>Sign up</span><i class="arrow_r"></i></a></div>
|
||||
<div class="go_find"><a href="javascript:search();"><span>Reset Password</span><i class="arrow_r"></i></a></div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!-- //popup_contents_wrap -->
|
||||
</div>
|
||||
<!--//popup_container-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
|
||||
|
||||
<script>
|
||||
function ufn_loginpw_onkeyup(l_pw){
|
||||
var loginButton = document.getElementById('btn_login');
|
||||
if (!loginButton) {
|
||||
return;
|
||||
}
|
||||
|
||||
loginButton.disabled = !(l_pw && l_pw.value.length > 0);
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
// (function () {
|
||||
// // 1) 공지 팝업 DOM이 없으면 생성
|
||||
// if (!document.getElementById('egbimNotice')) {
|
||||
// $('body').append(`
|
||||
// <div class="notice-backdrop" style="display:none;position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:9998;"></div>
|
||||
// <div class="notice-box" id="egbimNotice" style="display:none;position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);z-index:9999;background:#103a2f;color:#fff;border-radius:14px;max-width:520px;width:92%;box-shadow:0 10px 30px rgba(0,0,0,.35);padding:28px;">
|
||||
// <button class="notice-close" aria-label="닫기" style="position:absolute;right:10px;top:8px;border:none;background:transparent;color:#fff;font-size:24px;cursor:pointer;">×</button>
|
||||
// <h3 style="margin:0 0 10px;font-size:20px;font-weight:700;">공지사항</h3>
|
||||
// <p style="line-height:1.6;margin:0 0 18px;">
|
||||
// EG-BIM 프로그램 사용자 인증 신규 시스템 도입으로 인해<br>
|
||||
// 기존 회원분들께서는 <strong>재가입</strong> 해주시기 바랍니다.
|
||||
// </p>
|
||||
// <div class="notice-actions" style="display:flex;gap:8px;justify-content:flex-end;">
|
||||
// <button class="btn-ok" style="padding:10px 16px;border:none;border-radius:10px;background:#ffb02e;color:#111;cursor:pointer;font-weight:700;">확인</button>
|
||||
// </div>
|
||||
// </div>
|
||||
// `);
|
||||
// }
|
||||
|
||||
// // 팝업 열기/닫기
|
||||
// function openNotice(onConfirm) {
|
||||
// $('.notice-backdrop, #egbimNotice').fadeIn(120);
|
||||
// const close = () => {
|
||||
// $('#egbimNotice .btn-ok, #egbimNotice .notice-close').off('click');
|
||||
// $('.notice-backdrop, #egbimNotice').fadeOut(120);
|
||||
// };
|
||||
// $('#egbimNotice .notice-close').on('click', close);
|
||||
// $('#egbimNotice .btn-ok').on('click', function () {
|
||||
// close();
|
||||
// if (typeof onConfirm === 'function') onConfirm();
|
||||
// });
|
||||
// }
|
||||
|
||||
// // 2) 로그인 버튼 클릭 → 공지 팝업 먼저 띄우고, 확인 시 로그인 실행
|
||||
// $('#btn_login').off('click.notice').on('click.notice', function (e) {
|
||||
// e.preventDefault();
|
||||
// openNotice(doLoginAjax);
|
||||
// });
|
||||
// })();
|
||||
//
|
||||
</script>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
// form submit (Enter 눌러도 실행됨)
|
||||
$('#flogin').on('submit', function(e) {
|
||||
e.preventDefault(); // 기본 제출 막기
|
||||
$('#btn_login').click(); // 버튼 클릭 이벤트 재사용
|
||||
});
|
||||
});
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const pwInput = document.getElementById("login_pw");
|
||||
const toggle = document.getElementById("toggle_pw");
|
||||
const hint = document.getElementById("capslock_hint");
|
||||
|
||||
// 👁 토글 기능
|
||||
toggle.addEventListener("click", () => {
|
||||
const isHidden = pwInput.type === "password";
|
||||
pwInput.type = isHidden ? "text" : "password";
|
||||
toggle.classList.toggle("fa-eye");
|
||||
toggle.classList.toggle("fa-eye-slash");
|
||||
});
|
||||
|
||||
// ⚠ CapsLock 감지
|
||||
pwInput.addEventListener("keydown", e => {
|
||||
const caps = e.getModifierState && e.getModifierState("CapsLock");
|
||||
hint.style.display = caps ? "block" : "none";
|
||||
});
|
||||
pwInput.addEventListener("keyup", e => {
|
||||
const caps = e.getModifierState && e.getModifierState("CapsLock");
|
||||
hint.style.display = caps ? "block" : "none";
|
||||
});
|
||||
pwInput.addEventListener("blur", () => hint.style.display = "none");
|
||||
|
||||
// 🚫 한글 차단
|
||||
pwInput.addEventListener("input", function() {
|
||||
this.value = this.value.replace(/[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/g, '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,4 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// 자신만의 코드를 넣어주세요.
|
||||
@@ -0,0 +1,694 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
include_once __DIR__ . '/asset_urls.php';
|
||||
?>
|
||||
<head>
|
||||
<!-- Google Tag Manager -->
|
||||
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
||||
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
||||
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
||||
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
||||
})(window,document,'script','dataLayer','GTM-5GX3FS9R');
|
||||
</script>
|
||||
<!-- End Google Tag Manager -->
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-7J3S6MHW3Y"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-7J3S6MHW3Y');
|
||||
</script>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<meta name="description" content="디지털전환시대 EG-BIM, 도면과 3차원 정보모델을 하나의 S/W로" />
|
||||
<meta name="keywords" content="EG-BIM, 이지빔, egbim, eg bim, CAD, 대안CAD, 도면, BIM, 삼안, 한맥, 바론컨설턴트" />
|
||||
|
||||
<!-- Open Graph: 카카오톡 미리보기용 -->
|
||||
<meta property="og:title" content="EG-BIM" />
|
||||
<meta property="og:description" content="디지털전환시대 EG-BIM, 도면과 3차원 정보모델을 하나의 S/W로" />
|
||||
<meta property="og:image" content="<?php echo eng_img_url('og-main-thumb.JPG'); ?>" />
|
||||
<meta property="og:url" content="/eng/" />
|
||||
<meta property="og:type" content="website" />
|
||||
|
||||
<title>EG-BIM</title>
|
||||
<link rel="stylesheet" href="/eng/css/reset.css" />
|
||||
<link rel="stylesheet" href="/eng/css/font.css" />
|
||||
<link rel="stylesheet" href="/eng/css/style.css" />
|
||||
<link rel="stylesheet" href="/eng/theme/basic/skin/qa/basic/style.css?ver=2303229">
|
||||
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="/eng/js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="/eng/js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
<script type="text/javascript" src="/eng/js/common.js"></script>
|
||||
<script type="text/javascript" src="/eng/js/popup.js"></script>
|
||||
<script>
|
||||
window.EGBIM_IMG_BASE_URL = <?php echo json_encode(eng_img_url()); ?>;
|
||||
</script>
|
||||
<script type="text/javascript" src="/eng/js/index.js"></script>
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Google Tag Manager (noscript) -->
|
||||
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5GX3FS9R"
|
||||
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
||||
<!-- End Google Tag Manager (noscript) -->
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="main_mask">
|
||||
<!-- Header -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
|
||||
|
||||
<?php
|
||||
// 오늘 날짜 (Y-m-d 형식)
|
||||
$main_today = date('Y-m-d');
|
||||
|
||||
// 시작일과 종료일
|
||||
$main_startDate = '2025-10-25';
|
||||
$main_endDate = '2026-01-31';
|
||||
// 기간 내에 있으면 배너 표시
|
||||
if ($main_today >= $main_startDate && $main_today <= $main_endDate) {
|
||||
// 쿠키 확인
|
||||
$popup_hidden = isset($_COOKIE['hide_popup']) ? $_COOKIE['hide_popup'] : '';
|
||||
if ($popup_hidden !== date('Y-m-d'))
|
||||
include_once($member_skin_path.'/main_popup.skin.php');
|
||||
}
|
||||
?>
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<!-- main -->
|
||||
<div class="main">
|
||||
<ul class="pagination_main">
|
||||
<li><div class="page_01 page_on">Value of EG-BIM</div><span>01</span></li>
|
||||
<li><div class="page_02">Interface</div><span>02</span></li>
|
||||
<li><div class="page_03">Key Features</div><span>03</span></li>
|
||||
<li><div class="page_04">Drawing Management</div><span>04</span></li>
|
||||
<li><div class="page_05">for BIM</div><span>05</span></li>
|
||||
</ul>
|
||||
<div class="main_link">
|
||||
<a href="#01" class="main_link_01 link_on" onclick="location.href='<?php echo G5_BBS_URL ?>/value.php'"></a>
|
||||
<a href="#02" class="main_link_02" onclick="location.href='<?php echo G5_BBS_URL ?>/interface.php'"></a>
|
||||
<a href="#03" class="main_link_03" onclick="location.href='<?php echo G5_BBS_URL ?>/primary.php'"></a>
|
||||
<a href="#04" class="main_link_04" onclick="location.href='<?php echo G5_BBS_URL ?>/floorplan.php'"></a>
|
||||
<a href="#05" class="main_link_05" onclick="location.href='<?php echo G5_BBS_URL ?>/forbim.php'"></a>
|
||||
</div>
|
||||
<div class="bg_video">
|
||||
<video id="video_play" muted playsinline>
|
||||
<source src="<?php echo eng_img_url('main_1.mp4'); ?>" type="video/mp4" class="main_video_01">
|
||||
</video>
|
||||
</div>
|
||||
<!-- <button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button> -->
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
</div>
|
||||
<div class="intro_wrap">
|
||||
<div class="intro_mask"></div>
|
||||
<div class="intro_txt">
|
||||
<div class="txt_mask"><span><b>Digital Transformation Era</b></span></div>
|
||||
<div class="txt_mask"><span><font class="egbim k">EG-BIM_software</font></span></div>
|
||||
<div class="txt_mask"><span><em>Drawings</em> & <em>3D Information Models</em> <br class="brk">in One Software</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time)=>{
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var adminList = [
|
||||
'b24014@hanmaceng.co.kr',
|
||||
'kjy0426@hanmaceng.co.kr',
|
||||
'b23065@hanmaceng.co.kr',
|
||||
'b23008@baroncs.co.kr',
|
||||
'cjy627@hanmaceng.co.kr',
|
||||
'b23072@hanmaceng.co.kr'
|
||||
];
|
||||
|
||||
var loginId = sessionStorage.getItem('loginId') || '';
|
||||
var normalizedLoginId = loginId.toLowerCase();
|
||||
var isAdmin = adminList.includes(normalizedLoginId);
|
||||
|
||||
if ($('#hid_mb_id').length) {
|
||||
$('#hid_mb_id').val(isLoggedIn ? loginId : '');
|
||||
}
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='https://eg-bim.co.kr/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
window.dispatchEvent(new CustomEvent('descope-auth-changed', {
|
||||
detail: { loginId: '' }
|
||||
}));
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
window.dispatchEvent(new CustomEvent('descope-auth-changed', {
|
||||
detail: {
|
||||
loginId: res.user?.loginIds?.[0] || '',
|
||||
user: res.user || null
|
||||
}
|
||||
}));
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
// 회원가입 약관동의 (중복 바인딩 방지용 네임스페이스 사용)
|
||||
// $('#fregister button[type=submit]').off('click.agree').on('click.agree', function (e) {
|
||||
// e.preventDefault();
|
||||
|
||||
// // ① 체크 여부는 is(':checked') 로 판단
|
||||
// var agree1 = $('#agree11').is(':checked');
|
||||
// var agree2 = $('#agree21').is(':checked');
|
||||
|
||||
// if (!(agree1 && agree2)) {
|
||||
// alert('약관에 모두 동의해주세요.');
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// // ② 둘 다 체크되어 있으면 서버로 넘길 값 만들기
|
||||
// // (PHP register_form.php에서 $_POST['agree'], $_POST['agree2']로 받게)
|
||||
// $.ajax({
|
||||
// url: '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type: 'POST',
|
||||
// dataType: 'html', // or 'json' (서버 응답 형식에 맞게)
|
||||
// // contentType/processData 기본값 유지 ← JSON 전송 아니면 이게 맞습니다.
|
||||
// data: {
|
||||
// agree: 1,
|
||||
// agree2: 1
|
||||
// },
|
||||
// success: function (data) {
|
||||
// // 통과 시 다음 화면으로 전환
|
||||
// $('#pop_agreement').hide();
|
||||
// $('#pop_register_form').show(); // 실제 다음 팝업 ID에 맞춰 수정
|
||||
// $('body').css('overflow', 'hidden');
|
||||
// },
|
||||
// error: function (xhr) {
|
||||
// alert('처리 중 오류가 발생했습니다.\n다시 시도해주세요.');
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
// $(document).ready(function() {
|
||||
|
||||
// // 기존에 바인딩된 거 있으면 제거 (중복 방지)
|
||||
// $('#fregister button[type=submit], #btn_agree').off('click.agree');
|
||||
|
||||
// $('#fregister button[type=submit], #btn_agree').on('click.agree', function(e){
|
||||
// e.preventDefault();
|
||||
// e.stopPropagation();
|
||||
// e.stopImmediatePropagation();
|
||||
|
||||
// // 체크 여부는 반드시 :checked 로 확인해야 함
|
||||
// var a1 = $('#agree11').is(':checked');
|
||||
// var a2 = $('#agree21').is(':checked');
|
||||
|
||||
// if (!(a1 && a2)) {
|
||||
// alert('약관에 모두 동의해주세요.');
|
||||
// return false; // 진행 막기
|
||||
// }
|
||||
|
||||
// // === 여기부터는 통과 시 동작(필요 없으면 주석 처리 가능) ===
|
||||
// // AJAX 그대로 유지하되, 실제 동작하려면 서버가 받는 파라미터명에 맞추세요.
|
||||
// // 서버 기본 로직은 보통 'agree', 'agree2'를 받습니다.
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : 'POST',
|
||||
// dataType : 'json',
|
||||
// // contentType 은 JSON 전송할 때만 쓰세요. 지금은 기본 폼 인코딩으로 보냅니다.
|
||||
// // contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree' : a1 ? 1 : 0, // 서버가 'agree' 로 받는 경우
|
||||
// 'agree2' : a2 ? 1 : 0
|
||||
// },
|
||||
// success : function(data){
|
||||
// // 필요 시 다음 단계 이동
|
||||
// // $('#pop_agreement').hide();
|
||||
// // $('#pop_register_form').show();
|
||||
// // $('body').css('overflow','hidden');
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert('오류가 발생했습니다. 잠시 후 다시 시도해주세요.');
|
||||
// console.error(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
// });
|
||||
|
||||
|
||||
|
||||
|
||||
//이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
//251013 위치 이동
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
//251013 위치 이동 END
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
|
||||
//로그인 팝업창 쿼리스트링
|
||||
document.addEventListener("DOMContentLoaded", function(){
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
if (urlParams.get("popup") === "login") {
|
||||
const $popup = $("#pop_login");
|
||||
if ($popup.length) {
|
||||
$popup.show();
|
||||
|
||||
// ✅ 배너가 없으면 붙이기
|
||||
if (!$("#login_notice_banner").length) {
|
||||
const bannerHtml = `
|
||||
<div id="login_notice_banner" class="login-notice-banner" style="
|
||||
background:#0f3a2f;color:#fff;border-radius:12px;padding:14px 44px 14px 14px;
|
||||
position:relative;margin:0 0 12px 0;line-height:1.6;word-break:keep-all;">
|
||||
<button type="button" class="lnb-close" aria-label="닫기" style="
|
||||
position:absolute;right:10px;top:8px;background:transparent;border:0;
|
||||
color:#fff;font-size:20px;cursor:pointer;">×</button>
|
||||
<strong style="display:block;margin-bottom:6px;">[로그인 시스템 변경 안내]</strong>
|
||||
<p class="left" style="margin:0 0 6px;">
|
||||
더 나은 보안을 위해 2025년 8월 8일부터
|
||||
로그인 시스템이 변경되었습니다.
|
||||
기존 회원 또한 신규 시스템에 맞춰<br>
|
||||
재가입을 진행해주시기 바랍니다.
|
||||
</p>
|
||||
<p style="margin:0;">※ 로그인 및 가입 관련 문의: <strong>02-2141-7434</strong></p>
|
||||
</div>
|
||||
`;
|
||||
$("#pop_login .popup_contents_wrap").prepend(bannerHtml);
|
||||
|
||||
// 닫기 버튼 동작
|
||||
$("#login_notice_banner .lnb-close").on("click", function(){
|
||||
$("#login_notice_banner").fadeOut(120);
|
||||
});
|
||||
} else {
|
||||
$("#login_notice_banner").show();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
// //공지사항 팝업 스크립트
|
||||
// (function(){
|
||||
// const KEY = 'egbim_notice_2025-08-07'; // 키 바꾸면 전체 사용자에게 다시 노출
|
||||
// const dim = document.getElementById('egbimNoticeDim');
|
||||
// const box = document.getElementById('egbimNoticeBox');
|
||||
// const btnX = document.getElementById('egbimNoticeClose');
|
||||
// const btnOk = document.getElementById('egbimNoticeOk');
|
||||
// const btnToday = document.getElementById('egbimNoticeToday');
|
||||
|
||||
// function todayStr(){
|
||||
// const d = new Date(); return d.toISOString().slice(0,10);
|
||||
// }
|
||||
// function shouldShow(){
|
||||
// const v = localStorage.getItem(KEY);
|
||||
// // 항상 띄우고 싶으면 다음 줄을 `return true;` 로 바꾸세요.
|
||||
// return v !== todayStr();
|
||||
// }
|
||||
// function openNotice(){
|
||||
// dim.style.display = 'block';
|
||||
// box.style.display = 'block';
|
||||
// document.body.style.overflow = 'hidden';
|
||||
// if (typeof lenis !== 'undefined') try{ lenis.stop(); }catch(_){}
|
||||
// }
|
||||
// function closeNotice(storeToday){
|
||||
// if (storeToday) localStorage.setItem(KEY, todayStr());
|
||||
// dim.style.display = 'none';
|
||||
// box.style.display = 'none';
|
||||
// document.body.style.overflow = '';
|
||||
// if (typeof lenis !== 'undefined') try{ lenis.start(); }catch(_){}
|
||||
// }
|
||||
|
||||
// btnOk.addEventListener('click', () => closeNotice(true)); // 확인 누르면 오늘은 다시 안봄
|
||||
// btnToday.addEventListener('click', () => closeNotice(true)); // 오늘 하루 보지 않기
|
||||
// btnX.addEventListener('click', () => closeNotice(true));
|
||||
// dim.addEventListener('click', () => closeNotice(true));
|
||||
|
||||
// document.addEventListener('DOMContentLoaded', () => {
|
||||
// if (shouldShow()) openNotice();
|
||||
// });
|
||||
// })();
|
||||
|
||||
|
||||
/* 메인 마우스 클릭 문구 */
|
||||
if (window.location.pathname === '/eng/index.php' || window.location.pathname === '/eng/' || window.location.pathname === '/eng') {
|
||||
|
||||
// 커서 따라다니는 텍스트 요소 생성
|
||||
const cursorText = document.createElement('div');
|
||||
cursorText.className = 'cursor-text';
|
||||
cursorText.textContent = 'Click!';
|
||||
cursorText.style.cssText = `
|
||||
position: fixed;
|
||||
pointer-events: none;
|
||||
z-index: 9999;
|
||||
font-size: 20px;
|
||||
color: #fff;
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
transform: translate(-0%, -50%);
|
||||
transition: opacity 0.3s;
|
||||
`;
|
||||
document.body.appendChild(cursorText);
|
||||
|
||||
// 마우스 움직임 추적
|
||||
document.addEventListener('mousemove', (e) => {
|
||||
// 마우스 위치의 요소 확인
|
||||
const elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);
|
||||
|
||||
// footer 또는 .popup_wrap 영역인지 확인
|
||||
const isInFooter = elementUnderMouse?.closest('footer');
|
||||
const isInPopup = elementUnderMouse?.closest('.popup_wrap');
|
||||
const isInFloating = elementUnderMouse?.closest('.floating_menu');
|
||||
const isInPagination = elementUnderMouse?.closest('.pagination_main');
|
||||
const isInHeader = elementUnderMouse?.closest('.js__header');
|
||||
const isInSitemap = elementUnderMouse?.closest('.popup_sitemap');
|
||||
|
||||
|
||||
// footer나 popup 영역이면 숨김
|
||||
if (isInFooter || isInPopup || isInFloating || isInPagination || isInHeader || isInSitemap) {
|
||||
cursorText.style.opacity = '0';
|
||||
} else {
|
||||
cursorText.style.opacity = '1';
|
||||
// 커서 오른쪽 아래에 위치
|
||||
cursorText.style.left = (e.clientX + 15) + 'px';
|
||||
cursorText.style.top = (e.clientY + 15) + 'px';
|
||||
}
|
||||
});
|
||||
|
||||
// 마우스가 페이지를 벗어나면 숨김
|
||||
document.addEventListener('mouseleave', () => {
|
||||
cursorText.style.opacity = '0';
|
||||
});
|
||||
|
||||
document.addEventListener('mouseenter', () => {
|
||||
cursorText.style.opacity = '1';
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
|
||||
<button class="btn_top js__top" onclick="window.scrollTo(0,0);"><div class="arrow"></div></button>
|
||||
|
||||
<footer class="footer_off">
|
||||
<div class="footer_close"></div>
|
||||
<div class="footer_wrap">
|
||||
<div class="comp_info">
|
||||
<img class="logo_baron" src="<?php echo eng_img_url('baron_logo_eng.svg'); ?>" alt="">
|
||||
<span class="ceo">CEO <em>Jang Jong Chan</em></span>
|
||||
</div>
|
||||
<div class="comp_inner">
|
||||
<span class="btn_privacy"><a href="javascript:privacy('privacy');"><em>Privacy Policy</em></a><a href="javascript:privacy('agreement');">Terms of Service</a></span>
|
||||
<div class="comp_contact">
|
||||
<ul class="footer_menu">
|
||||
<li><a href="<?php echo G5_BBS_URL ?>/value.php">Value of EG-BIM</a></li>
|
||||
<li><a href="<?php echo G5_BBS_URL ?>/interface.php">Interface</a></li>
|
||||
<li><a href="<?php echo G5_BBS_URL ?>/primary.php">Key Features</a></li>
|
||||
<li><a href="<?php echo G5_BBS_URL ?>/floorplan.php">Drawing Management</a></li>
|
||||
<li><a href="<?php echo G5_BBS_URL ?>/forbim.php">for BIM</a></li>
|
||||
</ul>
|
||||
<div class="footer_sitemap">
|
||||
<!-- <span>TOVA의 <em>다양한 소식</em>을 만나보세요</span>
|
||||
<div class="tova_sns">
|
||||
<a href="https://cafe.naver.com/imtas" class="tova_cafe"><img src="<?php echo G5_URL ?>/img/ico_cafe.svg" alt=""></a>
|
||||
<a href="" class="tova_facebook"><img src="<?php echo G5_URL ?>/img/ico_facebook.svg" alt=""></a>
|
||||
</div>-->
|
||||
<div class="family_wrap">
|
||||
<div class="family_btn"><span>Family Site</span><i></i></div>
|
||||
<ul class="family_list">
|
||||
<li><a href="http://k-tova.com/eng/" target="_blank">TOVA</a></li>
|
||||
<li><a href="http://k-gaia.co.kr/eng/" target="_blank">GAIA</a></li>
|
||||
<!--li>바론컨설턴트(준비중)</li-->
|
||||
<!-- <li><a href="http://baroncs.co.kr" target="_blank">바론컨설턴트</a></li> -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="address">554, Ogeum-ro, Songpa-gu, Seoul, Republic of Korea<br class="brk"> <em class="tel">Tel : +82-2-2141-7434</em></span>
|
||||
<span class="copyright">© BARON Consultants Co,.Ltd All Rights Reserved.</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
<?php
|
||||
include_once __DIR__ . '/asset_urls.php';
|
||||
// include_once $_SERVER['DOCUMENT_ROOT']."/egbim/skin/member/basic/descope_session.php";
|
||||
// 디버깅용 출력
|
||||
echo "<!-- isAdmin = " . (isset($isAdmin) ? ($isAdmin ? "true" : "false") : "unset") . " -->";
|
||||
|
||||
// ✅ DB 연결
|
||||
$pdo = new PDO("mysql:host=db;dbname=egbim;charset=utf8mb4", "egbim", "baron3840!!", [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
]);
|
||||
|
||||
// ✅ EG-BIM (product_code=8) 기준 최신 external_version 가져오기
|
||||
$stmt = $pdo->prepare("
|
||||
SELECT external_version
|
||||
FROM deploy_versions
|
||||
WHERE product_code = 1
|
||||
ORDER BY updated_at DESC
|
||||
LIMIT 1
|
||||
");
|
||||
$stmt->execute();
|
||||
$version = $stmt->fetchColumn() ?: '1.0.0'; // fallback
|
||||
|
||||
// ✅ 다운로드 URL 자동 생성
|
||||
$download_url = "https://release-download.hmac.kr/eg-bim/{$version}/setup_eg-bim_{$version}.exe";
|
||||
?>
|
||||
<header class="js__header">
|
||||
<h1><a href="/eng/index.php"></a></h1>
|
||||
|
||||
<!-- ✅ 사용자 관리 아이콘 (관리자 전용, 기본 숨김) -->
|
||||
<div id="userListBtnWrap" class="menu_userlist" style="display:none;">
|
||||
<a href="/eng/skin/member/basic/descope_user_list_skin_w3.php">
|
||||
<img src="<?php echo eng_img_url('ico_userlist.svg'); ?>" alt="사용자 관리">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="language">
|
||||
<a href="/egbim/">KR</a>
|
||||
<a href="#" class="on">EN</a>
|
||||
</div>
|
||||
|
||||
<!-- ✅ 업로드 아이콘 (관리자 전용, 기본 숨김) -->
|
||||
<div id="uploadBtnWrap" class="menu_upload" style="display:none;">
|
||||
<a href="/eng/sw_upload/upload_page.php">
|
||||
<img src="<?php echo eng_img_url('ico_upload.svg'); ?>" alt="업로드">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="menu_my">
|
||||
<img src="<?php echo eng_img_url('ico_my.svg'); ?>" alt="">
|
||||
<ul class="menu_my_list" style="display: none;">
|
||||
<li id="my_join2" class="my_join2">
|
||||
<!-- JS에서 "마이페이지" or "관리페이지" 링크를 넣어줌 -->
|
||||
</li>
|
||||
<li id="my_login2" class="my_login2">
|
||||
<a href="javascript:descopeLogout();">Logout</a>
|
||||
</li>
|
||||
<li id="my_join" class="my_join">
|
||||
<a href="javascript:agreement();">Sign up</a>
|
||||
</li>
|
||||
<li id="my_login" class="my_login">
|
||||
<a href="javascript:login();">Login</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="menu_ham"><a href="javascript:sitemap();"><div></div><div></div><div></div></a></div>
|
||||
</header>
|
||||
<!-- floating_menu -->
|
||||
<div class="floating_menu">
|
||||
<ul>
|
||||
<li class="floating_faq"><a href="/eng/bbs/descope_qa_list.php">
|
||||
<i></i>
|
||||
<span>Q&A</span>
|
||||
</a></li>
|
||||
<li class="floating_guide"><a href="https://baron-consultant.github.io/eg-bim_guide\help" target="_blank">
|
||||
<i></i>
|
||||
<span>Guide</span>
|
||||
</a></li>
|
||||
<li class="floating_download">
|
||||
<a href="<?= htmlspecialchars($download_url) ?>">
|
||||
<i></i>
|
||||
<span>Download</span>
|
||||
</a></li>
|
||||
<li class="floating_buy"><a href="/eng/bbs/buy.php">
|
||||
<i></i>
|
||||
<span>Contact</span>
|
||||
</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!-- //floating_menu -->
|
||||
|
||||
<script>
|
||||
// 다운로드 버튼 안내
|
||||
// $(document).on('click', '.floating_download a', function (e) {
|
||||
// e.preventDefault(); // 링크 이동 막기
|
||||
// alert('다운로드 기능은 준비중입니다.');
|
||||
// });
|
||||
</script>
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
const ADMIN_ICON_IDS = [
|
||||
'b24014@hanmaceng.co.kr',
|
||||
'kjy0426@hanmaceng.co.kr',
|
||||
'b23065@hanmaceng.co.kr',
|
||||
'shyeom1@samaneng.com',
|
||||
'cjy627@hanmaceng.co.kr',
|
||||
'b23072@hanmaceng.co.kr',
|
||||
'b23018@hanmaceng.co.kr',
|
||||
'm20331@hanmaceng.co.kr',
|
||||
'cozyjin@hanmaceng.co.kr',
|
||||
'm24031@hanmaceng.co.kr',
|
||||
'b24051@hanmaceng.co.kr',
|
||||
'rmsgud1202@hanmaceng.co.kr',
|
||||
'm21318@hanmaceng.co.kr',
|
||||
'b21367@hanmaceng.co.kr',
|
||||
'b25023@hanmaceng.co.kr',
|
||||
'sdi9429@naver.com',
|
||||
'junsuy@hanmail.net',
|
||||
'ilphilo92@gmail.com'
|
||||
];
|
||||
|
||||
function normalizeLoginId(loginId) {
|
||||
return String(loginId || '').trim().toLowerCase();
|
||||
}
|
||||
|
||||
function isAdminLoginId(loginId) {
|
||||
return ADMIN_ICON_IDS.includes(normalizeLoginId(loginId));
|
||||
}
|
||||
|
||||
function applyAdminIconVisibility(loginId) {
|
||||
const visible = isAdminLoginId(loginId || sessionStorage.getItem('loginId'));
|
||||
$('#uploadBtnWrap').toggle(visible);
|
||||
$('#userListBtnWrap').toggle(visible);
|
||||
}
|
||||
|
||||
// 공지 HTML (닫기 가능 / 입력 방해 X)
|
||||
const bannerHtml = `
|
||||
<div id="login_notice_banner" class="login-notice-banner" style="
|
||||
background:#0f3a2f;color:#fff;border-radius:12px;padding:14px 44px 14px 14px;
|
||||
position:relative;margin:0 0 12px 0;line-height:1.6;word-break:keep-all;">
|
||||
<button type="button" class="lnb-close" aria-label="Close" style="
|
||||
position:absolute;right:10px;top:8px;background:transparent;border:0;
|
||||
color:#fff;font-size:20px;cursor:pointer;">×</button>
|
||||
<strong style="display:block;margin-bottom:6px;">[Login System Notice]</strong>
|
||||
<p class="left" style="margin:0 0 6px;">
|
||||
For improved security, the login system changed on August 8, 2025.<br>
|
||||
Existing users also need to sign up again in the new system.
|
||||
</p>
|
||||
<p style="margin:0;">Support: <strong>+82-2-2141-7434</strong></p>
|
||||
</div>
|
||||
`;
|
||||
|
||||
function injectBanner() {
|
||||
const $wrap = $('#pop_login .popup_contents_wrap');
|
||||
if (!$wrap.length) return false;
|
||||
|
||||
if (!$('#login_notice_banner').length) {
|
||||
$wrap.prepend(bannerHtml);
|
||||
// 닫기 버튼
|
||||
$('#login_notice_banner .lnb-close').on('click', function () {
|
||||
$('#login_notice_banner').fadeOut(120);
|
||||
});
|
||||
} else {
|
||||
$('#login_notice_banner').show();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// 로그인 메뉴 클릭 → 기존 login() 실행 + 배너 주입(팝업 DOM 뜰 때까지 재시도)
|
||||
$(document).on('click', '#my_login a, .my_login a', function (e) {
|
||||
e.preventDefault();
|
||||
if (typeof login === 'function') login();
|
||||
|
||||
let tries = 0;
|
||||
const maxTries = 20; // 1초 정도 재시도(50ms*20)
|
||||
const iv = setInterval(() => {
|
||||
tries++;
|
||||
if (injectBanner() || tries >= maxTries) clearInterval(iv);
|
||||
}, 50);
|
||||
});
|
||||
|
||||
// 혹시 로그인 팝업을 다른 곳에서 열어도 배너가 필요하면, 팝업 열릴 때 한 번 더 시도
|
||||
$(document).on('show-login-popup', function () {
|
||||
injectBanner();
|
||||
});
|
||||
$(function () {
|
||||
applyAdminIconVisibility();
|
||||
});
|
||||
|
||||
window.addEventListener('storage', function (e) {
|
||||
if (e.key === 'loginId') {
|
||||
applyAdminIconVisibility(e.newValue || '');
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('descope-auth-changed', function (e) {
|
||||
applyAdminIconVisibility(e.detail?.loginId || '');
|
||||
});
|
||||
|
||||
let checkCount = 0;
|
||||
const checkInterval = setInterval(function () {
|
||||
checkCount += 1;
|
||||
const loginId = sessionStorage.getItem('loginId') || '';
|
||||
if (loginId || checkCount >= 20) {
|
||||
applyAdminIconVisibility(loginId);
|
||||
clearInterval(checkInterval);
|
||||
}
|
||||
}, 300);
|
||||
})();
|
||||
</script>
|
||||
@@ -0,0 +1,270 @@
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_noti" class="popup_wrap popup-notice" style="display:none">
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/8.4.7/swiper-bundle.min.css"
|
||||
/>
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<span class="border-effect"></span>
|
||||
<div class="popup_container notice">
|
||||
<style>
|
||||
|
||||
.popup-notice a.link {
|
||||
cursor: pointer;
|
||||
}
|
||||
.popup-notice .swiper-wrapper {
|
||||
height: auto !important;
|
||||
}
|
||||
.popup_container.notice img {
|
||||
max-width: 420px;
|
||||
}
|
||||
.popup-notice .swiper-pagination {
|
||||
width: auto;
|
||||
right: 8px;
|
||||
left: auto;
|
||||
padding: 4px 12px;
|
||||
border-radius: 25px;
|
||||
background: rgba(255,255,255,0.6);
|
||||
font-size:14px
|
||||
}
|
||||
.popup-notice .popupSwiper {
|
||||
max-width: 420px; /* 기본: 1280px 미만 */
|
||||
}
|
||||
|
||||
/* PC */
|
||||
@media (min-width: 1280px) {
|
||||
.popup-notice .popupSwiper {
|
||||
max-width:900px;
|
||||
}
|
||||
.popup-notice .swiper-slide:nth-child(2n) {
|
||||
position: relative;
|
||||
|
||||
}
|
||||
.popup-notice .swiper-slide:nth-child(2n):before {
|
||||
content:" ";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top:0;
|
||||
width: 1px;height: 100%;
|
||||
background:#9E958F;
|
||||
}
|
||||
.popup-notice .swiper-slide {
|
||||
min-width: 450px;
|
||||
height: 598px;
|
||||
}
|
||||
.popup_container.notice img {
|
||||
max-width: 450px;
|
||||
}
|
||||
.popup-notice .swiper-pagination {
|
||||
display:none;
|
||||
}
|
||||
}
|
||||
@media (max-width: 721px) {
|
||||
.popup_wrap.popup-notice .popup_in ,
|
||||
.popup_container.notice img,
|
||||
.popup_container.notice img {
|
||||
max-width: 320px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
</style>
|
||||
<div class="pop-content" >
|
||||
<div class="swiper popupSwiper">
|
||||
<div class="swiper-wrapper">
|
||||
|
||||
<?php
|
||||
// 오늘 날짜 (Y-m-d 형식)
|
||||
$main_today = date('Y-m-d');
|
||||
|
||||
// 시작일과 종료일
|
||||
$mainpop_startDate = '2025-12-01';
|
||||
$mainpop_endDate = '2025-12-31';
|
||||
// 기간 내에 있으면 배너 표시
|
||||
if ($main_today >= $mainpop_startDate && $main_today <= $mainpop_endDate) {
|
||||
?>
|
||||
<!-- 슬라이드 1 -->
|
||||
<div class="swiper-slide">
|
||||
<a class="link" href="http://www.ggherald.com/default/index_view_page.php?part_idx=119&idx=74819" target="_blank" alt="‘경기헤럴드’ 기사 전문 바로가기">
|
||||
<picture>
|
||||
<source
|
||||
media="(max-width: 721px)"
|
||||
srcset="./img/main_popup/251128_main_popup_m.png?251223"
|
||||
/>
|
||||
<img
|
||||
src="./img/main_popup/251128_main_popup.png"
|
||||
alt="EG-BIM X 의왕도시공사 민관 상호 협력 성장 지원을 위한 업무 협약 체결"
|
||||
/>
|
||||
</picture>
|
||||
</a>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
<!-- 슬라이드 2 -->
|
||||
<div class="swiper-slide">
|
||||
<picture>
|
||||
<source
|
||||
media="(max-width: 721px)"
|
||||
srcset="./img/main_popup/251223_main_popup_m.png?251223"
|
||||
/>
|
||||
<img
|
||||
src="./img/main_popup/251223_main_popup.png"
|
||||
alt="EG-BIM X 베트남 Nam Can Tho University "
|
||||
/>
|
||||
</picture>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 페이지네이션 -->
|
||||
<div class="swiper-pagination"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="btn-wrap">
|
||||
<button id="todayClose" type="button">Don’t show again today</button>
|
||||
<button id="popupClose" type="button">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/8.4.7/swiper-bundle.min.js"></script>
|
||||
<script>
|
||||
(function() {
|
||||
// 쿠키 읽기 함수
|
||||
function getCookie(name) {
|
||||
var value = "; " + document.cookie;
|
||||
var parts = value.split("; " + name + "=");
|
||||
if (parts.length === 2) return parts.pop().split(";").shift();
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// 페이지 로드시 쿠키 확인
|
||||
var hidePopup = getCookie("hide_popup");
|
||||
var today = new Date().toISOString().split('T')[0];
|
||||
|
||||
var popup = document.getElementById("pop_noti");
|
||||
if (!popup) return;
|
||||
|
||||
// 오늘 날짜와 쿠키 날짜가 같으면 팝업 숨김
|
||||
if (hidePopup === today) {
|
||||
popup.style.display = "none";
|
||||
} else {
|
||||
popup.style.display = "block";
|
||||
}
|
||||
|
||||
// 팝업 외부 클릭 시 닫기
|
||||
popup.onclick = function(e) {
|
||||
if (e.target === popup) {
|
||||
popup.style.display = "none";
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 닫기 버튼
|
||||
var closeBtn = document.getElementById("popupClose");
|
||||
if (closeBtn) {
|
||||
closeBtn.onclick = function() {
|
||||
popup.style.display = "none";
|
||||
};
|
||||
}
|
||||
|
||||
// 오늘 하루 보지 않기 버튼
|
||||
var todayChk = document.getElementById("todayClose");
|
||||
if (todayChk) {
|
||||
todayChk.onclick = function() {
|
||||
var today = new Date();
|
||||
var expire = new Date();
|
||||
expire.setHours(23, 59, 59, 999);
|
||||
document.cookie = "hide_popup=" + today.toISOString().split('T')[0] + "; path=/; expires=" + expire.toUTCString();
|
||||
popup.style.display = "none";
|
||||
};
|
||||
}
|
||||
|
||||
let swiper = null;
|
||||
let resizeTimer = null;
|
||||
let currentMode = window.innerWidth >= 1280 ? 'pc' : 'mo';
|
||||
|
||||
function initSwiper() {
|
||||
const slideCount = document.querySelectorAll(
|
||||
'.popupSwiper .swiper-slide'
|
||||
).length;
|
||||
|
||||
const isSingleSlide = slideCount <= 1;
|
||||
const isPC = window.innerWidth >= 1280;
|
||||
|
||||
swiper = new Swiper('.popupSwiper', {
|
||||
speed: 600,
|
||||
watchOverflow: true,
|
||||
|
||||
slidesPerView: isSingleSlide ? 1 : (isPC ? 2 : 1),
|
||||
slidesPerGroup: isSingleSlide ? 1 : (isPC ? 2 : 1),
|
||||
|
||||
loop: false, // ⭐ loop 고정 (중요)
|
||||
allowTouchMove: !isPC,
|
||||
|
||||
observer: true,
|
||||
observeParents: true,
|
||||
updateOnWindowResize: false,
|
||||
|
||||
pagination: {
|
||||
el: '.swiper-pagination',
|
||||
type: 'fraction',
|
||||
},
|
||||
|
||||
on: {
|
||||
init(swiper) {
|
||||
// single slide면 pagination 숨김
|
||||
if (isSingleSlide && swiper.pagination?.el) {
|
||||
swiper.pagination.el.style.display = 'none';
|
||||
} else if (swiper.pagination?.el) {
|
||||
swiper.pagination.el.style.display = isPC ? 'none' : 'block';
|
||||
}
|
||||
},
|
||||
|
||||
// fraction NaN 방어
|
||||
paginationUpdate(swiper, el) {
|
||||
if (el && el.textContent.includes('NaN')) {
|
||||
swiper.slideTo(0, 0, false);
|
||||
swiper.update();
|
||||
|
||||
requestAnimationFrame(() => {
|
||||
swiper.pagination.render();
|
||||
swiper.pagination.update();
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 최초 실행
|
||||
initSwiper();
|
||||
|
||||
// PC ↔ MO 경계 통과 시에만 재생성
|
||||
window.addEventListener('resize', function () {
|
||||
clearTimeout(resizeTimer);
|
||||
|
||||
resizeTimer = setTimeout(() => {
|
||||
const newMode = window.innerWidth >= 1280 ? 'pc' : 'mo';
|
||||
|
||||
if (newMode !== currentMode) {
|
||||
currentMode = newMode;
|
||||
|
||||
if (swiper) {
|
||||
swiper.destroy(true, true);
|
||||
swiper = null;
|
||||
}
|
||||
|
||||
initSwiper();
|
||||
}
|
||||
}, 200);
|
||||
});
|
||||
|
||||
})();
|
||||
</script>
|
||||
@@ -0,0 +1,148 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="' . $member_skin_url . '/style.css">', 0);
|
||||
if ($config['cf_cert_use'] && ($config['cf_cert_simple'] || $config['cf_cert_ipin'] || $config['cf_cert_hp']))
|
||||
add_javascript('<script src="'.G5_JS_URL.'/certify.js?v='.G5_JS_VER.'"></script>', 0);
|
||||
?>
|
||||
<!-- 기존 회원 본인인증 시작 { -->
|
||||
<div class="member_cert_refresh">
|
||||
<form name="fcertrefreshform" id="member_cert_refresh" action="<?php echo $action_url ?>" onsubmit="return fcertrefreshform_submit(this);" method="POST" autocomplete="off">
|
||||
<input type="hidden" name="w" value="<?php echo $w ?>">
|
||||
<input type="hidden" name="url" value="<?php echo $urlencode ?>">
|
||||
<input type="hidden" name="cert_type" value="<?php echo $member['mb_certify']; ?>">
|
||||
<input type="hidden" name="mb_id" value="<?php echo $member['mb_id']; ?>">
|
||||
<input type="hidden" name="mb_hp" value="<?php echo $member['mb_hp']; ?>">
|
||||
<input type="hidden" name="mb_name" value="<?php echo $member['mb_name']; ?>">
|
||||
<input type="hidden" name="cert_no" value="">
|
||||
<section id="member_cert_refresh_private">
|
||||
<h2>(필수) 추가 개인정보처리방침 안내</h2>
|
||||
<div>
|
||||
<div class="tbl_head01 tbl_wrap">
|
||||
<table>
|
||||
<caption>추가 개인정보처리방침 안내</caption>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>목적</th>
|
||||
<th>항목</th>
|
||||
<th>보유기간</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>이용자 식별 및 본인여부 확인</td>
|
||||
<td>생년월일<?php echo (empty($member['mb_dupinfo']))? ", 휴대폰 번호(아이핀 제외)" : ""; ?>, 암호화된 개인식별부호(CI)</td>
|
||||
<td>회원 탈퇴 시까지</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="member_cert_refresh_agree">
|
||||
<input type="checkbox" name="agree2" value="1" id="agree21" class="selec_chk">
|
||||
<label for="agree21"><span></span><b class="sound_only">추가 개인정보처리방침에 동의합니다.</b></label>
|
||||
</fieldset>
|
||||
</section>
|
||||
|
||||
<section id="find_info" class="new_win">
|
||||
<h2>인증수단 선택하기</h2>
|
||||
|
||||
<div class="find_btn">
|
||||
<?php
|
||||
if ($config['cf_cert_use']) {
|
||||
echo '<div class="cert_btn">';
|
||||
if ($config['cf_cert_simple']) {
|
||||
echo '<button type="button" id="win_sa_kakao_cert" class="btn_submit win_sa_cert" data-type="">간편인증</button>' . PHP_EOL;
|
||||
}
|
||||
if ($config['cf_cert_hp'])
|
||||
echo '<button type="button" id="win_hp_cert" class="btn_submit">휴대폰 본인확인</button>' . PHP_EOL;
|
||||
if ($config['cf_cert_ipin'])
|
||||
echo '<button type="button" id="win_ipin_cert" class="btn_submit">아이핀 본인확인</button>' . PHP_EOL;
|
||||
echo '</div>';
|
||||
echo '<noscript>본인확인을 위해서는 자바스크립트 사용이 가능해야합니다.</noscript>' . PHP_EOL;
|
||||
}
|
||||
?>
|
||||
</div>
|
||||
</section>
|
||||
</form>
|
||||
|
||||
<script>
|
||||
$(function() {
|
||||
var pageTypeParam = "pageType=register";
|
||||
var f = document.fcertrefreshform;
|
||||
|
||||
<?php if ($config['cf_cert_use'] && $config['cf_cert_simple']) { ?>
|
||||
// 이니시스 간편인증
|
||||
var url = "<?php echo G5_INICERT_URL; ?>/ini_request.php";
|
||||
var type = "";
|
||||
var params = "";
|
||||
var request_url = "";
|
||||
|
||||
$(".win_sa_cert").click(function() {
|
||||
if (!fcertrefreshform_submit(f)) return false;
|
||||
type = $(this).data("type");
|
||||
params = "?directAgency=" + type + "&" + pageTypeParam;
|
||||
request_url = url + params;
|
||||
call_sa(request_url);
|
||||
});
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($config['cf_cert_use'] && $config['cf_cert_ipin']) { ?>
|
||||
// 아이핀인증
|
||||
var params = "";
|
||||
$("#win_ipin_cert").click(function() {
|
||||
if (!fcertrefreshform_submit(f)) return false;
|
||||
params = "?" + pageTypeParam;
|
||||
var url = "<?php echo G5_OKNAME_URL; ?>/ipin1.php" + params;
|
||||
certify_win_open('kcb-ipin', url);
|
||||
return;
|
||||
});
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($config['cf_cert_use'] && $config['cf_cert_hp']) { ?>
|
||||
// 휴대폰인증
|
||||
var params = "";
|
||||
$("#win_hp_cert").click(function() {
|
||||
if (!fcertrefreshform_submit(f)) return false;
|
||||
params = "?" + pageTypeParam;
|
||||
<?php
|
||||
switch ($config['cf_cert_hp']) {
|
||||
case 'kcb':
|
||||
$cert_url = G5_OKNAME_URL.'/hpcert1.php';
|
||||
$cert_type = 'kcb-hp';
|
||||
break;
|
||||
case 'kcp':
|
||||
$cert_url = G5_KCPCERT_URL.'/kcpcert_form.php';
|
||||
$cert_type = 'kcp-hp';
|
||||
break;
|
||||
case 'lg':
|
||||
$cert_url = G5_LGXPAY_URL.'/AuthOnlyReq.php';
|
||||
$cert_type = 'lg-hp';
|
||||
break;
|
||||
default:
|
||||
echo 'alert("기본환경설정에서 휴대폰 본인확인 설정을 해주십시오");';
|
||||
echo 'return false;';
|
||||
break;
|
||||
}
|
||||
?>
|
||||
|
||||
certify_win_open("<?php echo $cert_type; ?>", "<?php echo $cert_url; ?>" + params);
|
||||
return;
|
||||
});
|
||||
<?php } ?>
|
||||
});
|
||||
|
||||
function fcertrefreshform_submit(f) {
|
||||
if (!f.agree2.checked) {
|
||||
alert("추가 개인정보처리방침에 동의하셔야 인증을 진행하실 수 있습니다.");
|
||||
f.agree2.focus();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
<!-- } 기존 회원 본인인증 끝 -->
|
||||
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TOVA Join</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<script src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script src="../js/common.js"></script>
|
||||
</head>
|
||||
|
||||
|
||||
<!-- 회원 비밀번호 확인 시작 { -->
|
||||
<div id="mb_confirm" class="mbskin">
|
||||
<h1><?php echo $g5['title'] ?></h1>
|
||||
|
||||
<p>
|
||||
<!-- <strong>비밀번호를 한번 더 입력해주세요.</strong> -->
|
||||
<?php if ($url == 'member_leave.php') { ?>
|
||||
비밀번호를 입력하시면 회원탈퇴가 완료됩니다.
|
||||
<?php }else{ ?>
|
||||
회원님의 정보를 안전하게 보호하기 위해 비밀번호를 한번 더 확인합니다.
|
||||
<?php } ?>
|
||||
</p>
|
||||
|
||||
<form name="fmemberconfirm" action="<?php echo $url ?>" onsubmit="return fmemberconfirm_submit(this);" method="post">
|
||||
<input type="hidden" name="mb_id" value="<?php echo $member['mb_id'] ?>">
|
||||
<input type="hidden" name="w" value="u">
|
||||
|
||||
<!-- <fieldset>
|
||||
<span class="confirm_id">회원아이디</span>
|
||||
<span id="mb_confirm_id"><?php //echo $member['mb_id'] ?></span>
|
||||
<label for="confirm_mb_password" class="sound_only">비밀번호<strong>필수</strong></label>
|
||||
<input type="password" name="mb_password" id="confirm_mb_password" required class="required frm_input" size="15" maxLength="20" placeholder="비밀번호">
|
||||
<input type="submit" value="확인" id="btn_submit" class="btn_submit">
|
||||
</fieldset> -->
|
||||
|
||||
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<!-- Header -->
|
||||
<header class="header">
|
||||
<h1>
|
||||
<img src="../img/logo_w.svg" alt="">
|
||||
</h1>
|
||||
<div class="menu_wrap">
|
||||
<div class="menu_my"><img src="../img/ico_my.svg" alt=""></div>
|
||||
<div class="menu_ham"><img src="../img/ico_ham.svg" alt=""></div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- //Header -->
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div class="popup_wrap ">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<hgroup>
|
||||
<div class="pop_close_wrap">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="../img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
</div>
|
||||
</hgroup>
|
||||
<!--popup_content-->
|
||||
<div class="popup_content join">
|
||||
<!--pop_join_left-->
|
||||
<div class="pop_join_left">
|
||||
<?php if ($url == 'member_leave.php') { ?>
|
||||
<span class="bg_tit_left">Canc</span>
|
||||
<div class="join_info">
|
||||
<h1 class="h_1"> 회원탈퇴 </h1>
|
||||
<h3 class="h_3">
|
||||
회원님의 <em>정보 보호</em>를 <br>
|
||||
위하여 <em>비밀번호</em>를 한번 더 확인합니다.
|
||||
</h3>
|
||||
</div>
|
||||
<?php }else{ ?>
|
||||
<span class="bg_tit_left">My pa</span>
|
||||
<div class="join_info">
|
||||
<h1 class="h_1"> My Page </h1>
|
||||
<h3 class="h_3">
|
||||
회원님의 <em>정보 보호</em>를 <br>
|
||||
위하여 <em>비밀번호</em>를 한번 더 확인합니다.
|
||||
</h3>
|
||||
</div>
|
||||
<?php } ?>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="pop_input_wrap pop_join_right">
|
||||
<?php if ($url == 'member_leave.php') { ?>
|
||||
<span class="bg_tit_right">el</span>
|
||||
<?php }else{ ?>
|
||||
<span class="bg_tit_right">ge</span>
|
||||
<?php } ?>
|
||||
<div class="contents_wrap">
|
||||
<div class="content">
|
||||
<table class="ph">
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="h_4">비밀번호 확인</th>
|
||||
<td>
|
||||
<div class="id_wrap">
|
||||
<input type="password" name="mb_password" id="confirm_mb_password" required class="required frm_input" placeholder="비밀번호 입력" required>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="join_btn_wrap">
|
||||
<button id="btn_submit" type="submit" class="btn_submit">확인</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function fmemberconfirm_submit(f)
|
||||
{
|
||||
document.getElementById("btn_submit").disabled = true;
|
||||
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
<!-- } 회원 비밀번호 확인 끝 -->
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 쪽지 목록 시작 { -->
|
||||
<div id="memo_list" class="new_win">
|
||||
<h1 id="win_title">
|
||||
<?php echo $g5['title'] ?>
|
||||
<div class="win_total">전체 <?php echo $kind_title ?>쪽지 <?php echo $total_count ?>통<br></div>
|
||||
</h1>
|
||||
<div class="new_win_con2">
|
||||
<ul class="win_ul">
|
||||
<li class="<?php if ($kind == 'recv') { ?>selected<?php } ?>"><a href="./memo.php?kind=recv">받은쪽지</a></li>
|
||||
<li class="<?php if ($kind == 'send') { ?>selected<?php } ?>"><a href="./memo.php?kind=send">보낸쪽지</a></li>
|
||||
<li><a href="./memo_form.php">쪽지쓰기</a></li>
|
||||
</ul>
|
||||
|
||||
<div class="memo_list">
|
||||
<ul>
|
||||
<?php
|
||||
for ($i=0; $i<count($list); $i++) {
|
||||
$readed = (substr($list[$i]['me_read_datetime'],0,1) == 0) ? '' : 'read';
|
||||
$memo_preview = utf8_strcut(strip_tags($list[$i]['me_memo']), 30, '..');
|
||||
?>
|
||||
<li class="<?php echo $readed; ?>">
|
||||
<div class="memo_li profile_big_img">
|
||||
<?php echo get_member_profile_img($list[$i]['mb_id']); ?>
|
||||
<?php if (! $readed){ ?><span class="no_read">안 읽은 쪽지</span><?php } ?>
|
||||
</div>
|
||||
<div class="memo_li memo_name">
|
||||
<?php echo $list[$i]['name']; ?> <span class="memo_datetime"><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $list[$i]['send_datetime']; ?></span>
|
||||
<div class="memo_preview">
|
||||
<a href="<?php echo $list[$i]['view_href']; ?>"><?php echo $memo_preview; ?></a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="<?php echo $list[$i]['del_href']; ?>" onclick="del(this.href); return false;" class="memo_del"><i class="fa fa-trash-o" aria-hidden="true"></i> <span class="sound_only">삭제</span></a>
|
||||
</li>
|
||||
<?php } ?>
|
||||
<?php if ($i==0) { echo '<li class="empty_table">자료가 없습니다.</li>'; } ?>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<!-- 페이지 -->
|
||||
<?php echo $write_pages; ?>
|
||||
|
||||
<p class="win_desc"><i class="fa fa-info-circle" aria-hidden="true"></i> 쪽지 보관일수는 최장 <strong><?php echo $config['cf_memo_del'] ?></strong>일 입니다.
|
||||
</p>
|
||||
|
||||
<div class="win_btn">
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- } 쪽지 목록 끝 -->
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 쪽지 보내기 시작 { -->
|
||||
<div id="memo_write" class="new_win">
|
||||
<h1 id="win_title"><i class="fa fa-envelope-o" aria-hidden="true"></i> 쪽지 보내기</h1>
|
||||
<div class="new_win_con2">
|
||||
<ul class="win_ul">
|
||||
<li><a href="./memo.php?kind=recv">받은쪽지</a></li>
|
||||
<li><a href="./memo.php?kind=send">보낸쪽지</a></li>
|
||||
<li class="selected"><a href="./memo_form.php">쪽지쓰기</a></li>
|
||||
</ul>
|
||||
|
||||
<form name="fmemoform" action="<?php echo $memo_action_url; ?>" onsubmit="return fmemoform_submit(this);" method="post" autocomplete="off">
|
||||
<div class="form_01">
|
||||
<h2 class="sound_only">쪽지쓰기</h2>
|
||||
<ul>
|
||||
<li>
|
||||
<label for="me_recv_mb_id" class="sound_only">받는 회원아이디<strong>필수</strong></label>
|
||||
|
||||
<input type="text" name="me_recv_mb_id" value="<?php echo $me_recv_mb_id; ?>" id="me_recv_mb_id" required class="frm_input full_input required" size="47" placeholder="받는 회원아이디">
|
||||
<span class="frm_info">여러 회원에게 보낼때는 컴마(,)로 구분하세요.</span>
|
||||
<?php if ($config['cf_memo_send_point']) { ?>
|
||||
<br ><span class="frm_info">쪽지 보낼때 회원당 <?php echo number_format($config['cf_memo_send_point']); ?>점의 포인트를 차감합니다.</span>
|
||||
<?php } ?>
|
||||
</li>
|
||||
<li>
|
||||
<label for="me_memo" class="sound_only">내용</label>
|
||||
<textarea name="me_memo" id="me_memo" required class="required"><?php echo $content ?></textarea>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sound_only">자동등록방지</span>
|
||||
|
||||
<?php echo captcha_html(); ?>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="win_btn">
|
||||
<button type="submit" id="btn_submit" class="btn btn_b02 reply_btn">보내기</button>
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function fmemoform_submit(f)
|
||||
{
|
||||
<?php echo chk_captcha_js(); ?>
|
||||
|
||||
return true;
|
||||
}
|
||||
</script>
|
||||
<!-- } 쪽지 보내기 끝 -->
|
||||
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
$nick = get_sideview($mb['mb_id'], $mb['mb_nick'], $mb['mb_email'], $mb['mb_homepage']);
|
||||
if($kind == "recv") {
|
||||
$kind_str = "보낸";
|
||||
$kind_date = "받은";
|
||||
}
|
||||
else {
|
||||
$kind_str = "받는";
|
||||
$kind_date = "보낸";
|
||||
}
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 쪽지보기 시작 { -->
|
||||
<div id="memo_view" class="new_win">
|
||||
<h1 id="win_title"><?php echo $g5['title'] ?></h1>
|
||||
<div class="new_win_con2">
|
||||
<!-- 쪽지함 선택 시작 { -->
|
||||
<ul class="win_ul">
|
||||
<li class="<?php if ($kind == 'recv') { ?>selected<?php } ?>"><a href="./memo.php?kind=recv">받은쪽지</a></li>
|
||||
<li class="<?php if ($kind == 'send') { ?>selected<?php } ?>"><a href="./memo.php?kind=send">보낸쪽지</a></li>
|
||||
<li><a href="./memo_form.php">쪽지쓰기</a></li>
|
||||
</ul>
|
||||
<!-- } 쪽지함 선택 끝 -->
|
||||
|
||||
<article id="memo_view_contents">
|
||||
<header>
|
||||
<h2>쪽지 내용</h2>
|
||||
</header>
|
||||
<div id="memo_view_ul">
|
||||
<div class="memo_view_li memo_view_name">
|
||||
<ul class="memo_from">
|
||||
<li class="memo_profile">
|
||||
<?php echo get_member_profile_img($mb['mb_id']); ?>
|
||||
</li>
|
||||
<li class="memo_view_nick"><?php echo $nick ?></li>
|
||||
<li class="memo_view_date"><span class="sound_only"><?php echo $kind_date ?>시간</span><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $memo['me_send_datetime'] ?></li>
|
||||
<li class="memo_op_btn list_btn"><a href="<?php echo $list_link ?>" class="btn_b01 btn"><i class="fa fa-list" aria-hidden="true"></i><span class="sound_only">목록</span></a></li>
|
||||
<li class="memo_op_btn del_btn"><a href="<?php echo $del_link; ?>" onclick="del(this.href); return false;" class="memo_del btn_b01 btn"><i class="fa fa-trash-o" aria-hidden="true"></i> <span class="sound_only">삭제</span></a></li>
|
||||
</ul>
|
||||
<div class="memo_btn">
|
||||
<?php if($prev_link) { ?>
|
||||
<a href="<?php echo $prev_link ?>" class="btn_left"><i class="fa fa-chevron-left" aria-hidden="true"></i> 이전쪽지</a>
|
||||
<?php } ?>
|
||||
<?php if($next_link) { ?>
|
||||
<a href="<?php echo $next_link ?>" class="btn_right">다음쪽지 <i class="fa fa-chevron-right" aria-hidden="true"></i></a>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p>
|
||||
<?php echo conv_content($memo['me_memo'], 0) ?>
|
||||
</p>
|
||||
</article>
|
||||
<div class="win_btn">
|
||||
<?php if ($kind == 'recv') { ?><a href="./memo_form.php?me_recv_mb_id=<?php echo $mb['mb_id'] ?>&me_id=<?php echo $memo['me_id'] ?>" class="reply_btn">답장</a><?php } ?>
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- } 쪽지보기 끝 -->
|
||||
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- <head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TOVA Join</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<script src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script src="../js/common.js"></script>
|
||||
</head> -->
|
||||
|
||||
|
||||
<!-- <body>
|
||||
<div class="wrapper"> -->
|
||||
<!-- Header -->
|
||||
<!-- <header class="header">
|
||||
<h1>
|
||||
<img src="../img/logo_w.svg" alt="">
|
||||
</h1>
|
||||
<div class="menu_wrap">
|
||||
<div class="menu_my"><img src="../img/ico_my.svg" alt=""></div>
|
||||
<div class="menu_ham"><img src="../img/ico_ham.svg" alt=""></div>
|
||||
</div>
|
||||
</header> -->
|
||||
<!-- //Header -->
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_mypage01" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="../img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
<!--popup_content-->
|
||||
<div class="popup_container mypage">
|
||||
<!--pop_join_left-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1"> My Page </h1>
|
||||
<h3 class="h_3">
|
||||
소중한 <em>내 정보</em>를<br> <em>최신</em>으로 관리하세요.
|
||||
</h3>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="popup_contents_wrap">
|
||||
<div class="my_info">
|
||||
<div class="name">
|
||||
<h4>김토바님<span>(A1122)</span></h4>
|
||||
<a href="<?php echo G5_BBS_URL ?>/member_confirm.php">내 정보 수정</a>
|
||||
</div>
|
||||
<ul class="detail">
|
||||
<li>
|
||||
<div class=""><i class="phone"></i>휴대전화번호</div>
|
||||
<span>010-1234-5678</span>
|
||||
</li>
|
||||
<li>
|
||||
<div><i class="email"></i>이메일</div>
|
||||
<span>A1122@naver.com</span>
|
||||
</li>
|
||||
<li>
|
||||
<div><i class="company"></i>회사정보</div>
|
||||
<span>(주)BBB XXX부</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="my_qna">
|
||||
<h4>내 문의</h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 10%;">번호</th>
|
||||
<th style="width: 10%;">구분</th>
|
||||
<th style="width: 45%;">제목</th>
|
||||
<th style="width: 15%;">글쓴이</th>
|
||||
<th style="width: 10%;">날짜</th>
|
||||
<th style="width: 10%;">조회</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>11</td>
|
||||
<td>사용</td>
|
||||
<td class="tit"><a href="">C기능 사용 방법 문의 <em>[1]</em></a></td>
|
||||
<td>김토바</td>
|
||||
<td>24-06-22</td>
|
||||
<td>31</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>12</td>
|
||||
<td>사용</td>
|
||||
<td class="tit"><a href="">C기능 사용 방법 문의 <em>[1]</em></a></td>
|
||||
<td>김토바</td>
|
||||
<td>24-06-23</td>
|
||||
<td>32</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>13</td>
|
||||
<td>사용</td>
|
||||
<td class="tit"><a href="">C기능 사용 방법 문의 <em>[1]</em></a></td>
|
||||
<td>김토바</td>
|
||||
<td>24-06-24</td>
|
||||
<td>33</td>
|
||||
</tr>
|
||||
<tr class="answer">
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td class="tit"><a href=""><i class="answer"></i><em>답글</em> <span>C기능 사용 방법 문의C기능 사용 방법</span> <i
|
||||
class="lock"></i> </a> </td>
|
||||
<td>관리자</td>
|
||||
<td>24-06-24</td>
|
||||
<td>33</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>13</td>
|
||||
<td>사용</td>
|
||||
<td class="tit"><a href="">C기능 사용 방법 문의 <em>[1]</em></a></td>
|
||||
<td>김토바</td>
|
||||
<td>24-06-24</td>
|
||||
<td>33</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="pagination">
|
||||
<button type="button" class="btn_prev"></button>
|
||||
<ul class="pagination_list">
|
||||
<li class="on"><a href="#">1</a></li>
|
||||
<li><a href="#">2</a></li>
|
||||
<li><a href="#">3</a></li>
|
||||
<li><a href="#">4</a></li>
|
||||
<li><a href="#">5</a></li>
|
||||
</ul>
|
||||
<button type="button" class="btn_next"></button>
|
||||
</div>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
<!-- </div>
|
||||
</body> -->
|
||||
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
include_once('./_common.php');
|
||||
?>
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div class="popup_wrap" id="pop_mypage01">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
|
||||
<!--popup_content-->
|
||||
<div class="popup_container mypage log">
|
||||
<!--pop_join_left-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1"> My Page </h1>
|
||||
<h3 class="h_3">
|
||||
회원님의 <em>정보 보호</em>를 위하여<br> <em>비밀번호</em>를 한번 더 확인합니다.
|
||||
</h3>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="popup_contents_wrap">
|
||||
<form id="fmyconfirmpw" name="fmyconfirmpw" action="<?php //echo $login_action_url?>" onsubmit="return fmyconfirmpw_submit(this);" method="post">
|
||||
<table> <!-- class="ph"//-->
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="h_4">비밀번호 확인</th>
|
||||
<td>
|
||||
<div class="id_wrap">
|
||||
<input type="password" id="password_mypage" name="password_mypage" placeholder="비밀번호 입력" required onkeyup="ufn_pw_onkeyup(this);">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="join_btn_wrap">
|
||||
<button type="submit" id="btn_re_pw" >확인</button> <!-- onclick="javascript:mypage02()" //-->
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<script>
|
||||
function ufn_pw_onkeyup(l_pw){
|
||||
if(l_pw.value.length>0){
|
||||
document.getElementById('btn_re_pw').disabled = false;
|
||||
}else{
|
||||
document.getElementById('btn_re_pw').disabled = true;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<!--//popup_wrap-->
|
||||
@@ -0,0 +1,179 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
include_once('./_common.php');
|
||||
include_once(G5_LIB_PATH.'/latest.lib.php');
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
|
||||
$session_id = isset($_SESSION['session_id']) ? $_SESSION['session_id'] : '';
|
||||
$mb_name = '';
|
||||
$mb_hp = '';
|
||||
$mb_comp_team = '';
|
||||
$mb_comp = '';
|
||||
$mb_email = '';
|
||||
$result = null;
|
||||
|
||||
if ($session_id) {
|
||||
$sql1 = " select mb_name, mb_hp, mb_comp_team, mb_email, mb_comp from {$g5['member_table']} where mb_id = '{$session_id}' ";
|
||||
$row1 = sql_fetch($sql1);
|
||||
$mb_name = isset($row1['mb_name']) ? $row1['mb_name'] : '';
|
||||
$mb_hp = isset($row1['mb_hp']) ? $row1['mb_hp'] : '';
|
||||
$mb_comp_team = isset($row1['mb_comp_team']) ? $row1['mb_comp_team'] : '';
|
||||
$mb_comp = isset($row1['mb_comp']) ? $row1['mb_comp'] : '';
|
||||
$mb_email = isset($row1['mb_email']) ? $row1['mb_email'] : '';
|
||||
$sql2 = " select * from {$g5['qa_content_table']} where mb_id = '{$session_id}' ORDER BY qa_datetime DESC limit 5";
|
||||
$result = sql_query($sql2);
|
||||
}
|
||||
// $qa_category = $row2['qa_category'];
|
||||
// $qa_subject = $row2['qa_subject'];
|
||||
// $qa_content = $row2['qa_content'];
|
||||
// $qa_datetime = $row2['qa_datetime'];
|
||||
// $qa_status = $row2['qa_status'];
|
||||
|
||||
$mylist = array();
|
||||
$num = 1;
|
||||
// $num = $total_count - ($page - 1) * $page_rows;
|
||||
// $subject_len = G5_IS_MOBILE ? $qaconfig['qa_mobile_subject_len'] : $qaconfig['qa_subject_len'];
|
||||
for($i=0; $result && $row=sql_fetch_array($result); $i++) {
|
||||
$mylist[$i] = $row;
|
||||
|
||||
$mylist[$i]['category'] = get_text($row['qa_category']);
|
||||
$mylist[$i]['subject'] = conv_subject($row['qa_subject'], $subject_len, '…');
|
||||
if ($stx) {
|
||||
$mylist[$i]['subject'] = search_font($stx, $mylist[$i]['subject']);
|
||||
}
|
||||
|
||||
$mylist[$i]['view_href'] = G5_BBS_URL.'/qaview.php?qa_id='.$row['qa_id'].$qstr;
|
||||
|
||||
$mylist[$i]['icon_file'] = '';
|
||||
if(trim($row['qa_file1']) || trim($row['qa_file2']))
|
||||
$mylist[$i]['icon_file'] = '<img src="'.$qa_skin_url.'/img/icon_file.gif">';
|
||||
|
||||
$mylist[$i]['name'] = get_text($row['qa_name']);
|
||||
|
||||
$mylist[$i]['date'] = substr($row['qa_datetime'], 2, 8);
|
||||
|
||||
$mylist[$i]['num'] = $num;
|
||||
$num += 1;
|
||||
}
|
||||
?>
|
||||
|
||||
<!-- <head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TOVA Join</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<script src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script src="../js/common.js"></script>
|
||||
</head> -->
|
||||
|
||||
|
||||
<!-- <body>
|
||||
<div class="wrapper"> -->
|
||||
<!-- Header -->
|
||||
<!-- <header class="header">
|
||||
<h1>
|
||||
<img src="../img/logo_w.svg" alt="">
|
||||
</h1>
|
||||
<div class="menu_wrap">
|
||||
<div class="menu_my"><img src="../img/ico_my.svg" alt=""></div>
|
||||
<div class="menu_ham"><img src="../img/ico_ham.svg" alt=""></div>
|
||||
</div>
|
||||
</header> -->
|
||||
<!-- //Header -->
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_mypage02" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt="sdi"></div>
|
||||
</button>
|
||||
<!--popup_content-->
|
||||
<div class="popup_container mypage">
|
||||
<!--pop_join_left-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1"> My Page </h1>
|
||||
<h3 class="h_3">
|
||||
소중한 <em>내 정보</em>를 <br><em> 최신</em>으로 관리하세요.
|
||||
</h3>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="popup_contents_wrap">
|
||||
<div class="my_info">
|
||||
<div class="name">
|
||||
<h4><?php echo $mb_name?>님<span>(<?php echo $session_id; ?>)</span></h4>
|
||||
<button onclick="javascript:mypage03();">내 정보 수정</button>
|
||||
</div>
|
||||
<ul class="detail">
|
||||
<!-- 라이센스 구매이력 부분 -->
|
||||
<li class="license"></li>
|
||||
<li>
|
||||
<div class=""><i class="phone"></i>휴대전화번호</div>
|
||||
<span id="span_hp"><?php echo $mb_hp?></span>
|
||||
</li>
|
||||
<li>
|
||||
<div><i class="email"></i>이메일</div>
|
||||
<span id="span_email"><?php echo $mb_email?></span>
|
||||
</li>
|
||||
<li>
|
||||
<div><i class="company"></i>회사정보</div>
|
||||
<!-- <span id="span_comp"><?php //echo $mb_comp.'<br>'.$mb_comp_team?></span> -->
|
||||
<span id="span_comp"><?php echo $mb_comp?></span><br>
|
||||
<span id="span_comp_team"><?php echo $mb_comp_team?></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="my_qna">
|
||||
<h4>내 문의</h4>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="width: 7%;">번호</th>
|
||||
<th style="width: 10%;">구분</th>
|
||||
<th style="width: max-contents;">제목</th>
|
||||
<th style="width: 10%;">등록일</th>
|
||||
<th style="width: 13%;">상태</th>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php
|
||||
for ($i=0; $i<count($mylist); $i++) {
|
||||
if ($i%2==0) $lt_class = "even";
|
||||
else $lt_class = "";
|
||||
?>
|
||||
<tr class="<?php echo $lt_class ?>">
|
||||
<td class="td_num" style="text-align: center;"><?php echo $mylist[$i]['num'];?></td>
|
||||
<td class="td_subject" style="text-align: center;">
|
||||
<span class="bo_cate_link" style="width:80px;"><?php echo $mylist[$i]['category']; ?></span>
|
||||
<!-- <a href="<?php //echo $mylist[$i]['view_href']; ?>" class="bo_tit">
|
||||
<?php //echo $mylist[$i]['subject']; ?>
|
||||
<?php //if ($mylist[$i]['icon_file']) echo " <i class=\"fa fa-download\" aria-hidden=\"true\"></i>" ; ?>
|
||||
</a> -->
|
||||
</td>
|
||||
<td class="td_name"><?php echo $mylist[$i]['qa_subject']; ?></td>
|
||||
<td class="td_date"><?php echo $mylist[$i]['date']; ?></td>
|
||||
<td class="td_stat"><span class=" <?php echo ($mylist[$i]['qa_status'] ? 'txt_done' : 'txt_rdy'); ?>"><?php echo ($mylist[$i]['qa_status'] ? '답변완료' : '답변대기'); ?></span></td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<?php if ($i == 0) { echo '<tr><td colspan="5" style="text-align:center;">게시물이 없습니다.</td></tr>'; } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
<!-- </div>
|
||||
</body> -->
|
||||
@@ -0,0 +1,452 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
include_once('./_common.php');
|
||||
|
||||
$member = array_merge(array(
|
||||
'mb_id' => '',
|
||||
'mb_name' => '',
|
||||
'mb_hp' => '',
|
||||
'mb_comp' => '',
|
||||
'mb_comp_team' => '',
|
||||
), is_array($member) ? $member : array());
|
||||
|
||||
//add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div class="popup_wrap" id="pop_mypage03">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
<!--popup_content-->
|
||||
<div class="popup_container mypage edit">
|
||||
<!--pop_join_left-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1">My Page</h1>
|
||||
<!-- <h3 class="h_3">
|
||||
소중한 <em>내 정보</em>를 <br>
|
||||
<em>최신</em>으로 관리하세요.
|
||||
</h3> -->
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="popup_contents_wrap">
|
||||
<fieldset>
|
||||
<!--tbl_wrap-->
|
||||
<div id="register_form" class="tbl_wrap" style="height: 400px;">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="h_4">ID</th>
|
||||
<td>
|
||||
<div class="id_wrap">
|
||||
<input type="text" class="full_input" id="show_mb_id" name="mb_id" value="<?php echo $member['mb_id'] ?>" readonly style="color: #9aa0a6;">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th class="h_4">Employee ID</th>
|
||||
<td>
|
||||
<div class="password_wrap">
|
||||
<input type="text" name="mb_password" id="show_mb_employeeid" class="frm_input full_input" data-editable>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th class="h_4">Name</th>
|
||||
<td>
|
||||
<div class="name_wrap">
|
||||
<input type="text" id="show_mb_name" name="mb_name" value="<?php echo get_text($member['mb_name']) ?>" class="frm_input full_input" data-editable>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th class="h_4">Position</th>
|
||||
<td>
|
||||
<div class="position_wrap">
|
||||
<input type="text" id="show_mb_position" name="mb_position" class="frm_input full_input" data-editable>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="h_4">Mobile</th>
|
||||
<td>
|
||||
<div class="phone_wrap">
|
||||
<input type="text" name="mb_hp" value="<?php echo preg_replace("/[^0-9]*/s", "", $member['mb_hp']); ?>" id="show_mb_hp" class="frm_input full_input" data-editable>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="row_company">
|
||||
<th class="h_4">Company</th>
|
||||
<td>
|
||||
<div class="company_wrap">
|
||||
<input type="text" name="mb_comp" value="<?php echo get_text($member['mb_comp'])?>" id="show_mb_comp" class="frm_input" data-editable>
|
||||
<input type="text" name="mb_comp_team" value="<?php echo get_text($member['mb_comp_team'])?>" id="show_mb_comp_team" class="frm_input" data-editable>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr id="row_team_external" style="display:none;">
|
||||
<th class="h_4">Department</th>
|
||||
<td>
|
||||
<div class="team_wrap">
|
||||
<input type="text" name="mb_comp_team_ext" id="show_mb_comp_team_ext" class="frm_input" data-editable placeholder="소속부서">
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="btn_confirm">
|
||||
<!-- <button type="button" onclick="mypage02();" class="btn_cancel">취소</button> -->
|
||||
<button type="button" id="btn_profile_edit" class="btn_submit" >Save</button>
|
||||
</div>
|
||||
<div class="sign_out">
|
||||
<a href="#" id="btn_delete_account"><i class="signout"></i>Delete account</a>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
|
||||
<script>
|
||||
(function () {
|
||||
// === 설정 ===
|
||||
const INTERNAL_DOMAINS = [
|
||||
"hanmaceng.co.kr","samaneng.com","jangheon.co.kr",
|
||||
"hallasanup.com","pre-cast.co.kr","baroncs.co.kr"
|
||||
];
|
||||
const MAX_LOGINID_RETRY = 5;
|
||||
|
||||
// === 상태 ===
|
||||
let loginIdRetryCount = 0;
|
||||
|
||||
// === 엘리먼트 캐시 ===
|
||||
const $btn = $('#pop_mypage03 #btn_profile_edit');
|
||||
const $edit = $('[data-editable]');
|
||||
|
||||
const $id = $('#show_mb_id'); // 아이디(=이메일, readonly)
|
||||
const $empId = $('#show_mb_employeeid'); // 사번(내부)
|
||||
const $name = $('#show_mb_name'); // 이름
|
||||
const $pos = $('#show_mb_position'); // 직위(내부)
|
||||
const $phone = $('#show_mb_hp'); // 휴대전화
|
||||
const $comp = $('#show_mb_comp'); // 내부=가족사, 외부=회사명
|
||||
const $team = $('#show_mb_comp_team'); // 소속부서(내/외 공통)
|
||||
|
||||
const $rowEmp = $empId.closest('tr');
|
||||
const $rowPos = $pos.closest('tr');
|
||||
const $rowCompany = $('#row_company'); // 회사정보 행
|
||||
|
||||
// === 전화번호 포맷/검증 ===
|
||||
function autoHyphen010(inputEl) {
|
||||
let v = inputEl.value.replace(/\D/g, '').slice(0, 11); // 숫자만 11자리까지
|
||||
if (v.length < 4) { inputEl.value = v; return; }
|
||||
if (!v.startsWith('010')) { inputEl.value = v; return; }
|
||||
if (v.length <= 7) {
|
||||
inputEl.value = v.slice(0,3) + '-' + v.slice(3);
|
||||
} else {
|
||||
inputEl.value = v.slice(0,3) + '-' + v.slice(3,7) + '-' + v.slice(7);
|
||||
}
|
||||
}
|
||||
function isValidPhone010(str) {
|
||||
return /^010-\d{4}-\d{4}$/.test((str||'').trim());
|
||||
}
|
||||
|
||||
// === 유틸 ===
|
||||
function isInternal(email) {
|
||||
if (!email) return false;
|
||||
const domain = (email.split('@')[1] || '').toLowerCase();
|
||||
return INTERNAL_DOMAINS.includes(domain);
|
||||
}
|
||||
function getEmailFromUI() {
|
||||
return ($id.val() || sessionStorage.getItem('loginId') || '').trim();
|
||||
}
|
||||
function showHint($input, msg) {
|
||||
clearHint($input);
|
||||
$input.addClass('input-error').after('<span class="field-hint">'+msg+'</span>');
|
||||
}
|
||||
function clearHint($input) {
|
||||
$input.removeClass('input-error').siblings('.field-hint').remove();
|
||||
}
|
||||
function clearAllHints() {
|
||||
$edit.each(function(){ clearHint($(this)); });
|
||||
}
|
||||
|
||||
// === 내부/외부 UI 토글 ===
|
||||
function applyTenantUI(email) {
|
||||
const internal = isInternal(email);
|
||||
|
||||
if (internal) {
|
||||
$rowEmp.show();
|
||||
$rowPos.show();
|
||||
$rowCompany.show();
|
||||
$comp.attr('placeholder','가족사');
|
||||
$team.attr('placeholder','소속부서');
|
||||
} else {
|
||||
$rowEmp.hide().find('input').val('');
|
||||
$rowPos.hide().find('input').val('');
|
||||
$rowCompany.show(); // 회사정보는 유지
|
||||
$comp.attr('placeholder','회사명');
|
||||
$team.attr('placeholder','소속부서');
|
||||
}
|
||||
}
|
||||
|
||||
// === 검증 ===
|
||||
function validate() {
|
||||
clearAllHints();
|
||||
const name = ($name.val() || '').trim();
|
||||
const phone = ($phone.val() || '').trim();
|
||||
const email = getEmailFromUI();
|
||||
const internal = isInternal(email);
|
||||
|
||||
let ok = true;
|
||||
if (!name) showHint($name, '이름을 입력해 주세요.'), ok = false;
|
||||
if (!/^[0-9\-]{9,15}$/.test(phone)) showHint($phone, '숫자(하이픈 가능) 9~15자리로 입력해 주세요.'), ok = false;
|
||||
|
||||
if (internal) {
|
||||
if (!($pos.val() || '').trim()) showHint($pos, '직위를 입력해 주세요.'), ok = false;
|
||||
if (!($comp.val() || '').trim()) showHint($comp, '가족사를 입력해 주세요.'), ok = false;
|
||||
if (!($team.val() || '').trim()) showHint($team, '소속부서를 입력해 주세요.'), ok = false;
|
||||
if (!($empId.val()|| '').trim()) showHint($empId,'사번을 입력해 주세요.'), ok = false;
|
||||
} else {
|
||||
if (!($comp.val() || '').trim()) showHint($comp, '회사명을 입력해 주세요.'), ok = false;
|
||||
if (!($team.val() || '').trim()) showHint($team, '소속부서를 입력해 주세요.'), ok = false;
|
||||
}
|
||||
return ok;
|
||||
}
|
||||
|
||||
// === 저장 ===
|
||||
function saveProfile() {
|
||||
if (!validate()) return;
|
||||
|
||||
// const refreshJwt = sessionStorage.getItem('refreshJwt') || '';
|
||||
// if (!refreshJwt) { alert('인증 정보가 만료되었습니다. 다시 로그인해 주세요.'); return; }
|
||||
|
||||
const email = getEmailFromUI();
|
||||
const internal = isInternal(email);
|
||||
|
||||
const payload = {
|
||||
email, // loginId
|
||||
name: ($name.val() || '').trim(),
|
||||
phone: ($phone.val() || '').trim(),
|
||||
position: ($pos.val() || '').trim(), // 외부여도 전송 무해
|
||||
completeForm: true
|
||||
};
|
||||
|
||||
if (internal) {
|
||||
payload.familyCompany = ($comp.val() || '').trim(); // 가족사
|
||||
payload.team = ($team.val() || '').trim(); // 소속부서
|
||||
payload.familyUniqueKey = ($empId.val() || '').trim(); // 사번
|
||||
payload.employeeId = payload.familyUniqueKey; // 호환 키
|
||||
} else {
|
||||
payload.company = ($comp.val() || '').trim(); // 회사명
|
||||
payload.team = ($team.val() || '').trim(); // 소속부서
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_update.php',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: payload,
|
||||
beforeSend(){ $btn.prop('disabled', true).text('저장중…'); },
|
||||
complete(){ $btn.prop('disabled', false).text('Save'); },
|
||||
success(res){
|
||||
if (res.status === 'ok') {
|
||||
alert('정보가 저장되었습니다.');
|
||||
closeMyPagePopup(); // ✅ 저장 성공 시 팝업 닫기
|
||||
// 필요 시 전체 새고: location.reload();
|
||||
} else {
|
||||
alert(res.message || '저장에 실패했습니다.');
|
||||
}
|
||||
},
|
||||
error(xhr){
|
||||
alert('서버 오류: ' + (xhr.statusText||'') + '\n' + (xhr.responseText||''));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// === 팝업 닫기 ===
|
||||
function closeMyPagePopup() {
|
||||
// 닫기 버튼이 자체 로직을 가지고 있으면 그걸 트리거하는 게 가장 안전
|
||||
const $closeBtn = $('#pop_mypage03 .btn_close');
|
||||
if ($closeBtn.length) {
|
||||
$closeBtn.trigger('click');
|
||||
} else {
|
||||
// 폴백: 직접 숨김 처리
|
||||
$('#pop_mypage03').hide();
|
||||
$('body').css('overflow','');
|
||||
}
|
||||
}
|
||||
|
||||
// === 이벤트 바인딩 ===
|
||||
// 입력칸 항상 편집 가능 + 버튼은 항상 "저장"
|
||||
$edit.prop('readonly', false);
|
||||
$btn.text('Save');
|
||||
|
||||
// 전화번호 입력 바인딩(중복 방지)
|
||||
$phone.off('.hp');
|
||||
let hpWarnedOnce = false;
|
||||
$phone
|
||||
.on('input.hp', function () {
|
||||
autoHyphen010(this);
|
||||
hpWarnedOnce = false; // 다시 입력하면 경고 플래그 해제
|
||||
})
|
||||
.on('paste.hp', function () {
|
||||
const el = this;
|
||||
setTimeout(function(){ autoHyphen010(el); hpWarnedOnce = false; }, 0);
|
||||
})
|
||||
.on('blur.hp', function () {
|
||||
const v = $(this).val().trim();
|
||||
if (v && !isValidPhone010(v) && !hpWarnedOnce) {
|
||||
hpWarnedOnce = true;
|
||||
alert('휴대전화번호는 010-1234-5678 형식으로 입력해 주세요.');
|
||||
setTimeout(() => { $phone.focus(); }, 0); // 즉시 focus는 blur 루프 유발
|
||||
}
|
||||
});
|
||||
|
||||
// 버튼: 바로 저장
|
||||
$btn.off('click.mypage').on('click.mypage', function (e) {
|
||||
e.preventDefault();
|
||||
// 저장 직전 최종 포맷 체크 (한 번 더)
|
||||
if (!isValidPhone010(($phone.val()||'').trim())) {
|
||||
alert('휴대전화번호는 010-1234-5678 형식으로 입력해 주세요.');
|
||||
$phone.focus();
|
||||
return;
|
||||
}
|
||||
saveProfile(); // ✅ 한 번 클릭으로 바로 저장
|
||||
});
|
||||
|
||||
// 탈퇴 버튼 클릭 → 삭제 함수 호출
|
||||
$(document).on('click', '#btn_delete_account', function(e){
|
||||
e.preventDefault();
|
||||
deleteDescopeUser();
|
||||
});
|
||||
|
||||
// === customAttributes 안전 접근 ===
|
||||
function ca(u, keys) {
|
||||
for (const k of keys) {
|
||||
const v = u && u.customAttributes && u.customAttributes[k];
|
||||
if (v !== undefined && v !== null && String(v).length) return v;
|
||||
}
|
||||
return '';
|
||||
}
|
||||
|
||||
// === 사용자 조회 ===
|
||||
function loadDescopeUser() {
|
||||
const loginId = sessionStorage.getItem('loginId');
|
||||
if (!loginId) {
|
||||
if (loginIdRetryCount < MAX_LOGINID_RETRY) {
|
||||
loginIdRetryCount++;
|
||||
return setTimeout(loadDescopeUser, 150 * Math.pow(2, loginIdRetryCount - 1));
|
||||
}
|
||||
return;
|
||||
}
|
||||
loginIdRetryCount = 0;
|
||||
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_user_search.php',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: { loginId },
|
||||
// timeout: 8000,
|
||||
success(res) {
|
||||
if (!(res.status === 'ok' && res.user)) { alert('사용자 정보를 불러올 수 없습니다.'); return; }
|
||||
const u = res.user;
|
||||
|
||||
const email = (u.loginIds && u.loginIds[0]) ? u.loginIds[0] : (u.email || loginId);
|
||||
$id.val(email);
|
||||
$name.val(u.name || '');
|
||||
$phone.val(u.phone || '');
|
||||
$pos.val(ca(u, ['position']) || '');
|
||||
|
||||
// 공통값
|
||||
$comp.val(ca(u, ['familyCompany','company']) || '');
|
||||
$team.val(ca(u, ['team']) || '');
|
||||
$empId.val(isInternal(email) ? (ca(u, ['familyUniqueKey','employeeId']) || '') : '');
|
||||
|
||||
// UI 분기
|
||||
applyTenantUI(email);
|
||||
|
||||
// 탈퇴용 ID 저장
|
||||
if (u.userId) sessionStorage.setItem('descopeUserId', u.userId);
|
||||
},
|
||||
error(xhr) {
|
||||
alert('서버 통신 오류: ' + (xhr.statusText || ''));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// === 외부에서 로그인 성공 시 호출됨 ===
|
||||
window.onLoginSuccess = function (loginId, sessionJwt, refreshJwt) {
|
||||
if (loginId) sessionStorage.setItem('loginId', loginId);
|
||||
if (sessionJwt) sessionStorage.setItem('sessionJwt', sessionJwt);
|
||||
if (refreshJwt) sessionStorage.setItem('refreshJwt', refreshJwt);
|
||||
loadDescopeUser();
|
||||
};
|
||||
|
||||
// === 팝업 표시될 때마다 갱신 ===
|
||||
const popupEl = document.getElementById('pop_mypage03');
|
||||
if (popupEl) {
|
||||
new MutationObserver((muts) => {
|
||||
muts.forEach((m) => {
|
||||
if (m.type === 'attributes' && (m.attributeName === 'style' || m.attributeName === 'class')) {
|
||||
const visible = $('#pop_mypage03').is(':visible') || $('#pop_mypage03').css('display') !== 'none';
|
||||
if (visible) {
|
||||
setTimeout(() => {
|
||||
loadDescopeUser();
|
||||
const email = getEmailFromUI();
|
||||
if (email) applyTenantUI(email);
|
||||
}, 50);
|
||||
}
|
||||
}
|
||||
});
|
||||
}).observe(popupEl, { attributes: true, attributeFilter: ['style','class'] });
|
||||
}
|
||||
|
||||
// === 최초 진입 ===
|
||||
document.addEventListener('DOMContentLoaded', loadDescopeUser);
|
||||
|
||||
// === 탈퇴 ===
|
||||
window.deleteDescopeUser = function () {
|
||||
// 폴백: sessionStorage → 입력칸
|
||||
const userId = sessionStorage.getItem('descopeUserId') || '';
|
||||
const uiLogin = ($('#show_mb_id').val() || '').trim();
|
||||
const loginId = sessionStorage.getItem('loginId') || uiLogin;
|
||||
|
||||
if (!userId && !loginId) return alert('대상 정보가 없습니다. 다시 로그인 후 시도해 주세요.');
|
||||
if (!confirm('Are you sure you want to delete your account? This action cannot be undone.')) return;
|
||||
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_user_delete.php',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: { userId, loginId },
|
||||
success(res) {
|
||||
if (res.status === 'ok') {
|
||||
alert('Your account has been successfully deleted.');
|
||||
// 🔑 sessionStorage 완전 초기화
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
location.reload();
|
||||
} else {
|
||||
alert('탈퇴 실패: ' + (res.message || '알 수 없는 오류'));
|
||||
}
|
||||
},
|
||||
error(xhr) {
|
||||
alert('서버 오류로 탈퇴 실패: ' + (xhr.statusText || ''));
|
||||
}
|
||||
});
|
||||
};
|
||||
})();
|
||||
</script>
|
||||
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
?>
|
||||
|
||||
|
||||
<link rel="stylesheet" href="<?php echo G5_URL ?>/css/style.css" />
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_join" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt="sdi"></div>
|
||||
</button>
|
||||
<!--popup_content-->
|
||||
<!-- 2025.07 디자인팀 수정 -->
|
||||
<!-- 03 사용자 인증 -->
|
||||
<!-- 왼쪽 "03 사용자 인증"에 on -->
|
||||
<fieldset style="display: none;">
|
||||
<!--tbl_wrap-->
|
||||
<div id="register_form" class="tbl_wrap">
|
||||
|
||||
<div class="guide_txt">
|
||||
<p>계정 생성이 완료되었습니다.</p>
|
||||
사용자 인증을 위해 <em>aaa@gmail.com</em> <br>아이디로 전송된 인증번호를 입력해 주세요.
|
||||
</div>
|
||||
<div class="verify_wrap">
|
||||
<div class="code_input">
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
</div>
|
||||
<div>
|
||||
<span class="important_msg h_6">인증번호 불일치</span>
|
||||
<button class="btn_send">인증번호 재전송 ⭮</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!--//tbl_wrap-->
|
||||
<div class="btn_confirm">
|
||||
<button type="submit" id="btn_submit_otp_sign_up" class="btn_submit" >인증하기</button>
|
||||
</div>
|
||||
<script>
|
||||
const inputs = document.querySelectorAll('.code-input input');
|
||||
|
||||
inputs.forEach((input, index) => {
|
||||
console.log('dd');
|
||||
input.addEventListener('input', (e) => {
|
||||
const value = e.target.value;
|
||||
if (!/^[0-9]$/.test(value)) {
|
||||
e.target.value = '';
|
||||
return;
|
||||
}
|
||||
if (value && index < inputs.length - 1) {
|
||||
inputs[index + 1].focus();
|
||||
}
|
||||
});
|
||||
|
||||
input.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Backspace' && !e.target.value && index > 0) {
|
||||
inputs[index - 1].focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</fieldset>
|
||||
<!-- //2025.07 디자인팀 수정-->
|
||||
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<!-- 회원가입결과 시작 { register-->
|
||||
<div id="pop_result" class="popup_wrap" style="display:none;">
|
||||
<p class="reg_result_p">
|
||||
<i class="fa fa-gift" aria-hidden="true"></i><br>
|
||||
<strong><?php echo get_text($mb['mb_name']); ?></strong>님의 회원가입을 진심으로 축하합니다.
|
||||
</p>
|
||||
|
||||
<?php if (is_use_email_certify()) { ?>
|
||||
<p class="result_txt">
|
||||
회원 가입 시 입력하신 이메일 주소로 인증메일이 발송되었습니다.<br>
|
||||
발송된 인증메일을 확인하신 후 인증처리를 하시면 사이트를 원활하게 이용하실 수 있습니다.
|
||||
</p>
|
||||
<div id="result_email">
|
||||
<span>아이디</span>
|
||||
<strong><?php echo $mb['mb_id'] ?></strong><br>
|
||||
<span>이메일 주소</span>
|
||||
<strong><?php echo $mb['mb_email'] ?></strong>
|
||||
</div>
|
||||
<p>
|
||||
이메일 주소를 잘못 입력하셨다면, 사이트 관리자에게 문의해주시기 바랍니다.
|
||||
</p>
|
||||
<?php } ?>
|
||||
<!-- } 회원가입결과 끝 -->
|
||||
<div class="btn_confirm_reg">
|
||||
<a href="<?php echo G5_URL ?>/" class="reg_btn_submit">메인으로</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
<!-- </div>
|
||||
</body> -->
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
$delete_str = "";
|
||||
if ($w == 'x') $delete_str = "댓";
|
||||
if ($w == 'u') $g5['title'] = $delete_str."글 수정";
|
||||
else if ($w == 'd' || $w == 'x') $g5['title'] = $delete_str."글 삭제";
|
||||
else $g5['title'] = $g5['title'];
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 비밀번호 확인 시작 { -->
|
||||
<div id="pw_confirm" class="mbskin">
|
||||
<h1><?php echo $g5['title'] ?></h1>
|
||||
<p>
|
||||
<?php if ($w == 'u') { ?>
|
||||
<strong>작성자만 글을 수정할 수 있습니다.</strong>
|
||||
작성자 본인이라면, 글 작성시 입력한 비밀번호를 입력하여 글을 수정할 수 있습니다.
|
||||
<?php } else if ($w == 'd' || $w == 'x') { ?>
|
||||
<strong>작성자만 글을 삭제할 수 있습니다.</strong>
|
||||
작성자 본인이라면, 글 작성시 입력한 비밀번호를 입력하여 글을 삭제할 수 있습니다.
|
||||
<?php } else { ?>
|
||||
<strong>비밀글 기능으로 보호된 글입니다.</strong>
|
||||
작성자와 관리자만 열람하실 수 있습니다.<br> 본인이라면 비밀번호를 입력하세요.
|
||||
<?php } ?>
|
||||
</p>
|
||||
|
||||
<form name="fboardpassword" action="<?php echo $action; ?>" method="post">
|
||||
<input type="hidden" name="w" value="<?php echo $w ?>">
|
||||
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
|
||||
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
|
||||
<input type="hidden" name="comment_id" value="<?php echo $comment_id ?>">
|
||||
<input type="hidden" name="sfl" value="<?php echo $sfl ?>">
|
||||
<input type="hidden" name="stx" value="<?php echo $stx ?>">
|
||||
<input type="hidden" name="page" value="<?php echo $page ?>">
|
||||
|
||||
<fieldset>
|
||||
<label for="pw_wr_password" class="sound_only">비밀번호<strong>필수</strong></label>
|
||||
<input type="password" name="wr_password" id="password_wr_password" required class="frm_input required" size="15" maxLength="20" placeholder="비밀번호">
|
||||
<input type="submit" value="확인" class="btn_submit">
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<!-- } 비밀번호 확인 끝 -->
|
||||
@@ -0,0 +1,404 @@
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_search" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close" onclick="$('#view_result').html('');">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
<!--popup_content-->
|
||||
<div class="popup_container search">
|
||||
<!--pop_join_left-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1">Reset <br>Password</h1>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 2025.07 다지인팀 수정 -->
|
||||
<!-- pop_join_right-->
|
||||
<div class="popup_contents_wrap" style="display: none;">
|
||||
<button class="btn_back" onclick="goLogin();">Login</button>
|
||||
<div class="tbl_wrap">
|
||||
<div class="guide_txt"><em>Please enter the ID </em>used to create your account.<br>A verification link will be sent to your address.</div>
|
||||
<div class="guide_txt"><em>(The verification link expires in 3 minutes.)</em></div>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="h_4">ID</th>
|
||||
<td>
|
||||
<div class="id_wrap">
|
||||
<input id="txt_name" type="text" placeholder="example@eg-bim.co.kr" required>
|
||||
</div>
|
||||
<!-- <span class="important_msg h_6">이메일 형식으로 작성</span> -->
|
||||
<p id="email_feedback" class="important_msg h_6" style="display:none; margin-top:4px;"></p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div class="join_btn_wrap">
|
||||
<button type="button" id="btn_id" onclick="ufn_btn_id_click();">Check ID</button>
|
||||
</div>
|
||||
<div class="inquiry">
|
||||
If you do not remember your account,<br class="brk"> please contact <em>baroncs@baroncs.co.kr</em>.
|
||||
</div>
|
||||
</div>
|
||||
<!--비밀번호 재설정 otp 입력 화면 -->
|
||||
<!-- <div class="popup_contents_wrap" style="_display: none;">
|
||||
<button class="btn_back">다른 아이디로 변경하기</button>
|
||||
<div id="register_form" class="tbl_wrap">
|
||||
<div class="guide_txt">
|
||||
사용자 인증을 위해 <em>aaa@gmail.com</em> <br>아이디로 전송된 인증번호를 입력해 주세요.
|
||||
</div>
|
||||
<div class="verify_wrap">
|
||||
<div class="code_input">
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
<input type="text" maxlength="1" inputmode="numeric" pattern="[0-9]*" />
|
||||
</div>
|
||||
<div>
|
||||
<span class="important_msg h_6">인증번호 불일치</span>
|
||||
<button class="btn_send">인증번호 재전송 ⭮</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="btn_confirm">
|
||||
<button type="submit" id="btn_submit" class="btn_submit" >인증하기</button>
|
||||
</div>
|
||||
<script>
|
||||
const inputs = document.querySelectorAll('.code-input input');
|
||||
|
||||
inputs.forEach((input, index) => {
|
||||
console.log('dd');
|
||||
input.addEventListener('input', (e) => {
|
||||
const value = e.target.value;
|
||||
if (!/^[0-9]$/.test(value)) {
|
||||
e.target.value = '';
|
||||
return;
|
||||
}
|
||||
if (value && index < inputs.length - 1) {
|
||||
inputs[index + 1].focus();
|
||||
}
|
||||
});
|
||||
|
||||
input.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Backspace' && !e.target.value && index > 0) {
|
||||
inputs[index - 1].focus();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</div> -->
|
||||
<div id="password_reset" class="popup_contents_wrap" style="display: none;">
|
||||
<div class="tbl_wrap">
|
||||
<!-- <div class="guide_txt">
|
||||
<em>${email}</em> 계정의 새 비밀번호를 입력하세요.
|
||||
</div> -->
|
||||
<div class="guide_txt">
|
||||
Please enter a new password.
|
||||
</div>
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th class="h_4">New PW</th>
|
||||
<td>
|
||||
<input type="password" id="pw_reset1" placeholder="Enter new password" autocomplete="new-password">
|
||||
<!-- 새 비밀번호 피드백 위치 -->
|
||||
<p id="pw_reset1_feedback" class="important_msg h_6" style="display:none; margin-top:4px;"></p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="h_4">Confirm PW</th>
|
||||
<td>
|
||||
<input type="password" id="pw_reset2" placeholder="Confirm password" autocomplete="new-password">
|
||||
<!-- 비밀번호 확인 피드백 위치 -->
|
||||
<p id="pw_reset2_feedback" class="important_msg h_6" style="display:none; margin-top:4px;"></p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
<p id="pw_reset_feedback" class="important_msg h_6" style="display:none;">
|
||||
비밀번호는 영문자 · 숫자 · 특수문자를 포함한 12자 이상이어야 합니다.
|
||||
</p>
|
||||
</div>
|
||||
<div class="join_btn_wrap">
|
||||
<button type="button" id="btn_pw_reset" onclick="resetPassword();">Reset Password</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--//pop_join_right-->
|
||||
|
||||
<!-- //2025.07 다지인팀 수정 -->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
<!--//popup_content-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
|
||||
|
||||
<script>
|
||||
// 이메일 유효성 정규식
|
||||
function isValidEmail(email) {
|
||||
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
||||
}
|
||||
|
||||
$('#txt_name').on('input', function() {
|
||||
const email = $(this).val().trim();
|
||||
const fb = $('#email_feedback');
|
||||
|
||||
if (!email) {
|
||||
fb.hide();
|
||||
$('#btn_id').prop('disabled', true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (isValidEmail(email)) {
|
||||
fb.text('This is a valid email format.').css('color', 'green').show();
|
||||
$('#btn_id').prop('disabled', false);
|
||||
} else {
|
||||
fb.text('Please enter a valid email address.').css('color', 'red').show();
|
||||
$('#btn_id').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
//비밀번호 재설정 인증링크 보내기
|
||||
$('#txt_name').on('input', function() {
|
||||
if ($(this).val().trim().length > 0) {
|
||||
$('#btn_id').prop('disabled', false);
|
||||
} else {
|
||||
$('#btn_id').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
function ufn_btn_id_click() {
|
||||
var email = $('#txt_name').val().trim();
|
||||
if (!email) {
|
||||
alert('이메일(아이디)을 입력하세요.');
|
||||
$('#txt_name').focus();
|
||||
return;
|
||||
}
|
||||
|
||||
// 비밀번호 재설정 메일 요청
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_send_otp.php', // PHP 처리 파일 경로에 맞게 수정
|
||||
method: 'POST',
|
||||
dataType: 'json',
|
||||
data: { email: email },
|
||||
success: function(res) {
|
||||
if (res.status === 'ok') {
|
||||
alert('A verification link has been sent to your email.');
|
||||
// 다음 스텝(OTP 입력창) show/hide 처리
|
||||
// 예시: $('#pop_reset_otp').show(); // 또는 다음 .popup_contents_wrap show
|
||||
} else {
|
||||
alert(res.message || '전송 실패');
|
||||
}
|
||||
},
|
||||
error: function(xhr) {
|
||||
alert('서버 통신 오류');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
//로그인 화면으로 돌아가기
|
||||
function goLogin() {
|
||||
// 전체 이동 (페이지로)
|
||||
// location.href = '/login.php';
|
||||
|
||||
// 팝업방식 (예시)
|
||||
$('#pop_search').hide();
|
||||
$('#pop_login').show();
|
||||
}
|
||||
|
||||
// //비밀번호 두 값이 모두 있을 경우에만 enabled
|
||||
// $('#pw_reset1, #pw_reset2').on('input', function() {
|
||||
// var pw1 = $('#pw_reset1').val();
|
||||
// var pw2 = $('#pw_reset2').val();
|
||||
// if (pw1.length > 0 && pw2.length > 0) {
|
||||
// $('#btn_pw_reset').prop('disabled', false);
|
||||
// } else {
|
||||
// $('#btn_pw_reset').prop('disabled', true);
|
||||
// }
|
||||
// });
|
||||
|
||||
// //비밀번호 재설정 업데이트
|
||||
// function resetPassword() {
|
||||
// var pw1 = $('#pw_reset1').val();
|
||||
// var pw2 = $('#pw_reset2').val();
|
||||
|
||||
// if (!pw1 || !pw2) {
|
||||
// alert('비밀번호를 모두 입력하세요.');
|
||||
// return;
|
||||
// }
|
||||
// if (pw1 !== pw2) {
|
||||
// alert('비밀번호가 일치하지 않습니다.');
|
||||
// return;
|
||||
// }
|
||||
|
||||
// // 쿼리스트링 t(토큰) 읽어서 같이 전송
|
||||
// var resetToken = new URLSearchParams(window.location.search).get('t');
|
||||
// var email = window.resetEmail || ''; // 상황에 따라 email 세팅
|
||||
// if (!resetToken) {
|
||||
// alert('유효하지 않은 접근입니다.');
|
||||
// return;
|
||||
// }
|
||||
|
||||
// $.ajax({
|
||||
// url: '/eng1/skin/member/basic/descope_reset_password.php',
|
||||
// type: 'POST',
|
||||
// dataType: 'json',
|
||||
// data: { email: email, password: pw1, token: resetToken },
|
||||
// success: function(res) {
|
||||
// if (res.status === 'ok') {
|
||||
// alert('비밀번호가 성공적으로 변경되었습니다!\n로그인해주세요.');
|
||||
// location.href = '/login.php';
|
||||
// } else {
|
||||
// alert(res.message || '비밀번호 변경 실패');
|
||||
// }
|
||||
// },
|
||||
// error: function(xhr) {
|
||||
// alert('통신 오류: ' + xhr.statusText);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
|
||||
let refreshJwt = '';
|
||||
let resetEmail = '';
|
||||
|
||||
$(document).ready(function () {
|
||||
// 1. URL에서 매직링크 토큰 추출 (t 파라미터)
|
||||
const resetToken = new URLSearchParams(window.location.search).get('t');
|
||||
if (!resetToken) return;
|
||||
|
||||
// 2. Magic Link 검증: 서버에 토큰을 보내서 refreshJwt, email 받아옴
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_verify_magiclink.php',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: { token: resetToken },
|
||||
success: function (res) {
|
||||
if (res.status === 'ok') {
|
||||
refreshJwt = res.refreshJwt;
|
||||
resetEmail = res.email;
|
||||
$('#password_reset').show(); // 비번입력창 보이기
|
||||
|
||||
// [추가] 인증 완료 alert를 한 번만 띄움
|
||||
if (!sessionStorage.getItem('verifiedAlertShown')) {
|
||||
alert('Verification completed');
|
||||
// alert(JSON.stringify(res, null, 2));
|
||||
sessionStorage.setItem('verifiedAlertShown', '1');
|
||||
}
|
||||
} else {
|
||||
alert(res.message || '링크 인증 실패');
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
alert('서버 통신 오류');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 비밀번호 두 값이 모두 있을 경우에만 enabled
|
||||
$('#pw_reset1, #pw_reset2').on('input', function () {
|
||||
var pw1 = $('#pw_reset1').val();
|
||||
var pw2 = $('#pw_reset2').val();
|
||||
$('#btn_pw_reset').prop('disabled', pw1.length === 0 || pw2.length === 0);
|
||||
});
|
||||
|
||||
// 비밀번호 재설정
|
||||
function resetPassword() {
|
||||
var pw1 = $('#pw_reset1').val();
|
||||
var pw2 = $('#pw_reset2').val();
|
||||
if (!pw1 || !pw2) return alert('비밀번호를 모두 입력하세요.');
|
||||
if (pw1 !== pw2) return alert('Passwords do not match.');
|
||||
if (!refreshJwt || !resetEmail) return alert('인증 세션이 만료되었습니다. 다시 시도해 주세요.');
|
||||
|
||||
$.ajax({
|
||||
url: '/eng/skin/member/basic/descope_reset_password.php',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
email: resetEmail,
|
||||
password: pw1,
|
||||
refreshJwt: refreshJwt
|
||||
},
|
||||
success: function (res) {
|
||||
// alert(res);
|
||||
if (res.status === 'ok') {
|
||||
alert('비밀번호가 성공적으로 변경되었습니다!\n로그인해주세요.');
|
||||
location.href = 'https://eg-bim.co.kr/eng/index.php';
|
||||
} else {
|
||||
alert(res.message + '비밀번호 변경 실패');
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
alert('서버 통신 오류');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// (기존 validatePassword 함수가 없다면 추가)
|
||||
function validatePassword(pw) {
|
||||
if (pw.length < 12) return { ok: false, reason: 'Please enter at least 12 characters.' };
|
||||
if (!/[A-Za-z]/.test(pw)) return { ok: false, reason: 'Please include at least one letter.' };
|
||||
if (!/[0-9]/.test(pw)) return { ok: false, reason: 'Please include at least one number.' };
|
||||
if (!/[!@#$%^&*(),.\[\]{}\\\/~`_+\-=\|;:'"<>\?]/.test(pw))
|
||||
return { ok: false, reason: 'Please include at least one special character.' };
|
||||
return { ok: true };
|
||||
}
|
||||
|
||||
|
||||
// 실시간 피드백
|
||||
$('#pw_reset1').on('input', function() {
|
||||
const pw1 = $(this).val().trim();
|
||||
const fb1 = $('#pw_reset1_feedback');
|
||||
const check = validatePassword(pw1);
|
||||
|
||||
if (!pw1) {
|
||||
fb1.hide();
|
||||
} else if (!check.ok) {
|
||||
fb1.text(check.reason).show();
|
||||
} else {
|
||||
fb1.hide();
|
||||
}
|
||||
|
||||
// 버튼 활성화 토글은 아래에서 처리
|
||||
toggleResetButton();
|
||||
});
|
||||
|
||||
$('#pw_reset2').on('input', function() {
|
||||
const pw1 = $('#pw_reset1').val().trim();
|
||||
const pw2 = $(this).val().trim();
|
||||
const fb2 = $('#pw_reset2_feedback');
|
||||
|
||||
if (!pw2) {
|
||||
fb2.hide();
|
||||
} else if (pw1 !== pw2) {
|
||||
fb2.text('Passwords do not match.').show();
|
||||
} else {
|
||||
fb2.hide();
|
||||
}
|
||||
|
||||
toggleResetButton();
|
||||
});
|
||||
|
||||
// 버튼 활성화/비활성화 함수
|
||||
function toggleResetButton() {
|
||||
const pw1 = $('#pw_reset1').val().trim();
|
||||
const pw2 = $('#pw_reset2').val().trim();
|
||||
const check = validatePassword(pw1);
|
||||
const ok = pw1 && pw2 && check.ok && (pw1 === pw2);
|
||||
$('#btn_pw_reset').prop('disabled', !ok);
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="' . $member_skin_url . '/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 비밀번호 재설정 시작 { -->
|
||||
<div id="pw_reset" class="new_win">
|
||||
<div class="new_win_con">
|
||||
<form name="fpasswordreset" action="<?php echo $action_url; ?>" onsubmit="return fpasswordreset_submit(this);" method="post" autocomplete="off">
|
||||
<fieldset id="info_fs">
|
||||
<p>새로운 비밀번호를 입력해주세요.</p>
|
||||
<label for="mb_id" class="sound_only">아이디</label>
|
||||
<br>
|
||||
<b>회원 아이디 : <?php echo get_text($_POST['mb_id']); ?></b>
|
||||
<label for="mb_pw" class="sound_only">새 비밀번호<strong class="sound_only">필수</strong></label>
|
||||
<input type="password" name="mb_password" id="mb_pw" required class="required frm_input full_input" size="30" placeholder="새 비밀번호">
|
||||
<label for="mb_pw2" class="sound_only">새 비밀번호 확인<strong class="sound_only">필수</strong></label>
|
||||
<input type="password" name="mb_password_re" id="mb_pw2" required class="required frm_input full_input" size="30" placeholder="새 비밀번호 확인">
|
||||
</fieldset>
|
||||
<div class="win_btn">
|
||||
<button type="submit" class="btn_submit">확인</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function fpasswordreset_submit(f) {
|
||||
if ($("#mb_pw").val() == $("#mb_pw2").val()) {
|
||||
alert("비밀번호 변경되었습니다. 다시 로그인해 주세요.");
|
||||
} else {
|
||||
alert("새 비밀번호와 비밀번호 확인이 일치하지 않습니다.");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- } 비밀번호 재설정 끝 -->
|
||||
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<div id="point" class="new_win">
|
||||
<h1 id="win_title"><?php echo $g5['title'] ?></h1>
|
||||
|
||||
<div class="new_win_con2">
|
||||
<ul class="point_all">
|
||||
<li class="full_li">
|
||||
보유포인트
|
||||
<span><?php echo number_format($member['mb_point']); ?></span>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="point_list">
|
||||
<?php
|
||||
$sum_point1 = $sum_point2 = $sum_point3 = 0;
|
||||
|
||||
$i = 0;
|
||||
foreach((array) $list as $row){
|
||||
$point1 = $point2 = 0;
|
||||
$point_use_class = '';
|
||||
if ($row['po_point'] > 0) {
|
||||
$point1 = '+' .number_format($row['po_point']);
|
||||
$sum_point1 += $row['po_point'];
|
||||
} else {
|
||||
$point2 = number_format($row['po_point']);
|
||||
$sum_point2 += $row['po_point'];
|
||||
$point_use_class = 'point_use';
|
||||
}
|
||||
|
||||
$po_content = $row['po_content'];
|
||||
|
||||
$expr = '';
|
||||
if($row['po_expired'] == 1)
|
||||
$expr = ' txt_expired';
|
||||
?>
|
||||
<li class="<?php echo $point_use_class; ?>">
|
||||
<div class="point_top">
|
||||
<span class="point_tit"><?php echo $po_content; ?></span>
|
||||
<span class="point_num"><?php if ($point1) echo $point1; else echo $point2; ?></span>
|
||||
</div>
|
||||
<span class="point_date1"><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $row['po_datetime']; ?></span>
|
||||
<span class="point_date<?php echo $expr; ?>">
|
||||
<?php if ($row['po_expired'] == 1) { ?>
|
||||
만료 <?php echo substr(str_replace('-', '', $row['po_expire_date']), 2); ?>
|
||||
<?php } else echo $row['po_expire_date'] == '9999-12-31' ? ' ' : $row['po_expire_date']; ?>
|
||||
</span>
|
||||
</li>
|
||||
<?php
|
||||
$i++;
|
||||
} // end foreach
|
||||
|
||||
if ($i == 0)
|
||||
echo '<li class="empty_li">자료가 없습니다.</li>';
|
||||
else {
|
||||
if ($sum_point1 > 0)
|
||||
$sum_point1 = "+" . number_format($sum_point1);
|
||||
$sum_point2 = number_format($sum_point2);
|
||||
}
|
||||
?>
|
||||
|
||||
<li class="point_status">
|
||||
소계
|
||||
<span><?php echo $sum_point1; ?></span>
|
||||
<span><?php echo $sum_point2; ?></span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<?php echo get_paging(G5_IS_MOBILE ? $config['cf_mobile_pages'] : $config['cf_write_pages'], $page, $total_page, $_SERVER['SCRIPT_NAME'].'?'.$qstr.'&page='); ?>
|
||||
|
||||
<button type="button" onclick="javascript:window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
@@ -0,0 +1,608 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
|
||||
function gtag() {
|
||||
dataLayer.push(arguments);
|
||||
}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>주요기능</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css" />
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/primary.js"></script>
|
||||
<script>
|
||||
function goto(id) {
|
||||
console.log('로그발생');
|
||||
document.getElementById(id).scrollIntoView({
|
||||
behavior: "instant"
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- "js__"로 시작하는 클래스는 only 자바스크립트용입니다. -->
|
||||
<!-- XXXX js__넣어서 css 작성 금지 XXXX -->
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<!-- 컨텐츠 시작 -->
|
||||
<div class="container primary">
|
||||
<div class="mouse_mark js__mouse_mark" style="display:none"><span>SCROLL</span></div>
|
||||
<section class="intro">
|
||||
<div class="top js__dark">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Key Features</h2>
|
||||
<span>Packed with diverse tools for easy and efficient work</span>
|
||||
</div>
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj k"></i>
|
||||
<span>Commands are grouped by function and<br><br class="brk"> organized into pages for easy viewing.</span>
|
||||
<p>EG-BIM includes over a thousand features and commands,<br> structured by function to help users easily find and use the tools they need.</p>
|
||||
</div>
|
||||
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
|
||||
<div class="dia_circles_wrap">
|
||||
<div class="circle_core"><span>View<br>All Commands</span></div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dia_element e01">
|
||||
<i></i>
|
||||
<span class="dia_tit">Display/Utility Functions<br><em>My Setting</em></span>
|
||||
</div>
|
||||
<div class="dia_element e02">
|
||||
<i></i>
|
||||
<span class="dia_tit">Draw/Edit +<br class="brk"> Field-Specific<br class="brk"> Commands<br><em>Command Group</em></span>
|
||||
</div>
|
||||
<div class="dia_element e03">
|
||||
<i></i>
|
||||
<span class="dia_tit"><em>for Civil</em><br>Specialized<br class="brk">Commands</span>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<section class="route js__mouse_area">
|
||||
<div class="fix">
|
||||
<ul class="subs">
|
||||
<li>
|
||||
<span class="sub_tit">Customize Your Workspace Style</span>
|
||||
<span class="mid_tit">My Setting</span>
|
||||
<span class="sub_text">
|
||||
Configure basic settings such as workspace colors and mouse functions,<br> as well as grid and snap options. Frequently used ON/OFF items are organized into <br> separate pages for quick access during work.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">Built-in Draw / Edit + Field-Specific Commands</span>
|
||||
<span class="mid_tit"><em>Cmd Groups</em></span>
|
||||
<span class="sub_text">
|
||||
Provides a wide range of commands grouped by function—<br> such as drawing and editing— and includes field-specific specialized commands <br>that are built in by default for efficient work.
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="sub_tit">For Road and Structural Design Drawings</span>
|
||||
<span class="mid_tit"><em>for Civil</em></span>
|
||||
<span class="sub_text">
|
||||
Provides commands for road and structural design drawings, including road alignment and<br> cross-section tasks in the road design field, and rebar arrangement, reinforcement detailing,<br> and quantity table work in the structural field.
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="content">
|
||||
<!-- <div class="scroll_m">SCROLL</div> -->
|
||||
<ul class="tabs js__mouse_not">
|
||||
<li class="tabs_li"><a onclick="window.goto('sec1')">
|
||||
<b>My Setting</b>
|
||||
<ul>
|
||||
<li>Display</li>
|
||||
<li>Support Features</li>
|
||||
</ul>
|
||||
</a></li>
|
||||
<li class="tabs_li"><a onclick="window.goto('sec2')">
|
||||
<b>Command</b>
|
||||
<ul>
|
||||
<li>Geometry</li>
|
||||
<li>Modify</li>
|
||||
<li>Edit</li>
|
||||
<li>Text</li>
|
||||
<li>Dimension</li>
|
||||
<li>Block</li>
|
||||
<li>Layer</li>
|
||||
<li>View</li>
|
||||
<li>Query/Selection</li>
|
||||
</ul>
|
||||
</a></li>
|
||||
<li class="tabs_li"><a onclick="window.goto('sec3')">
|
||||
<b>for Civil</b>
|
||||
<ul>
|
||||
<li>Civil/Road</li>
|
||||
<li>Structure</li>
|
||||
</ul>
|
||||
</a></li>
|
||||
</ul>
|
||||
<ul class="imgs">
|
||||
<li><a><img src="<?php echo eng_img_url('primary_route_01.png'); ?>" alt=""></a></li>
|
||||
<li><a><img src="<?php echo eng_img_url('primary_route_02.png'); ?>" alt=""></a></li>
|
||||
<li><a><img src="<?php echo eng_img_url('primary_route_03.png'); ?>" alt=""></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sec1"></div>
|
||||
<div id="sec2"></div>
|
||||
<div id="sec3"></div>
|
||||
</section>
|
||||
<section class="layout_fix_left process">
|
||||
<div class="left" data-aos="fade-right" data-aos-duration="1000" data-aos-offest="-180">
|
||||
<div class="bg js__fixLeft_bg on"></div>
|
||||
<div class="bg js__fixLeft_bg"></div>
|
||||
<div class="bg js__fixLeft_bg"></div>
|
||||
<span class="mid_tit js__fixLeft_tit on">
|
||||
<font class="num">01. </font><em>Style Detail Window</em>
|
||||
</span>
|
||||
<span class="mid_tit js__fixLeft_tit">
|
||||
<font class="num">02. </font><em>Block Window</em>
|
||||
</span>
|
||||
<span class="mid_tit js__fixLeft_tit">
|
||||
<font class="num">03. </font><em>Plot Window</em>
|
||||
</span>
|
||||
</div>
|
||||
<div class="right js__fixLeft_secs">
|
||||
<span class="mid_tit m" style="display: none;">
|
||||
<font class="num">01. </font>Style Detail Window
|
||||
</span>
|
||||
<div id="content1" class="style">
|
||||
<span class="sub_tit">
|
||||
Creation and Editing of Line, Text, and Dimension Styles
|
||||
</span>
|
||||
<div class="sub_text">
|
||||
Shows the list of current styles with detailed previews and all adjustable options, and provides functions to create new styles or edit existing ones.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('style_img_01.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<b>Line Style</b>
|
||||
<ul>
|
||||
<li>Combine line types, blocks, and text to build custom line styles</li>
|
||||
<li>Set spacings for lines, blocks, and text in the preview panel</li>
|
||||
<li>Provides Construction CALS standard line types</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('style_img_02.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<b>Text Style</b>
|
||||
<ul>
|
||||
<li>Groups available fonts for easy selection</li>
|
||||
<li>Set size, slant, and shape options in the preview panel</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<img src="<?php echo eng_img_url('style_img_03.png'); ?>" alt="">
|
||||
</div>
|
||||
<div class="text">
|
||||
<b>Dimension Style</b>
|
||||
<ul>
|
||||
<li>Offers detailed, categorized options for dimension lines and values</li>
|
||||
<li>Presents options with images for better understanding</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="mid_tit m" style="display: none;">
|
||||
<font class="num">02. </font>Block Window
|
||||
</span>
|
||||
<div id="content2" class="block">
|
||||
<span class="sub_tit">
|
||||
Integrated Block Window with Block Library for Efficient Work
|
||||
</span>
|
||||
<div class="sub_text">
|
||||
<span>
|
||||
Provides an integrated block management window that allows users to easily find various types of blocks in a library format, and to manage block creation, property review, and modification within a single interface.
|
||||
</span>
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<div class="fig01"><span>Block Library</span></div>
|
||||
<div class="fig02"><span>Block Window</span></div>
|
||||
<i></i>
|
||||
</div>
|
||||
<div class="text">
|
||||
<b>Block Library Connection</b>
|
||||
<ul>
|
||||
<li>Manage and edit general blocks, attribute blocks, and external reference blocks within one unified window</li>
|
||||
<li>Easily search and add desired blocks by linking to the block library</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="mid_tit m" style="display: none;">
|
||||
<font class="num">03. </font>Plot Window
|
||||
</span>
|
||||
<div id="content3" class="print_area">
|
||||
<span class="sub_tit">
|
||||
Convenient Batch Plotting with Automatic Border Recognition
|
||||
</span>
|
||||
<div class="sub_text">
|
||||
Automatically detects drawing borders, allowing multiple sheets or long drawings to be plotted at once without manually defining plot areas.
|
||||
</div>
|
||||
<div class="sub_figs">
|
||||
<div class="imgs">
|
||||
<div class="fig01"><span>Multiple Sheet Plot</span></div>
|
||||
<div class="fig02"><span>Long Drawing Plot</span></div>
|
||||
</div>
|
||||
<div class="text">
|
||||
<b>Automatic Plot Area and Scale Recognition</b>
|
||||
<ul>
|
||||
<li>Automatically detects and sets plot areas without the need for manual adjustment or paper-length resizing</li>
|
||||
<li>Supports batch plotting of multiple drawings or long sheets through border recognition</li>
|
||||
<li>User-defined blocks can also be designated as plot areas</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- //컨텐츠 시작 -->
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time) => {
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -0,0 +1,514 @@
|
||||
<?php
|
||||
|
||||
?>
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div class="popup_wrap" id="pop_privacy">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt=""></div>
|
||||
</button>
|
||||
<!--popup_wrap-->
|
||||
<div class="popup_container privacy">
|
||||
<div class="contents_wrap">
|
||||
<ul class="tab_wrap">
|
||||
<li class="tab_privacy on"><span>Privacy Policy</span></li>
|
||||
<li class="tab_agreement"><span>Terms of Service</span></li>
|
||||
</ul>
|
||||
<div class="content pri show">
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 1. Purpose</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Baron Consultant (“the Company”) has established this Privacy Policy to protect the personal information of customers (“Users”) who use the EG-BIM service (“the Service”) and to fulfill its responsibilities and obligations pursuant to the Personal Information Protection Act. This Policy explains how the personal information provided by Users is collected, used, stored, and protected.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 2. Purpose of Processing Personal Information</span>
|
||||
<ul class="list_2">
|
||||
<li>
|
||||
The Company processes personal information for the following purposes. Personal information processed by the Company will not be used for purposes other than those listed below. If the purpose of use changes, the Company will take necessary measures such as obtaining separate consent pursuant to Article 18 of the Personal Information Protection Act.
|
||||
<ul class="list_3">
|
||||
<li>Identity Verification: User verification for membership registration and management, contact via phone or email</li>
|
||||
<li>ervice Provision: Notifications and operational tasks necessary for providing services</li>
|
||||
<li>Product Brochure Download: Delivery of informational materials</li>
|
||||
<li>Consultation & Demo Requests: Providing consultations, demos, and collecting information for contract processing</li>
|
||||
<li>Event Registration: Sending attendance notices and providing seminars/explanations/training</li>
|
||||
<li>Security Guide Delivery: Providing guidance materials</li>
|
||||
<li>Technical Support Inquiries: Supporting service usage</li>
|
||||
<li>Service Improvement Feedback: Improving service quality</li>
|
||||
<li>Marketing Activities: Sending newsletters or magazines to Users who have agreed to receive them</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 3. Processing and Retention Period of Personal Information</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company keeps and retains personal information within the legally required period or within the period consented to by the User at the time of collection.</li>
|
||||
<li>
|
||||
Retention periods are as follows:
|
||||
<ul class="list_3">
|
||||
<li>Member Information: From registration until 1 year after membership withdrawal</li>
|
||||
<li>Information for promotion, consultation, and contract processing: 2 years</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 4. Provision of Personal Information to Third Parties</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company processes personal information only within the scope stated in Article 2. Personal information is provided to third parties only in cases that fall under Articles 17 and 18 of the Personal Information Protection Act, such as with the User’s consent or when required by law.</li>
|
||||
<li>
|
||||
Personal Information Provided to Third Parties:
|
||||
<ul class="list_3">
|
||||
<li>Recipients: Investigative agencies, related public institutions, reported entities</li>
|
||||
<li>Purpose: Handling complaints related to personal information breaches</li>
|
||||
<li>Provided Items: Name, contact number, email</li>
|
||||
<li>Retention Period: As required by law or until the purpose is achieved</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 5. Outsourcing of Personal Information Processing</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company does not outsource the processing of personal information to external service providers.</li>
|
||||
<li>If outsourcing becomes necessary (e.g., recruitment-related tasks), the Company will notify Users on its website and obtain consent prior to outsourcing.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 6. Rights and Obligations of Data Subjects and Exercise Methods</span>
|
||||
<ul class="list_2">
|
||||
<li>Users may exercise the following rights regarding their personal information at any time: Access, correction, deletion, and suspension of processing.</li>
|
||||
<li>
|
||||
Rights may be exercised through the following methods:
|
||||
<ul class="list_3">
|
||||
<li>Written Request: To the Company’s physical address</li>
|
||||
<li>Email Request: Via the Company’s email</li>
|
||||
<li>FAX Request: Via the Company’s fax number</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Rights may also be exercised through a legal representative or authorized agent. In such cases, the designated authorization form (Appendix Form No. 11 of the Enforcement Rules of the Personal Information Protection Act) must be submitted.</li>
|
||||
<li>Requests for access or suspension may be restricted under Articles 35(4) and 37(2) of the Personal Information Protection Act.</li>
|
||||
<li>Requests for correction or deletion may be restricted if required by other legislation.</li>
|
||||
<li>The Company verifies whether the requester is the User or a legitimate representative.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 7. Items of Personal Information Processed</span>
|
||||
<ul class="list_2">
|
||||
<li>
|
||||
The Company processes the following personal information:
|
||||
<ul class="list_3">
|
||||
<li>Required Items: Name, mobile phone number, email</li>
|
||||
<li>Optional Items: Company phone number, inquiry details</li>
|
||||
<li>Collection Method: Website, phone, email</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 8. Destruction of Personal Information</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company destroys personal information without delay when the retention period expires or when the processing purpose is achieved.</li>
|
||||
<li>
|
||||
If the information must be preserved under another law, it will be stored separately in a different database or physical location.
|
||||
<ul class="list_3">
|
||||
<li>Destruction Procedure: The Company selects the personal information subject to destruction and obtains approval from the Personal Information Protection Officer before destruction.</li>
|
||||
<li>Destruction Methods: Electronic files: Permanently deleted using irreversible technical methods, Paper documents: Shredded or incinerated</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 9. Measures to Ensure the Security of Personal Information</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company takes the following measures to protect personal information:
|
||||
<ul class="list_3">
|
||||
<li>Administrative Measures: Internal management plan, regular employee training</li>
|
||||
<li>Technical Measures: Access control, access authority management, encryption of unique identifiers, security program installation</li>
|
||||
<li>Physical Measures: Restricted access to server rooms and data storage rooms</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 10. Installation and Operation of Automatic Personal Information Collection Tools</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company does not use cookies. Cookies store User information on a browser, but EG-BIM does not use such technology.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 11. Personal Information Protection Officer</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company appoints a Personal Information Protection Officer responsible for handling and managing User complaints and ensuring personal information protection.</li>
|
||||
<li>Personal Information Protection Officer:
|
||||
<ul class="list_3">
|
||||
<li>Name: Seungho Yeom</li>
|
||||
<li>Position: Senior Researcher</li>
|
||||
<li>Num: +82-2-2141-7448</li>
|
||||
<li>Fax: +82-2-2141-7599</li>
|
||||
<li>Email: b23008@baroncs.co.kr</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 12. Request for Access to Personal Information</span>
|
||||
<ul class="list_2">
|
||||
<li>Users may request access to their personal information under Article 35 of the Personal Information Protection Act.</li>
|
||||
<li>Department Handling Access Requests:
|
||||
<ul class="list_3">
|
||||
<li>Department: General Planning Office</li>
|
||||
<li>Contact Person: Hyukjin Kwon</li>
|
||||
<li>Num: +82-2-2141-7465</li>
|
||||
<li>Fax: +82-2-2141-7599</li>
|
||||
<li>Email: baroncs@baroncs.co.kr</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 13. Remedies for Rights Violations</span>
|
||||
<ul class="list_2">
|
||||
<li>
|
||||
Users may seek dispute resolution or consultation from the following organizations:
|
||||
<ul class="list_3">
|
||||
<li>Personal Information Dispute Mediation Committee: 1833-6972 (www.kopico.go.kr)</li>
|
||||
<li>Korea Internet & Security Agency (KISA) Privacy Center: 118 (privacy.kisa.or.kr)</li>
|
||||
<li>Supreme Prosecutors’ Office: 1301 (www.spo.go.kr)</li>
|
||||
<li>Fax: +82-2-408-1927</li>
|
||||
<li>Police Agency: 182 (www.police.go.kr)</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Article 14. Changes to the Privacy Policy</span>
|
||||
<ul class="list_2">
|
||||
<li>The Company will notify Users at least 7 days before making any additions, deletions, or modifications due to changes in laws, policies, or security technologies.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Addenda</span>
|
||||
<ul class="list_2">
|
||||
<li>Article 1 (Effective Date)
|
||||
<ul class="list_3">
|
||||
<li>This Privacy Policy takes effect on October 1, 2024.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 2 (Duty to Notify Revisions)
|
||||
<ul class="list_3">
|
||||
<li>If the Privacy Policy is amended, the Company will notify Users via the Service notice page at least 7 days prior to the effective date. If significant changes are made that affect Users’ rights or obligations, notice will be given at least 30 days in advance.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 3 (Validity)
|
||||
<ul class="list_3">
|
||||
<li>If any provision of this Privacy Policy is deemed invalid or unenforceable, the remaining provisions shall remain in effect. Invalid provisions will be modified to comply with relevant laws.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 4 (Notification Methods)<br>
|
||||
The Company may notify Users of Privacy Policy changes through:
|
||||
<ul class="list_3">
|
||||
<li>Service home screen or popup</li>
|
||||
<li>Email</li>
|
||||
<li>Company website notice page</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 5 (Protection of Non-member Personal Information)
|
||||
<ul class="list_3">
|
||||
<li>The Company protects the personal information of non-members at the same level as members. Service access may be limited if a non-member refuses to provide necessary information.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 6 (Protection of Personal Information of Children Under 14)
|
||||
<ul class="list_3">
|
||||
<li>The Company does not collect personal information from children under 14. If such information is collected, consent from a legal guardian is required. If collected without consent, it will be destroyed without delay.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 7 (International Transfer of Personal Information)
|
||||
<ul class="list_3">
|
||||
<li>The Company does not transfer personal information overseas. If such transfer becomes necessary, prior consent will be obtained from Users.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 8 (Other Matters)
|
||||
<ul class="list_3">
|
||||
<li>Matters not specified in this Policy follow the Company’s internal policies and related laws.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="content agr">
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 1. General Provisions</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 1 (Purpose)
|
||||
<ul class="list_3">
|
||||
<li>These Terms of Service (“Terms”) set forth the rights, obligations, and responsibilities between Baron Consultant (“the Company”) and users (“Users”) when using the EG-BIM software (“the Service”), as well as other necessary matters related to the use of the Service.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 2 (Definitions)<br>
|
||||
The terms used in these Terms are defined as follows:
|
||||
<ul class="list_3">
|
||||
<li>“Service” refers to the software and all related services provided by the Company.</li>
|
||||
<li>“User” refers to both members and non-members who access the Service and use it according to these Terms.</li>
|
||||
<li>“Member” refers to a person who agrees to these Terms, signs a service agreement with the Company, and gains access to member services.</li>
|
||||
<li>“Non-member” refers to a person who uses part of the Service without creating a member account.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 3 (Effect and Amendment of the Terms)<br>
|
||||
<ul class="list_3">
|
||||
<li>These Terms take effect when the User agrees to them and the Company accepts the User’s application to use the Service.</li>
|
||||
<li>The Company may amend these Terms if necessary. Amended Terms will take effect once posted on the Service’s notice page.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 4 (Matters Not Specified in the Terms)
|
||||
<ul class="list_3">
|
||||
<li>Any matters not specified in these Terms shall be governed by the relevant laws and general practices of the Republic of Korea.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 2. Service Use Agreement</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 5 (Formation of the Service Agreement)
|
||||
<ul class="list_3">
|
||||
<li>A service agreement is formed when the User agrees to the Terms, completes the membership application form provided by the Company, and the Company approves the application.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 6 (Reservation or Refusal of Agreement)<br>
|
||||
The Company may hold off or deny approval of a service agreement in the following cases:
|
||||
<ul class="list_3">
|
||||
<li>If the information provided in the application is found to be false</li>
|
||||
<li>If providing the Service is technically difficult</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 7 (Changes to User Information)<br>
|
||||
<ul class="list_3">
|
||||
<li>Members may access and modify their personal information at any time through the account management menu. Members must immediately update any changes, and the Company is not responsible for any issues arising from failure to update such information.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Chapter 3. Personal Information Protection</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 8 (Principles of Personal Information Protection)
|
||||
<ul class="list_3">
|
||||
<li>The personal information of Members is protected in accordance with the relevant laws.</li>
|
||||
<li>The Company maintains personal information in accordance with a separate Privacy Policy, which Users may review at any time.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 9 (Compliance with Privacy Policy)
|
||||
<ul class="list_3">
|
||||
<li>The Company handles all matters related to the collection, use, provision, retention, and protection of personal information according to its Privacy Policy.</li>
|
||||
<li>Users may check the Privacy Policy on the Company’s website.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 10 (Protection of Personal Information of Children Under 14)<br>
|
||||
<ul class="list_3">
|
||||
<li>If the Company collects personal information from children under the age of 14, the consent of a legal guardian is required.</li>
|
||||
<li>Guardians may request access, correction, or deletion of the child’s information, and the Company will process such requests promptly.</li>
|
||||
<li>Specific details are provided in the Privacy Policy.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Chapter 4. Provision and Use of the Service</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 11 (Provision of the Service)
|
||||
<ul class="list_3">
|
||||
<li>The Company begins providing the Service once the Member’s application has been approved. The Service is available 24 hours a day, year-round, unless otherwise specified.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 12 (Changes and Suspension of the Service)
|
||||
<ul class="list_3">
|
||||
<li>The Company may change or suspend part or all of the Service after prior notice if providing the Service becomes difficult.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Chapter 5. Information and Advertising</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 13 (Information and Advertising)
|
||||
<ul class="list_3">
|
||||
<li>The Company may provide information and advertising deemed necessary during the use of the Service.</li>
|
||||
<li>Members may refuse to receive unwanted information.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 6. Management of Posts</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 14 (Management of Posts)
|
||||
<ul class="list_3">
|
||||
<li>The Company may delete any content posted by a Member if it is illegal or violates these Terms.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 15 (Copyright of Posts)
|
||||
<ul class="list_3">
|
||||
<li>The copyright of posts belongs to the Member. The Company may use the posts for service promotion and improvement.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 7. Termination and Restrictions</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 16 (Termination of Agreement)
|
||||
<ul class="list_3">
|
||||
<li>Members may request termination of the agreement at any time, and the Company will process the request promptly.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 17 (Restrictions on Use)
|
||||
<ul class="list_3">
|
||||
<li>The Company may restrict a Member’s access to the Service if the Member violates these Terms.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 8. Liability and Disclaimer</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 18 (Liability for Damages)
|
||||
<ul class="list_3">
|
||||
<li>The Company is not liable for damages arising from the use of free services.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 19 (Disclaimer)
|
||||
<ul class="list_3">
|
||||
<li>The Company is not liable for service interruption caused by natural disasters or other unavoidable circumstances.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 9. Paid Services</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 20 (Use of Paid Services)
|
||||
<ul class="list_3">
|
||||
<li>The Company may provide certain services for a fee.</li>
|
||||
<li>Details regarding fees, payment methods, and refund procedures will be specified on the Service information page and payment screen.</li>
|
||||
<li>Fees must be paid using one of the payment methods provided by the Company.</li>
|
||||
<li>Paid services operate on a prepaid basis; refunds for remaining service periods follow the Company’s refund policy.</li>
|
||||
<li>The Company will make reasonable efforts to resolve issues arising from the use of paid services. However, unless caused by the Company’s intent or gross negligence, the Company is not liable for damages incurred during use.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 21 (Refund Policy)
|
||||
<ul class="list_3">
|
||||
<li>Members may receive a full refund if they have not started using the service within 7 days of payment.</li>
|
||||
<li>If the service is suspended for unavoidable reasons, the Company will refund the unused portion.</li>
|
||||
<li>Refunds are not available if service suspension results from the Member’s fault.</li>
|
||||
<li>Refunds are processed to the designated account within 7 days of the request.</li>
|
||||
</ul>
|
||||
<li>
|
||||
<li>Article 22 (Suspension and Termination of Paid Services)
|
||||
<ul class="list_3">
|
||||
<li>Members wishing to terminate paid services must file a cancellation request to the customer support center.</li>
|
||||
<li>The Company may suspend or terminate paid service use immediately if the Member violates these Terms or uses the service fraudulently.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li>
|
||||
<span class="tit">Chapter 10. Prohibition of Transfer</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 23 (Prohibition of Transfer)
|
||||
<ul class="list_3">
|
||||
<li>Members may not transfer, assign, or provide as collateral their service usage rights or contractual status to any third party.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Chapter 11. Governing Law and Jurisdiction</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>Article 24 (Dispute Resolution)
|
||||
<ul class="list_3">
|
||||
<li>In the event of a dispute related to the Service, the Company and the Member shall make sincere efforts to resolve it through consultation.</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>Article 25 (Jurisdiction)
|
||||
<ul class="list_3">
|
||||
<li>Any disputes arising under these Terms shall be subject to the jurisdiction of the Seoul Central District Court.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<ul class="list_1">
|
||||
<li><span class="tit">Addenda</span>
|
||||
<ul class="list_2" maker="1">
|
||||
<li>This Agreement shall take effect on October 1, 2024.</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 자기소개 시작 { -->
|
||||
<div id="profile" class="new_win">
|
||||
<h1 id="win_title"><?php echo $mb_nick ?>님의 프로필</h1>
|
||||
<div class="profile_name">
|
||||
<span class="my_profile_img">
|
||||
<?php echo get_member_profile_img($mb['mb_id']); ?>
|
||||
</span>
|
||||
<?php echo $mb_nick ?>
|
||||
</div>
|
||||
<div class="tbl_head02 tbl_wrap new_win_con">
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th scope="row"><i class="fa fa-star-o" aria-hidden="true"></i> 회원권한</th>
|
||||
<td><?php echo $mb['mb_level'] ?></td>
|
||||
<th scope="row"><i class="fa fa-database" aria-hidden="true"></i> 포인트</th>
|
||||
<td><?php echo number_format($mb['mb_point']) ?></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th scope="row"><i class="fa fa-clock-o" aria-hidden="true"></i> 회원가입일</th>
|
||||
<td><?php echo ($member['mb_level'] >= $mb['mb_level']) ? substr($mb['mb_datetime'],0,10) ." (".number_format($mb_reg_after)." 일)" : "알 수 없음"; ?></td>
|
||||
<th scope="row"><i class="fa fa-clock-o" aria-hidden="true"></i> 최종접속일</th>
|
||||
<td><?php echo ($member['mb_level'] >= $mb['mb_level']) ? $mb['mb_today_login'] : "알 수 없음"; ?></td>
|
||||
</tr>
|
||||
<?php if ($mb_homepage) { ?>
|
||||
<tr>
|
||||
<th scope="row"><i class="fa fa-home" aria-hidden="true"></i> 홈페이지</th>
|
||||
<td colspan="3"><a href="<?php echo $mb_homepage ?>" target="_blank"><?php echo $mb_homepage ?></a></td>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
<section>
|
||||
<h2>인사말</h2>
|
||||
<p><?php echo $mb_profile ?></p>
|
||||
</section>
|
||||
</div>
|
||||
<div class="win_btn">
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- } 자기소개 끝 -->
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
?>
|
||||
<div>recruit test</div>
|
||||
|
||||
@@ -0,0 +1,414 @@
|
||||
<?php
|
||||
// if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
// add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
|
||||
if (!isset($register_action_url)) {
|
||||
$register_action_url = '';
|
||||
}
|
||||
?>
|
||||
<!-- <head> -->
|
||||
<!-- <meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TOVA Join</title>
|
||||
<link rel="stylesheet" href="../css/reset.css" />
|
||||
<link rel="stylesheet" href="../css/font.css" />
|
||||
<link rel="stylesheet" href="../css/style.css" />
|
||||
<script src="../js/jquery-3.6.1.min.js"></script> -->
|
||||
<!-- </head> -->
|
||||
<script src="<?php echo G5_URL ?>/js/common.js"></script>
|
||||
<script src="<?php echo G5_URL ?>/js/popup.js?v=20260723"></script>
|
||||
|
||||
<!-- 회원가입약관 동의 시작 { -->
|
||||
<!-- <body>
|
||||
<div class="register"> -->
|
||||
<!-- <div class="wrapper"> -->
|
||||
<!-- Header -->
|
||||
<!-- <header class="header">
|
||||
<h1>
|
||||
<img src="../img/logo_w.svg" alt="">
|
||||
</h1>
|
||||
<div class="menu_wrap">
|
||||
<div class="menu_my"><img src="../img/ico_my.svg" alt=""></div>
|
||||
<div class="menu_ham"><img src="../img/ico_ham.svg" alt=""></div>
|
||||
</div>
|
||||
</header> -->
|
||||
<!-- //Header -->
|
||||
|
||||
<!--popup_wrap-->
|
||||
<div id="pop_agreement" class="popup_wrap">
|
||||
<!--popup_in-->
|
||||
<div class="popup_in">
|
||||
<button class="btn_close">
|
||||
<div class="close_div"><img src="<?php echo G5_URL ?>/img/ico_close.svg" alt="sdi"></div>
|
||||
</button>
|
||||
<!--popup_container-->
|
||||
<div class="popup_container register">
|
||||
<!--popup_tit-->
|
||||
<div class="popup_tit">
|
||||
<h1 class="h_1">Sign up</h1>
|
||||
<!-- <ul>
|
||||
<li class="join_step on">
|
||||
<h4 class="h_4">01</h4>
|
||||
<h4 class="h_4 txt">약관동의</h4>
|
||||
</li>
|
||||
<li class="join_step">
|
||||
<h4 class="h_4">02</h4>
|
||||
<h4 class="h_4 txt">계정 생성</h4>
|
||||
</li>
|
||||
<li class="join_step">
|
||||
<h4 class="h_4">03</h4>
|
||||
<h4 class="h_4 txt">사용자 인증</h4>
|
||||
</li>
|
||||
<li class="join_step">
|
||||
<h4 class="h_4">04</h4>
|
||||
<h4 class="h_4 txt">추가정보 입력</h4>
|
||||
</li>
|
||||
</ul> -->
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
<div class="popup_contents_wrap">
|
||||
<form name="fregister" id="fregister" action="<?php echo $register_action_url ?>" onsubmit="return fregister_submit(this);" method="POST" autocomplete="off">
|
||||
<div class="tbl_wrap">
|
||||
<div class="terms_wrap">
|
||||
<div class="checkbox_wrap">
|
||||
<h4>Terms of Service</h4>
|
||||
<input type="checkbox" name="agree" value="1" id="agree11">
|
||||
</div>
|
||||
<div class="terms">
|
||||
<em>EG-BIM Service Privacy Policy</em> <br>
|
||||
<br>
|
||||
<em>Chapter 1. General Provisions</em> <br>
|
||||
<em>Article 1 (Purpose)</em><br>
|
||||
These Terms of Service (“Terms”) set forth the rights, obligations, responsibilities, and other necessary matters between Baron Consultant (“the Company”) and users (“Users”) when using the EG-BIM software (“the Service”).<br>
|
||||
<em>Article 2 (Definitions)</em> <br>
|
||||
①The terms used in these Terms are defined as follows:
|
||||
- “Service” means the software and all related services provided by the Company.
|
||||
- “User” refers to members and non-members who access and use the Service in accordance with these Terms.
|
||||
- “Member” means a person who agrees to these Terms and enters into a service agreement with the Company.
|
||||
- “Non-member” means a person who uses part of the Service without creating an account.
|
||||
|
||||
<em>Article 3 (Effect and Amendment of the Terms)</em><br>
|
||||
①These Terms take effect once the User agrees to them and the Company approves the User’s application. ② The Company may amend these Terms when necessary. The amended Terms shall take effect after being posted on the Service.<br>
|
||||
|
||||
<em>Article 4 (Matters Not Specified in the Terms)</em><br>
|
||||
Any matters not specified herein shall be governed by the laws and customary practices of the Republic of Korea.<br>
|
||||
|
||||
<em>Chapter 2. Service Use Agreement</em><br>
|
||||
<em>Article 5 (Formation of the Service Agreement)</em><br>
|
||||
A service agreement is formed when the User agrees to these Terms, completes the required membership application, and receives approval from the Company.<br>
|
||||
|
||||
<em>Article 6 (Reservation or Refusal of Agreement)</em><br>
|
||||
① The Company may reserve or decline approval of a service agreement in the following cases: - If the information in the application is found to be false - If providing the Service is technically difficult<br>
|
||||
|
||||
<em>Article 7 (Changes to Member Information)</em><br>
|
||||
Members may view and update their personal information at any time through the account management menu. Members must promptly update any changes, and the Company is not responsible for issues arising from failure to update such information.<br>
|
||||
|
||||
<em>Chapter 3. Personal Information Protection</em><br>
|
||||
|
||||
<em>Article 8 (Principles of Personal Information Protection)</em><br>
|
||||
① Members’ personal information is protected in accordance with applicable laws. ② The Company manages personal information in accordance with its separate Privacy Policy, which Users may review at any time.<br>
|
||||
|
||||
<em>Article 9 (Compliance with Privacy Policy)</em><br>
|
||||
① The Company handles matters related to the collection, use, provision, retention, and protection of personal information in accordance with its Privacy Policy. ② Users may check the Privacy Policy on the Company’s website. ③ The Company will make every effort to protect Users’ personal information in compliance with relevant laws.<br>
|
||||
|
||||
<em>Article 10 (Protection of Personal Information of Children Under 14)</em><br>
|
||||
① When collecting personal information from children under the age of 14, the Company must obtain consent from a legal guardian. ② A legal guardian may request access, correction, or deletion of the child’s personal information, and the Company shall respond promptly. ③ Further details are provided in the Privacy Policy.<br>
|
||||
|
||||
<em>Chapter 4. Provision and Use of the Service</em><br>
|
||||
<em>Article 11 (Provision of the Service)</em><br>
|
||||
The Company begins providing the Service once a Member’s application is approved. In principle, the Service is available 24 hours a day, year-round.<br>
|
||||
|
||||
<em>Article 12 (Changes and Suspension of the Service)</em> <br>
|
||||
The Company may change or suspend the Service after prior notice if providing the Service becomes difficult.<br>
|
||||
|
||||
<em>Chapter 5. Information and Advertising</em><br>
|
||||
Article 13 (Information and Advertising)<br>
|
||||
① The Company may provide information and advertisements deemed necessary during the use of the Service. ② Members may refuse to receive unwanted information..<br>
|
||||
|
||||
<em>Chapter 6. Management of Posts</em><br>
|
||||
<em>Article 14 (Management of Posts)</em><br>
|
||||
The Company may delete posts if they are illegal or violate these Terms.<br>
|
||||
|
||||
<em>Article 15 (Copyright of Posts)</em><br>
|
||||
The copyright of posts belongs to the Member. The Company may use posts for service promotion and improvement.<br>
|
||||
|
||||
<em>Chapter 7. Termination and Restrictions</em><br>
|
||||
<em>Article 16 (Termination of Agreement)</em> <br>
|
||||
Members may request termination of the service agreement at any time, and the Company will process the request without delay.<br>
|
||||
|
||||
<em>Article 17 (Restrictions on Use)</em><br>
|
||||
The Company may restrict access to the Service if the Member violates these Terms.<br>
|
||||
|
||||
<em>Chapter 8. Compensation for Damages and Disclaimer</em><br>
|
||||
<em>Article 18 (Compensation for Damages)</em><br>
|
||||
The Company is not liable for damages incurred through the use of free services.<br>
|
||||
|
||||
<em>Article 19 (Disclaimer)</em><br>
|
||||
The Company is not liable for failure to provide the Service due to natural disasters or other unavoidable circumstances.<br>
|
||||
|
||||
<em>Chapter 9. Paid Services</em> <br>
|
||||
<em>Article 20 (Use of Paid Services)</em><br>
|
||||
① The Company may offer certain services for a fee. ② Details regarding pricing, payment methods, and refund procedures will be indicated on the Service information page and payment screen. ③ Fees must be paid through the payment methods designated by the Company. ④ Paid services operate on a prepaid basis. Refunds for unused periods follow the Company’s refund policy. ⑤ The Company will make reasonable efforts to resolve issues related to paid services but is not liable for damages unless caused by intent or gross negligence.<br>
|
||||
|
||||
<em>Article 21 (Refund Policy)</em> <br>
|
||||
① Members may receive a full refund if they have not used the service within 7 days of payment. ② If the service is suspended for unavoidable reasons, the unused portion will be refunded. ③ Refunds are not available when service suspension is due to the Member’s fault. ④ Refunds will be processed to the Member’s designated account within 7 days of the request.<br>
|
||||
|
||||
<em>Article 22 (Suspension and Termination of Paid Services)</em><br>
|
||||
① Members wishing to terminate paid services must submit a cancellation request to the customer support center. ② The Company may suspend or terminate paid services immediately if a Member violates these Terms or uses the service fraudulently.<br>
|
||||
|
||||
<em>Chapter 10. Prohibition of Transfer</em><br>
|
||||
<em>Article 23 (Prohibition of Transfer)</em><br>
|
||||
Members may not transfer, assign, gift, or use as collateral any service rights or contractual status.<br>
|
||||
|
||||
<em>Chapter 11. Governing Law and Jurisdiction</em><br>
|
||||
<em>Article 24 (Dispute Resolution)</em><br>
|
||||
In the event of a dispute related to the Service, the Company and the Member shall make sincere efforts to resolve the matter.<br>
|
||||
|
||||
<em>Article 25 (Jurisdiction)</em><br>
|
||||
Any disputes arising from these Terms shall be subject to the exclusive jurisdiction of the Seoul Central District Court.<br>
|
||||
|
||||
<em>Addendum</em><br>
|
||||
These Terms shall take effect on October 1, 2024.<br>
|
||||
</div>
|
||||
</div>
|
||||
<div class="terms_wrap">
|
||||
<div class="checkbox_wrap">
|
||||
<h4>Privacy Policy Agreement</h4>
|
||||
<input type="checkbox" name="agree2" value="1" id="agree21">
|
||||
</div>
|
||||
<div class="terms">
|
||||
<em>EG-BIM Service Privacy Policy</em> <br>
|
||||
<br>
|
||||
<em>Article 1 (Purpose)</em><br>
|
||||
Baron Consultant (“the Company”) establishes this Privacy Policy to protect the personal information of customers (“Users”) who use the EG-BIM service (“the Service”), and to fulfill its responsibilities and obligations under the Personal Information Protection Act. This Policy explains how the Company collects, uses, retains, and protects the personal information provided by Users.<br>
|
||||
|
||||
<em>Article 2 (Purpose of Processing Personal Information)</em><br>
|
||||
The Company processes personal information for the following purposes. The collected personal information will not be used for purposes other than those listed below. If the purpose changes, the Company will obtain separate consent in accordance with Article 18 of the Personal Information Protection Act.
|
||||
- Identity Verification: Membership registration, account management, and communication via phone or email
|
||||
- Service Provision: Notifications and processing required to provide the Service
|
||||
- Product Brochure Downloads: Delivery of informational materials
|
||||
- Consultation and Demo Requests: Consultation, demo provision, and collection of contact information for contract processing
|
||||
- Event Registration: Attendance guidance and provision of seminars, briefings, or training
|
||||
- Security Guide Provision: Delivery of informational materials
|
||||
- Technical Support Requests: Support for service usage
|
||||
- Service Improvement Feedback: Quality enhancement of the Service
|
||||
- Marketing Activities: Sending newsletters and magazines to customers who have agreed to receive them<br>
|
||||
|
||||
<em>Article 3 (Retention and Use Period of Personal Information)</em><br>
|
||||
Article 3 (Retention and Use Period of Personal Information)
|
||||
① The Company processes and retains personal information within the retention period prescribed by law or the period agreed upon by the information subject at the time of collection. ② The retention periods for each category of personal information are as follows:
|
||||
- Member Profile Information: From the date of registration until 1 year after withdrawal
|
||||
- Information for marketing, consultation, and contract purposes: 2 years<br>
|
||||
|
||||
<em>Article 4 (Provision of Personal Information to Third Parties)</em><br>
|
||||
Article 4 (Provision of Personal Information to Third Parties)
|
||||
① The Company processes personal information only within the scope described in Article 2, and provides personal information to third parties only in accordance with Articles 17 and 18 of the Personal Information Protection Act, such as when consent is obtained or when required by law.
|
||||
② The Company provides personal information to third parties as follows:
|
||||
- Recipients: Investigative agencies, related institutions, and reported entities
|
||||
- Purpose of Use: Handling complaints related to personal information infringement
|
||||
- Items Provided: Name, contact number, email
|
||||
- Retention Period: Preserved for the period required by law and destroyed once the purpose is fulfilled<br>
|
||||
|
||||
<em>Article 5 (Outsourcing of Personal Information Processing)</em><br>
|
||||
Article 5 (Outsourcing of Personal Information Processing)
|
||||
① The Company does not outsource personal information processing to third-party vendors and processes all information internally. ② If outsourcing becomes necessary (e.g., recruitment processing), the Company will notify Users on the website and obtain their consent beforehand.<br>
|
||||
|
||||
<em>Article 6 (Rights of Information Subjects and How to Exercise Them)</em><br>
|
||||
① Users may exercise their rights regarding personal information at any time, including requests for access, correction, deletion, and suspension of processing. ② Rights may be exercised through the following methods:
|
||||
- Written request: Submitted to the Company's address
|
||||
- Email: Submitted to the Company's designated email address
|
||||
- Fax: Submitted via the Company’s fax number
|
||||
③ Rights may also be exercised through a legal representative or authorized delegate. In such cases, a power of attorney must be submitted in accordance with Form No. 11 of the Enforcement Rule of the Personal Information Protection Act.
|
||||
④ Requests for access or suspension may be restricted under Articles 35(4) and 37(2) of the Personal Information Protection Act.
|
||||
⑤ Requests for correction or deletion may be restricted if the information is required to be retained by other laws.
|
||||
⑥ The Company verifies whether the requester is the information subject or a legitimate representative.<br>
|
||||
|
||||
<em>Article 7 (Items of Personal Information Processed)</em><br>
|
||||
The Company processes the following items of personal information:
|
||||
- Items Collected:
|
||||
- Required: Name, mobile phone number, email
|
||||
- Optional: Company phone number, inquiry details
|
||||
- Method of Collection: Through the website, phone, and email<br>
|
||||
|
||||
<em>Article 8 (Destruction of Personal Information)</em><br>
|
||||
① The Company destroys personal information without delay once the retention period expires or the processing purpose has been achieved. ② If personal information must be retained beyond the retention period due to applicable laws, the information will be stored separately in a different database or storage location. ③ The procedures and methods of destruction are as follows:
|
||||
- Destruction Procedure: Personal information subject to destruction is selected and destroyed upon approval by the Personal Information Protection Officer.
|
||||
- Destruction Method:
|
||||
Electronic files are permanently deleted using technical methods that prevent recovery
|
||||
Paper documents are shredded or incinerated<br>
|
||||
|
||||
<em>Article 9 (Measures to Ensure the Security of Personal Information)</em><br>
|
||||
The Company takes the following measures to ensure the secure management of personal information:
|
||||
- Administrative Measures: Establishing and implementing an internal management protocol, regular employee training
|
||||
- Technical Measures: Access control for personal information systems, installation of access control systems, encryption of unique identifiers, installation of security programs
|
||||
- Physical Measures: Access control for server rooms and storage facilities<br>
|
||||
|
||||
<em>Article 10 (Cookies and Automatic Collection Mechanisms)</em><br>
|
||||
The Company does not use cookies.
|
||||
Cookies are small data that store usage information, but EG-BIM does not utilize them.<br>
|
||||
|
||||
<em>Article 11 (Personal Information Protection Officer)</em><br>
|
||||
The Company appoints a Personal Information Protection Officer responsible for overseeing personal information processing and addressing complaints and damage relief related to personal information.
|
||||
Personal Information Protection Manager:
|
||||
- Name: Seungho Yeom
|
||||
- Position: Senior Researcher
|
||||
- Tel: +82-2-2141-7448
|
||||
- Fax: +82-2-2141-7599
|
||||
- Email: b23008@baroncs.co.kr<br>
|
||||
|
||||
<em>Article 12 (Request for Access to Personal Information)</em><br>
|
||||
Users may request access to their personal information under Article 35 of the Personal Information Protection Act. Requests should be submitted to the following department:
|
||||
Personal Information Access Request Department:
|
||||
- Department: Strategy & Planning Office
|
||||
- Contact: Hyukjin Kwon
|
||||
- Tel: +82-2-2141-7465
|
||||
- Fax: +82-2-2141-7599
|
||||
- Email: baroncs@baroncs.co.kr<br>
|
||||
|
||||
<em>Article 13 (Remedies for Rights Violations)</em><br>
|
||||
Users may file claims or request dispute resolution regarding personal information infringement through the following organizations:
|
||||
- Personal Information Dispute Mediation Committee: 1833-6972 (www.kopico.go.kr)
|
||||
- Personal Information Infringement Report Center: 118 (privacy.kisa.or.kr)
|
||||
- Supreme Prosecutors’ Office: 1301 (www.spo.go.kr)
|
||||
- National Police Agency: 182 (www.police.go.kr)<br>
|
||||
|
||||
<em>Article 14 (Changes to the Privacy Policy)</em><br>
|
||||
If this Privacy Policy is amended due to changes in laws, policies, or security technology, the revised Policy will be announced at least 7 days prior to implementation.<br>
|
||||
|
||||
<br>
|
||||
<em>Addendum</em><br>
|
||||
|
||||
<em>Article 1 (Effective Date)</em><br>
|
||||
This Privacy Statement takes effect on October 1, 2024.<br>
|
||||
|
||||
<em>Article 2 (Obligation to Notify and Disclose Changes)</em><br>
|
||||
If the Privacy Policy is amended, the Company will notify Users at least 7 days before implementation through the Service’s notice page. However, if significant changes affecting Users’ rights or obligations occur, notice will be provided at least 30 days in advance.<br>
|
||||
|
||||
<em>Article 3 (Validity of the Policy)</em><br>
|
||||
If any provision of this Privacy Policy becomes invalid or unenforceable, the remaining provisions shall remain in effect. Invalid provisions will be revised in accordance with applicable laws.<br>
|
||||
|
||||
<em>Article 4 (Methods of Notification)</em><br>
|
||||
Changes to the Privacy Policy will be communicated through:
|
||||
- Service homepage or pop-up notices
|
||||
- Email notifications
|
||||
- Company website announcements<br>
|
||||
|
||||
<em>Article 5 (Protection of Non-Member Information)</em><br>
|
||||
The Company protects the personal data of non-members to the same degree as that of members.
|
||||
If a non-member refuses to provide personal information, some services may be restricted.<br>
|
||||
|
||||
<em>Article 6 (Personal Information of Children Under 14)</em><br>
|
||||
The Company does not collect personal information from children under the age of 14.
|
||||
If such information is collected without consent, it will be destroyed immediately.<br>
|
||||
|
||||
<em>Article 7 (Transfer of Personal Information Overseas)</em><br>
|
||||
The Company does not transfer personal information overseas. If overseas transfer becomes necessary, prior authorization will be obtained from Users.<br>
|
||||
|
||||
<em>Article 8 (Other Matters)</em><br>
|
||||
Matters not specified in this Policy shall be governed by the Company’s internal regulations and applicable laws.<br>
|
||||
</div>
|
||||
</div>
|
||||
<div class="checkbox_wrap all">
|
||||
<h4>Agree to all terms</h4>
|
||||
<input type="checkbox" name="chk_all">
|
||||
</div>
|
||||
</div>
|
||||
<div class="join_btn_wrap">
|
||||
<!-- <button type="submit" onclick="javascript:join();">동의</button> -->
|
||||
<button type="submit" id="btn_agree">Agree</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!--//pop_join_right-->
|
||||
</div>
|
||||
<!--//popup_container-->
|
||||
</div>
|
||||
<!--//popup_in-->
|
||||
</div>
|
||||
<!--//popup_wrap-->
|
||||
<!-- </div>
|
||||
</body> -->
|
||||
|
||||
<script>
|
||||
// function fregister_submit(f)
|
||||
// {
|
||||
// if (!f.agree11.checked) {
|
||||
// alert("회원가입약관의 내용에 동의하셔야 회원가입 하실 수 있습니다.");
|
||||
// f.agree11.focus();
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// if (!f.agree21.checked) {
|
||||
// alert("개인정보 수집 및 이용의 내용에 동의하셔야 회원가입 하실 수 있습니다.");
|
||||
// f.agree21.focus();
|
||||
// return false;
|
||||
// }
|
||||
|
||||
// return true;
|
||||
// }
|
||||
|
||||
jQuery(function($){
|
||||
// 모두선택
|
||||
$("input[name=chk_all]").click(function() {
|
||||
if ($(this).prop('checked')) {
|
||||
$("input[name^=agree]").prop('checked', true);
|
||||
} else {
|
||||
$("input[name^=agree]").prop("checked", false);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
<script>
|
||||
(function($){
|
||||
function isAgreedAll(){
|
||||
return $('#agree11').is(':checked') && $('#agree21').is(':checked');
|
||||
}
|
||||
|
||||
// 혹시 다른 바인딩이 있으면 제거
|
||||
$('#btn_agree').off('click');
|
||||
$('#fregister').off('submit'); // 엔터키/기본 submit 방지
|
||||
|
||||
// 폼 submit도 막아둠
|
||||
$('#fregister').on('submit', function(e){
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// 동의 버튼 클릭
|
||||
$('#btn_agree').on('click', function(e){
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
|
||||
if (!isAgreedAll()){
|
||||
alert('Please agree to all terms.');
|
||||
return false; // 절대 넘어가지 않음
|
||||
}
|
||||
|
||||
// 체크 완료 시에만 다음 단계로
|
||||
$('#pop_agreement').hide();
|
||||
$('#pop_join').show(); // 실제 다음 팝업 ID로 교체
|
||||
$('body').css('overflow','hidden');
|
||||
});
|
||||
|
||||
// (선택) 전체동의 ↔ 개별동의 동기화
|
||||
const $all = $('input[name="chk_all"]');
|
||||
const $a1 = $('#agree11');
|
||||
const $a2 = $('#agree21');
|
||||
|
||||
$all.on('change', function(){
|
||||
const on = $(this).is(':checked');
|
||||
$a1.prop('checked', on);
|
||||
$a2.prop('checked', on);
|
||||
});
|
||||
$a1.add($a2).on('change', function(){
|
||||
$all.prop('checked', $a1.is(':checked') && $a2.is(':checked'));
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
</script>
|
||||
<!-- </div> -->
|
||||
<!-- } 회원가입 약관 동의 끝 -->
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
//----------------------------------------------------------
|
||||
// SMS 문자전송 시작
|
||||
//----------------------------------------------------------
|
||||
|
||||
$sms_contents = $default['de_sms_cont1'];
|
||||
$sms_contents = str_replace("{이름}", $mb_name, $sms_contents);
|
||||
$sms_contents = str_replace("{회원아이디}", $mb_id, $sms_contents);
|
||||
$sms_contents = str_replace("{회사명}", $default['de_admin_company_name'], $sms_contents);
|
||||
|
||||
// 핸드폰번호에서 숫자만 취한다
|
||||
$receive_number = preg_replace("/[^0-9]/", "", $mb_hp); // 수신자번호 (회원님의 핸드폰번호)
|
||||
$send_number = preg_replace("/[^0-9]/", "", $default['de_admin_company_tel']); // 발신자번호
|
||||
|
||||
if ($w == "" && $default['de_sms_use1'] && $receive_number)
|
||||
{
|
||||
if ($config['cf_sms_use'] == 'icode')
|
||||
{
|
||||
if($config['cf_sms_type'] == 'LMS') {
|
||||
include_once(G5_LIB_PATH.'/icode.lms.lib.php');
|
||||
|
||||
$port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']);
|
||||
|
||||
// SMS 모듈 클래스 생성
|
||||
if($port_setting !== false) {
|
||||
$SMS = new LMS;
|
||||
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
|
||||
|
||||
$strDest = array();
|
||||
$strDest[] = $receive_number;
|
||||
$strCallBack = $send_number;
|
||||
$strCaller = iconv_euckr(trim($default['de_admin_company_name']));
|
||||
$strSubject = '';
|
||||
$strURL = '';
|
||||
$strData = iconv_euckr($sms_contents);
|
||||
$strDate = '';
|
||||
$nCount = count($strDest);
|
||||
|
||||
$res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
|
||||
|
||||
$SMS->Send();
|
||||
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||
}
|
||||
} else {
|
||||
include_once(G5_LIB_PATH.'/icode.sms.lib.php');
|
||||
|
||||
$SMS = new SMS; // SMS 연결
|
||||
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']);
|
||||
$SMS->Add($receive_number, $send_number, $config['cf_icode_id'], iconv_euckr(stripslashes($sms_contents)), "");
|
||||
$SMS->Send();
|
||||
$SMS->Init(); // 보관하고 있던 결과값을 지웁니다.
|
||||
}
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------
|
||||
// SMS 문자전송 끝
|
||||
//----------------------------------------------------------;
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 회원가입결과 시작 { register-->
|
||||
<div id="pop_result" class="popup_wrap">
|
||||
<p class="reg_result_p">
|
||||
<i class="fa fa-gift" aria-hidden="true"></i><br>
|
||||
<strong><?php echo get_text($mb['mb_name']); ?></strong>님의 회원가입을 진심으로 축하합니다.
|
||||
</p>
|
||||
|
||||
<?php if (is_use_email_certify()) { ?>
|
||||
<p class="result_txt">
|
||||
회원 가입 시 입력하신 이메일 주소로 인증메일이 발송되었습니다.<br>
|
||||
발송된 인증메일을 확인하신 후 인증처리를 하시면 사이트를 원활하게 이용하실 수 있습니다.
|
||||
</p>
|
||||
<div id="result_email">
|
||||
<span>아이디</span>
|
||||
<strong><?php echo $mb['mb_id'] ?></strong><br>
|
||||
<span>이메일 주소</span>
|
||||
<strong><?php echo $mb['mb_email'] ?></strong>
|
||||
</div>
|
||||
<p>
|
||||
이메일 주소를 잘못 입력하셨다면, 사이트 관리자에게 문의해주시기 바랍니다.
|
||||
</p>
|
||||
<?php } ?>
|
||||
|
||||
<p class="result_txt">
|
||||
회원님의 비밀번호는 아무도 알 수 없는 암호화 코드로 저장되므로 안심하셔도 좋습니다.<br>
|
||||
아이디, 비밀번호 분실시에는 회원가입시 입력하신 이메일 주소를 이용하여 찾을 수 있습니다.
|
||||
</p>
|
||||
|
||||
<p class="result_txt">
|
||||
회원 탈퇴는 언제든지 가능하며 일정기간이 지난 후, 회원님의 정보는 삭제하고 있습니다.<br>
|
||||
감사합니다.
|
||||
</p>
|
||||
<!-- } 회원가입결과 끝 -->
|
||||
<div class="btn_confirm_reg">
|
||||
<a href="<?php echo G5_URL ?>/" class="reg_btn_submit">메인으로</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 스크랩 목록 시작 { -->
|
||||
<div id="scrap" class="new_win">
|
||||
<h1 id="win_title"><?php echo $g5['title'] ?></h1>
|
||||
<ul>
|
||||
<?php for ($i=0; $i<count($list); $i++) { ?>
|
||||
<li>
|
||||
<a href="<?php echo $list[$i]['opener_href_wr_id'] ?>" class="scrap_tit" target="_blank" onclick="opener.document.location.href='<?php echo $list[$i]['opener_href_wr_id'] ?>'; return false;"><?php echo $list[$i]['subject'] ?></a>
|
||||
<a href="<?php echo $list[$i]['opener_href'] ?>" class="scrap_cate" target="_blank" onclick="opener.document.location.href='<?php echo $list[$i]['opener_href'] ?>'; return false;"><?php echo $list[$i]['bo_subject'] ?></a>
|
||||
<span class="scrap_datetime"><i class="fa fa-clock-o" aria-hidden="true"></i> <?php echo $list[$i]['ms_datetime'] ?></span>
|
||||
<a href="<?php echo $list[$i]['del_href']; ?>" onclick="del(this.href); return false;" class="scrap_del"><i class="fa fa-trash-o" aria-hidden="true"></i><span class="sound_only">삭제</span></a>
|
||||
</li>
|
||||
<?php } ?>
|
||||
|
||||
<?php if ($i == 0) echo "<li class=\"empty_li\">자료가 없습니다.</li>"; ?>
|
||||
</ul>
|
||||
<?php echo get_paging($config['cf_write_pages'], $page, $total_page, "?$qstr&page="); ?>
|
||||
|
||||
<div class="win_btn">
|
||||
<button type="button" onclick="window.close();" class="btn_close">창닫기</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- } 스크랩 목록 끝 -->
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
|
||||
|
||||
// add_stylesheet('css 구문', 출력순서); 숫자가 작을 수록 먼저 출력됨
|
||||
add_stylesheet('<link rel="stylesheet" href="'.$member_skin_url.'/style.css">', 0);
|
||||
?>
|
||||
|
||||
<!-- 스크랩 시작 { -->
|
||||
<div id="scrap_do" class="new_win">
|
||||
<h1 id="win_title">스크랩하기</h1>
|
||||
<form name="f_scrap_popin" action="./scrap_popin_update.php" method="post">
|
||||
<input type="hidden" name="bo_table" value="<?php echo $bo_table ?>">
|
||||
<input type="hidden" name="wr_id" value="<?php echo $wr_id ?>">
|
||||
<div class="new_win_con">
|
||||
<h2 class="sound_only">제목 확인 및 댓글 쓰기</h2>
|
||||
<ul>
|
||||
<li class="scrap_tit">
|
||||
<span class="sound_only">제목</span>
|
||||
<?php echo get_text(cut_str($write['wr_subject'], 255)) ?>
|
||||
</li>
|
||||
<li>
|
||||
<label for="wr_content">댓글작성</label>
|
||||
<textarea name="wr_content" id="wr_content"></textarea>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p class="win_desc">스크랩을 하시면서 감사 혹은 격려의 댓글을 남기실 수 있습니다.</p>
|
||||
|
||||
<div class="win_btn">
|
||||
<button type="submit" class="btn_submit">스크랩 확인</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<!-- } 스크랩 끝 -->
|
||||
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
?>
|
||||
|
||||
<div class="popup_sitemap" id="sitemap">
|
||||
<!-- Header -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
<div class="sitemap">
|
||||
<div class="menu1">
|
||||
<a href="<?php echo G5_BBS_URL ?>/value.php">
|
||||
<span>Value of <br>EG-BIM</span>
|
||||
<div class="sub_text">
|
||||
From editing <em>drawings</em><br>
|
||||
to viewing <em>3D BIM data</em><br>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="bg_line1"></div>
|
||||
<div class="menu2">
|
||||
<a href="<?php echo G5_BBS_URL ?>/interface.php">
|
||||
<span>Easy & Simple<br>Interface</span>
|
||||
<div class="sub_text">
|
||||
<em>Simplified menus</em> with<br>
|
||||
<em>a dual-monitor </em>workspace<br>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="bg_line2"></div>
|
||||
<div class="menu3">
|
||||
<a href="<?php echo G5_BBS_URL ?>/primary.php">
|
||||
<span>Key <br>Features</span>
|
||||
<div class="sub_text">
|
||||
<em>Commands grouped by function</em> <br>
|
||||
for easy access
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="bg_line3"></div>
|
||||
<div class="menu4">
|
||||
<a href="<?php echo G5_BBS_URL ?>/floorplan.php">
|
||||
<span>Drawing <br>Management</span>
|
||||
<div class="sub_text">
|
||||
<em>Manage many drawings </em><br>
|
||||
without opening them
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="bg_line2"></div>
|
||||
<div class="menu5">
|
||||
<a href="<?php echo G5_BBS_URL ?>/forbim.php">
|
||||
<span>Cross Check<br>for BIM</span>
|
||||
<div class="sub_text">
|
||||
View drawings & <br>
|
||||
3D BIM models <em>together</em>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
echo json_encode([
|
||||
'status' => 'ok',
|
||||
'post' => $_POST,
|
||||
'method' => $_SERVER['REQUEST_METHOD']
|
||||
]);
|
||||
@@ -0,0 +1,552 @@
|
||||
<?php include_once __DIR__ . '/asset_urls.php'; ?>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-STZ2R5Q7HG"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-STZ2R5Q7HG');
|
||||
</script>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>EG-BIM 소개</title>
|
||||
<link rel="stylesheet" href="../css/reset.css"/>
|
||||
<link rel="stylesheet" href="../css/font.css"/>
|
||||
<link rel="stylesheet" href="../css/style.css"/>
|
||||
|
||||
<link rel="stylesheet" href="https://unpkg.com/aos@2.3.1/dist/aos.css" type="text/css"/>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="https://unpkg.com/lenis@1.1.9/dist/lenis.min.js"></script>
|
||||
<link rel="stylesheet" href="https://unpkg.com/lenis@1.1.9/dist/lenis.css">
|
||||
<script type="text/javascript" src="../js/jquery-3.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="../js/jquery.mousewheel.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/gsap.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollTrigger.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/gsap@3.12.5/dist/ScrollToPlugin.min.js"></script>
|
||||
|
||||
<script type="text/javascript" src="../js/common.js"></script>
|
||||
<script type="text/javascript" src="../js/popup.js"></script>
|
||||
<script type="text/javascript" src="../js/value.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="wrapper">
|
||||
<input id="hid_mb_id" type="hidden" value="<?echo $_SESSION['session_id'];?>"></input>
|
||||
<!-- HEADER -->
|
||||
<?php include_once($member_skin_path.'/main_header.skin.php'); ?>
|
||||
<!-- //Header -->
|
||||
|
||||
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<?php
|
||||
include_once($member_skin_path.'/login.skin.php');
|
||||
include_once($member_skin_path.'/mypage01.skin.php');
|
||||
include_once($member_skin_path.'/register.skin.php');
|
||||
include_once($member_skin_path.'/register_form.skin.php');
|
||||
include_once($member_skin_path.'/mypage02.skin.php');
|
||||
include_once($member_skin_path.'/mypage03.skin.php');
|
||||
include_once($member_skin_path.'/sitemap.skin.php');
|
||||
include_once($member_skin_path.'/privacy.skin.php');
|
||||
include_once($member_skin_path.'/password_lost.skin.php');
|
||||
?>
|
||||
<!-- 모든 팝업페이지 경로 -->
|
||||
<!-- 컨텐츠 시작 -->
|
||||
<div class="container value">
|
||||
<section class="intro js__dark">
|
||||
<div class="top">
|
||||
<h2 data-aos="fade-down" data-aos-duration="1000">Value of EG-BIM</h2>
|
||||
</div>
|
||||
<div class="keyword">
|
||||
<i class="egbim_obj w"></i>
|
||||
<span>From 2D Drawing Management to<br class="brk"> 3D BIM Model Information Review</span>
|
||||
</div>
|
||||
<div class="summarys_wrap">
|
||||
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
|
||||
<div class="dia_element_wrap">
|
||||
<div class="dia_element">
|
||||
<div class="dia_tit">
|
||||
<span>Bulk<br> Deliverable<br> Management</span>
|
||||
</div>
|
||||
<div class="dia_line"></div>
|
||||
<ul class="dia_li">
|
||||
<li class="dia_li_tit">KRM</li>
|
||||
<li>Drawing search & <br>History tracking</li>
|
||||
<li>Batch edit drawing data</li>
|
||||
<li>Multi-drawing printing</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<div class="dia_tit">
|
||||
<span>Drawing<br>View & Edit</span>
|
||||
</div>
|
||||
<div class="dia_line"></div>
|
||||
<ul class="dia_li">
|
||||
<li class="dia_li_tit">GRM</li>
|
||||
<li>UX Design</li>
|
||||
<li>dual monitor support</li>
|
||||
<li>Smart productivity tools</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<div class="dia_tit">
|
||||
<span>3D BIM<br> Model<br> Visualization</span>
|
||||
</div>
|
||||
<div class="dia_line"></div>
|
||||
<ul class="dia_li">
|
||||
<li class="dia_li_tit">3D Viewer</li>
|
||||
<li>3View model geometry & properties</li>
|
||||
<li>Link 2D drawings with 3D BIM elements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dia_appendix">
|
||||
<div class="app_bg">
|
||||
<div class="app_etc">Linked drawing information</div>
|
||||
</div>
|
||||
<div class="app_bg">
|
||||
<div class="app_etc">Connected BIM model data</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dia_circles_wrap">
|
||||
<div class="circle_dash"></div>
|
||||
<div class="circle_belt"></div>
|
||||
<div class="circle_core">
|
||||
<img src="<?php echo eng_img_url('egbim_logo.svg'); ?>" alt="">
|
||||
</div>
|
||||
<div class="circle_dots move">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="feature_bg"></div>
|
||||
<section class="feature_intro full_screen">
|
||||
<span class="grand_tit" data-aos="fade-down" data-aos-duration="1000"><font class="egbim k">eg-bim LogoK</font> Features</span>
|
||||
<p data-aos="fade-up" data-aos-duration="1000">EG-BIM offers a distinctive interface and versatile functions,<br> <b>providing a convenient and efficient working environment</b> for the digital transformation era.</p>
|
||||
<div class="line"></div>
|
||||
<div class="dot"></div>
|
||||
</section>
|
||||
<section class="features js__ani full_screen">
|
||||
<div class="f_wrap interface" data-aos="fade-up" data-aos-delay="100" data-aos-duration="1000">
|
||||
<i></i>
|
||||
<span class="sub_tit">Refined<br> Interface</span>
|
||||
<p class="sub_text">Simplified menus designed from user experience, providing only essential tools. Dual monitor support creates a new, efficient workspace for greater usability.</p>
|
||||
</div>
|
||||
<div class="f_wrap tool" data-aos="fade-up" data-aos-delay="200" data-aos-duration="1000">
|
||||
<i></i>
|
||||
<span class="sub_tit">Vesatile<br> Drawing Tools</span>
|
||||
<p class="sub_text">From drafting commands to printing, all drawing functions are intuitively organized to enhance productivity and streamline CAD workflows.</p>
|
||||
</div>
|
||||
<div class="f_wrap floorplan" data-aos="fade-up" data-aos-delay="300" data-aos-duration="1000">
|
||||
<i></i>
|
||||
<span class="sub_tit">Efficient Bulk<br> Drawing Management</span>
|
||||
<p class="sub_text">Manage multiple drawings without opening each file. Search, edit, and print drawings collectively through a dedicated management tool.</p>
|
||||
</div>
|
||||
<div class="f_wrap bim" data-aos="fade-up" data-aos-delay="400" data-aos-duration="1000">
|
||||
<i></i>
|
||||
<span class="sub_tit">3D BIM<br> Model Viewer</span>
|
||||
<p class="sub_text">Simultaneously review 2D drawings and 3D BIM models in a unified environment, enabling precise cross-checking of design information.</p>122
|
||||
</div>
|
||||
<div class="lines">
|
||||
<div class="v1"></div>
|
||||
<div class="v2"></div>
|
||||
<div class="v3"></div>
|
||||
<div class="h"></div>
|
||||
<div class="d1"></div>
|
||||
<div class="d2"></div>
|
||||
<div class="d3"></div>
|
||||
</div>
|
||||
</section>
|
||||
<div class="system_bg"></div>
|
||||
<section class="system">
|
||||
<div class="system_tit">
|
||||
<span>Keywords<br><em>for System</em></span>
|
||||
</div>
|
||||
<div class="diagram_wrap" data-aos="fade-up" data-aos-duration="1000">
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>Dual monitor support</li>
|
||||
<li>Block library</li>
|
||||
<li>Full command view</li>
|
||||
<li>Block manager window</li>
|
||||
<li>Detailed style view</li>
|
||||
<li>Plot & title block recognition</li>
|
||||
<li>Construction CALS compatibility</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>User-defined folder structure</li>
|
||||
<li>Drawing preview</li>
|
||||
<li>Linked drawing information</li>
|
||||
<li>Batch edit drawing data</li>
|
||||
<li>Multi-drawing batch output</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>Linked BIM model data</li>
|
||||
<li>Simultaneous 2D–3D view</li>
|
||||
<li>Detailed BIM model visualization</li>
|
||||
<li>Property and attribute information</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_element">
|
||||
<ul class="dia_text">
|
||||
<li>User Experience</li>
|
||||
<li>Distinctive Interface Design</li>
|
||||
</ul>
|
||||
<div class="line"></div>
|
||||
</div>
|
||||
<div class="dia_circles_wrap">
|
||||
<div class="circle_belt"></div>
|
||||
<div class="circle_core">
|
||||
<span><b>GRM</b>Drawing Work</span>
|
||||
<span><b>KRM</b>Drawing<br> Management</span>
|
||||
<span><b>3D<br class="brk"> Viewer</b>BIM Model<br> Viewing</span>
|
||||
<span><em>UX Design</em></span>
|
||||
</div>
|
||||
<div class="circle_dots move">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
<div class="circle_dots">
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
<div class="dot"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<!-- //컨텐츠 시작 -->
|
||||
<!-- FOOTER -->
|
||||
<?php include_once($member_skin_path.'/main_footer.skin.php'); ?>
|
||||
<!-- //FOOTER -->
|
||||
</div>
|
||||
<script>
|
||||
AOS.init();
|
||||
|
||||
const lenis = new Lenis()
|
||||
lenis.on('scroll', (e) => {
|
||||
// console.log(e)
|
||||
})
|
||||
lenis.on('scroll', ScrollTrigger.update)
|
||||
gsap.ticker.add((time)=>{
|
||||
lenis.raf(time * 1000)
|
||||
})
|
||||
gsap.ticker.lagSmoothing(0)
|
||||
</script>
|
||||
</body>
|
||||
|
||||
<script>
|
||||
$(function(){
|
||||
// footer family site toggle
|
||||
$('.family_btn').click(function(e){
|
||||
e.stopPropagation();
|
||||
$('.family_list, .family_btn').toggleClass('family_on');
|
||||
});
|
||||
$(document).click(function(e){
|
||||
if(!$(e.target).closest('.family_wrap').length){
|
||||
$('.family_list, .family_btn').removeClass('family_on');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 회원 탈퇴
|
||||
function member_leave() {
|
||||
if (confirm("회원에서 탈퇴 하시겠습니까?"))
|
||||
location.href = '<?php echo G5_BBS_URL ?>/member_leave.php';
|
||||
}
|
||||
// 회원 탈퇴
|
||||
|
||||
|
||||
let x = document.cookie;
|
||||
if(x.includes("tmp_1=John")){
|
||||
deleteCookie("tmp_1");
|
||||
$('#pop_mypage02').show();
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/bbs;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/faq;";
|
||||
document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/eng/qa;";
|
||||
}
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for(let i = 0; i <ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
//descope 로그인, 로그아웃 js
|
||||
function updateHeaderMenu() {
|
||||
var isLoggedIn = !!sessionStorage.getItem("sessionJwt");
|
||||
// role 체크 예시 (로그인 시 저장해놓은 값)
|
||||
var isAdmin = sessionStorage.getItem('userRole') === 'super';
|
||||
|
||||
if (isLoggedIn) {
|
||||
$('.my_join2, .my_login2').show();
|
||||
$('.my_join, .my_login').hide();
|
||||
|
||||
// 마이페이지/관리자 메뉴 동적 출력
|
||||
if (isAdmin) {
|
||||
$('#my_join2').html("<a href='http://eg-bim.com/eng/adm/index.php' target='_blank'>관리페이지</a>");
|
||||
} else {
|
||||
$('#my_join2').html("<a href='javascript:mypage03();'>My Page</a>");
|
||||
}
|
||||
} else {
|
||||
$('.my_join2, .my_login2').hide();
|
||||
$('.my_join, .my_login').show();
|
||||
$('#my_join2').html(""); // 혹시모를 내용 초기화
|
||||
}
|
||||
}
|
||||
|
||||
function descopeLogout() {
|
||||
fetch('/eng/skin/member/basic/descope_logout.php', {
|
||||
method: 'POST',
|
||||
credentials: 'include' // PHPSESSID 쿠키 전송
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) throw new Error('서버 로그아웃 실패');
|
||||
// 1) 로컬 저장소 정리
|
||||
// sessionStorage.removeItem("refreshJwt");
|
||||
// sessionStorage.removeItem("sessionJwt");
|
||||
// sessionStorage.removeItem("userRole");
|
||||
// sessionStorage.removeItem("userName");
|
||||
// sessionStorage.removeItem("loginId");
|
||||
|
||||
sessionStorage.clear();
|
||||
localStorage.clear();
|
||||
// 2) UI 갱신
|
||||
updateHeaderMenu();
|
||||
// 3) 로그인 페이지로 이동
|
||||
window.location.href = '/eng/index.php';
|
||||
})
|
||||
.catch(err => {
|
||||
console.error(err);
|
||||
alert('로그아웃 중 오류가 발생했습니다.');
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
// 기존에 있던 updateHeaderMenu() 호출 뒤에
|
||||
$('#my_login2 a').off('click').on('click', function(e){
|
||||
e.preventDefault();
|
||||
descopeLogout();
|
||||
});
|
||||
});
|
||||
|
||||
$(document).ready(function() {
|
||||
updateHeaderMenu();
|
||||
// (필요하다면, 로그인 성공 후에도 항상 updateHeaderMenu(); 호출)
|
||||
});
|
||||
|
||||
//descope login
|
||||
$('#flogin button[type=submit]').click(function(e){
|
||||
e.preventDefault();
|
||||
let mb_id = $('#login_id').val();
|
||||
let mb_password = $('#login_pw').val();
|
||||
|
||||
$.ajax({
|
||||
url : '/eng/skin/member/basic/descope_login.php',
|
||||
data : {
|
||||
'mb_id' : mb_id,
|
||||
'mb_password' : mb_password
|
||||
},
|
||||
type : "POST",
|
||||
dataType : "json",
|
||||
success : function(res){
|
||||
if(res.status === "ok") {
|
||||
// 토큰 저장
|
||||
// sessionStorage.setItem("refreshJwt", res.refreshJwt);
|
||||
sessionStorage.setItem("sessionJwt", res.sessionJwt);
|
||||
|
||||
// ✅ 사용자 정보 저장
|
||||
if (res.user) {
|
||||
sessionStorage.setItem("loginId", res.user.loginIds?.[0] || '');
|
||||
sessionStorage.setItem("userName", res.user.name || '');
|
||||
sessionStorage.setItem("company", res.user.customAttributes?.company || '');
|
||||
sessionStorage.setItem("familyCompany", res.user.customAttributes?.familyCompany || '');
|
||||
sessionStorage.setItem("position", res.user.customAttributes?.position || '');
|
||||
sessionStorage.setItem("team", res.user.customAttributes?.team || '');
|
||||
sessionStorage.setItem("familyUniqueKey", res.user.customAttributes?.familyUniqueKey || '');
|
||||
sessionStorage.setItem("phone", res.user.phone || '');
|
||||
}
|
||||
|
||||
// ✅ 추가: 관리자 등 정보 저장
|
||||
if(res.user && res.user.roleNames && res.user.roleNames[0])
|
||||
sessionStorage.setItem("userRole", res.user.roleNames[0]);
|
||||
else
|
||||
sessionStorage.removeItem("userRole");
|
||||
|
||||
// ✅ 로그인 후 메뉴 갱신
|
||||
updateHeaderMenu();
|
||||
|
||||
// UI 처리
|
||||
$('.popup_wrap').hide();
|
||||
$('body').css('overflow', '');
|
||||
lenis.start();
|
||||
// alert('로그인 하셨습니다.');
|
||||
} else {
|
||||
alert(res.message || "로그인 실패");
|
||||
|
||||
// 🔴 실패 횟수에 따라 안내 배너 교체
|
||||
if (res.failCount && res.failCount >= 8) {
|
||||
updateLoginBanner("fail");
|
||||
}
|
||||
}
|
||||
},
|
||||
error : function(err){
|
||||
alert(err.statusText || "통신 오류");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// ✅ 배너 교체 함수
|
||||
function updateLoginBanner(type = "default") {
|
||||
const $banner = $('#login_notice_banner');
|
||||
if (!$banner.length) return;
|
||||
|
||||
if (type === "default") {
|
||||
$banner.css({ background: "#063e01ff", color: "#fff" });
|
||||
$banner.find("strong").text("[로그인 시스템 변경 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
더 나은 보안을 위해 2025년 8월 8일부터 로그인 시스템이 변경되었습니다.<br>
|
||||
기존 회원 또한 신규 시스템에 맞춰 재가입을 진행해주시기 바랍니다.
|
||||
`);
|
||||
$banner.find("p:last").html(`※ 로그인 및 가입 관련 문의: <strong>010-8721-7453</strong>`);
|
||||
}
|
||||
|
||||
if (type === "fail") {
|
||||
$banner.css({ background: "#6a0202ff", color: "#faf6f6ff" });
|
||||
$banner.find("strong").text("[로그인 시도 제한 안내]");
|
||||
$banner.find("p.left").html(`
|
||||
비밀번호 입력을 <strong>7회 이상 연속 실패</strong>하셨습니다.<br>
|
||||
<strong>8번째 시도부터 3분 대기</strong>가 적용됩니다.<br>
|
||||
10회 이상 실패 시 계정이 잠금 처리됩니다.
|
||||
`);
|
||||
$banner.find("p:last").text("");
|
||||
}
|
||||
}
|
||||
|
||||
//회원가입 약관동의
|
||||
// $('#fregister button[type=submit]').click(function(e){
|
||||
// e.preventDefault();
|
||||
// let agree11 = $('#agree11').val();
|
||||
// let agree21 = $('#agree21').val();
|
||||
// $.ajax({
|
||||
// url : '<?php echo G5_URL ?>/bbs/register_form.php',
|
||||
// type : "POST",
|
||||
// datatype : "json",
|
||||
// contentType: 'application/json; charset=utf-8',
|
||||
// data : {
|
||||
// 'agree11' : agree11,
|
||||
// 'agree21' : agree21
|
||||
// },
|
||||
// success : function(data){
|
||||
// var ss='';
|
||||
// for(i=0; i<data.length; i++){
|
||||
// ss=ss + data[i];
|
||||
// }
|
||||
// },
|
||||
// error : function(err){
|
||||
// alert(err);
|
||||
// }
|
||||
// });
|
||||
// });
|
||||
|
||||
// 이지빔 프로그램 회원가입 url 쿼리스트링 파싱 함수
|
||||
function getQueryString(name) {
|
||||
const intro = document.querySelector('.intro_wrap');
|
||||
intro.style.display = "none";
|
||||
const mainMask = document.querySelector('.main_mask');
|
||||
mainMask.classList.add('skip');
|
||||
// mainMask.style.aimation = 'none';
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
return urlParams.get(name);
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
const popupParam = getQueryString('popup');
|
||||
|
||||
if (popupParam === 'signup') {
|
||||
console.log('쿼리 감지: signup → 회원가입 팝업 자동 오픈 시도');
|
||||
$('#pop_agreement').show(); // 팝업 보여주기
|
||||
|
||||
// 스크롤 잠금 (사용 중이면)
|
||||
$('body').css('overflow', 'hidden');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.stop();
|
||||
}
|
||||
}
|
||||
|
||||
// 팝업 닫기 버튼 이벤트 연결
|
||||
$('#pop_agreement .btn_close').on('click', function() {
|
||||
$('#pop_agreement').hide();
|
||||
$('body').css('overflow', '');
|
||||
if (typeof lenis !== 'undefined') {
|
||||
lenis.start();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
//이지빔 프로그램 비밀번호 재설정 url 쿼리스트링 파싱 함수
|
||||
$(document).ready(function() {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const popup = urlParams.get('popup');
|
||||
const token = urlParams.get('t');
|
||||
|
||||
if (popup === 'pwreset') {
|
||||
// 팝업 전체 열기
|
||||
$('#pop_search').show();
|
||||
$('body').css('overflow', 'hidden');
|
||||
|
||||
// 내부 컨텐츠 모두 숨기기
|
||||
$('#pop_search .popup_contents_wrap').hide();
|
||||
|
||||
if (token) {
|
||||
// 토큰이 있으면 비밀번호 재설정 단계
|
||||
if (!sessionStorage.getItem('pwreset_shown')) {
|
||||
$('#password_reset').show();
|
||||
sessionStorage.setItem('pwreset_shown', '1');
|
||||
}
|
||||
} else {
|
||||
// 토큰이 없으면 아이디 입력 단계 (첫 번째 .popup_contents_wrap)
|
||||
$('#pop_search .popup_contents_wrap').first().show();
|
||||
}
|
||||
}
|
||||
|
||||
// 닫기 버튼
|
||||
$('#pop_search .btn_close').on('click', function() {
|
||||
$('#pop_search').hide();
|
||||
$('body').css('overflow', '');
|
||||
});
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user