v1.8.0: 模块化重构 + 后台登录认证
This commit is contained in:
97
modules/routes/api_items.py
Normal file
97
modules/routes/api_items.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""
|
||||
动态分类数据 API
|
||||
"""
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from flask import Blueprint, request, jsonify
|
||||
from config import DATA_DIR
|
||||
from utils import load_data, save_data, parse_date_to_timestamp
|
||||
|
||||
items_bp = Blueprint('api_items', __name__)
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>')
|
||||
def api_items(category_id):
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
hide_hidden = request.args.get('all', '0') == '0'
|
||||
if hide_hidden:
|
||||
items = [i for i in items if i.get('visible', True)]
|
||||
sort_by = request.args.get('sort', 'default')
|
||||
reverse = request.args.get('order', 'desc') == 'desc'
|
||||
def safe_key(x, key):
|
||||
val = x.get(key)
|
||||
if val is None:
|
||||
return 0 if key in ['price', 'views', 'year'] else ''
|
||||
return val
|
||||
if sort_by == 'default':
|
||||
items = sorted(items, key=lambda x: (
|
||||
not x.get('is_pinned', False),
|
||||
-(parse_date_to_timestamp(x.get('publish_date', '')) or
|
||||
parse_date_to_timestamp(x.get('created_at', '')) or 0)
|
||||
))
|
||||
elif sort_by in ['name', 'price', 'year', 'created_at', 'publish_date', 'views', 'updated_at']:
|
||||
items = sorted(items, key=lambda x: safe_key(x, sort_by), reverse=reverse)
|
||||
return jsonify(items)
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>/<item_id>')
|
||||
def api_item_detail(category_id, item_id):
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
item = next((i for i in items if i['id'] == item_id), None)
|
||||
if not item:
|
||||
return jsonify({'error': 'Item not found'}), 404
|
||||
return jsonify(item)
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>', methods=['POST'])
|
||||
def api_create_item(category_id):
|
||||
data = request.get_json()
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
data['id'] = uuid.uuid4().hex[:12]
|
||||
data['category_id'] = category_id
|
||||
data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
data['visible'] = data.get('visible', True)
|
||||
data['publish_date'] = data.get('publish_date', '')
|
||||
data['views'] = data.get('views', 0)
|
||||
data['is_pinned'] = data.get('is_pinned', False)
|
||||
items.append(data)
|
||||
save_data(items_file, items)
|
||||
return jsonify(data)
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>/<item_id>', methods=['PUT'])
|
||||
def api_update_item(category_id, item_id):
|
||||
data = request.get_json()
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
item = next((i for i in items if i['id'] == item_id), None)
|
||||
if not item:
|
||||
return jsonify({'error': 'Item not found'}), 404
|
||||
item.update(data)
|
||||
item['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
||||
save_data(items_file, items)
|
||||
return jsonify(item)
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>/<item_id>', methods=['DELETE'])
|
||||
def api_delete_item(category_id, item_id):
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
items = [i for i in items if i['id'] != item_id]
|
||||
save_data(items_file, items)
|
||||
return jsonify({'success': True})
|
||||
|
||||
|
||||
@items_bp.route('/api/items/<category_id>/<item_id>/visible', methods=['POST'])
|
||||
def api_toggle_item_visible(category_id, item_id):
|
||||
items_file = DATA_DIR / f'items_{category_id}.json'
|
||||
items = load_data(items_file)
|
||||
item = next((i for i in items if i['id'] == item_id), None)
|
||||
if not item:
|
||||
return jsonify({'error': 'Item not found'}), 404
|
||||
item['visible'] = not item.get('visible', True)
|
||||
save_data(items_file, items)
|
||||
return jsonify({'success': True, 'visible': item['visible']})
|
||||
Reference in New Issue
Block a user