Skip to content

A lightweight, self-hosted trip expense splitting and photo gallery application designed for group trips

License

Notifications You must be signed in to change notification settings

quake0day/MemoTrip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

9 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

MemoTrip - ๆ—…่กŒ่ดน็”จๅˆ†ๆ‘ŠไธŽ็…ง็‰‡ๅˆ†ไบซๅนณๅฐ

MemoTrip Next.js TypeScript PostgreSQL Docker

ไธ€ไธช่ฝป้‡็บงใ€ๅฏ่‡ชๆ‰˜็ฎก็š„ๆ—…่กŒ่ดน็”จๅˆ†ๆ‘Šๅ’Œ็…ง็‰‡ๅˆ†ไบซๅบ”็”จ๏ผŒไธ“ไธบๅ›ข้˜Ÿๆ—…่กŒ่ฎพ่ฎกใ€‚

ๅŠŸ่ƒฝ็‰นๆ€ง โ€ข ๅฟซ้€Ÿๅผ€ๅง‹ โ€ข ๆŠ€ๆœฏๆžถๆž„ โ€ข APIๆ–‡ๆกฃ โ€ข ๅผ€ๅ‘ๆŒ‡ๅ—


๐Ÿ“– ้กน็›ฎ็ฎ€ไป‹

MemoTrip ๆ˜ฏไธ€ไธช็ŽฐไปฃๅŒ–็š„ๆ—…่กŒ่ดน็”จ็ฎก็†ๅ’Œ็…ง็‰‡ๅˆ†ไบซๅนณๅฐ๏ผŒๆ—จๅœจ็ฎ€ๅŒ–ๅคšไบบๆ—…่กŒไธญ็š„่ดน็”จๅˆ†ๆ‘Šๅ’Œๅ›žๅฟ†ๅˆ†ไบซใ€‚้€š่ฟ‡ๆ™บ่ƒฝ็š„ๆƒ้‡็ฎ—ๆณ•ๅ’Œ็›ด่ง‚็š„็”จๆˆท็•Œ้ข๏ผŒ่ฎฉๆ—…่กŒ่ดน็”จ็ป“็ฎ—ๅ˜ๅพ—็ฎ€ๅ•้€ๆ˜Žใ€‚

ๆ ธๅฟƒไบฎ็‚น

  • ๐Ÿ  ๅฎถๅบญๆƒ้‡็ณป็ปŸ - ๆ”ฏๆŒๆˆไบบ/ๅ„ฟ็ซฅไธๅŒๆƒ้‡้…็ฝฎ๏ผˆ1.0/0.5๏ผ‰
  • ๐Ÿ’ฐ ๆ™บ่ƒฝ็ป“็ฎ—็ฎ—ๆณ• - ่‡ชๅŠจ่ฎก็ฎ—่ดน็”จๅˆ†ๆ‘Šๅนถ็”Ÿๆˆๆœ€ๅฐ‘่ฝฌ่ดฆๆ–นๆกˆ
  • ๐Ÿ“ธ ็…ง็‰‡็”ปๅปŠ - ้›†ไธญ็ฎก็†ๅ’Œๅˆ†ไบซๆ—…่กŒ็…ง็‰‡
  • ๐ŸŒ ๅคšๅธ็งๆ”ฏๆŒ - USD, EUR, GBP, JPY, CNY
  • ๐Ÿ”’ ๆ•ฐๆฎๅฎ‰ๅ…จ - ๆœฌๅœฐ้ƒจ็ฝฒ๏ผŒๅฎŒๅ…จๆŽŒๆŽงๆ‚จ็š„ๆ•ฐๆฎ
  • ๐ŸŒ™ ๆทฑ่‰ฒๆจกๅผ - ๅฎŒๆ•ด็š„ๆ˜Žๆš—ไธป้ข˜ๆ”ฏๆŒ
  • ๐Ÿ“ฑ ๅ“ๅบ”ๅผ่ฎพ่ฎก - ๅฎŒ็พŽ้€‚้…ๆ‰‹ๆœบใ€ๅนณๆฟใ€ๆกŒ้ข
  • ๐Ÿณ ไธ€้”ฎ้ƒจ็ฝฒ - Docker Composeๅฟซ้€ŸๅฏๅŠจ

โœจ ๅŠŸ่ƒฝ็‰นๆ€ง

ๅทฒๅฎž็ŽฐๅŠŸ่ƒฝ

๐Ÿ‘ค ็”จๆˆท็ฎก็†

  • โœ… ้‚ฎ็ฎฑๅฏ†็ ๆณจๅ†Œ/็™ปๅฝ•
  • โœ… ่‡ชๅŠจๅˆ›ๅปบ้ป˜่ฎคๅฎถๅบญ
  • โœ… ็”จๆˆทไธชไบบไฟกๆฏ็ฎก็†

๐ŸŽ’ ๆ—…่กŒ็ฎก็†

  • โœ… ๅˆ›ๅปบๆ—…่กŒ๏ผˆๆ”ฏๆŒๅคšๅธ็ง๏ผ‰
  • โœ… ๆ—…่กŒๅˆ—่กจๆŸฅ็œ‹
  • โœ… ๆ—…่กŒ่ฏฆๆƒ…๏ผˆๆ”ถๆฎ/็ป“็ฎ—/็…ง็‰‡/ๅ‚ไธŽ่€…๏ผ‰
  • โœ… ่‡ชๅŠจๆทปๅŠ ๅˆ›ๅปบ่€…ไธบ้ฆ–ไฝๅ‚ไธŽ่€…

๐Ÿ  ๅฎถๅบญไธŽๅ‚ไธŽ่€…

  • โœ… ๅˆ›ๅปบๅ’Œ็ฎก็†ๅฎถๅบญ
  • โœ… ๆทปๅŠ /็งป้™คๆ—…่กŒๅ‚ไธŽ่€…
  • โœ… ้…็ฝฎๆˆๅ‘˜ๆƒ้‡๏ผˆๆˆไบบ=1.0๏ผŒๅ„ฟ็ซฅ=0.5๏ผ‰
  • โœ… ๆŸฅ็œ‹ๅฎถๅบญๆˆๅ‘˜่ฏฆๆƒ…

๐Ÿงพ ๆ”ถๆฎ็ฎก็†

  • โœ… ไธŠไผ ๆ”ถๆฎๅ›พ็‰‡
  • โœ… ๆ”ถๆฎ็Šถๆ€่ทŸ่ธช
  • โœ… ๆ”ถๆฎ้ข„่งˆๅ’Œๅ…จๅฑๆŸฅ็œ‹
  • โœ… ๆ”ถๆฎๅˆ—่กจ็ฎก็†

๐Ÿ“ท ็…ง็‰‡็”ปๅปŠ

  • โœ… ไธŠไผ ็…ง็‰‡
  • โœ… ็ฝ‘ๆ ผๅฑ•็คบ
  • โœ… ็…ง็‰‡้ข„่งˆ
  • โœ… ๆ˜พ็คบไธŠไผ ่€…ๅ’Œๆ—ฅๆœŸ

๐Ÿ’ต ่ดน็”จ็ป“็ฎ—

  • โœ… ๅŸบไบŽๆƒ้‡็š„ๆ™บ่ƒฝๅˆ†ๆ‘Š็ฎ—ๆณ•
  • โœ… ไธ€้”ฎ้‡ๆ–ฐ่ฎก็ฎ—็ป“็ฎ—
  • โœ… ็”Ÿๆˆๆœ€ๅฐ‘่ฝฌ่ดฆๆ–นๆกˆ
  • โœ… ็ป“็ฎ—ๅކๅฒ็‰ˆๆœฌ็ฎก็†
  • โœ… HTMLๅฏผๅ‡บๆจกๆฟ

่ฎกๅˆ’ๅŠŸ่ƒฝ

  • ๐Ÿค– OpenAI Vision API ๆ”ถๆฎ่‡ชๅŠจ่งฃๆž
  • ๐Ÿ“ค PNG/PDFๆ ผๅผๅฏผๅ‡บ็ป“็ฎ—่กจ
  • ๐Ÿ”— ้‚€่ฏท็ ็ณป็ปŸ
  • ๐Ÿ–ผ๏ธ EXIFๅ…ƒๆ•ฐๆฎๆๅ–
  • ๐Ÿ“ฆ ็…ง็‰‡ๆ‰น้‡ไธ‹่ฝฝZIP

๐Ÿš€ ๅฟซ้€Ÿๅผ€ๅง‹

ๅ‰็ฝฎ่ฆๆฑ‚

  • Docker 20.10+
  • Docker Compose 2.0+
  • 8GB+ ๅฏ็”จ็ฃ็›˜็ฉบ้—ด

ไธ€้”ฎ้ƒจ็ฝฒ

# 1. ๅ…‹้š†ไป“ๅบ“
git clone https://github.com/yourusername/MemoTrip.git
cd MemoTrip

# 2. ้…็ฝฎ็Žฏๅขƒๅ˜้‡๏ผˆๅฏ้€‰๏ผ‰
cp .env.example .env
# ็ผ–่พ‘ .env ๆ–‡ไปถ๏ผŒๆทปๅŠ  OpenAI API Key๏ผˆๅฆ‚้œ€AI่งฃๆžๅŠŸ่ƒฝ๏ผ‰

# 3. ๅฏๅŠจๆ‰€ๆœ‰ๆœๅŠก
docker compose up -d

# 4. ็ญ‰ๅพ…ๆœๅŠกๅฐฑ็ปช๏ผˆ็บฆ30็ง’๏ผ‰
docker compose logs -f web

# 5. ่ฎฟ้—ฎๅบ”็”จ
# ๆ‰“ๅผ€ๆต่งˆๅ™จ่ฎฟ้—ฎ: http://localhost:3001

้ฆ–ๆฌกไฝฟ็”จ

  1. ๆณจๅ†Œ่ดฆๆˆท - ่ฎฟ้—ฎ http://localhost:3001/register
  2. ๅˆ›ๅปบๆ—…่กŒ - ็™ปๅฝ•ๅŽๅœจไปช่กจๆฟ็‚นๅ‡ป "New Trip"
  3. ๆทปๅŠ ๅ‚ไธŽ่€… - ๅœจๆ—…่กŒ่ฏฆๆƒ…้กตๆทปๅŠ ๅ…ถไป–ๅฎถๅบญ
  4. ไธŠไผ ๆ”ถๆฎ - ็‚นๅ‡ป "Upload Receipt" ไธŠไผ ่ดน็”จๅ‡ญ่ฏ
  5. ่ฎก็ฎ—็ป“็ฎ— - ็‚นๅ‡ป "Recalculate Settlement" ็”Ÿๆˆๅˆ†ๆ‘Šๆ–นๆกˆ

๐Ÿ—๏ธ ๆŠ€ๆœฏๆžถๆž„

ๆŠ€ๆœฏๆ ˆ

  • ๅ‰ๅŽ็ซฏ: Next.js 15 (App Router) + React 18 + TypeScript
  • ๆ•ฐๆฎๅบ“: PostgreSQL 16 + Prisma ORM
  • ็ผ“ๅญ˜: Redis 7
  • ๆ ทๅผ: Tailwind CSS 3
  • ้ƒจ็ฝฒ: Docker + Docker Compose
  • ๆ–‡ไปถๅญ˜ๅ‚จ: ๆœฌๅœฐๆ–‡ไปถ็ณป็ปŸๅท

็ณป็ปŸๆžถๆž„ๅ›พ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Browser/Client                   โ”‚
โ”‚      (React + Tailwind CSS)              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                 โ”‚ HTTP/HTTPS
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚         Next.js Server                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚  โ”‚  Pages   โ”‚  โ”‚   API   โ”‚  โ”‚  Files  โ”‚โ”‚
โ”‚  โ”‚ (SSR/CSR)โ”‚  โ”‚  Routes โ”‚  โ”‚  Server โ”‚โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜
     โ”‚              โ”‚                โ”‚
     โ–ผ              โ–ผ                โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚PostgreSQLโ”‚  โ”‚  Redis   โ”‚  โ”‚File Storage  โ”‚
โ”‚Database  โ”‚  โ”‚  Cache   โ”‚  โ”‚   Volumes    โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๐Ÿ“ก API ๆ–‡ๆกฃ

่ฎค่ฏ็›ธๅ…ณ

ๆณจๅ†Œ็”จๆˆท

POST /api/auth/register
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "password123",
  "name": "John Doe"
}

็”จๆˆท็™ปๅฝ•

POST /api/auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "password123"
}

ๆ—…่กŒ็ฎก็†

ๅˆ›ๅปบๆ—…่กŒ

POST /api/trips
Content-Type: application/json

{
  "name": "Japan 2024",
  "currency": "JPY",
  "userId": "cuid..."
}

่Žทๅ–ๆ—…่กŒๅˆ—่กจ

GET /api/trips?userId=cuid...

ๅ…ถไป–็ซฏ็‚น

  • POST /api/trips/:tripId/participants - ๆทปๅŠ ๅ‚ไธŽ่€…
  • POST /api/trips/:tripId/receipts - ไธŠไผ ๆ”ถๆฎ
  • POST /api/trips/:tripId/photos - ไธŠไผ ็…ง็‰‡
  • POST /api/trips/:tripId/settlements/recompute - ้‡ๆ–ฐ่ฎก็ฎ—็ป“็ฎ—
  • GET /api/files/:...path - ่Žทๅ–ๆ–‡ไปถ

่ฏฆ็ป†APIๆ–‡ๆกฃ่ฏทๆŸฅ็œ‹้กน็›ฎWikiใ€‚


๐Ÿ’ป ๅผ€ๅ‘ๆŒ‡ๅ—

ๆœฌๅœฐๅผ€ๅ‘็Žฏๅขƒ

# ๅฎ‰่ฃ…ไพ่ต–
cd app
npm install

# ้…็ฝฎๆ•ฐๆฎๅบ“
cp .env.example .env

# ่ฟ่กŒๆ•ฐๆฎๅบ“่ฟ็งป
npx prisma migrate dev

# ๅฏๅŠจๅผ€ๅ‘ๆœๅŠกๅ™จ
npm run dev

ๆ•ฐๆฎๅบ“ๆ“ไฝœ

# ๅˆ›ๅปบๆ–ฐ่ฟ็งป
npx prisma migrate dev --name add_new_feature

# ๆ‰“ๅผ€ Prisma Studio
npx prisma studio

# ็”Ÿๆˆ Prisma Client
npx prisma generate

Docker ๅผ€ๅ‘

# ๆž„ๅปบๅนถๅฏๅŠจ
docker compose up -d --build

# ๆŸฅ็œ‹ๆ—ฅๅฟ—
docker compose logs -f web

# ๅœๆญขๆœๅŠก
docker compose down

๐Ÿ”ง ้…็ฝฎ่ฏดๆ˜Ž

็Žฏๅขƒๅ˜้‡

ๅˆ›ๅปบ .env ๆ–‡ไปถ๏ผš

# ๆ•ฐๆฎๅบ“่ฟžๆŽฅ
DATABASE_URL=postgresql://trip:trip@db:5432/trip

# OpenAI API๏ผˆๅฏ้€‰๏ผ‰
OPENAI_API_KEY=sk-...

# ๅบ”็”จ้…็ฝฎ
PORT=3000
NODE_ENV=production

๐ŸŽฏ ไฝฟ็”จๅœบๆ™ฏ

ๅฎถๅบญๆ—…่กŒ - ๅคšไธชๅฎถๅบญไธ€่ตทๅ‡บๆธธ๏ผŒไฝฟ็”จๆƒ้‡็ณป็ปŸ๏ผˆๆˆไบบ=1.0๏ผŒๅ„ฟ็ซฅ=0.5๏ผ‰ๅ…ฌๅนณๅˆ†ๆ‘Š่ดน็”จใ€‚

ๆœ‹ๅ‹่šไผš - ๆœ‹ๅ‹AAๅˆถๆ—…่กŒ๏ผŒๆฏไบบๅˆ›ๅปบ่‡ชๅทฑ็š„ๅฎถๅบญ๏ผŒๅนณๅ‡ๅˆ†ๆ‘Šๆ‰€ๆœ‰่ดน็”จใ€‚

ๅ…ฌๅธๅ›ขๅปบ - ๅ…ฌๅธ็ป„็ป‡ๅ›ขๅปบๆดปๅŠจ๏ผŒ่ดขๅŠกไบบๅ‘˜็ฎก็†ๆ‰€ๆœ‰ๆ”ถๆฎ๏ผŒ่‡ชๅŠจ็”Ÿๆˆ่ดน็”จๆŠฅ่กจใ€‚


๐Ÿค ่ดก็ŒฎๆŒ‡ๅ—

ๆฌข่ฟŽไปปไฝ•ๅฝขๅผ็š„่ดก็Œฎ๏ผ

  1. Fork ๆœฌไป“ๅบ“
  2. ๅˆ›ๅปบๅŠŸ่ƒฝๅˆ†ๆ”ฏ (git checkout -b feature/AmazingFeature)
  3. ๆไบคๆ›ดๆ”น (git commit -m 'Add some AmazingFeature')
  4. ๆŽจ้€ๅˆฐๅˆ†ๆ”ฏ (git push origin feature/AmazingFeature)
  5. ๅผ€ๅฏ Pull Request

๐Ÿ“œ ๅผ€ๆบๅ่ฎฎ

ๆœฌ้กน็›ฎ้‡‡็”จ MIT License ๅผ€ๆบๅ่ฎฎใ€‚


๐Ÿ™ ่‡ด่ฐข


โฌ† ๅ›žๅˆฐ้กถ้ƒจ

Made with โค๏ธ by MemoTrip Team

About

A lightweight, self-hosted trip expense splitting and photo gallery application designed for group trips

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages