VosCMS

변경 이력

v2.6.4 2026-05-26 · 10일 전
커뮤니티 멘션 메뉴 i18n·게시판 작성자 연동 + /changelog 렌더·다국어 개선

Added

  • 13개국어 um 섹션 추가 — vos-community/lang/{locale}.php 전 언어 (ko·en·ja·de·es·fr·id·mn·ru·tr·vi·zh_CN·zh_TW): follow·following·message·block·unblock·report·report_about·report_reason/detail/placeholder·reason_spam/harassment/inappropriate/other·report_submit/sent/failed·msg_title/placeholder/send/sent/failed·block/unblock_confirm·block/unblock_done·cancel·failed·network_error
  • user-mention-menu.php 전면 i18n 적용 — PHP HTML 한국어 하드코딩 전부 __('community.um.*')로 교체, JS 런타임 문자열은 UM_LANG = <?= json_encode(...) ?> PHP 객체로 emit, umT(key, name) 헬퍼로 :name 플레이스홀더 치환
  • 비로그인 사용자 멘션 메뉴 허용community-overlays.php 가드 구조 개편: 관리자/API 경로는 전체 차단, user-mention-menu는 비로그인에도 포함 (팔로우·신고는 로그인 유도), 페이지액션·username 가드는 로그인 전용 유지

Changed

  • boardPreloadUsers(array $rows) 함수 추가 (board/_init.php) — user_id 목록을 IN 쿼리 1회로 일괄 로드, $GLOBALS['_boardUserCache'] 공유 캐시
  • boardAuthorMention() 확장 — data-user-username·data-user-avatar 속성 추가 (스토리 URL /story/{username} 정확히 연결, 아바타 이미지 표시). 프리로드 캐시 HIT 우선, miss 시 lazy 단건 조회
  • board/list.php·board/read.php·skins/board/qna/_list-full.php — 렌더링 전 boardPreloadUsers() 호출로 N+1 쿼리 방지

Fixed

  • 표시 파서 확장 (resources/views/system/changelog/index.php) — 코드 펜스(``), 표(|...|), 마크다운 링크(text), #### 소제목, 수평선(---`) 렌더링 추가. 이전엔 이 문법을 쓰는 일부 버전(2.4.1·2.3.8·2.3.7 등)이 마크다운 원문 그대로 노출되던 문제 해소
  • 버전별 locale 폴백 — 전체 목록을 한 언어로 일괄 조회하던 것을 버전 단위(현재 로케일 → en → ko)로 변경. 다른 언어로 봐도 전 버전이 빠짐없이 표시되고, 아직 번역 안 된 버전은 폴백 언어 배지로 구분 표시
  • 블록 경계 정합 (rzxlib/Core/Changelog/ChangelogParser.php) — 날짜 없는 ## [Unreleased] 헤더가 직전 버전(예: 1.5.0)에 흡수되던 문제 차단 (모든 ## [ 에서 블록 분리)
v2.6.3 2026-05-25 · 11일 전
배포판 다운로드 통계·히어로 위젯 분리·빌더 드래그앤드롭

Added

  • 마이그 056 dist_downloads 테이블 (site_id·version·ip·user_agent·referrer·utm_*·is_bot·created_at)
  • 다운로드 엔드포인트 api/dist-download.php — 정적 /download/*.zip 직링크 대신 경유하여 버전별/일별/유입(referrer·UTM) 집계 후 302 리다이렉트. 봇 UA 분리 집계, 버전 화이트리스트(경로조작 차단)
  • 관리자 통계 페이지 resources/views/admin/dist-downloads.php (마스터 전용, 13개국어) — 요약 카드(총/오늘/7일/30일)·버전별 막대·일별 추이(30일)·유입 경로 Top10·UTM. 자체 SVG/CSS 차트(외부 라이브러리 없음)
  • download-hero 위젯 다운로드 링크를 카운트 엔드포인트로 변경
  • 어드민 메뉴 "다운로드 통계" 추가 (config/admin-menu.php, master 전용)

Added

  • hero-cta-text — 상단 텍스트(타이핑) 영역. 기본값은 운영 hero-cta2 실제 콘텐츠와 동일(13개국어), 설정 입력 우선
  • hero-cta-button — 다운로드 버튼(최신 버전 자동 감지 + 다운로드 수 집계, 설정 불필요) + 선택적 마켓플레이스 버튼(비우면 1개)
  • 설정 입력창 label·기본값 13개국어 (빌더 getLabel 객체 지원)
  • 다운로드 버튼 색상·배경을 hero-cta2와 통일(#2563eb)

Added

  • 팔레트 카드를 캔버스로 드래그해서 추가 (SortableJS pull:'clone' 그룹 + 캔버스 onAdd에서 실제 블록 교체). 기존 클릭 추가·↑↓/핸들 순서변경과 병행
  • 드래그 중 플라이아웃 유지 + 캔버스 드롭존 강조(wb-drop-active)

Changed

  • 위젯과 위젯 사이 페이지 래퍼 간격 제거(type-widget.php py-2 → 0)
  • 댓글 AI 번역 동기 처리 안정화 — nginx fastcgi_read_timeout 150s(게시판 vhost)·PHP-FPM request_terminate_timeout 150·set_time_limit 150, OllamaProvider keep_alive 30분(모델 상주, 콜드 로딩 제거)
  • 메시지 API·소셜로그인 탭에 Webhook URL·Redirect URI 복사 버튼(13개국어, 비보안 컨텍스트 fallback)
v2.6.2 2026-05-14 · 22일 전
정산 세무 자동화·등록폼 분기·시스템 페이지 SSOT

Added

  • 마이그 036 partner_earnings / payoutswithholding_tax · consumption_tax · tax_basis 컬럼 추가
  • 마이그 037 payoutsfx_rate · fx_amount · fx_currency 컬럼 (USD 환산 송금 기록)
  • 마이그 038 vcs_developers.paypal_email 컬럼
  • 헬퍼 rzxlib/Core/Helpers/MarketTax::calculate() — 일본 표준 차감 모델

· 판매가는 税込(부가세 포함), 마켓이 부가세를 NTA 에 직접 납부

· freelance → 원천징수 10.21% 차감 / invoice_eligible → 매입세액공제 처리 / no_invoice → 소비세 미지급

· 미분류·미입력은 freelance 강제 (보수적: 덜 지급은 환급 가능, 더 지급은 회수 불가)

  • 백필 스크립트 scripts/market-tax-backfill.php — 기존 earnings/payouts 재계산 (status='paid' 보호, --dry-run 지원)
  • 정산 5분할 표시: 매출 → 수수료 → 부가세 차감 → 원천징수(freelance) → 실지급
  • rzx_mkt_settings 신규 키: min_payout_amount · consumption_tax_rate · default_commission_rate (모든 곳 settings 우선, 하드코딩 fallback 제거)

Added

  • /theadmin/market/partners/payouts 정산 모달 — prompt() × 2 + alert() → 단일 모달

· vcs_developers JOIN 으로 은행/지점/예금주/계좌번호/사업자유형/T번호 자동 prefill (PII enc: 자동 decrypt)

· 5분할 자동 계산 + 일본 세법 근거 칩(freelance_withholding 등) + 조문 명시(§204, 인보이스 제도)

· 페이지 내 토스트 알림, 모달 닫고 자동 reload

  • 운영국가 외 계좌 자동 USD 환산 (마이그 037)

· Frankfurter API 자동 환율 (storage/cache 24h TTL) + 관리자 수동 오버라이드(은행 TTS)

· 자동으로 method=paypal 선택

· 외국인은 입금계좌 카드 숨김, PayPal 이메일 카드 표시 (bank_country == site_country 기준)

  • 개발자 정산 요청 금액 지정 (/mypage/developer/earnings)

· 잔액 통째 → 금액 입력 + 전액 버튼 + 최소금액 검증

· 매출 이력 5분할 컬럼, 정산 안내 박스(사업자유형별 적용 세법 명시)

  • 지급 이력에 USD 환산·환율 보조 표시 (관리자/개발자 화면 양쪽)
  • SVG 막대 차트로 매출 추이 그래프 교체 (div 막대의 가시성 문제 해결)

Added

  • tax_review_status 기반 잠금 정책 (개발자 프로필)

· not_submitted / rejected → 입력 가능

· pending / approved수정 잠금 (자물쇠 + 안내)

· rejected → 입력 가능 + "저장 시 재심사 큐 진입" 힌트

· 서버측 방어 HTTP 423 Locked (UI 우회 차단)

  • update.php 부분 업데이트 안전화 — 전송된 필드만 동적 UPDATE (이전: 전체 덮어쓰기로 미전송 필드 NULL 화 위험)
  • 공식 검증 사이트 안내 (관리자 검증 화면 + 개발자 프로필)

· 🇯🇵 NTA 법인번호 공표사이트 (https://www.houjin-bangou.nta.go.jp/)

· 🇯🇵 NTA 적격청구서 발행 사업자 공표사이트 (https://www.invoice-kohyo.nta.go.jp/regno-search/)

· 🇰🇷 한국 홈택스 사업자등록상태 조회

· 사업자번호/T번호 옆 원클릭 복사 버튼

Added

  • 신규 등록 (/mypage/developer) — 국적 선택을 폼 최상단으로 이동, 운영국가 비교 안내

· country == site_country → 🏠 내국인 폼 (사업자유형/은행계좌)

· country != site_country → 🌐 외국인 폼 (자동 freelance + PayPal 이메일 필수)

· Alpine.js isDomestic getter, OPERATING_COUNTRY 글로벌 상수

  • 프로필 수정 (/mypage/developer/profile) — 동일 구조 ([feedback_admin_user_parity] 규칙)

· 외국인: 사업자 섹션 숨김, 정산정보 = PayPal 이메일만

· 국적 잠금 (변경 시 관리자 문의), 상단 모드 칩 표시

  • register API 서버측 강제 — 외국인 paypal_email 필수, freelance 강제, 사업자/계좌 입력값 무시

Added

  • page.php 토큰 자동 치환 — 모든 시스템 페이지에 일괄 적용

· {{COMPANY_NAME}} {{COMPANY_ADDRESS}} {{COMPANY_PHONE}} {{COMPANY_EMAIL}} {{COMPANY_REG_NUMBER}} {{COMPANY_REPRESENTATIVE}}

· {{SITE_NAME}} {{SITE_URL}} {{DOMAIN}}

· 어드민 business_ 또는 site_ settings 자동 매핑

· 사용자 지정 page_title / page_subtitle 도 토큰 치환 거침

  • {{DOMAIN}} 우선순위 — official_domain (약관·정책용 공식 도메인) → site_url 호스트

· 개발서버 vos.21ces.com 에서도 약관 본문에는 voscms.com 표기 유지

Added

  • rzx_page_contentsterms / privacy (각 13 row) 전면 교체 — RezlyX 예약 약관 → VosCMS 무료 소프트웨어 약관
  • 약관 18개 조항: 목적 · 정의 · 게시·개정 · 약관 외 준칙 · 계약체결 · 개인정보 · 통지 · 회사 의무 · 사용자 의무 · 서비스 제공 · 변경 · 이용 제한 · 라이선스(무상 사용허락) · 데이터 소유·보존 · 게시물 저작권 · 면책(AS-IS) · 손해배상 · 분쟁조정
  • 개인정보처리방침 10개 조항: 처리목적 · 항목 · 보유기간 · 제3자 제공·위탁 · 정보주체 권리 · 안전성 확보 · Cookie · 보호책임자 · 권익침해 구제(PPC) · 변경
  • 일본법 + 후쿠오카지방재판소 전속관할, APPI §33·§34·§35 인용
  • 회사 정보는 토큰 사용 → 어드민에서 한 번 수정 시 약관·정책 모두 자동 동기화
  • 일본어판을 정본으로 명시, 13개국어 자국어 정식 번역
  • 회사 정보 카드 — 법인명·소재지·전화 3종만 (대표이사·성명 제거, 등기 변경 시 약관 개정 부담 회피)
  • 보존 스크립트: scripts/voscms-terms-update.php · scripts/voscms-privacy-update.php

Fixed

  • /theadmin/site/menus 의 menus-api.php 가 vos 보다 99줄 뒤처져 있어 메뉴 저장·수정 시 검증·번역 누락
  • vos → market 으로 menus-api.php 동기화:

· mn_link_target_exists() — shortcut(링크) 메뉴는 대상 페이지(시스템 페이지·rzx_page_contents) 존재 검증 후에만 저장

· 메뉴 ID 재사용 방어 — 새 메뉴 ID 의 stale rzx_translations.menu_item.{id}.* 자동 정리

· 번역 INSERT 방식 INSERT IGNOREINSERT … ON DUPLICATE KEY UPDATE (덮어쓰기 가능)

· title·url 변경 시 옛 번역 clean slate + 시스템 페이지(config/system-pages.php) 매칭 시 번역 자동 재등록

  • sync-to-market.sh INCLUDES 에 admin/site/menus*.php 4개 파일 추가

Fixed

  • rzx_contact_messages 테이블 누락 → 마이그 041_create_contact_messages.sql 추가 (IF NOT EXISTS, vos 멱등 no-op 확인)
  • contact-messages.php 2중 레이아웃 해결 — _head.php 가 이미 sidebar+topbar 까지 출력하는데 view 가 또 직접 include 해서 <body> 2회 + main 두 겹. vos 패턴(머리=_head 1회, 꼬리=_foot 1회)으로 정리 (market 단발 패치)

Added

  • 마이그 040 040_create_developer_platform.sql — vcs_developers + vcs_developer_earnings/payouts/activity/notes + vcs_review_queue + rzx_mp_items 7개 테이블 일괄 생성 (IF NOT EXISTS, 030~038 ALTER 적용 후 최종 스키마 반영)

· vos.21ces.com 의 vcs_developers 는 별도 CREATE TABLE 마이그 없이 dump 에만 존재했음 — 후행 사이트에서 030 의 ALTER 가 실패하던 문제 해결

  • mypage/profile-sidebar.php 동기화 — 옛 rzx_mkt_partners 조회 → 신 vcs_developers 조회 (마이페이지 안에서 개발자 활동 통합)
  • market index.php 라우트 패치 (수작업, 통째 sync 회피):

· /developer/ → /mypage/developer/ 301 redirect (login/dashboard/my-items/submit/earnings/profile/logout 매핑)

· mypage/developer/{register|items|items/new|earnings|profile} + mypage/developer/items/{N} + mypage/developer/items/{N}/edit 라우트

  • sync-to-market.sh INCLUDES 에 040 마이그 + profile-sidebar.php 추가
  • market DB 백업 자동(storage/backups/market-YYYYMMDD-HHMMSS/market_vos.sql) 후 040 적용 완료

Added

  • market.21ces.com 은 마켓 운영(3자) 모델이라 VosCMS 무료 소프트웨어 약관과 별도로 작성
  • 약관 18조항 (마켓 운영 규칙 반영):

· 제8조 매매계약은 구매자–개발자 간 성립, 회사는 결제·인도 중개

· 제9조 디지털 상품 환불 4가지 예외 (다운로드 전·설명 불일치 7일·멀웨어 확인·시스템 오류) — 일본 特定商取引法 §15-2 표시 요건 충족

· 제10조 정산 — 수수료 % 명시 제거 ("현행 요율은 별도 게시" 참조 방식, 약관 개정 절차 없이 요율 조정 가능)

· 제10조 일본 소득세법 §204 원천징수 10.21% / T번호 보유사 소비세는 마켓이 NTA 직접 납부 / 운영국 외 계좌는 USD-PayPal 송금

· 제14조 개발자 개별 약관 우선 적용 — 마켓 운영 사항(결제·정산·환불 절차) 제외하고 개별 약관이 본 약관에 우선

· 제17조 손해배상 한도: 직전 6개월 수수료/정산금 총액

· 제18조 일본법 + 후쿠오카지방재판소 전속관할

  • 개인정보 12조항 (3자 마켓 관점):

· 처리 항목 — 공통/구매자/개발자(공통)/일본 거주/해외 거주/배송 6분류

· 보존 기간 — 회원 1년·거래 7년·정산/원천징수 7년·본인확인 5년·로그 6개월·문의 3년

· 업무 위탁 — Stripe·KOMOJU·PayPal·Frankfurter·SendGrid·NTA 명시

· 국외이전 — 미국(PayPal/Stripe/SendGrid)·EU(환율)·기타국(지역 PG/은행) 명시

  • 스크립트: scripts/market-terms-update.php · scripts/market-privacy-update.php (UPSERT — UPDATE 후 row 없으면 INSERT)
  • market DB 적용 완료 (rzx_page_contents terms/privacy 각 13 row), page-i18n 다국어 제목·부제 함께 적용

Added

  • 스킨 설정값(page_title · page_subtitle) 누락 매핑 — 설정 화면 입력이 페이지에 노출되지 않던 문제 해결
  • 누락된 _page-title-bg.php 파셜 신규 작성 (이전 nginx error log 의 include warning 해결)
  • title_bg_typecolor 옵션 추가 + title_bg_color 필드 — 이미지·동영상 빈 경우 색상 fallback 자동 적용
  • content_bg=transparent 일 때 흰 카드 박스 fallback 제거 (max-w-5xl 본문이 카드 안에 좁아 보이던 문제 해결)
  • --page-content-width CSS 변수 자동 출력 — "이 페이지에 대해" 액션 바(vos-community) 등 외부 자동 include 컴포넌트가 페이지 content_width 와 동일 폭으로 정렬

Fixed

  • 정산 페이지 PDOException — rzx_mkt_partners 에 없는 p.currency 컬럼 참조 제거
  • 매출 추이 그래프 안 보이는 문제 — div 막대 % 높이가 환경 따라 거의 0px 로 보이던 문제 → SVG viewBox 기반 차트로 교체 (최소 4px 가시성 확보)
v2.6.1 2026-05-13 · 23일 전
개발자 포털 확장·마켓 어드민 13개국어·공개 페이지 인터랙션

Added

  • 개발자 마이페이지 아이템 상세 화면 (/mypage/developer/items/{id}) — 통계·릴리즈 히스토리·다운로드 추이
  • 개발자 본인 아이템 수정 화면 (/mypage/developer/items/{id}/edit) — items-new 와 동일한 3탭 UI, 기존 값 prefill, 신규 ZIP 업로드는 별도 흐름 유지
  • 신규 API: /api/developer/item-update — name(JSON)·short/desc(JSON)·tags(JSON)·price·license·repo/demo URL·의존성·최소버전·icon·screenshots 갱신
  • 신규 API: /api/developer/request-payout — 정산 요청
  • 신규 API: /api/developer/update-bank — 본인 정산 계좌 수정
  • 신규 API: /api/developer/issue-reply — Q&A 답변 작성 (개발자 본인 응답 채널)
  • 관리자 개발자 상세 화면 (/theadmin/developers/show) — 사업자/계좌/서류 카드 + 서류 심사 (승인·반려) 모드
  • 회원가입·로그인 이메일 인증 (/verify-email) 보강 + Auth::register 의 company 필드 저장
  • 13개국어 정식 번역 키 추가 (show_edit_btn, items_edit_*, items_back_detail, api_updated 등)

Added

  • 위젯에서 리뷰·이슈·Q&A 작성 폼 직접 노출 (별도 페이지 이동 없음)
  • 구매자만 작성 가능 — 비구매자에게는 폼 표시 후 등록 시점에 안내 메시지
  • Q&A 답변에 답글(스레드) 지원 — DB 마이그레이션 035 (parent_reply_id)
  • 신규 API: /plugins/vos-market/views/api/item/post-issue.php, post-reply.php, post-review.php
  • 코어 rzxlib/Core/Helpers/Notifications.php — 알림 헬퍼 (DB 마이그 034 와 짝)

Added

  • /theadmin/market/licenses · sync · orders · settings · submissions · partners/payouts · items 전 화면 13개국어 적용
  • 마켓 settings 화면 — "파트너" 라벨을 "개발자" 로 통일 (시각 텍스트, 변수명은 호환성 유지)
  • 마켓 아이템 이름 입력에 공용 다국어 입력 모달 적용 — name_json 13개 언어 동시 편집
  • plugins/vos-market/lang/* 신규 — 플러그인 단독 다국어 풀
  • resources/lang/*/marketplace.php 13개 언어 전부 자국어 번역 ([[feedback_i18n_full_translation]] 규칙 준수)

