HaloLight ๅๅฐ็ฎก็็ณป็ป็ Go ้ซๆง่ฝๅ็ซฏ API ๆๅก๏ผๅบไบ Gin + GORM ๆๅปบ็ RESTful APIใ
- API ๆๆกฃ: https://api-go.halolight.h7ml.cn
- GitHub: https://github.com/halolight/halolight-api-go
- Gin Web Framework - ้ซๆง่ฝ HTTP ๆกๆถ
- GORM - ๅผบๅคง็ ORM ๅบ
- JWT ่ฎค่ฏ - ๅบไบไปค็็่บซไปฝ้ช่ฏ
- PostgreSQL - ็ไบง็บงๆฐๆฎๅบ
- RESTful API - ๆ ๅ็ REST ๆฅๅฃ่ฎพ่ฎก
- Docker ๆฏๆ - ๅฎนๅจๅ้จ็ฝฒ
- ๅฎๅ็้่ฏฏๅค็ - ็ปไธ็้่ฏฏๅๅบๆ ผๅผ
- ่พๅ ฅ้ช่ฏ - ๅบไบ Gin binding ็่ชๅจ้ช่ฏ
- Go 1.21+
- Gin 1.10 - Web ๆกๆถ
- GORM 1.25 - ORM
- PostgreSQL 15+ - ๆฐๆฎๅบ
- JWT (golang-jwt/jwt/v5) - ่ฎค่ฏ
- bcrypt - ๅฏ็ ๅๅธ
- Go 1.21 ๆๆด้ซ็ๆฌ
- PostgreSQL 15+
- Docker (ๅฏ้)
# ๅ
้ไปๅบ
git clone https://github.com/halolight/halolight-api-go.git
cd halolight-api-go
# ๅฎ่ฃ
ไพ่ต
go mod tidy
# ๅคๅถ็ฏๅขๅ้ๆไปถ
cp .env.example .env
# ็ผ่พ .env ๆไปถ๏ผ้
็ฝฎๆฐๆฎๅบ่ฟๆฅ็ญไฟกๆฏ
# vim .env
# ๅฏๅจๅผๅๆๅกๅจ
make dev
# ๆ็ดๆฅ่ฟ่ก
go run ./cmd/server# ๅฏๅจๆๆๆๅก๏ผAPI + PostgreSQL๏ผ
make docker-up
# ๆฅ็ๆฅๅฟ
make docker-logs
# ๅๆญขๆๅก
make docker-downmake dev # ๅฏๅจๅผๅๆๅกๅจ
make build # ็ผ่ฏไบ่ฟๅถๆไปถ
make run # ็ผ่ฏๅนถ่ฟ่ก
make test # ่ฟ่กๆต่ฏ
make test-coverage # ่ฟ่กๆต่ฏๅนถ็ๆ่ฆ็็ๆฅๅ
make lint # ่ฟ่กไปฃ็ ๆฃๆฅ
make tidy # ๆด็ Go ๆจกๅไพ่ต
make docker-build # ๆๅปบ Docker ้ๅ
make docker-up # ๅฏๅจ Docker ๅฎนๅจ
make docker-down # ๅๆญข Docker ๅฎนๅจ
make docker-logs # ๆฅ็ Docker ๆฅๅฟ
make clean # ๆธ
็ๆๅปบไบง็ฉ
make help # ๆพ็คบๅธฎๅฉไฟกๆฏhalolight-api-go/
โโโ cmd/
โ โโโ server/
โ โโโ main.go # ๅบ็จๅ
ฅๅฃ
โโโ internal/
โ โโโ handlers/ # HTTP ๅค็ๅจ
โ โ โโโ auth_handler.go # ่ฎค่ฏๅค็ๅจ
โ โ โโโ user_handler.go # ็จๆทๅค็ๅจ
โ โโโ models/ # ๆฐๆฎๆจกๅ
โ โ โโโ user.go # ็จๆทๆจกๅ
โ โโโ services/ # ไธๅก้ป่พๅฑ
โ โ โโโ auth_service.go # ่ฎค่ฏๆๅก
โ โ โโโ user_service.go # ็จๆทๆๅก
โ โโโ middleware/ # ไธญ้ดไปถ
โ โ โโโ auth.go # JWT ่ฎค่ฏไธญ้ดไปถ
โ โ โโโ cors.go # CORS ไธญ้ดไปถ
โ โโโ repository/ # ๆฐๆฎ่ฎฟ้ฎๅฑ
โ โ โโโ user_repository.go # ็จๆทๆฐๆฎไปๅบ
โ โโโ routes/ # ่ทฏ็ฑๅฎไน
โ โโโ router.go # ่ทฏ็ฑ้
็ฝฎ
โโโ pkg/
โ โโโ config/ # ้
็ฝฎ็ฎก็
โ โ โโโ config.go
โ โโโ database/ # ๆฐๆฎๅบ่ฟๆฅ
โ โ โโโ database.go
โ โโโ utils/ # ๅทฅๅ
ทๅฝๆฐ
โ โโโ jwt.go # JWT ๅทฅๅ
ท
โ โโโ hash.go # ๅฏ็ ๅๅธๅทฅๅ
ท
โโโ .env.example # ็ฏๅขๅ้็คบไพ
โโโ .gitignore
โโโ Dockerfile # Docker ้
็ฝฎ
โโโ docker-compose.yml # Docker Compose ้
็ฝฎ
โโโ Makefile # Make ๅฝไปค
โโโ go.mod # Go ๆจกๅๅฎไน
โโโ README.md
| ๆนๆณ | ่ทฏๅพ | ๆ่ฟฐ |
|---|---|---|
| POST | /api/auth/register |
็จๆทๆณจๅ |
| POST | /api/auth/login |
็จๆท็ปๅฝ |
| ๆนๆณ | ่ทฏๅพ | ๆ่ฟฐ |
|---|---|---|
| GET | /api/users |
่ทๅ็จๆทๅ่กจ๏ผๅ้กต๏ผ |
| GET | /api/users/:id |
่ทๅๅไธช็จๆท |
| POST | /api/users |
ๅๅปบๆฐ็จๆท |
| PUT | /api/users/:id |
ๆดๆฐ็จๆทไฟกๆฏ |
| DELETE | /api/users/:id |
ๅ ้ค็จๆท |
| ๆนๆณ | ่ทฏๅพ | ๆ่ฟฐ |
|---|---|---|
| GET | /health |
ๅฅๅบทๆฃๆฅ |
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"username": "johndoe",
"password": "password123"
}'curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "password123"
}'curl -X GET http://localhost:8080/api/users?page=1&page_size=20 \
-H "Authorization: Bearer YOUR_JWT_TOKEN"| ๅ้ๅ | ่ฏดๆ | ้ป่ฎคๅผ |
|---|---|---|
APP_ENV |
ๅบ็จ็ฏๅข | development |
APP_PORT |
ๆๅก็ซฏๅฃ | 8080 |
JWT_SECRET |
JWT ๅฏ้ฅ | change-me-in-production |
JWT_EXPIRE_MINUTES |
JWT ่ฟๆๆถ้ด๏ผๅ้๏ผ | 60 |
DB_HOST |
ๆฐๆฎๅบไธปๆบ | localhost |
DB_PORT |
ๆฐๆฎๅบ็ซฏๅฃ | 5432 |
DB_USER |
ๆฐๆฎๅบ็จๆท | postgres |
DB_PASSWORD |
ๆฐๆฎๅบๅฏ็ | postgres |
DB_NAME |
ๆฐๆฎๅบๅ็งฐ | halolight |
DB_SSLMODE |
SSL ๆจกๅผ | disable |
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP Handlers โ โ ่ฏทๆฑๅ
ฅๅฃ๏ผๅๆฐ้ช่ฏ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Services โ โ ไธๅก้ป่พ๏ผไบๅก็ฎก็
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Repository โ โ ๆฐๆฎ่ฎฟ้ฎ๏ผCRUD ๆไฝ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Database (GORM) โ โ PostgreSQL
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- ็จๆท็ปๅฝ โ ้ช่ฏๅญๆฎ
- ็ๆ JWT token๏ผๅ ๅซ user_id๏ผ
- ๅฎขๆท็ซฏๅจๅ็ปญ่ฏทๆฑไธญๆบๅธฆ token
- AuthMiddleware ้ช่ฏ token
- ไป token ๆๅ user_id ๅนถๆณจๅ ฅๅฐ context
- ไธๅก้ป่พๅฏ้่ฟ context ่ทๅๅฝๅ็จๆท
- ๅฎไนๆจกๅ (
internal/models/) - ๅๅปบ Repository (
internal/repository/) - ๅฎ็ฐ Service (
internal/services/) - ๆทปๅ Handler (
internal/handlers/) - ๆณจๅ่ทฏ็ฑ (
internal/routes/router.go)
# ่ฟ่กๆๆๆต่ฏ
make test
# ่ฟ่กๆต่ฏๅนถ็ๆ่ฆ็็ๆฅๅ
make test-coverage
# ๆฅ็่ฆ็็ๆฅๅ๏ผไผๅจๆต่งๅจๆๅผ๏ผ
open coverage.html# ๆ ผๅผๅไปฃ็
go fmt ./...
# ่ฟ่ก linter๏ผ้่ฆๅฎ่ฃ
golangci-lint๏ผ
make lint# ๆๅปบ้ๅ
make docker-build
# ไฝฟ็จ docker-compose ๅฏๅจ
make docker-up# ็ผ่ฏ็ไบง็ๆฌ
make build
# ่ฟ่กไบ่ฟๅถ
./bin/halolight-api็ไบง็ฏๅขๅปบ่ฎฎ้่ฟ็ณป็ป็ฏๅขๅ้ๆ้
็ฝฎ็ฎก็ๅทฅๅ
ท๏ผๅฆ Kubernetes ConfigMap/Secret๏ผๆณจๅ
ฅ้
็ฝฎ๏ผ่ไธๆฏไฝฟ็จ .env ๆไปถใ
- โ ๅฏ็ ไฝฟ็จ bcrypt ๅๅธ๏ผcost=10๏ผ
- โ JWT ็ญพๅ้ช่ฏ๏ผHS256๏ผ
- โ CORS ไธญ้ดไปถ้ ็ฝฎ
- โ ่พๅ ฅ้ช่ฏ๏ผGin binding๏ผ
- โ SQL ๆณจๅ ฅ้ฒๆค๏ผGORM ๅๆฐๅๆฅ่ฏข๏ผ
- โ ้่ฏฏไฟกๆฏไธๆณ้ฒๆๆๆฐๆฎ
โ ๏ธ ็ไบง็ฏๅขๅกๅฟ ไฟฎๆนJWT_SECRETโ ๏ธ ็ไบง็ฏๅขๅปบ่ฎฎไฝฟ็จ HTTPSโ ๏ธ ่่ๆทปๅ ้็้ๅถไธญ้ดไปถ
- ๅนถๅๅค็: Gin ๅบไบ goroutine๏ผๆฏๆ้ซๅนถๅ
- ๆฐๆฎๅบ่ฟๆฅๆฑ : GORM ่ชๅจ็ฎก็่ฟๆฅๆฑ
- ๅ ๅญๅ ็จ: ~20-30MB๏ผ็ฉบ่ฝฝ๏ผ
- ๅๅบๆถ้ด: < 10ms (P99, ๆ ๆฐๆฎๅบๆฅ่ฏข)
้ฎ้ข: ๆ ๆณ่ฟๆฅๆฐๆฎๅบ
# ๆฃๆฅ PostgreSQL ๆฏๅฆ่ฟ่ก
docker-compose ps
# ๆฅ็ๆฐๆฎๅบๆฅๅฟ
docker-compose logs db้ฎ้ข: JWT token ๆ ๆ
- ็กฎ่ฎค
JWT_SECRET้ ็ฝฎๆญฃ็กฎ - ๆฃๆฅ token ๆฏๅฆ่ฟๆ
- ้ช่ฏ Authorization header ๆ ผๅผ:
Bearer <token>
้ฎ้ข: ไพ่ตไธ่ฝฝๅคฑ่ดฅ
# ่ฎพ็ฝฎ Go ไปฃ็๏ผไธญๅฝ็จๆท๏ผ
export GOPROXY=https://goproxy.cn,direct
# ้ๆฐไธ่ฝฝ
go mod tidyๆฌข่ฟๆไบค Issue ๅ Pull Request๏ผ
Made with โค๏ธ by HaloLight Team