diff --git a/README.md b/README.md index ff410ff..e28f547 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,403 @@ -# gotest +# Gotest 多站点管理系统 -#### 介绍 -Go ??????? - Gin + GORM + SQLite,18????? + ???? +基于 **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 一键部署 -#### 安装教程 +## 技术栈 -1. xxxx -2. xxxx -3. xxxx +| 组件 | 技术 | 版本 | +|------|------|------| +| 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 | -#### 使用说明 +## 项目结构 -1. xxxx -2. xxxx -3. xxxx +``` +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 # 共享资源目录 +``` -#### 参与贡献 +## 快速开始 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +### 环境要求 +- Go 1.21+ +- (可选) Docker & Docker Compose -#### 特技 +### 方式一:本地编译运行 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +```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