Added

  • 033_developer_notes_activity.sql — 개발자별 메모·활동 로그
  • 034_notifications.sqlrzx_notifications 테이블 (사용자 알림)
  • 035_issue_reply_thread.sqlrzx_mkt_issue_replies.parent_reply_id 컬럼 추가 (스레드 답글)

Fixed

  • /Market?item={slug} 슬러그 누락 — items-show 에서 dedicated 단일 컬럼 조회로 보정
  • 아이템 수정 API 의 icon_url 컬럼명을 실제 컬럼 icon 으로 교정
  • 마켓 settings 페이지 빈 화면 — rzx_mkt_settings 마이그레이션 005 누락분 적용
v2.6.0 2026-05-06 · 1개월 전
회원 ID·SNS Story 플러그인·마이페이지 재설계·외부 이미지 미러링·호스팅 [설정] 통합

Added

  • VARCHAR(12) users.username + UsernameValidator (6자 이상, 특수문자 제한)
  • 로그인 후 첫 진입 시 게이트 모달 (AJAX /api/username-set)
  • 13개국어 정식 번역 (영어 fallback 제거)

Added

  • /profile/{uuid}/story/{username} 301 redirect
  • 컨텍스트 메뉴 라벨 "프로필 보기" → "스토리 보기"

Added

  • 코어에서 분리된 vos-story 플러그인 — /story/{username} 전담
  • 페이스북 스타일 헤더 + 5고정 탭 (모두 / 정보 / 사진 / 팔로워 / 팔로잉)
  • 글 CRUD + SNS 피드 (vos_story_posts, body_format = text/html)
  • TEXT/EDIT 토글 + Summernote 통합
  • 이미지 첨부 (다중) + 사진 탭 그리드
  • 좋아요 + 댓글 시스템
  • Story 스킨 시스템 (skins/story/default) + 사용자별 토큰 (/mypage/story)
  • 어드민 운영 정책 페이지 (/admin/vos-story/policy)
  • 페이지 액션 바: i18n + 위치(메인 콘텐츠 끝) + 콘텐츠 너비 토큰
  • 2:1 그리드 (콘텐츠 영역만) — 우측: 광고 + 친구 (팔로워/팔로잉 탭)
  • 헤더 액션 버튼 아이콘 전용 ([내 Story 설정] / [프로필 편집] / [팔로우])

Added

  • D-1: 4메뉴 사이드바 (대시보드 / 스토리 / 회원정보 / 메시지)
  • D-2-A: 대시보드 신설 — 8개 현황 카드 + 8탭 nav + 회원정보 탭
  • D-2-B: 스크랩 / 쪽지함 / 친구 탭 (각 "전체보기" 링크)
  • D-2-C: 저장함 / 작성 글 / 작성 댓글 탭 (게시판+Story+페이지 통합)
  • D-2-D: 자동 로그인 (remember tokens) 관리

Added

  • 공통 헬퍼 rzx_mirror_external_images() — cURL + SSRF 방어 + GD 리사이즈
  • E-1: 스크랩 스냅샷 캡처 + 외부 이미지 흡수
  • E-2: Story 작성 시 흡수 (story_attachments source 컬럼)
  • E-3: 게시판 글 작성 시 흡수
  • E-4: 페이지 콘텐츠 작성 시 흡수
  • 이미지 마킹: data-source-original, data-source-mirrored

Added

  • 호스팅 관리 사이드바 마지막 [설정] — 서비스 신청 페이지의 4탭(general/domain/hosting/addons) 으로 진입
  • 환불 정책 → 시스템 설정 → 일반 → 별도 카드 분리 (과세 설정과 격리)
  • rzx_settings.refund_policy 단일 키 저장
  • 13개국어 settings.refund.*

Added

  • 마이그레이션 009: page_contents.created_by / updated_by 컬럼
  • 모든 페이지 편집 화면 (admin/customer/system) 에서 자동 기록

Added

  • 작성 글 카운트 - 게시판은 rzx_translations (board_post.{id}.title) 분리 구조 인지

Added

  • 어드민 설정에서 호스팅별 용량 한도 / 경고 임계값 / 정책 (block/notify/none)
  • 마이페이지 사용량 도넛 차트
  • scripts/db-quota-monitor.php 백그라운드 모니터

Added

  • VosCMS 재설치 버튼 — 어드민 호스팅 탭
  • 호스팅 [상태] 변경 액션 + 로그
  • "서버 접속정보 설정" 편집 폼 제거 (불필요한 노출 차단)

Fixed

  • 스크랩 add_scrap 네트워크 오류 — vos-story API 파일 require 충돌
  • 스크랩 카드 — 아웃라인 + 삭제·편집 아이콘 (휴지통)
  • 작성 글 카운트와 리스트 불일치 (status 필터 누락)
  • nick_name 매칭 제거 (user_id NULL 시드 데이터 오인 방지)
  • 마이페이지 스토리 메뉴 위치 — top → main (플러그인 자동 인식)
  • 스토리 메뉴 아이콘 코어 형식 (full <path> 태그)
  • 부가서비스 탭 settings SELECT key 컬럼 누락 (두 섹션 숨김)
  • hosting_status 액션 500 — 헬퍼 함수 정의 위치
  • 페이지 액션 바 — 콘텐츠 너비 토큰 적용
  • 새 글 게시 시 기존 글 사라지는 버그 (피드 즉시 갱신)
v2.5.0 2026-05-01 · 1개월 전
도메인 추가 모달 + 회계 전표 + 부가서비스 결제 + 1:1 상담 인프라

Added

  • 호스팅 상세 → 도메인 탭 → + 도메인 추가 버튼 → 모달
  • 옵션: 무료 서브도메인 / 신규 등록 / 보유 도메인 연결
  • WHOIS 검색 (/api/domain-check.php 재사용) + TLD별 가격 표시
  • 결제: 저장 카드 (호스팅 PAY.JP customer 재활용) 또는 새 카드 (PAY.JP Elements)
  • 부가세 10% 자동 분리 (소계 / 부가세 / 합계)
  • 결제 완료 시 호스팅 sub metadata.added_domains[] 에 append (별도 sub 생성 안 함)
  • 자동 환불 안전망 — DB 처리 실패 시 PAY.JP charge 자동 환불

Added

  • 시작일~만료일 + 검사 버튼 (DNS A/CNAME → 우리 zone 또는 Cloudflare IP 대역 매칭)
  • 자동연장 토글 + 연장 신청 버튼 (도메인 단위)
  • registrar_pending / manual_attach_pending 시 검사 버튼 → "준비중" 배지
  • "추가 도메인" 보라색 배지

Added

  • 호스팅 관리 사이드바 2번째 항목 신규
  • 통합 일람: type='domain' sub + 호스팅 sub.added_domains[] 모두 시간순 표시
  • 통계 카드 (전체/처리 대기/완료) + 필터 (상태·옵션·검색)
  • 액션: [등록 완료] / [취소 처리] (취소 시 PAY.JP 환불 + 환불 row INSERT)
  • 사용자 이름 자동 복호화

Added

  • 호스팅 관리 사이드바 3번째 항목 신규
  • rzx_payments 기반 거래 원장 — 매출/환불/순매출/부가세 통계 카드
  • 일본 부가세 신고용 본체분 자동 계산 (총액 표기 → 본체 = total × 100/110, 부가세 = total × 10/110)
  • 최근 12개월 추이 표 + 거래 원장 테이블 + 필터/페이지네이션

Added

  • 마이페이지 부가서비스 탭에 "추가 신청 가능" 섹션 (비즈니스 메일 자동 제외)
  • 가격별 액션:
  • 무료 (설치 지원): admin 알림 + order_logs
  • 견적 (커스터마이징): "견적 요청"
  • 정가 recurring (기술 지원 1년): 카드 결제 모달 (_addon-pay-modal.php)
  • 결제 완료 시 addon sub 자동 생성 + payments 전표
  • 이미 활성 sub 라벨 일치 시 신청 버튼 자동 비활성
  • install_info 행 우측 [관리자 가기 / 홈페이지 가기] 버튼

Added

  • DB 스키마: uk_payment_order UNIQUE 제거 → uk_payment_key (charge_id) UNIQUE 로 교체
  • 한 order 에 여러 결제 row 허용 (호스팅 + 도메인 + 부가서비스 누적)
  • 환불 시 paid row 변경 X, 별도 refund row INSERT (status='refund', 회계 정합성)
  • 일본 7년 보존 의무 + PAY.JP 가맹점 분쟁 대응 표준 충족

Added

  • composer require minishlink/web-push
  • VAPID 기반 admin/supervisor 푸시 송신 헬퍼
  • 만료 endpoint 자동 정리 + rzx_push_messages 자동 기록
  • 호출 지점: pay_domain (도메인 결제 완료), service-order (도메인 등록 신청), request_addon

Added

  • 우리 zone 의 서브도메인 자동 매칭 (wildcard CNAME 인식)
  • Cloudflare IPv4 15개 CIDR 대역 매칭 (proxy 응답 시)
  • "already_refunded" 응답을 success 로 정상 처리 (PAY.JP 이미 환불 시)

Added

  • 서브쿼리로 rzx_payments 합계 조회 (paid − refunded)
  • 호스팅 기본 결제 + 도메인 추가 + 부가서비스 결제 누적 표시

Added

  • admin_cancel_addon — sub status='cancelled' + PG 환불 + 환불 row INSERT
  • PG 라우팅: payment row 의 gateway 컬럼 기준 (PG 변경 후에도 안전)

Removed

  • 일본 7년 보존 의무 + PAY.JP 분쟁 대응 정책에 따라 admin UI 의 "삭제" 모두 제거
  • 휴지통 아이콘 + adminDeleteAddon JS + admin_delete_addon API + 13개국어 라벨 4개 모두 제거
  • "취소(Cancel)" 만 사용 — 데이터 row 절대 DELETE 안 함

Fixed

  • Translator placeholder colon prefix 충돌 — [':count' => N]['count' => N] 일괄 수정
  • PayjpGateway::refund() 의 metadata[refund_reason] PAY.JP 거부 → refund_reason 으로 변경
  • service-manage.php 관리자 권한 검사 — role === 'admin'role IN ('admin','supervisor') 5개 액션 일괄
  • 서비스 주문 도메인 탭 환불 후 회계 카드 음수 표기 → SQL 로직 정합성 정정 (status='paid' / 'refund' 분리 합산)

Added

  • ssh.21ces.com Cloudflare Tunnel 등록 (Public Hostname: SSH → localhost:22)
  • 외부 PC: cloudflared access ssh --hostname ssh.21ces.com 또는 ~/.ssh/config ProxyCommand
  • 서버측: PermitRootLogin no, thevos 키 등록 완료
v2.4.3 2026-04-29 · 1개월 전
VosCMS 자동 설치 완성 + 호스팅 마이페이지 백업/phpMyAdmin

Added

HostingProvisioner.php installVoscms() 가 zip deploy 후 install-core.php 를 step 3 → step 4 시퀀셜 호출 (이전엔 step 2 만):

  • 신규 runInstallCoreSteps()_db POST fallback 활용한 세션 우회 + .installed 마커 검증
  • 신규 callInstallCore() — HTTP loopback (port 80, Cloudflare edge SSL 활용; rate limit 시 origin 인증서 부재 대응)
  • 신규 appendHostingEnv() — install-core.php 가 .env 덮어쓴 후 HOSTING_* 변수 재주입
  • 자동 설치 완료 시 welcome.html 자동 제거 (VosCMS index.php 우선되도록)
  • 결제 흐름 service-order.php:567-576 — install 성공 시 addon metadata 의 install_completed_at, install_admin_url 자동 기록 (마이페이지 탭 노출 트리거)

Added

admin/service-orders/detail.php:175-260 + partials/addon.php:

  • 부가서비스 탭의 "설치 지원" addon 에 두 가지 버튼:
  • VosCMS 설치 (보라색) — install_info 있고 install_completed_at 없을 때
  • 관리자 페이지 (녹색) — 설치 완료 후 새 창으로 admin URL
  • API 액션 admin_run_voscms_install — HostingProvisioner.installVoscms() 직접 호출, DB 자격증명 metadata.server.db 또는 customer .env 폴백
  • 설치 성공 시 addon metadata + voscms_installed order_log 기록

Added

customer/mypage/service-partials/hosting.php:

  • 🟢 사이트 백업 버튼 — service-manage.php?action=request_backup (신규)
  • mysqldump → DB 덤프 + zip(public_html, .env, sql) 패키징
  • 서명 다운로드 URL (HMAC, 10분 만료) — api/backup-download.php 신규
  • 7일 넘은 백업 자동 정리
  • 🟣 phpMyAdmin 열기https://pma.voscms.com/?lang=<user_locale> 새 창
  • nginx vhost: pma.voscms.com.conf 신규 (Cloudflare Tunnel *.voscms.com 와일드카드로 자동 라우팅)
  • 사용자 본인 DB 자격증명으로 로그인
  • DB 접속정보 표시 (host / DB명 / user / password 토글)
  • 13개 언어 i18n: btn_site_backup, btn_open_phpmyadmin, confirm_site_backup, backup_in_progress, backup_ready, f_password, password_notice, f_protocol

Added

customer/mypage/service-partials/_setup-monitor.php:

  • 호스팅 셋업 → VosCMS 자동 설치 단계 분리
  • system_imported 주문 (사장님 본인이 가진 vos.21ces.com 등 시스템 등록 호스팅) 은 즉시 활성 처리 — 모니터링 박스 미표시
  • 13개 언어 신규 i18n: setup_step_voscms_install

Changed

rsync exclude 추가:

  • 5개 내부 플러그인 (호스팅 고객 사이트에 안 들어가야 함):
  • vos-developer, vos-hosting, vos-license-server, vos-market, vos-salon
  • 7개 reservation 마이그레이션 SQL (호스팅 고객은 예약 시스템 미설치):
  • 001_create_reservation_tables.sql, 011_seed_service_translations.sql, 012_seed_service_translations_p2.sql, 013_add_source_to_reservations.sql, 014_add_payment_status_to_reservations.sql, 015_create_reservation_core.sql (신규), 016_alter_reservation_services.sql, 024_reservations_bundle_columns.sql

dev files 제거 추가:

  • admin/ 디렉토리 (offline.html 잉여물) — 빈 디렉토리라 nginx 디렉토리 인덱싱으로 403 발생, root /offline.html 만 sw.js 가 참조하므로 admin/ 잉여
  • 기본 인코딩 → obfuscate.php (이전 ionCube EVAL 은 런타임 hang 발생, USE_IONCUBE=1 시에만 ionCube)

Changed

001_create_base_tables.sql 가 base + reservation 을 한 파일에서 같이 만들던 구조 분리:

  • 수정: 001_create_base_tables.sql — 핵심 5개 테이블만 (rzx_admins, rzx_users, rzx_member_grades, rzx_settings, rzx_migrations) + 핵심 시드 (member_grades 기본, settings 기본)
  • 신규: 015_create_reservation_core.sql — 예약 9개 테이블 (rzx_categories, rzx_services, rzx_service_options, rzx_reservations, rzx_payments, rzx_point_transactions, rzx_business_hours, rzx_holidays, rzx_staff_positions, rzx_staff) + 예약 시드 (business_hours, point_*)

호스팅 dist 빌드 시 015 exclude → rzx_reservations 테이블 미생성 → admin/dashboard.php:25-27 의 $hasReservations = false카렌다 자동 미표시.

본사 사이트 (voscms.com) 와 RezlyX 본진 등 예약 시스템 사용처는 두 SQL 파일 모두 적용됨 → 변화 없음.

Changed

config/templates/nginx-vhost.conf.tpl + HostingProvisioner addHttpsToVhost():

  • 기존: port 80 (HTTPS 리다이렉트) + port 443 (실 컨텐츠) → Cloudflare Tunnel + 80→443 리다이렉트로 무한 루프 발생
  • 변경: 80/443 통합 단일 server 블록, 컨텐츠 동일 서빙, 리다이렉트 없음
  • fastcgi_read_timeout 60s → 300s (대량 INSERT 시 nginx 타임아웃 방지)

Changed

  • provision-hosting.php (CLI 백필 도구): hosting subscription metadata 자동 갱신 (hosting_provisioned, server.{ftp,db,env}) — 이전엔 service-order.php 의 _autoProvisionHosting 만 수행
  • 5개 내부 플러그인 + admin/ 디렉토리 자동 제거

Added

scripts/install-cli.php 신규:

  • 호스팅 프로비저닝 후 install-core.php 자동 호출 백필
  • DB 자격증명: subscription metadata 우선, 없으면 customer docroot 의 .env 폴백
  • 사용: sudo -u www-data php scripts/install-cli.php --order=<ORDER>
  • 성공 시 addon metadata 의 install_completed_at 자동 기록 + order_logs 의 voscms_installed 액션

