Skip to content

seizeh/pmdart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

485 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿพ PawMate

CI

๋™๋„ค ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ…ยท๋Œ๋ด„ ๋งค์นญ & ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ (Flutter ยท iOS/Android)

GPS ๋™๋„ค ์ธ์ฆ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด์›ƒ๊ณผ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ… ๋ฉ”์ดํŠธ๋ฅผ ์ฐพ๊ณ , ๋Œ๋ด„ยท๋ถ„์–‘ยท์ž…์–‘์„ ๋งค์นญํ•˜๋ฉฐ, ์ฃผ๋ณ€ ๋ฐ˜๋ ค๋™๋ฌผ ์‹œ์„ค์„ ์ง€๋„์—์„œ ์ฐพ์•„ ํ›„๊ธฐ๋ฅผ ๋‚˜๋ˆ„๋Š” ํ•˜์ดํผ๋กœ์ปฌ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท

์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ (WYSIWYG) ์•ฝ์† ์บ˜๋ฆฐ๋”
์ปค๋ฎค๋‹ˆํ‹ฐ ํ”ผ๋“œ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ โ€” ๋“ฑ๋ก๋  ์นด๋“œ ๋ชจ์Šต ๊ทธ๋Œ€๋กœ ํŽธ์ง‘ ์•ฝ์† ์บ˜๋ฆฐ๋”
์‹œ์„ค ์ง€๋„ ์‹œ์„ค ์ƒ์„ธ (์ธ์ฆ ์—…์ฒด) ์ฑ„ํŒ…
์‹œ์„ค ์ง€๋„ (๋‹คํฌ) ์‹œ์„ค ์ƒ์„ธ โ€” ์ธ์ฆ ์—…์ฒด ์ •๋ณดยทํ›„๊ธฐ 1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…
๋‚ด ์ •๋ณด (ํŽซ ํžˆ์–ด๋กœ) ์—…์ฒด ๋ชจ๋“œ (๋‘ ์–ผ๊ตด) AI ์‹ ์› ์ธ์ฆ
๋‚ด ์ •๋ณด โ€” ๋ฐ˜๋ ค๋™๋ฌผ ํžˆ์–ด๋กœ ๊ฐ™์€ ๊ณ„์ •์˜ ์—…์ฒด ์–ผ๊ตด โ€” ์ƒํ˜ธยท์—…์ฒด ํ›„๊ธฐ ๋ฐ˜๋ ค๋™๋ฌผ AI ์˜์ƒ ์‹ ์› ์ธ์ฆ

์ฃผ์š” ๊ธฐ๋Šฅ

์˜์—ญ ๋‚ด์šฉ
๐Ÿ˜๏ธ ๋™๋„ค ์ธ์ฆ GPS + ํ–‰์ •๋™ ์—ญ์ง€์˜ค์ฝ”๋”ฉ ๊ธฐ๋ฐ˜ ์ง€์—ญ ์ธ์ฆ(30์ผ ์ฃผ๊ธฐ ์žฌ์ธ์ฆ) โ€” ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€ยทํ”ผ๋“œ๊ฐ€ ์ธ์ฆ ๋™๋„ค ๊ธฐ์ค€
๐Ÿ• ๋งค์นญ ๋™๋ฐ˜์‚ฐ์ฑ… / ๋Œ€๋ฆฌ์‚ฐ์ฑ… / ๋Œ๋ด„ / ๋ถ„์–‘ / ์ž…์–‘ ๊ฒŒ์‹œ๊ธ€ โ†’ ์ง€์› โ†’ ์ˆ˜๋ฝ โ†’ ์•ฝ์† โ†’ ์ƒํ˜ธ ํ›„๊ธฐ
๐Ÿ“ธ AI ์‚ฌ์ง„ ์ธ์ฆ ๋ฐ˜๋ ค๋™๋ฌผ ์‹ ์› ์ธ์ฆ(์˜์ƒ ๋“ฑ๋ก) + ๊ฒŒ์‹œ๊ธ€ ์‚ฌ์ง„ ์‹ค์กด ๊ฒ€์ฆ(AI ๊ฐœ์ฒด ๋Œ€์กฐยท์œ„์น˜ ๊ฒ€์ฆ) โ€” ํ—ˆ์œ„ ๋งค๋ฌผ ์ฐจ๋‹จ
๐Ÿ—บ๏ธ ์‹œ์„ค ์ง€๋„ ๋„ค์ด๋ฒ„ ์ง€๋„ ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‹œ์„ค(๋ณ‘์›ยท์นดํŽ˜ ๋“ฑ) ํƒ์ƒ‰, ๋ฐฉ๋ฌธ ํ›„๊ธฐยท๋ณ„์ ยทํ›„๊ธฐ ๋Œ“๊ธ€
๐Ÿช ์—…์ฒด ๊ณ„์ • ์‚ฌ์—…์ž ์ธ์ฆ(๊ตญ์„ธ์ฒญ ์กฐํšŒ + ๊ณต๊ณต๋ฐ์ดํ„ฐ ๋Œ€์กฐ ์ž๋™์Šน์ธ) โ€” ํ•œ ๊ณ„์ •์— ๊ฐœ์ธ/์—…์ฒด ๋‘ ์–ผ๊ตด ๋ถ„๋ฆฌ, ์—…์ฒด ์†Œ์‹ ์นดํ…Œ๊ณ ๋ฆฌ
๐Ÿ’ฌ ์ฑ„ํŒ… 1:1 ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ…(Realtime), ์‚ฌ์ง„ ์ „์†ก, ๋ฉ”์‹œ์ง€ ์‚ญ์ œ(30์ผ ์œ ์˜ˆ ํŒŒ๊ธฐ), ์—…์ฒด ๋ฌธ์˜ ๋ถ„๋ฆฌ
๐Ÿ”” ์•Œ๋ฆผ FCM ํ‘ธ์‹œ + ์ธ์•ฑ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ, ํƒญ ์‹œ ํ•ด๋‹น ํ™”๋ฉด ์งํ–‰ ๋”ฅ๋งํฌ, ์œ ํ˜•๋ณ„ ์ˆ˜์‹  ์„ค์ •
๐Ÿ‘ฅ ์†Œ์…œ ํŒ”๋กœ์šฐ(Pawing/Pawmate โ€” ๊ฐœ์ธยท์—…์ฒด ์–ผ๊ตด ๋…๋ฆฝ), ์‚ฌ์šฉ์žยท๋ฐ˜๋ ค๋™๋ฌผยท์ƒํ˜ธ ๊ฒ€์ƒ‰

