diff --git a/src/backend/app/controllers/admin_controller.py b/src/backend/app/controllers/admin_controller.py index aca0c8e..e9893f2 100644 --- a/src/backend/app/controllers/admin_controller.py +++ b/src/backend/app/controllers/admin_controller.py @@ -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/', 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 diff --git a/src/backend/app/controllers/demo_controller.py b/src/backend/app/controllers/demo_controller.py index 949f8a7..fba7c97 100644 --- a/src/backend/app/controllers/demo_controller.py +++ b/src/backend/app/controllers/demo_controller.py @@ -5,7 +5,7 @@ from flask import Blueprint, send_file, jsonify, current_app from flask_jwt_extended import jwt_required -from app.database import PerturbationConfig, FinetuneConfig +from app.database import Perturbation, Finetune import os import glob @@ -20,7 +20,7 @@ def list_demo_images(): # 获取演示原始图片 - 修正路径构建 # 获取项目根目录(backend目录) project_root = os.path.dirname(current_app.root_path) - original_folder = os.path.join(project_root, current_app.config['DEMO_ORIGINAL_FOLDER']) + original_folder = os.path.join(project_root, current_au6pp.config['DEMO_ORIGINAL_FOLDER']) if os.path.exists(original_folder): original_files = glob.glob(os.path.join(original_folder, '*')) diff --git a/src/backend/app/database/__init__.py b/src/backend/app/database/__init__.py index b17c250..d69d9a6 100644 --- a/src/backend/app/database/__init__.py +++ b/src/backend/app/database/__init__.py @@ -17,6 +17,7 @@ class Role(db.Model): __tablename__ = 'role' role_id = db.Column(Integer, primary_key=True, comment='角色ID') + role_code = db.Column(String(50), unique=True, nullable=False, comment='角色代码 (e.g., admin, vip, user)') name = db.Column(String(50), nullable=False, comment='角色名称 (e.g., Administrator, VIP, User)') max_concurrent_tasks = db.Column(Integer, default=1, comment='最大并发任务数') description = db.Column(Text, comment='角色描述') @@ -53,6 +54,27 @@ class User(db.Model): """验证密码""" return check_password_hash(self.password_hash, password) + def to_dict(self): + """转换为字典形式,便于序列化""" + return { + 'user_id': self.user_id, + 'username': self.username, + 'email': self.email, + 'role': self.role.name, + 'is_active': self.is_active, + 'created_at': self.created_at.isoformat(), + 'updated_at': self.updated_at.isoformat() + } + + def role_to_id(self, role): + """将角色名称转换为角色ID""" + role_map = { + 'admin': 1, + 'vip': 2, + 'user': 3 + } + return role_map.get(role, 3) # 默认返回普通用户ID + def __repr__(self): return f'' diff --git a/src/backend/init_db.py b/src/backend/init_db.py index 1507886..611e415 100644 --- a/src/backend/init_db.py +++ b/src/backend/init_db.py @@ -27,8 +27,8 @@ def init_database(): # 初始化任务状态数据 task_status = [ - {'status_code': 'pending', 'status_name': '待处理', 'description': '任务已创建,等待处理'}, - {'status_code': 'in_progress', 'status_name': '进行中', 'description': '任务正在处理中'}, + {'status_code': 'waiting', 'status_name': '待处理', 'description': '任务已创建,等待处理'}, + {'status_code': 'processing', 'status_name': '进行中', 'description': '任务正在处理中'}, {'status_code': 'completed', 'status_name': '已完成', 'description':'任务已成功完成'}, {'status_code': 'failed', 'status_name': '失败', 'description': '任务处理失败'} ]