Fixed

  • 카드 결제 분기에 _autoProvisionHosting() 호출 누락 — 추가
  • 결제 metadata 의 install_info.admin_pw 가 평문 노출되던 표시 → 마이페이지 / 관리자 양쪽 토글 (👁) 패턴 통일

Migration Notes

  • 외부 호스팅 고객: 별도 작업 불필요. voscms-2.4.3.zip 빌드 후 자동 설치 흐름이 깨끗한 zip 사용.
  • 본사 (voscms.com): 변경 없음 (reservation SQL 두 파일 모두 적용됨).
  • 기존 호스팅 고객 (dwhahn 등): deprovision + reprovision 로 깨끗하게 재설치 권장 (분리 후 새 zip 적용).
  • manual cleanup: /etc/nginx/sites-available/pma.voscms.com.conf 신규 추가됨 — 본사 시스템에 직접 배포 (rsync 외).
v2.4.2 2026-04-29 · 1개월 전
호스팅 자동화 결제 hook + 활동 로그 i18n

Added

service-order.php 의 결제 완료 직후 호출:

  • 신규 함수 _autoProvisionHosting($pdo, $prefix, $orderId, $orderNumber) — 결제 transaction 외부 실행 (DB 무결성 격리, 실패해도 주문 자체 영향 없음)
  • domain_option = 'free' 만 즉시 셋업 (Cloudflare 서브도메인 — DNS 자동 등록 끝났으므로 바로 가능)
  • new (도메인 구매 후 NS 변경 대기) / existing (보유 도메인 NS 변경 대기) 은 deferred — 관리자가 도메인 활성화 시점에 별도 트리거
  • 'install' addon 의 install_info 있으면 voscms 파일 deploy + .env 자동 생성 (install-core.php 사용자 마법사 진행 시 DB 정보 미리 주입됨)
  • 호스팅 subscription metadata.server 에 ftp/db/env 정보 자동 저장 → 마이페이지 호스팅 탭에서 자동 표시 (UI 변경 불필요)
  • order_logs 액션: hosting_provisioned / hosting_provision_skipped / hosting_provision_deferred / hosting_provision_failed

호출 순서: 결제 commit → _autoProvisionHosting()_autoProvisionMailDomain()

Added

관리자 서비스 주문 상세 페이지 (detail.php:498-528) 의 $actionLabels 가 8개 → 31개로 확장. 활동 로그에서 코드(mail_account_added 등) 그대로 보이던 문제 수정.

매핑 추가된 액션:

  • 메일: mail_account_added/deleted, mail_address_changed, mail_provisioned/_skipped/_failed, mail_domain_migrated/activated, bizmail_upgrade_request
  • 호스팅: hosting_provisioned, hosting_provision_skipped/deferred/failed, hosting_deprovisioned
  • 부가서비스: admin_add_storage_addon, admin_delete_addon, storage_addon_paid/requested
  • 시스템: customer_notified, setup_email_sent, server_info_updated, bulk_extended, manual_capacity_period_fix

각 액션별 색상 의미: green(완료/긍정), amber(보류/경고), red(실패/삭제), blue(정보/알림), violet(관리자/특수), zinc(중립).

i18n 키 23개 — services.admin_orders.act_* — ko/ja/en 3개 언어 추가 (운영자 페이지). 다른 10개 언어는 fallback (영어).

Changed

호스팅 자동 프로비저닝 시 voscms 자동 설치는 파일 deploy + .env 자동 생성까지만 수행. install-core.php 의 step-by-step 세션 흐름 (step 2~5) 자동화는 voscms 의 install 파이프라인 자체를 재설계해야 하는 큰 작업이라 Phase 5 별도 진행. 사용자가 결제 완료 후 https://<도메인>/install.php 접근 → 마법사 진행 (DB 정보는 .env 에 미리 주입됨).

installVoscms() 반환값 변경 — install_url + note 안내 메시지.

v2.4.1 2026-04-29 · 1개월 전
호스팅 가상화 자동 프로비저닝 (Phase 1~3)

Added

HostingProvisioner.php — 호스팅 신청 시 자동 셋업하는 메인 클래스. 9 단계 트랜잭션 (실패 시 역순 롤백):

  • Linux 사용자 생성 (vos_<order_number>, 32자 한계 내, 대소문자 보존)
  • 디렉토리 구조: /var/www/customers/<order>/{public_html,logs,tmp} (chmod 750/2775/750/1770)
  • 디스크 쿼터 (setquota -u <user> <soft> <hard>, hard = soft × 1.1)
  • 디렉토리 충돌 검증: 기존 nginx vhost / reserved_subdomains 와 충돌 시 거부
  • 1.9TB SSD /var/www 마운트 (ext4 + noatime + usrquota,grpquota)
  • 중앙 sudoers (/etc/sudoers.d/voscms-hosting-provisioner) — www-data 가 useradd/setquota/nginx 등 root 명령 NOPASSWD 실행
  • 명령별 인자 패턴 제한 (vos_, /var/www/customers/, *.conf) — visudo 검증 통과

CLI 도구 scripts/provision-hosting.php:

php provision-hosting.php SVC260428AE7476 hotel.com 1GB
php provision-hosting.php --order SVC260428AE7476           # DB 자동 조회
php provision-hosting.php --deprovision SVC260428AE7476 hotel.com
php provision-hosting.php --install-voscms <order> <domain> <capacity>

템플릿 config/templates/:

  • nginx-vhost.conf.tpl — HTTP + ACME challenge 위치 + per-user FPM socket
  • welcome.html.tpl — 활성화 환영 페이지

Added

각 호스팅이 자기 사용자 권한으로 PHP 실행 (사이트 간 침해 방지) + Cloudflare proxy 뒤에서도 SSL 자동 발급.

config/templates/php-fpm-pool.conf.tpl:

  • user = vos_<order> / group = www-data — uid 격리
  • listen = /var/run/php/<order>.sock — 사용자별 socket
  • pm = ondemand — 트래픽 적은 호스팅에 메모리 효율
  • php_admin_value[open_basedir] — 사이트 디렉토리 + /tmp + /usr/share/php 만 접근
  • disable_functions — exec, passthru, shell_exec, system, proc_open, popen, pcntl_exec
  • session.save_path / upload_tmp_dir — 사용자 디렉토리로 격리
  • env: HOSTING_ORDER / HOSTING_USER / HOSTING_DOMAIN

Let's Encrypt SSL — Cloudflare DNS-01 challenge:

  • python3-certbot-dns-cloudflare 플러그인
  • /etc/letsencrypt/cloudflare/credentials.ini (root 0600, .env 의 CLOUDFLARE_API_TOKEN)
  • Cloudflare proxy 뒤 / 외부 도달성 무관하게 발급
  • HTTPS server 블록 자동 추가 (TLS 1.2/1.3, 강한 cipher, HSTS, X-Frame-Options, X-Content-Type-Options)
  • HTTP → HTTPS 301 자동 리다이렉트
  • certbot.timer 매일 2회 자동 갱신 (이미 활성화)

Added

호스팅 신청 시 자기 DB + 자기 user 격리.

  • hosting_admin MySQL 계정 (1회 생성, ALL PRIVILEGES + GRANT OPTION) — DB 관리 전용
  • DB 명/user = vos_<order> (Linux 사용자명과 동일)
  • 비밀번호 32 hex 랜덤 (bin2hex(random_bytes(16)))
  • GRANT ALL PRIVILEGES ON vos_<order>.* TO vos_<order>@localhost — 자기 DB 만 접근
  • 격리 검증: 다른 호스팅 DB / voscms_prod 접근 시 Access denied 1044

VosCMS 자동 설치 (installVoscms()--install-voscms 또는 addon install_info 있을 때):

  • voscms-dist/voscms-X.Y.Z.zip 최신 패키지 압축 해제 → public_html
  • .env 자동 생성: APP_KEY=base64:<32바이트> / DB 정보 / HOSTING_ORDER 주입
  • 권한: vos_:www-data, .env chmod 640
  • install-core.php headless 호출 (현재 301 redirect 이슈, Phase 4 와 함께 마무리 예정)

Verified

provision DEMO260429FULL demo07.21ces.com 1GB --install-voscms:

  • ✅ 사용자 vos_DEMO260429FULL (uid 격리, www-data 그룹)
  • ✅ 디스크 쿼터 1GB soft / 1.05GB hard
  • ✅ PHP-FPM pool 자기 socket
  • ✅ nginx vhost (HTTP + HTTPS, HSTS)
  • ✅ Let's Encrypt SSL (/etc/letsencrypt/live/demo07.21ces.com/)
  • ✅ MySQL DB vos_DEMO260429FULL + user (격리 검증)
  • ✅ VosCMS 2.3.9 파일 + .env 배포

deprovision: 모든 자원 깨끗 정리 (사용자/홈/DB/FPM pool/nginx/SSL).

v2.4.0 2026-04-29 · 1개월 전
호스팅 자동화 인프라 + Calendar 청구 + 메일 시스템 완성

Added

업계 anniversary 방식(가입일 ~ 1년 뒤 같은 날) 대신 calendar 월말 마감(다음 달 1일 ~ 만료월 말일)으로 변경. 같은 달 가입자는 만료일이 동일해 cron 일괄 처리·회계 마감이 단순해진다. 일본 호스팅 표준(月末締め翌月1日請求) 패턴.

  • DB: rzx_subscriptions.billing_start DATETIME NULL 컬럼 추가 (정상 청구 시작일)
  • 헬퍼: _proratedFirstAmount (월단가÷30 × 잔여일수), _calendarBillingStart (다음달 1일), _calendarExpires (말일 23:59:59)
  • 신청서: 호스팅 결제 항목에 hosting_prorated 자동 추가 (예: 4/2 가입 12개월 ¥1,000 → 첫 달 ¥967 + 정상 12개월 ¥12,000 = ¥12,967)
  • 도메인은 anniversary 유지(1년 단위 등록), 호스팅·메일·메인터넌스·애드온은 calendar
  • service-order.php 의 -1 second-1 day 처리도 통일
  • 부가서비스 (웹 용량 추가) 도 동일 일할 + 정상 N개월 합산. 호스팅 만료일과 자동 동기화

Added

ConoHa VPS (133.117.72.149) 에 Postfix + Dovecot + Rspamd + Roundcube + OpenDKIM + Let's Encrypt 셋업. mail-tester 10/10, FCRDNS 검증. 신청 시 도메인 자동 셋업.

  • DNS 자동 등록 (CloudflareDns.php) — A / MX / SPF / DKIM / DMARC 5종 일괄
  • DKIM 키 생성 — mx1 SSH rspamadm dkim_keygen (전용 ed25519 키 storage/keys/mailsync_ed25519, www-data 소유 0700)
  • 3-mode 프로비저닝 (MailDomainProvisioner.php): free (서브도메인 즉시) / new (도메인 구매 후 관리자 활성화) / existing (NS 변경 안내). existing_pending / new_pending / active mode 머신.
  • 비밀번호: SHA512-CRYPT ({SHA512-CRYPT}$6$...) — Dovecot 호환 단방향 해시. 옛 enc: (encrypt 함수) 비번 마이그레이션 스크립트 scripts/migrate-mail-passwords.php
  • mx1 동기화 cron (scripts/mail-sync-to-mx1.php) — voscms_prod → mx1 mail_lookup virtual_users 5분 간격. 즉시 트리거(triggerMailSyncToMx1())도 추가해 메일 액션 직후 백그라운드 sync
  • cron 자동 등록: /etc/cron.d/voscms-mail-sync
  • 알림: 관리자(프로비저닝 필요) / 고객(메일 사용 가능) HTML 메일 템플릿 (MailNotifier.php)

Added

기본 메일 / 비즈니스 메일을 호스팅과 묶어 관리. 같은 주소가 mail subscription + hosting metadata 양쪽에 저장돼 UI 에 중복 표시되던 문제 수정 (single source of truth: mail subscription).

  • 웹메일 버튼 — Roundcube ?_user=주소 GET 파라미터로 username prefill, target="_blank". URL 우선순위: metadata.mail_server.webmail_urlWEBMAIL_URL env → 기본 https://mail.voscms.com/
  • 이메일 변경 버튼 — 오타 수정용. 도메인은 고정, local part 만 변경. 같은 주문의 모든 mail+hosting metadata 동기화
  • dedup 로직 (mail.php) — _seenAddresses 로 중복 주소 한 번만 표시, mail subscription 우선
  • service-detail.php 가상 hosting → mail 변환은 진짜 mail subscription 이 없을 때만 동작 (옛 데이터 호환)
  • service-order.php 가 신규 가입 시 hosting metadata.mail_accounts 저장 안 함 (mail subscription single source)

Added

마이페이지 부가서비스 탭에 호스팅 용량 추가 결제. PAY.JP customer 등록 + chargeCustomer.

  • 모달: 용량 선택(1GB/3GB/5GB) + 카드 정보 입력 (payjp.js v2 Elements)
  • 카드 등록 / 다른 카드로 결제 / 등록 카드로 돌아가기 토글
  • 만료/거절 카드 자동 감지 (expired_card, card_declined, invalid_* 등 PAY.JP 에러 코드) → 카드 폼 자동 노출 + 안내 배너
  • 카드 명의 입력 필드 추가 (addon-card-holder) — 토큰에는 안 넣고 customer metadata 로 저장 (PAY.JP v2 Elements 는 name 옵션 미지원)
  • Portal 패턴: document.body.appendChild() 로 transform 걸린 컨테이너 벗어나 viewport 전체 덮음 (z-[9999])
  • 신규 customer 생성 후 charge 실패 시 자동 환불 + customer 삭제 (orphan 방지)
  • 호스팅 metadata.extra_storage[] 누적, hosting 탭 용량 게이지 합산 표시

Added

StarServer 등 일본 호스팅사 표준 약관 참고하여 14개 조항(정의·신청·요금·자동 갱신·해지·서비스·백업·금지·정지·보수·개인정보·면책·변경·관할) 구성. Calendar 청구 방식 + 첫 달 일할 + 해지 시 미사용 개월 환불 정책 명시.

  • 시스템 페이지 등록: config/system-pages.php hosting-terms slug, 🖥️ 인디고
  • 페이지 에디터 매핑: pages-document.phppageMetaMap['hosting-terms']
  • DB 시드: ja(메인) / ko / en 3개 언어 본문 (rzx_page_contents)
  • i18n: site.pages.hosting_terms + hosting_terms_edit(editor_title/desc)

Added

  • 4개 탭 항상 노출 (detail.php) — hosting/domain/mail/addon. 데이터 없으면 빈 상태 메시지(empty_*)
  • 부가서비스 탭+ 용량 추가 버튼 (관리자 무료 부여 모달, 용량 선택 시 즉시 active addon subscription 생성, billing_amount=0, expires=호스팅 만료일) + 항목별 휴지통 삭제 버튼 (소프트 삭제 status=cancelled, hosting metadata.extra_storage[] 에서 제거)
  • 목록 — 신청자 표시 개선 (index.php) — supervisor/admin role 인 시스템 관리자 주문은 user.name + 보라색 부제 슈퍼관리자: [email protected] 형태로 표시 (옛 암호화 형식 applicant_nameFKzGx9SE7xG/2 복호화 실패 우회)
  • 신청서 작성 버튼 (+ New Order) — UI 만, 기능 추후
  • i18n 13개국어: role_supervisor, role_admin, btn_create_order, empty_, btn_add_storage_addon, btn_delete_addon, modal_add_storage_, confirm_, alert_ 등 20+ 키

Added

  • subdomain-check.php — DB(reserved_subdomains) 우선 + Cloudflare API fallback. JS checkSubdomain() 이 서버 호출 후 결과 반영
  • service-order.php 결제 직전 서버 측 재검증 — 클라이언트 우회 방지
  • reserved_subdomains 자동 import — Cloudflare zone 의 기존 레코드 11개 (vos/bestatech/bt/dev/ec430/ec431/salon/ssh/test/thevos/ai.21ces.com)
  • 메뉴 INSERT IGNORE 버그 수정 (menus-api.php):
  • add_menu_item: INSERT 직후 stale 번역 정리 + INSERT ... ON DUPLICATE KEY UPDATE 로 덮어쓰기
  • update_menu_item: title/url 변경 감지 시 옛 번역 13개 모두 삭제 + 시스템 페이지면 재등록
  • rename_menu_item: title 변경 시 옛 번역 정리
  • 옛 메뉴(id=38, "VosCMS 소개") 다국어 번역이 새 호스팅 이용 규약 메뉴를 가리던 회귀 수정

Added

서비스 신청 → 결제 완료 → 자동 메일 도메인 프로비저닝 → 고객 알림 흐름 구축.

  • service-order.php 에 _autoProvisionMailDomain() 호출 — 결제 transaction 외부에서 실행 (DB 무결성 격리)
  • DB: rzx_reserved_subdomains (zone, subdomain, record_type, reserved_by, reason) — 가용성 캐시
  • DKIM 키 자동 생성 후 metadata.mail_provision 에 mode/origin/domain/zone/subdomain/provisioned_at 저장
  • 프로비저닝 모드별 UI 분기 (service-detail.php): pending / new_pending / existing_pending 모드면 탭 숨기고 모니터링만 표시 (_setup-monitor.php), active 일 때만 탭 노출

Fixed

PHP 의 $arr['key'] ?? [] 은 임시 값을 반환하므로 &$ref 가 원본 array 에 영향을 주지 않음. change_mail_password / change_mail_address 가 success 응답은 보냈지만 metadata UPDATE 가 무영향이라 비밀번호와 주소 변경이 모두 silent fail.

  • 인덱스 기반 직접 갱신 패턴으로 변경: foreach ($arr as $i => $item) { $arr[$i]['k'] = ... }
  • service-order.php 의 신규 메일 비밀번호 저장도 encrypt() (양방향) → mail_password_hash() (SHA512-CRYPT) 로 수정

Fixed

  • 결제 요약 녹색 형광색 → 선명한 색상: text-green-400text-green-600 dark:text-green-400 (7개 위치)
  • subdomain 가용성 응답 메시지 i18n 키 누락 (order.php 의 PHP→JS i18n 매핑 + :fqdn 플레이스홀더 통일)
  • 만료일 계산 정확화: +N months -1 second (같은 날짜) → +N months -1 day (정확히 1일 전) → calendar 방식으로 최종 통일

