Skip to content

heavyYoung2/FrontEnd

Repository files navigation

회비영 (HeavyYoung)

학생회와 재학생이 공지, 자산, 인증 업무를 함께 처리하는 Expo Router 기반 모바일 앱입니다. 학생회 전용 탭과 일반 학생 탭을 분리해 필요한 기능만 쉽게 접근할 수 있도록 구성했고, 공지·자산·QR·설정 등 핵심 플로우를 우선 구현했습니다.

Tech Stack

  • Expo 54, React Native 0.81, React 19
  • Expo Router 6, Safe Area, Vector Icons
  • Expo Camera (QR 스캐너), Expo SecureStore (세션)
  • Axios 기반 API 레이어, date-fns, react-native-calendars
  • TypeScript, Expo ESLint preset

주요 기능

  • 역할별 내비게이션: (council)(student) 스택을 분리하고 HBTabBar로 가운데 플로팅 탭을 제공
  • 공지 관리: 공지 목록, 상세 보기, 작성, 수정, 삭제, 달력 필터링까지 하나의 흐름으로 연결
  • 공지 달력: 월 단위 API 조회, 기간형 이벤트를 multi-period 마킹으로 표시, 날짜별 공지 리스트 제공
  • QR 인증: Expo Camera로 권한 요청 → 스캔 → 승인/거부 시나리오를 시각적으로 안내
  • 자산 대여: 카테고리별 대여/반납 처리, 수량 조정 모달, 상세 관리 화면 진입
  • 설정 허브: 역할 전환, 가이드, 비밀번호 변경 등 추가 화면으로 확장 가능한 메뉴 제공
  • 디자인 토큰: src/design/colors.ts, src/design/typography.ts로 색상·타이포 일관성 유지

역할별/탭별 기능 상세

학생회(관리자)와 학생 뷰는 동일한 탭 5개(qr, rental, index, locker, mypage)를 공유하며, HBTabBar가 순서/아이콘/중앙 플로팅 버튼을 단일 소스로 관리합니다. 아래는 탭별 상세 동작과 주요 화면입니다.

