# 艺考招生管理系统 API

基于 Go + Gin + GORM + Redis 的 RESTful API 服务。

## 技术栈

- Go 1.21+
- Gin (Web框架)
- GORM (ORM框架)
- MySQL 8.0
- Redis (会话存储/限流)
- Swaggo (API文档)

## 项目结构

```
server/
├── main.go
├── config/
│   ├── config.go           # 应用配置 (日志/安全/限流)
│   ├── database.go         # MySQL配置
│   └── redis.go            # Redis配置
├── common/
│   ├── response.go         # 统一响应
│   ├── context.go          # 上下文工具
│   ├── logger.go           # 日志工具
│   └── password.go         # 密码加密 (PBE)
├── middleware/
│   ├── auth.go             # 登录鉴权
│   ├── security.go         # 安全校验 (防暴力入侵)
│   └── ratelimit.go        # 接口限流
├── modules/
│   ├── system/             # 系统模块
│   └── yx/                 # 艺考模块
├── logs/                   # 日志目录
│   └── 2025-12-17-1.html   # HTML格式日志
└── docs/                   # Swagger文档
```

## 快速开始

```bash
cd server
go mod tidy
swag init
go run main.go
```

## 配置说明

修改 `config/config.go`:

```go
var AppConfig = &appConfig{
    // 日志配置
    Log: LogConfig{
        Level:   "debug",  // debug/info/warn/error
        Dir:     "logs",   // 日志目录
        Console: true,     // 是否输出到控制台
    },
    // 安全配置
    Security: SecurityConfig{
        Enable:    true,              // 是否启用
        HeaderKey: "X-App-Sign",      // 签名字段
        SecretKey: "yts@2025#secure", // 签名密钥
    },
    // 限流配置
    RateLimit: RateLimitConfig{
        Enable:  true,
        Default: RateLimitRule{Interval: 2, MaxRequests: 1}, // 默认2秒1次
        Rules: map[string]RateLimitRule{
            "/api/auth/login": {Interval: 5, MaxRequests: 1}, // 登录5秒1次
        },
    },
}
```

## 功能说明

### 1. 日志系统

- 支持 debug/info/warn/error 级别
- 输出到 HTML 文件，按日期和启动次数命名
- 可配置是否同时输出到控制台

```go
common.Debug("调试信息: %s", msg)
common.Info("普通信息: %s", msg)
common.Warn("警告信息: %s", msg)
common.LogError("错误信息: %s", msg)
```

### 2. 安全校验 (防暴力入侵)

请求头需携带签名:
```
X-App-Sign: MD5(timestamp + secretKey)
X-App-Timestamp: 毫秒时间戳
```

前端签名示例 (JavaScript):
```javascript
const timestamp = Date.now().toString();
const sign = md5(timestamp + 'yts@2025#secure');

fetch('/api/xxx', {
    headers: {
        'X-App-Sign': sign,
        'X-App-Timestamp': timestamp,
        'Authorization': 'Bearer ' + token
    }
});
```

### 3. 接口限流

- 基于 Redis 滑动窗口算法
- 支持按用户ID或IP限流
- 不同接口可配置不同规则

默认规则: 2秒1次
超过限制返回: `{"code": 429, "message": "操作过快，请稍后再试"}`

配置示例:
```go
Rules: map[string]RateLimitRule{
    "/api/auth/login":       {Interval: 5, MaxRequests: 1},  // 5秒1次
    "/api/yx-school-majors": {Interval: 1, MaxRequests: 5},  // 1秒5次
}
```

## 中间件执行顺序

```
请求 -> 安全校验 -> 限流 -> 登录鉴权 -> Controller
```

## 白名单配置

```go
// 安全校验白名单
middleware.AddSecurityWhitelist("/api/public/xxx")

// 限流白名单
middleware.AddRateLimitWhitelist("/api/public/xxx")

// 登录鉴权白名单
middleware.AddWhiteList("/api/public/xxx")
```

## API 接口

### 认证
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /api/auth/login | 登录 |
| POST | /api/auth/logout | 登出 |
| GET | /api/auth/info | 获取当前用户 |

### 用户管理 `/api/sys-users`
### 院校专业 `/api/yx-school-majors`
### 历年招生 `/api/yx-history-enrolls`
### 计算专业 `/api/yx-calculation-majors`

## 日志文件示例

日志以 HTML 格式保存，支持浏览器直接打开查看:

```
logs/
├── 2025-12-17-1.html  # 第1次启动
├── 2025-12-17-2.html  # 第2次启动
└── 2025-12-18-1.html  # 新的一天
```