Database

  • rzx_subscriptions.billing_start DATETIME NULL 추가 (dev + prod)
  • rzx_reserved_subdomains 테이블 (Cloudflare zone 충돌 캐시)
  • rzx_page_contents 에 hosting-terms (ja/ko/en) 시드
v2.3.9 2026-04-27 · 1개월 전
서비스 신청 다국어 + 3-영역 메뉴 시스템

Added

도메인·호스팅·부가서비스·신청자·결제·요약 6개 영역과 결제 완료 페이지의 모든 텍스트를 13개국어로 번역. JS 측 alert/모달 텍스트는 var I18N = {...} + t(key, replace) 헬퍼 패턴으로 PHP에서 주입.

  • 위치: plugins/vos-hosting/lang/{13 locales}/services.php — services.order.* 200+ 키
  • 마이페이지 서비스 상세: services.detail.* 70+ 키, service-detail.php
  • 어드민 주문 관리: services.admin_orders.* 115+ 키, admin/service-orders/
  • DB 저장된 한국어 라벨(호스팅 플랜·메인터넌스·애드온)은 _localizeLabel($sub) 클로저로 settings ID 매핑 후 db_trans() 적용 → 마이페이지/어드민 양쪽 동일 처리

Added

결제 버튼 클릭 시 신청 내역(도메인/플랜/부가서비스/신청자/약관) 검증 후 요약 모달 출력 → 사용자 확인 → 결제 진행. 빈 서브도메인 등록 같은 실수 방지.

  • order.js — showOrderConfirmModal(), closeOrderConfirmModal(), confirmAndPay()
  • 결제 완료 후 모달 잔여 레이어 제거 강화 (DOM 삭제 + body/documentElement overflow 리셋)

Added

부가서비스에서 "설치 지원"(_id='install') 체크 시 관리자 ID/이메일/비밀번호/사이트명 입력 폼 표시. 비밀번호는 마스킹 + 눈 아이콘 토글 + "설치 후 변경" 안내. 입력값은 subscription metadata 의 install_info 로 저장되어 마이페이지/어드민 양쪽에서 표시.

  • 입력: _addons.php
  • 표시: 마이페이지/어드민 partials/addon.php (파란 배경 박스 + 비밀번호 토글)

Added

부가서비스 탭에 묶여 있던 메모를 주문(rzx_orders.admin_notes) 단위로 변경. 부가서비스 유무와 관계없이 우측 활동 로그 위에 항상 7줄 textarea 로 표시. AJAX update_order_memo 액션 추가.

Added

코어 메뉴와 플러그인 메뉴 사이 시각적 구분을 위해 section 필드 도입 (top/main/bottom, 기본 main). 영역 사이에 자동 구분선이 들어가며, 영역에 표시 가능한 메뉴가 없으면 구분선 포함 통째로 스킵.

어드민 사이드바:

  • top: 대시보드 / 회원 관리 / 사이트 관리 / 자동 설치(vos-autoinstall)
  • main: VosCMS 라이센스(vos-license-manager) / 호스팅 관리(vos-hosting)
  • bottom: 플러그인 / 설정
  • 변경: config/admin-menu.php, admin-sidebar.php

마이페이지 사이드바:

  • top: 대시보드 / 프로필 / 메시지
  • main: 서비스(vos-hosting 자동 추가) — 다른 플러그인이 추가하면 자동 누적
  • bottom: 설정 / 비밀번호 / 회원탈퇴 / 로그아웃
  • 변경: config/mypage-menu.php, mypage-sidebar.php

플러그인 메뉴 등록: plugin.jsonmenus.admin / menus.mypage 항목에 section + position 으로 영역 지정. services 메뉴는 코어 mypage-menu.php → vos-hosting/plugin.json 으로 이전 (자동 등록).

Added

라이선스 검증 API와 개발자 포털 API가 코어에 있어 모든 voscms 사이트에 배포되면 외부 노출되는 문제 해결. 두 API를 신규 본사 전용 플러그인으로 분리.

  • vos-license-server (scope: hq_only): 7개 라이선스 엔드포인트 이전 (check, register, verify, stats, updates, register-plugin, _init)
  • vos-developer (scope: hq_only): 7개 개발자 포털 엔드포인트 이전 (register, login, submit, my-items, earnings, update-version, _init)
  • api/_plugin_dispatch.php — 코어 wrapper 가 rzx_plugins.is_active 체크 후 dispatch, 비활성 시 404
  • 코어 /api/license/.php, /api/developer/.php 는 wrapper 만 남김 (외부 호환 유지)
  • /api/notices.phpHQ_HOSTS env 화이트리스트 추가 (본사 voscms.com 도메인에서만 응답)
  • 빌드 스크립트(build-voscms.sh)는 api/license, api/developer, api/notices.php, vos-license-manager 를 이미 제외

Fixed

  • 호스팅 계약 만료일 +1일 버그 (+12 months+12 months -1 second) — subscription/free/paid/bank 4곳 적용
  • 비즈니스 메일 2개 이상 추가 안 되는 버그 (selector 가 X 버튼을 잡던 문제)
  • 주문 요약에서 추가 용량 미취합 (storage select 의 name 속성 누락)
  • 호스팅 플랜 라벨 다국어 미적용 — service_hosting_plans._iddb_trans() 매칭으로 해결
v2.3.8 2026-04-25 · 1개월 전
게시판 다국어 완성 + FAQ/Q&A 스킨

Added

_init.phprzx_translations 에서 board.{id}.{title|description|header_content|footer_content|seo_keywords|seo_description} 을 직접 조회 (현재 로케일 → en → 원본). list/read/write/settings 어느 페이지에서도 $board[$field] 가 자동 번역값으로 채워짐. 게시판 설정 페이지의 "← 돌아가기" 버튼도 같은 메커니즘으로 자동 번역.

이슈 게시판(id=6) 의 title + header_content 13개국어 시드 (안내문 HTML 구조 유지, 텍스트만 번역, 처리 단계 배지도 각 언어로). 시드 스크립트: scripts/seed_issue_i18n.php + scripts/seed_issue_i18n_data.php.

Added

rzx_board_extra_vars 의 정의(라벨·설명·선택지·기본값)를 13개국어로 번역. 4개 필드 × 13 = 52 row.

  • ExtraVarRenderer::renderAll($vars, $values, $mode, $boardId) — boardId 인자 추가, applyDefTranslations() 가 한 쿼리로 모든 var의 번역을 일괄 로드.
  • ExtraVarRenderer::getOptionLabel($boardId, $varName, $value) — 목록 뷰용 단일 옵션 번역 라벨 조회 (정적 캐시).
  • renderStatusBadge($value, $size, $displayLabel = null) — 색상은 원본(ko) 매핑 유지, 텍스트만 번역 → 어느 언어에서 보든 색상 일관 (받음=장미색, 해결됨=에메랄드색).
  • select/radio/checkbox: value=원본 / label=번역 패턴. 게시글 저장 시 항상 원본 값이 들어가 데이터 호환성 보장.
  • 호출부 업데이트: read.php, write.php, _list-row.php, default 스킨의 _list-card/_list-webzine/_list-gallery.

이슈 게시판 status 확장변수 13개국어 시드: scripts/seed_ev_status_i18n.php.

Added

extra_var_get API가 db_trans() 로 현재 로케일 번역값을 localized 객체로 함께 반환. JS 모달은 localized.title || ev.title 로 우선 표시 → 일본어 모드에서 모달 열면 "処理ステージ"가 자동 표시.

extra_var_update 는 로케일에 따라 분기:

  • 소스 로케일(ko) → 소스 row 전체 갱신 (기존 동작)
  • 비소스 로케일(ja/en/…) → 메타(var_type/권한/체크박스 3종)만 소스에 저장, 4개 번역 필드(title/description/options/default_value)는 rzx_translations 에 현재 로케일로 저장 → 소스 무결성 보장

확장 변수 일람의 표시 이름도 db_trans('board_ev.{boardId}.{varName}.title') 적용.

Added

확장 변수 편집 모달의 "편집 권한" 섹션(라벨·드롭다운 옵션·도움말)을 13개국어 lang 파일로 분리. 신규 키: site.boards.ev_permission, ev_perm_all, ev_perm_member, ev_perm_admin, ev_permission_help.

Added

확장 변수 편집 모달의 "선택 항목" 필드를 양방향 정규화:

  • 모달 로드: DB의 JSON 배열(["a","b","c"])을 줄바꿈 형식으로 변환해 textarea 에 표시 (안내 문구와 일치)
  • 저장 API: ev_normalize_options() 헬퍼가 줄바꿈 또는 JSON 입력 모두 받아 일관되게 JSON 배열로 저장. 기존엔 줄바꿈 입력 시 NULL 로 저장되던 버그 수정.

Added

이슈/공지 외 새로운 콘텐츠 패턴을 위한 두 스킨 신설.

FAQ (skins/board/faq/) — 글 = 질문, 본문 = 답변. 검색창·카테고리 필터·페이지네이션 포함. 타이틀 영역 표시 토글, 타이틀/서브타이틀 다국어, 배경(이미지·동영상·없음) 지원, 오버레이 투명도 조절. v1.0.1.

Q&A (skins/board/qna/) — 글 = 질문(제목+본문), 댓글 = 답변. 미답변 배지, 첫 항목 자동 펼침, 트리 정렬(parent_id/depth) 댓글 표시. 답글의 답글은 들여쓰기 + "↳ 답글" 라벨로 구분 (최상위는 "A."). 인라인 편집/답글 폼 (작성자/관리자만 편집, perm_comment 권한자만 답글). v1.0.0.

두 스킨 공통: 관리자 설정 톱니 아이콘을 검색창 아래 우측에 배치 (제목 영역에서 분리). boardSkinFile()_list-full.php 우선순위로 동작.

Added

api-comments.phpupdate 액션 추가. comment.user_id == 현재 사용자 또는 관리자만 수정 가능. 글자 수 제한 검증 후 content + updated_at 갱신.

Added

레이아웃 설정의 copyright 필드 안에서 {year} 토큰을 렌더링 시점에 현재 연도로 자동 치환. DB에는 원본({year} 포함)이 보존되어 매년 손댈 필요 없음. 적용: default/minimal/modern/base-footer.php. 4개 layout.json 의 카피라이트 description을 13개국어로 확장하면서 {year} 사용 안내도 자국어로 표시.

default/minimal 푸터에서 $_lc['copyright'] 를 무시하던 버그도 함께 수정 — 이제 레이아웃 설정값이 실제로 렌더링된다.

Added

menu_item.38.title 13개국어 시드 (VosCMS 소개 / About VosCMS / VosCMSについて / Über VosCMS / Acerca de VosCMS / À propos de VosCMS / Tentang VosCMS / VosCMS-ийн тухай / О VosCMS / VosCMS Hakkında / Giới thiệu VosCMS / 关于 VosCMS / 關於 VosCMS).

Added

처리 단계별 샘플 1개씩 + 기존 해결됨 1개 = 총 4개. 각 글의 title/content 13개국어 번역 (104 row).

단계제목 (ko)상태
접수[버그] 모바일 햄버거 메뉴 X 버튼이 동작하지 않습니다신규
확인 중[기능 요청] 댓글 작성 시 게시글 작성자에게 메일 알림신규
진행 중[성능] 마켓플레이스 상세 페이지 첫 로딩 속도 개선신규
해결됨게시판에 첨부한 이미지를 본문에 삽입...기존

기존 post 34 (Tailwind 인라인 스타일 누적된 테스트글) 삭제.

Fixed

customer/board/list.phprzx_admin_icons 헬퍼를 line 167에서 require 했는데, line 161에서 스킨 파일을 include 하면서 return 으로 빠져나갔기 때문에 FAQ/Q&A 스킨에서 rzx_admin_icons() 호출 시 500 에러 발생. require_once 를 스킨 include 위로 이동.

v2.3.7 2026-04-25 · 1개월 전
자동설치(AutoInstall) UX 통합 개편

Changed

이전 이름 /marketplace 잔존 참조 제거. 검색 폼이 /marketplace로 GET 제출되어 대시보드로 리디렉트되던 버그(검색·정렬·필터 변경 시 페이지 이탈) 해결. browse.php, item-detail.php, item-submit.php, purchases.php, assets/js/marketplace.js 모두 /autoinstall로 통일.

Added

install.php Step 4에서 관리자 경로 입력란 아래에 황색 힌트 + URL 실시간 미리보기 + 펼침형 "왜 변경해야 하나요?" 안내 추가. 자동 해킹 시도(브루트포스), 취약점 스캔, 강한 비밀번호의 한계 등 일반인도 이해할 수 있는 언어로 3가지 이유 제시. 13개 언어 모두 적용.

Added

install.php 설치 완료 단계에서 vos-autoinstall 플러그인을 자동 등록·활성화 (PluginManager::install() 직접 호출). 사용자가 별도 설치 없이 어드민 진입 즉시 마켓플레이스 사용 가능.

Added

market.21ces.com/api/market/catalog, /item?locale=xx 파라미터 지원. name, description, short_description, cat_name 다국어 JSON을 서버에서 단일 문자열로 반환 (폴백: 요청 로케일 → en → 첫 값). VosCMS 측 json_decode + locale 폴백 중복 로직 모두 제거 (browse.php, item-detail.php, _components/item-card.php).

Added

자동설치 마켓 API 응답 캐시(파일 기반)의 TTL을 PluginManager 설정으로 통합 관리. 하드코딩 30분 → 기본 5분, 1·5·10·30·60분 옵션. https://vos.21ces.com/theadmin/settings/general 마켓플레이스 캐시 섹션과 /theadmin/autoinstall/settings 양쪽에서 동일 설정을 읽고/쓰며 자동 동기화. 자동설치 페이지 우상단·일반 설정 페이지 양쪽에 즉시 캐시 갱신 버튼 추가. TTL 변경 시 기존 캐시 자동 무효화.

Added

마켓플레이스 어드민과 동일한 자료 유형 / 간단한 소개 / 슬러그 / Product Key / 최소 VosCMS·PHP 버전 / 파트너 / 가격 / 라이선스 테이블을 헤더 직후에 표시. 좌:우 영역 비율 2:1 → 3:1로 변경해 콘텐츠 영역 확대.

Added

상세 페이지 리뷰 탭 우상단에 "리뷰 작성" 버튼. 별점·닉네임·본문 입력 모달 → VosCMS API → 마켓플레이스 POST /api/market/item/review로 중계. VosCMS 라이선스 키 + 도메인 자동 첨부, 동일 도메인 1회 작성 제한, 구매자는 is_verified=1 자동 설정. 리뷰는 마켓 DB(rzx_mkt_reviews)에 status='pending'으로 저장 후 운영자 승인 시 공개. GET /api/market/item/reviews?slug=... 신설로 승인된 리뷰만 조회. 도메인은 부분 마스킹(mys***.com) 표시.

Added

기존 무료만 체크박스 → 전체 / 무료 / 유료 3-way 토글로 확장. 마켓 catalog API에 paid=1 파라미터 추가 (i.price>0). 검색창에서 분리해 뷰 토글 영역 앞으로 이동, 정렬 select와 함께 헤더 도구열로 통합.

Changed

검색 input 보더 border-2 border-emerald-300, 좌측 검색 아이콘에 녹색 배경 박스, 검색 버튼 bg-emerald-500. 키워드 입력만 남기고 정렬·필터 기능은 본문 헤더로 이동해 검색창 단순화.

Changed

상태표시
무료설치 + 다운로드
유료 (미구매)구매 (마켓플레이스 PAY.JP 결제 모달)
유료 (구매 완료)설치 + 다운로드
이미 설치됨"설치됨"

목록 페이지 4개 뷰(리스트/웹진/카드/그리드)도 동일 분기. 구매 슬러그 셋을 페이지 진입 시 한 번 조회해 사용. 결제는 마켓 POST /api/market/item/purchase에서 PAY.JP 결제 + 라이선스 발급 수행.

Changed

  • 뷰 스타일 토글: 텍스트 라벨 제거 → 아이콘 only + title / aria-label (접근성 유지)
  • 타입 배지: bg-<color>-100 밝은 배경 → bg-zinc-900/85 backdrop-blur-sm 검정 반투명 + 컬러 글씨 (이미지 위 가독성 확보)
  • 스크린샷 섹션: 헤더 직후 → 탭 콘텐츠 아래로 재배치, 마켓처럼 (개수) 카운트 표시
  • 상세 페이지 dark:prose-invert 작동 안 하던 문제 → CDN Tailwind에 typography 플러그인 추가
  • 상세 페이지 설명 영역: 마켓 어드민과 동일한 방식으로 <script>/<iframe>/<style>/onXX 등 위험 요소만 제거하고 HTML 마크업은 그대로 렌더링

Fixed

  • PAY.JP 카드 폼 입력 불가: 모달 hidden 상태에서 미리 mount되어 iframe이 0px로 그려지던 문제. lazy 초기화 + requestAnimationFrame mount로 해결
  • 위젯 thumbnail 누락: 마켓 DB에는 28개 위젯 등록됐으나 /var/www/market/widgets/에는 무료 위젯 12개만 복사된 상태. 14개 누락분 동기화. catalog/item API에 screenshots 절대 URL 변환 + 비존재 파일 자동 필터 추가
  • 번들 플러그인 미인증 경고: vos-autoinstallunauthorizedPlugins로 잡히던 문제. LicenseStatus.phpBUNDLE_PLUGINS = ['vos-autoinstall', 'vos-marketplace'] 상수 추가, active()/fromCache()/canUsePlugin() 모두 필터링. 라이선스 서버 verify.php에도 동일 처리
  • 위젯 중복 추가 가능성: install.php 시딩이 INSERT IGNORE만 사용했지만 rzx_page_widgets에 UNIQUE 제약이 없어 중복 가능. 시딩 시 DELETE FROM page_widgets WHERE page_slug='home' 후 INSERT로 변경 (DB UNIQUE 제약은 게시판 위젯 같은 의도적 중복 케이스 때문에 추가하지 않음)

Migration Notes

  • vos-autoinstall 플러그인 메뉴/라우트/마이그레이션이 새 설치에서 자동 활성화됨 (기존 설치는 어드민에서 한번 활성화 필요)
  • 마켓플레이스 API 캐시 기본 TTL 30분 → 5분 (가격·내용 변경 빠른 반영)
  • vos-autoinstall.cache_ttl 플러그인 설정 신규
v2.3.6 2026-04-21 · 2개월 전
마켓플레이스 API 라이브 연동

