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

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
Binary file not shown.
Binary file not shown.
Binary file not shown.
+62 -1
View File
@@ -2,8 +2,9 @@
CPU CRUD 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 CPUS_FILE
from utils import load_data, save_data, parse_date_to_timestamp
@@ -95,3 +96,63 @@ def api_toggle_cpu_visible(cpu_id):
cpu['visible'] = not cpu.get('visible', True)
save_data(CPUS_FILE, cpus)
return jsonify({'success': True, 'visible': cpu['visible']})
# ─── 导出导入 ───────────────────────────────────────────────────────
@cpus_bp.route('/api/cpus/export', methods=['GET'])
def api_export_cpus():
"""导出所有CPU数据"""
try:
cpus = load_data(CPUS_FILE)
export_data = {
'type': 'cpus',
'items': cpus,
'count': len(cpus),
'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=cpus-export-{datetime.now().strftime("%Y%m%d%H%M%S")}.json'}
)
return response
except Exception as e:
return jsonify({'error': str(e)}), 500
@cpus_bp.route('/api/cpus/import', methods=['GET', 'POST'])
def api_import_cpus():
"""导入CPU数据"""
try:
if request.method == 'GET':
return jsonify({'endpoint': '/api/cpus/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')
cpus = load_data(CPUS_FILE)
imported_items = import_data['items']
result = {'success': True, 'imported': 0, 'updated': 0, 'skipped': []}
for item in imported_items:
existing = next((c for c in cpus if c['id'] == item['id']), None)
if existing:
if mode == 'replace':
existing.update(item)
result['updated'] += 1
else:
result['skipped'].append(item['id'])
else:
cpus.append(item)
result['imported'] += 1
save_data(CPUS_FILE, cpus)
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500
+62 -1
View File
@@ -2,8 +2,9 @@
GPU CRUD 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 GPUS_FILE
from utils import load_data, save_data, parse_date_to_timestamp
@@ -95,3 +96,63 @@ def api_toggle_gpu_visible(gpu_id):
gpu['visible'] = not gpu.get('visible', True)
save_data(GPUS_FILE, gpus)
return jsonify({'success': True, 'visible': gpu['visible']})
# ─── 导出导入 ───────────────────────────────────────────────────────
@gpus_bp.route('/api/gpus/export', methods=['GET'])
def api_export_gpus():
"""导出所有GPU数据"""
try:
gpus = load_data(GPUS_FILE)
export_data = {
'type': 'gpus',
'items': gpus,
'count': len(gpus),
'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=gpus-export-{datetime.now().strftime("%Y%m%d%H%M%S")}.json'}
)
return response
except Exception as e:
return jsonify({'error': str(e)}), 500
@gpus_bp.route('/api/gpus/import', methods=['GET', 'POST'])
def api_import_gpus():
"""导入GPU数据"""
try:
if request.method == 'GET':
return jsonify({'endpoint': '/api/gpus/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')
gpus = load_data(GPUS_FILE)
imported_items = import_data['items']
result = {'success': True, 'imported': 0, 'updated': 0, 'skipped': []}
for item in imported_items:
existing = next((g for g in gpus if g['id'] == item['id']), None)
if existing:
if mode == 'replace':
existing.update(item)
result['updated'] += 1
else:
result['skipped'].append(item['id'])
else:
gpus.append(item)
result['imported'] += 1
save_data(GPUS_FILE, gpus)
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500
+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
+62 -1
View File
@@ -2,8 +2,9 @@
AI模型 CRUD 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 MODELS_FILE
from utils import load_data, save_data, parse_date_to_timestamp, safe_sort_key
@@ -88,3 +89,63 @@ def api_toggle_model_visible(model_id):
model['visible'] = not model.get('visible', True)
save_data(MODELS_FILE, models)
return jsonify({'success': True, 'visible': model['visible']})
# ─── 导出导入 ───────────────────────────────────────────────────────
@models_bp.route('/api/models/export', methods=['GET'])
def api_export_models():
"""导出所有模型数据"""
try:
models = load_data(MODELS_FILE)
export_data = {
'type': 'models',
'items': models,
'count': len(models),
'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=models-export-{datetime.now().strftime("%Y%m%d%H%M%S")}.json'}
)
return response
except Exception as e:
return jsonify({'error': str(e)}), 500
@models_bp.route('/api/models/import', methods=['GET', 'POST'])
def api_import_models():
"""导入模型数据"""
try:
if request.method == 'GET':
return jsonify({'endpoint': '/api/models/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')
models = load_data(MODELS_FILE)
imported_items = import_data['items']
result = {'success': True, 'imported': 0, 'updated': 0, 'skipped': []}
for item in imported_items:
existing = next((m for m in models if m['id'] == item['id']), None)
if existing:
if mode == 'replace':
existing.update(item)
result['updated'] += 1
else:
result['skipped'].append(item['id'])
else:
models.append(item)
result['imported'] += 1
save_data(MODELS_FILE, models)
return jsonify(result)
except Exception as e:
return jsonify({'error': str(e)}), 500