- Gin + GORM + Tailwind CSS blog engine - OS-aware config (Linux /etc/blog_go/, Windows ./win/etc/blog_go/) - SQLite by default, MySQL support via config - Auto-migrate database + seed admin user on first run - Session-based auth (login/logout) - i18n: Chinese/English with auto-detect + manual switch - Avatar dropdown nav with click-to-toggle menu - Profile page: avatar upload, edit info, change password - Role system: admin (full access) and author (profile only) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
129 lines
3.9 KiB
Markdown
129 lines
3.9 KiB
Markdown
# Go Blog
|
|
|
|
A simple, fast blog engine built with Go, Gin, and Tailwind CSS. Supports SQLite and MySQL, with automatic first-run setup.
|
|
|
|
## Features
|
|
|
|
- **Multi-language** — 中文 / English, auto-detected or manually switched
|
|
- **OS-aware config** — Linux `/etc/blog_go/`, Windows `./win/etc/blog_go/`
|
|
- **First-run setup** — auto-creates config, database, and admin user
|
|
- **Avatar + Profile** — upload avatar, edit personal info, change password
|
|
- **Role system** — admin sees management panel; authors see profile only
|
|
- **Responsive UI** — Tailwind CSS, works on desktop and mobile
|
|
|
|
## Tech Stack
|
|
|
|
| Layer | Library |
|
|
|---|---|
|
|
| Router | [gin](https://github.com/gin-gonic/gin) |
|
|
| ORM | [gorm](https://gorm.io) |
|
|
| SQLite | [glebarez/sqlite](https://github.com/glebarez/sqlite) (pure Go, no CGO) |
|
|
| Sessions | [gin-contrib/sessions](https://github.com/gin-contrib/sessions) |
|
|
| Config | [gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) |
|
|
| Passwords | [golang.org/x/crypto](https://pkg.go.dev/golang.org/x/crypto/bcrypt) |
|
|
| CSS | [Tailwind CSS](https://tailwindcss.com) (CDN) |
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
go run .
|
|
```
|
|
|
|
Open http://localhost:8080 and log in with **admin** / **admin**.
|
|
|
|
## Configuration
|
|
|
|
On first run, a config file is created automatically:
|
|
|
|
| Platform | Config Path | Storage Path |
|
|
|---|---|---|
|
|
| Linux | `/etc/blog_go/config.yaml` | `/srv/blog_go/` |
|
|
| Windows | `./win/etc/blog_go/config.yaml` | `./win/srv/blog_go/` |
|
|
|
|
```yaml
|
|
# config.yaml
|
|
database:
|
|
type: sqlite # sqlite (default) or mysql
|
|
dsn: "" # MySQL DSN, ignored for sqlite
|
|
port: "8080" # web server port
|
|
path: ./win/srv/blog_go # storage path (db, uploads)
|
|
secret: <auto-generated> # session encryption key
|
|
```
|
|
|
|
### MySQL
|
|
|
|
Edit `config.yaml`:
|
|
|
|
```yaml
|
|
database:
|
|
type: mysql
|
|
dsn: user:password@tcp(127.0.0.1:3306)/blog_go?charset=utf8mb4&parseTime=True&loc=Local
|
|
port: "8080"
|
|
```
|
|
|
|
Create the database first:
|
|
|
|
```sql
|
|
CREATE DATABASE blog_go CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
go_blog/
|
|
├── main.go # Entry point, routes, middleware wiring
|
|
├── config/
|
|
│ └── config.go # OS-aware config load / auto-create
|
|
├── models/
|
|
│ ├── user.go # User model + bcrypt
|
|
│ └── db.go # GORM init, migration, seed
|
|
├── middleware/
|
|
│ └── auth.go # Auth guard, language detection
|
|
├── handlers/
|
|
│ ├── helpers.go # DefaultData + getTr utilities
|
|
│ ├── home.go # GET /
|
|
│ ├── auth.go # GET/POST /login, POST /logout
|
|
│ ├── admin.go # GET /admin (protected)
|
|
│ └── profile.go # GET/POST /profile (protected)
|
|
├── i18n/
|
|
│ └── i18n.go # EN/ZH translation maps + Accept-Language
|
|
├── templates/
|
|
│ ├── layouts/base.html # Header (nav + avatar dropdown) + footer
|
|
│ ├── pages/
|
|
│ │ ├── home.html # Public home page
|
|
│ │ ├── login.html # Login form
|
|
│ │ └── profile.html # Edit profile page
|
|
│ └── admin/
|
|
│ └── dashboard.html # Admin dashboard
|
|
└── win/ # Auto-created runtime data (Windows)
|
|
├── etc/blog_go/
|
|
│ └── config.yaml
|
|
└── srv/blog_go/
|
|
├── blog.db
|
|
└── avatars/
|
|
```
|
|
|
|
## Routes
|
|
|
|
| Method | Path | Auth | Description |
|
|
|---|---|---|---|
|
|
| GET | `/` | No | Home page |
|
|
| GET | `/login` | No | Login form |
|
|
| POST | `/login` | No | Submit login |
|
|
| POST | `/logout` | No | Clear session |
|
|
| GET | `/profile` | Yes | Edit profile |
|
|
| POST | `/profile` | Yes | Save profile |
|
|
| GET | `/admin` | Yes | Admin dashboard (admin only) |
|
|
| GET | `/uploads/*` | No | Static files (avatars, etc.) |
|
|
|
|
## User Roles
|
|
|
|
| Role | Profile | Admin Dashboard |
|
|
|---|---|---|
|
|
| `admin` | ✓ | ✓ |
|
|
| `author` | ✓ | ✗ |
|
|
|
|
## License
|
|
|
|
MIT
|