File size: 6,909 Bytes
8704848
 
 
 
 
 
 
 
 
 
954be92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f1571b
 
 
954be92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f1571b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
954be92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8f1571b
 
 
 
 
 
 
 
 
 
 
 
 
954be92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
---
title: Exchange Rates Service
emoji: 💱
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
---

# 💱 汇率换算服务

基于 Python + FastAPI 开发的实时汇率换算服务,支持多 API Key 轮询、数据缓存、实时换算等功能。

## ✨ 功能特性

- 🔄 **多 API Key 轮询** - 支持配置多个 API Key,自动轮询切换,防止单个 Key 超限
- 💾 **智能缓存** - 定时任务自动更新汇率数据,避免频繁请求 API
- 🌍 **161 种货币** - 支持全球 161 种货币的汇率查询和换算
- 💱 **实时换算** - 前端页面支持实时输入实时计算,用户体验流畅
- 🎨 **美观界面** - 响应式设计,支持搜索过滤,常用货币优先展示
- 📊 **RESTful API** - 提供完整的 API 接口,支持第三方集成

## 🛠️ 技术栈

- **后端**: Python 3.9+, FastAPI, Uvicorn
- **定时任务**: APScheduler
- **HTTP 客户端**: httpx
- **数据验证**: Pydantic
- **日志**: Loguru
- **前端**: 原生 HTML/CSS/JavaScript

## 📁 项目结构

```
exchangeRates/
├── app/
│   ├── __init__.py
│   ├── main.py                 # FastAPI 应用入口
│   ├── config.py               # 配置管理
│   ├── models.py               # 数据模型
│   ├── api/
│   │   ├── __init__.py
│   │   └── routes.py           # API 路由
│   ├── services/
│   │   ├── __init__.py
│   │   ├── exchange_service.py # 汇率服务核心
│   │   └── scheduler.py        # 定时任务
│   └── utils/
│       ├── __init__.py
│       ├── logger.py           # 日志工具
│       └── currency_names.py   # 货币名称映射
├── static/
│   ├── css/
│   │   └── style.css           # 样式文件
│   └── js/
│       └── app.js              # 前端交互
├── templates/
│   └── index.html              # 前端页面
├── .env                        # 环境变量配置
├── .env.example                # 环境变量示例
├── requirements.txt            # Python 依赖
├── run.py                      # 启动脚本
└── README.md                   # 项目说明
```

## 🚀 快速开始

### 本地部署

#### 1. 克隆项目

```bash
cd C:\Users\Eleven\Desktop\exchangeRates
```

### 2. 创建虚拟环境

```bash
python -m venv .venv
.venv\Scripts\activate
```

### 3. 安装依赖

```bash
pip install -r requirements.txt
```

### 4. 配置环境变量

编辑 `.env` 文件,配置你的 API Key:

```env
# 多个 API Key 用逗号分隔
API_KEYS=your_api_key_1,your_api_key_2

# 基准货币
BASE_CURRENCY=CNY

# 缓存更新间隔(秒)
CACHE_UPDATE_INTERVAL=3600
```

### 5. 启动服务

```bash
python run.py
```

或者使用 uvicorn 直接启动:

```bash
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```

### 6. 访问服务

- 🌐 **首页**: http://localhost:8000
- 📚 **API 文档**: http://localhost:8000/docs
- 📖 **ReDoc**: http://localhost:8000/redoc

### Hugging Face Spaces 部署

本项目支持一键部署到 Hugging Face Spaces。

#### 1. 创建 README.md 头部配置

在项目根目录的 README.md 文件顶部添加以下 YAML 配置:

```yaml
---
title: Exchange Rates Service
emoji: 💱
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
---
```

#### 2. 创建 Dockerfile

项目需要包含 Dockerfile 用于 Spaces 部署:

```dockerfile
FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 7860

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]
```

#### 3. 配置环境变量

在 Hugging Face Spaces 设置中添加 Secrets:
- `API_KEYS`: 你的 ExchangeRate-API Keys(逗号分隔)
- `BASE_CURRENCY`: 基准货币(默认 CNY)
- `CACHE_UPDATE_INTERVAL`: 缓存更新间隔(默认 3600)

#### 4. 部署步骤

1. 在 [Hugging Face](https://huggingface.co/) 创建新的 Space
2. 选择 Docker SDK
3. 上传项目文件或连接 Git 仓库
4. 在 Settings 中配置 Secrets
5. Space 将自动构建和部署

#### 5. 访问服务

部署成功后,可通过 `https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME` 访问服务。

## 📡 API 接口

### 获取所有汇率

```http
GET /api/rates
```

响应示例:
```json
{
  "success": true,
  "base_currency": "CNY",
  "rates": {
    "USD": 0.1413,
    "EUR": 0.1212,
    ...
  },
  "last_update": "Fri, 05 Dec 2025 00:00:01 +0000",
  "cached_at": "2025-12-05T10:30:00",
  "currencies_count": 161
}
```

### 获取特定货币汇率

```http
GET /api/rates/{currency}
```

示例:`GET /api/rates/USD`

### 货币换算

```http
POST /api/convert
Content-Type: application/json

{
  "from_currency": "USD",
  "to_currency": "CNY",
  "amount": 100
}
```

或使用 GET 方式:

```http
GET /api/convert/USD/CNY?amount=100
```

### 批量换算

```http
POST /api/batch-convert
Content-Type: application/json

{
  "base_currency": "USD",
  "amount": 100
}
```

或使用 GET 方式:

```http
GET /api/batch-convert/USD?amount=100
```

### 获取货币列表

```http
GET /api/currencies
```

### 服务状态

```http
GET /api/status
```

### 强制刷新缓存

```http
POST /api/refresh
```

## ⚙️ 配置说明

| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| API_KEYS | API Key 列表(逗号分隔) | - |
| BASE_CURRENCY | 基准货币 | CNY |
| CACHE_UPDATE_INTERVAL | 缓存更新间隔(秒) | 3600 |
| REQUEST_TIMEOUT | 请求超时时间(秒) | 10 |
| MAX_RETRIES | 最大重试次数 | 3 |
| SERVER_PORT | 服务端口 | 8000 |

### Hugging Face Spaces 配置参数

| 参数 | 说明 | 示例值 |
|------|------|--------|
| sdk | SDK 类型 | docker |
| app_port | 应用端口(Spaces 默认 7860) | 7860 |
| title | Space 标题 | Exchange Rates Service |
| emoji | Space 图标 | 💱 |
| colorFrom | 渐变起始色 | blue |
| colorTo | 渐变结束色 | green |
| pinned | 是否固定在个人主页 | false |
| license | 开源协议 | mit |

## 🔑 API Key 获取

1. 访问 [ExchangeRate-API](https://www.exchangerate-api.com/)
2. 注册账号(免费版每月 1500 次请求)
3. 获取 API Key
4. 配置到 `.env` 文件中

建议配置 3-5 个 API Key 以实现轮询,避免单个 Key 超限。

## 📝 注意事项

1. **API 限制**: 免费版 API 每月 1500 次请求,请合理设置缓存更新间隔
2. **缓存策略**: 汇率数据每日更新一次(UTC 00:00),建议缓存间隔设为 1 小时
3. **Key 管理**: 系统自动管理 Key 状态,失败的 Key 会进入冷却期
4. **错误处理**: API 请求失败时会自动重试并切换 Key

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📄 许可证

MIT License