Files
2025-12-14 15:40:49 +08:00

114 lines
3.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""管理员相关路由"""
from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from models import User
from services.admin_service import AdminService
admin_bp = Blueprint('admin', __name__)
def admin_required():
"""管理员权限验证装饰器"""
current_user_id = get_jwt_identity()
user = User.query.get(current_user_id)
if not user or not user.is_admin:
return None
return user
@admin_bp.route('/users', methods=['GET'])
@jwt_required()
def get_users():
"""获取用户列表"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
# 分页参数
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
search = request.args.get('search', '')
result, status_code = AdminService.get_users(page, per_page, search)
return jsonify(result), status_code
@admin_bp.route('/users/<int:user_id>', methods=['GET'])
@jwt_required()
def get_user_detail(user_id):
"""获取用户详情"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
result, status_code = AdminService.get_user_detail(user_id)
return jsonify(result), status_code
@admin_bp.route('/users/<int:user_id>/toggle-status', methods=['POST'])
@jwt_required()
def toggle_user_status(user_id):
"""启用/禁用用户"""
admin = admin_required()
if not admin:
return jsonify({'error': '需要管理员权限'}), 403
result, status_code = AdminService.toggle_user_status(admin.id, user_id)
return jsonify(result), status_code
@admin_bp.route('/users/<int:user_id>/adjust-balance', methods=['POST'])
@jwt_required()
def adjust_balance(user_id):
"""调整用户余额"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
data = request.get_json()
result, status_code = AdminService.adjust_balance(user_id, data)
return jsonify(result), status_code
@admin_bp.route('/orders', methods=['GET'])
@jwt_required()
def get_all_orders():
"""获取所有订单"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
status = request.args.get('status')
result, status_code = AdminService.get_all_orders(page, per_page, status)
return jsonify(result), status_code
@admin_bp.route('/api-calls', methods=['GET'])
@jwt_required()
def get_all_api_calls():
"""获取所有API调用记录"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
status = request.args.get('status')
result, status_code = AdminService.get_all_api_calls(page, per_page, status)
return jsonify(result), status_code
@admin_bp.route('/stats/overview', methods=['GET'])
@jwt_required()
def get_overview_stats():
"""获取总览统计"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
result, status_code = AdminService.get_overview_stats()
return jsonify(result), status_code
@admin_bp.route('/stats/chart', methods=['GET'])
@jwt_required()
def get_chart_data():
"""获取图表数据最近7天"""
if not admin_required():
return jsonify({'error': '需要管理员权限'}), 403
days = request.args.get('days', 7, type=int)
result, status_code = AdminService.get_chart_data(days)
return jsonify(result), status_code