Files
web_template/README.md
2026-07-10 10:08:09 +00:00

404 lines
15 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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