From bb7ebef4c30d253f1220f572d1ff88c1a6cdb2d3 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Mon, 22 Jun 2026 22:44:20 +0800 Subject: [PATCH] feat: add school admin backend management --- pom.xml | 2 +- .../security/AuthenticationService.java | 1 + .../linkCommerce/config/security/JwtUser.java | 2 +- .../config/security/LoginResult.java | 2 +- .../config/security/TokenProvider.java | 8 +- .../config/security/WebConfigurerAdapter.java | 9 + .../config/security/WebSecurityConfig.java | 1 + .../common/CommonUploadController.java | 38 ++ .../PlatformAdminController.java | 271 +++++++++++ .../schooladmin/SchoolAdminController.java | 456 ++++++++++++++++++ .../service/PlatformAdminService.java | 12 + .../service/SchoolAdminService.java | 14 + .../impl/PlatformAdminServiceImpl.java | 32 ++ .../service/impl/SchoolAdminServiceImpl.java | 42 ++ .../com/sztzjy/linkCommerce/util/TzApi.java | 4 +- .../impl/PlatformAdminServiceImplTest.java | 50 ++ .../impl/SchoolAdminServiceImplTest.java | 77 +++ 17 files changed, 1012 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/controller/schooladmin/SchoolAdminController.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/PlatformAdminService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/SchoolAdminService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImpl.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImplTest.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImplTest.java diff --git a/pom.xml b/pom.xml index fe1e58b..c25cfae 100644 --- a/pom.xml +++ b/pom.xml @@ -334,7 +334,7 @@ org.apache.maven.plugins maven-surefire-plugin - true + ${skipTests} diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/AuthenticationService.java b/src/main/java/com/sztzjy/linkCommerce/config/security/AuthenticationService.java index 292835b..3ed783a 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/AuthenticationService.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/AuthenticationService.java @@ -58,6 +58,7 @@ public class AuthenticationService implements UserDetailsService { jwtUser.setUserId(userinfo.getUserId()); jwtUser.setName(userinfo.getName()); jwtUser.setRoleId(userinfo.getRole()); + jwtUser.setSchoolId(userinfo.getSchoolId()); jwtUser.setStudentId(userinfo.getUsername()); return jwtUser; } diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/JwtUser.java b/src/main/java/com/sztzjy/linkCommerce/config/security/JwtUser.java index 94f7e77..1cb870e 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/JwtUser.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/JwtUser.java @@ -22,7 +22,7 @@ public class JwtUser implements UserDetails { private String name; private String userId; private int roleId; - private Integer schoolId; + private String schoolId; private int classId; private String schoolName; private String className; diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/LoginResult.java b/src/main/java/com/sztzjy/linkCommerce/config/security/LoginResult.java index 3adb59b..9957399 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/LoginResult.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/LoginResult.java @@ -27,7 +27,7 @@ public class LoginResult { @ApiModelProperty("用户所在班级id") private int classId; @ApiModelProperty("用户所在学校id") - private int schoolId; + private String schoolId; @ApiModelProperty("用户所在学校名称") private String schoolName; @ApiModelProperty("用户权限") diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/TokenProvider.java b/src/main/java/com/sztzjy/linkCommerce/config/security/TokenProvider.java index 6ee0adf..e9e0243 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/TokenProvider.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/TokenProvider.java @@ -58,7 +58,7 @@ public class TokenProvider { } if (claims.get("schoolId")!=null){ - jwtUser.setSchoolId(Integer.valueOf(claims.get("schoolId")==null?"0":claims.get("schoolId").toString())); + jwtUser.setSchoolId(claims.get("schoolId").toString()); } jwtUser.setUsername(claims.get("username")==null?"":claims.get("username").toString()); @@ -114,7 +114,7 @@ public class TokenProvider { //jwtUser.setClassId(Integer.valueOf(claims.get("classId")==null?null:claims.get("classId").toString())); if(claims.get("schoolId")!=null){ // jwtUser.setClassId(Integer.valueOf(claims.get("classId")==null?null:claims.get("classId").toString())); - jwtUser.setSchoolId(Integer.valueOf(claims.get("schoolId")==null?"0":claims.get("schoolId").toString())); + jwtUser.setSchoolId(claims.get("schoolId").toString()); } jwtUser.setUsername(claims.get("username")==null?null:claims.get("username").toString()); @@ -201,7 +201,7 @@ public class TokenProvider { //jwtUser.setClassId(Integer.valueOf(claims.get("classId")==null?null:claims.get("classId").toString())); if(claims.get("schoolId")!=null){ // jwtUser.setClassId(Integer.valueOf(claims.get("classId")==null?null:claims.get("classId").toString())); - jwtUser.setSchoolId(Integer.valueOf(claims.get("schoolId")==null?"0":claims.get("schoolId").toString())); + jwtUser.setSchoolId(claims.get("schoolId").toString()); } @@ -246,7 +246,7 @@ public class TokenProvider { user.setUserId("486"); user.setRoleId(3); user.setUsername("tzt006"); - user.setSchoolId(1); + user.setSchoolId("1"); user.setSchoolName("天择大学"); user.setCollegeId(1); user.setCollegeName("演示学院"); diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/WebConfigurerAdapter.java b/src/main/java/com/sztzjy/linkCommerce/config/security/WebConfigurerAdapter.java index 831e4c3..2d737a1 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/WebConfigurerAdapter.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/WebConfigurerAdapter.java @@ -87,9 +87,18 @@ public class WebConfigurerAdapter implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/file/**").addResourceLocations("file:" + normalizeFileLocation(filePath)).setCachePeriod(0); registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/").setCachePeriod(0); } + private String normalizeFileLocation(String path) { + String normalized = path.replace("\\", "/"); + if (!normalized.endsWith("/")) { + normalized = normalized + "/"; + } + return normalized; + } + @Override public void extendMessageConverters(List> converters) { for (int i = 0; i < converters.size(); i++) { diff --git a/src/main/java/com/sztzjy/linkCommerce/config/security/WebSecurityConfig.java b/src/main/java/com/sztzjy/linkCommerce/config/security/WebSecurityConfig.java index 361eae1..946f536 100644 --- a/src/main/java/com/sztzjy/linkCommerce/config/security/WebSecurityConfig.java +++ b/src/main/java/com/sztzjy/linkCommerce/config/security/WebSecurityConfig.java @@ -90,6 +90,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/test/**").permitAll() .antMatchers("/druid/**").permitAll() .antMatchers("/webSocket/**").permitAll() + .antMatchers("/file/**").permitAll() .antMatchers(anonymousUrls.toArray(new String[]{})).permitAll() .anyRequest().authenticated(); } diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java b/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java new file mode 100644 index 0000000..97f9114 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/controller/common/CommonUploadController.java @@ -0,0 +1,38 @@ +package com.sztzjy.linkCommerce.controller.common; + +import com.sztzjy.linkCommerce.util.file.IFileUtil; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("common") +public class CommonUploadController { + @Resource + private IFileUtil fileUtil; + + @PostMapping("/upload") + public Map upload(@RequestPart("file") MultipartFile file) { + Map result = new HashMap<>(); + if (file == null || file.isEmpty()) { + result.put("code", 400); + result.put("msg", "文件不能为空"); + return result; + } + + String filePath = fileUtil.upload(file); + String publicPath = "/file" + filePath; + result.put("code", 200); + result.put("msg", "上传成功"); + result.put("fileName", publicPath); + result.put("url", publicPath); + result.put("originalFilename", file.getOriginalFilename()); + return result; + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java b/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java new file mode 100644 index 0000000..bfa4bdd --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java @@ -0,0 +1,271 @@ +package com.sztzjy.linkCommerce.controller.platformadmin; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.config.security.TokenProvider; +import com.sztzjy.linkCommerce.entity.*; +import com.sztzjy.linkCommerce.mapper.*; +import com.sztzjy.linkCommerce.service.PlatformAdminService; +import com.sztzjy.linkCommerce.service.UserInfoService; +import com.sztzjy.linkCommerce.util.ResultEntity; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +@Api(tags = "平台超管管理") +@RequestMapping("api/platform-admin") +@RestController +public class PlatformAdminController { + @Autowired + private PlatformAdminService platformAdminService; + @Autowired + private UserInfoService userInfoService; + @Autowired + private SchoolMapper schoolMapper; + @Autowired + private SchoolFacultyMapper schoolFacultyMapper; + @Autowired + private SchoolMajorMapper schoolMajorMapper; + @Autowired + private SchoolClassMapper schoolClassMapper; + @Autowired + private UserinfoMapper userinfoMapper; + @Autowired + private TaskAllocationMapper taskAllocationMapper; + + @GetMapping("/schools") + @ApiOperation("平台超管-学校列表") + public ResultEntity> listSchools(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String schoolName, + HttpServletRequest request) { + requirePlatformAdmin(request); + PageHelper.startPage(index, size); + SchoolExample example = new SchoolExample(); + if (StringUtils.isNotBlank(schoolName)) { + example.createCriteria().andSchoolNameLike("%" + schoolName + "%"); + } + example.setOrderByClause("create_time desc"); + return new ResultEntity<>(HttpStatus.OK, "查询成功", new PageInfo<>(schoolMapper.selectByExample(example))); + } + + @GetMapping("/schools/{id}") + @ApiOperation("平台超管-学校详情") + public ResultEntity getSchool(@PathVariable String id, HttpServletRequest request) { + requirePlatformAdmin(request); + return new ResultEntity<>(HttpStatus.OK, "查询成功", requireSchool(id)); + } + + @PostMapping("/schools") + @ApiOperation("平台超管-新增学校") + public ResultEntity addSchool(@RequestBody School school, HttpServletRequest request) { + requirePlatformAdmin(request); + if (StringUtils.isBlank(school.getSchoolName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学校名称不能为空"); + } + if (StringUtils.isBlank(school.getSchoolId())) { + school.setSchoolId(UUID.randomUUID().toString()); + } + if (school.getCreateTime() == null) { + school.setCreateTime(new Date()); + } + int count = schoolMapper.insertSelective(school); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/schools/{id}") + @ApiOperation("平台超管-编辑学校") + public ResultEntity updateSchool(@PathVariable String id, + @RequestBody School school, + HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchool(id); + school.setSchoolId(id); + int count = schoolMapper.updateByPrimaryKeySelective(school); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/schools/{id}") + @ApiOperation("平台超管-删除学校") + public ResultEntity deleteSchool(@PathVariable String id, HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchool(id); + if (hasSchoolBusinessData(id)) { + return new ResultEntity<>(HttpStatus.ACCEPTED, "该学校下存在业务数据,不能删除"); + } + int count = schoolMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + @GetMapping("/school-admins") + @ApiOperation("平台超管-学校管理员列表") + public ResultEntity> listSchoolAdmins(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String schoolId, + @RequestParam(required = false) String name, + @RequestParam(required = false) String username, + @RequestParam(required = false) String phone, + HttpServletRequest request) { + requirePlatformAdmin(request); + PageHelper.startPage(index, size); + UserinfoExample example = new UserinfoExample(); + UserinfoExample.Criteria criteria = example.createCriteria(); + criteria.andRoleEqualTo(2); + if (StringUtils.isNotBlank(schoolId)) { + criteria.andSchoolIdEqualTo(schoolId); + } + if (StringUtils.isNotBlank(name)) { + criteria.andNameLike("%" + name + "%"); + } + if (StringUtils.isNotBlank(username)) { + criteria.andUsernameLike("%" + username + "%"); + } + if (StringUtils.isNotBlank(phone)) { + criteria.andPhoneLike("%" + phone + "%"); + } + example.setOrderByClause("create_time desc"); + return new ResultEntity<>(HttpStatus.OK, "查询成功", new PageInfo<>(userinfoMapper.selectByExample(example))); + } + + @GetMapping("/school-admins/{id}") + @ApiOperation("平台超管-学校管理员详情") + public ResultEntity getSchoolAdmin(@PathVariable String id, HttpServletRequest request) { + requirePlatformAdmin(request); + return new ResultEntity<>(HttpStatus.OK, "查询成功", requireSchoolAdminUser(id)); + } + + @PostMapping("/school-admins") + @ApiOperation("平台超管-新增学校管理员") + public ResultEntity addSchoolAdmin(@RequestBody Userinfo schoolAdmin, HttpServletRequest request) { + requirePlatformAdmin(request); + if (StringUtils.isBlank(schoolAdmin.getUsername()) || StringUtils.isBlank(schoolAdmin.getName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学校管理员姓名和账号不能为空"); + } + String schoolId = platformAdminService.requireSchoolId(schoolAdmin.getSchoolId()); + requireSchool(schoolId); + if (userInfoService.existsByUserName(schoolAdmin.getUsername())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在"); + } + schoolAdmin.setUserId(UUID.randomUUID().toString()); + if (StringUtils.isBlank(schoolAdmin.getPassword())) { + schoolAdmin.setPassword("123qwe"); + } + schoolAdmin.setCreateTime(new Date()); + platformAdminService.prepareSchoolAdminForSave(schoolAdmin, schoolId); + int count = userinfoMapper.insertSelective(schoolAdmin); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/school-admins/{id}") + @ApiOperation("平台超管-编辑学校管理员") + public ResultEntity updateSchoolAdmin(@PathVariable String id, + @RequestBody Userinfo schoolAdmin, + HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchoolAdminUser(id); + String schoolId = platformAdminService.requireSchoolId(schoolAdmin.getSchoolId()); + requireSchool(schoolId); + schoolAdmin.setUserId(id); + platformAdminService.prepareSchoolAdminForSave(schoolAdmin, schoolId); + int count = userinfoMapper.updateByPrimaryKeySelective(schoolAdmin); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/school-admins/{id}") + @ApiOperation("平台超管-删除学校管理员") + public ResultEntity deleteSchoolAdmin(@PathVariable String id, HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchoolAdminUser(id); + int count = userinfoMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + private void requirePlatformAdmin(HttpServletRequest request) { + JwtUser user = TokenProvider.getJWTUser(request); + platformAdminService.requirePlatformAdmin(user); + } + + private School requireSchool(String schoolId) { + if (StringUtils.isBlank(schoolId)) { + throw new IllegalArgumentException("学校ID不能为空"); + } + School school = schoolMapper.selectByPrimaryKey(schoolId); + if (school == null) { + throw new IllegalArgumentException("学校不存在"); + } + return school; + } + + private Userinfo requireSchoolAdminUser(String userId) { + if (StringUtils.isBlank(userId)) { + throw new IllegalArgumentException("用户ID不能为空"); + } + Userinfo userinfo = userinfoMapper.selectByPrimaryKey(userId); + if (userinfo == null || !Integer.valueOf(2).equals(userinfo.getRole())) { + throw new IllegalArgumentException("学校管理员不存在"); + } + return userinfo; + } + + private ResultEntity writeResult(int count, String success, String fail) { + if (count > 0) { + return new ResultEntity<>(HttpStatus.OK, success); + } + return new ResultEntity<>(HttpStatus.ACCEPTED, fail); + } + + private boolean hasSchoolBusinessData(String schoolId) { + return hasFacultyInSchool(schoolId) + || hasMajorInSchool(schoolId) + || hasClassInSchool(schoolId) + || hasUserInSchool(schoolId) + || hasTaskInSchool(schoolId); + } + + private boolean hasFacultyInSchool(String schoolId) { + SchoolFacultyExample example = new SchoolFacultyExample(); + example.createCriteria().andSchoolIdEqualTo(schoolId); + return schoolFacultyMapper.countByExample(example) > 0; + } + + private boolean hasMajorInSchool(String schoolId) { + SchoolFacultyExample facultyExample = new SchoolFacultyExample(); + facultyExample.createCriteria().andSchoolIdEqualTo(schoolId); + List faculties = schoolFacultyMapper.selectByExample(facultyExample); + for (SchoolFaculty faculty : faculties) { + SchoolMajorExample majorExample = new SchoolMajorExample(); + majorExample.createCriteria().andSchoolFacultyIdEqualTo(faculty.getSchoolFacultyId()); + if (schoolMajorMapper.countByExample(majorExample) > 0) { + return true; + } + } + return false; + } + + private boolean hasClassInSchool(String schoolId) { + SchoolClassExample example = new SchoolClassExample(); + example.createCriteria().andSchoolIdEqualTo(schoolId); + return schoolClassMapper.countByExample(example) > 0; + } + + private boolean hasUserInSchool(String schoolId) { + UserinfoExample example = new UserinfoExample(); + example.createCriteria().andSchoolIdEqualTo(schoolId); + return userinfoMapper.countByExample(example) > 0; + } + + private boolean hasTaskInSchool(String schoolId) { + TaskAllocationExample example = new TaskAllocationExample(); + example.createCriteria().andSchoolIdEqualTo(schoolId); + return taskAllocationMapper.countByExample(example) > 0; + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/schooladmin/SchoolAdminController.java b/src/main/java/com/sztzjy/linkCommerce/controller/schooladmin/SchoolAdminController.java new file mode 100644 index 0000000..bbf56df --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/controller/schooladmin/SchoolAdminController.java @@ -0,0 +1,456 @@ +package com.sztzjy.linkCommerce.controller.schooladmin; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.config.security.TokenProvider; +import com.sztzjy.linkCommerce.entity.*; +import com.sztzjy.linkCommerce.entity.dto.SchoolClassDto; +import com.sztzjy.linkCommerce.entity.dto.SchoolFacultyDto; +import com.sztzjy.linkCommerce.entity.dto.SchoolMajorDto; +import com.sztzjy.linkCommerce.mapper.*; +import com.sztzjy.linkCommerce.service.SchoolAdminService; +import com.sztzjy.linkCommerce.service.SchoolService; +import com.sztzjy.linkCommerce.service.UserInfoService; +import com.sztzjy.linkCommerce.util.ResultEntity; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Date; +import java.util.UUID; + +@Api(tags = "学校管理员管理") +@RequestMapping("api/school-admin") +@RestController +public class SchoolAdminController { + @Autowired + private SchoolAdminService schoolAdminService; + @Autowired + private SchoolService schoolService; + @Autowired + private UserInfoService userInfoService; + @Autowired + private SchoolMapper schoolMapper; + @Autowired + private SchoolFacultyMapper schoolFacultyMapper; + @Autowired + private SchoolMajorMapper schoolMajorMapper; + @Autowired + private SchoolClassMapper schoolClassMapper; + @Autowired + private UserinfoMapper userinfoMapper; + @Autowired + private TaskAllocationMapper taskAllocationMapper; + + @GetMapping("/school") + @ApiOperation("学校管理员-当前学校详情") + public ResultEntity getSchool(HttpServletRequest request) { + String schoolId = currentSchoolId(request); + School school = schoolMapper.selectByPrimaryKey(schoolId); + return new ResultEntity<>(HttpStatus.OK, "查询成功", school); + } + + @PutMapping("/school") + @ApiOperation("学校管理员-编辑当前学校") + public ResultEntity updateSchool(@RequestBody School school, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + school.setSchoolId(schoolId); + int count = schoolMapper.updateByPrimaryKeySelective(school); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @GetMapping("/faculties") + @ApiOperation("学校管理员-院系列表") + public ResultEntity> listFaculties(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String schoolFacultyName, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + PageInfo pageInfo = schoolService.seleteSchoolFaculty(index, size, schoolId, schoolFacultyName); + return new ResultEntity<>(HttpStatus.OK, "查询成功", pageInfo); + } + + @PostMapping("/faculties") + @ApiOperation("学校管理员-新增院系") + public ResultEntity addFaculty(@RequestBody SchoolFaculty faculty, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isBlank(faculty.getSchoolFacultyName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "院系名称不能为空"); + } + faculty.setSchoolFacultyId(UUID.randomUUID().toString()); + faculty.setSchoolId(schoolId); + faculty.setCreateTime(new Date()); + int count = schoolFacultyMapper.insertSelective(faculty); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/faculties/{id}") + @ApiOperation("学校管理员-编辑院系") + public ResultEntity updateFaculty(@PathVariable String id, + @RequestBody SchoolFaculty faculty, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + SchoolFaculty existing = requireFaculty(id, schoolId); + faculty.setSchoolFacultyId(existing.getSchoolFacultyId()); + faculty.setSchoolId(schoolId); + int count = schoolFacultyMapper.updateByPrimaryKeySelective(faculty); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/faculties/{id}") + @ApiOperation("学校管理员-删除院系") + public ResultEntity deleteFaculty(@PathVariable String id, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireFaculty(id, schoolId); + if (hasMajorInFaculty(id) || hasUserByFaculty(id)) { + return new ResultEntity<>(HttpStatus.ACCEPTED, "院系下存在专业或用户,不能删除"); + } + int count = schoolFacultyMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + @GetMapping("/majors") + @ApiOperation("学校管理员-专业列表") + public ResultEntity> listMajors(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String schoolMajorName, + @RequestParam(required = false) String schoolFacultyId, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isNotBlank(schoolFacultyId)) { + requireFaculty(schoolFacultyId, schoolId); + } + PageInfo pageInfo = schoolService.seleteSchoolMajor(index, size, schoolId, schoolMajorName, schoolFacultyId); + return new ResultEntity<>(HttpStatus.OK, "查询成功", pageInfo); + } + + @PostMapping("/majors") + @ApiOperation("学校管理员-新增专业") + public ResultEntity addMajor(@RequestBody SchoolMajor major, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isBlank(major.getSchoolMajorName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "专业名称不能为空"); + } + requireFaculty(major.getSchoolFacultyId(), schoolId); + major.setSchoolMajorId(UUID.randomUUID().toString()); + major.setCreateTime(new Date()); + int count = schoolMajorMapper.insertSelective(major); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/majors/{id}") + @ApiOperation("学校管理员-编辑专业") + public ResultEntity updateMajor(@PathVariable String id, + @RequestBody SchoolMajor major, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireMajor(id, schoolId); + if (StringUtils.isNotBlank(major.getSchoolFacultyId())) { + requireFaculty(major.getSchoolFacultyId(), schoolId); + } + major.setSchoolMajorId(id); + int count = schoolMajorMapper.updateByPrimaryKeySelective(major); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/majors/{id}") + @ApiOperation("学校管理员-删除专业") + public ResultEntity deleteMajor(@PathVariable String id, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireMajor(id, schoolId); + if (hasClassInMajor(id) || hasUserByMajor(id)) { + return new ResultEntity<>(HttpStatus.ACCEPTED, "专业下存在班级或用户,不能删除"); + } + int count = schoolMajorMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + @GetMapping("/classes") + @ApiOperation("学校管理员-班级列表") + public ResultEntity> listClasses(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String className, + @RequestParam(required = false) String classSn, + @RequestParam(required = false) String schoolMajorId, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isNotBlank(schoolMajorId)) { + requireMajor(schoolMajorId, schoolId); + } + PageInfo pageInfo = schoolService.seleteSchoolClass(index, size, schoolId, className, classSn, schoolMajorId); + return new ResultEntity<>(HttpStatus.OK, "查询成功", pageInfo); + } + + @PostMapping("/classes") + @ApiOperation("学校管理员-新增班级") + public ResultEntity addClass(@RequestBody SchoolClass schoolClass, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isBlank(schoolClass.getClassName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "班级名称不能为空"); + } + requireMajor(schoolClass.getSchoolMajorId(), schoolId); + schoolClass.setSchoolClassId(UUID.randomUUID().toString()); + schoolClass.setSchoolId(schoolId); + schoolClass.setCreateTime(new Date()); + int count = schoolClassMapper.insertSelective(schoolClass); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/classes/{id}") + @ApiOperation("学校管理员-编辑班级") + public ResultEntity updateClass(@PathVariable String id, + @RequestBody SchoolClass schoolClass, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireClass(id, schoolId); + if (StringUtils.isNotBlank(schoolClass.getSchoolMajorId())) { + requireMajor(schoolClass.getSchoolMajorId(), schoolId); + } + schoolClass.setSchoolClassId(id); + schoolClass.setSchoolId(schoolId); + int count = schoolClassMapper.updateByPrimaryKeySelective(schoolClass); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/classes/{id}") + @ApiOperation("学校管理员-删除班级") + public ResultEntity deleteClass(@PathVariable String id, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireClass(id, schoolId); + if (hasStudentInClass(id) || hasTaskInClass(id, schoolId)) { + return new ResultEntity<>(HttpStatus.ACCEPTED, "班级下存在学生或任务,不能删除"); + } + int count = schoolClassMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + @GetMapping("/teachers") + @ApiOperation("学校管理员-教师列表") + public ResultEntity> listTeachers(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String name, + @RequestParam(required = false) String username, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + PageInfo pageInfo = listUsers(index, size, schoolId, 3, name, username, null); + return new ResultEntity<>(HttpStatus.OK, "查询成功", pageInfo); + } + + @PostMapping("/teachers") + @ApiOperation("学校管理员-新增教师") + public ResultEntity addTeacher(@RequestBody Userinfo teacher, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isBlank(teacher.getUsername()) || StringUtils.isBlank(teacher.getName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "教师姓名和工号不能为空"); + } + if (userInfoService.existsByUserName(teacher.getUsername())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在"); + } + teacher.setUserId(UUID.randomUUID().toString()); + if (StringUtils.isBlank(teacher.getPassword())) { + teacher.setPassword("123qwe"); + } + teacher.setCreateTime(new Date()); + schoolAdminService.prepareTeacherForSave(teacher, schoolId); + int count = userinfoMapper.insertSelective(teacher); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/teachers/{id}") + @ApiOperation("学校管理员-编辑教师") + public ResultEntity updateTeacher(@PathVariable String id, + @RequestBody Userinfo teacher, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireUser(id, schoolId, 3); + teacher.setUserId(id); + schoolAdminService.prepareTeacherForSave(teacher, schoolId); + int count = userinfoMapper.updateByPrimaryKeySelective(teacher); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/teachers/{id}") + @ApiOperation("学校管理员-删除教师") + public ResultEntity deleteTeacher(@PathVariable String id, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireUser(id, schoolId, 3); + int count = userinfoMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + @GetMapping("/students") + @ApiOperation("学校管理员-学生列表") + public ResultEntity> listStudents(@RequestParam Integer index, + @RequestParam Integer size, + @RequestParam(required = false) String name, + @RequestParam(required = false) String username, + @RequestParam(required = false) String schoolClassId, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isNotBlank(schoolClassId)) { + requireClass(schoolClassId, schoolId); + } + PageInfo pageInfo = listUsers(index, size, schoolId, 4, name, username, schoolClassId); + return new ResultEntity<>(HttpStatus.OK, "查询成功", pageInfo); + } + + @PostMapping("/students") + @ApiOperation("学校管理员-新增学生") + public ResultEntity addStudent(@RequestBody Userinfo student, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + if (StringUtils.isBlank(student.getUsername()) || StringUtils.isBlank(student.getName())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "学生姓名和学号不能为空"); + } + if (userInfoService.existsByUserName(student.getUsername())) { + return new ResultEntity<>(HttpStatus.BAD_REQUEST, "账号已存在"); + } + if (StringUtils.isNotBlank(student.getSchoolClassId())) { + requireClass(student.getSchoolClassId(), schoolId); + } + student.setUserId(UUID.randomUUID().toString()); + if (StringUtils.isBlank(student.getPassword())) { + student.setPassword("123qwe"); + } + student.setCreateTime(new Date()); + schoolAdminService.prepareStudentForSave(student, schoolId); + int count = userinfoMapper.insertSelective(student); + return writeResult(count, "新增成功", "新增失败"); + } + + @PutMapping("/students/{id}") + @ApiOperation("学校管理员-编辑学生") + public ResultEntity updateStudent(@PathVariable String id, + @RequestBody Userinfo student, + HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireUser(id, schoolId, 4); + if (StringUtils.isNotBlank(student.getSchoolClassId())) { + requireClass(student.getSchoolClassId(), schoolId); + } + student.setUserId(id); + schoolAdminService.prepareStudentForSave(student, schoolId); + int count = userinfoMapper.updateByPrimaryKeySelective(student); + return writeResult(count, "编辑成功", "编辑失败"); + } + + @DeleteMapping("/students/{id}") + @ApiOperation("学校管理员-删除学生") + public ResultEntity deleteStudent(@PathVariable String id, HttpServletRequest request) { + String schoolId = currentSchoolId(request); + requireUser(id, schoolId, 4); + int count = userinfoMapper.deleteByPrimaryKey(id); + return writeResult(count, "删除成功", "删除失败"); + } + + private String currentSchoolId(HttpServletRequest request) { + JwtUser user = TokenProvider.getJWTUser(request); + return schoolAdminService.requireSchoolAdmin(user); + } + + private ResultEntity writeResult(int count, String success, String fail) { + if (count > 0) { + return new ResultEntity<>(HttpStatus.OK, success); + } + return new ResultEntity<>(HttpStatus.ACCEPTED, fail); + } + + private SchoolFaculty requireFaculty(String facultyId, String schoolId) { + if (StringUtils.isBlank(facultyId)) { + throw new IllegalArgumentException("院系ID不能为空"); + } + SchoolFaculty faculty = schoolFacultyMapper.selectByPrimaryKey(facultyId); + if (faculty == null || !schoolId.equals(faculty.getSchoolId())) { + throw new IllegalArgumentException("院系不存在或无权限"); + } + return faculty; + } + + private SchoolMajor requireMajor(String majorId, String schoolId) { + if (StringUtils.isBlank(majorId)) { + throw new IllegalArgumentException("专业ID不能为空"); + } + SchoolMajor major = schoolMajorMapper.selectByPrimaryKey(majorId); + if (major == null) { + throw new IllegalArgumentException("专业不存在"); + } + requireFaculty(major.getSchoolFacultyId(), schoolId); + return major; + } + + private SchoolClass requireClass(String classId, String schoolId) { + if (StringUtils.isBlank(classId)) { + throw new IllegalArgumentException("班级ID不能为空"); + } + SchoolClass schoolClass = schoolClassMapper.selectByPrimaryKey(classId); + if (schoolClass == null || !schoolId.equals(schoolClass.getSchoolId())) { + throw new IllegalArgumentException("班级不存在或无权限"); + } + return schoolClass; + } + + private Userinfo requireUser(String userId, String schoolId, int role) { + Userinfo userinfo = userinfoMapper.selectByPrimaryKey(userId); + if (userinfo == null || !schoolId.equals(userinfo.getSchoolId()) || userinfo.getRole() == null || userinfo.getRole() != role) { + throw new IllegalArgumentException("用户不存在或无权限"); + } + return userinfo; + } + + private PageInfo listUsers(Integer index, Integer size, String schoolId, int role, String name, String username, String classId) { + PageHelper.startPage(index, size); + UserinfoExample example = new UserinfoExample(); + UserinfoExample.Criteria criteria = example.createCriteria(); + criteria.andSchoolIdEqualTo(schoolId).andRoleEqualTo(role); + if (StringUtils.isNotBlank(name)) { + criteria.andNameLike("%" + name + "%"); + } + if (StringUtils.isNotBlank(username)) { + criteria.andUsernameLike("%" + username + "%"); + } + if (StringUtils.isNotBlank(classId)) { + criteria.andSchoolClassIdEqualTo(classId); + } + return new PageInfo<>(userinfoMapper.selectByExample(example)); + } + + private boolean hasMajorInFaculty(String facultyId) { + SchoolMajorExample example = new SchoolMajorExample(); + example.createCriteria().andSchoolFacultyIdEqualTo(facultyId); + return schoolMajorMapper.countByExample(example) > 0; + } + + private boolean hasClassInMajor(String majorId) { + SchoolClassExample example = new SchoolClassExample(); + example.createCriteria().andSchoolMajorIdEqualTo(majorId); + return schoolClassMapper.countByExample(example) > 0; + } + + private boolean hasStudentInClass(String classId) { + UserinfoExample example = new UserinfoExample(); + example.createCriteria().andSchoolClassIdEqualTo(classId).andRoleEqualTo(4); + return userinfoMapper.countByExample(example) > 0; + } + + private boolean hasTaskInClass(String classId, String schoolId) { + TaskAllocationExample example = new TaskAllocationExample(); + example.createCriteria().andClassIdEqualTo(classId).andSchoolIdEqualTo(schoolId); + return taskAllocationMapper.countByExample(example) > 0; + } + + private boolean hasUserByFaculty(String facultyId) { + UserinfoExample example = new UserinfoExample(); + example.createCriteria().andSchoolFacultyIdEqualTo(facultyId); + return userinfoMapper.countByExample(example) > 0; + } + + private boolean hasUserByMajor(String majorId) { + UserinfoExample example = new UserinfoExample(); + example.createCriteria().andSchoolMajorIdEqualTo(majorId); + return userinfoMapper.countByExample(example) > 0; + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/PlatformAdminService.java b/src/main/java/com/sztzjy/linkCommerce/service/PlatformAdminService.java new file mode 100644 index 0000000..35161b1 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/PlatformAdminService.java @@ -0,0 +1,12 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; + +public interface PlatformAdminService { + void requirePlatformAdmin(JwtUser user); + + void prepareSchoolAdminForSave(Userinfo userinfo, String schoolId); + + String requireSchoolId(String schoolId); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/SchoolAdminService.java b/src/main/java/com/sztzjy/linkCommerce/service/SchoolAdminService.java new file mode 100644 index 0000000..8690e66 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/SchoolAdminService.java @@ -0,0 +1,14 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; + +public interface SchoolAdminService { + String requireSchoolAdmin(JwtUser user); + + void requireSameSchool(JwtUser user, String targetSchoolId); + + void prepareTeacherForSave(Userinfo userinfo, String schoolId); + + void prepareStudentForSave(Userinfo userinfo, String schoolId); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImpl.java new file mode 100644 index 0000000..3c74878 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImpl.java @@ -0,0 +1,32 @@ +package com.sztzjy.linkCommerce.service.impl; + +import com.sztzjy.linkCommerce.config.exception.UnAuthorizedException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; +import com.sztzjy.linkCommerce.service.PlatformAdminService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +@Service +public class PlatformAdminServiceImpl implements PlatformAdminService { + @Override + public void requirePlatformAdmin(JwtUser user) { + if (user == null || user.getRoleId() != 1) { + throw new UnAuthorizedException("仅平台超管可操作"); + } + } + + @Override + public void prepareSchoolAdminForSave(Userinfo userinfo, String schoolId) { + userinfo.setSchoolId(requireSchoolId(schoolId)); + userinfo.setRole(2); + } + + @Override + public String requireSchoolId(String schoolId) { + if (StringUtils.isBlank(schoolId)) { + throw new IllegalArgumentException("请选择所属学校"); + } + return schoolId; + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImpl.java new file mode 100644 index 0000000..1f173fe --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImpl.java @@ -0,0 +1,42 @@ +package com.sztzjy.linkCommerce.service.impl; + +import com.sztzjy.linkCommerce.config.exception.UnAuthorizedException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; +import com.sztzjy.linkCommerce.service.SchoolAdminService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +@Service +public class SchoolAdminServiceImpl implements SchoolAdminService { + @Override + public String requireSchoolAdmin(JwtUser user) { + if (user == null || user.getRoleId() != 2) { + throw new UnAuthorizedException("仅学校管理员可操作"); + } + if (user.getSchoolId() == null) { + throw new UnAuthorizedException("学校管理员缺少学校信息"); + } + return String.valueOf(user.getSchoolId()); + } + + @Override + public void requireSameSchool(JwtUser user, String targetSchoolId) { + String schoolId = requireSchoolAdmin(user); + if (StringUtils.isBlank(targetSchoolId) || !schoolId.equals(targetSchoolId)) { + throw new UnAuthorizedException("无权操作其他学校数据"); + } + } + + @Override + public void prepareTeacherForSave(Userinfo userinfo, String schoolId) { + userinfo.setSchoolId(schoolId); + userinfo.setRole(3); + } + + @Override + public void prepareStudentForSave(Userinfo userinfo, String schoolId) { + userinfo.setSchoolId(schoolId); + userinfo.setRole(4); + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/util/TzApi.java b/src/main/java/com/sztzjy/linkCommerce/util/TzApi.java index a23c443..1a3c69a 100644 --- a/src/main/java/com/sztzjy/linkCommerce/util/TzApi.java +++ b/src/main/java/com/sztzjy/linkCommerce/util/TzApi.java @@ -64,7 +64,7 @@ public class TzApi { String roleName = dataObject.getStr("rolename"); Integer roleId = roleName.equals("学生") ? 4 : 3; user.setRoleId(roleId); - user.setSchoolId(dataObject.getInt("schoolid")); + user.setSchoolId(dataObject.getStr("schoolid")); if(roleId==4){ user.setClassId(dataObject.getInt("classid")); user.setClassName(dataObject.getStr("classname")); @@ -242,7 +242,7 @@ public class TzApi { user.setUserId("486"); user.setRoleId(3); user.setUsername("tzt006"); - user.setSchoolId(1); + user.setSchoolId("1"); user.setSchoolName("天择大学"); user.setCollegeId(1); user.setCollegeName("演示学院"); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImplTest.java new file mode 100644 index 0000000..0cb7033 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/PlatformAdminServiceImplTest.java @@ -0,0 +1,50 @@ +package com.sztzjy.linkCommerce.service.impl; + +import com.sztzjy.linkCommerce.config.exception.UnAuthorizedException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PlatformAdminServiceImplTest { + @Test + void requirePlatformAdminRejectsSchoolAdmin() { + PlatformAdminServiceImpl service = new PlatformAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(2); + + assertThrows(UnAuthorizedException.class, () -> service.requirePlatformAdmin(user)); + } + + @Test + void requirePlatformAdminAllowsPlatformAdmin() { + PlatformAdminServiceImpl service = new PlatformAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(1); + + service.requirePlatformAdmin(user); + } + + @Test + void prepareSchoolAdminForSaveForcesRoleAndSchool() { + PlatformAdminServiceImpl service = new PlatformAdminServiceImpl(); + Userinfo userinfo = new Userinfo(); + userinfo.setRole(1); + userinfo.setSchoolId("other-school"); + + service.prepareSchoolAdminForSave(userinfo, "school-uuid-1"); + + assertEquals(2, userinfo.getRole()); + assertEquals("school-uuid-1", userinfo.getSchoolId()); + } + + @Test + void prepareSchoolAdminForSaveRejectsMissingSchool() { + PlatformAdminServiceImpl service = new PlatformAdminServiceImpl(); + Userinfo userinfo = new Userinfo(); + + assertThrows(IllegalArgumentException.class, () -> service.prepareSchoolAdminForSave(userinfo, " ")); + } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImplTest.java new file mode 100644 index 0000000..e9da66b --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolAdminServiceImplTest.java @@ -0,0 +1,77 @@ +package com.sztzjy.linkCommerce.service.impl; + +import com.sztzjy.linkCommerce.config.exception.UnAuthorizedException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.Userinfo; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class SchoolAdminServiceImplTest { + @Test + void requireSchoolAdminRejectsTeacher() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(3); + user.setSchoolId("school-uuid-1"); + + assertThrows(UnAuthorizedException.class, () -> service.requireSchoolAdmin(user)); + } + + @Test + void requireSchoolAdminReturnsSchoolIdForSchoolAdmin() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(2); + user.setSchoolId("school-uuid-1"); + + assertEquals("school-uuid-1", service.requireSchoolAdmin(user)); + } + + @Test + void requireSameSchoolRejectsOtherSchool() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(2); + user.setSchoolId("school-uuid-1"); + + assertThrows(UnAuthorizedException.class, () -> service.requireSameSchool(user, "school-uuid-2")); + } + + @Test + void requireSameSchoolAllowsSameSchool() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + JwtUser user = new JwtUser(); + user.setRoleId(2); + user.setSchoolId("school-uuid-1"); + + service.requireSameSchool(user, "school-uuid-1"); + } + + @Test + void prepareTeacherForSaveForcesSchoolAndTeacherRole() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + Userinfo userinfo = new Userinfo(); + userinfo.setSchoolId("other-school"); + userinfo.setRole(2); + + service.prepareTeacherForSave(userinfo, "school-uuid-1"); + + assertEquals("school-uuid-1", userinfo.getSchoolId()); + assertEquals(3, userinfo.getRole()); + } + + @Test + void prepareStudentForSaveForcesSchoolAndStudentRole() { + SchoolAdminServiceImpl service = new SchoolAdminServiceImpl(); + Userinfo userinfo = new Userinfo(); + userinfo.setSchoolId("other-school"); + userinfo.setRole(2); + + service.prepareStudentForSave(userinfo, "school-uuid-1"); + + assertEquals("school-uuid-1", userinfo.getSchoolId()); + assertEquals(4, userinfo.getRole()); + } +}