From d478ef34b81adbfe5dbe59760b508f15b8e53d5c Mon Sep 17 00:00:00 2001 From: chenyuan Date: Wed, 2 Sep 2026 21:38:00 +0800 Subject: [PATCH] fix: allow teacher admins to manage school classes --- .../controller/stu/UserController.java | 7 +- .../stu/UserControllerTeacherAdminTest.java | 65 +++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java b/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java index f7f062a..4b0c038 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/UserController.java @@ -459,8 +459,9 @@ public class UserController { @RequestParam(required = false) String operatorId) { Userinfo operator = StringUtils.isBlank(operatorId) ? null : userinfoMapper.selectByPrimaryKey(operatorId); if (isSchoolTeacher(operator) && isTeacherRosterMode(operator.getSchoolId())) { + String createdBy = isTeacherAdmin(operator) ? null : operatorId; PageInfo pageInfo = schoolService.seleteSchoolClass(index, size, operator.getSchoolId(), - className, classSn, null, operatorId, "TEACHING"); + className, classSn, null, createdBy, "TEACHING"); return new ResultEntity<>(HttpStatus.OK, "班级管理-查询成功", pageInfo); } PageInfo pageInfo = schoolService.seleteSchoolClass(index, size, schoolId, className, classSn, schoolMajorId); @@ -1863,6 +1864,10 @@ public class UserController { if (isPlatformAdmin(operator)) { return true; } + if (isTeacherAdmin(operator) + && StringUtils.equals(operator.getSchoolId(), schoolClass.getSchoolId())) { + return true; + } if (!Integer.valueOf(3).equals(operator.getRole())) { return false; } diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java index e5bd8b4..dd85e93 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/UserControllerTeacherAdminTest.java @@ -3,6 +3,7 @@ package com.sztzjy.linkCommerce.controller.stu; import com.sztzjy.linkCommerce.entity.School; import com.sztzjy.linkCommerce.entity.SchoolClass; import com.sztzjy.linkCommerce.entity.SchoolClassExample; +import com.sztzjy.linkCommerce.entity.dto.SchoolClassDto; import com.sztzjy.linkCommerce.entity.SchoolFaculty; import com.sztzjy.linkCommerce.entity.SchoolMajor; import com.sztzjy.linkCommerce.entity.TeachingClassStudent; @@ -16,6 +17,7 @@ import com.sztzjy.linkCommerce.mapper.TeachingClassStudentMapper; import com.sztzjy.linkCommerce.mapper.UserinfoMapper; import com.sztzjy.linkCommerce.service.UserInfoService; import com.sztzjy.linkCommerce.service.SchoolProductConfigService; +import com.sztzjy.linkCommerce.service.SchoolService; import com.sztzjy.linkCommerce.entity.importDto.SchoolAdminStudentImportDTO; import com.sztzjy.linkCommerce.entity.importDto.TeachingClassStudentImportDTO; import com.sztzjy.linkCommerce.util.Pinyin4jUtil; @@ -43,6 +45,36 @@ import static org.mockito.Mockito.when; class UserControllerTeacherAdminTest { + @Test + void teacherAdminClassListIncludesEveryTeachingClassInSchool() { + UserController controller = controllerWithCommonMocks(); + controller.schoolService = mock(SchoolService.class); + when(controller.schoolProductConfigService.isTeacherRosterManaged("school-1")).thenReturn(true); + when(controller.schoolService.seleteSchoolClass(1, 10, "school-1", null, null, null, null, "TEACHING")) + .thenReturn(new PageInfo<>()); + + ResultEntity> result = controller.seleteSchoolClass( + 1, 10, "other-school", null, null, null, "teacher-admin"); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + verify(controller.schoolService).seleteSchoolClass( + 1, 10, "school-1", null, null, null, null, "TEACHING"); + } + + @Test + void ordinaryTeacherClassListRemainsLimitedToOwnedTeachingClasses() { + UserController controller = controllerWithCommonMocks(); + controller.schoolService = mock(SchoolService.class); + when(controller.schoolProductConfigService.isTeacherRosterManaged("school-1")).thenReturn(true); + when(controller.schoolService.seleteSchoolClass(1, 10, "school-1", null, null, null, "teacher-1", "TEACHING")) + .thenReturn(new PageInfo<>()); + + controller.seleteSchoolClass(1, 10, "other-school", null, null, null, "teacher-1"); + + verify(controller.schoolService).seleteSchoolClass( + 1, 10, "school-1", null, null, null, "teacher-1", "TEACHING"); + } + @Test void addTeacherAccountAlwaysCreatesOrdinaryTeacher() { UserController controller = controllerWithCommonMocks(); @@ -505,6 +537,21 @@ class UserControllerTeacherAdminTest { verify(controller.schoolClassMapper, never()).deleteByPrimaryKey("class-1"); } + @Test + void teacherAdminCanDeleteAnotherTeachersLocalClassInSameSchool() { + UserController controller = controllerWithCommonMocks(); + SchoolClass schoolClass = classCreatedBy("teacher-2"); + schoolClass.setDataSource("LOCAL"); + when(controller.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(schoolClass); + when(controller.teachingClassStudentMapper.countByTeachingClassId("class-1")).thenReturn(0L); + when(controller.schoolClassMapper.deleteByPrimaryKey("class-1")).thenReturn(1); + + ResultEntity result = controller.deleteSchoolClass("class-1", "teacher-admin"); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + verify(controller.schoolClassMapper).deleteByPrimaryKey("class-1"); + } + @Test void teacherAdminCanDeleteOwnLocalAdminClass() { UserController controller = controllerWithCommonMocks(); @@ -594,6 +641,24 @@ class UserControllerTeacherAdminTest { verify(controller.schoolClassMapper, never()).deleteByPrimaryKey("class-1"); } + @Test + void teacherAdminCanUpdateAnotherTeachersLocalClassInSameSchool() { + UserController controller = controllerWithCommonMocks(); + SchoolClass existing = classCreatedBy("teacher-2"); + existing.setDataSource("LOCAL"); + SchoolClass update = new SchoolClass(); + update.setSchoolClassId("class-1"); + update.setClassName("updated-class"); + when(controller.schoolClassMapper.selectByPrimaryKey("class-1")).thenReturn(existing); + when(controller.schoolClassMapper.updateByPrimaryKeySelective(any(SchoolClass.class))).thenReturn(1); + + ResultEntity result = controller.updateSchoolClass(update, "teacher-admin"); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + verify(controller.schoolClassMapper).updateByPrimaryKeySelective(update); + assertEquals("teacher-2", update.getCreatedBy()); + } + @Test void teacherAdminCanUpdateOwnLocalAdminClass() { UserController controller = controllerWithCommonMocks();