v2.9update
This commit is contained in:
@@ -30,9 +30,9 @@ class AdminRoleModel:
|
||||
@staticmethod
|
||||
async def get_all() -> List[Dict[str, Any]]:
|
||||
sql = """
|
||||
SELECT ar.*, u.real_name, u.username, s.subject_name
|
||||
SELECT ar.*, u.real_name, u.username, u.status, s.subject_name
|
||||
FROM admin_roles ar
|
||||
JOIN users u ON ar.user_id = u.user_id AND u.status = 1
|
||||
JOIN users u ON ar.user_id = u.user_id
|
||||
LEFT JOIN subjects s ON ar.subject_id = s.subject_id
|
||||
ORDER BY ar.role_type
|
||||
"""
|
||||
|
||||
@@ -289,6 +289,7 @@ class ConductModel:
|
||||
cr.points_change,
|
||||
cr.reason,
|
||||
cr.recorder_name,
|
||||
MAX(cr.related_type) as related_type,
|
||||
DATE_FORMAT(MIN(cr.created_at), '%%Y-%%m-%%d %%H:%%i:%%s') as created_at,
|
||||
GROUP_CONCAT(s.name ORDER BY s.student_id SEPARATOR ', ') as student_names,
|
||||
COUNT(*) as student_count,
|
||||
|
||||
@@ -93,6 +93,17 @@ class UserModel:
|
||||
"""
|
||||
await execute_update(sql, (ip, user_id))
|
||||
|
||||
@staticmethod
|
||||
async def get_by_username_any(username: str) -> dict:
|
||||
"""根据用户名获取用户(含已禁用)"""
|
||||
sql = """
|
||||
SELECT user_id, username, password_hash, real_name, user_type,
|
||||
student_id, status, need_change_password, last_login_time, last_login_ip
|
||||
FROM users
|
||||
WHERE username = %s
|
||||
"""
|
||||
return await execute_one(sql, (username,))
|
||||
|
||||
@staticmethod
|
||||
async def check_username_exists(username: str) -> bool:
|
||||
"""检查用户名是否存在"""
|
||||
|
||||
@@ -500,11 +500,13 @@ async def add_admin(request: Request, req: AddAdminRequest):
|
||||
operator_id=user["user_id"]
|
||||
)
|
||||
if result["success"]:
|
||||
is_reactivation = result.get("password") is None
|
||||
await LogService.write_operation_log(
|
||||
operator_id=user["user_id"], operator_name=user["real_name"],
|
||||
operator_role="班主任", operation_type="add_admin",
|
||||
operator_role="班主任",
|
||||
operation_type="reactivate_admin" if is_reactivation else "add_admin",
|
||||
target_type="admin",
|
||||
details=f"新增管理员: {req.real_name}({req.username}), 角色: {req.role_type}",
|
||||
details=f"{'重新激活' if is_reactivation else '新增'}管理员: {req.real_name}({req.username}), 角色: {req.role_type}",
|
||||
ip=request.client.host
|
||||
)
|
||||
return success_response(data=result, message="管理员添加成功")
|
||||
@@ -563,36 +565,43 @@ async def update_admin(request: Request, user_id: int, req: UpdateAdminRequest):
|
||||
return error_response(message="更新失败或管理员不存在")
|
||||
|
||||
|
||||
@router.delete("/delete/{user_id}")
|
||||
async def delete_admin(request: Request, user_id: int):
|
||||
"""删除管理员(班主任)"""
|
||||
@router.put("/toggle-status/{user_id}")
|
||||
async def toggle_admin_status(request: Request, user_id: int):
|
||||
"""启用/禁用管理员(班主任),保留角色记录"""
|
||||
user = await get_current_user(request)
|
||||
is_teacher = await PermissionChecker.check_is_teacher(user["user_id"])
|
||||
if not is_teacher:
|
||||
return error_response(message="仅班主任可删除管理员", code=403)
|
||||
return error_response(message="仅班主任可操作", code=403)
|
||||
|
||||
# 防止删除自己
|
||||
# 防止禁用自己
|
||||
if user_id == user["user_id"]:
|
||||
return error_response(message="不能删除当前登录的管理员", code=400)
|
||||
return error_response(message="不能禁用当前登录的管理员", code=400)
|
||||
|
||||
from models.admin_role import AdminRoleModel
|
||||
from models.user import UserModel
|
||||
|
||||
# 先删除角色记录
|
||||
role_deleted = await AdminRoleModel.delete(user_id)
|
||||
if role_deleted:
|
||||
# 再删除用户账号(软删除,将状态设为禁用)
|
||||
await UserModel.update_status(user_id, 0)
|
||||
await LogService.write_operation_log(
|
||||
operator_id=user["user_id"], operator_name=user["real_name"],
|
||||
operator_role="班主任", operation_type="delete_admin",
|
||||
target_type="admin", target_id=user_id,
|
||||
details=f"删除管理员: ID={user_id}",
|
||||
ip=request.client.host
|
||||
)
|
||||
return success_response(message="管理员删除成功")
|
||||
else:
|
||||
return error_response(message="删除失败或管理员不存在")
|
||||
target_user = await UserModel.get_by_user_id(user_id)
|
||||
if not target_user or target_user.get("user_type") != "admin":
|
||||
return error_response(message="管理员不存在", code=404)
|
||||
|
||||
# 检查是否有管理员角色
|
||||
admin_role = await AdminRoleModel.get_by_user_id(user_id)
|
||||
if not admin_role:
|
||||
return error_response(message="该用户无管理员角色", code=400)
|
||||
|
||||
new_status = 0 if target_user["status"] == 1 else 1
|
||||
action_text = "禁用" if new_status == 0 else "启用"
|
||||
|
||||
await UserModel.update_status(user_id, new_status)
|
||||
|
||||
await LogService.write_operation_log(
|
||||
operator_id=user["user_id"], operator_name=user["real_name"],
|
||||
operator_role="班主任", operation_type="toggle_admin_status",
|
||||
target_type="admin", target_id=user_id,
|
||||
details=f"{action_text}管理员: {target_user['real_name']}({target_user['username']})",
|
||||
ip=request.client.host
|
||||
)
|
||||
return success_response(message=f"管理员已{action_text}")
|
||||
|
||||
|
||||
@router.post("/reset-password/{user_id}")
|
||||
|
||||
@@ -41,6 +41,7 @@ ALL_VERSIONS = {
|
||||
'2.6': 'v2.6.sql',
|
||||
'2.7': 'v2.7.sql',
|
||||
'2.8': 'v2.8.sql',
|
||||
'2.9': 'v2.9.sql',
|
||||
}
|
||||
# 版本特征标记(按优先级从高到低)
|
||||
VERSION_MARKERS = [
|
||||
|
||||
@@ -245,10 +245,30 @@ class AdminService:
|
||||
role_type: str,
|
||||
operator_id: int
|
||||
) -> Dict[str, Any]:
|
||||
"""添加管理员"""
|
||||
existing = await UserModel.get_by_username(username)
|
||||
"""添加管理员(支持重新激活已删除的管理员)"""
|
||||
# 检查用户名是否存在(含已禁用用户,因 username 有 UNIQUE 约束)
|
||||
existing = await UserModel.get_by_username_any(username)
|
||||
if existing:
|
||||
return {"success": False, "message": "用户名已存在"}
|
||||
if existing.get('status') == 1:
|
||||
return {"success": False, "message": "用户名已存在"}
|
||||
# 用户已被软删除(status=0),重新激活
|
||||
await UserModel.update_status(existing['user_id'], 1)
|
||||
await UserModel.update_real_name(existing['user_id'], real_name)
|
||||
user_id = existing['user_id']
|
||||
# 检查是否已有管理员角色
|
||||
existing_role = await AdminRoleModel.get_by_user_id(user_id)
|
||||
if existing_role:
|
||||
await AdminRoleModel.update_role(user_id, role_type)
|
||||
else:
|
||||
await AdminRoleModel.create(user_id=user_id, role_type=role_type, subject_id=None)
|
||||
logger.info(f"用户[{operator_id}] 重新激活管理员: {username} ({role_type})")
|
||||
return {
|
||||
"success": True,
|
||||
"user_id": user_id,
|
||||
"username": username,
|
||||
"password": None, # 重新激活不返回密码
|
||||
"role_type": role_type
|
||||
}
|
||||
|
||||
if not password:
|
||||
password = security.generate_random_password()
|
||||
@@ -274,7 +294,6 @@ class AdminService:
|
||||
"password": password,
|
||||
"role_type": role_type
|
||||
}
|
||||
|
||||
@staticmethod
|
||||
async def get_admins() -> Dict[str, Any]:
|
||||
"""获取管理员列表"""
|
||||
|
||||
Reference in New Issue
Block a user