|
| 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 | +- [ ] 压缩大文件导出 |
0 commit comments