์•„ํ‚คํ…์ฒ˜

flowchart LR
    subgraph App["๐Ÿ“ฑ Flutter (this repo)"]
        UI[Screens / Widgets] --> SVC[Services ยท Repository ๊ณ„์ธต]
        MOTION[motion/ ์Šคํ”„๋ง ๋ชจ์…˜ ์‹œ์Šคํ…œ] --> UI
    end
    subgraph Supabase["โ˜๏ธ Supabase (pmdb repo)"]
        PG[(PostgreSQL<br/>RLS ยท ํŠธ๋ฆฌ๊ฑฐ ยท RPC)]
        EF[Edge Functions<br/>Deno]
        RT[Realtime]
        ST[Storage]
    end
    SVC -- "PostgREST + ์ปค์Šคํ…€ JWT" --> PG
    SVC -- "์ธ์ฆ/SMS/AI ๊ฒ€์ฆ" --> EF
    SVC -- "์ฑ„ํŒ…ยท์•Œ๋ฆผ ๊ตฌ๋…" --> RT
    SVC -- "์ด๋ฏธ์ง€ ์—…๋กœ๋“œ" --> ST
    EF --> EXT["๊ตญ์„ธ์ฒญ ยท Solapi SMS ยท Gemini ยท<br/>juso.go.kr ยท ๋„ค์ด๋ฒ„ ์ง€์—ญ๊ฒ€์ƒ‰"]
    PG -- "pg_cron + pg_net" --> FCM[FCM ํ‘ธ์‹œ]
Loading
  • ์ธ์ฆ: ์ „ํ™”๋ฒˆํ˜ธ OTP ๊ธฐ๋ฐ˜ ์ปค์Šคํ…€ ์ธ์ฆ(HS256 JWT + refresh ํ† ํฐ). Supabase Auth ๋ฏธ์‚ฌ์šฉ โ€” ๋ชจ๋“  RLS ๊ฐ€ app.uid()(JWT sub) ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์›์น™: ํด๋ผ์ด์–ธํŠธ์—๋Š” publishable ํ‚ค๋งŒ. ์“ฐ๊ธฐ ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ SECURITY DEFINER RPC / DB ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ตœ์ข… ๊ฐ•์ œ(ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์€ UX ์šฉ). ํด๋ผ์ด์–ธํŠธ ๊ณต๊ฐœ ํ‚คยท์‹๋ณ„์ž๋Š” lib/env.dart ํ•œ๊ณณ์— ๋ชจ์—ฌ ์žˆ์œผ๋ฉฐ --dart-define ์œผ๋กœ ํ™˜๊ฒฝ๋ณ„ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ๋‹ค(๋น„๋ฐ€ ํ‚ค๋Š” ์„œ๋ฒ„ ์ „์šฉ).
  • ๋ชจ์…˜: lib/motion/ ์˜ ์Šคํ”„๋ง ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(PressableยทEntranceยทCollapseRoute ๋“ฑ)๋ฅผ ์ „ ํ™”๋ฉด์ด ๊ณต์œ  โ€” ์นด๋“œ ํ™•์žฅ/์ถ•์†Œ, ์“ธ์–ด๋‚ด๋ ค ๋‹ซ๊ธฐ ๋“ฑ ์ผ๊ด€๋œ ์ „ํ™˜ ์–ธ์–ด.