Changed

  • browse.php: 로컬 DB 조회 → market.21ces.com/api/market/catalog 라이브 API 호출
  • item-detail.php: 로컬 DB → /api/market/item, /api/market/item/versions API 호출
  • CatalogClient.php: API 베이스 URL /api/v1/api/market 변경, 응답 필드 items[]data[] 정합

Fixed

문제: market.21ces.com/index.php 레이아웃 적용 블록에 $__noLayout = true 케이스 처리 누락으로 플러그인 API 라우트(api/market/*) 전체가 HTTP 200 + 빈 응답 반환.

수정: index.php 말단에 elseif ($__pageFile && $__noLayout) { include $__pageFile; } 추가. api/market/catalog, api/market/item, api/market/updates/check 등 정상화.

Added

plugins/vos-market/views/api/catalog.phpsort, free, featured 파라미터 추가, 응답 필드 확장 (sale_price, rating_avg, is_featured 등).

Added

mpApiFetch() 헬퍼: 30분 TTL 파일 캐시로 마켓 서버 요청 최소화. API 응답 실패 시 오류 배너 표시.

v2.3.5 2026-04-21 · 2개월 전
라이선스 자동 등록 로직 완성

Fixed

문제: AdminRouter에서 $licenseClient = new LicenseClient() 인스턴스 생성 후 자동 등록을 시도했으나, $_ENV['LICENSE_KEY'] 갱신이 인스턴스 내부 $this->licenseKey에 반영되지 않아 동일 요청에서 check() 호출 시 여전히 unregistered 상태를 반환하는 버그.

Changed

  • check() 진입 시 $this->licenseKey가 비어있으면 즉시 /api/license/register 호출
  • 성공 시 $this->licenseKey 갱신 + $_ENV['LICENSE_KEY'] 갱신 + .env 파일 저장 후 verify 단계로 진행
  • 실패 시(서버 응답 없음)에만 unregistered 반환
  • saveKeyToEnv() 신규 메서드: 빈 LICENSE_KEY= 라인(install.php 실패 케이스)은 실제 키로 교체, 이미 유효한 키가 있으면 스킵

효과

  • install.php 없이 수동 설치한 사용자 → 관리자 첫 접속 시 자동 라이선스 등록
  • 이전 버전에서 업데이트한 사용자(LICENSE_KEY 없음) → 업데이트 후 관리자 접속 시 자동 등록
  • 대시보드 "라이선스가 등록되지 않았습니다." 메시지는 라이선스 서버 자체가 응답 불가인 경우에만 표시
v2.3.4 2026-04-20 · 2개월 전
콘텐츠 오염 정화 + 카드형 CSS 제거

Fixed

database/seeds/legal_pages.php 시드 파일에 Tailwind CSS 변수(--tw-scale-x, --tw-pan-x 등 400+) 가 각 <h1>/<h2>/<p> 태그의 style="" 속성에 인라인으로 박혀 있던 문제. 설치마다 이 오염이 DB 로 전파되어 terms, privacy 페이지가 비대화 (특히 privacy/ko 는 128KB, 정상은 2KB).

  • database/seeds/legal_pages.php: 442KB → 131KB (70% 감소, 구문 유효)
  • 개발 DB 의 이미 오염된 26 행 정화: 1.04MB → 56KB (988KB 제거, -95%)
  • scripts/clean-inline-styles.php 신규 — style="... --tw-* ..." 일괄 정화 도구 (재발시 재사용)

Changed

.board-content CSS 가 모든 문서 페이지에 "h2 를 카드 헤더로, h2+p 를 카드 본문으로" 강제 변환하는 규칙을 포함하고 있었음. 이로 인해 Brand 같이 Tailwind 로 직접 디자인된 페이지의 히어로 구조가 깨짐.

  • 카드형 블록 103 줄 제거 (149 → 45 줄)
  • 남은 규칙: 기본 타이포그래피 (p/h·/blockquote/code/ul/ol/table), OG 링크 카드, 다크모드 텍스트 오버라이드
  • 결과: Brand 원본 디자인 복구 (왼쪽 파란 선 h2, 중앙정렬 히어로 등)
  • 법적 문서(terms/privacy 등)는 일반 <h1><h2><p> 타이포그래피로 충분 — 카드형은 과한 장식이었음
v2.3.3 2026-04-20 · 2개월 전
페이지 번역 구조 롤백 (단일 테이블 복귀)

Changed

결정 배경: 2.3.1 에서 rzx_page_contents 를 원본 ko + rzx_translations 비원본 구조로 분리하고 2.3.2 에서 에디터 저장 분기를 추가했으나, 설계 재검토 결과 두 테이블의 실질 구조가 동일하면서 (slug/key + locale + content) 다음 비용을 발생시키는 것으로 확인:

  • ko 원문이 두 테이블에 중복 저장 (db_trans 폴백 체인 미러링 용)
  • 에디터 저장 로직이 ko vs non-ko 분기 필요
  • 페이지 관리 UI 에서 locale 상태 표시 시 두 테이블 JOIN
  • 원래 명분(“AI 번역 파이프라인 통합 큐”)도 페이지 본문(10KB HTML) 과 UI 문자열(20바이트) 은 청크 분할·태그 보존 등 다른 워크플로우가 필요해 통합 가치 미미

복귀 구조: rzx_page_contents 단일 테이블, locale 당 1행 (원래 설계)

Migration

  • rzx_translations.page.{slug}.title/content × 7 slug × 12 non-ko locale (168 행) → rzx_page_contents 복원
  • rzx_translations 에서 page.* 키 전체 삭제 (234 행)
  • 대상: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy
  • 개발·프로덕션 DB 양쪽 적용

Changed

  • resources/views/admin/site/pages-edit-content.php — ko/non-ko 분기 제거, 단순 UPSERT
  • resources/views/admin/site/pages-document.php — 동일
  • resources/views/customer/page.phpdb_trans('page.*.title/content') 제거, page_contents 직접 읽기 (폴백 체인 locale → en → ko 유지)
  • resources/views/admin/site/pages.php — 페이지 목록 제목도 page_contents.title 직접 참조

Kept

rzx_translations 자체는 유지 — 다음 용도로 계속 사용:

  • 게시판 (board_post.{id}.title/content)
  • UI 문자열 (menu.*, 설정 라벨)
  • 페이지 SEO 메타 (page.{slug}.browser_title|meta_keywords|meta_description) — 짧은 문자열이므로 여기 적합

원칙: 짧은 UI/메타 문자열 → rzx_translations, 긴 페이지 본문 → rzx_page_contents 로 데이터 특성에 맞게 저장소 분리.

v2.3.2 2026-04-20 · 2개월 전
페이지 에디터 번역 DB 저장 로직 정합

Changed

2.3.1 에서 페이지 콘텐츠 저장 구조를 원본 ko (rzx_page_contents) + 번역 DB (rzx_translations) 로 마이그레이션한 뒤, 관리자 에디터가 여전히 모든 로케일을 rzx_page_contents 에만 INSERT/UPDATE 하고 있어 — 번역본 저장시 마이그레이션 형식과 어긋나 렌더 쪽 db_trans() 에서 조회 실패하는 문제 해결.

분기 규칙 (원본 로케일 = $_ENV['DEFAULT_LOCALE'] ?? 'ko'):

locale저장 경로
ko (원본)rzx_page_contents + rzx_translations 미러링 (db_trans() 폴백용)
en/ja/zh_CN/...rzx_translations (page.{slug}.title, page.{slug}.content) 만

비원본 로케일 저장 시 rzx_page_contents 원본 행이 없으면 stub 행을 자동 생성 (메뉴·설정 연결 보존). is_active 는 원본 행에 통일 적용.

Changed

비원본 로케일 편집 화면을 열 때:

1. rzx_translations 에서 page.{slug}.title/content + locale 먼저 조회

2. 없으면 레거시 rzx_page_contents 행 폴백 (마이그레이션 누락 페이지 호환)

원본 로케일은 기존대로 rzx_page_contents 만.

Changed

  • 페이지 삭제: rzx_translations WHERE lang_key LIKE 'page.{slug}.%' 도 함께 삭제
  • slug 변경: rzx_translations.lang_keypage.{old_slug}.page.{new_slug}. 일괄 UPDATE
v2.3.1 2026-04-20 · 2개월 전
페이지 번역 DB 마이그레이션 + UI 정리 + 로고 자산

Changed

기존 rzx_page_contents 에 locale 당 풀 콘텐츠 행으로 저장하던 방식을 원본 ko + 번역 DB (rzx_translations) 방식으로 통일. 게시판(board_post.*) 과 동일한 저장 구조 정합성 확보.

대상 7개 페이지: Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy

Before:

rzx_page_contents
├── Brand / ko  (풀 콘텐츠)
├── Brand / en  (풀 콘텐츠)
├── ... (13 locale 행)

After:

rzx_page_contents
└── Brand / ko  (원본 1행)

rzx_translations
├── page.Brand.title   × 13 locale (ko 포함)
└── page.Brand.content × 13 locale

마이그레이션 결과:

  • rzx_page_contents: 7 slug × 12 non-ko 행 = 84행 삭제
  • rzx_translations: 7 slug × 13 locale × (title + content) = 182행 이전
  • 개발·프로덕션 DB 양쪽 적용, 렌더 검증 통과 (ko/en 등 locale 별 정상 표시)

Changed

  • "새 페이지" 헤더 버튼 제거 — 동작하지 않던 placeholder 였음. 페이지는 메뉴 관리에서 생성되는 구조가 단일 진실 원천.
  • "삭제" 🗑 아이콘 + AJAX 핸들러 + deleteUserPage() JS 제거 — 메뉴 삭제 시 페이지도 함께 정리되므로 페이지 단독 삭제 경로 불필요. 잘못된 삭제로 깨진 메뉴 발생 방지.
  • 유지: 설정 ⚙ · 편집 ✏ · 미리보기 👁 아이콘

Fixed

  • 설정 > 사이트 > 로고 이미지 업로드 실패: storage/logos/ 서브 디렉토리 미존재로 move_uploaded_file() 조용히 실패. 업로드 핸들러에 서브 디렉토리 자동 생성 + 개발·프로덕션 서버에 디렉토리 생성 (www-data:www-data, 775).
  • 레이아웃 로고 우선순위 복원: 잠시 "사이트 설정 우선" 으로 역전시켰다가 "레이아웃 디자인 특성별 로고" 요구에 맞춰 레이아웃 > 사이트 fallback 으로 복원. 레이아웃에 지정 없으면 사이트 로고 자동 사용.
  • 대상: skins/layouts/{default, minimal, modern, modern-copy-260413}/header.php 및 footer.php

Fixed

  • bi-guide / logo-guide slug 중복 2행 중 최초 생성본만 유지 (id=186, 187), 중복 id=193, 194 삭제
  • 개발·프로덕션 양쪽 적용. 메뉴 API 의 중복 INSERT 버그는 v2.3.0 에서 이미 수정됨

Added

/var/www/_upload/ 에 로고 자산 생성 — 운영 시 필요에 따라 업로드:

아이콘 (마크만)

  • voscms-logo-color-{256,512,1024}.png · 컬러 (deep·ocean·sky·ocean + 중앙 deep)
  • voscms-logo-mono-{256,512,1024}.png · sky 단색 + opacity 1/0.7/0.48/0.7 그라데이션

가로 워드마크 (헤더용) — 820×256 비율

  • voscms-wordmark-{128h,256h,512h}.png · 라이트 (Vos deep + CMS 회색)
  • voscms-wordmark-dark-{128h,256h,512h}.png · 다크 (Vos sky + CMS slate-300)

세로 워드마크 (앱아이콘·OG 이미지용) — 360×420 비율

  • voscms-stacked-light-{256h,512h,1024h}.png
  • voscms-stacked-dark-{256h,512h,1024h}.png

SVG 원본 전부 보존. librsvg2-bin 설치로 rsvg-convert CLI 제공. OKLCH 색상 미지원 이슈는 hex 변환본(voscms-logo-mono-hex.svg) 으로 해결.

v2.3.0 2026-04-20 · 2개월 전
페이지 설정 탭 리팩토링 + Changelog 시스템

Added

  • DB 테이블 rzx_changelog 신규 — 버전 × locale 별 독립 레코드, translation_source(original/ai/manual) + source_hash 추적
  • 파서 RzxLib\Core\Changelog\ChangelogParser — Keep a Changelog 표준 + 내부 섹션 화이트리스트 (Infrastructure/Internal/Refactor/Chore/Docs/Test 는 비공개)
  • 임포터 ChangelogImporter — idempotent 병합, 수동 번역 보호, content_hash 로 변경만 감지
  • CLI 스크립트 scripts/import-changelog.php--file --locale --dry-run --silent 옵션, SemVer pre-release(2.1.1-hotfix) 지원
  • 번역 인터페이스 RzxLib\Core\Translate\{TranslatorInterface, NullTranslator, TranslatorFactory} — Gemma 4 (ai.21ces.com) GPU 준비 후 config/translator.php driver 변경만으로 활성화
  • 시스템 페이지 /changelog 등록 (config/system-pages.php), resources/views/system/changelog/index.php 프론트 뷰
  • 전용 스킨 skins/page/changelog/skin.json — 카드 스타일(filled/outlined/flat), 섹션별 색상, 버전 배지, 날짜 포맷, 상대시간 표시, 내부 섹션 노출 토글
  • 편집 페이지 /changelog/edit 분리 — MD 업로드 프리뷰, 다국어 커버리지 매트릭스, 버전별 토글·삭제, AI 번역 버튼(준비중)
  • 배포 자동화 deploy-voscms.sh1.5/5 Changelog import 단계 추가 — ko + 12개 locale .md 파일 자동 감지·병합
  • 번역 키 site.pages.changelog 13개 locale 추가

Changed

  • 탭 순서 재배치: [기본정보] [권한] [추가설정] [스킨] — 시스템 페이지는 뒤에 자체 탭 추가 가능
  • settings_tabs 스키마 도입 (config/system-pages.php) — 시스템 페이지가 최상위 탭 배열 선언, 각 항목 key/label/icon/view 로 동적 렌더. 기존 settings_view 하단 include 레거시 제거
  • 원칙 확립: 설정 = 모양 + 기능 / 편집 = 데이터 — 업로드·버전·번역 같은 데이터 관리 UI 는 /changelog/edit 로 분리
  • MERGE 저장 전략save_settings 핸들러가 기존 설정과 병합. 탭별로 나뉘어도 다른 탭 데이터가 지워지지 않음
  • saveSettings() JS — DOM 에 존재하는 필드만 전송. 탭 분리 환경에서 일부 필드 미렌더 시 안전
  • 레이아웃·스킨 카드 위치 — 기본정보 탭으로 원위치 (사용자 피드백 반영). 스킨 탭은 skin.json 변수만 전담
  • 페이지 너비 중복 제거 — 기본정보 탭의 page_width 필드 삭제 (스킨의 content_width 로 통합)
  • service/order 내부 2차 탭 평탄화config/service-settings-tabs.phpgeneral/domain/hosting/addonssettings_tabs 로 이전, 최상위 탭으로 승격

Changed

  • /{slug}/settings, /{slug}/editconfig/system-pages.php 도 인식 — 기존엔 rzx_page_contents DB 만 조회해 시스템 페이지가 404. 이제 DB → config 순서로 조회
  • edit_view 필드 신설 — 시스템 페이지 전용 편집 뷰 파일 경로 직접 지정. /{slug}/edit 클릭 시 해당 뷰 직접 include (관리자 리다이렉트 hop 제거)
  • pages-settings.php fallback — DB 레코드 없는 시스템 페이지도 $pageData 를 config 에서 구성해 "페이지 관리 목록" 리다이렉트 방지
  • admin icon URL 통일/{slug}/settings, /{slug}/edit 프론트 표준 URL 사용

Fixed

  • menus-api.php 외부 페이지(external) 타입 INSERT 전 중복 체크 누락 수정 — 메뉴 저장 2번 클릭 시 rzx_page_contents 중복 row 발생 문제
  • 메뉴 삭제 시 external 타입 + widget 의 page_contents 정리 누락 수정 — 고아 레코드 방지

Fixed

  • 제목 배경(title_bg_type, title_bg_image, title_bg_video, title_bg_overlay, title_text_color), show_title, show_breadcrumb, custom_css, custom_header_html, custom_footer_html — 모든 표준 페이지 스킨 변수가 공개 뷰에 반영되도록 수정
  • _page-title-bg.php partial 이 $_contentWidth 변수 수용 — 제목 영역이 콘텐츠 너비를 따라감
  • 관리자 아이콘을 제목과 분리 — 콘텐츠 상단 우측으로 독립 배치. show_title=0 이어도 항상 표시
  • 제목 영역 위 20px 여백 추가 (배경 레이아웃 균형)

Added

  • site.pages.contact 번역 키 13개 locale 추가 (ko/en/ja/zh_CN/zh_TW/de/es/fr/id/mn/ru/tr/vi) — 기존 누락 해결
  • 페이지 관리 시스템 가이드 문서 docs/PAGE_ADMIN_GUIDE.md 신규 — 탭 구조·스키마·라우팅·권한·확장 방법 정리
v2.2.2 2026-04-19 · 2개월 전
stats 위젯 개선 + 관리자 상단 수정

Added

  • 아이템별 숫자·접미사·라벨(다국어)·아이콘·색상 필드
  • 관리자 위젯 빌더에서 아이템 추가/수정/삭제 가능 (stat_items 타입 편집 UI 신규)
  • 16종 아이콘 (users, chart, star, heart, check-circle, clock, calendar, globe, shield, lightning, trophy, cart, dollar, building, chat) + 10종 색상
  • 뷰포트 진입 시 카운트업 애니메이션 — IntersectionObserver + easeOutCubic 1.4s
  • 숫자형만 카운트 대상 (24/7 같은 문자열은 그대로 표시), 콤마 서식·소수점 유지
  • widget.json v1.1.0 → v1.2.0

Fixed

  • admin_nameenc: 접두사로 저장되어 복호화 없이 그대로 노출되던 문제 수정
  • 아바타 조회가 존재하지 않는 staff 테이블을 LEFT JOIN 하던 문제 — admin_id = users.id 통합 구조에 맞게 rzx_users.profile_image 로 직접 조회
  • 상대 경로 아바타에 baseUrl prefix 자동 부여
v2.2.1 2026-04-19 · 2개월 전
URL 캡처 (썸네일 / 스크린샷)

Added

  • 모든 게시판의 <input type="url"> (확장변수 url 타입 포함) 옆에 [썸네일 가져오기] [스크린샷 가져오기] 버튼 자동 삽입
  • 썸네일: 1280×960 네이티브 렌더 → 800×600 출력 (첫 화면 뷰포트)
  • 스크린샷: 1280×full_page 네이티브 렌더 → 800×축소 출력 (전체 스크롤 페이지, 실제 페이지 높이 사용)
  • 단계별 프로그레스 바 UI — 서버 연결 → 페이지 로딩 → 화면 캡처 → 이미지 생성 → 파일 저장 → 응답 대기
  • 썸네일 캡처 자동 대표지정 — board_files.is_primary=1 로 표식되어 board-showcase 위젯이 우선 사용
  • 새 라우트 /board/api/url-capture?type={thumbnail|screenshot}&url=... + api-url-capture.php 프록시
  • /board/api/filesset_primary 액션 추가 — 기존 첨부 중 하나를 대표로 지정

Changed

  • 첨부 이미지 쿼리 ORDER BY is_primary DESC, id ASC — 캡처된 썸네일 우선 노출
  • 게시글 작성 시 primary_file_pos 파라미터로 대표 파일 인덱스 서버 전달
v2.2.0 2026-04-18 · 2개월 전
Marketplace 분리

Changed

  • 마켓플레이스 제품 분리: 기존 plugins/vos-marketplace/ 플러그인이 공유하던 기능을 별도 제품으로 분리 → github.com/THEVOSjp/Marketplace 신규 저장소, market.21ces.com 독립 배포
  • 플러그인은 "고객 사이트 사용자측 UI" (탐색·구매·설치·라이선스) 만 유지, 데이터·판매자·정산은 마켓플레이스 서버에서 전담
  • Core 측 API 연동 포인트 갱신

Added

  • 언어 선택 후 모달 표시 — .env + DB + storage/uploads/ 백업 필요성 + APP_KEY 유실 시 복호화 불가 경고
  • 체크박스 + 확인 버튼 2단계 (무조건 설치 진행 금지)
  • 13개 언어 전체 번역 추가 (backup_title/body/item_env/db/uploads/warn/check/confirm/cancel)

Added

  • scripts/register-widgets-to-marketplace.php — 파일 기반 위젯 28개를 rzx_mp_items 로 일괄 등록

Changed

  • plugins/vos-marketplace/src/CatalogClient.php — 기본 API URL https://market.21ces.com/api/v1, fetchItem() 경로 변경, checkUpdates() 쿼리 포맷 변경
  • plugins/vos-marketplace/plugin.jsonmarketplace_api_url 기본값 갱신
  • rzxlib/Core/Modules/WidgetLoader.php — 썸네일 URL 에 ?v={mtime} 캐시버스터 추가 (Cloudflare immutable 캐시 대응)

Fixed

  • widgets/feature-tour/widget.json — 필드 정리
  • 일부 위젯 썸네일 갱신 (staff, testimonials, feature-tour, shop-map, shop-ranking, stylebook)
v2.1.5 2026-04-17 · 2개월 전

Added

  • contact-info (v0.1.0) — 연락처 카드 (주소/전화/이메일/영업시간 + 이미지 + 소형 지도)
  • location-map (v0.1.0) — 가로형 지도 (Google Maps + 하단 3열 정보, 너비 조절)

Added

  • 아이템 제출 페이지 전면 리팩토링 — 3탭 (기본 정보/릴리즈/판매)
  • 라이선스(GPL/LGPL/BSD/MIT/CC/PD/상용), 저장소 URL, 데모 URL, 의존 플러그인, 배너 이미지
  • 릴리즈 히스토리, 판매 정보 (공개/판매 토글, 할인가/종료일), UX 개선

Added

  • Developer 메뉴(ID:20) 13개 언어, Hero CTA description/typing_words 12개 언어 보강

Changed

  • 위젯 이름 구분 명확화 (지도/연락처 카드), page.php fullWidthTypes 추가
  • contact-form 카테고리 → 라벨만 (코드 제거, 위젯 설정 편집 가능)

Fixed

  • board-contents/board-showcase: file_type → mime_type
  • boards-api: is_shown_in_list 누락 + options JSON 제약
  • contact-form POST: ob 버퍼 전체 비우기
  • Hero CTA: typing_words/description \n 이중 이스케이프

DB Changes

  • rzx_mp_items: license, repo_url, demo_url 추가
  • rzx_board_extra_vars: is_shown_in_list 추가
  • rzx_contact_messages: 신규 테이블
v2.1.4 2026-04-17 · 2개월 전

Added

  • download-hero 위젯 — 소프트웨어 다운로드 페이지 (version.json 실시간 연동, 4개 언어 내장, 주요 기능/시스템 요구사항/버전 히스토리)
  • /downloads 페이지 — widget 타입 시스템 페이지, 13개 언어 메뉴 번역, is_system=1
  • contact-form 위젯 (v0.1.0) — 비공개 1:1 문의 폼 위젯 (비회원 가능, 분류 선택, 허니팟 스팸 방지, AJAX 전송)
  • contact-info 위젯 — 연락처 정보 표시 위젯
  • location-map 위젯 — 위치 지도 위젯
  • rzx_send_mail() 공용 헬퍼rzxlib/Core/Helpers/mail.php에 SMTP 메일 발송 함수 신설
  • rzx_contact_messages 테이블 — 문의 저장용 DB 테이블
  • /contact 페이지 — widget 타입 시스템 페이지, 13개 언어 메뉴 번역

Fixed

  • 시스템 페이지 삭제 보호 — 메뉴에서 시스템 페이지 삭제 시 페이지 콘텐츠/위젯 보존 (메뉴 항목만 제거)
  • menus-api.php: DB is_system + config/system-pages.php slug 이중 체크
  • menus-js.php: 시스템 페이지 삭제 시 "메뉴에서만 제거됩니다" 안내 메시지
  • 시스템 페이지 메뉴 다국어 — 시스템 페이지를 메뉴에 추가 시 site.pages.* 번역 키에서 13개 언어 자동 등록
  • 다운로드 페이지 번역site.pages.downloads 13개 언어 번역 추가

Changed

  • 홈페이지 히어로 — Download 버튼 → /download/voscms-latest.zip 직접 다운로드, 버전 v2.1.1 업데이트
  • Auth.phpsendSmtpMailrzx_send_mail() 공용 헬퍼 우선 호출 (폴백 유지)
  • index.phpmail.php 헬퍼 자동 로드 추가
v2.1.3 2026-04-17 · 2개월 전

Changed

  • 호스팅 탭 — 요약 카드 + 사용량 프로그레스바 + FTP/DB 접속정보 테이블 (관리자 설정 시 자동 표시)
  • 도메인 탭 — 도메인 카드 + 메인 설정 + 네임서버 정보 테이블 (관리자 설정 시 자동 표시)
  • 메일 탭 — 메일서버 정보(IMAP/SMTP) + 계정별 카드 + 인라인 비밀번호 변경
  • 유지보수 탭 — 정보 카드 + 점검 예정일 + 작업 이력 (관리자 기록 시 자동 표시)
  • 부가서비스 탭 — 카드 레이아웃 통일
  • 관리자 파셜과 동일한 정보 구조로 통일 (관리자가 metadata에 입력 → 마이페이지 자동 반영)

Changed

  • 활동 로그 영역 1/3 → 1/5 비율로 축소
  • 관리자 도메인 탭 NS 기본값 하드코딩 제거 (Cloudflare API 연동 대비)

Changed

  • 프로비저닝 워크플로우 전면 수정: 서브도메인 우선 → 구입 도메인 후속 연결
  • 프로비저닝 ID 규칙: 서브도메인명 또는 구입 도메인 SLD 기준
  • Cloudflare 와일드카드 터널 활용 (서브도메인 A레코드 추가 불필요)
  • 서버 2 디스크 구성 변경: NVMe 256GB + SSD 2TB + HDD 8TB 3디스크 체제
v2.1.2 2026-04-16 · 2개월 전

Added

  • 서비스 분류 체계service_class 컬럼 추가 (recurring/one_time/free), completed_at 1회성 완료일
  • 마이페이지 서비스 상세/mypage/services/{order} 타입별 탭 관리 (호스팅/도메인/메일/유지보수/부가서비스)
  • 서비스 관리 APIapi/service-manage.php (자동연장 토글, 연장 신청, 메인 도메인 설정, 메일 비밀번호 변경)
  • 관리자 주문 관리/admin/service-orders 주문 목록 + 상세 페이지, 1회성 상태 모달 (접수/진행/보류/취소/완료)
  • 관리자 메뉴 — 사이드바에 "서비스 주문" 메뉴 추가 (position: 65)

Added

  • phone-display — 전화번호 표시 컴포넌트 (서버사이드 format_phone() 헬퍼), JS 의존 없음
  • format_phone() — PHP 국제 전화번호 포맷 함수 (한국/일본/미국/중국/영국/프랑스/독일/호주 등)
  • 무료 도메인 설정 — 관리자 설정에서 무료 서브도메인 목록 관리 (service_free_domains), 복수 도메인 셀렉트 지원

Fixed

  • 무료 서비스 구독 누락 — 무료 주문 시 도메인/부가서비스/유지보수 등 구독 레코드 미생성 → 전체 서비스 일괄 생성으로 리팩토링
  • 결제 섹션 약관 동의 — 무료 주문 시 약관 체크박스가 결제 섹션과 함께 숨겨지는 문제 → 섹션 밖으로 분리
  • updateSubmitButton isFree 판별btn.closest('form') NULL → document.querySelector로 수정
  • 관리자 사이드바 활성 표시$adminPath 미정의로 모든 메뉴 비활성 → 변수 선언 추가
  • 마이페이지 아바타 — services.php/service-detail.php에 use Auth + $user = Auth::user() 누락
  • 부가서비스 1회성 체크 — 관리자 설정의 one_time 플래그가 주문 시 service_class에 반영되도록 수정
  • 1회성 서비스 초기 상태activepending(접수)으로 생성되도록 수정

Changed

  • 주문 API 리팩토링 — 3개 결제 경로(무료/카드/계좌이체)의 구독 생성 코드를 $subscriptionData + _insertSubscriptions() 공통 함수로 통합
  • 서비스 목록 UI — 인라인 펼침 → 카드 링크 + 상세 페이지 분리
  • 전화번호 표시 — 프로필/회원목록/스태프목록에 format_phone() 적용
  • 무료 도메인 동적화.21ces.net 하드코딩 → 관리자 설정값 참조
v2.1.1-hotfix 2026-04-16 · 2개월 전

Fixed

  • 푸터 메뉴 404 오류rzx_page_contents 테이블에 법적 문서 페이지(terms, privacy, refund-policy, data-policy, tokushoho, funds-settlement) 데이터 누락 → test DB에서 원본 복구
  • 위젯 빌더 이미지/동영상 업로드 실패 — 프론트 래퍼(page-widget-builder.php)에서 FormData POST가 AJAX 핸들러로 전달되지 않는 문제 수정 (파일 업로드 조건 추가 + ob_end_clean/exit 처리)
  • 업로드 디렉토리 권한storage/uploads/widgets/ 소유자를 www-data로 변경하여 PHP-FPM 쓰기 권한 확보

Added

  • 서비스 신청 메뉴 다국어rzx_translations 테이블에 menu_item.19.title 13개 언어 번역 추가
  • 히어로 CTA 위젯 다국어 — Dev 페이지 히어로 배너의 title, subtitle, button text에 13개 언어 번역 적용
  • 업로드 상태 프리뷰 — 이미지/동영상 업로드 시 진행 상태(스피너), 성공(체크), 실패(에러 메시지) 시각적 피드백 추가
v2.1.1 2026-04-12 · 2개월 전

Added

  • Step 0 언어선택 화면 추가 — 설치 시작 전 13개 언어 중 선택, 이후 전체 UI가 해당 언어로 표시
  • 설치 번역 파일 분리resources/lang/install.php (13개 언어 × 45개 문자열)
  • 회원 등급 다국어 — Normal/Silver/Gold/VIP 13개국어 번역 자동 생성

Added

  • config/admin-menu.php — 코어 관리자 메뉴를 설정 파일로 분리 (Core 업데이트 시 보존)
  • admin-sidebar.php 리팩토링 — 731줄 하드코딩 → ~200줄 동적 렌더러 (config + plugin.json 기반)
  • vos-shop plugin.json — 하드코딩 메뉴를 menus.admin 형식으로 이전

Added

  • 슬라이드인 메뉴 — 모바일에서 아바타+이름 토글 바 → 좌측 슬라이드인 오버레이 (300ms ease-out)
  • 페이드 딤 배경 — 배경 클릭 또는 X 버튼으로 닫기, body 스크롤 잠금

Added

  • force_locale — 기본 언어 강제 적용 (?lang=xx 파라미터로 사용자 변경 가능)
  • default_language — install.php ↔ Translator 설정 키 통일
  • URL 파라미터?lang=xx 최우선 감지, 세션/쿠키에 저장

Fixed

  • FAQ 스킨 미적용 — 마이그레이션 SQL의 기본 게시판 INSERT가 skin 없이 먼저 실행되어 install.php의 INSERT IGNORE가 무시되는 문제 수정
  • translations 테이블 source_locale 누락 — 코어 마이그레이션에 컬럼 누락 → db_trans() 전체 실패 → 사용자 정보/메뉴/다국어 표시 안 됨
  • 설정 탭 사이드바 활성 표시route_prefix 속성 추가로 settings 하위 모든 라우트에서 설정 메뉴 활성 유지
  • 설치 세션 잔류 버그 — .env 없는 새 설치 시 이전 PHP 세션이 남아 Step 0을 건너뛰는 문제 수정
  • nginx 403 — admin/ 물리 디렉토리와 라우트 충돌 수정 (try_files $uri/ 제거)
  • 난독화 스크립트 버전 하드코딩 — obfuscate.php가 version.json에서 동적으로 버전을 읽도록 수정

Changed

  • 그리드/board-contents 위젯 다국어뷰 — rzx_translations 번역 조회 추가 (현재 로케일 → 영어 폴백)
  • 사이트 업종 카테고리 — 15개 → 26개 확대 (기업, 쇼핑몰, 법률, 회계, IT, 미디어 등 13개국어)
  • 그리드 위젯 설정 — grid-section render.php의 네이티브 셀 타입(board-list)으로 변경, 13개국어 제목
  • Step 4 언어 선택 — 5개 → 13개 언어 확대, 설치 언어로 pre-fill
  • timezone 선택 — 13개국어 사용자 대응 시간대 12개로 확대
v1.26.0 2026-04-01 · 2개월 전

Added

  • 서비스 선택 상단에 번들(세트) 서비스 3열 배치 — 앰버 색상 테마로 개별 서비스와 시각적 구분
  • SET 배지, 이벤트 할인 라벨, 포함 서비스 이름, 번들 가격, 원가 취소선, 할인율 표시
  • 번들 선택 시 포함 서비스 자동 선택 (가격은 번들 가격으로 계산)
  • 번들에 포함된 서비스는 개별 토글 불가 (잘못된 가격 계산 방지)
  • 지명 모드: rzx_staff_bundles 테이블로 스태프별 번들 필터링
  • confirm 페이지로 bundles 파라미터 전달
  • 다국어 지원: 번들 관련 키오스크 번역 키 13개 언어 추가

Added

  • 뷰 전환 버튼 — 상단 바에 [월] [주] [일] 토글 (활성 상태: 파란색)
  • 주간 뷰 — 좌측 세로=요일, 상단 가로=시간축
  • 가로 스크롤, 예약 블록이 시간 바 형태로 표시
  • 레인 알고리즘: 시간 겹침 감지 후 아래 줄 자동 배치, 행 높이 가변
  • 좌측 사이드바 ↔ 그리드 세로 스크롤 동기화
  • 일별 뷰 — 가로=시간축, 세로=레인 (주간 뷰와 동일 방식)
  • 영업시간 기반 시간 범위business_hour_start/business_hour_end 설정 기반, 범위 외 예약 시 자동 확장
  • 빈 칸 클릭 시간 전달 — 주간/일별 뷰에서 클릭 X좌표 → 15분 단위 시간 계산 → 예약 모달 시작 시간 자동 입력
  • 상단 네비 바 고정overflow-x-hidden + sticky 적용, 가로 스크롤해도 뷰포트 내 고정

Added

  • 관리자 > 설정 > 일반 — 영업 시작/종료 시간 설정 UI 추가
  • business_hour_start, business_hour_end DB 설정 키
  • 캘린더 주간/일별 뷰의 기본 시간 범위에 적용

Fixed

  • POS add-service 누락 필드 수정start_time, end_time, staff_id, designation_fee, notes 전달 추가 (기존: 서버 시간 하드코딩, 스태프/메모 누락)
  • end_time 자정 넘김 방지ReservationHelper, start-service API, 예약 폼 calcEnd() 모두 % 24min(23:59) 상한 적용
  • POS 이용중 판정 자정 넘김 대응CustomerBasedAdapter에서 end_time < start_time 시 자정 넘김 처리
  • 예약 등록 번들 검증 — 번들만 선택하고 개별 서비스 미선택 시에도 예약 생성 가능하도록 수정

Changed

  • 탭 이름 변경: 접수 / 접수 명단 / 예약자
  • 접수 명단: walk_in, pos, kiosk, admin 소스 — 모든 상태 표시
  • 예약자: phone, online 소스 — 모든 상태 표시
  • 정렬 순서: 대기 → 확정 → 이용중 → 완료 → 노쇼 → 취소, 같은 상태 내 시간순
  • 완료/취소/노쇼 행: opacity-50으로 흐리게 처리, 미배정 배지 표시

Changed

  • 완료 배지: 회색 → 초록색으로 변경
  • 취소/노쇼 배지 추가 (건수 0이면 숨김)

Added

  • 카드 하단: 대기 상태에 노쇼 버튼 추가 (금지 아이콘), 취소 버튼 빨간색으로 변경
  • 상세 모달: pending, confirmed 모두 노쇼 액션 버튼 표시
  • 그룹 일괄 노쇼: POS.noShowAllServices() 함수 추가

Fixed

  • 예약 상세 돌아가기<a href="/reservations">history.back() 변경, 이전 페이지로 복귀
  • 다국어: 캘린더 뷰 전환(월/주/일), 번들, 영업시간 관련 키 13개 언어 추가
v1.25.0 2026-04-01 · 2개월 전

Architecture

  • POS를 독립 플러그인 구조로 분리
  • resources/views/admin/reservations/pos-*.phpresources/views/admin/pos/ 디렉토리로 이동
  • pos/ 디렉토리 존재 여부로 POS 기능 자동 활성화/비활성화 (is_dir() 체크)
  • 사이드바 메뉴: pos/ 디렉토리 없으면 POS 메뉴 자동 숨김
  • index.php 라우팅: pos/ 디렉토리 없으면 POS 라우트 비활성화
  • pos/_init.php → 예약 공통 _init.php 위임 (DB, 인증, 다국어 공유)
  • API 엔드포인트는 reservations/_api.php에 유지 (호환성 보장)

Added

  • 통합 결제 모달 — 적립금 + 현금 + 카드 동시 사용 가능 (복합 결제)
  • 적립금: 잔액 조회, 수동 입력 또는 전액 사용
  • 현금: 금액 입력
  • 카드: 금액 입력 + "잔액 전체" 자동 입력 버튼
  • 할부: 일시불 / 2~12개월 선택
  • 실시간 합계, 거스름돈, 부족 금액 자동 계산
  • Stripe 카드 결제 시 현금/적립금은 결제 성공 후에만 처리 (취소 시 안전)
  • 서비스 상세 모달 — 적립금 표시
  • 헤더 영역에 회원 적립금 잔액 상시 표시 (잔액 0이어도 표시)
  • 서비스 상세 모달 — 스태프 배지 개선
  • 배정/지명 배지를 스태프 이름 앞에 표시 (기존: 이름 아래)
  • 영수증/인쇄 버튼 위치 이동
  • 고객 상세 정보 위로 이동, 영수증(좌) + 인쇄(우) 배치
  • 인쇄 기능 개선
  • 외부 페이지가 아닌 현재 서비스 상세 모달 내용을 인쇄

Changed

  • 카드 레이아웃 — grid 기반 → flex-wrap 기반 고정 크기 카드
  • 카드 크기 고정: 기본 320×240px (small: 260×200, large: 380×280)
  • 화면 크기에 따라 카드 크기 변하지 않고 자동 줄바꿈
  • 카드 결제 모달 — 폭 1030px, 높이 800px로 확대

Fixed

  • API cross-origin 오류 해결
  • $baseUrl.envAPP_URL로 고정되어 다른 호스트/HTTPS 접속 시 fetch 실패
  • 대시보드: fetch URL을 상대 경로(/update-api.php)로 변경
  • 예약 _init.php: $baseUrl을 빈 문자열로 변경하여 모든 fetch가 상대 경로 사용
  • Cloudflare HTTPS 프록시 환경에서 mixed content 문제 완전 해결
  • DB 마이그레이션 실행 오류 — "Failed to fetch" 해결 (cross-origin 문제)
  • Stripe 복합결제 취소 시 현금 선결제 버그
  • 기존: 현금 먼저 결제 → 카드 결제 취소 시 현금이 이미 처리됨
  • 수정: Stripe 카드 결제 성공 후에만 현금/적립금 처리

i18n

  • pos_pay_after_points — 적립금 적용 후 금액
  • pos_pay_proceed — 결제 진행
  • pos_pay_remainder — 잔액 전체
  • pos_pay_installment — 할부
  • pos_pay_lump_sum — 일시불
  • pos_pay_months — 개월
  • pos_pay_total_pay — 합계
  • pos_pay_short — 부족
  • show_receipt — 영수증
  • show_print — 인쇄
v1.18.0 2026-03-29 · 2개월 전

Added

  • 다국어 날짜 포맷팅 함수formatReservationDate($dateString, $locale)
  • 13개 언어 지원 (ko, en, ja, zh_CN, zh_TW, de, es, fr, id, mn, ru, tr, vi)
  • 예약 상세 페이지에서 날짜/요일 자동 다국어 표시
  • 폴백: 미지원 로케일 → 영어 형식

Changed

  • 예약 상세 페이지 다국어 처리
  • 서비스명, 스태프명, 번들명 다국어 적용 (DB translations 테이블 기반)
  • 예약 날짜 포맷팅 함수 통합
  • 결제 상태 라벨 다국어 처리 (payment_status 필드)
  • 결제 상태 다국어 지원
  • 모든 언어 파일(11개)에 payment 섹션 추가
  • unpaid(미결제), paid(결제완료), partial(부분결제), refunded(환불) 번역

Fixed

  • 예약 상세 페이지: 다국어 미적용되던 스태프명, 서비스명 정상 표시
  • 결제 상태 라벨: 한국어로만 표시되던 문제 해결
  • _tr() 함수 기반 다국어 처리로 통일

Layout & UI

  • 페이지 폭 통일 (max-w-5xl → max-w-7xl)
  • 게시판 (list, read, write): max-w-5xl → max-w-7xl
  • 외부 페이지 (page.php): 기본값 및 DB 설정값 업데이트
  • 예약 상세/예약 조회/스태프 페이지: DB 설정값 업데이트
  • 결과: 모든 페이지 폭이 예약하기 페이지와 동일하게 통일

Documentation

  • COMPONENT_MANUAL.md에 formatReservationDate() 함수 상세 문서 추가
  • 지원 언어 및 형식 테이블
  • 사용 예제 및 내부 구조
  • 주의사항 및 관련 함수
v1.16.0 2026-03-23 · 2개월 전

Added

  • 모바일 하단 메뉴바 — 스태프/예약/홈/로그인(또는 마이)/회원가입/더보기, 현재 페이지 하이라이트
  • 모바일 더보기 패널 — 메인 메뉴 + 마이페이지/로그아웃
  • 레이아웃/스킨 설정 실제 적용 — site_layout, site_page_skin, site_board_skin, site_member_skin → 렌더링 반영
  • no_layout 파라미터 — 레이아웃 없이 콘텐츠만 (미리보기용)
  • 다국어 추가 — common.nav.staff, common.nav.more (13개 언어)

Fixed

  • 회원 페이지(login/register/forgot/reset) 레이아웃 적용: 스킨 <main> 추출로 중복 헤더 제거
  • 회원 스킨 ImageCropper/ProfilePhotoCropper 중복 선언 에러 수정
  • 메뉴 로더 include_once 문제: 스킨 클로저에서 먼저 로드 시 base-header 메뉴 누락 수정
  • apple-mobile-web-app-capable deprecated → mobile-web-app-capable (8개 파일)
  • 헤더 로그인/회원가입 버튼 모바일에서 숨김 (하단 메뉴바로 대체)
  • iOS safe-area 대응 (하단 메뉴바)

Changed

  • 회원 페이지를 자체 레이아웃에서 기본 레이아웃으로 통합 (login/register/forgot/reset)
  • 푸터 하단 여백 제거 (모바일 메뉴바 fixed 방식)
v1.15.3 2026-03-22 · 3개월 전

Added

  • 레이아웃 상세 설정 패널 — SkinConfigRenderer 기반 설정 폼 AJAX 로드
  • 레이아웃 메뉴 설정 — layout.json의 menus 섹션 → DB sitemaps 드롭다운 자동 생성
  • SkinConfigRenderer 탭 지원 — vars에 tab 속성 추가 시 탭 UI 자동 생성
  • SkinConfigRenderer 리팩토링 — renderVar() 단일 메서드 통합, renderFormFlat/renderFormWithTabs 분리, renderDependsOnJs 공통화
  • layout.json 확장 — menus(GNB/FNB), vars 14개 항목(헤더/로고/색상/푸터/커스텀), 13개 언어
  • 레이아웃 미리보기 연동 — "사용 안 함" 선택 시 ?no_layout=1로 레이아웃 없는 미리보기

Fixed

  • 레이아웃 관리 메뉴 조회 rzx_menusrzx_sitemaps 테이블명 수정
  • 가운데 패널 width 조정 + 액션 링크 whitespace-nowrap

Pending

  • 레이아웃/스킨 설정값의 실제 페이지 렌더링 적용 (다음 세션)
v1.15.2 2026-03-22 · 3개월 전

Added

  • 레이아웃 관리 페이지 — 좌측 미리보기+메뉴, 우측 스킨 목록, 상세 설정 패널 3단 구조
  • 각 스킨 항목: 썸네일 + 상세 설정/복사본 생성/삭제 액션 링크
  • "사용 안 함" / "다른 스킨 설치" 옵션
  • 레이아웃/페이지/게시판/회원 4개 카테고리 저장 (site_layout, site_page_skin, site_board_skin, site_member_skin)

Changed

  • "디자인 관리" → "레이아웃 관리" 명칭 변경 (13개 언어 admin.php + site.php)
v1.15.1 2026-03-22 · 3개월 전

Changed

  • 사이트 관리 15개 페이지 → _head.php 공용 헤더 적용
  • 게시판: boards, boards-create, boards-edit, boards-trash
  • 메뉴: menus
  • 디자인: design
  • 페이지: pages, pages-settings, pages-edit-content, pages-document, pages-compliance, pages-widget-builder
  • 위젯: widgets, widgets-create, widgets-marketplace
  • embed 모드 페이지 (boards-edit, pages-settings, pages-edit-content)는 비embed 시만 _head.php 적용
  • 전체 관리자 페이지 헤더/레이아웃 통일 완료
v1.15.0 2026-03-22 · 3개월 전

Added

  • 시스템 위젯 모듈 — staff(스태프 소개), booking(예약하기), lookup(예약 조회), cta001(예약 유도 배너) 4개
  • 시스템 페이지 — staff, booking, lookup DB 등록 (is_system=1) + 라우팅 (/staff, /booking, /lookup)
  • 위젯 기반 페이지 렌더링 — staff/booking/lookup 페이지가 위젯 배치 시 위젯 렌더링, 미배치 시 기존 폴백
  • 위젯 자동 DB 등록syncToDatabase() 호출로 위젯 디렉토리 추가 시 자동 등록
  • 위젯 카테고리 system — 13개 언어 번역 (widgets.categories + widget_builder.cat)
  • 페이지 목록 통합 — 시스템 페이지 루프 렌더링 + 기어/수정/미리보기 아이콘 통일
  • 관리자 페이지 헤더 통합$pageSubTitle + $pageSubDesc (_head.php 공통 출력)
  • 번역 키 추가 — staff.admins, staff.attendance.report/stats, points.description 등

Fixed

  • 위젯 빌더 page_slug = 'home' 하드코딩 → $_GET['slug'] 동적 처리
  • 위젯 빌더 AJAX save/preview home 하드코딩 → $pageSlug 동적
  • 위젯 빌더 미리보기 URL → $pageSlug 동적 (홈 고정 → 각 페이지)
  • 위젯 preview_widget WidgetLoader require 누락 수정
  • 서비스 카드 뷰 이미지 경로 (/storage/ 접두사)
  • 키오스크 설정 width max-w-3xl → 100% 통일
  • POS 헤더 "예약 관리" → "POS" 변경

Changed

  • 스태프 관리 10개 + 회원 관리 4개 페이지 → _head.php 공용 헤더 적용
  • 키오스크/번들 페이지 _head.php 적용 완료
  • 키오스크 언어 설정 grid → flex-wrap 반응형
  • 페이지 목록 시스템 페이지 데이터 기반 루프 렌더링
v1.14.1 2026-03-22 · 3개월 전

Added

  • 페이지 스킨 탭 — 스킨 기본정보 + 확장 변수 설정 (SkinConfigRenderer 기반)
  • 페이지 스킨 전 타입 적용 — document/widget/external 모두 스킨 설정 적용
  • 제목 배경 시스템 — 이미지/동영상 배경 + 오버레이 + 텍스트 색상 (공통 partial _page-title-bg.php)
  • depends_on 시스템 — skin.json에서 필드 간 의존 관계 선언적 정의, 렌더러 자동 JS 생성 (checkbox/radio 지원)
  • 스킨 파일 업로드 — multipart 전송으로 이미지/동영상 업로드 지원 (storage/skins/page/{skin}/)
  • 카드형 레이아웃/스킨 선택 — 모듈 정보 탭에서 썸네일 카드 UI로 변경
  • SEO 시스템 — SEO 헬퍼, 제목 패턴, OG/Twitter 메타태그, 콘텐츠 추출
  • OG Image 업로드 — URL 입력 + 파일 업로드 + 미리보기
  • 공통 결과 모달 — 저장 성공/실패 모달 UI 통합 (13개 언어 지원)
  • 서비스 카드 뷰 — 배경 이미지 전체 적용 카드 + 테이블/카드 전환 버튼
  • 서비스 드래그 앤 드롭 순서 — 테이블/카드 양쪽 뷰에서 순서 변경 + DB 저장
  • 예약 스태프 배정/지명 — 예약 상세에서 배정/지명 버튼 2개
  • 예약 경로 UI — 전화예약/현장접수/온라인 선택
  • 전화 예약 설정 — 서비스 기본설정에서 활성/비활성 토글
  • 보안 헤더 — X-Frame-Options + CSP frame-ancestors
  • PAGE_SYSTEM.md — 페이지 시스템 개발 문서
  • PRD_OrderSystem.md — 테이블 주문 시스템 기획 문서
  • PRD_KioskSystem.md — 키오스크 시스템 기획 문서

Fixed

  • 파비콘 DB 설정 적용 (프론트/관리자/스킨 레이아웃 4곳)
  • 대시보드 마이그레이션 URL window.location.origin$baseUrl (서브디렉토리 환경)
  • 페이지 설정 embed 모드 API URL → admin 경로 직접 지정
  • 결과 모달 다국어: API 응답 대신 페이지 렌더링 시 로케일 메시지 사용
  • 스킨 탭 빈 skin 값 폴백 (""default)
  • pages-settings.php php://input 중복 소비 문제 해결

Changed

  • 키오스크/키오스크 설정/번들 페이지 → _head.php 공용 헤더 적용
  • 스킨 설정 저장 JSON → FormData(multipart) 전송 (파일 업로드 지원)
  • SkinConfigRenderer에 $baseUrl 파라미터 추가 (이미지/비디오 미리보기)
  • 13개 언어 스킨 번역 (skin.json + site.php + common.php)
v1.13.0 2026-03-21 · 3개월 전

Added

  • 페이지 시스템 완성 — 메뉴에서 문서/위젯/외부 페이지 생성 시 자동 페이지 생성
  • 동적 페이지 렌더러page.php (문서→HTML, 위젯→WidgetRenderer, 외부→iframe/include)
  • 페이지 환경 설정 — 3탭 (기본/레이아웃·스킨/SEO), page_config_{slug} JSON 저장
  • 페이지 콘텐츠 편집 — 언어별 제목·콘텐츠 편집, slug 변경, 타입 변경, 삭제
  • 페이지 관리 동적 목록 — DB에서 사용자 페이지 자동 로드, 타입별 아이콘·배지
  • 프론트 관리자 아이콘 — 기어(환경설정) + 편집(콘텐츠) 분리 표시
  • 외부 페이지 iframe — 로드 실패 시 "새 창에서 열기" 안내
  • 내부 PHP/HTML 파일 — include로 RezlyX 레이아웃 안에서 렌더링

Fixed

  • 메뉴 바로가기 URL #menu_{id} → 실제 메뉴 URL 저장
  • 메뉴 편집 시 바로가기 UI 생성 시와 동일 구조 표시
  • 메뉴 저장 시 바로가기 URL 반영 (formMenuType → 패널 가시성 기준)
  • 메뉴 13개 언어 번역 추가 (12개 메뉴 항목 × 13개 언어)
  • 페이지 문서 에디터 번역 키 경로 수정 (admin.site.pages.site.pages.)

Changed

  • DB rzx_page_contentspage_type 컬럼 추가 (document/widget/external)
  • 메뉴 삭제 시 연결 페이지 + 번역 데이터 함께 삭제
v1.12.5 2026-03-21 · 3개월 전

Fixed

  • 메뉴 바로가기 URL 수정 — #menu_{id} 대신 실제 메뉴 URL 저장
v1.12.4 2026-03-21 · 3개월 전

Fixed

  • 스킨 설정 목록 유형 미적용 — localStorage 캐시가 스킨 설정을 덮어쓰는 문제 수정
  • 스타일 전환 비허용 시 스킨 설정만 사용, 허용 시 localStorage 우선
  • checkbox hidden 중복 전송 제거 (JS에서 unchecked 처리)
v1.12.3 2026-03-20 · 3개월 전

Fixed

  • 게시판 영어/일본어 번역 키 누락 (source_locale, reply, style, board_settings 등)
  • 카테고리명 다국어 폴백 적용 (로케일 → en → 원본)
  • 게시판 목록 본문 다국어 (웹진/카드/갤러리 미리보기)
v1.12.2 2026-03-20 · 3개월 전

Fixed

  • 게시판 목록 본문 다국어 폴백 — 웹진/카드/갤러리 미리보기에 번역 본문 적용 (로케일 → en → 원본)
  • 프로덕션 스킨 파일 누락 — skins/default/board/ 디렉토리 FTP 생성 + skin.json/thumbnail 업로드
v1.12.1 2026-03-20 · 3개월 전

Fixed

  • 프로덕션 스킨 설정 미표시 — 전체 파일 동기화 재정비
  • CLAUDE.md + BOARD_SYSTEM.md 파일 구조 전면 업데이트
v1.12.0 2026-03-20 · 3개월 전

Added

  • 스킨 설정 시스템 완성 — skin.json 기반 동적 폼 생성 + 실제 게시판 적용
  • 섹션 구분 (기본/목록/링크/디자인/제목배경/커스텀)
  • radio, video 타입 추가
  • 이미지/동영상 파일 업로드 (FormData multipart)
  • 이미지/동영상 삭제 기능
  • 스킨 기본정보 테이블 (제작자/URL/이메일/날짜/버전/썸네일)
  • 제목 배경 이미지/동영상 — 배경 타입, 높이, 오버레이 투명도, 텍스트 색상 설정
  • 목록 4가지 스타일 — 목록형/웹진형/갤러리형/카드형, 스킨 파일 분리 + 오버라이드
  • 갤러리형: 풀 이미지 cover + 호버 슬라이드 애니메이션
  • 웹진형: 썸네일+제목+미리보기+메타정보 카드
  • 공지글 상단 목록형 분리 (_list-notices.php)
  • 스킨 설정 적용 — primary_color, border_radius, posts_per_row, allow_style_switch, show_category, 링크 게시판, Font Awesome, 커스텀 CSS/HTML
  • skin.json 기본값 자동 병합 — DB 저장 없어도 skin.json default 적용

Fixed

  • skin_config DB 저장 누락 (boards-api.php update 액션에 skin_config 미포함)
  • 스킨 저장 URLSearchParams → FormData(multipart) 변경 (파일 업로드 지원)
  • $_POST['skin_config'] 배열 자동 파싱 대응
v1.11.3 2026-03-20 · 3개월 전

Fixed

  • 게시글 상세 이전/다음 글 제목 다국어 폴백 적용 (로케일 → en → 원본)
v1.11.2 2026-03-20 · 3개월 전

Fixed

  • 게시판 목록 제목 다국어 폴백 — 모든 로케일에서 번역 조회 (한국어 제한 제거), 원본 언어 고려한 영어 폴백
v1.11.1 2026-03-20 · 3개월 전

Fixed

  • OG 카드 단독 URL 판별 개선 — <font>/<span> 등 인라인 래핑 태그 내부 URL도 블록 부모까지 탐색하여 정상 처리
v1.11.0 2026-03-20 · 3개월 전

Added

  • URL 자동 링크 — 게시글 본문/에디터에서 URL 자동 감지 → <a> 태그 변환
  • OG 링크 프리뷰 카드 — SNS 배너 형식 (썸네일+제목+설명+도메인) 카드 자동 생성
  • 에디터: URL 입력 후 엔터/붙여넣기 → OG API 호출 → 카드 삽입
  • 본문: 단독 URL 링크 → OG 카드로 자동 변환
  • OgFetcher 모듈 — OG/Twitter Card 메타데이터 추출, favicon, 인코딩 자동 처리
  • OG API/board/api/og 엔드포인트
  • board-autolink.js — 자동 링크 + OG 카드 통합 JS (base-header에서 전역 로드)
v1.10.2 2026-03-20 · 3개월 전

Fixed

  • 에디터/본문 이미지 정렬 — Tailwind preflight의 img { display: block } 덮어쓰기
  • board-content.css 공통 CSS 생성 (에디터+본문 표시 통합)
  • base-header.php에서 전역 로드 (프론트 모든 페이지)
  • multilang-modal.php에 전역 에디터 스타일 추가 (관리자 모든 Summernote)
  • 게시판 본문 prose 클래스 제거, 에디터 인라인 스타일 100% 보존

Changed

  • CLAUDE.md에 게시판 본문 스타일 규칙 명시 (board-content 클래스 필수)
v1.10.1 2026-03-20 · 3개월 전

Fixed

  • 게시판 분류 추가 시 다국어 모달에 이전 분류 데이터가 로드되는 버그 수정 (langKey 고유 임시 키 생성)
  • 마이그레이션 021에 comment_max_depth 기본값 3 설정 추가
v1.10.0 2026-03-20 · 3개월 전

Added

  • 게시판 확장 변수 — ExtraVarRenderer 컴포넌트 모듈 (15종 타입별 input/display 렌더링)
  • 확장 변수 다국어 — 언어별 확장 변수 값 독립 저장 (rzx_translations 연동, 폴백 체인)
  • 게시글 다국어 분리 저장 — 원본 언어 수정 시 board_posts 직접, 다른 언어 시 rzx_translations에 번역 저장
  • 게시글 읽기 폴백 체인 — 현재 로케일 → en → 원본 순으로 제목/본문/확장변수 표시
  • 대댓글(답글) — 3단계 깊이 대댓글 지원, 재귀 트리 정렬, 인라인 답글 폼
  • 댓글 추천/비추천 — 댓글별 좋아요 버튼 + API
  • 게시판 설정 프론트 접근 — 관리자 기어 아이콘 → /board/{slug}/settings 프론트 레이아웃
  • 게시판 관리 제목 링크 — 관리자 게시판 목록에서 제목 클릭 시 해당 게시판 이동

Fixed

  • 게시판 API 관리자 권한 확인 $currentUser['role']$_SESSION['admin_id'] (4파일 수정)
  • 원문 언어 안내 메시지 작성자/관리자에게만 표시
  • 게시판 설정 embed 모드 탭 링크 프론트 URL 지원

Changed

  • DB rzx_board_postsextra_vars JSON 컬럼 추가
  • comment_max_depth 기본값 0 → 3 변경
  • 댓글 액션 바 통합 (추천/비추천/답글/삭제 아이콘)
v1.9.4 2026-03-20 · 3개월 전

Added

  • 기본 게시판 데이터 — 공지사항, 질문과 답변, 자주 묻는 질문, 자유게시판 마이그레이션 (020_default_boards_v193.sql)
v1.9.3 2026-03-20 · 3개월 전

Added

  • 회원 그룹 초기화 — 기본 제공 데이터(7개 그룹 + 13개 언어 번역)로 초기화 기능
  • 적립금 설정 초기화 — 설정값/레벨 포인트/그룹 연동을 기본값으로 복원 (회원 잔액 미영향)
  • 회원 그룹 다국어 — 그룹명/혜택 설명에 rzx_multilang_input() 공통 컴포넌트 적용
  • 회원 그룹 드래그앤드롭 — SortableJS 카드 순서 변경 + 자동 저장

Fixed

  • 회원 그룹 카드 로케일별 번역 표시 (카드 뷰 + 편집 모달)
  • 회원 그룹 다국어 번역 데이터 깨짐 수정 (PHP UTF-8 재저장)
  • 적립금 모듈별 설정 게시판 컬럼명 수정 (board_name → title)
  • 적립금 회원 목록 collation 충돌 수정 (utf8mb4_unicode_ci 통일)
  • 프로덕션 DB 마이그레이션 (019_point_system_v190.sql)
v1.9.0 2026-03-20 · 3개월 전

Added

  • 적립금(포인트) 관리 시스템 — 3탭 구조 (기본 설정 / 모듈별 설정 / 회원 포인트 목록)
  • 적립금 3필드 구조 — point(활동 포인트), balance(결제 적립금), total_accumulated(누적 포인트, 레벨 기준)
  • 누적 포인트 가중치 — 결제 가중치 / 활동 가중치 분리, 결제 고객 우대 레벨업
  • 적립금 환전 — 포인트 → 적립금 변환 (비율, 단위, 최소 포인트 설정)
  • 포인트 부여/차감 17개 항목 — Rhymix 동일 구조 (삭제시 회수, 기간 제한, 공지 제외)
  • 모듈별 설정 — 게시판별 15개 포인트 항목 개별 설정
  • 회원 포인트 목록 — 포인트/적립금/누적포인트/레벨 4컬럼, 검색, 개별 수정
  • 레벨 포인트 — 수식 계산, 최고 레벨 동적 조정, 그룹 연동
  • 포인트 시스템 문서 — POINT_SYSTEM.md 상세 설계 문서
  • 회원 그룹 드래그앤드롭 — SortableJS로 카드 순서 변경 + 자동 저장
  • 회원 그룹 다국어 — 그룹명/혜택 설명에 rzx_multilang_input() 공통 컴포넌트 적용
  • 회원 그룹 기본 데이터 — 7개 그룹 × 13개 언어 다국어 번역 데이터

Changed

  • DB rzx_member_pointsbalance, total_accumulated 컬럼 추가
  • DB rzx_point_levels.group_id INT → CHAR(36) 수정 (UUID 호환)
  • DB rzx_point_levels, rzx_member_points collation utf8mb4_unicode_ci 통일
  • 번들 페이지 레이아웃 수정 (sidebar-main-contentflex-1 ml-64 대시보드 패턴)
  • 번들 페이지 화폐 단위 $config['currency']$siteSettings['service_currency'] 수정
  • 서비스 소요시간 select → input number + datalist 변경
  • CLAUDE.md에 다국어 입력 UI 규칙 명시 (rzx_multilang_input 필수 사용)
v1.8.3 2026-03-20 · 3개월 전

Added

  • 번들 상세 관리 페이지 — 개별 번들 기본정보 수정, 대표 이미지 업로드, 서비스 구성 편집, 스태프 연동, 활성/비활성 토글
  • 이벤트 할인 — 번들별 이벤트 가격, 기간(시작/종료), 라벨 설정. 기간 내 자동 활성화
  • 번들 목록 카드 디자인 — 그리드 카드 레이아웃, 이미지 헤더, 이벤트/할인 배지, 하단 고정 액션 바
  • 추천 패키지 배경 이미지 — 고객 스태프 상세 페이지 번들 카드에 대표 이미지 배경 + 그라데이션 오버레이
  • 서비스 소요시간 직접 입력 — select → input number (5~480분, 5분 단위) + datalist 추천 목록

Changed

  • DB rzx_service_bundlesevent_price, event_start, event_end, event_label 컬럼 추가
  • 번들 목록 API에 total_duration, 이벤트 컬럼 추가
  • 번역 파일(ko, en, ja) 번들 상세 관리 + 이벤트 할인 키 추가
v1.8.1 2026-03-19 · 3개월 전

Added

  • POS 설정 페이지 — 카드 크기, 이미지/가격/전화 표시, 투명도, 기본 탭, 자동 새로고침, 알림음, 스태프 배정 필수, 자동 배정
  • POS 설정 실적용 — 카드 크기/이미지/가격/전화/투명도/자동 새로고침/기본 탭 모두 POS에 반영
  • 스태프 자동 배정 — POS 설정에서 활성화 시 키오스크 접수 시 자동 배정 (서비스 수행 가능 + 당일 예약 최소)
  • POS 카드 스태프 배지 — 배정/미배정 표시, 미배정 시 진행 버튼 비활성화
  • POS 서비스 이미지 배경 — 서비스 내역 모달 헤더+고객 영역에 대표 서비스 이미지 배경
  • 스태프 is_visible — 목록 노출 여부, 비노출 스태프 예약/POS/키오스크 제외
  • 스태프 카드 배너 — 관리자 스태프 카드에 배너 이미지 + 상태 배지
  • 키오스크 자동 배정 — staff_id=NULL로 접수, 관리자 POS에서 배정

Fixed

  • POS 스태프 배정 후 서비스 목록 즉시 갱신 (캐시 방지)
  • 스태프 배정 API 파라미터 수정 (reservation_id → reservation_ids[])
  • 프로덕션 누락 테이블/컬럼 다수 수정 (018 마이그레이션 보강)
  • 관리자 로그아웃 라우트 추가
  • 키오스크 인증 전 라우트 배치
v1.7.0 2026-03-18 · 3개월 전

Added

  • 기본 레이아웃 시스템layouts/base-header.php + base-footer.php, index.php에서 ob_start 자동 적용, 모든 고객 페이지 공통 헤더/푸터
  • 게시판 프론트 구현 — 목록(list), 상세(read), 글쓰기/수정(write) 페이지, Summernote 에디터, 드래그&드롭 파일 첨부
  • 게시판 단축 URL/free, /notice/3/board/ 없이 접근 가능, DB slug 자동 매칭
  • 예약 조회 페이지/lookup 단축 URL, 예약번호/이메일/전화번호 검색
  • 예약 상세 페이지/booking/detail/{번호}, 스태프 인사말 말풍선, 서비스/결제/취소 정보
  • 예약 취소 페이지/booking/cancel/{번호}, 취소 사유 입력
  • 마이페이지 예약 상세/mypage/reservations/{id}, 사이드바 + 상세 정보
  • 게시글 다국어original_locale (최초 작성 언어) + source_locale (현재 콘텐츠 언어), 폴백 체인 (source → en → original)
  • 스태프 인사말greeting_before (시술 전) + greeting_after (시술 후), 다국어 지원, 예약 상태별 표시
  • 관리자 프로필 드롭다운 — 프로필 사진/이니셜 + 이름 + 홈페이지/마이페이지/로그아웃 메뉴
  • 고객 헤더 관리자 링크 — 관리자 세션 시 드롭다운에 관리자 페이지 링크 표시

Changed

  • 모든 고객 페이지 레이아웃 통합 (자체 HTML 구조 제거, LayoutManager 자동 적용)
  • 게시판 분류 표시 조건 show_categoryhide_categories 로 변경
  • 게시판 URL /board/free/free 단축 URL 기본 사용
  • 관리자 topbar "Admin" → 실제 로그인 이름 + 프로필 사진

Fixed

  • rzx_users.role 컬럼 없음 → $_SESSION['admin_id'] 기반 관리자 판별
  • rzx_users.nick_name 컬럼 없음 → name 사용 + Encryption 복호화
  • rzx_staff.profile_imageavatar 컬럼명 수정
  • Service 모델 category_id int→string 타입 캐스팅
  • 예약 조회 이메일/전화번호 평문 검색 (암호화 미적용 데이터)
v1.6.1 2026-03-18 · 3개월 전

Added

  • 게시판 관리자 탭 6개 — 기본 설정, 분류 관리, 확장 변수, 권한 설정, 추가 설정, 스킨
  • 기본 설정 탭 통합 — 기본정보 + SEO + 레이아웃 선택 + 스킨 선택 + 표시 + 목록 + 고급 (접기/펼치기)
  • 공통 컴포넌트components/board/section-*.php 8개 (basic, seo, layout-select, skin-select, display, list, advanced, js), 수정/생성 페이지 재사용
  • 다국어 입력 컴포넌트rzx_multilang_input() 함수, text/editor 모드, 인라인 지구본 버튼
  • 분류 관리 강화 — 트리 구조(parent_id), 편집 모달(이름/폰트색/설명/허용그룹/펼침/기본분류), SortableJS 드래그 정렬, 회원등급 DB 동적 로드
  • 확장 변수 탭rzx_board_extra_vars 테이블, 15개 입력 타입 (text_multilang, textarea_multilang, textarea_editor 포함), 다국어 지원, 드래그 정렬
  • 권한 설정 탭 — 접근 권한 (all/member/grade:*/admin_staff/admin), 모듈 관리자 (공용 사용자 검색, 프로필 사진, 권한 범위), 알림 메일 안내
  • 추가 설정 탭 — 통합 게시판, 문서(히스토리/추천/신고), 댓글(수/깊이/승인/추천/신고), 위지윅 에디터(권한 매트릭스), 파일(다운로드 그룹), 피드(RSS 공개/저작권)
  • 스킨 시스템skin.json 포맷, SkinConfigRenderer, "multilang": true 지원, 스킨 정보 카드
  • 레이아웃 시스템layout.json 포맷, 기본 설정에서 카드형 선택
  • 공용 사용자 검색user-search.php 컴포넌트, 암호화 복호화, 프로필 사진, 어디서든 재사용
  • 모듈 관리자rzx_board_admins 테이블, 문서/댓글/설정 권한, 알림 수신
  • 고급 설정 확장 — 관리자 익명 제외, Data URL 제한, 유니코드 오남용, 글/댓글 보호(댓글수/대댓글수/기간), 최고관리자 보호, 발신 메일 주소
  • 토글 스위치 UI — 모든 예/아니오 항목 토글 변환 (기본 + 추가 설정)
  • 번역 키 — 약 300개 키, 13개 언어

