todoms_golang/README.md
2025-04-12 15:25:34 +07:00

139 lines
5.9 KiB
Markdown

## Cấu trúc dự án chi tiết
```
.
├── cmd/ # Điểm vào ứng dụng
│ └── api/ # API server
│ └── main.go # File main khởi động ứng dụng
├── global/ # Biến toàn cục và cấu trúc cấu hình
│ └── global.go # Định nghĩa các biến và cấu trúc toàn cục
├── internal/ # Mã nguồn nội bộ
│ ├── controllers/ # Xử lý request và response
│ │ └── user_controller.go # Controller xử lý các request liên quan đến user
│ ├── initialize/ # Khởi tạo các thành phần của ứng dụng
│ │ ├── loadconfig.go # Đọc cấu hình từ file .env
│ │ ├── logger.go # Khởi tạo logger
│ │ ├── mysql.go # Khởi tạo kết nối MySQL
│ │ └── run.go # Điểm khởi động chính của ứng dụng
│ ├── models/ # Định nghĩa các model dữ liệu
│ │ └── user.go # Model User
│ ├── repositories/ # Tương tác với cơ sở dữ liệu
│ │ └── user_repository.go # Repository xử lý dữ liệu user
│ ├── routers/ # Định nghĩa các router
│ │ ├── router_group.go # Nhóm các router
│ │ └── user/ # Router liên quan đến user
│ │ ├── router_group.go # Nhóm các router user
│ │ └── user_router.go # Định nghĩa các endpoint user
│ ├── services/ # Xử lý logic nghiệp vụ
│ │ └── user_service.go # Service xử lý logic liên quan đến user
│ └── wire/ # Dependency injection với Google Wire
│ ├── injector.go # Định nghĩa các injector
│ ├── wire.go # Định nghĩa các provider
│ └── wire_gen.go # File được tạo tự động bởi Wire
├── logs/ # Thư mục chứa log
├── .air.toml # Cấu hình cho Air (hot-reload)
├── .env # Biến môi trường
├── Dockerfile # Cấu hình Docker cho môi trường production
├── Dockerfile.dev # Cấu hình Docker cho môi trường phát triển
├── Makefile # Các lệnh make
└── docker-compose.yml, docker-compose.dev.yml # Cấu hình Docker Compose
```
## Quy tắc đặt tên file
Dự án tuân theo các quy tắc đặt tên file sau để đảm bảo tính nhất quán:
1. **Sử dụng dấu gạch dưới (_) để phân tách các từ** trong tên file, ví dụ: `user_controller.go`, `user_repository.go`.
2. **Tên file mô tả rõ chức năng** của file đó:
- Controllers: `<entity>_controller.go` (ví dụ: `user_controller.go`)
- Services: `<entity>_service.go` (ví dụ: `user_service.go`)
- Repositories: `<entity>_repository.go` (ví dụ: `user_repository.go`)
- Routers: `<entity>_router.go` (ví dụ: `user_router.go`)
- Models: `<entity>.go` (ví dụ: `user.go`)
3. **File khởi tạo và cấu hình** sử dụng tên mô tả chức năng:
- `loadconfig.go`: Đọc cấu hình
- `logger.go`: Khởi tạo logger
- `mysql.go`: Khởi tạo kết nối MySQL
- `run.go`: Điểm khởi động ứng dụng
4. **File Wire** tuân theo quy ước của Google Wire:
- `wire.go`: Định nghĩa các provider
- `injector.go`: Định nghĩa các injector
- `wire_gen.go`: File được tạo tự động bởi Wire
## Kiến trúc ứng dụng
Ứng dụng được tổ chức theo kiến trúc phân lớp:
1. **Controllers**: Xử lý request và response, gọi các service để thực hiện logic nghiệp vụ.
2. **Services**: Chứa logic nghiệp vụ, gọi các repository để tương tác với dữ liệu.
3. **Repositories**: Tương tác trực tiếp với cơ sở dữ liệu, thực hiện các thao tác CRUD.
4. **Models**: Định nghĩa cấu trúc dữ liệu.
5. **Routers**: Định nghĩa các endpoint API và kết nối với controllers.
6. **Wire**: Quản lý dependency injection, kết nối các thành phần lại với nhau.
## Dependency Injection với Google Wire
Dự án sử dụng Google Wire để quản lý dependency injection. Các thành phần chính:
1. **Provider**: Định nghĩa cách tạo các dependency (trong `wire.go`).
2. **Injector**: Định nghĩa cách kết nối các dependency (trong `injector.go`).
3. **Wire Gen**: File được tạo tự động bởi Wire, chứa code khởi tạo dependency (trong `wire_gen.go`).
Để cập nhật file `wire_gen.go` sau khi thay đổi các provider hoặc injector:
```bash
cd internal/wire
go run github.com/google/wire/cmd/wire
```
## Môi trường phát triển (Development)
### Phương pháp 1: Sử dụng Docker Compose cho toàn bộ stack
Phương pháp này sử dụng Docker Compose để chạy cả ứng dụng Go và MySQL, với hot-reload được hỗ trợ bởi Air.
```bash
# Khởi động môi trường phát triển
docker-compose -f docker-compose.dev.yml up -d
# Xem logs
docker-compose -f docker-compose.dev.yml logs -f
# Dừng môi trường phát triển
docker-compose -f docker-compose.dev.yml down
```
### Phương pháp 2: Chạy ứng dụng Go trực tiếp, MySQL trong Docker
```bash
# Khởi động MySQL trong Docker
make docker-run
# Chạy ứng dụng với hot-reload
make watch
# Hoặc chạy ứng dụng thông thường
make run
# Dừng MySQL
make docker-down
```
## Môi trường sản xuất (Production)
### Phương pháp 1: Sử dụng Docker Compose
```bash
# Khởi động môi trường sản xuất
docker-compose up -d
# Xem logs
docker-compose logs -f
# Dừng môi trường sản xuất
docker-compose down
```