为各类别添加数据导入导出功能
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user