Fixed

  • 휴지통 SQL 오류LIMIT ? 바인딩 문자열 → 정수 리터럴
  • Summernote 미렌더링 — jQuery/Summernote JS 로드 + 모달 표시 후 초기화
  • 콜레이션 오류 — board_admins JOIN 시 COLLATE utf8mb4_unicode_ci 명시
  • 접기/펼치기 미동작toggleSection 함수를 <head>에서 먼저 정의

Changed

  • 독립 탭(목록/고급) → 기본 설정 탭에 접기/펼치기 통합
  • 스킨 선택 → 기본 설정 탭으로 이동, 스킨 탭은 설정만 표시
  • 관리자 메일 → 고급 설정의 "발신 메일 주소"로 변경
  • 모듈 관리자 → 권한 설정 탭으로 이동
  • "목록에 분류 표시" → 분류 설정에서 제거, 스킨별 설정으로 이관
  • "목록에 분류 표시" → 분류 설정에서 제거, 스킨별 설정으로 이관
  • 작성 허용 그룹 → 하드코딩 대신 rzx_member_grades 테이블에서 동적 로드
v1.6.0 2026-03-17 · 3개월 전

Added

  • 다국어 폴백 시스템: db_trans() 함수에 내장 폴백 체인 (설정언어 → en → 기본언어 → source_locale → 아무 번역)
  • 게시판 설정 다국어 버튼: 기본 설정 탭 6개 필드에 다국어(지구본) 버튼 추가
  • 게시판 프론트 뷰 다국어 폴백: _init.php에서 title, description, SEO, header/footer 다국어 적용
  • 위젯 다국어 폴백: WidgetRenderer::t(), tBtn() 빈 문자열 처리 개선
  • PWA 번역 키 추가 (13개 언어: admin.pwa.update_available, update, later)

