This commit is contained in:
toom1996
2026-09-17 22:51:00 +08:00
parent 766c691eb3
commit f7ae917603
33 changed files with 8181 additions and 3094 deletions

View File

@ -1,6 +1,6 @@
# Fashion API
秀场 / 品牌档案对外只读 API 服务(Go + Gin + GORM/MySQL)。
秀场 / 品牌档案对外只读 API 服务(Go + Gin + GORM/PostgreSQL)。
本项目是从原 `admin/backend`(后台管理接口)中**剥离对外只读接口**后独立出的服务,
专门服务于前端项目 `test/test`(`D:\project\test\test`)。它只保留前端实际调用的公开接口,
@ -53,11 +53,11 @@
```
cmd/ 组合根(Composition Root):只做依赖装配,不含业务逻辑
server/ 启动 HTTP 服务
migrate/ 独立结构迁移命令
dbtool/ 跨环境数据搬运(dump/import)
internal/ 业务代码(不对外暴露)
config/ 配置加载(yml + 环境变量覆盖 + 默认值)
model/ 实体定义(gorm tag + json tag,PasswordHash 永不出参)
database/ MySQL 连接池 / 迁移
database/ PostgreSQL 连接池 / 自动迁移(AutoMigrate)
repository/ 数据访问(接口 + GORM 实现,查询条件用 Scope 安全组合)
service/ 业务逻辑(JWT 签发、密码哈希、参数归一化、聚合)
dto/ 请求/响应结构体与边界常量
@ -75,8 +75,8 @@ internal/ 业务代码(不对外暴露)
避免原项目“复用同一个 `*gorm.DB` 实例导致 WHERE 串味”的隐患。
- **排序字段白名单**:`orderBy` 只允许白名单内的值,杜绝 SQL 注入。
- **配置统一收敛到 yml**:见第 3 节。
- **迁移从启动流程剥离**:`auto_migrate` 默认 `false`,改用独立 `cmd/migrate` 命令显式执行,
避免每次启动都对 `brand_runway_images`(89 万行)等大表隐式 `ALTER TABLE`。
- **表结构由 GORM AutoMigrate 托管**:服务启动时幂等创建/更新全部表(替代原 `scripts/sql`、`db/migrations` 下的手写 MySQL 迁移脚本),
跨环境数据搬运经 `cmd/dbtool`(dump/import)。如需避免大表启动期加列,可在部署流程中先行 `dbtool import` 建好结构。
- **修复原项目配置隐患**:原 `admin/backend` 代码只读 `DB_PASS`,而 docker-compose 注入的是
`DB_PASSWORD`,二者不一致;本项目同时兼容 `DB_PASSWORD` 与 `DB_PASS`,`DB_PASSWORD` 优先。
@ -101,7 +101,7 @@ internal/ 业务代码(不对外暴露)
| `GIN_MODE` | server.mode |
| `DB_HOST` / `DB_PORT` / `DB_USER` / `DB_NAME` | 数据库连接 |
| `DB_PASSWORD`(或 `DB_PASS`) | database.password |
| `DB_LOG_LEVEL` / `DB_AUTO_MIGRATE` | GORM 日志 / 自动迁移开关 |
| `DB_LOG_LEVEL` | GORM 日志级别 |
| `JWT_SECRET` / `JWT_EXPIRE_HOURS` | 令牌密钥 / 有效期 |
| `UPLOAD_DIR` / `UPLOAD_URL_PREFIX` | 静态资源目录 / 前缀 |
| `CONFIG_PATH` | 显式指定配置文件路径(优先级高于 `-config` 参数) |
@ -118,24 +118,26 @@ internal/ 业务代码(不对外暴露)
### 前置要求
- Go 1.26+
- MySQL 8.x(本项目对接 WSL 1Panel 本地库:`127.0.0.1:3306`,库名 `db`,账号 `root/root`)
- PostgreSQL 16(+ pgvector,见 `scripts/pgvector` 的 Docker 一键起库):`127.0.0.1:5432`,库名 `fashion`,账号 `fashion/fashion_dev_2026`
### 构建
```bash
# 两个可执行文件:server(API 服务)与 migrate(结构迁移)
# 主服务
go build -o bin/server ./cmd/server
go build -o bin/migrate ./cmd/migrate
# 跨环境数据搬运工具(dump / import)
go build -o bin/dbtool ./cmd/dbtool
```
### 数据库迁移(可选,首次部署时执行一次)
### 数据库迁移(结构自动创建)
迁移默认**不**随服务启动执行(`auto_migrate: false`)。需建表/加字段时:
表结构**随服务启动自动执行** GORM AutoMigrate(幂等,仅增量变更,不重建已有表)。
跨环境搬运全库数据(结构 + 数据)用 dbtool:
```bash
./bin/migrate # 读取 configs/config.yml
# 或指定配置文件
./bin/migrate -config /path/to/config.yml
go run ./cmd/dbtool dump -out db_dump.json # 导出当前库
go run ./cmd/dbtool import -in db_dump.json # 在目标环境重建并回灌
go run ./cmd/dbtool import -in db_dump.json -data-only # 仅导数据(结构已由 AutoMigrate 建好)
```
### 启动服务
@ -228,11 +230,11 @@ backend/
│ └── config.yml # 唯一配置源
├── cmd/
│ ├── server/main.go # 组合根:启动 HTTP 服务 + 优雅关闭
│ └── migrate/main.go # 组合根:独立结构迁移
│ └── dbtool/main.go # 组合根:跨环境数据搬运(dump/import)
├── internal/
│ ├── config/ # 配置加载(yml + env + 默认值)
│ ├── model/ # 实体(brand / runway / runway_image / user)
│ ├── database/ # MySQL 连接池 + 迁移
│ ├── database/ # PostgreSQL 连接池 + 自动迁移
│ ├── repository/ # 数据访问(接口 + GORM 实现)
│ ├── service/ # 业务逻辑
│ ├── dto/ # 请求/响应结构体与边界常量