import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Link, useSearchParams, useNavigate } from 'react-router-dom';
import {
Menu,
X,
ChevronRight,
Home,
Download,
Search,
Globe,
Phone,
Mail,
FileText,
List as ListIcon
} from 'lucide-react';
/**
* [설정] PHP API 주소
* 실제 운영 서버의 api_view.php 경로로 변경해야 합니다.
* 예: 'http://localhost/kr/contents/api_view.php'
*/
const API_URL = '/kr/contents/api_view.php'; // 개발 환경에 맞게 수정 필요
// --- 컴포넌트: 헤더 (GNB) ---
const Header = () => {
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
// 실제로는 여기서 api_menu.php를 호출하여 전체 트리 메뉴를 가져와야 합니다.
// 여기서는 UI 시뮬레이션을 위해 하드코딩된 메뉴를 사용합니다.
const gnbItems = [
{ id: 10, title: '회사소개' },
{ id: 20, title: 'H/W 솔루션' },
{ id: 30, title: 'S/W 솔루션' }, // 주요 테스트 대상
{ id: 40, title: 'SI 비즈니스' },
{ id: 50, title: '고객지원' },
];
return (
);
};
// --- 컴포넌트: 푸터 ---
const Footer = () => {
return (
);
};
// --- 컴포넌트: 게시판 (Board) ---
// * 참고: 현재 게시판 API는 구현되지 않았으므로 Mockup으로 대체합니다.
// * 추후 api_board.php 등을 만들어 JSON을 반환하게 하면 이 컴포넌트에서 fetch하면 됩니다.
const BoardComponent = ({ boardId, mode }) => {
const [posts, setPosts] = useState([
{ id: 1, title: '제우스(JEUS) v21.0 패치 업데이트 안내', writer: '관리자', date: '2023-11-20', hits: 154 },
{ id: 2, title: '2024년 정기 시스템 점검 일정', writer: '운영팀', date: '2023-11-15', hits: 89 },
{ id: 3, title: '웹투비(WebtoB) 보안 설정 가이드', writer: '기술지원', date: '2023-11-10', hits: 342 },
]);
return (
게시판 (ID: {boardId})
| No |
제목 |
작성자 |
날짜 |
조회 |
{posts.map((post) => (
| {post.id} |
{post.title} |
{post.writer} |
{post.date} |
{post.hits} |
))}
* 이것은 React 데모용 Mock Data입니다. 실제 데이터는 API 연동이 필요합니다.
);
};
// --- 핵심 컴포넌트: 페이지 뷰어 (Controller + View 역할) ---
const PageViewer = () => {
const [searchParams, setSearchParams] = useSearchParams();
const navigate = useNavigate();
const menuId = searchParams.get('menu_id') || '30'; // 기본값: 30 (S/W 솔루션)
const [pageData, setPageData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
setLoading(true);
setError(null);
try {
// [중요] 실제 환경에서는 fetch(API_URL + `?menu_id=${menuId}`) 로 호출
// 여기서는 데모를 위해 가상의 API 응답을 시뮬레이션 합니다.
// 실제 코드 적용 시 아래 mockResponse 부분을 fetch 호출로 대체하세요.
/* const response = await fetch(`${API_URL}?menu_id=${menuId}`);
const json = await response.json();
*/
// --- Mock Data Start (api_view.php의 응답 예시) ---
await new Promise(r => setTimeout(r, 500)); // 로딩 시뮬레이션
const mockResponse = {
status: 'success',
meta: { target_id: menuId, menu_type: 'content', redirect_to: null },
data: {
page_title: 'S/W 솔루션',
breadcrumbs: [{ id: 30, title: 'S/W 솔루션' }, { id: 32, title: 'Tmax Soft' }, { id: 321, title: 'Jeus' }],
depth2_menu: [
{ id: 31, title: 'VMware' },
{ id: 32, title: 'Tmax Soft' },
{ id: 33, title: 'CoreBridge' },
{ id: 34, title: 'Data Protector' }
],
depth3_menu: [
{ id: 321, title: 'Jeus' },
{ id: 322, title: 'WebToB' },
{ id: 323, title: 'Tibero' }
],
content: {
title: 'Jeus',
subtitle: 'Global IT Partner, Jeongwon Ensys',
// PHP Summernote에서 저장된 HTML 데이터 예시
body: `
WAS | 티맥스 소프트
Jeus
정원엔시스는 기업 종합 IT 솔루션 기업으로 우수한 전문기술인력과 유수의 글로벌 하드웨어 벤더와의 업무경험을 바탕으로
제우스, 웹투비등 티맥스소프트 솔루션 판매 및 안정적인 유지보수를 제공하게 되어 H/W와 더불어 고객에게 보다 더 효율적인 통합 서비스를 제공합니다.
Key Features
- Java EE 7 인증을 획득한 세계 최초의 WAS
- 대용량 트랜잭션의 안정적인 처리
- 클라우드 환경에 최적화된 아키텍처
`
}
}
};
// menu_id가 변경되면 다른 데이터를 주는 척 시뮬레이션
if (menuId === '40') {
mockResponse.data.page_title = 'SI 비즈니스';
mockResponse.data.breadcrumbs = [{ id: 40, title: 'SI 비즈니스' }];
mockResponse.data.depth2_menu = [];
mockResponse.data.depth3_menu = [];
mockResponse.data.content.body = 'SI 비즈니스 소개 페이지입니다.
';
}
// 게시판 시뮬레이션
if (menuId === '50') {
mockResponse.meta.menu_type = 'board';
mockResponse.data.page_title = '고객지원';
mockResponse.data.board_config = { board_id: 50, mode: 'list' };
mockResponse.data.content = null;
}
// --- Mock Data End ---
const json = mockResponse;
if (json.meta.redirect_to) {
setSearchParams({ menu_id: json.meta.redirect_to });
return;
}
setPageData(json.data);
} catch (err) {
setError('데이터를 불러오는 중 오류가 발생했습니다.');
console.error(err);
} finally {
setLoading(false);
}
};
fetchData();
}, [menuId, setSearchParams]);
if (loading) return (
);
if (error) return (
);
if (!pageData) return null;
return (
{/* 1. 비주얼 히어로 섹션 */}
{/* 배경 패턴 */}
{pageData.page_title}
Global IT Partner, Jeongwon Ensys
{/* 2. 네비게이션 (Depth 2 - Tabs) */}
{pageData.depth2_menu && pageData.depth2_menu.length > 0 && (
{pageData.depth2_menu.map(menu => (
))}
)}
{/* 3. 네비게이션 (Depth 3 - Pills) */}
{pageData.depth3_menu && pageData.depth3_menu.length > 0 && (
{pageData.depth3_menu.map(menu => (
))}
)}
{/* 4. 브레드크럼 (Breadcrumbs) */}
HOME
{pageData.breadcrumbs.map((crumb) => (
{crumb.title}
))}
{/* 5. 메인 콘텐츠 영역 */}
{/* A. 일반 콘텐츠 (CMS 본문) */}
{pageData.content && (
{/* [핵심] PHP Summernote에서 저장한 HTML을 렌더링
React에서는 보안상 HTML 출력을 막으므로 dangerouslySetInnerHTML 사용
*/}
)}
{/* B. 게시판 (Board) */}
{pageData.board_config && (
)}
);
};
// --- 메인 앱 ---
export default function GardenReactApp() {
return (
{/* 모든 경로는 PageViewer가 처리 (menu_id 파라미터 기반) */}
} />
} />
);
}