Fixed

  • Features 위젯 빈 카드 문제: ?? 연산자가 빈 문자열 ""을 유효값으로 처리 → !empty() 기반 폴백으로 수정
  • 프로덕션 Mixed Content 오류: APP_URL http→https 수정 + JS 프로토콜 자동 보정
v1.5.2 2026-03-17 · 3개월 전

Added

  • POS 서비스 내역에서 서비스 삭제 기능 (삭제 버튼 + API + DOM 즉시 갱신)
  • 13개 언어 서비스 삭제 관련 번역 키 추가
v1.5.0 2026-03-17 · 3개월 전

Added

  • 키오스크 접수 시스템: 서비스 확인 → 고객 정보 → 예약 생성 → 대기번호 발행
  • 스태프 가용 상태 배지: 키오스크 스태프 선택에서 이용중/가능 실시간 표시
  • 국제전화번호 모듈: 키오스크 접수 폼에 phone-input 컴포넌트 적용
  • 예약 샘플 데이터 시드: database/seed_reservations.php (POS/키오스크/온라인 10건)
  • 키오스크 공통 파일 분리 (_styles.php, _bg.php, _scripts.php)
  • 13개 언어 키오스크 번역 키 11개 추가

Changed

  • 키오스크 서비스 선택: 스태프 스킬 기반 필터링 (지명모드)
  • 키오스크 카테고리 탭 중앙 정렬

Fixed

  • 프로덕션 관리자 로그인 불가 (비밀번호 해시 손상 - bash $ 변수 치환 문제)
  • 업데이트 시스템 안정화: 보존 목록 확장, 헬스체크, DB 버전 동기화
  • 버전 단일 소스 통합 (version.json → index.php, DB 자동 동기화)
VosCMS
호스팅 이용 규약 브랜드 스토리 Logo Guide BI Guide 업데이트 내역 다운로드 서비스 신청 쇼케이스 예약하기 공지사항 자유게시판 질문과 답변 자주 묻는 질문 이슈 Contact Us 마켓플레이스 개발자 플랫폼
로그인 회원가입