# Piratezone — 프로젝트 정보 선상 낚시 예약 서비스의 **사이트 관리자(Admin)** 와 사용자 사이트. --- ## 🏗️ 기술 스택 | | | |---|---| | 프론트엔드 | Nuxt 3 (Vue 3), SCSS, flatpickr (DatePicker) | | 백엔드 | CodeIgniter 4 (PHP) | | DB | MySQL / MariaDB | | 폰트 | Pretendard (로컬, woff2 + woff) | | 외부 API | Daum 우편번호, Google Geocoding | | 암호화 | CI4 Encryption (AES-256-CTR + HMAC-SHA512) | --- ## ✅ 완료된 기능 (메뉴별) ### 🔐 인증 / 로그인 - **페이지**: `/site-manager` (로그인 폼, 좌우 50/50 레이아웃) - **API**: `POST /api/auth/login`, `POST /api/auth/logout`, `GET /api/auth/check` - 토큰 기반 인증, 비밀번호 변경 권장 모달, 계정 잠금 모달 - 로그인 후 `/site-manager/dashboard` 로 이동 ### 👤 관리자 관리 - **페이지**: `/site-manager/admins` - **API**: `GET /api/admin`, `POST/PUT/DELETE /api/admin/:id`, 비밀번호 변경, 잠금 해제, 아이디 중복 확인 - 검색(아이디/이름) + 역할·상태 필터 + 페이지네이션 - 본인 계정 삭제 방지, 5회 실패 시 잠금 표시 ### 🎣 낚시분야 관리 (Field) - **테이블**: `fishing_field` (id, name, weight, status_YN, deleted_YN, created_at, updated_at) - **페이지**: list / create / detail / edit - **API**: `GET /api/field/list`, `GET/POST/PUT/DELETE /api/field/:id` - 분야명 1~30자, 중복 불가 - 가중치 0.0~1.0 (소수점 1자리 검증) - 상태(사용중/미사용) 토글, soft delete ### 🗺️ 낚시지역 관리 (Area) - **테이블**: `fishing_area` (id, name, deleted_YN, created_at, updated_at) - **페이지**: list / create / detail / edit - **API**: `GET /api/area/list`, `GET/POST/PUT/DELETE /api/area/:id` - 지역명 1~20자, 중복 불가, soft delete ### ⚓ 선상 관리 (Onboard) - **테이블**: `onboard` (id, field_id, area_id, name, area_detail, tonnage, capacity, zip_code, address, address_detail, address_refer, lat, lng, bank_code, account_number(암호화), account_holder, partnership_YN, status_YN, deleted_YN, created_at, updated_at) - **테이블**: `onboard_photos` (FK → onboard, ON DELETE CASCADE, hard delete) - **페이지**: list / create / detail / edit - **API**: - `GET /api/onboard/list` (분야·지역 JOIN, 검색·필터·페이지네이션) - `GET /api/onboard/:id` (사진 목록 포함, 계좌번호 복호화) - `POST /api/onboard` (계좌번호 암호화) - `PUT /api/onboard/:id` (계좌번호 재암호화) - `DELETE /api/onboard/:id` (soft delete) - `POST /api/onboard/:id/photos` (다중 사진 업로드, MIME 검증) - `DELETE /api/onboard/photo/:photoId` (파일 + DB hard delete) - **주요 기능**: - 분야/지역 select (옵션 역순 정렬 — 수도권 등 초기 등록이 위로) - **Daum 우편번호 검색** + 선택 시 **Google Geocoding 좌표 자동 입력** - **계좌번호 양방향 암호화**: 저장 시 암호화, 상세/수정에서 복호화된 평문 표시 - 비제휴 선택 시 계좌 행 자동 숨김 + 값 초기화 - **다중 사진 업로드**: 미리보기, 개별 삭제, 첫 장 "대표" 뱃지, 10MB 제한 - **수정에서 기존 사진 삭제** (즉시 서버 반영, 파일 + DB) - 검색 4종 (검색대상 select + 검색어 + 제휴 필터 + 상태 필터) - **기간 검색** (등록일, DatePicker + 빠른 버튼: 오늘/7일/15일/1개월/3개월/1년) - 행 클릭 → 상세, "수정" 버튼 → edit --- ## 🟡 작업 예정 (메뉴) - ⛵ 낚시터 관리 (Fishing Spot) - 📊 대시보드 (현재 빈 페이지) --- ## ⚙️ 환경 설정 메모 ### 프론트 `.env` (Nuxt 루트) ``` NUXT_PUBLIC_API_BASE=... # 백엔드 base URL NUXT_PUBLIC_IMAGE_BASE=... # 이미지 호스트 (운영 도메인) NUXT_PUBLIC_MEDIA_BASE=... NUXT_PUBLIC_GOOGLE_MAP_KEY=... # Google Geocoding 키 (위도, 경도 가져오는 데에 사용[타 API 이용시 별도 키 필요하여 구 피싱포엠 형식 따름]) ``` ### 백엔드 `.env` (backend/) ``` encryption.key = hex2bin:... # 계좌번호 암호화 키 (분실 시 복호화 불가) ``` ### 백엔드 타임존 [backend/app/Config/App.php](backend/app/Config/App.php) — `appTimezone = 'Asia/Seoul'` ### 업로드 위치 `backend/public/uploads/onboard/` (기존 패턴과 통일, 웹 직접 서빙) --- ## 🗑️ 정리한 컨트롤러 / 라우트 ERD 새로 짜면서 기존 비즈니스 컨트롤러(Branch, Showroom, Service, Brochure, Event, News, Notice, IR, Advisor, Popup, Basic, SalesStaff, BranchManager, Test) 전부 삭제. 남긴 것: Auth / Admin / BaseApi / Ping / Dashboard / Upload / Home. --- ## 📌 디자인 정책 - **soft delete vs hard delete** - 마스터성 데이터(분야/지역/선상): **soft delete** (`deleted_YN`) - 종속 데이터(선상 사진): **hard delete** + 파일 직접 삭제 - **TIMESTAMP 사용 시 주의** — MySQL이 첫 TIMESTAMP에 자동으로 `ON UPDATE CURRENT_TIMESTAMP` 부여하므로 `created_at`은 `DEFAULT CURRENT_TIMESTAMP`만, `updated_at`은 `NULL DEFAULT NULL`로 정의 - **계좌번호 컬럼 길이** — 암호화하면 base64로 ~135자 → `VARCHAR(255)` 권장