diff --git a/modules/routes/api_pin.py b/modules/routes/api_pin.py new file mode 100644 index 0000000..009fefa --- /dev/null +++ b/modules/routes/api_pin.py @@ -0,0 +1,66 @@ +""" +置顶和热度 API +""" +from flask import Blueprint, request, jsonify +from config import MODELS_FILE, GPUS_FILE, CPUS_FILE, DATA_DIR +from utils import load_data, save_data + +pin_bp = Blueprint('api_pin', __name__) + + +def _toggle_pin(file_path, item_id, entity_name): + items = load_data(file_path) + item = next((i for i in items if i['id'] == item_id), None) + if not item: + return jsonify({'error': f'{entity_name} not found'}), 404 + item['is_pinned'] = not item.get('is_pinned', False) + save_data(file_path, items) + return jsonify({'success': True, 'is_pinned': item['is_pinned']}) + + +def _add_view(file_path, item_id, entity_name): + items = load_data(file_path) + item = next((i for i in items if i['id'] == item_id), None) + if not item: + return jsonify({'error': f'{entity_name} not found'}), 404 + item['views'] = item.get('views', 0) + 1 + save_data(file_path, items) + return jsonify({'success': True, 'views': item['views']}) + + +# ---- Pin routes ---- +@pin_bp.route('/api/models//pin', methods=['POST']) +def api_toggle_model_pin(model_id): + return _toggle_pin(MODELS_FILE, model_id, 'Model') + +@pin_bp.route('/api/gpus//pin', methods=['POST']) +def api_toggle_gpu_pin(gpu_id): + return _toggle_pin(GPUS_FILE, gpu_id, 'GPU') + +@pin_bp.route('/api/cpus//pin', methods=['POST']) +def api_toggle_cpu_pin(cpu_id): + return _toggle_pin(CPUS_FILE, cpu_id, 'CPU') + +@pin_bp.route('/api/items///pin', methods=['POST']) +def api_toggle_item_pin(category_id, item_id): + items_file = DATA_DIR / f'items_{category_id}.json' + return _toggle_pin(items_file, item_id, 'Item') + + +# ---- View routes ---- +@pin_bp.route('/api/models//view', methods=['POST']) +def api_model_view(model_id): + return _add_view(MODELS_FILE, model_id, 'Model') + +@pin_bp.route('/api/gpus//view', methods=['POST']) +def api_gpu_view(gpu_id): + return _add_view(GPUS_FILE, gpu_id, 'GPU') + +@pin_bp.route('/api/cpus//view', methods=['POST']) +def api_cpu_view(cpu_id): + return _add_view(CPUS_FILE, cpu_id, 'CPU') + +@pin_bp.route('/api/items///view', methods=['POST']) +def api_item_view(category_id, item_id): + items_file = DATA_DIR / f'items_{category_id}.json' + return _add_view(items_file, item_id, 'Item')