info.md 8.3 KB

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)

  • 테이블: fishing (id, field_id, area_id, name, operating_hours, fish_species, 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)
  • 테이블: fishing_photos (FK → fishing, ON DELETE CASCADE, hard delete)
  • 페이지: list / create / detail / edit
  • API:
    • GET /api/fishing/list (분야·지역 JOIN, 검색·필터·페이지네이션)
    • GET /api/fishing/:id (사진 목록 포함, 계좌번호 복호화)
    • POST /api/fishing (계좌번호 암호화)
    • PUT /api/fishing/:id (계좌번호 재암호화)
    • DELETE /api/fishing/:id (soft delete)
    • POST /api/fishing/:id/photos (다중 사진 업로드, MIME 검증)
    • DELETE /api/fishing/photo/:photoId (파일 + DB hard delete)
  • 주요 기능:
    • 선상 관리와 동일한 패턴 (분야/지역 select, 우편번호 검색, 좌표 자동, 계좌 암호화, 사진 다중 업로드, 검색 4종 + 기간검색)
    • 낚시터 전용 컬럼: operating_hours (운영시간 자유 텍스트), fish_species (주요 어종, 콤마 구분 VARCHAR)
    • 어종 검색 지원: 검색대상 select에 "주요어종" 옵션 추가, fs.fish_species LIKE 매칭
    • 비제휴 선택 시 계좌 행 자동 숨김
    • 행 클릭 → 상세, "수정" 버튼 → edit

🎁 아이템 관리 (Item)

  • 테이블: item (id, name, type, point, file_name, file_path, status_YN, deleted_YN, created_at, updated_at)
  • 페이지: list / create / detail / edit
  • API:
    • GET /api/item/list (검색·구분 필터·페이지네이션)
    • GET /api/item/:id
    • POST /api/item (multipart — 이미지와 텍스트 한 번에)
    • PUT /api/item/:id (텍스트 필드 수정, JSON)
    • POST /api/item/:id/image (이미지 교체, multipart, 기존 파일 자동 삭제)
    • DELETE /api/item/:id/image (이미지 제거)
    • DELETE /api/item/:id (soft delete)
  • 주요 기능:
    • 구분 3종: T(진출권) / P(포인트) / B(뱃지)
    • 동적 폼: 진출권 선택 시 포인트 행 자동 숨김 + 값 초기화
    • 포인트 검증: P 필수, B 선택 입력, T 미사용
    • 단일 이미지 업로드: 미리보기 + 교체/제거 분리 처리 (수정 시 새 이미지 > 제거 > 변경없음 우선순위)
    • 검색: 아이템명 입력 + 구분 필터 라디오 버튼 그룹(전체/진출권/포인트/뱃지)
    • 행 클릭 → 상세, "수정" 버튼 → edit, soft delete

🟡 작업 예정 (메뉴)

  • 📊 대시보드 (현재 빈 페이지)
  • 🎯 챌린지 / 퀘스트 관리 (보상 아이템 M:N 관계)

⚙️ 환경 설정 메모

프론트 .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.phpappTimezone = 'Asia/Seoul'

업로드 위치

backend/public/uploads/{도메인}/ (기존 패턴과 통일, 웹 직접 서빙)

  • 선상 사진: backend/public/uploads/onboard/
  • 낚시터 사진: backend/public/uploads/fishing/
  • 아이템 이미지: backend/public/uploads/item/

이미지 URL 생성 (useImage.js)

  • 1순위: NUXT_PUBLIC_IMAGE_BASE 환경변수
  • 2순위(fallback): NUXT_PUBLIC_API_BASE의 origin 자동 추출 → 로컬에서 imageBase 비워도 이미지 표시됨

🗑️ 정리한 컨트롤러 / 라우트

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_atDEFAULT CURRENT_TIMESTAMP만, updated_atNULL DEFAULT NULL로 정의
  • 계좌번호 컬럼 길이 — 암호화하면 base64로 ~135자 → VARCHAR(255) 권장
  • 신규 SCSS 추가 시 — 어드민 페이지의 <style scoped> 안 만들고 app/assets/scss/admin.scss 에 통합 (일관성 + 관리 단순화)