An example of gin
Go Gin Example - Blog API

A production-ready RESTful blog API example built with Go and Gin framework, demonstrating real-world patterns and best practices.
Project Overview
This project is a comprehensive blog backend API system that provides complete article and tag management functionalities, along with features like JWT authentication, image upload, QR code generation, and Excel import/export.
Tech Stack
| Category | Technology | |----------|------------| | Language | Go | | Web Framework | Gin | | ORM | GORM | | Database | MySQL | | Cache | Redis (via Redigo) | | Authentication | JWT (jwt-go) | | Configuration | go-ini | | API Documentation | Swagger | | Excel Processing | excelize, xlsx | | Image Processing | freetype, barcode | | Validation | beego/validation |
Project Structure
go-gin-example/
โโโ conf/ # Configuration files
โ โโโ app.ini # Application configuration
โโโ docs/ # Documentation
โ โโโ sql/ # Database scripts
โ โ โโโ blog.sql # Database schema
โ โโโ swagger/ # Swagger documentation
โโโ middleware/ # Middleware
โ โโโ jwt/ # JWT authentication middleware
โ โโโ jwt.go
โโโ models/ # Data models (ORM)
โ โโโ article.go # Article model
โ โโโ auth.go # Auth model
โ โโโ models.go # Database initialization
โ โโโ tag.go # Tag model
โโโ pkg/ # Shared packages
โ โโโ app/ # Application utilities
โ โ โโโ form.go # Form binding
โ โ โโโ request.go # Request handling
โ โ โโโ response.go # Response formatting
โ โโโ e/ # Error codes
โ โ โโโ cache.go # Cache key constants
โ โ โโโ code.go # Error code definitions
โ โ โโโ msg.go # Error messages
โ โโโ export/ # Excel export utilities
โ โ โโโ excel.go
โ โโโ file/ # File utilities
โ โ โโโ file.go
โ โโโ gredis/ # Redis client
โ โ โโโ redis.go
โ โโโ logging/ # Logging utilities
โ โ โโโ file.go
โ โ โโโ log.go
โ โโโ qrcode/ # QR code generation
โ โ โโโ qrcode.go
โ โโโ setting/ # Configuration management
โ โ โโโ setting.go
โ โโโ upload/ # Image upload utilities
โ โ โโโ image.go
โ โโโ util/ # Common utilities
โ โโโ jwt.go # JWT utilities
โ โโโ md5.go # MD5 hashing
โ โโโ pagination.go # Pagination helper
โ โโโ util.go
โโโ routers/ # Route definitions
โ โโโ api/ # API handlers
โ โ โโโ v1/ # API v1 handlers
โ โ โ โโโ article.go # Article endpoints
โ โ โ โโโ tag.go # Tag endpoints
โ โ โโโ auth.go # Authentication endpoint
โ โ โโโ upload.go # Image upload endpoint
โ โโโ router.go # Route initialization
โโโ runtime/ # Runtime resources
โ โโโ fonts/ # Font files
โ โโโ qrcode/ # QR code resources
โโโ service/ # Business logic layer
โ โโโ article_service/ # Article services
โ โ โโโ article.go # Article CRUD operations
โ โ โโโ article_poster.go # Poster generation
โ โโโ auth_service/ # Auth services
โ โ โโโ auth.go
โ โโโ cache_service/ # Cache key generation
โ โ โโโ article.go
โ โ โโโ tag.go
โ โโโ tag_service/ # Tag services
โ โโโ tag.go
โโโ Dockerfile # Docker build file
โโโ Makefile # Build automation
โโโ go.mod # Go module definition
โโโ go.sum # Dependency checksums
โโโ main.go # Application entry point
Architecture
The project follows a layered architecture pattern:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ HTTP Requests โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Middleware Layer โ
โ (JWT Authentication) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Router Layer โ
โ (routers/api/v1/*.go) โ
โ - Request validation โ
โ - Parameter binding โ
โ - Response formatting โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Service Layer โ
โ (service//.go) โ
โ - Business logic โ
โ - Cache management โ
โ - Cross-model operations โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Model Layer โ
โ (models/*.go) โ
โ - Database operations โ
โ - CRUD methods โ
โ - Data structures โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Storage Layer โ
โ MySQL (Primary) + Redis (Cache) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Feature Tree
Go Gin Blog API
โโโ Authentication
โ โโโ JWT Login Validation
โ โโโ Token Generation (3-hour expiry)
โ โโโ Token Validation
โ โโโ Token Refresh
โโโ Article Management
โ โโโ Create Article
โ โโโ Read Article (with Redis caching)
โ โโโ Update Article
โ โโโ Delete Article (soft delete)
โ โโโ List Articles (paginated)
โ โโโ Count Articles
โ โโโ Generate Article Poster
โ โโโ Embed QR Code
โ โโโ Apply Background Image
โ โโโ Render Text Overlay
โ โโโ Save Merged Image
โโโ Tag Management
โ โโโ CRUD Operations
โ โ โโโ Create Tag
โ โ โโโ Read Tags (paginated, cached)
โ โ โโโ Update Tag
โ โ โโโ Delete Tag (soft delete)
โ โโโ Export Tags to Excel
โ โโโ Import Tags from Excel
โโโ File Upload
โ โโโ Image Upload
โ โโโ Format validation (.jpg, .jpeg, .png)
โ โโโ Size validation (max 5MB)
โ โโโ MD5-based naming
โโโ API Documentation
โ โโโ Swagger UI (/swagger/*any)
โโโ Static File Serving
โโโ Exported Excel files (/export)
โโโ Uploaded images (/upload/images)
โโโ Generated QR codes (/qrcode)
API Endpoints
Public Endpoints
| Method | Endpoint | Description | |--------|----------|-------------| | POST | /auth | User authentication, returns JWT token | | GET | /swagger/*any | Swagger API documentation | | POST | /upload | Image upload | | POST | /tags/export | Export tags to Excel | | POST | /tags/import | Import tags from Excel |
Protected Endpoints (Require JWT Token)
Tags
| Method | Endpoint | Description | |--------|----------|-------------| | GET | /api/v1/tags | Get tag list (paginated) | | POST | /api/v1/tags | Create new tag | | PUT | /api/v1/tags/:id | Update tag by ID | | DELETE | /api/v1/tags/:id | Delete tag by ID |
Articles
| Method | Endpoint | Description | |--------|----------|-------------| | GET | /api/v1/articles | Get article list (paginated) | | GET | /api/v1/articles/:id | Get article by ID | | POST | /api/v1/articles | Create new article | | PUT | /api/v1/articles/:id | Update article by ID | | DELETE | /api/v1/articles/:id | Delete article by ID | | POST | /api/v1/articles/poster/generate | Generate article poster with QR code |
Database Schema
Tables
blog_auth - User authentication
- id: INT (PK, AUTO_INCREMENT) - username: VARCHAR(50)
- password: VARCHAR(50)
blog_tag - Article tags - id: INT (PK, AUTO_INCREMENT) - name: VARCHAR(100) - Tag name
- created_on: INT - Creation timestamp
- created_by: VARCHAR(100) - Creator
- modified_on: INT - Modification timestamp
- modified_by: VARCHAR(100) - Modifier
- deleted_on: INT - Deletion timestamp (soft delete)
- state: TINYINT - Status (0: disabled, 1: enabled)
blog_article - Articles - id: INT (PK, AUTO_INCREMENT) - tag_id: INT (FK) - Associated tag ID
- title: VARCHAR(100) - Article title
- desc: VARCHAR(255) - Description
- content: TEXT - Article content
- coverimageurl: VARCHAR(255) - Cover image URL
- created_on: INT - Creation timestamp
- created_by: VARCHAR(100) - Creator
- modified_on: INT - Modification timestamp
- modified_by: VARCHAR(255) - Modifier
- deleted_on: INT - Deletion timestamp (soft delete)
- state: TINYINT - Status
Configuration
Configuration is managed through conf/app.ini:
[app]
PageSize = 10 # Pagination page size
JwtSecret = 233 # JWT signing secret
PrefixUrl = http://127.0.0.1:8000
RuntimeRootPath = runtime/
ImageSavePath = upload/images/
ImageMaxSize = 5 # Max image size in MB
ImageAllowExts = .jpg,.jpeg,.png
ExportSavePath = export/
QrCodeSavePath = qrcode/
FontSavePath = fonts/
LogSavePath = logs/
[server] RunMode = debug # debug or release HttpPort = 8000 ReadTimeout = 60 # seconds WriteTimeout = 60 # seconds
[database] Type = mysql User = root Password = rootroot Host = 127.0.0.1:3306 Name = blog TablePrefix = blog_
[redis] Host = 127.0.0.1:6379 Password = MaxIdle = 30 MaxActive = 30 IdleTimeout = 200
Getting Started
Prerequisites
- Go 1.13+
- MySQL 5.6+
- Redis
Database Setup
- Create a MySQL database named
blog - Execute the SQL script:
mysql -u root -p blog < docs/sql/blog.sql
Configuration
- Edit
conf/app.inito match your environment - Update database credentials
- Update Redis connection settings
Running the Application
# Build
make build
Run
./go-gin-example
Or run directly
go run main.go
The server will start at http://localhost:8000
Using Docker
# Build image
docker build -t go-gin-example .
Run container
docker run -p 8000:8000 go-gin-example
API Usage Examples
1. Get Authentication Token
curl -X POST http://localhost:8000/auth \
-d "username=test&password=test123"
Response:
{ "code": 200, "msg": "ok", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } }
2. Create a Tag
curl -X POST "http://localhost:8000/api/v1/tags?token=YOUR_TOKEN" \
-d "name=Go&created_by=admin&state=1"
3. Get Tags List
curl "http://localhost:8000/api/v1/tags?token=YOUR_TOKEN"
4. Create an Article
curl -X POST "http://localhost:8000/api/v1/articles?token=YOUR_TOKEN" \
-d "tagid=1&title=Hello Gin&desc=Introduction to Gin&content=Article content...&createdby=admin&coverimageurl=http://example.com/image.jpg&state=1"
5. Upload an Image
curl -X POST http://localhost:8000/upload \
-F "image=@/path/to/image.jpg"
6. Export Tags to Excel
curl -X POST http://localhost:8000/tags/export
Key Design Patterns
1. Soft Delete
All models use soft delete by settingdeleted_on timestamp instead of actual deletion.
2. Redis Caching
Articles and tags are cached in Redis with 1-hour TTL to reduce database load.3. Service Layer Pattern
Business logic is separated into service layer, keeping handlers thin and focused on request/response handling.4. Unified Response Format
All API responses follow consistent format:{
"code": 200,
"msg": "ok",
"data": {}
}
5. Custom GORM Callbacks
Custom callbacks for automatic timestamp management:CreatedOnset on createModifiedOnupdated on modificationsDeletedOnset on soft delete
Error Codes
| Code | Description | |------|-------------| | 200 | Success | | 400 | Invalid parameters | | 500 | Internal server error | | 10001 | Tag already exists | | 10003 | Tag not found | | 10011 | Article not found | | 20001 | Token validation failed | | 20002 | Token expired | | 20003 | Token generation error | | 20004 | Authentication failed | | 30001 | Image save failed | | 30002 | Image check failed | | 30003 | Invalid image format |
Development Commands
# Build
make build
Run code analysis
make tool
Run linter
make lint
Clean build artifacts
make clean
License
MIT License - See LICENSE for details.
Credits
Project by EDDYCJY