404 lines
15 KiB
Markdown
404 lines
15 KiB
Markdown
# Gotest 多站点管理系统
|
||
|
||
基于 **Go + Gin + GORM + SQLite** 的全栈多站点管理系统,内置 18 套前端网站模板 + 管理后台,覆盖企业官网、跨境电商、外卖平台、游戏平台、应用商店、音乐平台六大业务线。
|
||
|
||
## 功能特性
|
||
|
||
- **18 套前端网站模板**:6 大业务线 × 3 种设计风格,通过 `//go:embed` 内嵌到二进制
|
||
- **管理后台**:完整的 Dashboard + 用户管理 + 16 张数据表的通用 CRUD
|
||
- **生产级架构**:RequestID 追踪、结构化日志、优雅关机、连接池优化
|
||
- **安全认证**:JWT Bearer Token + bcrypt 密码哈希 + 管理员权限校验
|
||
- **限流防护**:基于 IP 的令牌桶限流(golang.org/x/time/rate)
|
||
- **定时任务**:cron 调度器,支持数据清理等周期性任务
|
||
- **文件存储**:本地 / MinIO / 腾讯云 COS 三种存储后端
|
||
- **短信服务**:Mock / 阿里云 / 腾讯云三种短信提供商
|
||
- **容器化部署**:多阶段 Docker 构建 + docker-compose 一键部署
|
||
|
||
## 技术栈
|
||
|
||
| 组件 | 技术 | 版本 |
|
||
|------|------|------|
|
||
| Web 框架 | Gin | v1.12.0 |
|
||
| ORM | GORM | v1.31.2 |
|
||
| 数据库 | SQLite (纯Go驱动) / MySQL | - |
|
||
| 认证 | golang-jwt/jwt | v5 |
|
||
| 密码哈希 | golang.org/x/crypto/bcrypt | - |
|
||
| 配置管理 | gopkg.in/yaml.v3 | - |
|
||
| 限流 | golang.org/x/time/rate | - |
|
||
| 定时任务 | robfig/cron | v3 |
|
||
| Go 版本 | - | 1.25.0 |
|
||
|
||
## 项目结构
|
||
|
||
```
|
||
gotest/
|
||
├── main.go # 程序入口
|
||
├── config.yaml # 全局配置文件
|
||
├── go.mod / go.sum # Go 模块定义
|
||
├── Makefile # 标准化构建命令
|
||
├── Dockerfile # 多阶段 Docker 构建
|
||
├── docker-compose.yml # 容器编排
|
||
├── build.bat / build.sh # 跨平台构建脚本
|
||
│
|
||
├── internal/ # 核心业务代码
|
||
│ ├── config/ # 配置结构体定义
|
||
│ │ └── config.go # Config 结构体 + Load() 函数
|
||
│ │
|
||
│ ├── database/ # 数据库初始化
|
||
│ │ ├── database.go # Init() + AutoMigrate + HealthCheck
|
||
│ │ ├── seed_enterprise.go # 企业模块种子数据
|
||
│ │ ├── seed_shop.go # 电商模块种子数据
|
||
│ │ ├── seed_food.go # 外卖模块种子数据
|
||
│ │ ├── seed_game.go # 游戏模块种子数据
|
||
│ │ ├── seed_app.go # 应用模块种子数据
|
||
│ │ └── seed_music.go # 音乐模块种子数据
|
||
│ │
|
||
│ ├── model/ # GORM 数据模型 (17个模型)
|
||
│ │ ├── user.go # 用户模型 (User)
|
||
│ │ ├── config.go # 系统配置 (Config)
|
||
│ │ ├── enterprise.go # 企业模型 (Company/News/Service/Team)
|
||
│ │ ├── shop.go # 电商模型 (Product/ProductCategory)
|
||
│ │ ├── food.go # 外卖模型 (Restaurant/MenuCategory/MenuItem)
|
||
│ │ ├── game.go # 游戏模型 (Game/GameCategory)
|
||
│ │ ├── app.go # 应用模型 (App/AppCategory)
|
||
│ │ └── music.go # 音乐模型 (Song/MusicCategory)
|
||
│ │
|
||
│ ├── repository/ # 数据访问层
|
||
│ │ ├── user.go # 用户 CRUD
|
||
│ │ ├── enterprise.go # 企业数据查询
|
||
│ │ ├── shop.go # 电商数据查询
|
||
│ │ ├── food.go # 外卖数据查询
|
||
│ │ ├── game.go # 游戏数据查询
|
||
│ │ ├── app.go # 应用数据查询
|
||
│ │ └── music.go # 音乐数据查询
|
||
│ │
|
||
│ ├── service/ # 业务逻辑层
|
||
│ │ ├── auth.go # 认证服务 (登录/JWT生成)
|
||
│ │ ├── admin.go # 管理员服务
|
||
│ │ ├── user.go # 用户服务
|
||
│ │ ├── upload.go # 文件上传服务
|
||
│ │ ├── enterprise.go # 企业业务逻辑
|
||
│ │ ├── shop.go # 电商业务逻辑
|
||
│ │ ├── food.go # 外卖业务逻辑
|
||
│ │ ├── game.go # 游戏业务逻辑
|
||
│ │ ├── app.go # 应用业务逻辑
|
||
│ │ └── music.go # 音乐业务逻辑
|
||
│ │
|
||
│ ├── handler/ # HTTP 处理器
|
||
│ │ ├── response.go # 统一响应格式 (Success/Fail*)
|
||
│ │ ├── auth.go # 登录接口
|
||
│ │ ├── admin.go # 管理员初始化
|
||
│ │ ├── user.go # 用户资料 + 用户CRUD
|
||
│ │ ├── upload.go # 文件上传
|
||
│ │ ├── dashboard.go # 管理后台仪表盘 + 通用CRUD
|
||
│ │ ├── enterprise.go # 企业数据 API
|
||
│ │ ├── shop.go # 电商数据 API
|
||
│ │ ├── food.go # 外卖数据 API
|
||
│ │ ├── game.go # 游戏数据 API
|
||
│ │ ├── app.go # 应用数据 API
|
||
│ │ └── music.go # 音乐数据 API
|
||
│ │
|
||
│ ├── middleware/ # 中间件
|
||
│ │ ├── request_id.go # 请求ID追踪
|
||
│ │ ├── recover.go # Panic 恢复
|
||
│ │ ├── logger.go # 结构化日志
|
||
│ │ ├── cors.go # 跨域处理
|
||
│ │ ├── ratelimit.go # 限流 (令牌桶)
|
||
│ │ └── jwt.go # JWT 认证
|
||
│ │
|
||
│ ├── router/ # 路由注册
|
||
│ │ └── router.go # 全局路由 + 中间件链
|
||
│ │
|
||
│ ├── storage/ # 文件存储抽象
|
||
│ │ ├── storage.go # 接口定义 + 工厂函数
|
||
│ │ ├── local.go # 本地存储
|
||
│ │ ├── minio.go # MinIO 对象存储
|
||
│ │ └── cos.go # 腾讯云 COS
|
||
│ │
|
||
│ ├── sms/ # 短信服务抽象
|
||
│ │ ├── sms.go # 接口定义 + 工厂函数
|
||
│ │ ├── mock.go # Mock 短信
|
||
│ │ ├── aliyun.go # 阿里云短信
|
||
│ │ └── tencent.go # 腾讯云短信
|
||
│ │
|
||
│ └── task/ # 定时任务
|
||
│ └── task.go # cron 调度器
|
||
│
|
||
└── web/dist/ # 嵌入式前端模板
|
||
├── admin/index.html # 管理后台 SPA
|
||
├── site1/index.html # 企业官网 - 科技风格
|
||
├── site2/index.html # 企业官网 - 制造风格
|
||
├── site3/index.html # 企业官网 - 咨询风格
|
||
├── shop/index.html # 跨境电商 - 红色风格
|
||
├── shop2/index.html # 跨境电商 - 暗黑风格
|
||
├── shop3/index.html # 跨境电商 - 北欧风格
|
||
├── food1/index.html # 外卖平台 - 橙黄风格
|
||
├── food2/index.html # 外卖平台 - 深色风格
|
||
├── food3/index.html # 外卖平台 - 清新风格
|
||
├── game1/index.html # 游戏平台 - 赛博风格
|
||
├── game2/index.html # 游戏平台 - 像素风格
|
||
├── game3/index.html # 游戏平台 - 云游风格
|
||
├── app1/index.html # 应用商店 - 极简风格
|
||
├── app2/index.html # 应用商店 - 暗黑风格
|
||
├── app3/index.html # 应用商店 - 清新风格
|
||
├── music1/index.html # 音乐平台 - 暗黑风格
|
||
├── music2/index.html # 音乐平台 - 黑胶风格
|
||
├── music3/index.html # 音乐平台 - 渐变风格
|
||
└── shared/.gitkeep # 共享资源目录
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 环境要求
|
||
|
||
- Go 1.21+
|
||
- (可选) Docker & Docker Compose
|
||
|
||
### 方式一:本地编译运行
|
||
|
||
```bash
|
||
# 克隆仓库
|
||
git clone https://gitee.com/asdxzaaaaa/gotest.git
|
||
cd gotest
|
||
|
||
# 安装依赖
|
||
go mod tidy
|
||
|
||
# 编译
|
||
go build -o build/gotest .
|
||
|
||
# 运行(自动创建 SQLite 数据库 + 种子数据)
|
||
./build/gotest
|
||
```
|
||
|
||
### 方式二:Docker 部署
|
||
|
||
```bash
|
||
# 使用 docker-compose 一键启动
|
||
docker-compose up -d
|
||
|
||
# 或手动构建镜像
|
||
docker build -t gotest .
|
||
docker run -d -p 8080:8080 -v $(pwd)/data:/app/data gotest
|
||
```
|
||
|
||
### 方式三:使用 Makefile
|
||
|
||
```bash
|
||
make build # 编译
|
||
make run # 直接运行
|
||
make build-prod # 生产级编译
|
||
make lint # 代码检查 (fmt + vet)
|
||
make test # 运行测试
|
||
make docker-up # Docker Compose 启动
|
||
make clean # 清理构建产物
|
||
```
|
||
|
||
## 网站访问方式
|
||
|
||
启动服务后,在浏览器中打开以下地址:
|
||
|
||
### 管理后台
|
||
|
||
| 页面 | 地址 | 说明 |
|
||
|------|------|------|
|
||
| 管理后台 | http://localhost:8080/admin | 默认账号: admin / admin123 |
|
||
|
||
管理后台功能:
|
||
- **仪表盘**:用户数 + 6 大业务线数据统计概览
|
||
- **用户管理**:用户列表、新增/编辑/删除、角色与状态管理
|
||
- **内容管理**:16 张数据表的通用 CRUD(增删改查)
|
||
- **系统设置**:服务健康状态、数据库信息、技术栈
|
||
- **站点导航**:18 套前端模板快速入口
|
||
|
||
### 前端网站模板(18 套)
|
||
|
||
#### 企业官网
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 科技风格 (蓝色) | http://localhost:8080/site1 |
|
||
| 制造风格 | http://localhost:8080/site2 |
|
||
| 咨询风格 | http://localhost:8080/site3 |
|
||
|
||
#### 跨境电商
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 红色风格 | http://localhost:8080/shop |
|
||
| 暗黑风格 | http://localhost:8080/shop2 |
|
||
| 北欧风格 | http://localhost:8080/shop3 |
|
||
|
||
#### 外卖平台
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 橙黄风格 | http://localhost:8080/food1 |
|
||
| 深色风格 | http://localhost:8080/food2 |
|
||
| 清新风格 | http://localhost:8080/food3 |
|
||
|
||
#### 游戏平台
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 赛博风格 | http://localhost:8080/game1 |
|
||
| 像素风格 | http://localhost:8080/game2 |
|
||
| 云游风格 | http://localhost:8080/game3 |
|
||
|
||
#### 应用商店
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 极简风格 | http://localhost:8080/app1 |
|
||
| 暗黑风格 | http://localhost:8080/app2 |
|
||
| 清新风格 | http://localhost:8080/app3 |
|
||
|
||
#### 音乐平台
|
||
|
||
| 风格 | 地址 |
|
||
|------|------|
|
||
| 暗黑风格 | http://localhost:8080/music1 |
|
||
| 黑胶风格 | http://localhost:8080/music2 |
|
||
| 渐变风格 | http://localhost:8080/music3 |
|
||
|
||
## API 接口
|
||
|
||
所有 API 以 `/api/v1` 为前缀,响应格式统一为:
|
||
|
||
```json
|
||
{
|
||
"code": 0,
|
||
"message": "success",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
### 公开接口(无需认证)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | /api/health | 健康检查(含数据库状态) |
|
||
| POST | /api/v1/auth/login | 用户登录 |
|
||
| GET | /api/v1/admin/check | 检查管理员是否存在 |
|
||
| POST | /api/v1/admin/init | 初始化管理员账号 |
|
||
| GET | /api/v1/enterprise/* | 企业数据(公司/服务/新闻/团队) |
|
||
| GET | /api/v1/shop/* | 电商数据(分类/商品/推荐) |
|
||
| GET | /api/v1/food/* | 外卖数据(餐厅/菜品/菜单) |
|
||
| GET | /api/v1/game/* | 游戏数据(分类/游戏/热门/新游) |
|
||
| GET | /api/v1/app/* | 应用数据(分类/应用/精选/新上架) |
|
||
| GET | /api/v1/music/* | 音乐数据(分类/歌曲/热门/新歌) |
|
||
|
||
### 需登录接口(JWT 认证)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET/PUT | /api/v1/user/profile | 获取/更新个人资料 |
|
||
| PUT | /api/v1/user/password | 修改密码 |
|
||
| POST | /api/v1/upload | 文件上传 |
|
||
|
||
### 管理端接口(JWT + 管理员权限)
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|------|------|------|
|
||
| GET | /api/v1/admin/users | 用户列表(分页) |
|
||
| POST | /api/v1/admin/users | 创建用户 |
|
||
| PUT | /api/v1/admin/users/:id | 更新用户 |
|
||
| DELETE | /api/v1/admin/users/:id | 删除用户 |
|
||
| GET | /api/v1/admin/dashboard/stats | 仪表盘统计 |
|
||
| GET | /api/v1/admin/dashboard/:table | 通用列表查询 |
|
||
| POST | /api/v1/admin/dashboard/:table | 通用创建 |
|
||
| PUT | /api/v1/admin/dashboard/:table/:id | 通用更新 |
|
||
| DELETE | /api/v1/admin/dashboard/:table/:id | 通用删除 |
|
||
|
||
### 可管理的数据表
|
||
|
||
| 模块 | 表名 | 说明 |
|
||
|------|------|------|
|
||
| 企业官网 | enterprise_company | 企业信息 |
|
||
| 企业官网 | enterprise_news | 企业新闻 |
|
||
| 企业官网 | enterprise_services | 企业服务 |
|
||
| 企业官网 | enterprise_team | 团队成员 |
|
||
| 跨境电商 | shop_products | 商品管理 |
|
||
| 跨境电商 | shop_categories | 商品分类 |
|
||
| 外卖平台 | food_restaurants | 餐厅管理 |
|
||
| 外卖平台 | food_categories | 餐厅分类 |
|
||
| 外卖平台 | food_menu_items | 菜品管理 |
|
||
| 外卖平台 | food_menu_categories | 菜品分类 |
|
||
| 游戏平台 | game_games | 游戏管理 |
|
||
| 游戏平台 | game_categories | 游戏分类 |
|
||
| 应用商店 | app_apps | 应用管理 |
|
||
| 应用商店 | app_categories | 应用分类 |
|
||
| 音乐平台 | music_songs | 歌曲管理 |
|
||
| 音乐平台 | music_categories | 音乐分类 |
|
||
|
||
## 配置说明
|
||
|
||
编辑 `config.yaml` 进行配置:
|
||
|
||
```yaml
|
||
server:
|
||
port: 8080 # 服务端口
|
||
read_timeout: 15 # 读超时(秒)
|
||
write_timeout: 30 # 写超时(秒)
|
||
idle_timeout: 120 # 空闲超时(秒)
|
||
shutdown_timeout: 15 # 优雅关机等待(秒)
|
||
|
||
database:
|
||
driver: sqlite # sqlite | mysql
|
||
sqlite:
|
||
path: ./data/app.db
|
||
mysql:
|
||
host: localhost
|
||
port: 3306
|
||
dbname: gotest
|
||
username: root
|
||
password: ""
|
||
auto_migrate: true # 自动建表
|
||
init_data: true # 初始化种子数据
|
||
|
||
jwt:
|
||
secret: change-me-in-production # JWT 密钥
|
||
expire_hours: 720 # Token 过期时间(小时)
|
||
|
||
upload:
|
||
path: ./uploads # 上传目录
|
||
max_size: 10485760 # 最大文件大小(10MB)
|
||
|
||
rate_limit:
|
||
enabled: true
|
||
rps: 10 # 每秒请求数
|
||
burst: 20 # 突发大小
|
||
|
||
env:
|
||
name: dev # dev | prod
|
||
```
|
||
|
||
## 默认账号
|
||
|
||
首次启动时自动创建管理员账号:
|
||
|
||
| 用户名 | 密码 | 角色 |
|
||
|--------|------|------|
|
||
| admin | admin123 | 管理员 |
|
||
|
||
## 中间件链
|
||
|
||
请求处理顺序:
|
||
|
||
```
|
||
请求 → RequestID → Recover → Logger → CORS → RateLimit → [JWTAuth] → [requireAdmin] → Handler
|
||
```
|
||
|
||
## 生产部署建议
|
||
|
||
1. 修改 `config.yaml` 中的 JWT secret
|
||
2. 切换数据库为 MySQL
|
||
3. 设置 `env.name: prod`
|
||
4. 使用 Docker 部署或 Nginx 反向代理
|
||
5. 配置 HTTPS 证书
|
||
6. 定期备份 `data/` 目录
|
||
|
||
## 许可证
|
||
|
||
MIT License
|