为各类别添加数据导入导出功能

This commit is contained in:
2026-07-11 00:34:47 +08:00
parent f83bf11669
commit 01abe7f86f
10 changed files with 457 additions and 95 deletions
+65 -1
View File
@@ -2,8 +2,9 @@
动态分类数据 API
"""
import uuid
import json
from datetime import datetime
from flask import Blueprint, request, jsonify
from flask import Blueprint, request, jsonify, Response
from config import DATA_DIR
from utils import load_data, save_data, parse_date_to_timestamp
@@ -95,3 +96,66 @@ def api_toggle_item_visible(category_id, item_id):
item['visible'] = not item.get('visible', True)
save_data(items_file, items)
return jsonify({'success': True, 'visible': item['visible']})
# ─── 导出导入 ───────────────────────────────────────────────────────
@items_bp.route('/api/items/<category_id>/export', methods=['GET'])
def api_export_items(category_id):
"""导出指定分类的所有数据"""
try:
items_file = DATA_DIR / f'items_{category_id}.json'
items = load_data(items_file)
export_data = {
'type': 'items',
'category_id': category_id,
'items': items,
'count': len(items),
'export_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'version': '1.0'
}
json_str = json.dumps(export_data, ensure_ascii=False, indent=2)
response = Response(
json_str,
mimetype='application/json',
headers={'Content-Disposition': f'attachment; filename={category_id}-export-{datetime.now().strftime("%Y%m%d%H%M%S")}.json'}
)
return response
except Exception as e:
return jsonify({'error': str(e)}), 500
@items_bp.route('/api/items/<category_id>/import', methods=['GET', 'POST'])
def api_import_items(category_id):
"""导入指定分类的数据"""
try:
if request.method == 'GET':
return jsonify({'endpoint': f'/api/items/{category_id}/import', 'method': 'POST', 'params': {'mode': 'merge 或 replace'}})
import_data = request.get_json()
if not import_data or 'items' not in import_data:
return jsonify({'error': '缺少 items 字段'}), 400
mode = request.args.get('mode', 'merge')
items_file = DATA_DIR / f'items_{category_id}.json'
items = load_data(items_file)
imported_items = import_data['items']
result = {'success': True, 'imported': 0, 'updated': 0, 'skipped': []}
for item in imported_items:
existing = next((i for i in items if i['id'] == item['id']), None)
if existing:
if mode == 'replace':
existing.update(item)
result['updated'] += 1
else:
result['skipped'].append(item['id'])
else:
items.append(item)
result['imported'] += 1
save_data(items_file, items)
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500