# 项目目录结构规范

## 目录结构

```
project-root/
├── .env.example              # 环境变量示例（必须）
├── .gitignore                # Git忽略规则（必须）
├── Makefile                  # 项目构建入口
├── README.md                 # 项目说明
├── go.mod / go.sum          # Go模块定义
├── go.work                   # Go workspace（多模块时）
│
├── bin/                      # 编译产物（二进制、可执行文件）
│   └── *.exe / main          # 禁止提交编译产物
│
├── cmd/                      # 应用入口（每个应用一个子目录）
│   └── server/               # 主服务器入口
│       └── main.go
│
├── internal/                 # 私有内部包（不可被外部导入）
│   ├── api/                  # API层
│   │   ├── handler/          # HTTP Handler
│   │   ├── middleware/       # 中间件
│   │   └── router/          # 路由
│   ├── auth/                 # 认证鉴权
│   ├── cache/                # 缓存
│   ├── config/               # 配置
│   ├── database/             # 数据库
│   ├── domain/               # 领域模型（实体、值对象）
│   ├── repository/           # 数据访问层
│   ├── service/              # 业务逻辑层
│   └── pkg/                  # 内部共享工具包
│       ├── errors/           # 错误定义
│       ├── response/         # 响应封装
│       └── ...
│
├── pkg/                      # 公共外部包（可被外部导入）
│   └── ...                   # 仅当需要作为独立库发布时使用
│
├── configs/                  # 配置文件（JSON/YAML/TOML）
├── deployment/               # 部署配置（Docker/K8s/Compose）
│   ├── docker-compose.yml
│   ├── kubernetes/
│   └── helm/
│
├── docs/                     # 项目文档
│   ├── guides/              # 使用指南
│   ├── design/              # 设计文档
│   ├── code-review/         # 代码审查报告
│   └── specs/               # 规格说明
│
├── frontend/                 # 前端代码
│   └── admin/               # 管理后台前端
│
├── scripts/                  # 脚本（按功能分类）
│   ├── dev/                 # 开发脚本
│   │   ├── run_tests.sh
│   │   └── check_gitea.sh
│   ├── deploy/              # 部署脚本
│   │   └── deploy_*.sh
│   ├── ops/                 # 运维脚本
│   │   └── sre-*.ps1
│   ├── test/                # 测试脚本
│   │   └── test_*.sh
│   └── chaos/               # 混沌工程脚本
│
├── tools/                    # 工具脚本（Python/Shell）
│   ├── db_check.go
│   └── *.py
│
├── data/                     # 运行时数据目录
│   └── *.db                  # SQLite数据库文件
│
├── logs/                     # 日志输出目录
│   └── *.log
│
├── migrations/               # 数据库迁移
│
├── testdata/                 # 测试数据
│
├── uploads/                  # 用户上传文件
│   └── avatars/              # 头像上传
│
└── runtime/                  # 运行时文件（pid/socket）
```

## 命名规范

### 目录命名
- 使用 **小写字母 + 中划线** 或 **小写字母**（无特殊字符）
- 示例：`code-review`, `test-data`, `scripts`

### 文件命名
| 类型 | 规范 | 示例 |
|------|------|------|
| Go源文件 | `snake_case.go` | `user_service.go` |
| 测试文件 | `*_test.go` | `user_service_test.go` |
| 配置文件 | `snake_case.json/yaml/toml` | `database_config.yaml` |
| 脚本文件 | `snake_case.sh/ps1/py` | `check_gitea.sh` |
| Markdown | `snake_case.md` 或 ` kebab-case.md` | `api_design.md` |

## 文件放置规则

### 禁止在根目录放置的文件
- ❌ `*.exe`, `*.dll`, `*.so` （编译产物 → `bin/`）
- ❌ `*_result.txt`, `*_test.txt`, `*_output.log` （临时输出 → 删除）
- ❌ `*.tmp`, `*.log` （运行时文件 → 对应目录）
- ❌ `server.exe`, `ums.exe` （可执行文件 → `bin/`）
- ❌ `upload.json`, `debug.log` （临时文件 → 删除）

### 必须放置根目录的文件
- ✅ `go.mod`, `go.sum` （Go项目标识）
- ✅ `.gitignore` （Git配置）
- ✅ `.env.example` （环境变量模板）

### 脚本放置规则
| 脚本类型 | 放置位置 |
|----------|----------|
| 开发辅助 | `scripts/dev/` |
| 部署相关 | `scripts/deploy/` |
| 运维监控 | `scripts/ops/` |
| 测试相关 | `scripts/test/` |
| 混沌工程 | `scripts/chaos/` |

## .gitignore 规范

```gitignore
# 编译产物
bin/
*.exe
*.dll
*.so

# 运行时数据
*.db
*.log
logs/
data/*.db

# 上传文件
uploads/avatars/*
!uploads/avatars/.gitkeep

# 临时文件
*.tmp
*.temp
*_result.txt
*_test*.txt
*_output.txt

# 环境配置
.env
.env.local

# IDE
.idea/
.vscode/
*.swp

# 系统文件
.DS_Store
Thumbs.db

# Go
.gocache/
.gomodcache/
```

## 新增目录检查清单

添加新目录前，确认：

1. **是否有必要？** 能用现有目录表达吗？
2. **符合命名规范？** 小写字母、中划线分隔
3. **放置位置正确？** 对应到上表的位置
4. **是否需要版本控制？** `data/`、`logs/`、`uploads/` 通常不提交

## 常见错误

| 错误 | 正确做法 |
|------|----------|
| 在根目录放置 `test_output.txt` | 删除或放到 `scripts/test/` |
| 在根目录放置 `server.exe` | 移动到 `bin/` |
| 创建 `internal/utils/` | 使用现有 `internal/pkg/` |
| 创建 `pkg/response/` | 使用 `internal/pkg/response/` |
