尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证골목마켓 React 프론트엔드
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
동네 기반 중고거래 플랫폼 포트폴리오 프로젝트의 React 프론트엔드. 백엔드는 별도 저장소다: golmok-market (Spring Boot 4.1.1 / MySQL) 백엔드가 http://localhost:8080에 떠 있어야 한다. /api 요청은 vite.config.js에서 백엔드로 프록시된다. 채팅 WebSocket(/api/ws)도 같은 프록시를 탄다(ws: true). 환경값은 .env.example을 복사해 .env로 쓰고, .env는 커밋하지 않는다.查看完整 README ↗
동네 기반 중고거래 플랫폼 포트폴리오 프로젝트의 React 프론트엔드. 백엔드는 별도 저장소다: golmok-market (Spring Boot 4.1.1 / MySQL)
[email protected] / Golmok123!react, react-dom, react-router, @stomp/stompjs 넷뿐이다. 상태 관리·UI 라이브러리 없이 만들었다.백엔드가 http://localhost:8080에 떠 있어야 한다.
npm install
npm run dev # http://127.0.0.1:5173
/api 요청은 vite.config.js에서 백엔드로 프록시된다. 채팅 WebSocket(/api/ws)도 같은 프록시를 탄다(ws: true). 환경값은 .env.example을 복사해 .env로 쓰고, .env는 커밋하지 않는다.
| 스크립트 | 설명 |
|---|---|
npm run dev | 개발 서버 |
npm run build | 프로덕션 번들 |
npm test | 단위 테스트 135개(node:test) — API 클라이언트·채팅 소켓·푸시·서비스 워커·주소 규칙·오류 보고 등 |
npm run test:e2e | Playwright E2E 50개(PC·모바일). API 와 WebSocket 을 모킹하므로 백엔드 없이 돈다 |
npm run test:e2e:live | 실제 MySQL 백엔드에 붙이는 E2E(상품 쓰기·후기) |
npm run icons | 앱 아이콘 PNG 재생성(scripts/make-icons.mjs) |
E2E 는 PW_CHANNEL=chrome 이면 설치된 Chrome 으로 돈다(CI 도 같은 설정).
src/
main.jsx 엔트리. 가장 바깥 오류 경계, 서비스 워커 등록, 푸시 계정 동기화
index.css 전역 리셋 + 디자인 토큰(CSS 변수, 밝게·어둡게)
App.jsx 화면 조립. 주소 해석·이동, 여러 덩어리를 잇는 동작(찜·차단·저장·로그아웃), 창 목록, 오류 경계 배치
app/ App 만 쓰는 조각
HomePage.jsx 홈 화면(목록·빈 상태·오류·사이드바)
useHomeFeed.js 홈 목록·무한 스크롤·늦은 응답 버리기 useCategories.js 카테고리
useProductDetail.js 상품 상세(기록 항목별 캐시 — 조회수 두 번 방지)
useBadges.js 채팅 실시간 연결·알림/채팅 뱃지 useAdminAccess.js 관리자 여부
useScrollRestoration.js 주소별 스크롤 위치 저장·복원 routeScreens.jsx RequireId·ChatScreen·MyScreen
routes.js 주소 만들기·해석, 알림 경로 허용 목록
crash.js 오류 종류 판별(나눠진 파일을 받지 못한 오류인지)
serverStatus.js 데모 서버가 살아 있는지(꺼짐 판정·8초 확인·30초마다 다시 확인)
toast.js · theme.js 공용 토스트 · 화면 모드
push.js · pwa.js 웹 푸시 구독 · 서비스 워커 등록
viewport.js · inputMode.js 모바일 키보드 높이 · 입력 방식(초점 링)
api/
client.js fetch 래퍼. 토큰 보관(로그인 상태 유지 선택), 401 처리, 재발급 공유
chatSocket.js 채팅 실시간 연결(STOMP). 재연결 · 토큰 만료 처리
errorReport.js 화면 오류 보고(서버 로그로, 경로만·같은 오류 한 번·최대 5건)
adminApi.js 관리자 API
*.js 엔드포인트별 얇은 함수(인증·상품·동네·채팅·거래·후기·알림·신고·차단·푸시·검색)
components/
ErrorBoundary.jsx 오류 경계 + 본문 안내 + 창 안내
ServerDownBanner.jsx 데모 서버가 꺼져 있을 때의 안내 띠(화면 캡처 링크·다시 확인)
Header · BottomNav · CategoryBar · Sidebar · PopularKeywords 틀과 탐색
ProductCard · ProductDetail · ProductForm · PhotoSorter · Lightbox 상품
ChatPage · ChatList · ChatRoom 채팅(목록·방·직거래 줄)
MyPage · SettingsPage · ProfileForm · MyRegions · PushToggle · BlockedUsers · WithdrawForm 나의 골목·설정
UserProfile · ReviewForm · ReviewList · ReportForm · NotificationPanel 이웃·후기·신고·알림
Modal · Toaster · Skeleton · EmptyState · Avatar · Icon · NotFound 공용
admin/ 관리자 영역(/admin/*). 들어갈 때만 불러오는 별도 파일로 나뉜다
AdminApp.jsx 관리자 틀(메뉴·사이트로 돌아가기) + 관리자 본문 오류 경계
AdminDashboard · AdminReports · AdminUsers · AdminProducts · AdminActions 현황·신고함·회원·상품·조치 기록
useAdminList.js 커서 목록 불러오기 · 주소 쿼리 조건 · "이 대상 열기"
data/ 가격·시간 포맷, 가격 입력, 사진 순서 계산
public/sw.js 서비스 워커(사진·번들 캐시, API 는 캐시하지 않음, 푸시 수신)
react-router). 상품 상세·프로필은 보던 화면 위의 모달이라 닫으면 목록과 스크롤이 그대로다. 홈 검색어·카테고리·정렬은 쿼리(/?q=식탁&sort=PRICE_ASC)라 공유·뒤로가기가 된다. 배포는 vercel.json 의 SPA 대체 경로가 필요하다.localStorage, 끄면 sessionStorage(탭을 닫으면 로그아웃)다. 공용 PC 에서는 끄면 된다.{ isLiked, favoriteCount }만 반영한다. 하트와 관심 수가 어긋난 채 남는 것보다 낫다고 봤다.IntersectionObserver), 나머지는 "더 보기"다. 서버가 준 nextCursor를 그대로 돌려보낸다.id로 중복을 거른다. 재연결되면 REST 로 다시 불러온다(끊긴 동안의 이벤트는 다시 오지 않는다)./admin/*). 일반 헤더·하단 탭 없이 자기 메뉴를 쓰고, 코드는 React.lazy 로 나눠 일반 사용자의 첫 화면 파일에 넣지 않는다. 권한 판단은 서버가 한다 — 관리자가 아니면 서버가 404 를 주고 화면은 "권한 없음" 대신 없는 페이지를 보인다(관리자 기능의 존재를 드러내지 않는다). 이때도 코드(RESOURCE_NOT_FOUND)로만 판단한다. 없는 회원·상품도 404 라 상태 코드로 가르면 관리자가 쫓겨난다.브레이크포인트는 880px 하나. 모바일 우선으로 작성하고 @media (min-width: 880px)에서 PC 레이아웃으로 전환한다.
| 모바일 (<880px) | PC (≥880px) | |
|---|---|---|
| 피드 | 1열 리스트 (썸네일 110px + 정보) | 3열 그리드 |
| 카테고리 | 가로 스크롤 칩 | 헤더 하단 줄바꿈 배치 |
| 내비게이션 | 하단 탭 | 헤더 우측 |
| 채팅 | 목록 → 방 한 화면씩 | 목록 · 방 나란히 |
| 창(모달) | 화면 전체 시트 | 가운데 창 |