์ €์žฅ์†Œ ๊ตฌ์กฐ

lib/
  main.dart          # ์•ฑ ์ดˆ๊ธฐํ™” ยท ํ‘ธ์‹œ/๋”ฅ๋งํฌ ๋ผ์šฐํŒ…
  screen/            # ํ™”๋ฉด (tabs/ ๋ฉ”์ธ 5ํƒญ, admin/ ๊ด€๋ฆฌ์ž, auth/ ์ธ์ฆ)
  services/          # Supabase ์ ‘๊ทผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ยท ํ‘ธ์‹œ ยท ์‹ค์‹œ๊ฐ„ ยท ์œ„์น˜
  models/            # ๋„๋ฉ”์ธ ๋ชจ๋ธ
  widgets/           # ๊ณต์šฉ ์œ„์ ฏ (ํ”ผ๋“œ ์นด๋“œ ยท ํƒ€์ผ ยท ์‹œํŠธ)
  motion/            # ์Šคํ”„๋ง ๋ชจ์…˜ ์‹œ์Šคํ…œ (์ „ํ™˜ ยท ์ด‰๊ฐ ํ”ผ๋“œ๋ฐฑ)
  theme/             # ๋ผ์ดํŠธ/๋‹คํฌ ํŒ”๋ ˆํŠธ ยท ํ…Œ๋งˆ
test/                # ์œ„์ ฏ ํ…Œ์ŠคํŠธ

๊ด€๋ จ ์ €์žฅ์†Œ

์ €์žฅ์†Œ ๋‚ด์šฉ
pmdb Supabase ๋ฐฑ์—”๋“œ โ€” DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(์Šคํ‚ค๋งˆยทRLSยทํŠธ๋ฆฌ๊ฑฐยทRPC ์ „์ฒด ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ ํฌํ•จ) ยท Edge Functions
pmlegal ์„œ๋น„์Šค ์ด์šฉ์•ฝ๊ด€ ยท ๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ ยท ์œ„์น˜๊ธฐ๋ฐ˜์„œ๋น„์Šค ์•ฝ๊ด€ (์ •๋ณธ)

์‹คํ–‰

# Flutter stable ์ฑ„๋„ (Dart SDK ^3.12)
flutter pub get
flutter run          # ์—ฐ๊ฒฐ๋œ ๊ธฐ๊ธฐ/์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ

# ๊ฒ€์‚ฌ & ํ…Œ์ŠคํŠธ
flutter analyze
flutter test
  • ์ง€๋„ยทSupabase ๋“ฑ ํด๋ผ์ด์–ธํŠธ ๊ณต๊ฐœ ํ‚ค๋Š” lib/env.dart ์˜ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋™์ž‘ํ•˜๋ฉฐ, --dart-define=SUPABASE_URL=... ๋“ฑ์œผ๋กœ ํ™˜๊ฒฝ๋ณ„ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์†Œ๊ฒ€์ƒ‰(ํ–‰์•ˆ๋ถ€ juso) ํ‚ค๋Š” ์ฟผํ„ฐ ๋‚จ์šฉ ์—ฌ์ง€๊ฐ€ ์žˆ์–ด ๊ธฐ๋ณธ๊ฐ’ ์—†์ด --dart-define=JUSO_API_KEY=... ๋กœ๋งŒ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค โ€” ๋ฏธ์„ค์ • ์‹œ ์ฃผ์†Œ ๊ฒ€์ƒ‰๋งŒ ๋น„ํ™œ์„ฑํ™”๋˜๊ณ (์ˆ˜๋™ ์ž…๋ ฅ ํด๋ฐฑ) ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์€ ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‘ธ์‹œ(FCM/APNs)๋Š” ์‹ค๊ธฐ๊ธฐ + ์„œ๋ช… ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

About

๐Ÿพ PawMate โ€” ๋™๋„ค ๊ธฐ๋ฐ˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฐ์ฑ…ยท๋Œ๋ด„ ๋งค์นญ & ์ปค๋ฎค๋‹ˆํ‹ฐ ์•ฑ (Flutter + Supabase)

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages