Skip to content

EIHRTeam/eihrteam.github.io

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

48 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

็ปˆๆœซๅœฐๅทฅไธšไบบไบ‹้ƒจ้—จๆˆท็ฝ‘็ซ™

ๆŠ€ๆœฏๆžถๆž„

ๆ ธๅฟƒๆŠ€ๆœฏๆ ˆ

็ฑปๅˆซ ๆŠ€ๆœฏ้€‰ๅž‹
่ฟ่กŒ็Žฏๅขƒ Node.js
ๅ‰็ซฏๆก†ๆžถ React 19
ๆž„ๅปบๅทฅๅ…ท Vite
ๅผ€ๅ‘่ฏญ่จ€ TypeScript (ES2022)
ๆ ทๅผๆ–นๆกˆ Tailwind CSS
ๅŠจ็”ปๅผ•ๆ“Ž Framer Motion
ๅ›พๆ ‡ๅบ“ Lucide React
Markdown ๆธฒๆŸ“ react-markdown + remark-gfm + rehype-highlight

็ณป็ปŸๆžถๆž„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      ๅ‰็ซฏๅบ”็”จ                            โ”‚
โ”‚  React SPA + Vite + TypeScript                          โ”‚
โ”‚  ็ซฏๅฃ: 3000                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚ HTTP ่ฏทๆฑ‚ (/api/*)
                      โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      ๅŽ็ซฏๆœๅŠก                            โ”‚
โ”‚  Express.js API Server                                  โ”‚
โ”‚  ็ซฏๅฃ: 3002                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                      โ”‚ ๆ–‡ไปถ่ฏปๅ–
                      โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Markdown ๆ–‡ไปถ                          โ”‚
โ”‚  server/posts/*.md                                      โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

็›ฎๅฝ•็ป“ๆž„

โ”œโ”€โ”€ App.tsx                 # ๅบ”็”จๆ น็ป„ไปถ๏ผŒ็ฎก็†่ทฏ็”ฑไธŽๅ…จๅฑ€็Šถๆ€
โ”œโ”€โ”€ index.tsx               # ๅบ”็”จๅ…ฅๅฃ๏ผŒ่ดŸ่ดฃ DOM ๆŒ‚่ฝฝ
โ”œโ”€โ”€ index.css               # ๅ…จๅฑ€ๆ ทๅผ๏ผŒๅซไปฃ็ ้ซ˜ไบฎไธป้ข˜
โ”œโ”€โ”€ types.ts                # TypeScript ็ฑปๅž‹ๅฎšไน‰
โ”œโ”€โ”€ i18n.ts                 # ๅ›ฝ้™…ๅŒ–้…็ฝฎ
โ”œโ”€โ”€ vite.config.ts          # Vite ๆž„ๅปบ้…็ฝฎ
โ”‚
โ”œโ”€โ”€ components/             # ้€š็”จ็ป„ไปถ
โ”‚   โ”œโ”€โ”€ GlitchElement.tsx   # ๆ•…้šœ่‰บๆœฏ่ง†่ง‰ๆ•ˆๆžœ็ป„ไปถ
โ”‚   โ”œโ”€โ”€ Section.tsx         # ๆ ‡ๅ‡†ๅŒ–ๅธƒๅฑ€ๅฎนๅ™จ
โ”‚   โ”œโ”€โ”€ Navbar.tsx          # ๅฏผ่ˆชๆ 
โ”‚   โ”œโ”€โ”€ Hero.tsx            # ้ฆ–ๅฑๅฑ•็คบๅŒบ
โ”‚   โ”œโ”€โ”€ About.tsx           # ๅ…ณไบŽๆˆ‘ไปฌ
โ”‚   โ”œโ”€โ”€ Projects.tsx        # ้กน็›ฎๅฑ•็คบ
โ”‚   โ”œโ”€โ”€ Blog.tsx            # ๅšๅฎข้ข„่งˆ๏ผˆ้ฆ–้กต๏ผ‰
โ”‚   โ”œโ”€โ”€ Contact.tsx         # ่”็ณปๆ–นๅผ
โ”‚   โ””โ”€โ”€ Footer.tsx          # ้กต่„š
โ”‚
โ”œโ”€โ”€ pages/                  # ้กต้ข็ป„ไปถ
โ”‚   โ”œโ”€โ”€ Home.tsx            # ไธป้กต
โ”‚   โ”œโ”€โ”€ BlogList.tsx        # ๅšๅฎขๅฝ’ๆกฃ้กต
โ”‚   โ””โ”€โ”€ BlogPost.tsx        # ๅšๅฎขๆ–‡็ซ ่ฏฆๆƒ…้กต
โ”‚
โ”œโ”€โ”€ services/               # API ๆœๅŠกๅฑ‚
โ”‚   โ””โ”€โ”€ blog.ts             # ๅšๅฎข API ๅฎขๆˆท็ซฏ
โ”‚
โ”œโ”€โ”€ locales/                # ๅ›ฝ้™…ๅŒ–่ต„ๆบ
โ”‚   โ”œโ”€โ”€ zh.ts               # ไธญๆ–‡่ฏญ่จ€ๅŒ…
โ”‚   โ””โ”€โ”€ en.ts               # ่‹ฑๆ–‡่ฏญ่จ€ๅŒ…
โ”‚
โ””โ”€โ”€ server/                 # ๅŽ็ซฏๆœๅŠก
    โ”œโ”€โ”€ index.js            # Express ๆœๅŠกๅ…ฅๅฃ
    โ”œโ”€โ”€ package.json        # ๅŽ็ซฏไพ่ต–้…็ฝฎ
    โ””โ”€โ”€ posts/              # Markdown ๆ–‡็ซ ๅญ˜ๅ‚จ็›ฎๅฝ•
        โ”œโ”€โ”€ 1.md
        โ””โ”€โ”€ 2.md

ๅšๅฎข็ณป็ปŸ

ๆœฌ้กน็›ฎ้›†ๆˆๅŸบไบŽๆ–‡ไปถ็ณป็ปŸ็š„ๅšๅฎข็ฎก็†ๅŠŸ่ƒฝ๏ผŒ่ฟ็ปดไบบๅ‘˜ๅฏ้€š่ฟ‡ๅœจๆœๅŠกๅ™จๆŒ‡ๅฎš็›ฎๅฝ•ๆ”พ็ฝฎ Markdown ๆ–‡ไปถๅฎž็Žฐๆ–‡็ซ ๅ‘ๅธƒใ€‚

่ฟไฝœๆœบๅˆถ

  1. ๅŽ็ซฏๆœๅŠกๆ‰ซๆๆŒ‡ๅฎš็›ฎๅฝ•ไธ‹็š„ .md ๆ–‡ไปถ
  2. ่งฃๆžๆ–‡ไปถๅคด้ƒจ็š„ YAML Front Matter ๆๅ–ๅ…ƒๆ•ฐๆฎ
  3. ๅ‰็ซฏ้€š่ฟ‡ API ่Žทๅ–ๆ–‡็ซ ๅˆ—่กจๅŠๅ†…ๅฎน
  4. ไฝฟ็”จ react-markdown ๆธฒๆŸ“ Markdown ๅ†…ๅฎน๏ผŒๆ”ฏๆŒ่ฏญๆณ•้ซ˜ไบฎ

ๆ–‡็ซ ๆ ผๅผ่ง„่Œƒ

ๆ–‡็ซ ้กป้ตๅพชไปฅไธ‹ๆ ผๅผ๏ผš

---
title: ๆ–‡็ซ ๆ ‡้ข˜
date: 2026-01-25
tags: [ๆ ‡็ญพ1, ๆ ‡็ญพ2]
---

# ๆญฃๆ–‡ๅ†…ๅฎน

ๆญคๅค„็ผ–ๅ†™ Markdown ๆ ผๅผ็š„ๆญฃๆ–‡ๅ†…ๅฎนใ€‚

Front Matter ๅญ—ๆฎต่ฏดๆ˜Ž๏ผš

ๅญ—ๆฎต ็ฑปๅž‹ ๅฟ…ๅกซ ่ฏดๆ˜Ž
title string ๆ˜ฏ ๆ–‡็ซ ๆ ‡้ข˜๏ผŒ็”จไบŽๅˆ—่กจๅŠ่ฏฆๆƒ…้กตๅฑ•็คบ
date string ๆ˜ฏ ๅ‘ๅธƒๆ—ฅๆœŸ๏ผŒๆ ผๅผไธบ YYYY-MM-DD๏ผŒ็”จไบŽๆŽ’ๅบ
tags array ๅฆ ๆ–‡็ซ ๆ ‡็ญพ๏ผŒ็”จไบŽๅˆ†็ฑปๅฑ•็คบ
excerpt string ๅฆ ่‡ชๅฎšไน‰ๆ‘˜่ฆ๏ผŒ้ป˜่ฎคๅ–ๆญฃๆ–‡ๅ‰ 150 ๅญ—็ฌฆ

ๆ”ฏๆŒ็š„ Markdown ่ฏญๆณ•

ๅŠŸ่ƒฝ ่ฏดๆ˜Ž
ๆ ‡้ข˜ ๆ”ฏๆŒ H1-H6 ๅคš็บงๆ ‡้ข˜
ๆ–‡ๆœฌๆ ผๅผ ็ฒ—ไฝ“ใ€ๆ–œไฝ“ใ€ๅˆ ้™ค็บฟ
ๅˆ—่กจ ๆœ‰ๅบๅˆ—่กจใ€ๆ— ๅบๅˆ—่กจใ€ไปปๅŠกๅˆ—่กจ๏ผˆๅธฆๅค้€‰ๆก†๏ผ‰
ไปฃ็  ่กŒๅ†…ไปฃ็ ใ€ไปฃ็ ๅ—๏ผˆๆ”ฏๆŒ่ฏญๆณ•้ซ˜ไบฎ๏ผ‰
่กจๆ ผ GFM ้ฃŽๆ ผ่กจๆ ผ
้“พๆŽฅไธŽๅ›พ็‰‡ ๆ ‡ๅ‡† Markdown ่ฏญๆณ•
ๅผ•็”จ ๅ—ๅผ•็”จ
ๅˆ†้š”็บฟ ๆฐดๅนณๅˆ†้š”็บฟ

่ฎฟ้—ฎ่ง„ๅˆ™

ๆ–‡็ซ  URL ไปฅๆ–‡ไปถๅ๏ผˆไธๅซๆ‰ฉๅฑ•ๅ๏ผ‰ไฝœไธบๆ ‡่ฏ†็ฌฆ๏ผš

ๆ–‡ไปถ่ทฏๅพ„ ่ฎฟ้—ฎ URL
server/posts/1.md /blog/1
server/posts/guide.md /blog/guide
server/posts/2026-01-news.md /blog/2026-01-news

็Žฏๅขƒ้…็ฝฎ

ๆ–‡็ซ ๅญ˜ๅ‚จ็›ฎๅฝ•ๅฏ้€š่ฟ‡็Žฏๅขƒๅ˜้‡ POSTS_DIR ่‡ชๅฎšไน‰๏ผš

POSTS_DIR=/var/www/blog/posts node server/index.js

่‹ฅๆœช่ฎพ็ฝฎ่ฏฅๅ˜้‡๏ผŒ้ป˜่ฎคไฝฟ็”จ server/posts/ ็›ฎๅฝ•ใ€‚

ๅผ€ๅ‘ๆŒ‡ๅ—

็Žฏๅขƒ่ฆๆฑ‚

  • Node.js 18.0 ๆˆ–ๆ›ด้ซ˜็‰ˆๆœฌ๏ผˆๆŽจ่ไฝฟ็”จ LTS ็‰ˆๆœฌ๏ผ‰
  • npm ๆˆ– yarn ๅŒ…็ฎก็†ๅ™จ

ๅฎ‰่ฃ…ไพ่ต–

# ๅฎ‰่ฃ…ๅ‰็ซฏไพ่ต–
npm install

# ๅฎ‰่ฃ…ๅŽ็ซฏไพ่ต–
cd server && npm install

ๅฏๅŠจๅผ€ๅ‘็Žฏๅขƒ

้œ€ๅŒๆ—ถๅฏๅŠจๅ‰็ซฏๅผ€ๅ‘ๆœๅŠกๅ™จไธŽๅŽ็ซฏ API ๆœๅŠก๏ผš

# ็ปˆ็ซฏ 1๏ผšๅฏๅŠจๅŽ็ซฏๆœๅŠก๏ผˆ็ซฏๅฃ 3002๏ผ‰
cd server && npm run dev

# ็ปˆ็ซฏ 2๏ผšๅฏๅŠจๅ‰็ซฏๆœๅŠก๏ผˆ็ซฏๅฃ 3000๏ผ‰
npm run dev

ๅฏๅŠจๅฎŒๆˆๅŽ๏ผŒ่ฎฟ้—ฎ http://localhost:3000 ๅณๅฏ้ข„่งˆ็ฝ‘็ซ™ใ€‚

็”Ÿไบงๆž„ๅปบ

ๆ‰ง่กŒไปฅไธ‹ๅ‘ฝไปค็”Ÿๆˆไผ˜ๅŒ–ๅŽ็š„้™ๆ€่ต„ๆบ๏ผš

npm run build

ๆž„ๅปบไบง็‰ฉ่พ“ๅ‡บ่‡ณ dist ็›ฎๅฝ•ใ€‚

ๆœฌๅœฐ้ข„่งˆ

้ข„่งˆ็”Ÿไบงๆž„ๅปบ็ป“ๆžœ๏ผš

npm run preview

API ๆŽฅๅฃๆ–‡ๆกฃ

ๅŽ็ซฏๆœๅŠกๆไพ›ไปฅไธ‹ RESTful API ๆŽฅๅฃ๏ผš

่Žทๅ–ๆ–‡็ซ ๅˆ—่กจ

่ฏทๆฑ‚

GET /api/posts

ๅ“ๅบ”

{
  "posts": [
    {
      "id": "1",
      "title": "ๆ–‡็ซ ๆ ‡้ข˜",
      "date": "2026.01.25",
      "excerpt": "ๆ–‡็ซ ๆ‘˜่ฆ๏ผŒๅ–ๆญฃๆ–‡ๅ‰ 150 ๅญ—็ฌฆ...",
      "tags": ["ๆ ‡็ญพ1", "ๆ ‡็ญพ2"]
    }
  ]
}

ๆ–‡็ซ ๆŒ‰ๅ‘ๅธƒๆ—ฅๆœŸ้™ๅบๆŽ’ๅˆ—ใ€‚

่Žทๅ–ๅ•็ฏ‡ๆ–‡็ซ 

่ฏทๆฑ‚

GET /api/posts/:id

ๅ“ๅบ”

{
  "id": "1",
  "title": "ๆ–‡็ซ ๆ ‡้ข˜",
  "date": "2026.01.25",
  "content": "Markdown ๆ ผๅผ็š„ๅฎŒๆ•ดๆญฃๆ–‡ๅ†…ๅฎน...",
  "tags": ["ๆ ‡็ญพ1", "ๆ ‡็ญพ2"]
}

้”™่ฏฏๅ“ๅบ”

{
  "error": "Post not found"
}

็Šถๆ€็ ๏ผš404

ๆž„ๅปบ้…็ฝฎ

้กน็›ฎ้…็ฝฎๆ–‡ไปถ vite.config.ts ๅŒ…ๅซไปฅไธ‹ๅ…ณ้”ฎ้…็ฝฎ๏ผš

  • ่ทฏๅพ„ๅˆซๅ๏ผš@ ๆŒ‡ๅ‘้กน็›ฎๆ น็›ฎๅฝ•
  • ๅผ€ๅ‘ๆœๅŠกๅ™จ๏ผš็ซฏๅฃ 3000๏ผŒๅฏ็”จ host ไปฅๆ”ฏๆŒๅฑ€ๅŸŸ็ฝ‘่ฎฟ้—ฎ
  • API ไปฃ็†๏ผšๅผ€ๅ‘็Žฏๅขƒไธ‹ /api ่ฏทๆฑ‚ไปฃ็†่‡ณๅŽ็ซฏๆœๅŠก http://localhost:3002

็‰ˆๆƒๅฃฐๆ˜Ž

ๆœฌ้กน็›ฎไธบไธ“ๆœ‰่ฝฏไปถ๏ผŒ็‰ˆๆƒๅฝ’็ปˆๆœซๅœฐๅทฅไธšไบบไบ‹้ƒจๆ‰€ๆœ‰ใ€‚ๆœช็ปๆŽˆๆƒ๏ผŒ็ฆๆญขๅคๅˆถใ€ไฟฎๆ”นๆˆ–ๅˆ†ๅ‘ใ€‚

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors