From 99128aa40cfb6286420687619dc7eea8c0bc4aae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E4=BA=9A=E9=B9=8F?= <13666640+zhao-yapengaaa@user.noreply.gitee.com> Date: Tue, 18 Nov 2025 16:16:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E8=87=B4=E6=9D=83=E9=99=90=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=AE=8C=E6=88=90=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/GlobalExceptionHandler.java | 51 ++++++++++++ .../java/cn/zyp/stusystem/common/Result.java | 63 +++++++++++++++ .../cn/zyp/stusystem/common/ResultCode.java | 23 ++++++ .../zyp/stusystem/config/SaTokenConfig.java | 24 ++++++ .../stusystem/config/StpInterfaceImpl.java | 24 ++++++ .../constant/PermissionConstants.java | 42 ++++++++++ .../stusystem/controller/LoginController.java | 58 ++++++++++++++ .../controller/PermissionController.java | 38 +++++++++ .../controller/RolePermissionController.java | 37 +++++++++ .../java/cn/zyp/stusystem/dto/LoginDTO.java | 9 +++ .../stusystem/dto/SaveRolePermissionsDTO.java | 9 +++ .../cn/zyp/stusystem/entity/Permission.java | 25 ++++++ .../java/cn/zyp/stusystem/entity/Role.java | 21 +++++ .../zyp/stusystem/entity/RolePermission.java | 19 +++++ .../java/cn/zyp/stusystem/entity/User.java | 23 ++++++ .../stusystem/mapper/PermissionMapper.java | 9 +++ .../cn/zyp/stusystem/mapper/RoleMapper.java | 10 +++ .../mapper/RolePermissionMapper.java | 10 +++ .../cn/zyp/stusystem/mapper/UserMapper.java | 9 +++ .../stusystem/service/PermissionService.java | 13 +++ .../service/RolePermissionService.java | 23 ++++++ .../cn/zyp/stusystem/service/RoleService.java | 11 +++ .../cn/zyp/stusystem/service/UserService.java | 18 +++++ .../service/impl/PermissionServiceImpl.java | 23 ++++++ .../impl/RolePermissionServiceImpl.java | 75 ++++++++++++++++++ .../service/impl/RoleServiceImpl.java | 21 +++++ .../service/impl/UserServiceImpl.java | 15 ++++ .../java/cn/zyp/stusystem/vo/LoginResult.java | 10 +++ .../cn/zyp/stusystem/vo/PermissionVO.java | 11 +++ src/main/java/cn/zyp/stusystem/vo/UserVO.java | 14 ++++ .../common/GlobalExceptionHandler.class | Bin 0 -> 3057 bytes .../cn/zyp/stusystem/common/Result.class | Bin 0 -> 4064 bytes .../cn/zyp/stusystem/common/ResultCode.class | Bin 0 -> 1628 bytes .../zyp/stusystem/config/SaTokenConfig.class | Bin 0 -> 2184 bytes .../stusystem/config/StpInterfaceImpl.class | Bin 0 -> 1332 bytes .../constant/PermissionConstants.class | Bin 0 -> 1471 bytes .../controller/LoginController.class | Bin 0 -> 3197 bytes .../cn/zyp/stusystem/dto/LoginDTO.class | Bin 0 -> 2372 bytes .../cn/zyp/stusystem/entity/User.class | Bin 0 -> 4946 bytes .../cn/zyp/stusystem/mapper/UserMapper.class | Bin 0 -> 383 bytes .../zyp/stusystem/service/UserService.class | Bin 0 -> 431 bytes .../service/impl/UserServiceImpl.class | Bin 0 -> 2815 bytes .../cn/zyp/stusystem/vo/LoginResult.class | Bin 0 -> 2469 bytes .../classes/cn/zyp/stusystem/vo/UserVO.class | Bin 0 -> 4016 bytes 44 files changed, 738 insertions(+) create mode 100644 src/main/java/cn/zyp/stusystem/common/GlobalExceptionHandler.java create mode 100644 src/main/java/cn/zyp/stusystem/common/Result.java create mode 100644 src/main/java/cn/zyp/stusystem/common/ResultCode.java create mode 100644 src/main/java/cn/zyp/stusystem/config/SaTokenConfig.java create mode 100644 src/main/java/cn/zyp/stusystem/config/StpInterfaceImpl.java create mode 100644 src/main/java/cn/zyp/stusystem/constant/PermissionConstants.java create mode 100644 src/main/java/cn/zyp/stusystem/controller/LoginController.java create mode 100644 src/main/java/cn/zyp/stusystem/controller/PermissionController.java create mode 100644 src/main/java/cn/zyp/stusystem/controller/RolePermissionController.java create mode 100644 src/main/java/cn/zyp/stusystem/dto/LoginDTO.java create mode 100644 src/main/java/cn/zyp/stusystem/dto/SaveRolePermissionsDTO.java create mode 100644 src/main/java/cn/zyp/stusystem/entity/Permission.java create mode 100644 src/main/java/cn/zyp/stusystem/entity/Role.java create mode 100644 src/main/java/cn/zyp/stusystem/entity/RolePermission.java create mode 100644 src/main/java/cn/zyp/stusystem/entity/User.java create mode 100644 src/main/java/cn/zyp/stusystem/mapper/PermissionMapper.java create mode 100644 src/main/java/cn/zyp/stusystem/mapper/RoleMapper.java create mode 100644 src/main/java/cn/zyp/stusystem/mapper/RolePermissionMapper.java create mode 100644 src/main/java/cn/zyp/stusystem/mapper/UserMapper.java create mode 100644 src/main/java/cn/zyp/stusystem/service/PermissionService.java create mode 100644 src/main/java/cn/zyp/stusystem/service/RolePermissionService.java create mode 100644 src/main/java/cn/zyp/stusystem/service/RoleService.java create mode 100644 src/main/java/cn/zyp/stusystem/service/UserService.java create mode 100644 src/main/java/cn/zyp/stusystem/service/impl/PermissionServiceImpl.java create mode 100644 src/main/java/cn/zyp/stusystem/service/impl/RolePermissionServiceImpl.java create mode 100644 src/main/java/cn/zyp/stusystem/service/impl/RoleServiceImpl.java create mode 100644 src/main/java/cn/zyp/stusystem/service/impl/UserServiceImpl.java create mode 100644 src/main/java/cn/zyp/stusystem/vo/LoginResult.java create mode 100644 src/main/java/cn/zyp/stusystem/vo/PermissionVO.java create mode 100644 src/main/java/cn/zyp/stusystem/vo/UserVO.java create mode 100644 target/classes/cn/zyp/stusystem/common/GlobalExceptionHandler.class create mode 100644 target/classes/cn/zyp/stusystem/common/Result.class create mode 100644 target/classes/cn/zyp/stusystem/common/ResultCode.class create mode 100644 target/classes/cn/zyp/stusystem/config/SaTokenConfig.class create mode 100644 target/classes/cn/zyp/stusystem/config/StpInterfaceImpl.class create mode 100644 target/classes/cn/zyp/stusystem/constant/PermissionConstants.class create mode 100644 target/classes/cn/zyp/stusystem/controller/LoginController.class create mode 100644 target/classes/cn/zyp/stusystem/dto/LoginDTO.class create mode 100644 target/classes/cn/zyp/stusystem/entity/User.class create mode 100644 target/classes/cn/zyp/stusystem/mapper/UserMapper.class create mode 100644 target/classes/cn/zyp/stusystem/service/UserService.class create mode 100644 target/classes/cn/zyp/stusystem/service/impl/UserServiceImpl.class create mode 100644 target/classes/cn/zyp/stusystem/vo/LoginResult.class create mode 100644 target/classes/cn/zyp/stusystem/vo/UserVO.class 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 0000000000000000000000000000000000000000..add4203b28928d8357d60fa7f7e6f58a611bf92b GIT binary patch literal 3057 zcmcIm-*Xd19RF@fnlw!*4YYv8DpD{l(nTwxq!dFbZJhv}7CWOpZ7xf?^m5y|+Z6DX z@#l;)Dk{^NI?9ub51>4Vqoch0e2l0yqoh!W^8uYLRb z>d&QLJ}uF^EBD1mbb%f}I2gEQh{*W0`uY=-u!XFHlPs3eur- z+$-9M9_FqqT>>YPGnozUdF2WxpBl^5**L$CZ1J)^Fd7Lc)Jp z`R3Eg2M_$N80>-G2=v8aFYF^QsJX6FhZT^Ari*HkJ4#qg3F%B;xA?MtAP~!Qb%A>x z%X0#Il0#cljKLEcx1YeFYWj|l^op=KOBBpv)w`v4-&wzTcm1=~%KiHh7$h*#$fPM-W|zE<}}CZ>SsZUTxuL$+CNvs(kt)<;R$p-?Ko0Z>kyMUm62|qdb%L; zS9Ffoq`O3~@hr^>Cr4QjOaD2`2pnEvb`ez^2&Q3{y9MESn``{_W+DxvTA7g1CX-=; zC6NC=vN8JJ7uYf`HpRDM#jz$0Z)^{vQR~SXc6I9xCbgC9d+QdZ zje!Ja{u`n(yV$%ex)wi=8zUYc%p1mt-V6zhx4h)x5kgH!N4e6*Z7rQ!5f)FuK{$j* z8vTm^u7S{w*TdMNcqe!d4?hI*JwCL-5xnYdz_ZG;c#Zo3kc1&@5g3M}5ULJ7jnNvk zqlbKwi2Mj0-(jO3AW;SA^Mh&t7!J?DF$5aH=rF;CPD2ko4$tF#Cw9Gn|IxRASk=H6 z;lx(PTZwK19jX#r@yBcy=a;~XWx~y2rx`$K>L22_nh;b^PKa(|N7r| ze+4j&PqRoMnTBD(L`q@svHip@H*9yke0TM+QwtPQQ+2l<%qS!a#g#NN3Kwc_`Lpe< zvLCelZ9j0D<(k)QdT#l?Zx#}(4P6U=&Rj)GBGD6V91Qr6nFn&bN- zH)J7)pV1QKs{XpdaAC3M$5PO$yX%w16%ie_FoM%s<(wVZeX`o;NH%ZbB+e?_jBD#i zEIuE@q!>GA;XE!Vm`_{EbQagVVVZ0>7s>8xJ>-DFbrxz7RM}H#m^bnreMzP zRV_jV3q_3cJe%Zn=aGfz+@1%v9U67rd z7GA-tOaynrM4T!V_qrvNdELSrVld^1wJ?j57N#(*)#}vjKHYUUfj2F@B_3opY=1+T zks}%3u`r7{h0{%Y)0y?$njO4f54i36f$avq!W;X=KjvRIw|mH=FtAi#ckQ6vA`6qt z%ae?#rsT=Ry6fC&H&>n3vc1~ic5czD*^L#uRhN0RXapN|x^VHZY%7fHKEA!xQE~N< zvr}|yhK{9LVHvR)t4^@tt=+R*cGC%*7VW<^wOrYYc&5Ok#UrY}%$y!Veue1+>>PHq zgW=u*=YK*0byV&u<4#jJ9Le1SJc&i|h{`&SjNWg%LA~iLxKHYSofLW7b-ln2>SU_0 zr{OhMz0LBwj_b7Sz*%ET%|bEcTq;b|ih}aE=mi@N+e${LH5N93fp94rhs(O`vwB@m zt{eh-YFt=!d?~PNn^k)&BCvVy{zCN@X|J`LV_I1z@HBjd!v2wp1u7~qh3t~oZq=Om zy41@t-S%ISsv~LN@w~tfTK1M^uYWRy%`6&drr}D76Zu%LK9)8K$;;xk{X9IG*@|>vq1C@&#=l+892j5^|u{4B#?jT#ro!G%(X?zE#N?&ka zTN$Avz-eS~hC1>Xrk=AH4Xuu7J#y<&CWBMBL;EVU-`kt-?p3*WmoroG2qLuiLg#)( zRpQ+F5QvC;i!j2UDi2FXK3G z)*P-A+Kmv*MXe;t4Aq6XVaa1Cgq7%qRj*WOR=^BMGC|=Eprz2e<;c716q7t@}&?BKPIc%@=eq*6)cO_51` zkK9un&zt#FN5~Mi8?oxqIlZkN>gKeK2VpxM#v?prM@q1G=I~ptCGi?&@H>tSEHm>T za%56^6d!Svigm7b!~(735p~$KeF@og=D#?RM%wxTBkbq=%cvi4Mh^$Np?uJnMMGZw z5pASL3QtXmU4H?`Y1%1ZiV}$25R$}RvyajAVV^y|Kf4X%KeQ%Yd~R@Z%9uVkIJqIo zc{CknMW)P2X0Y@W>1#Wf3D+wXLpJh8w3CrcaqHav8MvwSM;S=+%32Mp%EX&&o|kF= z6kBeM5R#0;X{>Q%#K6o&(Uus$2jfQu+F*>8k{eU0A9<`dPsqYB%#J`u#@M|?u|5(z z-9C4R3Z*OOBoGn?{#U-E+vx91IvqOXxd>k`39=$dh<79-Dxu$FojVC^pw4fG_8#+p P3oXvF9QkPD6XgF7JX{A} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0e359cd9884bab792f8d78c32b311c1a7b36d1e2 GIT binary patch literal 1628 zcma)6!EO^*6g|(Lu^nfU*i%TF041abY|~V;GzH7vJGY)Z@NR6d8&+pDX_q==Vz4PYni@yL& zV?K(Iz(n22{doI_oa=Sm+pcFebM;oU*>Z9f)9u(^p|x!GK|s-`h)v7?M z{Qt7UJ}*qmSYO+NoUG8jax>}Hk?LoVd_wsR!;KL|JHH=}Oz~H7s(djhFeao;r z=E8M>)9D^`!8Tks-(#qHZOduodl_T^KmGv?AK{=tWXf_ZZ$@CaH&ho{%G9J5hcry! zV+vfS(gLC+jfXWH!BJkOX}Ye_pk3ci9fKM}mMrUc@2}l^5GU>vN&KlmW+%SV_7Is` z41F=2V32=)`R(sVk7Ceb_*_6+`}xlLua5(xjC@+dB+kgv`1-g4N7I>I6^F4mAd2iJ zfuXYHnBRArOJ@6$v1HS7c8B|Bc2jvNOsj6#HKT3GP~CWnV>B5yF>iV|TFV!WHjkd! z=B*X)hQ%$OGFhxt;5HB(TJ2@aF>Haps?~4|uhV9T;q;EOQHX}=4~IZFohdOQ&+{AA z+S+;Df^!n4>UOsy2&xH8_LM|+&(v;mp2?G~+Um6H<^@ZtH?%pb$7MUuo@BvBIOCDo zQ8~2$caEUHbMW{^mrdvI>@y%SCI^q_DE-dj4Dny^G{If|;wu>V1Ibs=AM+&eC7%)h zokIUH1>UH3+Ih;eVOZ0QxbAB-4-tdVP!U=odoy E9WX{wR{#J2 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..68841cc7dfedd145da81135a5effc819e78fa986 GIT binary patch literal 2184 zcma)7YjfK~6g`_bk*g|=agsvXQfNu3?X;2Gl=5&1BqpT+r-j%U(gHJUd+jKZC6Ban zYkn1cNtrP40~mf2!(B^_Wt?&SL92b-d(XMA-M{}m`3u0O_*uskrZprC%wU!wb;!Hi zw7JtVpVSUTT{6r*upCQnFidB%RSijon{~%*i0=Bj>2v8G3CC<&wiKRO=4Ih^Z6P1_ z*E%$1`}~mEvh*ycmBbtwG;=v6GjAY;HyCu@XzVz3J7@@ojm)#sfJ~@W$d)FAE+nzQ zV35kL0P_H z;B8!G(0n1)A;W%V4B0cRi~}7CYatDWcNOJp40k3VyX|?dH^lZm11q?}kR-PKQ--In zr#ozCa=tolBBLQ|Acs|kg+W>?2cG+!*KEqS-V$c0t2B!wrJ?rPnci8TdV4ind9$)U;Xz zQc-nZ?5`LSMOT&Ve93aeu56}4=kU$NR`Lytrr;56q^6F z7Q^b;#19t?!}4C>NUJTXmTwW0O~-L1mzL`gk=rHLYngsW^<~rJZSmaoj+CcTypSe8 z6*ad6cZkkqo40EXzB0;ch0>CZNBcCt)VYIvhBpgYVidHc*ug-2EJ~iV;wX{5Y?V6L ztsPRpVm42~^s*axbwQm+sOg~$t|@K|_a_ZRnD>C%pCU+pq_$jF`g9$1c7;4}8~*$( zzS8kEN*ZjVESr%Tmimil2N4c_E+>3The^X>TRpSY8eQV8&fI}Ka-D<#)G z3Oa?DyHT&ic7_xyy^e^BPktCej@OMRIkH^jwq3TQD5S7OQQ6aR7i9yR*h*o8HmYjl zdxM@LdSQ$m#}Qu9=Dsg{4Ns{9N1}FC05tqa_rZ8kddR|P;Tj=M(X9_8=pv61l{Xl0r0qo-$e!}v9<9}1; literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0959dd2578a9e28e9ff7dbf0387f46a854d3b759 GIT binary patch literal 1332 zcmbVMT~8B16g|@xmX;Pu5u}O=C|E#P6-AOF36hwg6$wQW`pQDSLurq z6OGUQDC6A^N}(|tv&qcP-MQzSd+yBs{Pp!afTvhVA%?hxL>fKlWyl`!6K>bJs@bpi zk3_{V^sY)J%^E|zFuRvRACeYQY4jt_FkVr1Rh%p>*&a9gSSZ^wj$Jm+8zbus!!=>b z!t>pW+~2=x{<;}yUZhqVjl(=`W@jmWPs_Vkj0RNTpGi;!Z7uB z461@OG0b#oC>vL*8foZ~Wnq+IAP6_9BD*9#(}yvJgsbbq!nF&Ig*YjU3SF}2iHQ($_WrTac zD`K`Qwqm9U|!f?=>EmDp-F_JzC4_v;kNm2`#I_qZ$lbrejPLrK!- z{677Yjv~VlS-suvR#@_Kr}5ztD|UEru@&bYFj)1o^ONh?A0aR#gU`DyCn(^&kr5#E z;gv9ly1LC>-Vo#$6_YH>n&PJEQqGJ2(zV(lC1P5m!uzT49XcRk$*Hn#x)t$U`sR*Y z?$@HPl_9^=R7N($p7bQSzOIxu+|b1dOxJGB_8k9|9{BR#YxkH=f^da4RI$CG8;({& znIb0XiGkrZUGF%}bgOBcrj<=Iqq%493)m-miD8CD|1;<|-=#4fZa@LEw4!cfo_Z}aCP{tOj5MoQv; SQWC?XK+|I^)9gF+1o#b0)JsYL literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ae3d64071d6e2d35938b7cf3ae187f1ac130081c GIT binary patch literal 1471 zcmb7^TT|0O6vzKdX_JNmB_eVY0Yw3YAl{G`w6+1NH}UzKY$;~@g!+s8F(=doBYn6`|in~zdwEhSil{HO(2RGL-K$hbFIqlJ#BsW zz$|+Vv9x7d-XcR}d}2$2%+M7m)jg}Kt#EgLl^-dP5Q(D=2?^~9bfA-As%&c?PL4F! ztGg$zXC7+hn(cbr_OuPtIka5Ys@d6w$feMm>jiyhL*HD@8%BP8&0y#(oJXQ4DH&Z1 zQC>N;YzfycWNUbiW$($j&Y+a5+;!)VE%UvM8w~M~d8Hzw?`+$wSe}dlhD5ksF{`F$ z%D71qO1Wa%Uc<#LhPI|8a55sOgl=v#bTm~$M+(MpSHisn#xc>%G-z4Iarg<<8{=-l za;d>%^=&$)5Hh(OMGL?6T)s#~A>{OeUepPV;@h0QR&1EHH8C(e+YC)R znww4IxMA(t+^aj3;IhzSx?SnZMF|T28C;>Um|CRLTeGzaIqWQ0wz*b6+%=sd->s5F zE!4`qy2TyK=Z3J=+qdZawZeZ52!)Z;gN9ny{o~Hf#fe{+X78>*f z`tTS}!0?o)1xey(0?!c72|P>uT;Oivd4YR~Qv&xArv>gOUJ!VYcv0XX;uiuB6TcLA zl$d@Zly4@;_Z8(#laCm!S(0epuqZCzpjZ#eQH%gK^Xq04i$S5Ua>M*U6I%<5w zo$r{8VB0sI5p791>MIAjmsDq?LYTpGH+~rmei=PfDbNcA1C;zQ9Qv1h#02f;N#26j F{{SKwOw|AY literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d2e96c71ffea994ffb2474f935087278b4559dd3 GIT binary patch literal 3197 zcmbtW>2nih9DcS<*)}X~DTlOxPy}oWWuY7*Db;dGF+FVBAfUoF*_NfrZrI(l2E6b< zJWvos0T1*O-$2I+MP?j7`N97K(Eq`4eBMpcBqR*XIGOBw{m$oiyzig?{`wn$?fAiu zDpbqxDX76L3600JNllGw=D0dAdQ6YH5@vN7rr~x=sBQ~H>QIY18GZ$`p-5O0HPsX8 zr0TdSC+)a;LXBFcYg_TSZmS_{+%R{}tR>7&Il3Lz?MWl5OIRH$W9G3qQ%4GPK|kuz zAfr*iTr^2oTE-M}t*okD!voYYuDgQW)DqM&zbz0dcocSR!yFIJ#(XT0u~5MiSR`R( znZycaNSH&xJJJQwoo(fk1LZF1rfaxq&m+3hg2ghHC|D|7SyHCBh&b!XpyoJJmK_ry zEcRnLT4k(I@Dx^-gevP8L!}>2X>muwf@0&cfeZ!?)?&4UMfWdWzjx-=-E(K}ow;=P z#_9XlPW^rH@?SS@_|b-djCKWUuvWs8W!6QlM8Y!FA>B#EnHM#>ZCkd4&27Dpg+vLv zhs8PtD%MjHq3w-HXex1Rs-I7lG_n@SKRE zOi4rDUJrK2*r{L_c1u|CXo0LKM<kt>+k~h%IHc3Oy)C9qe<~VfWk}dm3~zCcK6oD#HI1Nz=AjfjVnUA?jxie7drZ@EHJ4>bky}HSJ+3-Q z(WS?1BFfe`p^oaB>8N8`)V1uis?9K{Jt^0kGHg9YvA&&FjQzeLWSDw?Dlw|t!y3i2 zr-ZDi7LRDQA=bG~pL^7xzK(LgAAWsNNlyi!if^A_h5ldK^%xJYMR`}%vU2q$(&$x+ zR}ourIbqRFLBkr0iqy*^UIl_R!V7UpIddVnOa;%Ld{1w!NL-Y8RJO1b(R4D8>dFVK z=qhRgxnk-j|D3R^MJL!xa=~cq)7_(1Y)}&scXgYAsS6w9rsk$>1~B%2LGOB`Pr|Cr z6?1P&A5}*UGgh2-gO=mc`lNVDu-iC~>T5zXj&Wdn&z5m*cqgnYnpu-ye^h++@!5O2>#>}_Rs^sL>)BzqbJmA; z>_-Q$rgbm~kj;~m*gz~g@i8{x0ui{1E%*^zJ$$;e807FF8aRWGh*LeTkp2?_-p4y} z1fLSEBiM_x_>5LuAiAI99FaUvO9aMQsxL@&fjf1m`UlHpwAA7vmo*Zl0$=i9g-c#Q m>&f#K|6d=1p%Z}_8WjXY^4xG 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..49061b722d6b3647bbabc4d038613cd5a81cb938 GIT binary patch literal 2815 zcmb_eOLr7S6#gp7(37Si!w^6uVh90~@My&c;1HBVkTJt^AP6X0(^E{E^mI+Ss{?}% zcCOj7bLYYhZo)Zujj>LzwmiFqvAEk|aI5H5n zlG0mrl^sT{mJF0#Js0_oc2_b{#C8M27It7K!`%NED?^`HVmL8TxyP5e?Qy?hU#i^` zjw*GJOm+|H&|a~y8?RDcq%RnTX`@|O21Xc0x{@S(<*K%=(_>;UUN>wD1Nd7z!QiWCBBe zfrksTvQ7x3u5unz44VmFN9Gf-MmTKY2#%5t#Ztt*kYPs;(k5@|jl5~$E$wM-gmbQ6 z*VeZ!yrcKHha9Ztn0sYkiQq1G#H`1|Fpu{bj<1{OjRj-k1P&WGxn`?LR<-|`V8f9kzsGyUnU9FN0ZY(S{Ibw zSX5Mqq;FylmvyPS@}JzMGMbz>P-PhJk};vgH7iqQ7zPqK4OLuUT#TAE5nSUnj|5h% zNQZm#oIKNaIyj&fT#}SsSrs}jQ&qGqPOs#AtzS>{&*??%m>JOar_sm^tD z9WvA9B%_4*%RHd7Kr*FBw~u$&6Um7jC&gyHuXAuqJ?aCUsw5{2`!fNohd|q|D();^ z;H{Lu!GA@;@Waa#^VOWiv{pO!%&Bg!nsHT+s}woZ1-^Sume12Y?5plF2_)Xls*D0h zoO87Lyvpk z>yh)s$9eA8JrRyqq+Ez61C>1a>ltXA@ z50r%|j1{mPABV0JmCaQaF?G^Uw|7pzKt-wS`yz--k_ZiaMMbc4Jkkhy?bX0HRBkq& zN}5lIp&Ktxf0P)mlFxo>>CY0quhExHEu%I!^$hGM>h$3{y|o!IF;8zRnSdMkl)e~l z;ug))i{}WekJ?>RD=?m83vg%!+g_l!f?Y4L=P8-8a9d)yoyn3EjuzuKJ|o!AX?Bj$ z2MQ+c;0qekKK>vdnybg;EfBVzmNK}#dC3g2lYQLeiHWw)` literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..af956608bd3f696d7784b5eb9d6b7f3109295869 GIT binary patch literal 2469 zcma)8TT>%N6#hDynM}d}SzIo0BNt^gA+YhnuDc1WE(lB3aFHNZ>5D^X$t=kXW;#^i zFR}aq^1_2wDOT-+r7vrhzrmm3qw9KlW|9nSinT&A-KS4~ea?5j)5D+tKKT{EA}R?) z5RE}Gph9CvJ~ofdeBHDU@|$~)c~vlI3zlt(`wY=cb~g?k@fZ>Y`d~0jRPFpXCr5c# zwA>R{@J9aF$(Nl2%iiX0t4_OB;T&?CVW`|iu85{(9~33lfPq0I8T6LRnH9AmYfGhMbs=hd8+3zp^6q6Zfv(~VKsQkKDJzoARgGZBTQjY0usIMH1?ds z{6lW@rYZP7ZPDEh`xiyQl5dP{Z(nU)+!xT0wu`E0m@8dei{h_x6>QZ|nm zrn`+~*~cX5ypQfHY1OO>r+LEgZCFErqYt`f+WU3xPM00$uys^?u@^#?3mbP%j(89E zFGBw9-V2!mh-I^0uULW?b(9${<#<0n7^M%ZN zB^1La4C7b3Qpx=6F-1)tp{9(`hpselL^l#W;~?QcBYTEsd73eLsx!ZU{ph)6=~wfN z8fIv0_zuWnmS%Io>MeRwuVd^5pq~)?ffgg^0_iUWqT8qkQ2%A1_)CHEcpFhKwE_W3 z3bdKr&xrNTZN&Eoa+7&WvKZc>eJXV-F?KQGckx~?`2PP3FKf_&my?U|bWaEHe^X>J zilUaA`5vlrmirz0cTl5ex!<6#&(56Vnm47v@Ww3t6qLC?(3eu4;@T;Uxs-B_RNEt6 zP{}1-&{C@O(Vk-H6#XeRrL~=uGde38Dw$vVH9v+9KQ+wbHYG5O3hs~|BACWUc%N)h zs?2@drIA8?J%xKTQn5~No&t?D6bXNl-m&^W7>GfChLIQ|^ry3D81skm4l(nWh*9L5 zF(Bq19WTqON=9VVVWIg^`&CstQL7ZIj5?_5olEFUzS0Or_QPNFROwkr78jI7kKA;! zSR-onWbPEPxpPc@DedWkA{SChu%b)CX(`>C$ax<%2q{XGEzrLyvJ-C;ZHshjf`t14 z&7u^`C_bc-;*s_U%5yR(L>gm66c~F>PThG#8it{^9ojz1MH9JQ65E4L^WK%Pl=Xm2 uSSI&`>Wa(F7rqV#f=t5ljbh0w$1+I*bpJ4{(D!2!0Vq3$4Qyc>ss8}19^v8u literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..182317bb49b11d8e1831c04a4ed799abfd65b641 GIT binary patch literal 4016 zcma)8YjYdb8Geqmt6fR!#4)*`Bv4vRu;my9dI6+3Z7>PAm6H$$(?Tz-<;C7u-Zk2l z!F=mXr_-Td;1f)LK=UP?X$MGW7={5p(3$=Len9&(xIOQlm9&xt&Wz>rp7%WObIyA^ zXaD>4haUr2z+MSCx~PHj~*`d)%0PQNRy4_#u9zU~YKv5*?YEnaw~GS0r}R z4jvNDf+vKLSU&7v2D3a7EhQG(!J|X=sfz-ib8uGR7U9?FrRW}UQ0wWg&{5Gn>fkZ_ zSm6+H*RsC$PnPvIho3t586Ky%n{KqZ7_KwO%;3@#^ZulRIvNTmw%sjnF$`L6{DL17 z6hyHb#Ejp~Y+Mp&GtQ@nzkAK#VA&X^Gz!HPe^!=p~Fo- z@UC>X*SyXRcdeb&QP^_Zt8T}ad8#zxO`lGkZhm*UlJnH{ZV>z1-cqpZM?S4D20<9R zv9748W;@(o3%6>|c!Ae(V{e@%XL?CJ=)7j6tLUD6ah+XdwJv+{X1IRM?J(D|*Wp>q zG#C`mP?@H26GMwAsTnOvrLaDz8>)}qp8Yd6#PoP`C{TMlyn@)hvN%0Bk2$TkH>dS(&h!wg9fvw2 zJnc%@?X07<}h}?fn@l#=pm08s7l>kIqd@!x zYHFM*j%M}WQ2$CGKj;5KqO|Y}%8mx$BA()GFjB021LaJiTKov zA(|K^Dji6~M`#Sukx`=Zfkb?{#tiBY17F+@6Nmqvnq8PBAI zb)GOM38~I~0Bd~uj%!4kK1r?Ai^8+CGuhuPlHr^#;g{p+C+?PB%CJu_lVSQ_ji*0y zxAaooeR`P;(>KS{AH7?8X_`L0Oor)~aRo+_%w{(BCxkwqsd(Kw`(v+r@hZ`}tqT0? zTNrFu;f6Zt*G4wx=b6rm`h*)#kl>5C>fd1+x92{E{WqBT+jF15UOrpBgHy?r!Vj*T z<-fWy{~weq#^*S43(kDSxPu3Kh%};oHj;nRF88bW3p|JG zjN37Mh812+{Dj4OxItYWRr~|bQ!>~mZ()^^iDkTr7bx+$!WMo_$wCJnenZK|+qjGu zDHZV!yYMASCEVfV_FGD2e1uc@9VG|9=h-e|%Cf)2Aq)0bIBp@wKU;l;d$m|RSnRdl zb0gJd$aj6(dQZ|f>1!&_hdpQBCEzfLyJ z8w*LHoStlKvP|sBxm&R2@8Bmdi~daAkcEnouGmsMdZ}7BlO@(oVq{m$-qL)%kSrDY zOROesb*^qDODv?+%1V|_k59WKhsR8P%;PWk174<&CjJbUQjUrGBi8759uHy@ElSd! z%UGvmGQE#6$&&UMC-4d-D@o%2Q2K@n!-B0869=WfA;n;x6U8x@JwOj*469ODAp;vA zN3|)~8U_#WV-`{qd!Na`YWx}vM=p?!{(JT`10!$#NlCmUnZGK3^ZcFr5KjQ3Z&UU| i;AEPN?7f(0=%qw`+~jDJeT%