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)에 흡수되던 문제 차단 (모든 ## [ 에서 블록 분리)
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)
Added
- •마이그 036
partner_earnings / payouts 에 withholding_tax · consumption_tax · tax_basis 컬럼 추가
- •마이그 037
payouts 에 fx_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_contents 의 terms / 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 IGNORE → INSERT … 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조 일본법 + 후쿠오카지방재판소 전속관할
· 처리 항목 — 공통/구매자/개발자(공통)/일본 거주/해외 거주/배송 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_type 에 color 옵션 추가 + 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 가시성 확보)
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.sql — rzx_notifications 테이블 (사용자 알림)
- •
035_issue_reply_thread.sql — rzx_mkt_issue_replies.parent_reply_id 컬럼 추가 (스레드 답글)
Fixed
- •
/Market?item={slug} 슬러그 누락 — items-show 에서 dedicated 단일 컬럼 조회로 보정
- •아이템 수정 API 의
icon_url 컬럼명을 실제 컬럼 icon 으로 교정
- •마켓 settings 페이지 빈 화면 —
rzx_mkt_settings 마이그레이션 005 누락분 적용
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 — 헬퍼 함수 정의 위치
- •페이지 액션 바 — 콘텐츠 너비 토큰 적용
- •새 글 게시 시 기존 글 사라지는 버그 (피드 즉시 갱신)
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 키 등록 완료
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 외).
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 안내 메시지.
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).
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_url → WEBMAIL_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.php — pageMetaMap['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_name 의 FKzGx9SE7xG/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-400 → text-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.json 의 menus.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.php 에 HQ_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._id 와 db_trans() 매칭으로 해결
v2.3.8
2026-04-25 · 1개월 전
게시판 다국어 완성 + FAQ/Q&A 스킨
Added
_init.php 가 rzx_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.php 에 update 액션 추가. 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.php 가 rzx_admin_icons 헬퍼를 line 167에서 require 했는데, line 161에서 스킨 파일을 include 하면서 return 으로 빠져나갔기 때문에 FAQ/Q&A 스킨에서 rzx_admin_icons() 호출 시 500 에러 발생. require_once 를 스킨 include 위로 이동.
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-autoinstall이 unauthorizedPlugins로 잡히던 문제. LicenseStatus.php에 BUNDLE_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.php에 sort, 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.php — db_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_key 의 page.{old_slug}. → page.{new_slug}. 일괄 UPDATE
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) 으로 해결.
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.sh 에 1.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.php 의 general/domain/hosting/addons 를 settings_tabs 로 이전, 최상위 탭으로 승격
Changed
- •
/{slug}/settings, /{slug}/edit 가 config/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_name 이 enc: 접두사로 저장되어 복호화 없이 그대로 노출되던 문제 수정
- •아바타 조회가 존재하지 않는
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/files 에 set_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.json — marketplace_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.php —
sendSmtpMail → rzx_send_mail() 공용 헬퍼 우선 호출 (폴백 유지)
- •index.php —
mail.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} 타입별 탭 관리 (호스팅/도메인/메일/유지보수/부가서비스)
- •서비스 관리 API —
api/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회성 서비스 초기 상태 —
active → pending(접수)으로 생성되도록 수정
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() 모두 % 24 → min(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-*.php → resources/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이 .env의 APP_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_menus → rzx_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_contents에 page_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_posts에 extra_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_points에 balance, 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-content → flex-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_bundles에 event_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_category → hide_categories 로 변경
- •게시판 URL
/board/free → /free 단축 URL 기본 사용
- •관리자 topbar "Admin" → 실제 로그인 이름 + 프로필 사진
Fixed
- •
rzx_users.role 컬럼 없음 → $_SESSION['admin_id'] 기반 관리자 판별
- •
rzx_users.nick_name 컬럼 없음 → name 사용 + Encryption 복호화
- •
rzx_staff.profile_image → avatar 컬럼명 수정
- •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 자동 동기화)