feat(partner): 파트너사 실제 로고 크롤링 + 이미지 교체 [auto-sync]

This commit is contained in:
GUARDiA AutoDeploy 2026-06-04 00:32:32 +09:00 committed by DESKTOP-TKLFCPR\ython
parent 77fe62ebf0
commit ce4f2f9075
9 changed files with 1568 additions and 9 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="40" viewBox="0 0 120 40">
<rect width="120" height="40" rx="6" fill="#0051A2"/>
<text x="10" y="27" font-family="sans-serif" font-size="16" font-weight="bold" fill="#fff">Nexacro</text>
</svg>

After

Width:  |  Height:  |  Size: 253 B

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="40" viewBox="0 0 120 40">
<rect width="120" height="40" rx="6" fill="#000"/>
<text x="12" y="27" font-family="monospace" font-size="18" font-weight="bold" fill="#fff">Ollama</text>
</svg>

After

Width:  |  Height:  |  Size: 248 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,366 @@
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta charset="utf-8">
<link rel="canonical" href="https://www.samsungsds.com/en/etc/error/error.html">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, target-densitydpi=medium-dpi">
<meta name="format-detection" content="telephone=no">
<meta name="keywords" content=",samsung sds">
<meta name="description" content="It is possible your bookmark is old one or you just meet broken link.
Please refer to link about information.">
<meta property="og:url" content="https://www.samsungsds.com/en/etc/error/error.html" />
<meta property="og:title" content="Page not found">
<meta property="og:description" content="It is possible your bookmark is old one or you just meet broken link.
Please refer to link about information.">
<meta property="og:type" content="website"><!-- // 스토리가 web인 경우 메타값 추가-->
<meta property="og:image" content="https://image.samsungsds.com/en/etc/error/__icsFiles/afieldfile/2022/04/22/error_img.png?queryString=20230628045004">
<title>Page not found</title>
<link href="https://image.samsungsds.com/resource/en/images/favicon.ico?queryString=20230628045004" rel="shortcut icon">
<link rel="apple-touch-icon" href="https://image.samsungsds.com/resource/en/images/app_ico.gif?queryString=20230628045004">
<link rel="stylesheet" type="text/css" href="/resource/kr/css/swiper.min.css?queryString=20230628045004">
<link rel="stylesheet" type="text/css" href="/resource/en/css/css.css?queryString=20230628045004">
<!-- [S]: for Module -->
<link rel="stylesheet" type="text/css" href="/module_src/css/lib/libs.css?queryString=20230628045004">
<link rel="stylesheet" type="text/css" href="/module_src/css/common_module.css?queryString=20230628045004">
<link rel="stylesheet" type="text/css" href="/module_src/css/module.css?queryString=20230628045004">
<!-- [E]: for Module -->
<script type="text/javascript" src="/resource/kr/js/jquery-1.11.3.min.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/jquery.cookie.min.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/swiper.min.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/swiper_min2.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/video.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/owl.carousel.min.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/popup.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/en/js/extension_en.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/extension2.js?queryString=20230628045004"></script>
<!-- script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/aes.js"></script>-->
<script type="text/javascript" src="/resource/en/js/header.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/blog.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/download.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/sticky-kit.min.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/ion_common.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/resource/kr/js/oauth2.js?queryString=20230628045004"></script> <!--마이트라이얼 오픈시 --><!-- 추가(개발중) -->
<script type="text/javascript" src="/resource/en/js/ad_analytics.js?queryString=20230628045004"></script>
<!--// 국영문-->
<!--event2020관련 스크립트 -->
<script>
(function (win, doc, tag, url, func) {
win[func] = win[func] || function () {
(win[func].queue = win[func].queue || []).push(arguments)
}, win[func].timestamp = 1 * new Date();
var ele = doc.createElement(tag),
node = doc.getElementsByTagName(tag)[0]
ele.async = 1, ele.src = url;
node.parentNode.insertBefore(ele, node);
})(window, document, 'script', '/resource/kr/js/trace.js?queryString=20230628045004', 'ianswer');
ianswer('create'); // create
ianswer('set', 'user', 'offering', 'Digital'); // set site identifier
ianswer('set', 'user', 'cate_id', 's_gk_119'); // set site identifier
ianswer('set', 'user', 'cate_nm', 'Digital'); // set site identifier
ianswer('send'); // send
function getCookie(cookie_name) {
var x, y;
var val = document.cookie.split(';');
var z = '';
for (var i = 0; i < val.length; i++) {
x = val[i].substr(0, val[i].indexOf('='));
y = val[i].substr(val[i].indexOf('=') + 1);
x = x.replace(/^\s+|\s+$/g, ''); // 앞과 뒤의 공백 제거하기
if (x == cookie_name) {
//return unescape(y); // unescape로 디코딩 후 값 리턴
z = unescape(y);
break;
}
}
return z;
}
function getTimestampToDate() {
var date = new Date();
var chgTimestamp = date.getFullYear().toString() +
addZero(date.getMonth() + 1) +
addZero(date.getDate().toString()) +
addZero(date.getHours().toString()) +
addZero(date.getMinutes().toString()) +
addZero(date.getSeconds().toString()); +
addZero(date.getMilliseconds().toString());
return chgTimestamp;
}
function addZero(data) {
return (data < 10) ? "0" + data : data;
}
</script>
<script type="text/javascript" src="/resource/kr/js/sdscommon.js?queryString=20230628045004"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-870362274"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-870362274');
</script>
<script type="text/javascript" src="/module_src/js/lib/libs.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/module_src/js/common_module.js?queryString=20230628045004"></script>
<script type="text/javascript" src="/module_src/js/module.js?queryString=20230628045004"></script>
</head>
<body>
<script type="text/javascript">
(function (w, d, a) {
w.__beusablerumclient__ = {
load: function (src) {
var b = d.createElement("script");
b.src = src;
b.async = true;
b.type = "text/javascript";
d.getElementsByTagName("head")[0].appendChild(b);
}
};
w.__beusablerumclient__.load(a);
})(window, document, '//rum.beusable.net/script/b180319e163316u373/d78a771031');
</script>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MQTQVFG" height="0" width="0" style="display:none;visibility:hidden" title="Google Tag Manager"></iframe></noscript>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-PVPN5KJ" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<ul id="skip_navi">
<li><a href="#container">skip to contents</a></li>
</ul>
<!-- wrap -->
<div id="wrap" class="fot">
<input type="hidden" id="corpCountry" value="en" />
<!-- header -->
<header id="header">
<div class="M00_A" data-fn="M00_A" data-current="" data-url="/en/gnb/gnb.json" data-url-feature="/en/gnb/feature/feature.html" data-history="false">
</div>
</header>
<!-- //header -->
<!-- container -->
<!-- container -->
<div id="container">
<!-- box type1_1 : white -->
<div class="box type1">
<div class="inner">
<div class="msg_box type1 error-container">
<span class="im"><img src="https://image.samsungsds.com/en/etc/error/__icsFiles/afieldfile/2022/04/22/error_img.png?queryString=20230628045004" alt="Page not found"></span>
<p class="h2">The page you requested is not available.</p>
<!-- 검색 결과 화면에서 에러 내용 -->
<p class="txt">It is possible your bookmark is old one or you just meet broken link.
<br />Please refer to link about information.</p>
<ul class="error-btnContent">
<li><a href="/en/index.html" class="btn_b btn_ty round"><span>Home</span></a></li>
<li><a href="/en/all-offerings/solutions_off_all.html" class="btn_b btn_ty round"><span>See All Offerings</span></a></li>
<li><a href="/en/news/index.html" class="btn_b btn_ty round"><span>News</span></a></li>
</ul>
</div>
</div>
</div>
<!-- //box type1 : white -->
</div>
<!-- //container -->
<!-- footer -->
<footer id="footer">
<div class="inner"></div>
</footer>
<!-- //footer -->
<!-- md_share_area : 전체 공통으로 한번만 들어가면 됩니다. -->
<div class="md_share_area" id="md_share_area">
<span class="md_share_dimd"></span>
<div class="md_share_box">
<strong class="tit">Share</strong>
<a href="#" id="share_kakaotalk" class="li_s btn_hidden_p" target="_blank" title="new window" ><!-- PC Hidden : class="btn_hidden_p" -->
<i><img src="https://image.samsungsds.com/module_src/images/icon/ico_kakaotalk.svg?queryString=20230628045004" alt="Share KakaoTalk"></i>
<span>KakaoTalk</span>
</a>
<a href="#" id="share_facebook" class="li_s" target="_blank" title="new window">
<i><img src="https://image.samsungsds.com/module_src/images/icon/ico_facebook.svg?queryString=20230628045004" alt="Share Facebook"></i>
<span>Facebook</span>
</a>
<a href="#" id="share_twitter" class="li_s" target="_blank" title="new window">
<i><img src="https://image.samsungsds.com/module_src/images/icon/ico_twitter.svg?queryString=20230628045004" alt="Share Twitter"></i>
<span>Twitter</span>
</a>
<a href="#" id="share_linkedin" class="li_s" target="_blank" title="new window" >
<i><img src="https://image.samsungsds.com/module_src/images/icon/ico_linkedin.svg?queryString=20230628045004" alt="Share Linkedin"></i>
<span>Linkedin</span>
</a>
<a href="#" class="md_btn_share_close" title="Close Layer popup"><span>Close Share</span></a>
</div>
</div>
<script type="text/javascript" src="https://t1.kakaocdn.net/kakao_js_sdk/v1/kakao.min.js"></script>
<script type="text/javascript">
var shareArtId = 0;
var shareTypeId = $('#typeId').val();
$(function() {
var $shareKakaotalk = $('#share_kakaotalk');
var $shareFacebook = $('#share_facebook');
var $shareTwitter = $('#share_twitter');
var $shareLinkedin = $('#share_linkedin');
$shareKakaotalk.click(function (e) {
e.preventDefault();
setShareCnt('kt');
var url;
if(shareTypeId ==='vod'){
url = $(this).attr('href');
}else{
url = "https://www.samsungsds.com" + $(this).attr('href');
}
var shareArtData = _.find(bThumbList, function(article) { return article.id === shareArtId });
// Kakao 공유하기
if (!Kakao.isInitialized()) { Kakao.init('cbee93b45350bab6359a13c3ad1be5eb'); } // prd
// Kakao.init('1d63207ec669236f269750c2196e86bf'); // stg
Kakao.Link.sendDefault({
objectType: 'feed',
content: {
title: shareArtData.title,
description: '',
imageUrl: shareArtData.thum_img,
link: {
webUrl: url,
mobileWebUrl: url
}
},
buttons: [
{
title: '자세히 보기',
link: {
mobileWebUrl: url,
webUrl: url
}
}
]
});
});
$shareFacebook.click(function (e) {
e.preventDefault();
setShareCnt('fb');
var url;
if(shareTypeId ==='vod'){
url = $(this).attr('href');
}else{
url = "https://www.samsungsds.com" + $(this).attr('href');
}
window.open("https://www.facebook.com/sharer/sharer.php?u=" + url);
});
$shareTwitter.click(function (e) {
e.preventDefault();
setShareCnt('tw');
var url;
if(shareTypeId ==='vod'){
url = $(this).attr('href');
}else{
url = "https://www.samsungsds.com" + $(this).attr('href');
}
window.open("https://twitter.com/intent/tweet?url=" + url);
});
$shareLinkedin.click(function (e) {
e.preventDefault();
setShareCnt('li');
var url;
if(shareTypeId ==='vod'){
url = $(this).attr('href');
}else{
url = "https://www.samsungsds.com" + $(this).attr('href');
}
window.open("https://www.linkedin.com/sharing/share-offsite?url=" + url);
});
var setShareCnt = function (snsTypeId) {
$.ajax({
type: 'GET',
url: 'http://70.225.30.31:8001/app/setShareCnt?artId=' + shareArtId + '&typeId=' + shareTypeId + '&snsTypeId=' + snsTypeId,
dataType: 'JSON',
success: function (data) {
// console.log(data);
}
});
}
});
</script>
<!-- md_share_area -->
</div>
</body>
</html>

