|
|
|
|
@ -6,7 +6,7 @@
|
|
|
|
|
from flask import Blueprint, request, jsonify
|
|
|
|
|
from flask_jwt_extended import jwt_required, get_jwt_identity
|
|
|
|
|
from app import db
|
|
|
|
|
from app.database import User, Batch, Image
|
|
|
|
|
from app.database import User, Task, Image
|
|
|
|
|
|
|
|
|
|
admin_bp = Blueprint('admin', __name__)
|
|
|
|
|
|
|
|
|
|
@ -19,7 +19,7 @@ def admin_required(f):
|
|
|
|
|
current_user_id = get_jwt_identity()
|
|
|
|
|
user = User.query.get(current_user_id)
|
|
|
|
|
|
|
|
|
|
if not user or user.role != 'admin':
|
|
|
|
|
if not user or user.role.code != 'admin':
|
|
|
|
|
return jsonify({'error': '需要管理员权限'}), 403
|
|
|
|
|
|
|
|
|
|
return f(*args, **kwargs)
|
|
|
|
|
@ -58,8 +58,11 @@ def get_user_detail(user_id):
|
|
|
|
|
return jsonify({'error': '用户不存在'}), 404
|
|
|
|
|
|
|
|
|
|
# 获取用户统计信息
|
|
|
|
|
total_tasks = Batch.query.filter_by(user_id=user_id).count()
|
|
|
|
|
total_images = Image.query.filter_by(user_id=user_id).count()
|
|
|
|
|
total_tasks = Task.query.filter_by(user_id=user_id).count()
|
|
|
|
|
# 查找用户的所有图片
|
|
|
|
|
user_tasks = Task.query.filter_by(user_id=user_id).all()
|
|
|
|
|
task_ids = [task.task_id for task in user_tasks]
|
|
|
|
|
total_images = Image.query.filter_by(task_id in (task_ids)).count()
|
|
|
|
|
|
|
|
|
|
user_dict = user.to_dict()
|
|
|
|
|
user_dict['stats'] = {
|
|
|
|
|
@ -82,8 +85,15 @@ def create_user():
|
|
|
|
|
username = data.get('username')
|
|
|
|
|
password = data.get('password')
|
|
|
|
|
email = data.get('email')
|
|
|
|
|
role = data.get('role', 'user')
|
|
|
|
|
max_concurrent_tasks = data.get('max_concurrent_tasks', 0)
|
|
|
|
|
|
|
|
|
|
current_user_id = get_jwt_identity()
|
|
|
|
|
current_user = User.query.get(current_user_id)
|
|
|
|
|
current_user_role = current_user.role.code
|
|
|
|
|
if current_user.role == 'admin':
|
|
|
|
|
role = data.get('role', 'user')
|
|
|
|
|
else:
|
|
|
|
|
role = 'user'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not username or not password:
|
|
|
|
|
return jsonify({'error': '用户名和密码不能为空'}), 400
|
|
|
|
|
@ -100,8 +110,7 @@ def create_user():
|
|
|
|
|
user = User(
|
|
|
|
|
username=username,
|
|
|
|
|
email=email,
|
|
|
|
|
role=role,
|
|
|
|
|
max_concurrent_tasks=max_concurrent_tasks
|
|
|
|
|
role_id=User.role_to_id(role),
|
|
|
|
|
)
|
|
|
|
|
user.set_password(password)
|
|
|
|
|
|
|
|
|
|
@ -145,10 +154,7 @@ def update_user(user_id):
|
|
|
|
|
user.email = new_email
|
|
|
|
|
|
|
|
|
|
if 'role' in data:
|
|
|
|
|
user.role = data['role']
|
|
|
|
|
|
|
|
|
|
if 'max_concurrent_tasks' in data:
|
|
|
|
|
user.max_concurrent_tasks = data['max_concurrent_tasks']
|
|
|
|
|
user.role = user.role_to_id(data['role'])
|
|
|
|
|
|
|
|
|
|
if 'is_active' in data:
|
|
|
|
|
user.is_active = bool(data['is_active'])
|
|
|
|
|
@ -166,7 +172,7 @@ def update_user(user_id):
|
|
|
|
|
except Exception as e:
|
|
|
|
|
db.session.rollback()
|
|
|
|
|
return jsonify({'error': f'更新用户失败: {str(e)}'}), 500
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@admin_bp.route('/users/<int:user_id>', methods=['DELETE'])
|
|
|
|
|
@jwt_required()
|
|
|
|
|
@admin_required
|
|
|
|
|
@ -202,16 +208,16 @@ def get_system_stats():
|
|
|
|
|
from app.database import EvaluationResult
|
|
|
|
|
|
|
|
|
|
total_users = User.query.count()
|
|
|
|
|
active_users = User.query.filter_by(is_active=True).count()
|
|
|
|
|
admin_users = User.query.filter_by(role='admin').count()
|
|
|
|
|
active_users = User.query.filter_by(is_active = True).count()
|
|
|
|
|
admin_users = User.query.filter_by(role_id = 0).count()
|
|
|
|
|
|
|
|
|
|
total_tasks = Batch.query.count()
|
|
|
|
|
completed_tasks = Batch.query.filter_by(status='completed').count()
|
|
|
|
|
processing_tasks = Batch.query.filter_by(status='processing').count()
|
|
|
|
|
failed_tasks = Batch.query.filter_by(status='failed').count()
|
|
|
|
|
total_tasks = Task.query.count()
|
|
|
|
|
completed_tasks = Task.query.filter_by(status='completed').count()
|
|
|
|
|
processing_tasks = Task.query.filter_by(status='processing').count()
|
|
|
|
|
failed_tasks = Task.query.filter_by(status='failed').count()
|
|
|
|
|
waiting_tasks = Task.query.filter_by(status='waiting').count()
|
|
|
|
|
|
|
|
|
|
total_images = Image.query.count()
|
|
|
|
|
total_evaluations = EvaluationResult.query.count()
|
|
|
|
|
|
|
|
|
|
return jsonify({
|
|
|
|
|
'stats': {
|
|
|
|
|
@ -225,12 +231,10 @@ def get_system_stats():
|
|
|
|
|
'completed': completed_tasks,
|
|
|
|
|
'processing': processing_tasks,
|
|
|
|
|
'failed': failed_tasks
|
|
|
|
|
'waiting': waiting_tasks
|
|
|
|
|
},
|
|
|
|
|
'images': {
|
|
|
|
|
'total': total_images
|
|
|
|
|
},
|
|
|
|
|
'evaluations': {
|
|
|
|
|
'total': total_evaluations
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}), 200
|
|
|
|
|
|