Skip to content

Commit 2704dec

Browse files
committed
支持数据导入导出
1 parent 1ee1c23 commit 2704dec

9 files changed

Lines changed: 789 additions & 6 deletions

File tree

IMPORT_EXPORT_FEATURE.md

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
# 数据导入导出功能说明
2+
3+
## 功能概述
4+
5+
新增了完整的数据导入导出功能,支持用户在不同环境间迁移数据,包括:
6+
- 通知任务
7+
- 通知渠道配置
8+
- 外部日历订阅
9+
10+
## 安全特性
11+
12+
### 敏感数据加密
13+
导出时自动加密以下敏感字段:
14+
- `webhook_url` - Webhook URLs(包含密钥)
15+
- `token` - API tokens
16+
- `app_secret` - 应用密钥
17+
- `corp_secret` - 企业密钥
18+
- `corpid` - 企业 ID
19+
- `agentid` - 应用 ID
20+
- `app_id` - App ID
21+
- `receiver_id` - 接收者 ID
22+
- `sendkey` - 发送密钥
23+
- `server_url` - 服务器地址(可能包含认证信息)
24+
- `username` - 用户名
25+
- `password` - 密码
26+
27+
### 加密实现
28+
- **算法**: Fernet (AES-128-CBC + HMAC)
29+
- **密钥派生**: HKDF-SHA256 从应用 SECRET_KEY 派生
30+
- **版本标识**: 支持未来密钥轮换和格式升级
31+
32+
## 使用方法
33+
34+
### 导出数据
35+
1. 点击顶部工具栏的 "📤 导出" 按钮
36+
2. 自动下载 JSON 文件(文件名包含时间戳)
37+
3. 文件包含加密的敏感配置
38+
39+
### 导入数据
40+
1. 点击顶部工具栏的 "📥 导入" 按钮
41+
2. 选择之前导出的 JSON 文件
42+
3. 查看导入预览(任务数、通道数、日历数)
43+
4. 确认后执行导入
44+
5. 查看导入统计(成功/跳过数量)
45+
46+
### 导入策略
47+
**合并模式(跳过重复)**:
48+
- **任务**: 通过 `title` + `scheduled_time`(定时任务)或 `title` + `cron_expression`(周期任务)检测重复
49+
- **通道**: 通过 `channel_name` 检测重复
50+
- **日历**: 通过 `name` 检测重复
51+
- 已存在的项将被跳过,不会覆盖
52+
53+
## API 端点
54+
55+
### GET /api/export
56+
导出当前用户的所有数据
57+
58+
**响应格式**:
59+
```json
60+
{
61+
"version": "1.0",
62+
"export_date": "2025-12-23T10:30:00",
63+
"user": {
64+
"username": "user1",
65+
"email": "user@example.com"
66+
},
67+
"tasks": [...],
68+
"user_channels": [...],
69+
"external_calendars": [...]
70+
}
71+
```
72+
73+
### POST /api/import
74+
导入用户数据(合并模式)
75+
76+
**请求体**: 导出的 JSON 数据
77+
78+
**响应**:
79+
```json
80+
{
81+
"message": "导入成功",
82+
"stats": {
83+
"tasks_imported": 5,
84+
"tasks_skipped": 2,
85+
"channels_imported": 3,
86+
"channels_skipped": 1,
87+
"calendars_imported": 2,
88+
"calendars_skipped": 0
89+
}
90+
}
91+
```
92+
93+
## 技术实现
94+
95+
### 后端
96+
- **文件**: `encryption.py` - 加密工具模块
97+
- **依赖**: `cryptography>=41.0.0`
98+
- **端点**: `/api/export`, `/api/import`
99+
100+
### 前端
101+
- **HTML**: 导入/导出按钮(`static/index.html`
102+
- **JS**: `exportData()`, `importData()` 函数(`static/js/app.js`
103+
- **CSS**: 渐变按钮样式(`static/css/styles.css`
104+
105+
## 注意事项
106+
107+
1. **密钥一致性**: 导入数据必须使用相同的 `SECRET_KEY`,否则无法解密
108+
2. **数据备份**: 建议定期导出数据作为备份
109+
3. **跨用户**: 数据导入到当前登录用户,不支持跨用户导入
110+
4. **任务调度**: 导入的待发送任务会自动加入调度器
111+
5. **文件格式**: 仅支持 JSON 格式
112+
113+
## 未来增强
114+
115+
- [ ] 支持选择性导出(按日期范围、状态筛选)
116+
- [ ] 支持 CSV 格式导出(简化版)
117+
- [ ] 批量导入验证报告
118+
- [ ] 导入冲突解决策略选择(替换/合并/追加)
119+
- [ ] 压缩大文件导出

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,9 +243,9 @@ A: 在 `notifier.py` 中添加新的发送方法,并在 `models.py` 中添加
243243
- [x] 日历订阅及同步功能
244244
- [x] 支持多渠道消息推送
245245
- [x] 重复任务暂停功能
246+
- [x] 数据导入/导出
246247
- [ ] 失败自动重试
247248
- [ ] 脚本运行
248-
- [ ] 数据导入/导出
249249

250250
## License
251251

0 commit comments

Comments
 (0)