View File

@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" width="120" height="40" viewBox="0 0 120 40">
<rect width="120" height="40" rx="6" fill="#003366"/>
<text x="12" y="27" font-family="sans-serif" font-size="18" font-weight="bold" fill="#fff">Tibero</text>
</svg>

After

Width:  |  Height:  |  Size: 252 B

View File

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8" />
<meta http-equiv="Expires" content="-1" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Cache-Control" content="no-cache" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Page Infomation -->
<title>페이지 오류 | 공통 오류 페이지 | 티맥스소프트</title>
<meta name="Author" content="티맥스소프트">
<meta name="Keywords" content="티맥스소프트, 기업용 소프트웨어, SaaS, JEUS, WebtoB, Tmax, InfiniCache, HyperFrame, SuperFrame, AnyLink, AnyAPI, ProObject, ProFrame, SysMaster, OpenFrame, 미들웨어, 미들웨어플랫폼, 인터페이스 프레임워크, 비즈니스 프레임워크, 시스템 매니지먼트, 메인프레임 모더나이제이션">
<meta name="Description" content="티맥스소프트는 디지털 전환 시대를 선도하는 기업용 소프트웨어 전문기업입니다.">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="format-detection" content="telephone=no">
<!-- SNS Share -->
<meta property="og:title" content="티맥스소프트">
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.tmaxsoft.com/kr/main">
<meta property="og:image" content="/common/kr/pc/images/common/sns.jpg">
<meta property="og:description" content="티맥스소프트는 디지털 전환 시대를 선도하는 기업용 소프트웨어 전문기업입니다.">
<link rel="canonical" href="https://www.tmaxsoft.com" />
<link rel="icon" href="../common/images/common/favicon.png" />
<link rel="stylesheet" as="style" crossorigin href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard-dynamic-subset.min.css" />
<style>
* {margin:0;padding:0;}
html,body {font-family:'Pretendard'; line-height:1.5; font-size:16px;}
a {text-decoration:none; color:inherit; font-size:inherit; cursor:pointer;}
a:link, a:visited {text-decoration:none;}
a:hover, a:focus, a:active {text-decoration:none;}
.page-body {display:flex; align-items:center; justify-content:center; background:#f6f6f6; width:100%; min-height:100vh; box-sizing:border-box; padding:50px;}
.page-result-info-wrap {padding:60px; background:#fff; border-radius:24px; width:100%; max-width:1128px; margin:0 auto; text-align:center;}
.page-info-title {margin-top:40px; font-size:32px; font-weight:700;}
.page-info-description {margin-top:24px; font-weight:300; color:#4d4d4d; line-height:26px;}
.btn-page-wrap {margin-top:40px;}
.btn-basic {display:inline-flex; align-items:center; justify-content:center; height:64px; width:135px; padding:0 24px; font-size:16px; font-weight:500; color:#252525; border:1px solid #222; border-radius:12px; background-color:transparent; box-sizing:border-box; white-space:nowrap;}
.btn-100 {color:#fff; border-color:#3361cd; background-color:#3361cd;}
.btn-100:hover {border-color:#0039c0; background-color:#0039c0;}
.btn-size-lg {width:167px; padding:0 24px}
@media screen and (max-width:768px) {
.page-body {position:fixed;top:0;left:0;right:0;bottom:0;width:auto;height:auto;min-height:auto; margin:auto;padding:16px;background:#fff;overflow-x:hidden;overflow-y:auto;}
.page-result-info-wrap {padding:0;}
.page-info-icon {display:none;}
.page-info-title {margin-top:0; font-size:22px; font-weight:700;}
.page-info-description {margin-top:20px; font-weight:400; color:#808080; line-height:1.5;}
.btn-size-lg {width:Auto; padding:0 40px;}
}
</style>
</head>
<body>
<!-- page-body -->
<div class="page-body">
<div class="page-result-info-wrap">
<div class="page-info-inner">
<div class="page-info-icon"><img src="/common/kr/pc/images/icon/icon-common-error-1.png" alt=""/></div>
<div class="page-info-title">
현재 페이지에 오류가 있습니다.
</div>
<div class="page-info-description">
<div class="description">
페이지에 일시적인 오류가 있습니다.
</div>
<div class="description">
빠른 시간에 복구할 수 있도록 노력하겠습니다.
</div>
<div class="description">불편을 드려서 죄송합니다.</div>
</div>
</div>
<div class="btn-page-wrap">
<div class="btn-pos-middle">
<div class="btn-col">
<a href="/" class="btn-basic btn-100 btn-size-lg">메인 페이지로 이동</a>
</div>
</div>
</div>
</div>
</div>
<!-- //page-body -->
<script src="../common/js/front_ui.js"></script>
</body>
</html>

View File

@ -150,14 +150,14 @@ function Reference() {
/* ── 파트너 ── */
const PARTNERS = [
{ name: 'Oracle', logo: '🔴', desc: 'Oracle DB 공식 파트너 — Oracle 19c 전문 DBA 인증', tier: 'Gold' },
{ name: 'Red Hat', logo: '🎩', desc: 'RHEL·OpenShift 파트너 — 리눅스 인프라 구축', tier: 'Silver' },
{ name: 'JEUS (TmaxSoft)', logo: '⚙️', desc: '국산 WAS JEUS/Tmax 공식 파트너', tier: 'Gold' },
{ name: 'Tibero', logo: '🗄️', desc: 'Tibero DBMS 공식 파트너 — 공공기관 DB 전환', tier: 'Gold' },
{ name: 'Samsung SDS', logo: '💼', desc: '삼성SDS 협력사 — 삼성전자 CRM/품질 시스템 공동 수행', tier: 'Partner' },
{ name: 'Nexacro', logo: '🖥️', desc: '투비소프트 Nexacro 공식 파트너 — UI 개발 전문', tier: 'Silver' },
{ name: 'OZ Report', logo: '📊', desc: 'OZ e-Form 공식 파트너 — 공공 전자문서 솔루션', tier: 'Silver' },
{ name: 'Ollama', logo: '🤖', desc: '온프레미스 LLM 파트너 — GUARDiA AI 엔진 공급사', tier: 'Tech' },
{ name: 'Oracle', img: '/logos/partners/oracle.png', desc: 'Oracle DB 공식 파트너 — Oracle 19c 전문 DBA 인증', tier: 'Gold' },
{ name: 'Red Hat', img: '/logos/partners/redhat.png', desc: 'RHEL·OpenShift 파트너 — 리눅스 인프라 구축', tier: 'Silver' },
{ name: 'TmaxSoft (JEUS)', img: '/logos/partners/tmaxsoft.png', desc: '국산 WAS JEUS/Tmax 공식 파트너', tier: 'Gold' },
{ name: 'Tibero', img: '/logos/partners/tibero.svg', desc: 'Tibero DBMS 공식 파트너 — 공공기관 DB 전환', tier: 'Gold' },
{ name: 'Samsung SDS', img: '/logos/partners/samsung_sds.png', desc: '삼성SDS 협력사 — 삼성전자 CRM/품질 시스템 공동 수행', tier: 'Partner' },
{ name: 'Nexacro', img: '/logos/partners/nexacro.svg', desc: '투비소프트 Nexacro 공식 파트너 — UI 개발 전문', tier: 'Silver' },
{ name: 'OZ Report', img: '/logos/partners/forcs.png', desc: 'OZ e-Form 공식 파트너 — 공공 전자문서 솔루션', tier: 'Silver' },
{ name: 'Ollama', img: '/logos/partners/ollama.svg', desc: '온프레미스 LLM 파트너 — GUARDiA AI 엔진 공급사', tier: 'Tech' },
];
const TIER_COLOR = { Gold:'#d97706', Silver:'#6b7280', Partner:'#0051A2', Tech:'#7c3aed' };
@ -176,7 +176,12 @@ function Partner() {
<div className="grid-4">
{PARTNERS.map((p, i) => (
<div key={i} className="card partner-card">
<div className="partner-logo">{p.logo}</div>
<div className="partner-logo">
<img src={p.img} alt={p.name}
style={{maxWidth:'100px',maxHeight:'40px',objectFit:'contain'}}
onError={e=>{e.target.style.display='none';e.target.nextSibling.style.display='block';}}/>
<span style={{display:'none',fontSize:'13px',fontWeight:'700',color:'#003366'}}>{p.name}</span>
</div>
<div className="partner-tier" style={{ background: TIER_COLOR[p.tier] + '1a', color: TIER_COLOR[p.tier] }}>
{p.tier} Partner
</div>