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 (
{/* 로고 */}
window.location.href='/'}>
J
Jeongwon Ensys Total IT Solution
{/* 데스크탑 메뉴 */} {/* 모바일 메뉴 버튼 */}
{/* 모바일 메뉴 드롭다운 */} {isMobileMenuOpen && (
{gnbItems.map((item) => ( setIsMobileMenuOpen(false)} > {item.title} ))}
)}
); }; // --- 컴포넌트: 푸터 --- 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})

{posts.map((post) => ( ))}
No 제목 작성자 날짜 조회
{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

` } } }; // 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 (

{error}

); 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 파라미터 기반) */} } /> } />
); }