학생회 (관리자)

  • QR (app/(council)/qr.tsx)
    • 학생 앱 QR 스캔 → 학생회비 납부 여부 검증(src/screens/StudentFeeQrScanner), 승인/미승인/에러 상태별 음성·배지·버튼 라벨 대응
  • 물품 (app/(council)/rental/*)
    • 대시보드(rental/index.tsx): 카테고리별 총수량/대여중 수량, 대여/반납 액션 진입, 물품 관리 모달
    • 스캔(rental/scan.tsx, src/screens/RentalQrScanner.tsx): 학생 QR로 대여 처리, 에러 코드별 친절 메시지
    • 반납 스캔(rental/return.tsx, src/screens/ReturnQrScanner.tsx): 학생 QR로 즉시 반납 처리
    • 내역/필터(rental/overview.tsx): 상태(대여중/연체/반납완료/취소), 카테고리, 검색어, 특정 날짜 필터 + 수동 반납 처리
    • 종류 추가(rental/add.tsx): 새 카테고리 생성 후 대시보드로 리다이렉트
  • 달력/공지 (app/(council)/index.tsx, app/notice/*)
    • 공지 리스트 + 작성/수정/삭제, notice/calendar.tsx에서 월별 이벤트 멀티 마킹, 상세/작성/수정 라우트 연결
  • 사물함 (app/(council)/locker/*)
    • 대시보드(locker/index.tsx): 구역별 사용중/가능/불가 수량, 상태 변경(사용 가능/사용중/고장), 학기 일괄 반납
    • 신청 일정 관리(locker/applications.tsx): 일정 생성, 신청 마감, 자동 배정, 신청자 목록·신청 시간 표시
    • 배정 내역(locker/history.tsx): 학기 선택 후 구역별 배정 테이블 뷰
  • 마이/설정 (app/(council)/mypage.tsx, app/settings/*)
    • 학생회 인원 관리, 비밀번호 변경, 가이드, 로그아웃/탈퇴, 학생 뷰로 전환 스위치 (settings-home.tsx 내부)

학생

  • QR (app/(student)/(tabs)/qr.tsx)
    • 학생회비 납부 상태를 포함한 QR 발급(30초 만료 타이머), 만료 오버레이/재발급, 미납 안내 토스트
  • 물품 (app/(student)/(tabs)/rental/*)
    • 대여 대시보드(rental/index.tsx): 대여 가능 품목 목록, 잔여 수량, 블랙리스트/경고 안내
    • 대여 QR 발급(rent-item.tsx): 카테고리별 QR 생성, 학생회비 납부 배지, 만료 타이머
    • 반납 QR 발급(return-item.tsx): 활성 대여 목록에서 선택 후 QR 발급, 연체 배지/메타 표시
    • 내 대여 현황(my-status.tsx), 전체 대여 내역(rental-history.tsx), 안내(guides.tsx)
  • 달력/공지 (app/(student)/(tabs)/index.tsx, app/notice/*)
    • 공지 리스트/상세 읽기, 달력 진입(작성·수정은 비활성)
  • 사물함 (app/(student)/(tabs)/locker.tsx)
    • 나의 사물함 상태/배정 정보, 신청 버튼(중복 신청 방지), 구역별 현황 모달에서 상태·배정자 정보 확인
  • 마이/설정 (app/(student)/(tabs)/mypage.tsx, app/(student)/settings/*)
    • 내 대여/사물함/블랙리스트/학생회비 상태를 한 번에 확인, 비밀번호 변경, 알림/가이드, 로그아웃 등

공통 컴포넌트/토대

  • HBTabBar(src/components/HBTabBar.tsx): 두 스택의 탭 순서/아이콘/레이블 중앙 관리, 중앙 플로팅 버튼 강조
  • CouncilHeader: 배지/학번/타이틀/백버튼/우측 액션 공통 헤더
  • 디자인 토큰: src/design/colors.ts, src/design/typography.ts (Pretendard 폰트 기준)
  • API 레이어: src/api/* 도메인 서비스, Axios 인터셉터, 플랫폼별 기본 URL 분기

공통 컴포넌트/토대

  • HBTabBar: 학생회·학생 탭바를 단일 소스에서 관리, 중앙 플로팅 버튼 포함
  • CouncilHeader: 상단 헤더(배지/학번/뒤로가기/우측 액션) 공통화
  • 디자인 토큰: src/design/colors.ts, src/design/typography.ts
  • API 레이어: src/api/* 도메인 서비스와 공통 인터셉터, 플랫폼별 기본 URL 분기

디렉터리 맵

app/
  _layout.tsx            # 역할별 스택 정의
  (council)/             # 학생회 탭: QR, 대여, 사물함, 마이
  (student)/             # 학생 탭: 같은 탭 구성을 학생 전용으로
  notice/                # 공지 상세, 작성, 수정, 달력
  settings/              # 설정 및 부가 화면
  auth/                  # 로그인 흐름(추가 예정)
components/              # 글로벌 UI (CouncilHeader 등)
src/
  api/                   # axios client와 도메인별 서비스
  auth/                  # AuthProvider (SecureStore 연동)
  components/            # 기능 위젯 (HBTabBar 등)
  design/                # 색상/타이포 토큰
  screens/               # 상태/비즈니스 훅 (필요 시 공유)
  utils/                 # 순수 헬퍼 (date 포맷 등)
assets/                  # 이미지, 로고

API 연동

  • src/api/client.ts 에서 iOS/Android 환경별 기본 URL을 분기합니다. 현재는 내부 개발용 IP(13.209.220.192:8080, 10.0.2.2:8080)가 설정되어 있으므로 배포 시 .env 또는 Expo Config Plugin으로 분리하세요.
  • adminEvents.ts, event.ts는 서버의 ApiResponse<T> 래핑을 전제로 하며 목록/상세/등록/수정/삭제를 담당합니다.
  • 에러는 공통 인터셉터에서 콘솔 경고로 로깅하고, 화면에서는 Alert로 사용자에게 안내합니다.

시작하기

npm install
npm run start           # Metro + Expo Router
# or
npm run android         # 안드로이드 에뮬레이터
npm run ios             # iOS 시뮬레이터
npm run web             # 웹 미리보기
  • ESLint: npm run lint (Expo preset, 정렬/미사용 규칙 필수 준수)
  • 캐시 초기화: npm run start -- --clear
  • 샘플 라우트 리셋: npm run reset-project (협업 중에는 사용 주의)

개발 메모

  • Pretendard 폰트를 전제로 스타일이 작성되어 있으므로 앱 시작 시 expo-font 로드 로직을 유지해야 합니다.
  • QR 기능은 기기 권한 상태에 따라 UI가 달라지므로 실제 디바이스에서 한 번 이상 검증하세요.
  • Calendar 화면은 월 전환 시 getAdminEvents를 다시 호출합니다. 서버 쿼리 비용을 고려해 페이지네이션/캐싱 전략을 추후 협의하세요.
  • SecureStore에 역할(role)만 보관 중이며 토큰 저장/검증은 TODO로 남아 있습니다.
  • 자동 테스트는 아직 없으므로 머지 전 npm run start 후 안드로이드·iOS·웹에서 핵심 플로우(공지 CRUD, 달력, QR, 대여, 설정)를 수동 점검해 주세요.

향후 확장 아이디어

  • 학생/학생회 공통으로 쓰는 API 응답 캐싱과 에러 처리 토스트화
  • Rental/Locker 데이터의 서버 연동 및 실시간 동기화
  • AuthProvider에 실제 로그인, 토큰 갱신, 가드 라우팅 추가
  • Settings 하위 화면(비밀번호 변경, 역할 전환)에서 실서비스 API 연동

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published