diff --git a/.vscode/launch.json b/.vscode/launch.json index 0761bc2..a3e34d5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -8,10 +8,12 @@ "mainClass": "org.xyzh.App", "projectName": "admin", "args": "", - "vmArgs": "-Dspring.profiles.active=dev -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Duser.timezone=Asia/Shanghai", + "vmArgs": "-Dspring.profiles.active=dev -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Duser.timezone=Asia/Shanghai -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8", "console": "integratedTerminal", "envFile": "${workspaceFolder}/.env", - "preLaunchTask": "set-console-utf8" + "env": { + "JAVA_TOOL_OPTIONS": "-Dfile.encoding=UTF-8" + } }, { "type": "java", diff --git a/.vscode/settings.json b/.vscode/settings.json index e5ab953..07b99a6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,5 +9,18 @@ "editor.tabSize": 4 }, "maven.view": "hierarchical", - "java.compile.nullAnalysis.mode": "automatic" + "java.compile.nullAnalysis.mode": "automatic", + // 终端编码设置 + "terminal.integrated.encoding": "utf8", + "terminal.integrated.defaultProfile.windows": "PowerShell", + "terminal.integrated.profiles.windows": { + "PowerShell": { + "source": "PowerShell", + "args": ["-NoExit", "-Command", "chcp 65001"] + }, + "Command Prompt": { + "path": "cmd.exe", + "args": ["/k", "chcp 65001"] + } + } } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 3fad0b1..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "set-console-utf8", - "type": "shell", - "command": "chcp", - "args": ["65001"], - "group": "build", - "presentation": { - "echo": false, - "reveal": "silent", - "focus": false, - "panel": "shared" - } - } - ] -} diff --git a/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql b/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql index a91c036..a84cdd5 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql @@ -18,7 +18,8 @@ CREATE TABLE `tb_sys_dept` ( KEY `idx_dept_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_dept` (id,dept_id,name, description) VALUES ('1','default_department', '默认部门', '系统默认创建的部门'); +INSERT INTO `tb_sys_dept` (id,dept_id,name, description) VALUES ('1','root_department', '超级部门', '系统超级部门'); +INSERT INTO `tb_sys_dept` (id,dept_id,name, parent_id, description) VALUES ('2','default_department', '默认部门', 'root_department', '系统默认创建的部门'); -- 角色表 DROP TABLE IF EXISTS `tb_sys_role`; @@ -38,6 +39,7 @@ CREATE TABLE `tb_sys_role` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('1','admin', '管理员', '系统管理员角色'); +INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('2','freedom', '自由角色', '自由角色'); -- 部门-角色关联 DROP TABLE IF EXISTS `tb_sys_dept_role`; @@ -55,7 +57,9 @@ CREATE TABLE `tb_sys_dept_role` ( UNIQUE KEY `uk_dept_role` (`dept_id`, `role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_dept_role` (id, dept_id, role_id) VALUES ('1', 'default_department', 'admin'); +INSERT INTO `tb_sys_dept_role` (id, dept_id, role_id) VALUES +('1', 'root_department', 'admin'), +('2', 'default_department', 'freedom'); -- 用户-角色关联 DROP TABLE IF EXISTS `tb_sys_user_dept_role`; @@ -74,7 +78,7 @@ CREATE TABLE `tb_sys_user_dept_role` ( UNIQUE KEY `uk_user_dept_role` (`user_id`, `dept_id`, `role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_user_dept_role` (id, user_id, dept_id, role_id) VALUES ('1', '1', 'default_department', 'admin'); +INSERT INTO `tb_sys_user_dept_role` (id, user_id, dept_id, role_id) VALUES ('1', '1', 'root_department', 'admin'); -- 权限表 DROP TABLE IF EXISTS `tb_sys_permission`; diff --git a/schoolNewsServ/.bin/mysql/sql/createTableUser.sql b/schoolNewsServ/.bin/mysql/sql/createTableUser.sql index 4ea085a..e6c4082 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableUser.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableUser.sql @@ -43,7 +43,7 @@ CREATE TABLE `tb_sys_user_info` ( UNIQUE KEY `uk_user_info_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_user_info` (id, user_id, full_name) VALUES ('1', '1', '管理员'); +INSERT INTO `tb_sys_user_info` (id, user_id, full_name, avatar) VALUES ('1', '1', '管理员', 'default'); DROP TABLE IF EXISTS `tb_sys_login_log`; CREATE TABLE `tb_sys_login_log` ( diff --git a/schoolNewsServ/admin/src/main/java/org/xyzh/App.java b/schoolNewsServ/admin/src/main/java/org/xyzh/App.java index 1a2ffac..b1c8e8d 100644 --- a/schoolNewsServ/admin/src/main/java/org/xyzh/App.java +++ b/schoolNewsServ/admin/src/main/java/org/xyzh/App.java @@ -3,6 +3,7 @@ package org.xyzh; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; /** * @description 校园新闻管理系统主应用入口 @@ -11,6 +12,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; * @copyright xyzh * @since 2025-10-05 */ +@EnableTransactionManagement @SpringBootApplication(scanBasePackages = "org.xyzh") @MapperScan({"org.xyzh.system.mapper", "org.xyzh.news.mapper"}) public class App { diff --git a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/permission/PermissionService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/permission/PermissionService.java index c9e1733..a598b0a 100644 --- a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/permission/PermissionService.java +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/permission/PermissionService.java @@ -6,6 +6,8 @@ import java.util.Set; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.permission.TbSysPermission; +import org.xyzh.common.dto.role.TbSysRolePermission; +import org.xyzh.common.dto.menu.TbSysMenuPermission; /** * @description PermissionRemoteService.java文件描述 权限远程服务接口 @@ -17,6 +19,79 @@ import org.xyzh.common.dto.permission.TbSysPermission; public interface PermissionService { + /** + * @description 创建权限 + * @param permission 权限对象 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain createPermission(TbSysPermission permission); + + /** + * @description 更新权限 + * @param permission 权限对象 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain updatePermission(TbSysPermission permission); + + /** + * @description 删除权限 + * @param permissionId 权限ID + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain deletePermission(String permissionId); + + // ----------------------角色权限管理-------------------------- + // 角色权限绑定 + ResultDomain bindRolePermission(String roleId, String permissionId); + ResultDomain batchBindRolePermission(List roleIds, List permissionIds); + // 角色权限解绑 + ResultDomain unbindRolePermission(String roleId, String permissionId); + ResultDomain batchUnbindRolePermission(List roleIds, List permissionIds); + + // ----------------------菜单权限管理-------------------------- + // 菜单权限绑定 + ResultDomain bindMenuPermission(String menuId, String permissionId); + ResultDomain batchBindMenuPermission(List menuIds, List permissionIds); + // 菜单权限解绑 + ResultDomain unbindMenuPermission(String menuId, String permissionId); + ResultDomain batchUnbindMenuPermission(List menuIds, List permissionIds); + + /** + * @description 检查权限名称是否存在 + * @param permissionName 权限名称 + * @param excludeId 排除的权限ID(用于更新时排除自身) + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain checkPermissionNameExists(String permissionName, String excludeId); + + /** + * @description 检查权限编码是否存在 + * @param permissionCode 权限编码 + * @param excludeId 排除的权限ID(用于更新时排除自身) + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain checkPermissionCodeExists(String permissionCode, String excludeId); + + /** + * @description 修改权限状态 + * @param permissionId 权限ID + * @param status 新状态 + * @return ResultDomain 修改结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain changePermissionStatus(String permissionId, Integer status); + /** * @description 获取所有权限 * @return ResultDomain 权限列表 @@ -60,61 +135,4 @@ public interface PermissionService { * @since 2025-09-28 */ ResultDomain getPermissionsByRoleId(String roleId); - - /** - * @description 创建权限 - * @param permission 权限对象 - * @return ResultDomain 创建结果 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain createPermission(TbSysPermission permission); - - /** - * @description 更新权限 - * @param permission 权限对象 - * @return ResultDomain 更新结果 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain updatePermission(TbSysPermission permission); - - /** - * @description 删除权限 - * @param permissionId 权限ID - * @return ResultDomain 删除结果 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain deletePermission(String permissionId); - - /** - * @description 检查权限名称是否存在 - * @param permissionName 权限名称 - * @param excludeId 排除的权限ID(用于更新时排除自身) - * @return ResultDomain 是否存在 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain checkPermissionNameExists(String permissionName, String excludeId); - - /** - * @description 检查权限编码是否存在 - * @param permissionCode 权限编码 - * @param excludeId 排除的权限ID(用于更新时排除自身) - * @return ResultDomain 是否存在 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain checkPermissionCodeExists(String permissionCode, String excludeId); - - /** - * @description 修改权限状态 - * @param permissionId 权限ID - * @param status 新状态 - * @return ResultDomain 修改结果 - * @author yslg - * @since 2025-09-28 - */ - ResultDomain changePermissionStatus(String permissionId, Integer status); } diff --git a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/user/UserService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/user/UserService.java index a567604..522cf5c 100644 --- a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/user/UserService.java +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/user/UserService.java @@ -16,6 +16,25 @@ import org.xyzh.common.dto.user.TbSysUserInfo; */ public interface UserService { + + /** + * @description 注册用户 + * @param user 用户对象 + * @return ResultDomain 注册结果 + * @author yslg + * @since 2025-10-07 + */ + ResultDomain registerUser(TbSysUser user); + + /** + * @description 检查用户是否已存在 用户邮箱、手机号、微信号之一与数据库中的用户信息匹配 + * @param user 用户对象 + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-10-07 + */ + ResultDomain checkUserExists(TbSysUser user); + /** * @description 获取所有用户 * @return ResultDomain 用户列表 @@ -33,15 +52,6 @@ public interface UserService { */ ResultDomain getUserById(String userId); - /** - * @description 根据用户ID查询用户信息 - * @param userId 用户ID - * @return ResultDomain 用户信息 - * @author yslg - * @since 2025-10-06 - */ - ResultDomain getUserInfoById(String userId); - /** * @description 根据用户名查询用户 * @param username 用户名 @@ -137,4 +147,24 @@ public interface UserService { * @since 2025-09-28 */ ResultDomain resetPassword(String userId, String newPassword); + + // ----------------用户信息相关-------------------------------- + + /** + * @description 根据用户ID查询用户信息 + * @param userId 用户ID + * @return ResultDomain 用户信息 + * @author yslg + * @since 2025-10-06 + */ + ResultDomain getUserInfoById(String userId); + + /** + * @description 更新用户信息 + * @param userInfo 用户信息 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-06 + */ + ResultDomain updateUserInfo(TbSysUserInfo userInfo); } diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/role/TbSysRolePermission.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/role/TbSysRolePermission.java index cf90efb..b1e8d0d 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/role/TbSysRolePermission.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/role/TbSysRolePermission.java @@ -39,6 +39,38 @@ public class TbSysRolePermission extends BaseDTO{ */ public String updater; + public String getRoleID() { + return roleID; + } + + public void setRoleID(String roleID) { + this.roleID = roleID; + } + + public String getPermissionID() { + return permissionID; + } + + public void setPermissionID(String permissionID) { + this.permissionID = permissionID; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getUpdater() { + return updater; + } + + public void setUpdater(String updater) { + this.updater = updater; + } + @Override public String toString() { return "TbSysRolePermission{" + diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/Main.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/Main.java deleted file mode 100644 index f660b7a..0000000 --- a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/Main.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.xyzh; - -public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); - } -} \ No newline at end of file diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/ServletUtil.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/ServletUtil.java new file mode 100644 index 0000000..1d765e9 --- /dev/null +++ b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/ServletUtil.java @@ -0,0 +1,189 @@ +package org.xyzh.common.utils; + +import org.springframework.http.HttpHeaders; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +/** + * @description ServletUtil.java文件描述 Servlet工具类 + * @filename ServletUtil.java + * @author yslg + * @copyright xyzh + * @since 2025-10-07 + */ +public class ServletUtil { + + private static final String TOKEN_PREFIX = "Bearer "; + + /** + * @description 获取当前请求对象 + * @return HttpServletRequest 当前请求对象,无当前请求时返回null + * @author yslg + * @since 2025-10-07 + */ + public static HttpServletRequest getRequest() { + ServletRequestAttributes requestAttributes = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + return requestAttributes != null ? requestAttributes.getRequest() : null; + } + + /** + * @description 获取当前响应对象 + * @return HttpServletResponse 当前响应对象,无当前请求时返回null + * @author yslg + * @since 2025-10-07 + */ + public static HttpServletResponse getResponse() { + ServletRequestAttributes requestAttributes = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + return requestAttributes != null ? requestAttributes.getResponse() : null; + } + + /** + * @description 从当前请求中获取token(无参方法) + * @return String token值,未找到返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getToken() { + HttpServletRequest request = getRequest(); + return request != null ? extractTokenFromRequest(request) : null; + } + + /** + * @description 从当前请求中获取指定请求头 + * @param headerName 请求头名称 + * @return String 请求头值,未找到返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getHeader(String headerName) { + HttpServletRequest request = getRequest(); + return request != null ? request.getHeader(headerName) : null; + } + + /** + * @description 从当前请求中获取指定请求参数 + * @param paramName 参数名称 + * @return String 参数值,未找到返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getParameter(String paramName) { + HttpServletRequest request = getRequest(); + return request != null ? request.getParameter(paramName) : null; + } + + /** + * @description 获取当前请求的客户端IP地址 + * @return String IP地址,未找到返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getClientIpAddress() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + + String ip = request.getHeader("X-Forwarded-For"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + // 多次反向代理后会有多个IP值,第一个为真实IP + int index = ip.indexOf(','); + if (index != -1) { + return ip.substring(0, index); + } else { + return ip; + } + } + + ip = request.getHeader("X-Real-IP"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("Proxy-Client-IP"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("WL-Proxy-Client-IP"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("HTTP_CLIENT_IP"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + if (NonUtils.isNotEmpty(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + return request.getRemoteAddr(); + } + + /** + * @description 获取当前请求的User-Agent + * @return String User-Agent值,未找到返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getUserAgent() { + return getHeader("User-Agent"); + } + + /** + * @description 获取当前请求的完整URL + * @return String 完整URL,无当前请求时返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getRequestUrl() { + HttpServletRequest request = getRequest(); + if (request == null) { + return null; + } + + StringBuffer url = request.getRequestURL(); + String queryString = request.getQueryString(); + if (NonUtils.isNotEmpty(queryString)) { + url.append('?').append(queryString); + } + return url.toString(); + } + + /** + * @description 从请求中提取token + * @param request HTTP请求对象 + * @return String token + * @author yslg + * @since 2025-10-07 + */ + private static String extractTokenFromRequest(HttpServletRequest request) { + // 优先从Authorization头获取 + String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION); + if (NonUtils.isNotEmpty(authHeader) && authHeader.startsWith(TOKEN_PREFIX)) { + return authHeader.substring(TOKEN_PREFIX.length()); + } + + // 从请求参数中获取token + String token = request.getParameter("token"); + if (NonUtils.isNotEmpty(token)) { + return token; + } + + // 从请求头中获取token + token = request.getHeader("token"); + if (NonUtils.isNotEmpty(token)) { + return token; + } + + return null; + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/PermissionController.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/PermissionController.java new file mode 100644 index 0000000..7562339 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/PermissionController.java @@ -0,0 +1,58 @@ +package org.xyzh.system.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.RestController; +import org.xyzh.api.system.permission.PermissionService; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.permission.TbSysPermission; + +import java.util.List; + +@RestController +@RequestMapping("/permissions") +public class PermissionController { + private Logger logger = LoggerFactory.getLogger(PermissionController.class); + + @Autowired + private PermissionService permissionService; + + /** + * @description 创建权限 + * @param permission + * @author yslg + * @ since 2025-10-06 + */ + @PostMapping("/permission") + public ResultDomain createPermission(TbSysPermission permission) { + return permissionService.createPermission(permission); + } + + /** + * @description 更新权限 + * @param permission + * @author yslg + * @ since 2025-10-06 + */ + @PutMapping("/permission") + public ResultDomain updatePermission(TbSysPermission permission) { + return permissionService.updatePermission(permission); + } + + /** + * @description 删除权限 + * @param permissionID + * @author yslg + * @ since 2025-10-06 + */ + @DeleteMapping("/permission") + public ResultDomain deletePermission(String permissionID) { + return permissionService.deletePermission(permissionID); + } + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/UserController.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/UserController.java index 28ce23f..a8186ed 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/UserController.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/UserController.java @@ -3,12 +3,16 @@ package org.xyzh.system.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.xyzh.api.system.user.UserService; import org.xyzh.common.annotation.HttpLogin; import org.xyzh.common.core.domain.LoginDomain; import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.user.TbSysUser; import org.xyzh.common.dto.user.TbSysUserInfo; import org.springframework.web.bind.annotation.GetMapping; @@ -29,6 +33,32 @@ public class UserController { @Autowired private UserService userService; + + // ---------------- 用户 ---------------- + + @PostMapping("/register") + public ResultDomain registerUser(@RequestBody TbSysUser user){ + return userService.registerUser(user); + } + + + + + + + + + + + + // ---------------- 用户信息 ---------------- + + /** + * @description 获取用户信息 + * @param loginDomain + * @author yslg + * @ since 2025-10-06 + */ @GetMapping("/userinfo") public ResultDomain getUserInfo(@HttpLogin LoginDomain loginDomain){ ResultDomain result = new ResultDomain<>(); @@ -39,5 +69,19 @@ public class UserController { result.setData(userInfo.getData()); return result; } + + /** + * @description 更新用户信息 + * @param userInfo + * @author yslg + * @ since 2025-10-06 + */ + @PutMapping("/userinfo") + public ResultDomain updateUserInfo(@HttpLogin LoginDomain loginDomain, @RequestBody TbSysUserInfo userInfo) { + userInfo.setUserID(loginDomain.getUser().getID()); + return userService.updateUserInfo(userInfo); + } + + } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java index 7945e66..386aa96 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java @@ -71,4 +71,13 @@ public interface MenuMapper extends BaseMapper { * @since 2025-09-28 */ int batchDeleteByIds(@Param("menuIds") List menuIds, @Param("updater") String updater); + + /** + * @description 检查菜单是否存在 + * @param menuIds 菜单ID列表 + * @return List 菜单列表 + * @author yslg + * @since 2025-09-28 + */ + List checkMenuExists(@Param("menuIds") List menuIds); } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuPermissionMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuPermissionMapper.java new file mode 100644 index 0000000..2e22b82 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuPermissionMapper.java @@ -0,0 +1,81 @@ +package org.xyzh.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.xyzh.common.dto.menu.TbSysMenuPermission; + +import java.util.List; + +/** + * @description MenuPermissionMapper.java文件描述 菜单权限关联数据访问层 + * @filename MenuPermissionMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-10-07 + */ +@Mapper +public interface MenuPermissionMapper extends BaseMapper { + + /** + * @description 批量绑定菜单权限 + * @param menuPermissions 菜单权限列表 + * @param creator 创建人 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int batchBindMenuPermission(@Param("menuPermissions") List menuPermissions); + + /** + * @description 批量解绑菜单权限 + * @param menuPermissions 菜单权限列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int batchUnbindMenuPermission(@Param("menuPermissions") List menuPermissions); + + /** + * @description 根据菜单ID和权限ID查询关联关系 + * @param menuId 菜单ID + * @param permissionId 权限ID + * @return TbSysMenuPermission 菜单权限关联信息 + * @author yslg + * @since 2025-10-07 + */ + TbSysMenuPermission selectByMenuIdAndPermissionId(@Param("menuId") String menuId, + @Param("permissionId") String permissionId); + + /** + * @description 根据菜单ID查询权限关联列表 + * @param menuId 菜单ID + * @return List 菜单权限关联列表 + * @author yslg + * @since 2025-10-07 + */ + List selectByMenuId(@Param("menuId") String menuId); + + /** + * @description 根据权限ID查询菜单关联列表 + * @param permissionId 权限ID + * @return List 菜单权限关联列表 + * @author yslg + * @since 2025-10-07 + */ + List selectByPermissionId(@Param("permissionId") String permissionId); + + /** + * @description 删除菜单权限关联(逻辑删除) + * @param menuId 菜单ID + * @param permissionId 权限ID + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int deleteByMenuIdAndPermissionId(@Param("menuId") String menuId, + @Param("permissionId") String permissionId, + @Param("updater") String updater); +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java index 9f5618a..9329621 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java @@ -73,4 +73,13 @@ public interface PermissionMapper extends BaseMapper { * @since 2025-09-28 */ int batchDeleteByIds(@Param("permissionIds") List permissionIds, @Param("updater") String updater); + + /** + * @description 检查权限是否存在 + * @param permissionIds 权限ID列表 + * @return List 权限列表 + * @author yslg + * @since 2025-10-07 + */ + List checkPermissionExists(@Param("permissionIds") List permissionIds); } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java index 4d6ffd7..8b1929a 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java @@ -65,4 +65,13 @@ public interface RoleMapper extends BaseMapper { * @since 2025-09-28 */ int batchDeleteByIds(@Param("roleIds") List roleIds, @Param("updater") String updater); + + /** + * @description 检查角色是否存在 + * @param roleIds 角色ID列表 + * @return List 角色列表 + * @author yslg + * @since 2025-10-07 + */ + List checkRoleExists(@Param("roleIds") List roleIds); } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RolePermissionMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RolePermissionMapper.java new file mode 100644 index 0000000..a2ad115 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RolePermissionMapper.java @@ -0,0 +1,79 @@ +package org.xyzh.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.xyzh.common.dto.role.TbSysRolePermission; + +import java.util.List; + +/** + * @description RolePermissionMapper.java文件描述 角色权限关联数据访问层 + * @filename RolePermissionMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-10-07 + */ +@Mapper +public interface RolePermissionMapper extends BaseMapper { + + /** + * @description 批量绑定角色权限 + * @param rolePermissions 角色权限列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int batchBindRolePermission(@Param("rolePermissions") List rolePermissions); + + /** + * @description 批量解绑角色权限 + * @param rolePermissions 角色权限列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int batchUnbindRolePermission(@Param("rolePermissions") List rolePermissions); + + /** + * @description 根据角色ID和权限ID查询关联关系 + * @param roleId 角色ID + * @param permissionId 权限ID + * @return TbSysRolePermission 角色权限关联信息 + * @author yslg + * @since 2025-10-07 + */ + TbSysRolePermission selectByRoleIdAndPermissionId(@Param("roleId") String roleId, + @Param("permissionId") String permissionId); + + /** + * @description 根据角色ID查询权限关联列表 + * @param roleId 角色ID + * @return List 角色权限关联列表 + * @author yslg + * @since 2025-10-07 + */ + List selectByRoleId(@Param("roleId") String roleId); + + /** + * @description 根据权限ID查询角色关联列表 + * @param permissionId 权限ID + * @return List 角色权限关联列表 + * @author yslg + * @since 2025-10-07 + */ + List selectByPermissionId(@Param("permissionId") String permissionId); + + /** + * @description 删除角色权限关联(逻辑删除) + * @param roleId 角色ID + * @param permissionId 权限ID + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-10-07 + */ + int deleteByRoleIdAndPermissionId(@Param("roleId") String roleId, + @Param("permissionId") String permissionId, + @Param("updater") String updater); +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserDeptRoleMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserDeptRoleMapper.java new file mode 100644 index 0000000..fc06eaf --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserDeptRoleMapper.java @@ -0,0 +1,10 @@ +package org.xyzh.system.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.xyzh.common.dto.user.TbSysUserDeptRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +@Mapper +public interface UserDeptRoleMapper extends BaseMapper { + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserInfoMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserInfoMapper.java new file mode 100644 index 0000000..a3f8ff9 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserInfoMapper.java @@ -0,0 +1,10 @@ +package org.xyzh.system.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.xyzh.common.dto.user.TbSysUserInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +@Mapper +public interface UserInfoMapper extends BaseMapper { + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java index 164aad2..21a7caa 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java @@ -27,15 +27,6 @@ public interface UserMapper extends BaseMapper { */ TbSysUser selectByUsername(@Param("username") String username); - /** - * @description 根据用户ID查询用户信息 - * @param userId 用户ID - * @return TbSysUserInfo 用户信息 - * @author yslg - * @since 2025-10-06 - */ - TbSysUserInfo selectUserInfoById(@Param("userId") String userId); - /** * @description 根据邮箱查询用户 * @param email 邮箱 @@ -85,4 +76,24 @@ public interface UserMapper extends BaseMapper { * @since 2025-09-28 */ int batchDeleteByIds(@Param("userIds") List userIds, @Param("updater") String updater); + + // ----------------用户信息相关-------------------------------- + + /** + * @description 根据用户ID查询用户信息 + * @param userId 用户ID + * @return TbSysUserInfo 用户信息 + * @author yslg + * @since 2025-10-06 + */ + TbSysUserInfo selectUserInfoById(@Param("userId") String userId); + + /** + * @description 更新用户信息 + * @param userInfo 用户信息 + * @return int 影响行数 + * @author yslg + * @since 2025-10-06 + */ + int updateUserInfo(@Param("userInfo") TbSysUserInfo userInfo); } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java index 294a3f5..2b4905c 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java @@ -1,17 +1,33 @@ package org.xyzh.system.permission.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; +import org.xyzh.api.system.menu.MenuService; +import org.xyzh.api.system.role.RoleService; +import org.xyzh.common.dto.user.TbSysUser; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.permission.TbSysPermission; +import org.xyzh.common.dto.role.TbSysRole; +import org.xyzh.common.dto.role.TbSysRolePermission; +import org.xyzh.common.dto.menu.TbSysMenu; +import org.xyzh.common.dto.menu.TbSysMenuPermission; import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.mapper.MenuPermissionMapper; +import org.xyzh.system.mapper.MenuMapper; import org.xyzh.system.mapper.PermissionMapper; +import org.xyzh.system.mapper.RolePermissionMapper; +import org.xyzh.system.mapper.RoleMapper; import org.xyzh.system.permission.service.SysPermissionService; +import org.xyzh.system.utils.LoginUtil; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.List; @@ -30,6 +46,676 @@ public class SysPermissionServiceImpl implements SysPermissionService { @Autowired private PermissionMapper permissionMapper; + @Autowired + private RolePermissionMapper rolePermissionMapper; + + @Autowired + private MenuPermissionMapper menuPermissionMapper; + + @Autowired + private RoleMapper roleMapper; + @Autowired + private MenuMapper menuMapper; + + @Autowired + private RoleService roleService; + + @Autowired + private MenuService menuService; + + @Transactional + @Override + public ResultDomain createPermission(TbSysPermission permission) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始创建权限:{}", permission.getName()); + + // 参数校验 + if (!StringUtils.hasText(permission.getName())) { + resultDomain.fail("权限名称不能为空"); + return resultDomain; + } + + if (!StringUtils.hasText(permission.getCode())) { + resultDomain.fail("权限编码不能为空"); + return resultDomain; + } + + // 检查权限名称是否已存在 + ResultDomain nameCheckResult = checkPermissionNameExists(permission.getName(), null); + if (!nameCheckResult.isSuccess()) { + resultDomain.fail(nameCheckResult.getMessage()); + return resultDomain; + } + if (nameCheckResult.getData()) { + resultDomain.fail("权限名称已存在"); + return resultDomain; + } + + // 检查权限编码是否已存在 + ResultDomain codeCheckResult = checkPermissionCodeExists(permission.getCode(), null); + if (!codeCheckResult.isSuccess()) { + resultDomain.fail(codeCheckResult.getMessage()); + return resultDomain; + } + if (codeCheckResult.getData()) { + resultDomain.fail("权限编码已存在"); + return resultDomain; + } + + // 设置基础信息 + permission.setID(IDUtils.generateID()); + permission.setPermissionID(IDUtils.generateID()); + permission.setCreateTime(new Date()); + + // 插入数据库 + int result = permissionMapper.insert(permission); + + if (result > 0) { + logger.info("创建权限成功:{}", permission.getName()); + resultDomain.success("创建权限成功", permission); + return resultDomain; + } else { + logger.warn("创建权限失败:{}", permission.getName()); + resultDomain.fail("创建权限失败"); + } + + return resultDomain; + } catch (Exception e) { + logger.error("创建权限异常:{}", permission.getName(), e); + resultDomain.fail("创建权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Transactional + @Override + public ResultDomain updatePermission(TbSysPermission permission) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始更新权限:{}", permission.getPermissionID()); + + // 参数校验 + if (!StringUtils.hasText(permission.getPermissionID())) { + resultDomain.fail("权限ID不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(permission.getName())) { + resultDomain.fail("权限名称不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(permission.getCode())) { + resultDomain.fail("权限编码不能为空"); + return resultDomain; + } + + // 检查权限是否存在 + ResultDomain existResult = getPermissionById(permission.getPermissionID()); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查权限名称是否已存在(排除自身) + ResultDomain nameCheckResult = checkPermissionNameExists(permission.getName(), permission.getID()); + if (!nameCheckResult.isSuccess()) { + resultDomain.fail(nameCheckResult.getMessage()); + return resultDomain; + } + if (nameCheckResult.getData()) { + resultDomain.fail("权限名称已存在"); + return resultDomain; + } + + // 检查权限编码是否已存在(排除自身) + ResultDomain codeCheckResult = checkPermissionCodeExists(permission.getCode(), permission.getID()); + if (!codeCheckResult.isSuccess()) { + resultDomain.fail(codeCheckResult.getMessage()); + return resultDomain; + } + if (codeCheckResult.getData()) { + resultDomain.fail("权限编码已存在"); + return resultDomain; + } + + // 设置更新时间 + permission.setUpdateTime(new Date()); + + // 更新数据库 + int result = permissionMapper.updateById(permission); + + if (result > 0) { + logger.info("更新权限成功:{}", permission.getPermissionID()); + resultDomain.success("更新权限成功", permission); + return resultDomain; + } else { + logger.warn("更新权限失败:{}", permission.getPermissionID()); + resultDomain.fail("更新权限失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新权限异常:{}", permission.getPermissionID(), e); + resultDomain.fail("更新权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Transactional + @Override + public ResultDomain deletePermission(String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始删除权限:{}", permissionId); + + if (!StringUtils.hasText(permissionId)) { + resultDomain.fail("权限ID不能为空"); + return resultDomain; + } + + // 检查权限是否存在 + ResultDomain existResult = getPermissionById(permissionId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // TODO: 检查权限是否被角色使用,如果被使用则不能删除 + + // 逻辑删除 + TbSysPermission permission = existResult.getData(); + permission.setDeleted(true); + permission.setDeleteTime(new Date()); + + int result = permissionMapper.updateById(permission); + + if (result > 0) { + logger.info("删除权限成功:{}", permissionId); + resultDomain.success("删除权限成功", permission); + return resultDomain; + } else { + logger.warn("删除权限失败:{}", permissionId); + resultDomain.fail("删除权限失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("删除权限异常:{}", permissionId, e); + resultDomain.fail("删除权限失败:" + e.getMessage()); + return resultDomain; + } + } + + + // ----------------------角色权限管理-------------------------- + /** + * @description 角色权限绑定 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain bindRolePermission(String roleId, String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验权限存在 + ResultDomain permissionResult = getPermissionById(permissionId); + if (!permissionResult.isSuccess()) { + resultDomain.fail(permissionResult.getMessage()); + return resultDomain; + } + // 校验角色存在 + ResultDomain roleResult = roleService.getRoleById(roleId); + if (!roleResult.isSuccess()) { + resultDomain.fail(roleResult.getMessage()); + return resultDomain; + } + + // 绑定角色权限 + TbSysRolePermission rolePermission = new TbSysRolePermission(); + rolePermission.setID(IDUtils.generateID()); + rolePermission.setRoleID(roleId); + rolePermission.setPermissionID(permissionId); + rolePermission.setCreator(user.getID()); + rolePermission.setCreateTime(new Date()); + + int result = rolePermissionMapper.batchBindRolePermission(Arrays.asList(rolePermission)); + if (result > 0) { + resultDomain.success("绑定角色权限成功", rolePermission); + } else { + resultDomain.fail("绑定角色权限失败"); + } + + return resultDomain; + } + + /** + * @description 角色权限批量绑定 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain batchBindRolePermission(List roleIds, List permissionIds) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验权限存在 + List permissions = permissionMapper.checkPermissionExists(permissionIds); + if (permissions.isEmpty()) { + resultDomain.fail("权限不存在"); + return resultDomain; + } + + // 检验角色存在 + List roles = roleMapper.checkRoleExists(roleIds); + if (roles.isEmpty()) { + resultDomain.fail("角色不存在"); + return resultDomain; + } + + // 批量绑定角色权限 + List rolePermissions = new ArrayList<>(); + for (String roleId : roleIds) { + for (String permissionId : permissionIds) { + TbSysRolePermission rolePermission = new TbSysRolePermission(); + rolePermission.setID(IDUtils.generateID()); + rolePermission.setRoleID(roleId); + rolePermission.setPermissionID(permissionId); + rolePermission.setCreator(user.getID()); + rolePermission.setCreateTime(new Date()); + rolePermissions.add(rolePermission); + } + } + int result = rolePermissionMapper.batchBindRolePermission(rolePermissions); + if (result > 0) { + resultDomain.success("批量绑定角色权限成功", rolePermissions); + } else { + resultDomain.fail("批量绑定角色权限失败"); + } + return resultDomain; + } + + /** + * @description 角色权限解绑 真删除,避免再次绑定导致的报错问题 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain unbindRolePermission(String roleId, String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验权限存在 + ResultDomain permissionResult = getPermissionById(permissionId); + if (!permissionResult.isSuccess()) { + resultDomain.fail(permissionResult.getMessage()); + return resultDomain; + } + // 校验角色存在 + ResultDomain roleResult = roleService.getRoleById(roleId); + if (!roleResult.isSuccess()) { + resultDomain.fail(roleResult.getMessage()); + return resultDomain; + } + // 解绑角色权限 + TbSysRolePermission rolePermission = new TbSysRolePermission(); + rolePermission.setRoleID(roleId); + rolePermission.setPermissionID(permissionId); + rolePermission.setUpdater(user.getID()); + rolePermission.setUpdateTime(new Date()); + int result = rolePermissionMapper.batchUnbindRolePermission(Arrays.asList(rolePermission)); + if (result > 0) { + resultDomain.success("解绑角色权限成功", rolePermission); + } else { + resultDomain.fail("解绑角色权限失败"); + } + return resultDomain; + } + + /** + * @description 角色权限批量解绑 真删除,避免再次绑定导致的报错问题 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain batchUnbindRolePermission(List roleIds, List permissionIds) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验权限存在 + List permissions = permissionMapper.checkPermissionExists(permissionIds); + if (permissions.isEmpty()) { + resultDomain.fail("权限不存在"); + return resultDomain; + } + // 检验角色存在 + List roles = roleMapper.checkRoleExists(roleIds); + if (roles.isEmpty()) { + resultDomain.fail("角色不存在"); + return resultDomain; + } + // 批量解绑角色权限 + List rolePermissions = new ArrayList<>(); + for (String roleId : roleIds) { + for (String permissionId : permissionIds) { + TbSysRolePermission rolePermission = new TbSysRolePermission(); + rolePermission.setRoleID(roleId); + rolePermission.setPermissionID(permissionId); + rolePermission.setUpdater(user.getID()); + rolePermission.setUpdateTime(new Date()); + rolePermissions.add(rolePermission); + } + } + int result = rolePermissionMapper.batchUnbindRolePermission(rolePermissions); + if (result > 0) { + resultDomain.success("批量解绑角色权限成功", rolePermissions); + } else { + resultDomain.fail("批量解绑角色权限失败"); + } + return resultDomain; + } + + // ----------------------菜单权限管理-------------------------- + /** + * @description 菜单权限绑定 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain bindMenuPermission(String menuId, String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验菜单存在 + ResultDomain menuResult = menuService.getMenuById(menuId); + if (!menuResult.isSuccess()) { + resultDomain.fail(menuResult.getMessage()); + return resultDomain; + } + // 检验权限存在 + ResultDomain permissionResult = getPermissionById(permissionId); + if (!permissionResult.isSuccess()) { + resultDomain.fail(permissionResult.getMessage()); + return resultDomain; + } + // 绑定菜单权限 + TbSysMenuPermission menuPermission = new TbSysMenuPermission(); + menuPermission.setID(IDUtils.generateID()); + menuPermission.setMenuID(menuId); + menuPermission.setPermissionID(permissionId); + menuPermission.setCreator(user.getID()); + menuPermission.setCreateTime(new Date()); + int result = menuPermissionMapper.batchBindMenuPermission(Arrays.asList(menuPermission)); + if (result > 0) { + resultDomain.success("绑定菜单权限成功", menuPermission); + } else { + resultDomain.fail("绑定菜单权限失败"); + } + return resultDomain; + } + + /** + * @description 菜单权限批量绑定 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain batchBindMenuPermission(List menuIds, List permissionIds) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验菜单存在 + List menus = menuMapper.checkMenuExists(menuIds); + if (menus.isEmpty()) { + resultDomain.fail("菜单不存在"); + return resultDomain; + } + // 检验权限存在 + List permissions = permissionMapper.checkPermissionExists(permissionIds); + if (permissions.isEmpty()) { + resultDomain.fail("权限不存在"); + return resultDomain; + } + // 批量绑定菜单权限 + List menuPermissions = new ArrayList<>(); + for (String menuId : menuIds) { + for (String permissionId : permissionIds) { + TbSysMenuPermission menuPermission = new TbSysMenuPermission(); + menuPermission.setID(IDUtils.generateID()); + menuPermission.setMenuID(menuId); + menuPermission.setPermissionID(permissionId); + menuPermission.setCreator(user.getID()); + menuPermission.setCreateTime(new Date()); + menuPermissions.add(menuPermission); + } + } + int result = menuPermissionMapper.batchBindMenuPermission(menuPermissions); + if (result > 0) { + resultDomain.success("批量绑定菜单权限成功", menuPermissions); + } else { + resultDomain.fail("批量绑定菜单权限失败"); + } + return resultDomain; + } + + /** + * @description 菜单权限解绑 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain unbindMenuPermission(String menuId, String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验菜单存在 + ResultDomain menuResult = menuService.getMenuById(menuId); + if (!menuResult.isSuccess()) { + resultDomain.fail(menuResult.getMessage()); + return resultDomain; + } + // 检验权限存在 + ResultDomain permissionResult = getPermissionById(permissionId); + if (!permissionResult.isSuccess()) { + resultDomain.fail(permissionResult.getMessage()); + return resultDomain; + } + // 解绑菜单权限 + TbSysMenuPermission menuPermission = new TbSysMenuPermission(); + menuPermission.setMenuID(menuId); + menuPermission.setPermissionID(permissionId); + menuPermission.setUpdater(user.getID()); + menuPermission.setUpdateTime(new Date()); + int result = menuPermissionMapper.batchUnbindMenuPermission(Arrays.asList(menuPermission)); + if (result > 0) { + resultDomain.success("解绑菜单权限成功", menuPermission); + } else { + resultDomain.fail("解绑菜单权限失败"); + } + return resultDomain; + } + + /** + * @description 菜单权限批量解绑 + * @param + * @author yslg + * @ since 2025-10-07 + */ + @Transactional + @Override + public ResultDomain batchUnbindMenuPermission(List menuIds, List permissionIds) { + ResultDomain resultDomain = new ResultDomain<>(); + TbSysUser user = LoginUtil.getCurrentUser(); + if (user == null) { + resultDomain.fail("当前用户不存在"); + return resultDomain; + } + // 检验菜单存在 + List menus = menuMapper.checkMenuExists(menuIds); + if (menus.isEmpty()) { + resultDomain.fail("菜单不存在"); + return resultDomain; + } + // 检验权限存在 + List permissions = permissionMapper.checkPermissionExists(permissionIds); + if (permissions.isEmpty()) { + resultDomain.fail("权限不存在"); + return resultDomain; + } + // 批量解绑菜单权限 + List menuPermissions = new ArrayList<>(); + for (String menuId : menuIds) { + for (String permissionId : permissionIds) { + TbSysMenuPermission menuPermission = new TbSysMenuPermission(); + menuPermission.setMenuID(menuId); + menuPermission.setPermissionID(permissionId); + menuPermission.setUpdater(user.getID()); + menuPermission.setUpdateTime(new Date()); + menuPermissions.add(menuPermission); + } + } + int result = menuPermissionMapper.batchUnbindMenuPermission(menuPermissions); + if (result > 0) { + resultDomain.success("批量解绑菜单权限成功", menuPermissions); + } else { + resultDomain.fail("批量解绑菜单权限失败"); + } + return resultDomain; + } + + @Transactional + @Override + public ResultDomain checkPermissionNameExists(String permissionName, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查权限名称是否存在:{}", permissionName); + + if (!StringUtils.hasText(permissionName)) { + resultDomain.fail("权限名称不能为空"); + return resultDomain; + } + + int count = permissionMapper.countByPermissionName(permissionName, excludeId); + boolean exists = count > 0; + + logger.info("权限名称存在性检查完成:{},存在:{}", permissionName, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查权限名称存在性失败:{}", permissionName, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkPermissionCodeExists(String permissionCode, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查权限编码是否存在:{}", permissionCode); + + if (!StringUtils.hasText(permissionCode)) { + resultDomain.fail("权限编码不能为空"); + return resultDomain; + } + + int count = permissionMapper.countByPermissionCode(permissionCode, excludeId); + boolean exists = count > 0; + + logger.info("权限编码存在性检查完成:{},存在:{}", permissionCode, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查权限编码存在性失败:{}", permissionCode, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain changePermissionStatus(String permissionId, Integer status) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始修改权限状态:{},状态:{}", permissionId, status); + + if (!StringUtils.hasText(permissionId)) { + resultDomain.fail("权限ID不能为空"); + return resultDomain; + } + + if (status == null) { + resultDomain.fail("权限状态不能为空"); + return resultDomain; + } + + // 检查权限是否存在 + ResultDomain existResult = getPermissionById(permissionId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysPermission permission = existResult.getData(); + + permission.setUpdateTime(new Date()); + + int result = permissionMapper.updateById(permission); + + if (result > 0) { + logger.info("修改权限状态成功:{}", permissionId); + resultDomain.success("修改权限状态成功", permission); + return resultDomain; + } else { + logger.warn("修改权限状态失败:{}", permissionId); + resultDomain.fail("修改权限状态失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("修改权限状态异常:{}", permissionId, e); + resultDomain.fail("修改权限状态失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override public ResultDomain getAllPermissions() { ResultDomain resultDomain = new ResultDomain<>(); @@ -166,280 +852,4 @@ public class SysPermissionServiceImpl implements SysPermissionService { } } - @Override - public ResultDomain createPermission(TbSysPermission permission) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("开始创建权限:{}", permission.getName()); - - // 参数校验 - if (!StringUtils.hasText(permission.getName())) { - resultDomain.fail("权限名称不能为空"); - return resultDomain; - } - - if (!StringUtils.hasText(permission.getCode())) { - resultDomain.fail("权限编码不能为空"); - return resultDomain; - } - - // 检查权限名称是否已存在 - ResultDomain nameCheckResult = checkPermissionNameExists(permission.getName(), null); - if (!nameCheckResult.isSuccess()) { - resultDomain.fail(nameCheckResult.getMessage()); - return resultDomain; - } - if (nameCheckResult.getData()) { - resultDomain.fail("权限名称已存在"); - return resultDomain; - } - - // 检查权限编码是否已存在 - ResultDomain codeCheckResult = checkPermissionCodeExists(permission.getCode(), null); - if (!codeCheckResult.isSuccess()) { - resultDomain.fail(codeCheckResult.getMessage()); - return resultDomain; - } - if (codeCheckResult.getData()) { - resultDomain.fail("权限编码已存在"); - return resultDomain; - } - - // 设置基础信息 - permission.setID(IDUtils.generateID()); - permission.setPermissionID(IDUtils.generateID()); - permission.setCreateTime(new Date()); - permission.setDeleted(false); - - // 插入数据库 - int result = permissionMapper.insert(permission); - - if (result > 0) { - logger.info("创建权限成功:{}", permission.getName()); - resultDomain.success("创建权限成功", permission); - return resultDomain; - } else { - logger.warn("创建权限失败:{}", permission.getName()); - resultDomain.fail("创建权限失败"); - } - - return resultDomain; - } catch (Exception e) { - logger.error("创建权限异常:{}", permission.getName(), e); - resultDomain.fail("创建权限失败:" + e.getMessage()); - return resultDomain; - } - } - - @Override - public ResultDomain updatePermission(TbSysPermission permission) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("开始更新权限:{}", permission.getPermissionID()); - - // 参数校验 - if (!StringUtils.hasText(permission.getPermissionID())) { - resultDomain.fail("权限ID不能为空"); - return resultDomain; - } - if (!StringUtils.hasText(permission.getName())) { - resultDomain.fail("权限名称不能为空"); - return resultDomain; - } - if (!StringUtils.hasText(permission.getCode())) { - resultDomain.fail("权限编码不能为空"); - return resultDomain; - } - - // 检查权限是否存在 - ResultDomain existResult = getPermissionById(permission.getPermissionID()); - if (!existResult.isSuccess()) { - resultDomain.fail(existResult.getMessage()); - return resultDomain; - } - - // 检查权限名称是否已存在(排除自身) - ResultDomain nameCheckResult = checkPermissionNameExists(permission.getName(), permission.getID()); - if (!nameCheckResult.isSuccess()) { - resultDomain.fail(nameCheckResult.getMessage()); - return resultDomain; - } - if (nameCheckResult.getData()) { - resultDomain.fail("权限名称已存在"); - return resultDomain; - } - - // 检查权限编码是否已存在(排除自身) - ResultDomain codeCheckResult = checkPermissionCodeExists(permission.getCode(), permission.getID()); - if (!codeCheckResult.isSuccess()) { - resultDomain.fail(codeCheckResult.getMessage()); - return resultDomain; - } - if (codeCheckResult.getData()) { - resultDomain.fail("权限编码已存在"); - return resultDomain; - } - - // 设置更新时间 - permission.setUpdateTime(new Date()); - - // 更新数据库 - int result = permissionMapper.updateById(permission); - - if (result > 0) { - logger.info("更新权限成功:{}", permission.getPermissionID()); - resultDomain.success("更新权限成功", permission); - return resultDomain; - } else { - logger.warn("更新权限失败:{}", permission.getPermissionID()); - resultDomain.fail("更新权限失败"); - return resultDomain; - } - - } catch (Exception e) { - logger.error("更新权限异常:{}", permission.getPermissionID(), e); - resultDomain.fail("更新权限失败:" + e.getMessage()); - return resultDomain; - } - } - - @Override - public ResultDomain deletePermission(String permissionId) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("开始删除权限:{}", permissionId); - - if (!StringUtils.hasText(permissionId)) { - resultDomain.fail("权限ID不能为空"); - return resultDomain; - } - - // 检查权限是否存在 - ResultDomain existResult = getPermissionById(permissionId); - if (!existResult.isSuccess()) { - resultDomain.fail(existResult.getMessage()); - return resultDomain; - } - - // TODO: 检查权限是否被角色使用,如果被使用则不能删除 - - // 逻辑删除 - TbSysPermission permission = existResult.getData(); - permission.setDeleted(true); - permission.setDeleteTime(new Date()); - - int result = permissionMapper.updateById(permission); - - if (result > 0) { - logger.info("删除权限成功:{}", permissionId); - resultDomain.success("删除权限成功", permission); - return resultDomain; - } else { - logger.warn("删除权限失败:{}", permissionId); - resultDomain.fail("删除权限失败"); - return resultDomain; - } - - } catch (Exception e) { - logger.error("删除权限异常:{}", permissionId, e); - resultDomain.fail("删除权限失败:" + e.getMessage()); - return resultDomain; - } - } - - @Override - public ResultDomain checkPermissionNameExists(String permissionName, String excludeId) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("检查权限名称是否存在:{}", permissionName); - - if (!StringUtils.hasText(permissionName)) { - resultDomain.fail("权限名称不能为空"); - return resultDomain; - } - - int count = permissionMapper.countByPermissionName(permissionName, excludeId); - boolean exists = count > 0; - - logger.info("权限名称存在性检查完成:{},存在:{}", permissionName, exists); - resultDomain.success("检查完成", exists); - return resultDomain; - - } catch (Exception e) { - logger.error("检查权限名称存在性失败:{}", permissionName, e); - resultDomain.fail("检查失败:" + e.getMessage()); - return resultDomain; - } - } - - @Override - public ResultDomain checkPermissionCodeExists(String permissionCode, String excludeId) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("检查权限编码是否存在:{}", permissionCode); - - if (!StringUtils.hasText(permissionCode)) { - resultDomain.fail("权限编码不能为空"); - return resultDomain; - } - - int count = permissionMapper.countByPermissionCode(permissionCode, excludeId); - boolean exists = count > 0; - - logger.info("权限编码存在性检查完成:{},存在:{}", permissionCode, exists); - resultDomain.success("检查完成", exists); - return resultDomain; - - } catch (Exception e) { - logger.error("检查权限编码存在性失败:{}", permissionCode, e); - resultDomain.fail("检查失败:" + e.getMessage()); - return resultDomain; - } - } - - @Override - public ResultDomain changePermissionStatus(String permissionId, Integer status) { - ResultDomain resultDomain = new ResultDomain<>(); - try { - logger.info("开始修改权限状态:{},状态:{}", permissionId, status); - - if (!StringUtils.hasText(permissionId)) { - resultDomain.fail("权限ID不能为空"); - return resultDomain; - } - - if (status == null) { - resultDomain.fail("权限状态不能为空"); - return resultDomain; - } - - // 检查权限是否存在 - ResultDomain existResult = getPermissionById(permissionId); - if (!existResult.isSuccess()) { - resultDomain.fail(existResult.getMessage()); - return resultDomain; - } - - TbSysPermission permission = existResult.getData(); - - permission.setUpdateTime(new Date()); - - int result = permissionMapper.updateById(permission); - - if (result > 0) { - logger.info("修改权限状态成功:{}", permissionId); - resultDomain.success("修改权限状态成功", permission); - return resultDomain; - } else { - logger.warn("修改权限状态失败:{}", permissionId); - resultDomain.fail("修改权限状态失败"); - return resultDomain; - } - - } catch (Exception e) { - logger.error("修改权限状态异常:{}", permissionId, e); - resultDomain.fail("修改权限状态失败:" + e.getMessage()); - return resultDomain; - } - } } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java index 3b44c93..7295c2d 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java @@ -5,12 +5,16 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.user.TbSysUser; +import org.xyzh.common.dto.user.TbSysUserDeptRole; import org.xyzh.common.dto.user.TbSysUserInfo; import org.xyzh.common.utils.IDUtils; import org.xyzh.system.mapper.UserMapper; +import org.xyzh.system.mapper.UserInfoMapper; +import org.xyzh.system.mapper.UserDeptRoleMapper; import org.xyzh.system.user.service.SysUserService; import java.util.Date; @@ -31,6 +35,64 @@ public class SysUserServiceImpl implements SysUserService { @Autowired private UserMapper userMapper; + @Autowired + private UserInfoMapper userInfoMapper; + + @Autowired + private UserDeptRoleMapper userDeptRoleMapper; + + @Transactional + @Override + public ResultDomain registerUser(TbSysUser user) { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始注册用户:{}", user.getUsername()); + // 检查用户是否已存在 + ResultDomain checkResult = checkUserExists(user); + if (checkResult.isSuccess()) { + resultDomain.fail("用户已存在"); + return resultDomain; + } + // 创建用户信息 + TbSysUserInfo userInfo = new TbSysUserInfo(); + userInfo.setUserID(user.getID()); + userInfo.setCreateTime(new Date()); + userInfo.setAvatar("default"); + + TbSysUserDeptRole userDeptRole = new TbSysUserDeptRole(); + userDeptRole.setUserID(user.getID()); + userDeptRole.setDeptID("-1"); + userDeptRole.setRoleID("freedom"); + userDeptRole.setCreateTime(new Date()); + + userMapper.insert(user); + userInfoMapper.insert(userInfo); + userDeptRoleMapper.insert(userDeptRole); + + return resultDomain; + } catch (Exception e) { + logger.error("注册用户失败:{}", user.getUsername(), e); + resultDomain.fail("注册用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkUserExists(TbSysUser user) { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始检查用户是否已存在:{}", user.getUsername()); + + } catch (Exception e) { + logger.error("检查用户是否已存在失败:{}", user.getUsername(), e); + resultDomain.fail("检查用户是否已存在失败:" + e.getMessage()); + return resultDomain; + } + return resultDomain; + } + @Override public ResultDomain getAllUsers() { ResultDomain resultDomain = new ResultDomain<>(); @@ -514,6 +576,9 @@ public class SysUserServiceImpl implements SysUserService { } } + + // ----------------用户信息相关-------------------------------- + @Override public ResultDomain getUserInfoById(String userId) { ResultDomain resultDomain = new ResultDomain<>(); @@ -543,4 +608,37 @@ public class SysUserServiceImpl implements SysUserService { } } -} + @Override + public ResultDomain updateUserInfo(TbSysUserInfo userInfo) { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始更新用户信息:{}", userInfo.getUserID()); + if (!StringUtils.hasText(userInfo.getUserID())) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + userInfo.setUpdateTime(new Date()); + + int result = userMapper.updateUserInfo(userInfo); + + if (result > 0) { + logger.info("更新用户信息成功:{}", userInfo.getUserID()); + TbSysUserInfo newUserInfo = userMapper.selectUserInfoById(userInfo.getUserID()); + resultDomain.success("更新用户信息成功", newUserInfo); + return resultDomain; + } else { + logger.warn("更新用户信息失败:{}", userInfo.getUserID()); + resultDomain.fail("更新用户信息失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新用户信息异常:{}", userInfo.getUserID(), e); + resultDomain.fail("更新用户信息失败:" + e.getMessage()); + return resultDomain; + } + } + + +} \ No newline at end of file diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/utils/LoginUtil.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/utils/LoginUtil.java new file mode 100644 index 0000000..3c153d3 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/utils/LoginUtil.java @@ -0,0 +1,219 @@ +package org.xyzh.system.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.xyzh.common.core.domain.LoginDomain; +import org.xyzh.common.core.security.TokenParser; +import org.xyzh.common.dto.user.TbSysUser; +import org.xyzh.common.dto.user.TbSysUserInfo; +import org.xyzh.common.redis.service.RedisService; +import org.xyzh.common.utils.NonUtils; +import org.xyzh.common.utils.ServletUtil; + +/** + * @description LoginUtil.java文件描述 登录信息工具类 + * @filename LoginUtil.java + * @author yslg + * @copyright xyzh + * @since 2025-10-07 + */ +@Component +public class LoginUtil { + + private static final String REDIS_LOGIN_PREFIX = "login:token:"; + + private static TokenParser tokenParser; + private static RedisService redisService; + + @Autowired + public void setTokenParser(TokenParser tokenParser) { + LoginUtil.tokenParser = tokenParser; + } + + @Autowired + public void setRedisService(RedisService redisService) { + LoginUtil.redisService = redisService; + } + + /** + * @description 获取当前请求的LoginDomain(无参方法) + * @return LoginDomain 当前登录用户信息,未登录或登录过期返回null + * @author yslg + * @since 2025-10-07 + */ + public static LoginDomain getCurrentLoginDomain() { + try { + // 从当前请求获取token + String token = ServletUtil.getToken(); + if (NonUtils.isEmpty(token)) { + return null; + } + + // 验证token + String userId = tokenParser.getUserIdFromToken(token); + if (NonUtils.isEmpty(userId) || !tokenParser.validateToken(token, userId)) { + return null; + } + + // 从Redis获取LoginDomain + String redisKey = REDIS_LOGIN_PREFIX + userId; + LoginDomain loginDomain = (LoginDomain) redisService.get(redisKey); + + if (loginDomain != null) { + // 更新token信息 + loginDomain.setToken(token); + } + + return loginDomain; + + } catch (Exception e) { + // 记录日志但不抛出异常,返回null表示未登录 + return null; + } + } + + /** + * @description 获取当前登录用户 + * @return TbSysUser 当前登录用户,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static TbSysUser getCurrentUser() { + LoginDomain loginDomain = getCurrentLoginDomain(); + return loginDomain != null ? loginDomain.getUser() : null; + } + + /** + * @description 获取当前登录用户详细信息 + * @return TbSysUserInfo 当前登录用户详细信息,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static TbSysUserInfo getCurrentUserInfo() { + LoginDomain loginDomain = getCurrentLoginDomain(); + return loginDomain != null ? loginDomain.getUserInfo() : null; + } + + /** + * @description 获取当前登录用户ID + * @return String 用户ID,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getCurrentUserId() { + TbSysUser user = getCurrentUser(); + return user != null ? user.getID() : null; + } + + /** + * @description 获取当前登录用户名 + * @return String 用户名,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getCurrentUsername() { + TbSysUser user = getCurrentUser(); + return user != null ? user.getUsername() : null; + } + + /** + * @description 获取当前登录用户邮箱 + * @return String 邮箱,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getCurrentUserEmail() { + TbSysUser user = getCurrentUser(); + return user != null ? user.getEmail() : null; + } + + /** + * @description 获取当前登录用户手机号 + * @return String 手机号,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getCurrentUserPhone() { + TbSysUser user = getCurrentUser(); + return user != null ? user.getPhone() : null; + } + + /** + * @description 检查当前用户是否已登录 + * @return boolean true-已登录,false-未登录 + * @author yslg + * @since 2025-10-07 + */ + public static boolean isLoggedIn() { + return getCurrentLoginDomain() != null; + } + + /** + * @description 检查当前用户是否具有指定权限 + * @param permissionCode 权限编码 + * @return boolean true-有权限,false-无权限 + * @author yslg + * @since 2025-10-07 + */ + public static boolean hasPermission(String permissionCode) { + LoginDomain loginDomain = getCurrentLoginDomain(); + if (loginDomain == null || loginDomain.getPermissions() == null) { + return false; + } + + return loginDomain.getPermissions().stream() + .anyMatch(permission -> permissionCode.equals(permission.getCode())); + } + + /** + * @description 检查当前用户是否具有任意一个指定权限 + * @param permissionCodes 权限编码数组 + * @return boolean true-有任意一个权限,false-无权限 + * @author yslg + * @since 2025-10-07 + */ + public static boolean hasAnyPermission(String... permissionCodes) { + if (permissionCodes == null || permissionCodes.length == 0) { + return false; + } + + for (String permissionCode : permissionCodes) { + if (hasPermission(permissionCode)) { + return true; + } + } + + return false; + } + + /** + * @description 检查当前用户是否具有所有指定权限 + * @param permissionCodes 权限编码数组 + * @return boolean true-有所有权限,false-缺少权限 + * @author yslg + * @since 2025-10-07 + */ + public static boolean hasAllPermissions(String... permissionCodes) { + if (permissionCodes == null || permissionCodes.length == 0) { + return true; + } + + for (String permissionCode : permissionCodes) { + if (!hasPermission(permissionCode)) { + return false; + } + } + + return true; + } + + /** + * @description 获取当前用户的JWT令牌 + * @return String JWT令牌,未登录返回null + * @author yslg + * @since 2025-10-07 + */ + public static String getCurrentToken() { + return ServletUtil.getToken(); + } +} diff --git a/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml index c7a834b..aada0e2 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml @@ -168,4 +168,11 @@ WHERE id = #{id} AND deleted = 0 + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/MenuPermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/MenuPermissionMapper.xml new file mode 100644 index 0000000..1922eb5 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/MenuPermissionMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + id, menu_id, permission_id, creator, updater, + create_time, update_time, delete_time, deleted + + + + + INSERT INTO tb_sys_menu_permission (id, menu_id, permission_id, creator, create_time, deleted) + VALUES + + (#{menuPermission.id}, #{menuPermission.menuID}, #{menuPermission.permissionID}, #{menuPermission.creator}, #{menuPermission.createTime}, 0) + + + + + + DELETE FROM tb_sys_menu_permission + WHERE menu_id IN + + #{menuPermission.menuID} + + AND permission_id IN + + #{menuPermission.permissionID} + + AND deleted = 0 + + + + + + + + + + + + + + UPDATE tb_sys_menu_permission + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND menu_id = #{menuId} + AND permission_id = #{permissionId} + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml index 62adfea..2afc5f8 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml @@ -33,12 +33,6 @@ AND code = #{code} - - AND permission_type = #{permissionType} - - - AND status = #{status} - @@ -73,32 +67,32 @@ - SELECT FROM tb_sys_permission WHERE deleted = 0 - AND code = #{code} + AND code = #{permissionCode} LIMIT 1 - SELECT COUNT(1) FROM tb_sys_permission WHERE deleted = 0 - AND name = #{name} + AND name = #{permissionName} AND id != #{excludeId} - SELECT COUNT(1) FROM tb_sys_permission WHERE deleted = 0 - AND code = #{code} + AND code = #{permissionCode} AND id != #{excludeId} @@ -125,11 +119,7 @@ permission_id, name, code, - permission_type, - resource_url, - http_method, description, - status, creator, create_time, deleted @@ -139,11 +129,7 @@ #{permissionID}, #{name}, #{code}, - #{permissionType}, - #{resourceUrl}, - #{httpMethod}, #{description}, - #{status}, #{creator}, #{createTime}, 0 @@ -157,11 +143,7 @@ permission_id = #{permissionID}, name = #{name}, code = #{code}, - permission_type = #{permissionType}, - resource_url = #{resourceUrl}, - http_method = #{httpMethod}, description = #{description}, - status = #{status}, updater = #{updater}, update_time = NOW() @@ -176,4 +158,16 @@ WHERE id = #{id} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml index 60aea52..2fe0b4e 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml @@ -177,4 +177,16 @@ WHERE id = #{id} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/RolePermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/RolePermissionMapper.xml new file mode 100644 index 0000000..e422807 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/RolePermissionMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + id, role_id, permission_id, creator, updater, + create_time, update_time, delete_time, deleted + + + + + INSERT INTO tb_sys_role_permission (id, role_id, permission_id, creator, create_time, deleted) + VALUES + + (#{rolePermission.id}, #{rolePermission.roleID}, #{rolePermission.permissionID}, #{rolePermission.creator}, #{rolePermission.createTime}, 0) + + + + + + DELETE FROM tb_sys_role_permission + WHERE role_id IN + + #{rolePermission.roleID} + + AND permission_id IN + + #{rolePermission.permissionID} + + AND deleted = 0 + + + + + + + + + + + + + + UPDATE tb_sys_role_permission + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND role_id = #{rolePermission.roleID} + AND permission_id = #{rolePermission.permissionID} + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/UserDeptRoleMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/UserDeptRoleMapper.xml new file mode 100644 index 0000000..abe4a44 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/UserDeptRoleMapper.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/schoolNewsServ/system/src/main/resources/mapper/UserInfoMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/UserInfoMapper.xml new file mode 100644 index 0000000..0ac6c33 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/UserInfoMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml index 544601d..fec4296 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml @@ -78,16 +78,6 @@ LIMIT 1 - - - + SELECT + + FROM tb_sys_user_info + WHERE deleted = 0 + AND user_id = #{userId} + LIMIT 1 + + + + + + UPDATE tb_sys_user_info + + avatar = #{userInfo.avatar}, + gender = #{userInfo.gender}, + family_name = #{userInfo.familyName}, + given_name = #{userInfo.givenName}, + full_name = #{userInfo.fullName}, + id_card = #{userInfo.idCard}, + address = #{userInfo.address}, + update_time = #{userInfo.updateTime} + update_time = NOW() + + WHERE user_id = #{userInfo.userID} AND deleted = 0 +