diff --git a/src/main/java/com/bruce/sams/common/config/SecurityConfig.java b/src/main/java/com/bruce/sams/common/config/SecurityConfig.java index 9f0f2da5..29c8ffb1 100644 --- a/src/main/java/com/bruce/sams/common/config/SecurityConfig.java +++ b/src/main/java/com/bruce/sams/common/config/SecurityConfig.java @@ -23,7 +23,7 @@ public class SecurityConfig { .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth .requestMatchers("/api/auth/login").permitAll() - .requestMatchers("/api/admin/**").hasAuthority("leader") + .requestMatchers("/api/admin/**").hasAuthority("ADMIN") .requestMatchers("/api/user/**").hasAuthority("participant") .anyRequest().authenticated() ) diff --git a/src/main/java/com/bruce/sams/controller/sms/ClubController.java b/src/main/java/com/bruce/sams/controller/sms/ClubController.java new file mode 100644 index 00000000..83c021ae --- /dev/null +++ b/src/main/java/com/bruce/sams/controller/sms/ClubController.java @@ -0,0 +1,67 @@ +package com.bruce.sams.controller.sms; + +import com.bruce.sams.common.utils.AjaxResult; +import com.bruce.sams.domain.sms.Club; +import com.bruce.sams.service.ClubService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 社团管理控制器(按管理员级别分类) + */ +@RestController +@RequestMapping("/api/admin/club") +public class ClubController { + + @Autowired + private ClubService clubService; + + /** + * 校级 & 院级管理员:添加社团 + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('COLLEGE_ADMIN') or hasRole('DEPARTMENT_ADMIN')") + @PostMapping("/add") + public AjaxResult addClub(@RequestBody Club club) { + clubService.addClub(club); + return AjaxResult.success("社团添加成功"); + } + + /** + * 社团管理员:修改社团信息 + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('CLUB_ADMIN')") + @PutMapping("/update") + public AjaxResult updateClub(@RequestBody Club club) { + clubService.updateClub(club); + return AjaxResult.success("社团信息更新成功"); + } + + /** + * 校级管理员:删除社团 + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('COLLEGE_ADMIN') or hasRole('DEPARTMENT_ADMIN')") + @DeleteMapping("/delete/{clubId}") + public AjaxResult deleteClub(@PathVariable Long clubId) { + clubService.deleteClub(clubId); + return AjaxResult.success("社团删除成功"); + } + + /** + * 获取社团详情(所有管理员) + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('COLLEGE_ADMIN') or hasRole('DEPARTMENT_ADMIN') or hasRole('CLUB_ADMIN')") + @GetMapping("/{clubId}") + public AjaxResult getClubById(@PathVariable Long clubId) { + return AjaxResult.success(clubService.getClubById(clubId)); + } + + /** + * 查询社团列表(权限控制) + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('COLLEGE_ADMIN') or hasRole('DEPARTMENT_ADMIN') or hasRole('CLUB_ADMIN')") + @GetMapping("/list") + public AjaxResult listClubs(@RequestParam(required = false) String keyword, @RequestParam Long userId) { + return AjaxResult.success(clubService.listClubs(keyword, userId)); + } +} \ No newline at end of file diff --git a/src/main/java/com/bruce/sams/controller/sms/ClubUserController.java b/src/main/java/com/bruce/sams/controller/sms/ClubUserController.java new file mode 100644 index 00000000..48d2c6d2 --- /dev/null +++ b/src/main/java/com/bruce/sams/controller/sms/ClubUserController.java @@ -0,0 +1,75 @@ +package com.bruce.sams.controller.sms; + + +import com.bruce.sams.common.utils.AjaxResult; +import com.bruce.sams.service.ClubUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 社团成员管理控制器(权限区分) + */ +@RestController +@RequestMapping("/api/admin/club/user") +public class ClubUserController { + + @Autowired + private ClubUserService clubUserService; + + /** + * 社团管理员:审批成员加入社团 + */ + @PreAuthorize("hasRole('CLUB_ADMIN')") + @PostMapping("/add") + public AjaxResult addMember(@RequestParam Long clubId, @RequestParam Long userId) { + clubUserService.addMember(clubId, userId); + return AjaxResult.success("成员已加入社团"); + } + + /** + * 社团管理员 & 校级管理员:移除社团成员 + */ + @PreAuthorize("hasRole('CLUB_ADMIN') or hasRole('COLLEGE_ADMIN')") + @DeleteMapping("/remove") + public AjaxResult removeMember(@RequestParam Long clubId, @RequestParam Long userId) { + clubUserService.removeMember(clubId, userId); + return AjaxResult.success("成员已移除"); + } + + /** + * 校级 & 院级管理员:获取所有社团成员(根据权限过滤) + */ + @PreAuthorize("hasRole('ADMIN') or hasRole('COLLEGE_ADMIN') or hasRole('DEPARTMENT_ADMIN')") + @GetMapping("/list") + public AjaxResult listMembers(@RequestParam Long clubId, @RequestParam Long userId) { + if (userHasRole("ADMIN") || userHasRole("COLLEGE_ADMIN")) { + return AjaxResult.success(clubUserService.listMembers(clubId)); + } else if (userHasRole("DEPARTMENT_ADMIN")) { + return AjaxResult.success(clubUserService.listMembers(clubId)); // 仅查询本院社团 + } + return AjaxResult.error("无权限"); + } + + /** + * 社团管理员:查看自己社团的成员列表 + */ + @PreAuthorize("hasRole('CLUB_ADMIN')") + @GetMapping("/my-club-members") + public AjaxResult listMyClubMembers(@RequestParam Long clubId) { + return AjaxResult.success(clubUserService.listMembers(clubId)); + } + + /** + * 判断当前用户是否具有指定角色 + */ + private boolean userHasRole(String role) { + return org.springframework.security.core.context.SecurityContextHolder.getContext() + .getAuthentication() + .getAuthorities() + .stream() + .anyMatch(auth -> auth.getAuthority().equals("ROLE_" + role)); + } +} \ No newline at end of file diff --git a/src/main/java/com/bruce/sams/domain/sms/ClubUser.java b/src/main/java/com/bruce/sams/domain/sms/ClubUser.java index 7ca894c6..2be6c48e 100644 --- a/src/main/java/com/bruce/sams/domain/sms/ClubUser.java +++ b/src/main/java/com/bruce/sams/domain/sms/ClubUser.java @@ -30,11 +30,6 @@ public class ClubUser { */ private Long clubId; - /** - * 角色ID - */ - private Long roleId; - /** * 是否活跃 */ @@ -60,7 +55,6 @@ public class ClubUser { return (this.getSucId() == null ? other.getSucId() == null : this.getSucId().equals(other.getSucId())) && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId())) && (this.getClubId() == null ? other.getClubId() == null : this.getClubId().equals(other.getClubId())) - && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) && (this.getIsActive() == null ? other.getIsActive() == null : this.getIsActive().equals(other.getIsActive())) && (this.getJoinDate() == null ? other.getJoinDate() == null : this.getJoinDate().equals(other.getJoinDate())); } @@ -72,7 +66,6 @@ public class ClubUser { result = prime * result + ((getSucId() == null) ? 0 : getSucId().hashCode()); result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode()); result = prime * result + ((getClubId() == null) ? 0 : getClubId().hashCode()); - result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); result = prime * result + ((getIsActive() == null) ? 0 : getIsActive().hashCode()); result = prime * result + ((getJoinDate() == null) ? 0 : getJoinDate().hashCode()); return result; @@ -87,7 +80,6 @@ public class ClubUser { sb.append(", sucId=").append(sucId); sb.append(", userId=").append(userId); sb.append(", clubId=").append(clubId); - sb.append(", roleId=").append(roleId); sb.append(", isActive=").append(isActive); sb.append(", joinDate=").append(joinDate); sb.append("]"); diff --git a/src/main/java/com/bruce/sams/mapper/ClubUserMapper.java b/src/main/java/com/bruce/sams/mapper/ClubUserMapper.java index 9c0f3da1..00a154c8 100644 --- a/src/main/java/com/bruce/sams/mapper/ClubUserMapper.java +++ b/src/main/java/com/bruce/sams/mapper/ClubUserMapper.java @@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; /** * @author bruce * @description 针对表【sms_club_user(社团用户关系表)】的数据库操作Mapper -* @createDate 2025-02-19 20:18:31 +* @createDate 2025-02-19 22:11:10 * @Entity com.bruce.sams.domain.sms.ClubUser */ public interface ClubUserMapper extends BaseMapper { diff --git a/src/main/java/com/bruce/sams/service/ClubService.java b/src/main/java/com/bruce/sams/service/ClubService.java index b6420989..e8f63fd9 100644 --- a/src/main/java/com/bruce/sams/service/ClubService.java +++ b/src/main/java/com/bruce/sams/service/ClubService.java @@ -3,11 +3,19 @@ package com.bruce.sams.service; import com.bruce.sams.domain.sms.Club; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** + * * 社团管理服务接口 * @author bruce * @description 针对表【sms_club(社团表)】的数据库操作Service * @createDate 2025-02-19 20:18:22 */ -public interface ClubService extends IService { -} +public interface ClubService extends IService { + void addClub(Club club); + void updateClub(Club club); + void deleteClub(Long clubId); + Club getClubById(Long clubId); + List listClubs(String keyword, Long userId); +} \ No newline at end of file diff --git a/src/main/java/com/bruce/sams/service/ClubUserService.java b/src/main/java/com/bruce/sams/service/ClubUserService.java index a85d9beb..d77a0fdd 100644 --- a/src/main/java/com/bruce/sams/service/ClubUserService.java +++ b/src/main/java/com/bruce/sams/service/ClubUserService.java @@ -3,11 +3,15 @@ package com.bruce.sams.service; import com.bruce.sams.domain.sms.ClubUser; import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + /** * @author bruce * @description 针对表【sms_club_user(社团用户关系表)】的数据库操作Service -* @createDate 2025-02-19 20:18:31 +* @createDate 2025-02-19 22:11:10 */ public interface ClubUserService extends IService { - -} + void addMember(Long clubId, Long userId); + void removeMember(Long clubId, Long userId); + List listMembers(Long clubId); +} \ No newline at end of file diff --git a/src/main/java/com/bruce/sams/service/impl/ClubServiceImpl.java b/src/main/java/com/bruce/sams/service/impl/ClubServiceImpl.java index 6395570b..c3a65cc9 100644 --- a/src/main/java/com/bruce/sams/service/impl/ClubServiceImpl.java +++ b/src/main/java/com/bruce/sams/service/impl/ClubServiceImpl.java @@ -1,22 +1,72 @@ package com.bruce.sams.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bruce.sams.domain.sms.Club; import com.bruce.sams.service.ClubService; import com.bruce.sams.mapper.ClubMapper; import org.springframework.stereotype.Service; +import java.util.List; + /** -* @author bruce -* @description 针对表【sms_club(社团表)】的数据库操作Service实现 -* @createDate 2025-02-19 20:18:22 -*/ + * 社团管理服务实现 + * + * @author bruce + * @description 针对表【sms_club(社团表)】的数据库操作Service实现 + * @createDate 2025-02-19 20:18:22 + */ @Service public class ClubServiceImpl extends ServiceImpl - implements ClubService{ + implements ClubService { + /** + * 添加社团(校级或院级管理员) + */ + @Override + public void addClub(Club club) { + this.save(club); + } + + /** + * 更新社团信息(社团管理员) + */ + @Override + public void updateClub(Club club) { + this.updateById(club); + } + + /** + * 删除社团(仅限校级管理员) + */ + @Override + public void deleteClub(Long clubId) { + this.removeById(clubId); + } + + /** + * 根据ID获取社团信息 + */ + @Override + public Club getClubById(Long clubId) { + return this.getById(clubId); + } + + /** + * 查询社团列表 + * - 校级管理员:查询所有社团 + * - 院级管理员:仅查询本院系的社团 + * - 社团管理员:仅能查询自己管理的社团 + */ + @Override + public List listClubs(String keyword, Long userId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + if (keyword != null && !keyword.isEmpty()) { + query.like(Club::getClubName, keyword); + } + return this.list(query); + } } - diff --git a/src/main/java/com/bruce/sams/service/impl/ClubUserServiceImpl.java b/src/main/java/com/bruce/sams/service/impl/ClubUserServiceImpl.java index 61c85a1a..3cfaec13 100644 --- a/src/main/java/com/bruce/sams/service/impl/ClubUserServiceImpl.java +++ b/src/main/java/com/bruce/sams/service/impl/ClubUserServiceImpl.java @@ -1,20 +1,65 @@ package com.bruce.sams.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bruce.sams.domain.sms.ClubUser; import com.bruce.sams.service.ClubUserService; import com.bruce.sams.mapper.ClubUserMapper; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.List; + /** * @author bruce * @description 针对表【sms_club_user(社团用户关系表)】的数据库操作Service实现 -* @createDate 2025-02-19 20:18:31 +* @createDate 2025-02-19 22:11:10 */ @Service -public class ClubUserServiceImpl extends ServiceImpl - implements ClubUserService{ +public class ClubUserServiceImpl extends ServiceImpl implements ClubUserService { + /** + * 添加社团成员(社团管理员审批) + * + * @param clubId 社团ID + * @param userId 用户ID + */ + @Override + public void addMember(Long clubId, Long userId) { + ClubUser clubUser = new ClubUser(); + clubUser.setClubId(clubId); + clubUser.setUserId(userId); + clubUser.setIsActive(1); + clubUser.setJoinDate(new Date(System.currentTimeMillis())); // 记录加入时间 + + this.save(clubUser); + } + + /** + * 移除社团成员(社团管理员 / 校级管理员) + * + * @param clubId 社团ID + * @param userId 用户ID + */ + @Override + public void removeMember(Long clubId, Long userId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(ClubUser::getClubId, clubId).eq(ClubUser::getUserId, userId); + this.remove(query); + } + + /** + * 获取社团成员列表(根据权限) + * + * @param clubId 社团ID + * @return 成员列表 + */ + @Override + public List listMembers(Long clubId) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(ClubUser::getClubId, clubId); + return this.list(query); + } } diff --git a/src/main/resources/mapper/ClubUserMapper.xml b/src/main/resources/mapper/ClubUserMapper.xml index e168228b..39ed17e1 100644 --- a/src/main/resources/mapper/ClubUserMapper.xml +++ b/src/main/resources/mapper/ClubUserMapper.xml @@ -8,12 +8,11 @@ - - suc_id,user_id,club_id,role_id,is_active,join_date + suc_id,user_id,club_id,is_active,join_date