v0.2.3 重建社团管理系统 sms系统初建完成
parent
ae69105536
commit
1b90321cda
|
|
@ -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()
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
@ -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("]");
|
||||
|
|
|
|||
|
|
@ -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<ClubUser> {
|
||||
|
|
|
|||
|
|
@ -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<Club> {
|
||||
|
||||
}
|
||||
public interface ClubService extends IService<Club> {
|
||||
void addClub(Club club);
|
||||
void updateClub(Club club);
|
||||
void deleteClub(Long clubId);
|
||||
Club getClubById(Long clubId);
|
||||
List<Club> listClubs(String keyword, Long userId);
|
||||
}
|
||||
|
|
@ -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<ClubUser> {
|
||||
|
||||
}
|
||||
void addMember(Long clubId, Long userId);
|
||||
void removeMember(Long clubId, Long userId);
|
||||
List<ClubUser> listMembers(Long clubId);
|
||||
}
|
||||
|
|
@ -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<ClubMapper, Club>
|
||||
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<Club> listClubs(String keyword, Long userId) {
|
||||
LambdaQueryWrapper<Club> query = new LambdaQueryWrapper<>();
|
||||
if (keyword != null && !keyword.isEmpty()) {
|
||||
query.like(Club::getClubName, keyword);
|
||||
}
|
||||
return this.list(query);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ClubUserMapper, ClubUser>
|
||||
implements ClubUserService{
|
||||
public class ClubUserServiceImpl extends ServiceImpl<ClubUserMapper, ClubUser> 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<ClubUser> query = new LambdaQueryWrapper<>();
|
||||
query.eq(ClubUser::getClubId, clubId).eq(ClubUser::getUserId, userId);
|
||||
this.remove(query);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取社团成员列表(根据权限)
|
||||
*
|
||||
* @param clubId 社团ID
|
||||
* @return 成员列表
|
||||
*/
|
||||
@Override
|
||||
public List<ClubUser> listMembers(Long clubId) {
|
||||
LambdaQueryWrapper<ClubUser> query = new LambdaQueryWrapper<>();
|
||||
query.eq(ClubUser::getClubId, clubId);
|
||||
return this.list(query);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -8,12 +8,11 @@
|
|||
<id property="sucId" column="suc_id" />
|
||||
<result property="userId" column="user_id" />
|
||||
<result property="clubId" column="club_id" />
|
||||
<result property="roleId" column="role_id" />
|
||||
<result property="isActive" column="is_active" />
|
||||
<result property="joinDate" column="join_date" />
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
suc_id,user_id,club_id,role_id,is_active,join_date
|
||||
suc_id,user_id,club_id,is_active,join_date
|
||||
</sql>
|
||||
</mapper>
|
||||
|
|
|
|||
Loading…
Reference in New Issue