# 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