diff --git a/src/main/java/cn/zyp/stusystem/common/GlobalExceptionHandler.java b/src/main/java/cn/zyp/stusystem/common/GlobalExceptionHandler.java new file mode 100644 index 0000000..beab0c1 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/common/GlobalExceptionHandler.java @@ -0,0 +1,51 @@ +package cn.zyp.stusystem.common; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.exception.NotPermissionException; +import cn.dev33.satoken.exception.NotRoleException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.naming.AuthenticationException; +import java.nio.file.AccessDeniedException; + +@RestControllerAdvice +public class GlobalExceptionHandler { + + // 处理SaToken未登录异常 + @ExceptionHandler(NotLoginException.class) + public Result handleNotLoginException(NotLoginException e) { + return Result.error(401, "未登录或登录已过期"); + } + + // 处理SaToken权限不足异常 + @ExceptionHandler(NotPermissionException.class) + public Result handleNotPermissionException(NotPermissionException e) { + return Result.error(403, "无权限访问"); + } + + // 处理SaToken角色不足异常 + @ExceptionHandler(NotRoleException.class) + public Result handleNotRoleException(NotRoleException e) { + return Result.error(403, "无角色权限"); + } + + // 处理其他认证异常 + @ExceptionHandler(AuthenticationException.class) + public Result handleException(AuthenticationException e){ + return Result.error(401, e.getMessage()); + } + + // 处理其他权限不足异常 + @ExceptionHandler(AccessDeniedException.class) + public Result handleAccessDeniedException(AccessDeniedException e) { + return Result.error(403, e.getMessage()); + } + + // 处理其他未知异常 + @ExceptionHandler(Exception.class) + public Result handleException(Exception e) { + e.printStackTrace(); + return Result.error(500, "服务器内部错误"); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/common/Result.java b/src/main/java/cn/zyp/stusystem/common/Result.java new file mode 100644 index 0000000..c0ae512 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/common/Result.java @@ -0,0 +1,63 @@ +package cn.zyp.stusystem.common; + +import lombok.Data; + +@Data +public class Result { + //响应码 + private int code; + //响应消息 + private String msg; + //响应数据 + private T data; + + private Result(){} + + /** + * 成功响应 + * @param data 返回的数据 + * @param 数据类型 + * @return Result 对象 + */ + public static Result success(T data) { + Result result = new Result<>(); + result.setCode(200); + result.setMsg("success"); + result.setData(data); + return result; + } + + /** + * 成功响应(无数据) + * @param 数据类型 + * @return Result 对象 + */ + public static Result success() { + return success(null); + } + + /** + * 失败响应 + * @param code 错误码 + * @param msg 错误信息 + * @param 数据类型 + * @return Result 对象 + */ + public static Result error(int code, String msg) { + Result result = new Result<>(); + result.setCode(code); + result.setMsg(msg); + result.setData(null); + return result; + } + + /** + * 失败响应(默认错误码 500) + * @param msg 错误信息 + * @param 数据类型 + * @return Result 对象 + */ + public static Result error(String msg) { + return error(500, msg); + } +} diff --git a/src/main/java/cn/zyp/stusystem/common/ResultCode.java b/src/main/java/cn/zyp/stusystem/common/ResultCode.java new file mode 100644 index 0000000..60ffcc6 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/common/ResultCode.java @@ -0,0 +1,23 @@ +package cn.zyp.stusystem.common; + + +public enum ResultCode { + SUCCESS(200,"成功"), + ERROR(500,"错误"), + PARAM_ERROR(400,"参数错误"); + + private final int code; + private final String message; + + ResultCode(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + public String getMessage() { + return message; + } +} diff --git a/src/main/java/cn/zyp/stusystem/config/SaTokenConfig.java b/src/main/java/cn/zyp/stusystem/config/SaTokenConfig.java new file mode 100644 index 0000000..bc314f8 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/config/SaTokenConfig.java @@ -0,0 +1,24 @@ +package cn.zyp.stusystem.config; + +import cn.dev33.satoken.filter.SaServletFilter; +import cn.dev33.satoken.util.SaResult; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SaTokenConfig { + + @Bean + public SaServletFilter getSaServletFilter() { + return new SaServletFilter() + .addInclude("/**") + .addExclude("/favicon.ico") + .setAuth(obj -> { + // 这里不需要写权限校验,让注解来处理 + // SaRouter.match("/**").notMatch("/api/login").check(StpUtil::checkLogin); + }) + .setError(e -> { + return SaResult.error(e.getMessage()); + }); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/config/StpInterfaceImpl.java b/src/main/java/cn/zyp/stusystem/config/StpInterfaceImpl.java new file mode 100644 index 0000000..5a67be9 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/config/StpInterfaceImpl.java @@ -0,0 +1,24 @@ +package cn.zyp.stusystem.config; + +import cn.dev33.satoken.stp.StpInterface; +import cn.dev33.satoken.stp.StpUtil; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +@Component +public class StpInterfaceImpl implements StpInterface { + + @Override + public List getPermissionList(Object loginId, String loginType) { + // 从Session获取权限 + return (List) StpUtil.getSessionByLoginId(loginId).get("permissions"); + } + + @Override + public List getRoleList(Object loginId, String loginType) { + String role = (String) StpUtil.getSessionByLoginId(loginId).get("role"); + return Arrays.asList(role); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/constant/PermissionConstants.java b/src/main/java/cn/zyp/stusystem/constant/PermissionConstants.java new file mode 100644 index 0000000..f3576c6 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/constant/PermissionConstants.java @@ -0,0 +1,42 @@ +package cn.zyp.stusystem.constant; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +// constant/PermissionConstants.java +public class PermissionConstants { + public static final String ROLE_ADMIN = "admin"; + public static final String ROLE_HEAD_TEACHER = "head_teacher"; + public static final String ROLE_TEACHER = "teacher"; + + public static final String CLASS_VIEW = "class:view"; + public static final String CLASS_ADD = "class:add"; + public static final String CLASS_EDIT = "class:edit"; + public static final String CLASS_DELETE = "class:delete"; + + public static final String STUDENT_VIEW = "student:view"; + public static final String STUDENT_ADD = "student:add"; + public static final String STUDENT_EDIT = "student:edit"; + public static final String STUDENT_DELETE = "student:delete"; + + public static final Map> ROLE_PERMISSIONS = new HashMap<>(); + + static { + ROLE_PERMISSIONS.put(ROLE_ADMIN, Arrays.asList( + CLASS_VIEW, CLASS_ADD, CLASS_EDIT, CLASS_DELETE, + STUDENT_VIEW, STUDENT_ADD, STUDENT_EDIT, STUDENT_DELETE + )); + + ROLE_PERMISSIONS.put(ROLE_HEAD_TEACHER, Arrays.asList( + CLASS_VIEW, + STUDENT_VIEW, STUDENT_ADD, STUDENT_EDIT, STUDENT_DELETE + )); + + ROLE_PERMISSIONS.put(ROLE_TEACHER, Arrays.asList( + CLASS_VIEW, + STUDENT_VIEW + )); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/controller/LoginController.java b/src/main/java/cn/zyp/stusystem/controller/LoginController.java new file mode 100644 index 0000000..bfb116a --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/controller/LoginController.java @@ -0,0 +1,58 @@ +package cn.zyp.stusystem.controller; + +import cn.dev33.satoken.stp.StpUtil; +import cn.zyp.stusystem.common.Result; +import cn.zyp.stusystem.constant.PermissionConstants; +import cn.zyp.stusystem.dto.LoginDTO; +import cn.zyp.stusystem.entity.User; +import cn.zyp.stusystem.service.UserService; +import cn.zyp.stusystem.vo.LoginResult; +import cn.zyp.stusystem.vo.UserVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("/api") +public class LoginController { + + @Autowired + private UserService userService; + + @PostMapping("/login") + public Result login(@RequestBody LoginDTO loginDTO) { + // 1. 根据用户名查询用户信息 + User user = userService.getByUsername(loginDTO.getUsername()); + + // 2. 校验用户是否存在以及密码是否正确 + if(user == null || !user.getPassword().equals(loginDTO.getPassword())) { + return Result.error(401, "用户名或密码错误"); + } + + // 3. SaToken登录(自动生成token) + StpUtil.login(user.getId()); + + // 4. 在Session中存储角色和权限 + StpUtil.getSession().set("role", user.getRole()); + List permissions = PermissionConstants.ROLE_PERMISSIONS.get(user.getRole()); + StpUtil.getSession().set("permissions", permissions); + + // 5. 构建返回数据 + UserVO userVO = new UserVO(); + userVO.setId(user.getId()); + userVO.setUsername(user.getUsername()); + userVO.setRole(user.getRole()); + userVO.setName(user.getName()); + userVO.setPermissions(permissions); + + LoginResult loginResult = new LoginResult(); + loginResult.setToken(StpUtil.getTokenValue()); + loginResult.setUserInfo(userVO); + + return Result.success(loginResult); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/controller/PermissionController.java b/src/main/java/cn/zyp/stusystem/controller/PermissionController.java new file mode 100644 index 0000000..5640524 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/controller/PermissionController.java @@ -0,0 +1,38 @@ +package cn.zyp.stusystem.controller; + +import cn.zyp.stusystem.common.Result; +import cn.zyp.stusystem.entity.Permission; +import cn.zyp.stusystem.service.PermissionService; +import cn.zyp.stusystem.vo.PermissionVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; +import java.util.stream.Collectors; + +@RestController +@RequestMapping("/api/permission") +public class PermissionController { + + @Autowired + private PermissionService permissionService; + + /** + * 获取所有权限列表 + */ + @GetMapping("/all") + public Result> getAllPermissions() { + List permissions = permissionService.getAllEnabledPermissions(); + List voList = permissions.stream() + .map(permission -> { + PermissionVO vo = new PermissionVO(); + BeanUtils.copyProperties(permission, vo); + return vo; + }) + .collect(Collectors.toList()); + return Result.success(voList); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/controller/RolePermissionController.java b/src/main/java/cn/zyp/stusystem/controller/RolePermissionController.java new file mode 100644 index 0000000..60583ee --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/controller/RolePermissionController.java @@ -0,0 +1,37 @@ +package cn.zyp.stusystem.controller; + +import cn.zyp.stusystem.common.Result; +import cn.zyp.stusystem.dto.SaveRolePermissionsDTO; +import cn.zyp.stusystem.service.RolePermissionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/role") +public class RolePermissionController { + + @Autowired + private RolePermissionService rolePermissionService; + + /** + * 获取角色的权限列表 + */ + @GetMapping("/{roleId}/permissions") + public Result> getRolePermissions(@PathVariable Long roleId) { + List permissionCodes = rolePermissionService.getPermissionCodesByRoleId(roleId); + return Result.success(permissionCodes); + } + + /** + * 保存角色的权限配置 + */ + @PostMapping("/{roleId}/permissions") + public Result saveRolePermissions( + @PathVariable Long roleId, + @RequestBody SaveRolePermissionsDTO dto) { + rolePermissionService.saveRolePermissions(roleId, dto.getPermissions()); + return Result.success(true); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/dto/LoginDTO.java b/src/main/java/cn/zyp/stusystem/dto/LoginDTO.java new file mode 100644 index 0000000..2336fcb --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/dto/LoginDTO.java @@ -0,0 +1,9 @@ +package cn.zyp.stusystem.dto; + +import lombok.Data; + +@Data +public class LoginDTO { + private String username; + private String password; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/dto/SaveRolePermissionsDTO.java b/src/main/java/cn/zyp/stusystem/dto/SaveRolePermissionsDTO.java new file mode 100644 index 0000000..c2ee9c4 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/dto/SaveRolePermissionsDTO.java @@ -0,0 +1,9 @@ +package cn.zyp.stusystem.dto; + +import lombok.Data; +import java.util.List; + +@Data +public class SaveRolePermissionsDTO { + private List permissions; // 权限码列表 +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/entity/Permission.java b/src/main/java/cn/zyp/stusystem/entity/Permission.java new file mode 100644 index 0000000..48f49be --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/entity/Permission.java @@ -0,0 +1,25 @@ +package cn.zyp.stusystem.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("permissions") +public class Permission { + @TableId(type = IdType.AUTO) + private Long id; + + private String code; // 权限码,如 student:add + private String name; // 权限名称,如 学生新增 + private String module; // 所属模块,如 student + private String moduleName; // 模块名称,如 学生管理 + private String description; // 权限描述 + private Integer sortOrder; // 排序顺序 + private Integer status; // 状态:1-启用,0-禁用 + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/entity/Role.java b/src/main/java/cn/zyp/stusystem/entity/Role.java new file mode 100644 index 0000000..016e338 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/entity/Role.java @@ -0,0 +1,21 @@ +package cn.zyp.stusystem.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("roles") +public class Role { + @TableId(type = IdType.AUTO) + private Long id; + + private String roleCode; // 角色代码,如 admin + private String roleName; // 角色名称,如 管理员 + private Integer status; // 状态:1-启用,0-禁用 + private LocalDateTime createdAt; + private LocalDateTime updatedAt; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/entity/RolePermission.java b/src/main/java/cn/zyp/stusystem/entity/RolePermission.java new file mode 100644 index 0000000..42a8471 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/entity/RolePermission.java @@ -0,0 +1,19 @@ +package cn.zyp.stusystem.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("role_permissions") +public class RolePermission { + @TableId(type = IdType.AUTO) + private Long id; + + private Long roleId; // 角色ID + private String permissionCode; // 权限码 + private LocalDateTime createdAt; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/entity/User.java b/src/main/java/cn/zyp/stusystem/entity/User.java new file mode 100644 index 0000000..72dab6c --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/entity/User.java @@ -0,0 +1,23 @@ +package cn.zyp.stusystem.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.util.Date; + +@Data +@TableName("user") +public class User { + @TableId(type = IdType.AUTO) + private Long id; + + private String username; + private String password; + private String role; // admin, head_teacher, teacher(保留用于兼容) + private Long roleId; // 角色ID(新增字段) + private String name; + private Integer status; + private Date createTime; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/mapper/PermissionMapper.java b/src/main/java/cn/zyp/stusystem/mapper/PermissionMapper.java new file mode 100644 index 0000000..002c7fa --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/mapper/PermissionMapper.java @@ -0,0 +1,9 @@ +package cn.zyp.stusystem.mapper; + +import cn.zyp.stusystem.entity.Permission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PermissionMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/mapper/RoleMapper.java b/src/main/java/cn/zyp/stusystem/mapper/RoleMapper.java new file mode 100644 index 0000000..9be9060 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/mapper/RoleMapper.java @@ -0,0 +1,10 @@ +package cn.zyp.stusystem.mapper; + +import cn.zyp.stusystem.entity.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RoleMapper extends BaseMapper { + // 不需要自定义方法,直接在Service中使用LambdaQueryWrapper +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/mapper/RolePermissionMapper.java b/src/main/java/cn/zyp/stusystem/mapper/RolePermissionMapper.java new file mode 100644 index 0000000..8c93d57 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/mapper/RolePermissionMapper.java @@ -0,0 +1,10 @@ +package cn.zyp.stusystem.mapper; + +import cn.zyp.stusystem.entity.RolePermission; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface RolePermissionMapper extends BaseMapper { + // 不需要自定义方法,直接在Service中使用LambdaQueryWrapper +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/mapper/UserMapper.java b/src/main/java/cn/zyp/stusystem/mapper/UserMapper.java new file mode 100644 index 0000000..7a6d53a --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package cn.zyp.stusystem.mapper; + +import cn.zyp.stusystem.entity.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/PermissionService.java b/src/main/java/cn/zyp/stusystem/service/PermissionService.java new file mode 100644 index 0000000..85d9512 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/PermissionService.java @@ -0,0 +1,13 @@ +package cn.zyp.stusystem.service; + +import cn.zyp.stusystem.entity.Permission; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface PermissionService extends IService { + /** + * 获取所有启用的权限 + */ + List getAllEnabledPermissions(); +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/RolePermissionService.java b/src/main/java/cn/zyp/stusystem/service/RolePermissionService.java new file mode 100644 index 0000000..5258522 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/RolePermissionService.java @@ -0,0 +1,23 @@ +package cn.zyp.stusystem.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import cn.zyp.stusystem.entity.RolePermission; + +import java.util.List; + +public interface RolePermissionService extends IService { + /** + * 根据角色ID获取权限码列表 + */ + List getPermissionCodesByRoleId(Long roleId); + + /** + * 根据多个角色ID获取权限码列表(去重) + */ + List getPermissionCodesByRoleIds(List roleIds); + + /** + * 保存角色的权限配置 + */ + void saveRolePermissions(Long roleId, List permissionCodes); +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/RoleService.java b/src/main/java/cn/zyp/stusystem/service/RoleService.java new file mode 100644 index 0000000..3531fb3 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/RoleService.java @@ -0,0 +1,11 @@ +package cn.zyp.stusystem.service; + +import cn.zyp.stusystem.entity.Role; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface RoleService extends IService { + /** + * 根据角色代码获取角色ID + */ + Long getRoleIdByRoleCode(String roleCode); +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/UserService.java b/src/main/java/cn/zyp/stusystem/service/UserService.java new file mode 100644 index 0000000..555cbd9 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/UserService.java @@ -0,0 +1,18 @@ +package cn.zyp.stusystem.service; + +import cn.zyp.stusystem.entity.User; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface UserService extends IService { + /** + * 根据用户名查询用户 + */ + User getByUsername(String username); + + /** + * 根据用户ID获取权限列表(新增) + */ + List getUserPermissions(Long userId); +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/impl/PermissionServiceImpl.java b/src/main/java/cn/zyp/stusystem/service/impl/PermissionServiceImpl.java new file mode 100644 index 0000000..c0cd549 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/impl/PermissionServiceImpl.java @@ -0,0 +1,23 @@ +package cn.zyp.stusystem.service.impl; + +import cn.zyp.stusystem.entity.Permission; +import cn.zyp.stusystem.mapper.PermissionMapper; +import cn.zyp.stusystem.service.PermissionService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class PermissionServiceImpl extends ServiceImpl + implements PermissionService { + + @Override + public List getAllEnabledPermissions() { + return list(new LambdaQueryWrapper() + .eq(Permission::getStatus, 1) + .orderByAsc(Permission::getModule, Permission::getSortOrder) + ); + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/impl/RolePermissionServiceImpl.java b/src/main/java/cn/zyp/stusystem/service/impl/RolePermissionServiceImpl.java new file mode 100644 index 0000000..cffadc9 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/impl/RolePermissionServiceImpl.java @@ -0,0 +1,75 @@ +package cn.zyp.stusystem.service.impl; + +import cn.zyp.stusystem.entity.RolePermission; +import cn.zyp.stusystem.mapper.RolePermissionMapper; +import cn.zyp.stusystem.service.RolePermissionService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class RolePermissionServiceImpl extends ServiceImpl + implements RolePermissionService { + + @Override + public List getPermissionCodesByRoleId(Long roleId) { + if (roleId == null) { + return List.of(); + } + // 使用MyBatis-Plus的LambdaQueryWrapper查询 + List list = list(new LambdaQueryWrapper() + .eq(RolePermission::getRoleId, roleId) + .select(RolePermission::getPermissionCode) // 只查询permission_code字段 + ); + // 提取permissionCode + return list.stream() + .map(RolePermission::getPermissionCode) + .collect(Collectors.toList()); + } + + @Override + public List getPermissionCodesByRoleIds(List roleIds) { + if (roleIds == null || roleIds.isEmpty()) { + return List.of(); + } + // 使用MyBatis-Plus的in查询 + List list = list(new LambdaQueryWrapper() + .in(RolePermission::getRoleId, roleIds) + .select(RolePermission::getPermissionCode) // 只查询permission_code字段 + ); + // 提取permissionCode并去重 + return list.stream() + .map(RolePermission::getPermissionCode) + .distinct() // 去重 + .collect(Collectors.toList()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveRolePermissions(Long roleId, List permissionCodes) { + // 1. 删除该角色的所有现有权限(使用MyBatis-Plus的remove方法) + remove(new LambdaQueryWrapper() + .eq(RolePermission::getRoleId, roleId) + ); + + // 2. 批量插入新权限 + if (permissionCodes != null && !permissionCodes.isEmpty()) { + List rolePermissions = permissionCodes.stream() + .map(code -> { + RolePermission rp = new RolePermission(); + rp.setRoleId(roleId); + rp.setPermissionCode(code); + rp.setCreatedAt(LocalDateTime.now()); + return rp; + }) + .collect(Collectors.toList()); + + saveBatch(rolePermissions); + } + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/impl/RoleServiceImpl.java b/src/main/java/cn/zyp/stusystem/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..4b908de --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/impl/RoleServiceImpl.java @@ -0,0 +1,21 @@ +package cn.zyp.stusystem.service.impl; + +import cn.zyp.stusystem.entity.Role; +import cn.zyp.stusystem.mapper.RoleMapper; +import cn.zyp.stusystem.service.RoleService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + + @Override + public Long getRoleIdByRoleCode(String roleCode) { + Role role = getOne(new LambdaQueryWrapper() + .eq(Role::getRoleCode, roleCode) + .eq(Role::getStatus, 1) + ); + return role != null ? role.getId() : null; + } +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/service/impl/UserServiceImpl.java b/src/main/java/cn/zyp/stusystem/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..21d23b8 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/service/impl/UserServiceImpl.java @@ -0,0 +1,15 @@ +package cn.zyp.stusystem.service.impl; + +import cn.zyp.stusystem.entity.User; +import cn.zyp.stusystem.mapper.UserMapper; +import cn.zyp.stusystem.service.UserService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + @Override + public User getByUsername(String username) { + return lambdaQuery().eq(User::getUsername,username).one(); + } +} diff --git a/src/main/java/cn/zyp/stusystem/vo/LoginResult.java b/src/main/java/cn/zyp/stusystem/vo/LoginResult.java new file mode 100644 index 0000000..f401720 --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/vo/LoginResult.java @@ -0,0 +1,10 @@ +package cn.zyp.stusystem.vo; + +import cn.zyp.stusystem.vo.UserVO; +import lombok.Data; + +@Data +public class LoginResult { + private String token; + private UserVO userInfo; +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/vo/PermissionVO.java b/src/main/java/cn/zyp/stusystem/vo/PermissionVO.java new file mode 100644 index 0000000..c7a3bcb --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/vo/PermissionVO.java @@ -0,0 +1,11 @@ +package cn.zyp.stusystem.vo; + +import lombok.Data; + +@Data +public class PermissionVO { + private String code; // 权限码 + private String name; // 权限名称 + private String module; // 所属模块 + private String moduleName; // 模块名称 +} \ No newline at end of file diff --git a/src/main/java/cn/zyp/stusystem/vo/UserVO.java b/src/main/java/cn/zyp/stusystem/vo/UserVO.java new file mode 100644 index 0000000..7d8b50d --- /dev/null +++ b/src/main/java/cn/zyp/stusystem/vo/UserVO.java @@ -0,0 +1,14 @@ +package cn.zyp.stusystem.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class UserVO { + private Long id; + private String username; + private String role; + private String name; + private List permissions; +} \ No newline at end of file diff --git a/target/classes/cn/zyp/stusystem/common/GlobalExceptionHandler.class b/target/classes/cn/zyp/stusystem/common/GlobalExceptionHandler.class new file mode 100644 index 0000000..add4203 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/common/GlobalExceptionHandler.class differ diff --git a/target/classes/cn/zyp/stusystem/common/Result.class b/target/classes/cn/zyp/stusystem/common/Result.class new file mode 100644 index 0000000..642f9c6 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/common/Result.class differ diff --git a/target/classes/cn/zyp/stusystem/common/ResultCode.class b/target/classes/cn/zyp/stusystem/common/ResultCode.class new file mode 100644 index 0000000..0e359cd Binary files /dev/null and b/target/classes/cn/zyp/stusystem/common/ResultCode.class differ diff --git a/target/classes/cn/zyp/stusystem/config/SaTokenConfig.class b/target/classes/cn/zyp/stusystem/config/SaTokenConfig.class new file mode 100644 index 0000000..68841cc Binary files /dev/null and b/target/classes/cn/zyp/stusystem/config/SaTokenConfig.class differ diff --git a/target/classes/cn/zyp/stusystem/config/StpInterfaceImpl.class b/target/classes/cn/zyp/stusystem/config/StpInterfaceImpl.class new file mode 100644 index 0000000..0959dd2 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/config/StpInterfaceImpl.class differ diff --git a/target/classes/cn/zyp/stusystem/constant/PermissionConstants.class b/target/classes/cn/zyp/stusystem/constant/PermissionConstants.class new file mode 100644 index 0000000..ae3d640 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/constant/PermissionConstants.class differ diff --git a/target/classes/cn/zyp/stusystem/controller/LoginController.class b/target/classes/cn/zyp/stusystem/controller/LoginController.class new file mode 100644 index 0000000..d2e96c7 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/controller/LoginController.class differ diff --git a/target/classes/cn/zyp/stusystem/dto/LoginDTO.class b/target/classes/cn/zyp/stusystem/dto/LoginDTO.class new file mode 100644 index 0000000..640db5e Binary files /dev/null and b/target/classes/cn/zyp/stusystem/dto/LoginDTO.class differ diff --git a/target/classes/cn/zyp/stusystem/entity/User.class b/target/classes/cn/zyp/stusystem/entity/User.class new file mode 100644 index 0000000..7300b2f Binary files /dev/null and b/target/classes/cn/zyp/stusystem/entity/User.class differ diff --git a/target/classes/cn/zyp/stusystem/mapper/UserMapper.class b/target/classes/cn/zyp/stusystem/mapper/UserMapper.class new file mode 100644 index 0000000..8f08a3b Binary files /dev/null and b/target/classes/cn/zyp/stusystem/mapper/UserMapper.class differ diff --git a/target/classes/cn/zyp/stusystem/service/UserService.class b/target/classes/cn/zyp/stusystem/service/UserService.class new file mode 100644 index 0000000..d496db4 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/service/UserService.class differ diff --git a/target/classes/cn/zyp/stusystem/service/impl/UserServiceImpl.class b/target/classes/cn/zyp/stusystem/service/impl/UserServiceImpl.class new file mode 100644 index 0000000..49061b7 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/service/impl/UserServiceImpl.class differ diff --git a/target/classes/cn/zyp/stusystem/vo/LoginResult.class b/target/classes/cn/zyp/stusystem/vo/LoginResult.class new file mode 100644 index 0000000..af95660 Binary files /dev/null and b/target/classes/cn/zyp/stusystem/vo/LoginResult.class differ diff --git a/target/classes/cn/zyp/stusystem/vo/UserVO.class b/target/classes/cn/zyp/stusystem/vo/UserVO.class new file mode 100644 index 0000000..182317b Binary files /dev/null and b/target/classes/cn/zyp/stusystem/vo/UserVO.class differ