尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
자전거와 개인 킥보드에 QR 디지털 신분증을 만들고, 잃어버렸을 때 QR을 스캔한 사람에게서 발견 위치 제보를 받는 생활 안전 서비스입니다. (실시간 위치 추적 서비스가 아닙니다.)檢視完整 README ↗
자전거와 개인 킥보드에 QR 디지털 신분증을 만들고, 잃어버렸을 때 QR을 스캔한 사람에게서 발견 위치 제보를 받는 생활 안전 서비스입니다. (실시간 위치 추적 서비스가 아닙니다.)
회원가입 → 로그인 → 이동수단 등록(사진·특징) → 고유 QR 생성 → QR 저장·부착
→ 분실/도난 신고(수색 중) → 다른 사람이 로그인 없이 QR 스캔 → 수색 중 안내 확인
→ 발견 제보(위치 + 사진) → 소유자가 제보 확인 → 회수 완료
| 경로 | 내용 | 로그인 |
|---|---|---|
/ | 서비스 소개, 등록·스캔 버튼 | - |
/signup, /login | 회원가입(이메일·비밀번호·닉네임), 로그인 | - |
/dashboard | 안녕하세요 ○○님, 내 이동수단 카드 (수색 중·제보 접수는 색·띠로 구분) | 필요 |
/vehicles/new | 이동수단 등록 (종류·이름·브랜드·모델·색상·특징·사진) → QR 자동 생성 | 필요 |
/vehicles/[id] | 상세, 분실/도난 신고 · 회수 완료 · 정상 복귀 · 삭제 | 필요 |
/vehicles/[id]/qr | 큰 QR, 스티커용 PNG 저장, 공유 | 필요 |
/vehicles/[id]/reports | 받은 발견 제보·연락 요청 (사진은 소유자만) | 필요 |
/scan | 카메라 QR 스캔, 링크 직접 입력 | - |
/scan/[qrId] | 공개 QR 화면: 정상 / 🚨 수색 중 안내 (소유자 개인정보 없음) | - |
/report/[qrId] | 발견 제보·연락 요청 (위치 권한 또는 직접 입력, 사진, 연락처 선택) | - |
/community | 분실 커뮤니티: 찾는 중/찾았어요, 종류 필터, 지역·색상 검색 | - |
/community/new | 분실 글 쓰기 (내 이동수단 연결 시 정보·사진 자동 채움 + 수색 중 전환) | 필요 |
/community/[id] | 글 상세, 댓글(본 위치·사진), 🔒 비밀 댓글, 찾았어요, 공유 | 댓글은 필요 |
/stickers/[code] | 새 B-LOCK 스티커를 내 이동수단에 등록 (주인만 아는 부착 위치 기록) | 필요 |
/admin/stickers | 관리자: 빈 스티커 묶음 만들기, A4 40칸 인쇄·PDF, CSV | 관리자 |
/ride | 라이딩 기록: 네이버 지도 위 실시간 경로, 시작·일시정지·종료, 거리·시간·속도 | 필요 |
/rides, /rides/[id] | 라이딩 기록 목록(이번 달 합계), 결과(전체 경로·출발/도착·정비 알림), 삭제 | 필요 |
/vehicles/[id]/maintenance | 소모품·정비: 마모율 3단계, 주기 수정, 정비 완료(0km 리셋) + 정비 다이어리 | 필요 |
/vehicles/[id]/edit | 이동수단 정보·사진 수정 (QR은 그대로) | 필요 |
/vehicles/[id]/transfer | 소유권 넘기기: 비밀번호 재확인 → 10분 양도 QR | 필요 |
/t/[token] | 소유권 받기: 숨은 스티커(또는 차대번호 끝 4자리)로 실물 확인 후 이전 | 필요 |
/v/[token] | 안심거래 인증: 도난 이력·등록일·보유 기간·양도 횟수·확인 코드 (판매자 마스킹) | - |
/vehicles/[id]/evidence, /vehicles/[id]/certificate | 소유 증명: 증거 사진 보관함, 경찰·보험 제출용 증명서 | 필요 |
/c/[token] | 소유 증명서 진위 확인 | - |
/vehicles/[id]/alert | 도난 경보 보내기: 잃어버린 곳·시각·특징·경찰 신고 번호·약속형 사례금 | 필요 |
/alerts, /alerts/[id] | 근처 도난 경보 목록·상세, 거리/중고 매물 목격 제보, 회수 완료(숨은 스티커 확인) | 제보는 필요 |
/alerts/[id]/police | 112 도난 신고서: 인쇄·PDF, 112 문자 복사 (신고자 정보 저장 안 함) | 주인 |
/r | 발견자 익명 대화 (로그인 없이, 제보 후 14일) | - |
/check | 구매 전 도난 조회: QR·조회 번호(코드 앞 8자리)·차대번호 → 도난 신고 중/등록됨/기록 없음 | - |
/stats | 공개 통계, 도난 다발 지도 (약 500m 칸) | - |
/admin/members, /admin/alerts | 관리자: 회원 본인인증 표시, 신고된 도난 경보 처리 | 관리자 |
/scan/MjdL-...) 사용자 ID·개인정보 없음.get_public_vehicle 함수가 종류·색상·브랜드·모델·특징·사진·상태만 돌려줍니다. 이름·이메일·닉네임은 꺼낼 수 없습니다.submit_report 함수로만 남길 수 있고(QR 코드 필수, 10분 20건 제한), 읽기는 소유자만 됩니다.vehicle-images는 공개(본인 폴더에만 올리기), report-images는 비공개(소유자만 1시간짜리 주소로 열람). 5MB·이미지만 허용, 올리기 전에 1600px로 줄입니다.get_post_comments가 나머지 사람에게는 비워서 돌려줌), 비밀 댓글 사진은 비공개 버킷 community-secret에 저장됩니다. 글쓴이 이름은 닉네임만 보입니다.Next.js 15 (App Router) · React 19 · TypeScript · Tailwind CSS 3.4 · Supabase (Auth · Postgres · Storage) · qrcode · jsQR · lucide-react
supabase/schema.sql → 002_community.sql → 003_stickers.sql → 004_rides_maintenance.sql → 005_review_fixes.sql → 006_moderation.sql → 007_admin_stats.sql → 008_push.sql → 009_account.sql → 010_post_location.sql → 011_merge_fixes.sql → 012_review_fixes.sql → 013_trade_transfer.sql → 014_theft_alerts.sql → 015_evidence_certificate.sql → 016_report_chat.sql → 017_cleanup_admin.sql → 018_check_stats.sql → 019_polish.sql → 020_g1_alerts.sql → 020_g2_stickers.sql → 020_g4_ui.sql → 020_g5_owner.sql → 020_g6_community_admin.sql → 021_transfer_link.sql → 022_lookup_code.sql → 023_transfer_link_7days.sql → 024_riding_plus.sql → 025_listing_check_history.sql → 026_listing_match_wider.sql → 027_sticker_spots_print.sql → 028_privacy_zones_admin_areas.sql → 029_personal_settings.sql → 030_audit_fixes.sql 순서로 실행합니다. (뒤 파일이 앞의 함수·트리거를 최종본으로 바꿔요. 모두 여러 번 실행해도 안전)
관리자 지정: update public.profiles set is_admin = true where email = '관리자 이메일';.env.example을 복사해 .env.local을 만들고 값을 채웁니다.
| 이름 | 용도 | 공개 여부 |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Supabase 연결 | 공개 값 |
NEXT_PUBLIC_SITE_URL | QR·공유 미리보기·사이트맵의 기준 주소 | 공개 값 |
NEXT_PUBLIC_NAVER_MAP_CLIENT_ID | 네이버 지도 (NCP Maps Dynamic Map) | 공개 값 |
NEXT_PUBLIC_VAPID_PUBLIC_KEY | 웹 푸시 공개 키 | 공개 값 |
VAPID_PRIVATE_KEY | 웹 푸시 서명 키 | 비밀 |
PUSH_WEBHOOK_SECRET | DB → /api/push 호출 확인용 (app_private.push_config.secret과 같아야 함) | 비밀 |
NEXT_PUBLIC_OPERATOR_NAME, NEXT_PUBLIC_CONTACT_EMAIL | 약관·방침·문의하기의 운영자·연락처 (선택, 비우면 site.ts 기본값) | 공개 값 |
NEXT_PUBLIC_SUPABASE_URL, NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY 추가 후 DeployNEXT_PUBLIC_SITE_URL에 그 주소를 넣고 다시 배포 (QR에 들어가는 주소가 고정됩니다)/admin/stickers에서 빈 스티커 묶음을 만들고 인쇄 → 학교·편의점에 배치NEXT_PUBLIC_NAVER_MAP_CLIENT_ID에 넣고, Web 서비스 URL에 사이트 주소(localhost 포함)를 등록합니다. 키가 없거나 인증에 실패하면 지도 대신 경로 모양만 그려서 기능은 계속 동작합니다.src/lib/ride/geo.ts): 정확도 35m보다 나쁜 위치 버림 · 시속 65km 넘는 순간 이동(튐) 버림 · 정확도 반경 안 맴돌기(정차 떨림)는 거리·이동 시간에 넣지 않음 · 최고 속도는 8초 평균.complete_ride)하면 기록 + 이동수단 누적 거리 + 소모품 거리를 한 번에 반영. 기록 삭제(delete_ride)는 그 라이딩 뒤로 정비하지 않은 소모품에서만 거리를 뺍니다.service_part): 날짜·비용·정비소·메모를 다이어리에 남기고 거리 0km부터 다시 셉니다./admin/reports에서 숨기기·다시 보이기·삭제./settings: 닉네임 변경(지난 글·댓글 이름도 바뀜), 알림, 비밀번호 변경, 차단 목록, 회원 탈퇴(사진 정리 후 계정·연결 데이터 삭제)./forgot-password → 메일 링크 → /auth/callback → /reset-password. Supabase 기본 메일 서버는 프로젝트 팀원 이메일로만, 시간당 2통까지만 보내서 일반 사용자는 메일을 못 받아요. 출시 전에 SMTP를 꼭 연결하세요(Gmail로 5분, 한국어 메일 문구 포함): docs/email-templates.md/terms, /privacy, /location-terms, /contact 초안. 출시 전 법률 검토와 위치정보사업 신고·등록 필요 여부 확인을 권장해요.send_push(pg_net) → /api/push(비밀값 확인 후 web-push로 발송). 끝난 기기 구독은 자동으로 지워요. 아이폰은 '홈 화면에 추가'한 앱에서만 받을 수 있어요./admin 운영 통계(가입자, 이동수단, 스티커 등록률, 회수율, 발견 제보, 라이딩, 주별 그래프, 스티커 묶음별 등록률). 관리자만.opengraph-image), robots.txt, sitemap.xml, 기본 보안 헤더.loading.tsx 스켈레톤(shimmer)으로, 버튼 제출 대기만 버튼 안 인라인 스피너로 통일했습니다. 커뮤니티 탭·검색 전환도 목록 자리에 스켈레톤이 나옵니다.src/app/manifest.ts(앱 정보), src/app/icons/[file](앱 아이콘을 코드로 그림), public/sw.js(설치 조건 + 오프라인 안내 화면만 저장, 개인 화면은 저장 안 함)src/
app/ 화면 (위 표의 경로)
components/ui/ 공통 부품 (Button, Card, Input, Modal, Toast, PhotoPicker, StatusBadge …)
components/vehicle/ 이동수단 카드·사진
config/site.ts 서비스 이름 (B-LOCK) — 여기만 바꾸면 전체 반영
lib/supabase/ Supabase 연결 (브라우저 / 서버)
lib/ 상태·종류 정의, 사진 처리, QR 주소, 날짜 형식
middleware.ts 로그인 유지, 로그인 필요한 화면 보호
supabase/schema.sql 데이터베이스·권한·저장소 설정
제보·댓글·정비 알림 푸시(웹 푸시), 라이딩 백그라운드 기록(네이티브 앱), 소유권 확인용 구매 영수증 첨부, 글 신고·차단
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=sb_publishable_xxxx
npm install
npm run dev # http://localhost:3000