From ef965708960b02babf1d047c95734694fbcf1e03 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Sun, 28 Sep 2025 17:32:37 +0800 Subject: [PATCH] =?UTF-8?q?system=E5=92=8Cauth=20=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/system/dept/DepartmentService.java | 79 +++ .../org/xyzh/api/system/menu/MenuService.java | 149 +++-- .../system/permission/PermissionService.java | 161 ++--- .../org/xyzh/api/system/role/RoleService.java | 102 +-- .../org/xyzh/api/system/user/UserService.java | 116 ++-- .../strategy/impl/EmailLoginStrategy.java | 2 +- .../strategy/impl/PhoneLoginStrategy.java | 2 +- .../strategy/impl/UsernameLoginStrategy.java | 2 +- .../strategy/impl/WechatLoginStrategy.java | 2 +- .../java/org/xyzh/common/dto/BaseDTO.java | 10 +- .../org/xyzh/common/dto/dept/TbSysDept.java | 48 ++ .../java/org/xyzh/common/utils/NonUtils.java | 603 ++++++++++++++++++ schoolNewsServ/pom.xml | 7 + schoolNewsServ/system/pom.xml | 51 ++ .../system/src/main/java/org/xyzh/Main.java | 7 - .../org/xyzh/system/SystemApplication.java | 21 + .../service/SysDepartmentService.java | 13 + .../impl/SysDepartmentServiceImpl.java | 289 +++++++++ .../xyzh/system/mapper/DepartmentMapper.java | 65 ++ .../org/xyzh/system/mapper/MenuMapper.java | 74 +++ .../xyzh/system/mapper/PermissionMapper.java | 76 +++ .../org/xyzh/system/mapper/RoleMapper.java | 67 ++ .../org/xyzh/system/mapper/UserMapper.java | 78 +++ .../system/menu/service/SysMenuService.java | 14 + .../menu/service/impl/SysMenuServiceImpl.java | 448 +++++++++++++ .../service/SysPermissionService.java | 14 + .../impl/SysPermissionServiceImpl.java | 445 +++++++++++++ .../system/role/service/SysRoleService.java | 14 + .../role/service/impl/SysRoleServiceImpl.java | 335 ++++++++++ .../system/user/service/SysUserService.java | 14 + .../user/service/impl/SysUserServiceImpl.java | 515 +++++++++++++++ .../system/src/main/resources/application.yml | 98 +++ .../src/main/resources/log4j2-spring.xml | 175 +++++ .../resources/mapper/DepartmentMapper.xml | 148 +++++ .../src/main/resources/mapper/MenuMapper.xml | 214 +++++++ .../resources/mapper/PermissionMapper.xml | 185 ++++++ .../src/main/resources/mapper/RoleMapper.xml | 153 +++++ .../src/main/resources/mapper/UserMapper.xml | 194 ++++++ 38 files changed, 4741 insertions(+), 249 deletions(-) create mode 100644 schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/dept/DepartmentService.java create mode 100644 schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/NonUtils.java delete mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/Main.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/SystemApplication.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/SysDepartmentService.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/impl/SysDepartmentServiceImpl.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/DepartmentMapper.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/SysMenuService.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/impl/SysMenuServiceImpl.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/SysPermissionService.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/SysRoleService.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/impl/SysRoleServiceImpl.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/SysUserService.java create mode 100644 schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java create mode 100644 schoolNewsServ/system/src/main/resources/application.yml create mode 100644 schoolNewsServ/system/src/main/resources/log4j2-spring.xml create mode 100644 schoolNewsServ/system/src/main/resources/mapper/DepartmentMapper.xml create mode 100644 schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml create mode 100644 schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml create mode 100644 schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml create mode 100644 schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml diff --git a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/dept/DepartmentService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/dept/DepartmentService.java new file mode 100644 index 0000000..6ea8dec --- /dev/null +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/dept/DepartmentService.java @@ -0,0 +1,79 @@ +package org.xyzh.api.system.dept; + +import java.util.List; + +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.dept.TbSysDept; + +/** + * @description DepartmentService.java文件描述 部门服务接口 + * @filename DepartmentService.java + * @author yslg + * @copyright xyzh + * @ since 2025-09-28 + */ +public interface DepartmentService { + + /** + * @description 查询所有部门 + * @return ResultDomain 部门列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getAllDepartments(); + + /** + * @description 根据ID查询部门 + * @param deptId 部门ID + * @return ResultDomain 部门信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getDepartmentById(String deptId); + + /** + * @description 根据父部门ID查询子部门 + * @param parentId 父部门ID + * @return ResultDomain 子部门列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getDepartmentsByParentId(String parentId); + + /** + * @description 创建部门 + * @param department 部门信息 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain createDepartment(TbSysDept department); + + /** + * @description 更新部门 + * @param department 部门信息 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain updateDepartment(TbSysDept department); + + /** + * @description 删除部门 + * @param deptId 部门ID + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain deleteDepartment(String deptId); + + /** + * @description 检查部门名称是否存在 + * @param deptName 部门名称 + * @param excludeId 排除的部门ID(用于更新时排除自身) + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain checkDepartmentNameExists(String deptName, String excludeId); +} diff --git a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/menu/MenuService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/menu/MenuService.java index 8d3b8ae..5d8edf1 100644 --- a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/menu/MenuService.java +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/menu/MenuService.java @@ -2,6 +2,7 @@ package org.xyzh.api.system.menu; import java.util.List; +import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.page.PageParam; import org.xyzh.common.dto.menu.TbSysMenu; @@ -15,97 +16,113 @@ import org.xyzh.common.dto.menu.TbSysMenu; public interface MenuService { /** - * @description 添加菜单 - * @param menu 菜单对象 - * @return void + * @description 获取所有菜单 + * @return ResultDomain 菜单列表 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void addMenu(TbSysMenu menu); + ResultDomain getAllMenus(); + + /** + * @description 根据菜单ID查询菜单 + * @param menuId 菜单ID + * @return ResultDomain 菜单信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getMenuById(String menuId); + + /** + * @description 根据用户ID查询菜单列表 + * @param userId 用户ID + * @return ResultDomain 菜单列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getMenusByUserId(String userId); + + /** + * @description 根据角色ID查询菜单列表 + * @param roleId 角色ID + * @return ResultDomain 菜单列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getMenusByRoleId(String roleId); + + /** + * @description 根据父菜单ID查询子菜单 + * @param parentId 父菜单ID + * @return ResultDomain 子菜单列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getMenusByParentId(String parentId); + + /** + * @description 获取菜单树结构 + * @return ResultDomain 菜单树 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getMenuTree(); + + /** + * @description 创建菜单 + * @param menu 菜单对象 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain createMenu(TbSysMenu menu); /** * @description 更新菜单 * @param menu 菜单对象 - * @return void + * @return ResultDomain 更新结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void updateMenu(TbSysMenu menu); + ResultDomain updateMenu(TbSysMenu menu); /** * @description 删除菜单 - * @param menuID 菜单ID - * @param deep 是否深度删除(删除该菜单及其所有子菜单) - * @return void + * @param menuId 菜单ID + * @return ResultDomain 删除结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void deleteMenu(String menuID, boolean deep); + ResultDomain deleteMenu(String menuId); /** - * @description 导入菜单 - * @param menus 菜单列表 - * @return void + * @description 检查菜单名称是否存在 + * @param menuName 菜单名称 + * @param excludeId 排除的菜单ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void importMenus(List menus); + ResultDomain checkMenuNameExists(String menuName, String excludeId); /** - * @description 导出菜单 - * @param filter 菜单对象 - * @return 菜单列表 + * @description 修改菜单状态 + * @param menuId 菜单ID + * @param status 新状态 + * @return ResultDomain 修改结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - List exportMenus(TbSysMenu filter); + ResultDomain changeMenuStatus(String menuId, Integer status); /** - * @description 查找菜单 - * @param menu 菜单对象 - * @return 菜单对象 + * @description 修改菜单可见性 + * @param menuId 菜单ID + * @param visible 可见性 + * @return ResultDomain 修改结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - TbSysMenu find(TbSysMenu filter); - - /** - * @description 分页查找菜单 - * @param menu 菜单对象 - * @param pageParam 分页参数 - * @return 菜单列表 - * @author yslg - * @since 2025-09-27 - */ - List findPageMenus(TbSysMenu menu, PageParam pageParam); - - /** - * @description 根据菜单ID列表查找菜单 - * @param menuIDs 菜单ID列表 - * @return 菜单列表 - * @author yslg - * @since 2025-09-27 - */ - List findByIDs(List menuIDs); - - /** - * @description 查找子菜单 - * @param parentID 父菜单ID - * @return 子菜单列表 - * @author yslg - * @since 2025-09-27 - */ - List findChildListByParentID(String parentID); - - /** - * @description 查找所有菜单 - * @return 菜单列表 - * @author yslg - * @since 2025-09-27 - */ - List findAll(); - - List permissionMenus(List permissionIDList); + ResultDomain changeMenuVisibility(String menuId, Boolean visible); } 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 029f9aa..c9e1733 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 @@ -4,6 +4,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.permission.TbSysPermission; /** @@ -13,105 +14,107 @@ import org.xyzh.common.dto.permission.TbSysPermission; * @copyright xyzh * @since 2025-09-26 */ + public interface PermissionService { - /** - * @description 添加权限 - * @param permission 权限对象 - * @return void + /** + * @description 获取所有权限 + * @return ResultDomain 权限列表 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void addPermission(TbSysPermission permission); + ResultDomain getAllPermissions(); - /** + /** + * @description 根据权限ID查询权限 + * @param permissionId 权限ID + * @return ResultDomain 权限信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getPermissionById(String permissionId); + + /** + * @description 根据权限编码查询权限 + * @param permissionCode 权限编码 + * @return ResultDomain 权限信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getPermissionByCode(String permissionCode); + + /** + * @description 根据用户ID查询权限列表 + * @param userId 用户ID + * @return ResultDomain 权限列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getPermissionsByUserId(String userId); + + /** + * @description 根据角色ID查询权限列表 + * @param roleId 角色ID + * @return ResultDomain 权限列表 + * @author yslg + * @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 void + * @return ResultDomain 更新结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void updatePermission(TbSysPermission permission); + ResultDomain updatePermission(TbSysPermission permission); - /** + /** * @description 删除权限 - * @param permissionID 权限ID - * @return void + * @param permissionId 权限ID + * @return ResultDomain 删除结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void deletePermission(String permissionID); - - /** - * @description 批量导入权限 - * @param permissions 权限列表 - * @return void - * @author yslg - * @since 2025-09-27 - */ - void importPermissions(List permissions); - - /** - * @description 条件导出权限 - * @param filter 权限对象 - * @return 权限列表 - * @author yslg - * @since 2025-09-27 - */ - List exportPermissions(TbSysPermission filter); - - /** - * @description 权限ID查询 - * @param permissionID 权限ID - * @return 权限对象 - * @author yslg - * @since 2025-09-27 - */ - TbSysPermission findByID(String permissionID); - - /** - * @description 批量权限ID查询 - * @param permissionIDs 权限ID列表 - * @return 权限对象列表 - * @author yslg - * @since 2025-09-27 - */ - List findByIDs(Collection permissionIDs); - - /** - * @description 根据用户ID查询用户权限集合 - * @param userID 用户ID - * @return 权限集合 - * @author yslg - * @since 2025-09-27 - */ - Set findUserPermissions(String userID); + ResultDomain deletePermission(String permissionId); /** - * @description 根据角色ID查询角色权限集合 - * @param roleID 角色ID - * @return 权限集合 + * @description 检查权限名称是否存在 + * @param permissionName 权限名称 + * @param excludeId 排除的权限ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - Set findRolePermissions(String roleID); + ResultDomain checkPermissionNameExists(String permissionName, String excludeId); /** - * @description 根据角色ID列表查询角色权限集合 - * @param roleIDList 角色ID列表 - * @return 权限集合 - * @author yslg - * @since 2025-09-27 - */ - Set findRolesPermissions(List roleIDList); - - /** - * @description 判断用户是否拥有某个权限 - * @param userID 用户ID + * @description 检查权限编码是否存在 * @param permissionCode 权限编码 - * @return true-拥有;false-不拥有 + * @param excludeId 排除的权限ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - boolean hasPermission(String userID, String permissionCode); + 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/role/RoleService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/role/RoleService.java index b64b453..8792419 100644 --- a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/role/RoleService.java +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/role/RoleService.java @@ -1,7 +1,6 @@ package org.xyzh.api.system.role; -import java.util.Collection; -import java.util.List; +import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.role.TbSysRole; @@ -15,74 +14,75 @@ import org.xyzh.common.dto.role.TbSysRole; public interface RoleService { /** - * @description 添加角色 - * @param role 角色对象 - * @return void + * @description 获取所有角色 + * @return ResultDomain 角色列表 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void addRole(TbSysRole role); + ResultDomain getAllRoles(); + + /** + * @description 根据角色ID查询角色 + * @param roleId 角色ID + * @return ResultDomain 角色信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getRoleById(String roleId); + + /** + * @description 根据用户ID查询角色列表 + * @param userId 用户ID + * @return ResultDomain 角色列表 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getRolesByUserId(String userId); + + /** + * @description 创建角色 + * @param role 角色对象 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain createRole(TbSysRole role); /** * @description 更新角色 * @param role 角色对象 - * @return void + * @return ResultDomain 更新结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void updateRole(TbSysRole role); + ResultDomain updateRole(TbSysRole role); /** * @description 删除角色 - * @param roleID 角色ID - * @return void + * @param roleId 角色ID + * @return ResultDomain 删除结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void deleteRole(String roleID); + ResultDomain deleteRole(String roleId); /** - * @description 批量导入角色 - * @param roles 角色列表 - * @return void + * @description 检查角色名称是否存在 + * @param roleName 角色名称 + * @param excludeId 排除的角色ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void importRoles(List roles); + ResultDomain checkRoleNameExists(String roleName, String excludeId); /** - * @description 条件导出角色 - * @param filter 角色对象 - * @return 角色列表 + * @description 修改角色状态 + * @param roleId 角色ID + * @param status 新状态 + * @return ResultDomain 修改结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - List exportRoles(TbSysRole filter); - - /** - * @description 通过主键查找 - * @param roleID 角色ID - * @return 角色对象 - * @author yslg - * @since 2025-09-27 - */ - TbSysRole findByID(String roleID); - - /** - * @description 批量通过主键查找 - * @param roleIDs 角色ID集合 - * @return 角色列表 - * @author yslg - * @since 2025-09-27 - */ - List findByIDs(Collection roleIDs); - - /** - * @description 根据用户ID查询用户角色列表 - * @param userID 用户ID - * @return 角色列表 - * @author yslg - * @since 2025-09-27 - */ - List findUserRoleList(String userID); + ResultDomain changeRoleStatus(String roleId, 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 87cae72..d4f77ec 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 @@ -3,6 +3,7 @@ package org.xyzh.api.system.user; import java.util.Collection; import java.util.List; +import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.user.TbSysUser; /** @@ -15,74 +16,115 @@ import org.xyzh.common.dto.user.TbSysUser; public interface UserService { /** - * @description 添加用户 - * @param user 用户对象 - * @return void + * @description 获取所有用户 + * @return ResultDomain 用户列表 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void addUser(TbSysUser user); + ResultDomain getAllUsers(); + + /** + * @description 根据用户ID查询用户 + * @param userId 用户ID + * @return ResultDomain 用户信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getUserById(String userId); + + /** + * @description 根据用户名查询用户 + * @param username 用户名 + * @return ResultDomain 用户信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getUserByUsername(String username); + + /** + * @description 根据过滤条件查询用户(支持多种查询条件组合) + * @param filter 过滤条件(支持userID、username、email、phone等字段) + * @return ResultDomain 用户信息 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain getUserByFilter(TbSysUser filter); + + /** + * @description 创建用户 + * @param user 用户对象 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-09-28 + */ + ResultDomain createUser(TbSysUser user); /** * @description 更新用户 * @param user 用户对象 - * @return void + * @return ResultDomain 更新结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void updateUser(TbSysUser user); + ResultDomain updateUser(TbSysUser user); /** - * @description 删除用户(逻辑或物理取决于实现) + * @description 删除用户(逻辑删除) * @param userId 用户ID - * @return void + * @return ResultDomain 删除结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void deleteUser(String userID); + ResultDomain deleteUser(String userId); /** - * @description 批量导入用户 - * @param users 用户列表 - * @return void + * @description 检查用户名是否存在 + * @param username 用户名 + * @param excludeId 排除的用户ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - void importUsers(List users); + ResultDomain checkUsernameExists(String username, String excludeId); /** - * @description 条件导出用户 - * @param filter 用户对象 - * @return 用户列表 + * @description 检查邮箱是否存在 + * @param email 邮箱 + * @param excludeId 排除的用户ID(用于更新时排除自身) + * @return ResultDomain 是否存在 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - List exportUsers(TbSysUser filter); + ResultDomain checkEmailExists(String email, String excludeId); /** - * @description 查找用户 - * @param filter 用户对象 - * @return 用户对象 + * @description 搜索用户 + * @param username 用户名(模糊查询) + * @param email 邮箱(模糊查询) + * @param status 状态 + * @return ResultDomain 用户列表 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - TbSysUser find(TbSysUser filter); + ResultDomain searchUsers(String username, String email, String status); /** - * @description 通过主键集合查找用户列表 - * @param userIds 用户ID集合 - * @return 用户列表 + * @description 修改用户状态 + * @param userId 用户ID + * @param status 新状态 + * @return ResultDomain 修改结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - List findByIDs(Collection userIDs); + ResultDomain changeUserStatus(String userId, Integer status); /** - * @description 根据角色ID查询用户列表 - * @param roleId 角色ID - * @return 用户列表 + * @description 重置用户密码 + * @param userId 用户ID + * @param newPassword 新密码 + * @return ResultDomain 重置结果 * @author yslg - * @since 2025-09-27 + * @since 2025-09-28 */ - List listUsersByRoleID(String roleID); + ResultDomain resetPassword(String userId, String newPassword); } diff --git a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/EmailLoginStrategy.java b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/EmailLoginStrategy.java index acad866..48b479c 100644 --- a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/EmailLoginStrategy.java +++ b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/EmailLoginStrategy.java @@ -39,7 +39,7 @@ public class EmailLoginStrategy implements LoginStrategy { public TbSysUser findUser(LoginParam loginParam) { TbSysUser filter = new TbSysUser(); filter.setEmail(loginParam.getEmail()); - return userService.find(filter); + return userService.getUserByFilter(filter).getData(); } @Override diff --git a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/PhoneLoginStrategy.java b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/PhoneLoginStrategy.java index fd2c1d2..d06d5fa 100644 --- a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/PhoneLoginStrategy.java +++ b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/PhoneLoginStrategy.java @@ -39,7 +39,7 @@ public class PhoneLoginStrategy implements LoginStrategy { public TbSysUser findUser(LoginParam loginParam) { TbSysUser filter = new TbSysUser(); filter.setPhone(loginParam.getPhone()); - return userService.find(filter); + return userService.getUserByFilter(filter).getData(); } @Override diff --git a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/UsernameLoginStrategy.java b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/UsernameLoginStrategy.java index 3f1d2fb..64f3aa4 100644 --- a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/UsernameLoginStrategy.java +++ b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/UsernameLoginStrategy.java @@ -39,7 +39,7 @@ public class UsernameLoginStrategy implements LoginStrategy { public TbSysUser findUser(LoginParam loginParam) { TbSysUser filter = new TbSysUser(); filter.setUsername(loginParam.getUsername()); - return userService.find(filter); + return userService.getUserByFilter(filter).getData(); } @Override diff --git a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/WechatLoginStrategy.java b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/WechatLoginStrategy.java index 6a46f5c..2435801 100644 --- a/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/WechatLoginStrategy.java +++ b/schoolNewsServ/auth/src/main/java/org/xyzh/auth/strategy/impl/WechatLoginStrategy.java @@ -35,7 +35,7 @@ public class WechatLoginStrategy implements LoginStrategy { public TbSysUser findUser(LoginParam loginParam) { TbSysUser filter = new TbSysUser(); filter.setWechatID(loginParam.getWechatID()); - return userService.find(filter); + return userService.getUserByFilter(filter).getData(); } @Override diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/BaseDTO.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/BaseDTO.java index ba68a81..a654949 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/BaseDTO.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/BaseDTO.java @@ -1,7 +1,7 @@ package org.xyzh.common.dto; import java.io.Serializable; -import java.sql.Date; +import java.util.Date; /** @@ -47,7 +47,7 @@ public class BaseDTO implements Serializable{ * @author yslg * @since 2025-09-10 */ - private Integer deleted; + private boolean deleted; @@ -136,11 +136,11 @@ public class BaseDTO implements Serializable{ /** * @description 获取是否删除 - * @return Integer 是否删除 + * @return boolean 是否删除 * @author yslg * @since 2025-09-10 */ - public Integer getDeleted() { + public boolean getDeleted() { return deleted; } @@ -150,7 +150,7 @@ public class BaseDTO implements Serializable{ * @author yslg * @since 2025-09-10 */ - public void setDeleted(Integer deleted) { + public void setDeleted(boolean deleted) { this.deleted = deleted; } diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/dept/TbSysDept.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/dept/TbSysDept.java index eb8eb7f..87d1400 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/dept/TbSysDept.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/dept/TbSysDept.java @@ -54,6 +54,54 @@ public class TbSysDept extends BaseDTO{ */ private String updater; + // Getter和Setter方法 + public String getDeptID() { + return deptID; + } + + public void setDeptID(String deptID) { + this.deptID = deptID; + } + + public String getParentID() { + return parentID; + } + + public void setParentID(String parentID) { + this.parentID = parentID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + 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() { diff --git a/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/NonUtils.java b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/NonUtils.java new file mode 100644 index 0000000..9a0c4ce --- /dev/null +++ b/schoolNewsServ/common/common-util/src/main/java/org/xyzh/common/utils/NonUtils.java @@ -0,0 +1,603 @@ +package org.xyzh.common.utils; + +import java.lang.reflect.Array; +import java.util.*; +import java.util.function.Predicate; + +/** + * @description NonUtils.java文件描述 空值判断工具类 + * @filename NonUtils.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public class NonUtils { + + private NonUtils() { + throw new UnsupportedOperationException("工具类不能被实例化"); + } + + // ======================== 基础null判断 ======================== + + /** + * 判断对象是否为null + * + * @param obj 待判断的对象 + * @return true-对象为null,false-对象不为null + */ + public static boolean isNull(Object obj) { + return obj == null; + } + + /** + * 判断对象是否不为null + * + * @param obj 待判断的对象 + * @return true-对象不为null,false-对象为null + */ + public static boolean isNotNull(Object obj) { + return obj != null; + } + + /** + * 判断多个对象是否都为null + * + * @param objects 待判断的对象数组 + * @return true-所有对象都为null,false-至少有一个对象不为null + */ + public static boolean isAllNull(Object... objects) { + if (objects == null || objects.length == 0) { + return true; + } + for (Object obj : objects) { + if (isNotNull(obj)) { + return false; + } + } + return true; + } + + /** + * 判断多个对象是否都不为null + * + * @param objects 待判断的对象数组 + * @return true-所有对象都不为null,false-至少有一个对象为null + */ + public static boolean isAllNotNull(Object... objects) { + if (objects == null || objects.length == 0) { + return false; + } + for (Object obj : objects) { + if (isNull(obj)) { + return false; + } + } + return true; + } + + /** + * 判断多个对象中是否存在null + * + * @param objects 待判断的对象数组 + * @return true-存在null对象,false-不存在null对象 + */ + public static boolean hasNull(Object... objects) { + if (objects == null || objects.length == 0) { + return true; + } + for (Object obj : objects) { + if (isNull(obj)) { + return true; + } + } + return false; + } + + // ======================== 空值判断(包含null、空字符串、空集合等) ======================== + + /** + * 判断对象是否为空 + * - null -> true + * - "" -> true + * - " " -> true (仅包含空白字符) + * - 空集合 -> true + * - 空数组 -> true + * + * @param obj 待判断的对象 + * @return true-对象为空,false-对象不为空 + */ + public static boolean isEmpty(Object obj) { + if (isNull(obj)) { + return true; + } + + // 字符串判断 + if (obj instanceof CharSequence) { + return ((CharSequence) obj).length() == 0 || obj.toString().trim().isEmpty(); + } + + // 集合判断 + if (obj instanceof Collection) { + return ((Collection) obj).isEmpty(); + } + + // Map判断 + if (obj instanceof Map) { + return ((Map) obj).isEmpty(); + } + + // 数组判断 + if (obj.getClass().isArray()) { + return Array.getLength(obj) == 0; + } + + // Optional判断 + if (obj instanceof Optional) { + return !((Optional) obj).isPresent(); + } + + return false; + } + + /** + * 判断对象是否不为空 + * + * @param obj 待判断的对象 + * @return true-对象不为空,false-对象为空 + */ + public static boolean isNotEmpty(Object obj) { + return !isEmpty(obj); + } + + /** + * 判断多个对象是否都为空 + * + * @param objects 待判断的对象数组 + * @return true-所有对象都为空,false-至少有一个对象不为空 + */ + public static boolean isAllEmpty(Object... objects) { + if (objects == null || objects.length == 0) { + return true; + } + for (Object obj : objects) { + if (isNotEmpty(obj)) { + return false; + } + } + return true; + } + + /** + * 判断多个对象是否都不为空 + * + * @param objects 待判断的对象数组 + * @return true-所有对象都不为空,false-至少有一个对象为空 + */ + public static boolean isAllNotEmpty(Object... objects) { + if (objects == null || objects.length == 0) { + return false; + } + for (Object obj : objects) { + if (isEmpty(obj)) { + return false; + } + } + return true; + } + + /** + * 判断多个对象中是否存在空值 + * + * @param objects 待判断的对象数组 + * @return true-存在空值,false-不存在空值 + */ + public static boolean hasEmpty(Object... objects) { + if (objects == null || objects.length == 0) { + return true; + } + for (Object obj : objects) { + if (isEmpty(obj)) { + return true; + } + } + return false; + } + + // ======================== 深度递归判断 ======================== + + /** + * 深度判断对象是否为空(递归检查) + * 对于集合、数组等容器类型,会递归检查其内部元素 + * + * @param obj 待判断的对象 + * @return true-对象为空(包括递归检查),false-对象不为空 + */ + public static boolean isDeepEmpty(Object obj) { + return isDeepEmpty(obj, new HashSet<>()); + } + + /** + * 深度判断对象是否为空(递归检查,防止循环引用) + * + * @param obj 待判断的对象 + * @param visited 已访问对象集合,用于防止循环引用 + * @return true-对象为空(包括递归检查),false-对象不为空 + */ + private static boolean isDeepEmpty(Object obj, Set visited) { + if (isEmpty(obj)) { + return true; + } + + // 防止循环引用 + if (visited.contains(obj)) { + return false; + } + visited.add(obj); + + try { + // 集合类型递归检查 + if (obj instanceof Collection) { + Collection collection = (Collection) obj; + for (Object item : collection) { + if (!isDeepEmpty(item, visited)) { + return false; + } + } + return true; + } + + // Map类型递归检查 + if (obj instanceof Map) { + Map map = (Map) obj; + for (Map.Entry entry : map.entrySet()) { + if (!isDeepEmpty(entry.getKey(), visited) || !isDeepEmpty(entry.getValue(), visited)) { + return false; + } + } + return true; + } + + // 数组类型递归检查 + if (obj.getClass().isArray()) { + int length = Array.getLength(obj); + for (int i = 0; i < length; i++) { + if (!isDeepEmpty(Array.get(obj, i), visited)) { + return false; + } + } + return true; + } + + // Optional类型递归检查 + if (obj instanceof Optional) { + Optional optional = (Optional) obj; + return !optional.isPresent() || isDeepEmpty(optional.get(), visited); + } + + // 其他类型认为不为空 + return false; + + } finally { + visited.remove(obj); + } + } + + /** + * 深度判断对象是否不为空(递归检查) + * + * @param obj 待判断的对象 + * @return true-对象不为空(包括递归检查),false-对象为空 + */ + public static boolean isDeepNotEmpty(Object obj) { + return !isDeepEmpty(obj); + } + + // ======================== 集合专用方法 ======================== + + /** + * 判断集合是否为空或null + * + * @param collection 待判断的集合 + * @return true-集合为null或空,false-集合不为空 + */ + public static boolean isEmptyCollection(Collection collection) { + return collection == null || collection.isEmpty(); + } + + /** + * 判断集合是否不为空且不为null + * + * @param collection 待判断的集合 + * @return true-集合不为null且不为空,false-集合为null或空 + */ + public static boolean isNotEmptyCollection(Collection collection) { + return collection != null && !collection.isEmpty(); + } + + /** + * 判断集合是否包含有效元素(非null且非空的元素) + * + * @param collection 待判断的集合 + * @return true-集合包含有效元素,false-集合为空或只包含null/空元素 + */ + public static boolean hasValidElements(Collection collection) { + if (isEmptyCollection(collection)) { + return false; + } + for (Object item : collection) { + if (isNotEmpty(item)) { + return true; + } + } + return false; + } + + /** + * 判断集合是否所有元素都有效(非null且非空) + * + * @param collection 待判断的集合 + * @return true-集合所有元素都有效,false-集合为空或包含null/空元素 + */ + public static boolean allValidElements(Collection collection) { + if (isEmptyCollection(collection)) { + return false; + } + for (Object item : collection) { + if (isEmpty(item)) { + return false; + } + } + return true; + } + + /** + * 过滤集合中的空元素,返回新集合 + * + * @param collection 原集合 + * @param 集合元素类型 + * @return 过滤后的新集合 + */ + public static List filterEmpty(Collection collection) { + if (isEmptyCollection(collection)) { + return new ArrayList<>(); + } + List result = new ArrayList<>(); + for (T item : collection) { + if (isNotEmpty(item)) { + result.add(item); + } + } + return result; + } + + // ======================== Map专用方法 ======================== + + /** + * 判断Map是否为空或null + * + * @param map 待判断的Map + * @return true-Map为null或空,false-Map不为空 + */ + public static boolean isEmptyMap(Map map) { + return map == null || map.isEmpty(); + } + + /** + * 判断Map是否不为空且不为null + * + * @param map 待判断的Map + * @return true-Map不为null且不为空,false-Map为null或空 + */ + public static boolean isNotEmptyMap(Map map) { + return map != null && !map.isEmpty(); + } + + // ======================== 数组专用方法 ======================== + + /** + * 判断数组是否为空或null + * + * @param array 待判断的数组 + * @return true-数组为null或空,false-数组不为空 + */ + public static boolean isEmptyArray(Object array) { + return array == null || !array.getClass().isArray() || Array.getLength(array) == 0; + } + + /** + * 判断数组是否不为空且不为null + * + * @param array 待判断的数组 + * @return true-数组不为null且不为空,false-数组为null或空 + */ + public static boolean isNotEmptyArray(Object array) { + return array != null && array.getClass().isArray() && Array.getLength(array) > 0; + } + + // ======================== 字符串专用方法 ======================== + + /** + * 判断字符串是否为空或null(包括空白字符串) + * + * @param str 待判断的字符串 + * @return true-字符串为null、空或只包含空白字符,false-字符串有有效内容 + */ + public static boolean isEmptyString(String str) { + return str == null || str.trim().isEmpty(); + } + + /** + * 判断字符串是否不为空且不为null + * + * @param str 待判断的字符串 + * @return true-字符串不为null且有有效内容,false-字符串为null、空或只包含空白字符 + */ + public static boolean isNotEmptyString(String str) { + return str != null && !str.trim().isEmpty(); + } + + // ======================== 条件判断方法 ======================== + + /** + * 如果对象为空则返回默认值 + * + * @param obj 待判断的对象 + * @param defaultValue 默认值 + * @param 对象类型 + * @return 如果obj为空则返回defaultValue,否则返回obj + */ + @SuppressWarnings("unchecked") + public static T defaultIfEmpty(T obj, T defaultValue) { + return isEmpty(obj) ? defaultValue : obj; + } + + /** + * 如果对象为null则返回默认值 + * + * @param obj 待判断的对象 + * @param defaultValue 默认值 + * @param 对象类型 + * @return 如果obj为null则返回defaultValue,否则返回obj + */ + public static T defaultIfNull(T obj, T defaultValue) { + return isNull(obj) ? defaultValue : obj; + } + + /** + * 获取第一个非空的对象 + * + * @param objects 对象数组 + * @param 对象类型 + * @return 第一个非空的对象,如果都为空则返回null + */ + @SafeVarargs + public static T firstNotEmpty(T... objects) { + if (objects == null || objects.length == 0) { + return null; + } + for (T obj : objects) { + if (isNotEmpty(obj)) { + return obj; + } + } + return null; + } + + /** + * 获取第一个非null的对象 + * + * @param objects 对象数组 + * @param 对象类型 + * @return 第一个非null的对象,如果都为null则返回null + */ + @SafeVarargs + public static T firstNotNull(T... objects) { + if (objects == null || objects.length == 0) { + return null; + } + for (T obj : objects) { + if (isNotNull(obj)) { + return obj; + } + } + return null; + } + + // ======================== 统计方法 ======================== + + /** + * 统计数组中非空元素的个数 + * + * @param objects 对象数组 + * @return 非空元素个数 + */ + public static int countNotEmpty(Object... objects) { + if (objects == null || objects.length == 0) { + return 0; + } + int count = 0; + for (Object obj : objects) { + if (isNotEmpty(obj)) { + count++; + } + } + return count; + } + + /** + * 统计数组中非null元素的个数 + * + * @param objects 对象数组 + * @return 非null元素个数 + */ + public static int countNotNull(Object... objects) { + if (objects == null || objects.length == 0) { + return 0; + } + int count = 0; + for (Object obj : objects) { + if (isNotNull(obj)) { + count++; + } + } + return count; + } + + // ======================== 断言方法 ======================== + + /** + * 断言对象不为null,如果为null则抛出异常 + * + * @param obj 待断言的对象 + * @param message 异常消息 + * @throws IllegalArgumentException 如果对象为null + */ + public static void requireNotNull(Object obj, String message) { + if (isNull(obj)) { + throw new IllegalArgumentException(message != null ? message : "对象不能为null"); + } + } + + /** + * 断言对象不为空,如果为空则抛出异常 + * + * @param obj 待断言的对象 + * @param message 异常消息 + * @throws IllegalArgumentException 如果对象为空 + */ + public static void requireNotEmpty(Object obj, String message) { + if (isEmpty(obj)) { + throw new IllegalArgumentException(message != null ? message : "对象不能为空"); + } + } + + // ======================== 类型检查方法 ======================== + + /** + * 检查对象是否为指定类型且不为null + * + * @param obj 待检查的对象 + * @param clazz 目标类型 + * @param 目标类型 + * @return true-对象不为null且为指定类型,false-否则 + */ + public static boolean isInstanceAndNotNull(Object obj, Class clazz) { + return isNotNull(obj) && clazz.isInstance(obj); + } + + /** + * 安全的类型转换,如果对象为null或不是目标类型则返回null + * + * @param obj 待转换的对象 + * @param clazz 目标类型 + * @param 目标类型 + * @return 转换后的对象,如果转换失败则返回null + */ + @SuppressWarnings("unchecked") + public static T safeCast(Object obj, Class clazz) { + if (isInstanceAndNotNull(obj, clazz)) { + return (T) obj; + } + return null; + } +} diff --git a/schoolNewsServ/pom.xml b/schoolNewsServ/pom.xml index f072139..6ca7cda 100644 --- a/schoolNewsServ/pom.xml +++ b/schoolNewsServ/pom.xml @@ -32,6 +32,7 @@ 9.4.0 7.0.2 + 3.5.14 2.0.58 6.1.0 @@ -130,6 +131,12 @@ ${hikaricp.version} + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + com.alibaba.fastjson2 diff --git a/schoolNewsServ/system/pom.xml b/schoolNewsServ/system/pom.xml index 0543e86..20892db 100644 --- a/schoolNewsServ/system/pom.xml +++ b/schoolNewsServ/system/pom.xml @@ -18,4 +18,55 @@ 21 + + + + org.xyzh + api-system + ${school-news.version} + + + + + org.xyzh + common-all + ${school-news.version} + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-logging + + + + + + + com.baomidou + mybatis-plus-boot-starter + + + + + com.mysql + mysql-connector-j + + + + + com.zaxxer + HikariCP + + + + + org.springframework.boot + spring-boot-starter-log4j2 + + \ No newline at end of file diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/Main.java b/schoolNewsServ/system/src/main/java/org/xyzh/Main.java deleted file mode 100644 index f660b7a..0000000 --- a/schoolNewsServ/system/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/system/src/main/java/org/xyzh/system/SystemApplication.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/SystemApplication.java new file mode 100644 index 0000000..4d829db --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/SystemApplication.java @@ -0,0 +1,21 @@ +package org.xyzh.system; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @description SystemApplication.java文件描述 系统管理模块启动类 + * @filename SystemApplication.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@SpringBootApplication +@MapperScan("org.xyzh.system.mapper") +public class SystemApplication { + + public static void main(String[] args) { + SpringApplication.run(SystemApplication.class, args); + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/SysDepartmentService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/SysDepartmentService.java new file mode 100644 index 0000000..a548d8f --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/SysDepartmentService.java @@ -0,0 +1,13 @@ +package org.xyzh.system.department.service; +import org.xyzh.api.system.dept.DepartmentService; + +/** + * @description SysDepartmentService.java文件描述 系统部门服务接口 + * @filename SysDepartmentService.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public interface SysDepartmentService extends DepartmentService { + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/impl/SysDepartmentServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/impl/SysDepartmentServiceImpl.java new file mode 100644 index 0000000..ab80e3f --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/department/service/impl/SysDepartmentServiceImpl.java @@ -0,0 +1,289 @@ +package org.xyzh.system.department.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.util.StringUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.dept.TbSysDept; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.department.service.SysDepartmentService; +import org.xyzh.system.mapper.DepartmentMapper; + +import java.util.List; +import java.util.Date; + +/** + * @description SysDepartmentServiceImpl.java文件描述 系统部门服务实现类 + * @filename SysDepartmentServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Service +public class SysDepartmentServiceImpl implements SysDepartmentService { + + private static final Logger logger = LoggerFactory.getLogger(SysDepartmentServiceImpl.class); + + @Autowired + private DepartmentMapper departmentMapper; + + @Override + public ResultDomain getAllDepartments() { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始查询所有部门"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysDept::getDeleted, false) + .orderByAsc(TbSysDept::getCreateTime); + + List departments = departmentMapper.selectList(queryWrapper); + + logger.info("查询所有部门完成,共找到{}个部门", departments.size()); + resultDomain.success("查询成功", departments); + return resultDomain; + + } catch (Exception e) { + logger.error("查询所有部门失败", e); + resultDomain.fail("查询部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getDepartmentById(String deptId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据ID查询部门:{}", deptId); + + if (!StringUtils.hasText(deptId)) { + resultDomain.fail("部门ID不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysDept::getDeptID, deptId) + .eq(TbSysDept::getDeleted, false); + + TbSysDept department = departmentMapper.selectOne(queryWrapper); + + if (department == null) { + logger.warn("未找到部门:{}", deptId); + resultDomain.fail("未找到指定部门"); + return resultDomain; + } + + logger.info("根据ID查询部门完成:{}", deptId); + resultDomain.success("查询成功", department); + return resultDomain; + + } catch (Exception e) { + logger.error("根据ID查询部门失败:{}", deptId, e); + resultDomain.fail("查询部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getDepartmentsByParentId(String parentId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据父部门ID查询子部门:{}", parentId); + + List departments = departmentMapper.selectByParentId(parentId); + + logger.info("根据父部门ID查询子部门完成,共找到{}个子部门", departments.size()); + resultDomain.success("查询成功", departments); + return resultDomain; + + } catch (Exception e) { + logger.error("根据父部门ID查询子部门失败:{}", parentId, e); + resultDomain.fail("查询子部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain createDepartment(TbSysDept department) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始创建部门:{}", department.getName()); + + // 参数校验 + if (!StringUtils.hasText(department.getName())) { + resultDomain.fail("部门名称不能为空"); + return resultDomain; + } + + // 检查部门名称是否已存在 + ResultDomain checkResult = checkDepartmentNameExists(department.getName(), null); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("部门名称已存在"); + return resultDomain; + } + + // 设置基础信息 + department.setID(IDUtils.generateID()); + department.setDeptID(IDUtils.generateID()); + department.setCreateTime(new Date()); + department.setDeleted(false); + + // 插入数据库 + int result = departmentMapper.insert(department); + + if (result > 0) { + logger.info("创建部门成功:{}", department.getName()); + resultDomain.success("创建部门成功", department); + return resultDomain; + } else { + logger.warn("创建部门失败:{}", department.getName()); + resultDomain.fail("创建部门失败"); + } + + return resultDomain; + } catch (Exception e) { + logger.error("创建部门异常:{}", department.getName(), e); + resultDomain.fail("创建部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain updateDepartment(TbSysDept department) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始更新部门:{}", department.getDeptID()); + + // 参数校验 + if (!StringUtils.hasText(department.getDeptID())) { + resultDomain.fail("部门ID不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(department.getName())) { + resultDomain.fail("部门名称不能为空"); + return resultDomain; + } + + // 检查部门是否存在 + ResultDomain existResult = getDepartmentById(department.getDeptID()); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查部门名称是否已存在(排除自身) + ResultDomain checkResult = checkDepartmentNameExists(department.getName(), department.getID()); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("部门名称已存在"); + return resultDomain; + } + + // 设置更新时间 + department.setUpdateTime(new Date()); + + // 更新数据库 + int result = departmentMapper.updateById(department); + + if (result > 0) { + logger.info("更新部门成功:{}", department.getDeptID()); + resultDomain.success("更新部门成功", department); + return resultDomain; + } else { + logger.warn("更新部门失败:{}", department.getDeptID()); + resultDomain.fail("更新部门失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新部门异常:{}", department.getDeptID(), e); + resultDomain.fail("更新部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain deleteDepartment(String deptId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始删除部门:{}", deptId); + + if (!StringUtils.hasText(deptId)) { + resultDomain.fail("部门ID不能为空"); + return resultDomain; + } + + // 检查部门是否存在 + ResultDomain existResult = getDepartmentById(deptId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查是否有子部门 + ResultDomain childrenResult = getDepartmentsByParentId(deptId); + if (childrenResult.isSuccess() && childrenResult.getData() != null) { + resultDomain.fail("该部门下有子部门,无法删除"); + return resultDomain; + } + + // 逻辑删除 + TbSysDept department = existResult.getData(); + department.setDeleted(true); + department.setDeleteTime(new Date()); + + int result = departmentMapper.updateById(department); + + if (result > 0) { + logger.info("删除部门成功:{}", deptId); + resultDomain.success("删除部门成功", department); + return resultDomain; + } else { + logger.warn("删除部门失败:{}", deptId); + resultDomain.fail("删除部门失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("删除部门异常:{}", deptId, e); + resultDomain.fail("删除部门失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkDepartmentNameExists(String deptName, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查部门名称是否存在:{}", deptName); + + if (!StringUtils.hasText(deptName)) { + resultDomain.fail("部门名称不能为空"); + return resultDomain; + } + + int count = departmentMapper.countByDeptName(deptName, excludeId); + boolean exists = count > 0; + + logger.info("部门名称存在性检查完成:{},存在:{}", deptName, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查部门名称存在性失败:{}", deptName, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/DepartmentMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/DepartmentMapper.java new file mode 100644 index 0000000..d9b5952 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/DepartmentMapper.java @@ -0,0 +1,65 @@ +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.dept.TbSysDept; + +import java.util.List; + +/** + * @description DepartmentMapper.java文件描述 部门数据访问层 + * @filename DepartmentMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Mapper +public interface DepartmentMapper extends BaseMapper { + + /** + * @description 根据父部门ID查询子部门列表 + * @param parentId 父部门ID + * @return List 子部门列表 + * @author yslg + * @since 2025-09-28 + */ + List selectByParentId(@Param("parentId") String parentId); + + /** + * @description 检查部门名称是否存在 + * @param deptName 部门名称 + * @param excludeId 排除的部门ID(用于更新时排除自身) + * @return int 存在的数量 + * @author yslg + * @since 2025-09-28 + */ + int countByDeptName(@Param("deptName") String deptName, @Param("excludeId") String excludeId); + + /** + * @description 根据部门ID查询部门信息(包含父部门信息) + * @param deptId 部门ID + * @return TbSysDept 部门信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysDept selectDeptWithParent(@Param("deptId") String deptId); + + /** + * @description 查询部门树结构 + * @return List 部门树 + * @author yslg + * @since 2025-09-28 + */ + List selectDeptTree(); + + /** + * @description 批量删除部门(逻辑删除) + * @param deptIds 部门ID列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-09-28 + */ + int batchDeleteByIds(@Param("deptIds") List deptIds, @Param("updater") String updater); +} 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 new file mode 100644 index 0000000..7945e66 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/MenuMapper.java @@ -0,0 +1,74 @@ +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.TbSysMenu; + +import java.util.List; + +/** + * @description MenuMapper.java文件描述 菜单数据访问层 + * @filename MenuMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Mapper +public interface MenuMapper extends BaseMapper { + + /** + * @description 根据用户ID查询菜单列表 + * @param userId 用户ID + * @return List 菜单列表 + * @author yslg + * @since 2025-09-28 + */ + List selectMenusByUserId(@Param("userId") String userId); + + /** + * @description 根据角色ID查询菜单列表 + * @param roleId 角色ID + * @return List 菜单列表 + * @author yslg + * @since 2025-09-28 + */ + List selectMenusByRoleId(@Param("roleId") String roleId); + + /** + * @description 根据父菜单ID查询子菜单列表 + * @param parentId 父菜单ID + * @return List 子菜单列表 + * @author yslg + * @since 2025-09-28 + */ + List selectByParentId(@Param("parentId") String parentId); + + /** + * @description 查询菜单树结构 + * @return List 菜单树 + * @author yslg + * @since 2025-09-28 + */ + List selectMenuTree(); + + /** + * @description 检查菜单名称是否存在 + * @param menuName 菜单名称 + * @param excludeId 排除的菜单ID + * @return int 存在数量 + * @author yslg + * @since 2025-09-28 + */ + int countByMenuName(@Param("menuName") String menuName, @Param("excludeId") String excludeId); + + /** + * @description 批量删除菜单(逻辑删除) + * @param menuIds 菜单ID列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-09-28 + */ + int batchDeleteByIds(@Param("menuIds") List menuIds, @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 new file mode 100644 index 0000000..9f5618a --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java @@ -0,0 +1,76 @@ +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.permission.TbSysPermission; + +import java.util.List; + +/** + * @description PermissionMapper.java文件描述 权限数据访问层 + * @filename PermissionMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Mapper +public interface PermissionMapper extends BaseMapper { + + /** + * @description 根据用户ID查询权限列表 + * @param userId 用户ID + * @return List 权限列表 + * @author yslg + * @since 2025-09-28 + */ + List selectPermissionsByUserId(@Param("userId") String userId); + + /** + * @description 根据角色ID查询权限列表 + * @param roleId 角色ID + * @return List 权限列表 + * @author yslg + * @since 2025-09-28 + */ + List selectPermissionsByRoleId(@Param("roleId") String roleId); + + /** + * @description 根据权限编码查询权限 + * @param permissionCode 权限编码 + * @return TbSysPermission 权限信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysPermission selectByPermissionCode(@Param("permissionCode") String permissionCode); + + /** + * @description 检查权限名称是否存在 + * @param permissionName 权限名称 + * @param excludeId 排除的权限ID + * @return int 存在数量 + * @author yslg + * @since 2025-09-28 + */ + int countByPermissionName(@Param("permissionName") String permissionName, @Param("excludeId") String excludeId); + + /** + * @description 检查权限编码是否存在 + * @param permissionCode 权限编码 + * @param excludeId 排除的权限ID + * @return int 存在数量 + * @author yslg + * @since 2025-09-28 + */ + int countByPermissionCode(@Param("permissionCode") String permissionCode, @Param("excludeId") String excludeId); + + /** + * @description 批量删除权限(逻辑删除) + * @param permissionIds 权限ID列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-09-28 + */ + int batchDeleteByIds(@Param("permissionIds") List permissionIds, @Param("updater") String updater); +} 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 new file mode 100644 index 0000000..0a7dbd3 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/RoleMapper.java @@ -0,0 +1,67 @@ +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.TbSysRole; + +import java.util.List; + +/** + * @description RoleMapper.java文件描述 角色数据访问层 + * @filename RoleMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Mapper +public interface RoleMapper extends BaseMapper { + + /** + * @description 根据用户ID查询角色列表 + * @param userId 用户ID + * @return List 角色列表 + * @author yslg + * @since 2025-09-28 + */ + List selectRolesByUserId(@Param("userId") String userId); + + /** + * @description 根据角色编码查询角色 + * @param roleCode 角色编码 + * @return TbSysRole 角色信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysRole selectByRoleCode(@Param("roleCode") String roleCode); + + /** + * @description 检查角色名称是否存在 + * @param roleName 角色名称 + * @param excludeId 排除的角色ID + * @return int 存在数量 + * @author yslg + * @since 2025-09-28 + */ + int countByRoleName(@Param("roleName") String roleName, @Param("excludeId") String excludeId); + + /** + * @description 检查角色编码是否存在 + * @param roleCode 角色编码 + * @param excludeId 排除的角色ID + * @return int 存在数量 + * @author yslg + * @since 2025-09-28 + */ + int countByRoleCode(@Param("roleCode") String roleCode, @Param("excludeId") String excludeId); + + /** + * @description 批量删除角色(逻辑删除) + * @param roleIds 角色ID列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-09-28 + */ + int batchDeleteByIds(@Param("roleIds") List roleIds, @Param("updater") String updater); +} 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 new file mode 100644 index 0000000..bd8a3a0 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/UserMapper.java @@ -0,0 +1,78 @@ +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.user.TbSysUser; + +import java.util.List; + +/** + * @description UserMapper.java文件描述 用户数据访问层 + * @filename UserMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Mapper +public interface UserMapper extends BaseMapper { + + /** + * @description 根据用户名查询用户 + * @param username 用户名 + * @return TbSysUser 用户信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysUser selectByUsername(@Param("username") String username); + + /** + * @description 根据邮箱查询用户 + * @param email 邮箱 + * @return TbSysUser 用户信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysUser selectByEmail(@Param("email") String email); + + /** + * @description 根据手机号查询用户 + * @param phone 手机号 + * @return TbSysUser 用户信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysUser selectByPhone(@Param("phone") String phone); + + /** + * @description 根据过滤条件查询用户 + * @param filter 过滤条件 + * @return TbSysUser 用户信息 + * @author yslg + * @since 2025-09-28 + */ + TbSysUser selectByFilter(@Param("filter") TbSysUser filter); + + /** + * @description 查询用户列表(分页) + * @param username 用户名(模糊查询) + * @param email 邮箱(模糊查询) + * @param status 用户状态 + * @return List 用户列表 + * @author yslg + * @since 2025-09-28 + */ + List selectUserList(@Param("username") String username, + @Param("email") String email, + @Param("status") String status); + + /** + * @description 批量删除用户(逻辑删除) + * @param userIds 用户ID列表 + * @param updater 更新人 + * @return int 影响行数 + * @author yslg + * @since 2025-09-28 + */ + int batchDeleteByIds(@Param("userIds") List userIds, @Param("updater") String updater); +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/SysMenuService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/SysMenuService.java new file mode 100644 index 0000000..c8071fe --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/SysMenuService.java @@ -0,0 +1,14 @@ +package org.xyzh.system.menu.service; + +import org.xyzh.api.system.menu.MenuService; + +/** + * @description SysMenuService.java文件描述 系统菜单服务接口 + * @filename SysMenuService.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public interface SysMenuService extends MenuService { + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/impl/SysMenuServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..7d2642a --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/menu/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,448 @@ +package org.xyzh.system.menu.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.util.StringUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.menu.TbSysMenu; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.mapper.MenuMapper; +import org.xyzh.system.menu.service.SysMenuService; + +import java.util.Date; +import java.util.List; + +/** + * @description SysMenuServiceImpl.java文件描述 系统菜单服务实现类 + * @filename SysMenuServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Service +public class SysMenuServiceImpl implements SysMenuService { + + private static final Logger logger = LoggerFactory.getLogger(SysMenuServiceImpl.class); + + @Autowired + private MenuMapper menuMapper; + + @Override + public ResultDomain getAllMenus() { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始查询所有菜单"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysMenu::getDeleted, false) + .orderByAsc(TbSysMenu::getCreateTime); + + List menus = menuMapper.selectList(queryWrapper); + + logger.info("查询所有菜单完成,共找到{}个菜单", menus.size()); + resultDomain.success("查询成功", menus); + return resultDomain; + + } catch (Exception e) { + logger.error("查询所有菜单失败", e); + resultDomain.fail("查询菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getMenuById(String menuId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据ID查询菜单:{}", menuId); + + if (!StringUtils.hasText(menuId)) { + resultDomain.fail("菜单ID不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysMenu::getMenuID, menuId) + .eq(TbSysMenu::getDeleted, false); + + TbSysMenu menu = menuMapper.selectOne(queryWrapper); + + if (menu == null) { + logger.warn("未找到菜单:{}", menuId); + resultDomain.fail("未找到指定菜单"); + return resultDomain; + } + + logger.info("根据ID查询菜单完成:{}", menuId); + resultDomain.success("查询成功", menu); + return resultDomain; + + } catch (Exception e) { + logger.error("根据ID查询菜单失败:{}", menuId, e); + resultDomain.fail("查询菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getMenusByUserId(String userId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据用户ID查询菜单列表:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + List menus = menuMapper.selectMenusByUserId(userId); + + logger.info("根据用户ID查询菜单列表完成,共找到{}个菜单", menus.size()); + resultDomain.success("查询成功", menus); + return resultDomain; + + } catch (Exception e) { + logger.error("根据用户ID查询菜单列表失败:{}", userId, e); + resultDomain.fail("查询菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getMenusByRoleId(String roleId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据角色ID查询菜单列表:{}", roleId); + + if (!StringUtils.hasText(roleId)) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + + List menus = menuMapper.selectMenusByRoleId(roleId); + + logger.info("根据角色ID查询菜单列表完成,共找到{}个菜单", menus.size()); + resultDomain.success("查询成功", menus); + return resultDomain; + + } catch (Exception e) { + logger.error("根据角色ID查询菜单列表失败:{}", roleId, e); + resultDomain.fail("查询菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getMenusByParentId(String parentId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据父菜单ID查询子菜单:{}", parentId); + + List menus = menuMapper.selectByParentId(parentId); + + logger.info("根据父菜单ID查询子菜单完成,共找到{}个子菜单", menus.size()); + resultDomain.success("查询成功", menus); + return resultDomain; + + } catch (Exception e) { + logger.error("根据父菜单ID查询子菜单失败:{}", parentId, e); + resultDomain.fail("查询子菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getMenuTree() { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始查询菜单树结构"); + + List menus = menuMapper.selectMenuTree(); + + logger.info("查询菜单树结构完成,共找到{}个菜单", menus.size()); + resultDomain.success("查询成功", menus); + return resultDomain; + + } catch (Exception e) { + logger.error("查询菜单树结构失败", e); + resultDomain.fail("查询菜单树失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain createMenu(TbSysMenu menu) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始创建菜单:{}", menu.getName()); + + // 参数校验 + if (!StringUtils.hasText(menu.getName())) { + resultDomain.fail("菜单名称不能为空"); + return resultDomain; + } + + // 检查菜单名称是否已存在 + ResultDomain checkResult = checkMenuNameExists(menu.getName(), null); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("菜单名称已存在"); + return resultDomain; + } + + // 设置基础信息 + menu.setID(IDUtils.generateID()); + menu.setMenuID(IDUtils.generateID()); + menu.setCreateTime(new Date()); + menu.setDeleted(false); + + + // 插入数据库 + int result = menuMapper.insert(menu); + + if (result > 0) { + logger.info("创建菜单成功:{}", menu.getName()); + resultDomain.success("创建菜单成功", menu); + return resultDomain; + } else { + logger.warn("创建菜单失败:{}", menu.getName()); + resultDomain.fail("创建菜单失败"); + } + + return resultDomain; + } catch (Exception e) { + logger.error("创建菜单异常:{}", menu.getName(), e); + resultDomain.fail("创建菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain updateMenu(TbSysMenu menu) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始更新菜单:{}", menu.getMenuID()); + + // 参数校验 + if (!StringUtils.hasText(menu.getMenuID())) { + resultDomain.fail("菜单ID不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(menu.getName())) { + resultDomain.fail("菜单名称不能为空"); + return resultDomain; + } + + // 检查菜单是否存在 + ResultDomain existResult = getMenuById(menu.getMenuID()); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查菜单名称是否已存在(排除自身) + ResultDomain checkResult = checkMenuNameExists(menu.getName(), menu.getID()); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("菜单名称已存在"); + return resultDomain; + } + + // 设置更新时间 + menu.setUpdateTime(new Date()); + + // 更新数据库 + int result = menuMapper.updateById(menu); + + if (result > 0) { + logger.info("更新菜单成功:{}", menu.getMenuID()); + resultDomain.success("更新菜单成功", menu); + return resultDomain; + } else { + logger.warn("更新菜单失败:{}", menu.getMenuID()); + resultDomain.fail("更新菜单失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新菜单异常:{}", menu.getMenuID(), e); + resultDomain.fail("更新菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain deleteMenu(String menuId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始删除菜单:{}", menuId); + + if (!StringUtils.hasText(menuId)) { + resultDomain.fail("菜单ID不能为空"); + return resultDomain; + } + + // 检查菜单是否存在 + ResultDomain existResult = getMenuById(menuId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查是否有子菜单 + ResultDomain childrenResult = getMenusByParentId(menuId); + if (childrenResult.isSuccess() && childrenResult.getData() != null) { + resultDomain.fail("该菜单下有子菜单,无法删除"); + return resultDomain; + } + + // 逻辑删除 + TbSysMenu menu = existResult.getData(); + menu.setDeleted(true); + menu.setDeleteTime(new Date()); + + int result = menuMapper.updateById(menu); + + if (result > 0) { + logger.info("删除菜单成功:{}", menuId); + resultDomain.success("删除菜单成功", menu); + return resultDomain; + } else { + logger.warn("删除菜单失败:{}", menuId); + resultDomain.fail("删除菜单失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("删除菜单异常:{}", menuId, e); + resultDomain.fail("删除菜单失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkMenuNameExists(String menuName, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查菜单名称是否存在:{}", menuName); + + if (!StringUtils.hasText(menuName)) { + resultDomain.fail("菜单名称不能为空"); + return resultDomain; + } + + int count = menuMapper.countByMenuName(menuName, excludeId); + boolean exists = count > 0; + + logger.info("菜单名称存在性检查完成:{},存在:{}", menuName, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查菜单名称存在性失败:{}", menuName, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain changeMenuStatus(String menuId, Integer status) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始修改菜单状态:{},状态:{}", menuId, status); + + if (!StringUtils.hasText(menuId)) { + resultDomain.fail("菜单ID不能为空"); + return resultDomain; + } + + if (status == null) { + resultDomain.fail("菜单状态不能为空"); + return resultDomain; + } + + // 检查菜单是否存在 + ResultDomain existResult = getMenuById(menuId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysMenu menu = existResult.getData(); + + menu.setUpdateTime(new Date()); + + int result = menuMapper.updateById(menu); + + if (result > 0) { + logger.info("修改菜单状态成功:{}", menuId); + resultDomain.success("修改菜单状态成功", menu); + return resultDomain; + } else { + logger.warn("修改菜单状态失败:{}", menuId); + resultDomain.fail("修改菜单状态失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("修改菜单状态异常:{}", menuId, e); + resultDomain.fail("修改菜单状态失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain changeMenuVisibility(String menuId, Boolean visible) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始修改菜单可见性:{},可见性:{}", menuId, visible); + + if (!StringUtils.hasText(menuId)) { + resultDomain.fail("菜单ID不能为空"); + return resultDomain; + } + + if (visible == null) { + resultDomain.fail("菜单可见性不能为空"); + return resultDomain; + } + + // 检查菜单是否存在 + ResultDomain existResult = getMenuById(menuId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysMenu menu = existResult.getData(); + menu.setUpdateTime(new Date()); + + int result = menuMapper.updateById(menu); + + if (result > 0) { + logger.info("修改菜单可见性成功:{}", menuId); + resultDomain.success("修改菜单可见性成功", menu); + return resultDomain; + } else { + logger.warn("修改菜单可见性失败:{}", menuId); + resultDomain.fail("修改菜单可见性失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("修改菜单可见性异常:{}", menuId, e); + resultDomain.fail("修改菜单可见性失败:" + e.getMessage()); + return resultDomain; + } + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/SysPermissionService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/SysPermissionService.java new file mode 100644 index 0000000..57759be --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/SysPermissionService.java @@ -0,0 +1,14 @@ +package org.xyzh.system.permission.service; + +import org.xyzh.api.system.permission.PermissionService; + +/** + * @description SysPermissionService.java文件描述 系统权限服务接口 + * @filename SysPermissionService.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public interface SysPermissionService extends PermissionService { + +} 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 new file mode 100644 index 0000000..294a3f5 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,445 @@ +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.util.StringUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.permission.TbSysPermission; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.mapper.PermissionMapper; +import org.xyzh.system.permission.service.SysPermissionService; + +import java.util.Date; +import java.util.List; + +/** + * @description SysPermissionServiceImpl.java文件描述 系统权限服务实现类 + * @filename SysPermissionServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Service +public class SysPermissionServiceImpl implements SysPermissionService { + + private static final Logger logger = LoggerFactory.getLogger(SysPermissionServiceImpl.class); + + @Autowired + private PermissionMapper permissionMapper; + + @Override + public ResultDomain getAllPermissions() { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始查询所有权限"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysPermission::getDeleted, false) + .orderByAsc(TbSysPermission::getCreateTime); + + List permissions = permissionMapper.selectList(queryWrapper); + + logger.info("查询所有权限完成,共找到{}个权限", permissions.size()); + resultDomain.success("查询成功", permissions); + return resultDomain; + + } catch (Exception e) { + logger.error("查询所有权限失败", e); + resultDomain.fail("查询权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getPermissionById(String permissionId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据ID查询权限:{}", permissionId); + + if (!StringUtils.hasText(permissionId)) { + resultDomain.fail("权限ID不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysPermission::getPermissionID, permissionId) + .eq(TbSysPermission::getDeleted, false); + + TbSysPermission permission = permissionMapper.selectOne(queryWrapper); + + if (permission == null) { + logger.warn("未找到权限:{}", permissionId); + resultDomain.fail("未找到指定权限"); + return resultDomain; + } + + logger.info("根据ID查询权限完成:{}", permissionId); + resultDomain.success("查询成功", permission); + return resultDomain; + + } catch (Exception e) { + logger.error("根据ID查询权限失败:{}", permissionId, e); + resultDomain.fail("查询权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getPermissionByCode(String permissionCode) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据权限编码查询权限:{}", permissionCode); + + if (!StringUtils.hasText(permissionCode)) { + resultDomain.fail("权限编码不能为空"); + return resultDomain; + } + + TbSysPermission permission = permissionMapper.selectByPermissionCode(permissionCode); + + if (permission == null) { + logger.warn("未找到权限:{}", permissionCode); + resultDomain.fail("未找到指定权限"); + return resultDomain; + } + + logger.info("根据权限编码查询权限完成:{}", permissionCode); + resultDomain.success("查询成功", permission); + return resultDomain; + + } catch (Exception e) { + logger.error("根据权限编码查询权限失败:{}", permissionCode, e); + resultDomain.fail("查询权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getPermissionsByUserId(String userId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据用户ID查询权限列表:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + List permissions = permissionMapper.selectPermissionsByUserId(userId); + + logger.info("根据用户ID查询权限列表完成,共找到{}个权限", permissions.size()); + resultDomain.success("查询成功", permissions); + return resultDomain; + + } catch (Exception e) { + logger.error("根据用户ID查询权限列表失败:{}", userId, e); + resultDomain.fail("查询权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getPermissionsByRoleId(String roleId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据角色ID查询权限列表:{}", roleId); + + if (!StringUtils.hasText(roleId)) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + + List permissions = permissionMapper.selectPermissionsByRoleId(roleId); + + logger.info("根据角色ID查询权限列表完成,共找到{}个权限", permissions.size()); + resultDomain.success("查询成功", permissions); + return resultDomain; + + } catch (Exception e) { + logger.error("根据角色ID查询权限列表失败:{}", roleId, e); + resultDomain.fail("查询权限失败:" + e.getMessage()); + return resultDomain; + } + } + + @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/role/service/SysRoleService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/SysRoleService.java new file mode 100644 index 0000000..cdc1b3a --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/SysRoleService.java @@ -0,0 +1,14 @@ +package org.xyzh.system.role.service; + +import org.xyzh.api.system.role.RoleService; + +/** + * @description SysRoleService.java文件描述 系统角色服务接口 + * @filename SysRoleService.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public interface SysRoleService extends RoleService { + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/impl/SysRoleServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..97f9d20 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/role/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,335 @@ +package org.xyzh.system.role.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.util.StringUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.role.TbSysRole; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.mapper.RoleMapper; +import org.xyzh.system.role.service.SysRoleService; + +import java.util.Date; +import java.util.List; + +/** + * @description SysRoleServiceImpl.java文件描述 系统角色服务实现类 + * @filename SysRoleServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Service +public class SysRoleServiceImpl implements SysRoleService { + + private static final Logger logger = LoggerFactory.getLogger(SysRoleServiceImpl.class); + + @Autowired + private RoleMapper roleMapper; + + @Override + public ResultDomain getAllRoles() { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始查询所有角色"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysRole::getDeleted, false) + .orderByAsc(TbSysRole::getCreateTime); + + List roles = roleMapper.selectList(queryWrapper); + + logger.info("查询所有角色完成,共找到{}个角色", roles.size()); + resultDomain.success("查询成功", roles); + return resultDomain; + + } catch (Exception e) { + logger.error("查询所有角色失败", e); + resultDomain.fail("查询角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getRoleById(String roleId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据ID查询角色:{}", roleId); + + if (!StringUtils.hasText(roleId)) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysRole::getRoleID, roleId) + .eq(TbSysRole::getDeleted, false); + + TbSysRole role = roleMapper.selectOne(queryWrapper); + + if (role == null) { + logger.warn("未找到角色:{}", roleId); + resultDomain.fail("未找到指定角色"); + return resultDomain; + } + + logger.info("根据ID查询角色完成:{}", roleId); + resultDomain.success("查询成功", role); + return resultDomain; + + } catch (Exception e) { + logger.error("根据ID查询角色失败:{}", roleId, e); + resultDomain.fail("查询角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getRolesByUserId(String userId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据用户ID查询角色列表:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + List roles = roleMapper.selectRolesByUserId(userId); + + logger.info("根据用户ID查询角色列表完成,共找到{}个角色", roles.size()); + resultDomain.success("查询成功", roles); + return resultDomain; + + } catch (Exception e) { + logger.error("根据用户ID查询角色列表失败:{}", userId, e); + resultDomain.fail("查询角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain createRole(TbSysRole role) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始创建角色:{}", role.getName()); + + // 参数校验 + if (!StringUtils.hasText(role.getName())) { + resultDomain.fail("角色名称不能为空"); + return resultDomain; + } + + + // 检查角色名称是否已存在 + ResultDomain nameCheckResult = checkRoleNameExists(role.getName(), null); + if (!nameCheckResult.isSuccess()) { + resultDomain.fail(nameCheckResult.getMessage()); + return resultDomain; + } + if (nameCheckResult.getData()) { + resultDomain.fail("角色名称已存在"); + return resultDomain; + } + + // 设置基础信息 + role.setID(IDUtils.generateID()); + role.setRoleID(IDUtils.generateID()); + role.setCreateTime(new Date()); + role.setDeleted(false); + + // 插入数据库 + int result = roleMapper.insert(role); + + if (result > 0) { + logger.info("创建角色成功:{}", role.getName()); + resultDomain.success("创建角色成功", role); + return resultDomain; + } else { + logger.warn("创建角色失败:{}", role.getName()); + resultDomain.fail("创建角色失败"); + } + + return resultDomain; + } catch (Exception e) { + logger.error("创建角色异常:{}", role.getName(), e); + resultDomain.fail("创建角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain updateRole(TbSysRole role) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始更新角色:{}", role.getRoleID()); + + // 参数校验 + if (!StringUtils.hasText(role.getRoleID())) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(role.getName())) { + resultDomain.fail("角色名称不能为空"); + return resultDomain; + } + + // 检查角色是否存在 + ResultDomain existResult = getRoleById(role.getRoleID()); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查角色名称是否已存在(排除自身) + ResultDomain nameCheckResult = checkRoleNameExists(role.getName(), role.getID()); + if (!nameCheckResult.isSuccess()) { + resultDomain.fail(nameCheckResult.getMessage()); + return resultDomain; + } + if (nameCheckResult.getData()) { + resultDomain.fail("角色名称已存在"); + return resultDomain; + } + + // 设置更新时间 + role.setUpdateTime(new Date()); + + // 更新数据库 + int result = roleMapper.updateById(role); + + if (result > 0) { + logger.info("更新角色成功:{}", role.getRoleID()); + resultDomain.success("更新角色成功", role); + return resultDomain; + } else { + logger.warn("更新角色失败:{}", role.getRoleID()); + resultDomain.fail("更新角色失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新角色异常:{}", role.getRoleID(), e); + resultDomain.fail("更新角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain deleteRole(String roleId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始删除角色:{}", roleId); + + if (!StringUtils.hasText(roleId)) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + + // 检查角色是否存在 + ResultDomain existResult = getRoleById(roleId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // TODO: 检查角色是否被用户使用,如果被使用则不能删除 + + // 逻辑删除 + TbSysRole role = existResult.getData(); + role.setDeleted(true); + role.setDeleteTime(new Date()); + + int result = roleMapper.updateById(role); + + if (result > 0) { + logger.info("删除角色成功:{}", roleId); + resultDomain.success("删除角色成功", role); + return resultDomain; + } else { + logger.warn("删除角色失败:{}", roleId); + resultDomain.fail("删除角色失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("删除角色异常:{}", roleId, e); + resultDomain.fail("删除角色失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkRoleNameExists(String roleName, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查角色名称是否存在:{}", roleName); + + if (!StringUtils.hasText(roleName)) { + resultDomain.fail("角色名称不能为空"); + return resultDomain; + } + + int count = roleMapper.countByRoleName(roleName, excludeId); + boolean exists = count > 0; + + logger.info("角色名称存在性检查完成:{},存在:{}", roleName, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查角色名称存在性失败:{}", roleName, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain changeRoleStatus(String roleId, Integer status) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始修改角色状态:{},状态:{}", roleId, status); + + if (!StringUtils.hasText(roleId)) { + resultDomain.fail("角色ID不能为空"); + return resultDomain; + } + + if (status == null) { + resultDomain.fail("角色状态不能为空"); + return resultDomain; + } + + // 检查角色是否存在 + ResultDomain existResult = getRoleById(roleId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysRole role = existResult.getData(); + role.setUpdateTime(new Date()); + + int result = roleMapper.updateById(role); + + if (result > 0) { + logger.info("修改角色状态成功:{}", roleId); + resultDomain.success("修改角色状态成功", role); + return resultDomain; + } else { + logger.warn("修改角色状态失败:{}", roleId); + resultDomain.fail("修改角色状态失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("修改角色状态异常:{}", roleId, e); + resultDomain.fail("修改角色状态失败:" + e.getMessage()); + return resultDomain; + } + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/SysUserService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/SysUserService.java new file mode 100644 index 0000000..80db5ae --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/SysUserService.java @@ -0,0 +1,14 @@ +package org.xyzh.system.user.service; + +import org.xyzh.api.system.user.UserService; + +/** + * @description SysUserService.java文件描述 系统用户服务接口 + * @filename SysUserService.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +public interface SysUserService extends UserService { + +} 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 new file mode 100644 index 0000000..370fd87 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/user/service/impl/SysUserServiceImpl.java @@ -0,0 +1,515 @@ +package org.xyzh.system.user.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.util.StringUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.user.TbSysUser; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.system.mapper.UserMapper; +import org.xyzh.system.user.service.SysUserService; + +import java.util.Date; +import java.util.List; + +/** + * @description SysUserServiceImpl.java文件描述 系统用户服务实现类 + * @filename SysUserServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-09-28 + */ +@Service +public class SysUserServiceImpl implements SysUserService { + + private static final Logger logger = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private UserMapper userMapper; + + @Override + public ResultDomain getAllUsers() { + ResultDomain resultDomain = new ResultDomain<>(); + + try { + logger.info("开始查询所有用户"); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysUser::getDeleted, false) + .orderByAsc(TbSysUser::getCreateTime); + + List users = userMapper.selectList(queryWrapper); + + logger.info("查询所有用户完成,共找到{}个用户", users.size()); + resultDomain.success("查询成功", users); + return resultDomain; + + } catch (Exception e) { + logger.error("查询所有用户失败", e); + resultDomain.fail("查询用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getUserById(String userId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据ID查询用户:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysUser::getID, userId) + .eq(TbSysUser::getDeleted, false); + + TbSysUser user = userMapper.selectOne(queryWrapper); + + if (user == null) { + logger.warn("未找到用户:{}", userId); + resultDomain.fail("未找到指定用户"); + return resultDomain; + } + + logger.info("根据ID查询用户完成:{}", userId); + resultDomain.success("查询成功", user); + return resultDomain; + + } catch (Exception e) { + logger.error("根据ID查询用户失败:{}", userId, e); + resultDomain.fail("查询用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getUserByUsername(String username) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据用户名查询用户:{}", username); + + if (!StringUtils.hasText(username)) { + resultDomain.fail("用户名不能为空"); + return resultDomain; + } + + TbSysUser user = userMapper.selectByUsername(username); + + if (user == null) { + logger.warn("未找到用户:{}", username); + resultDomain.fail("未找到指定用户"); + return resultDomain; + } + + logger.info("根据用户名查询用户完成:{}", username); + resultDomain.success("查询成功", user); + return resultDomain; + + } catch (Exception e) { + logger.error("根据用户名查询用户失败:{}", username, e); + resultDomain.fail("查询用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain getUserByFilter(TbSysUser filter) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始根据过滤条件查询用户:{}", filter); + + if (filter == null) { + resultDomain.fail("过滤条件不能为空"); + return resultDomain; + } + + // 检查至少有一个查询条件 + boolean hasFilter = StringUtils.hasText(filter.getID()) || + StringUtils.hasText(filter.getUsername()) || + StringUtils.hasText(filter.getEmail()) || + StringUtils.hasText(filter.getPhone()); + + if (!hasFilter) { + resultDomain.fail("至少需要提供一个查询条件"); + return resultDomain; + } + + TbSysUser user = userMapper.selectByFilter(filter); + + if (user == null) { + logger.warn("未找到符合条件的用户:{}", filter); + resultDomain.fail("未找到指定用户"); + return resultDomain; + } + + logger.info("根据过滤条件查询用户完成:{}", filter); + resultDomain.success("查询成功", user); + return resultDomain; + + } catch (Exception e) { + logger.error("根据过滤条件查询用户失败:{}", filter, e); + resultDomain.fail("查询用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain createUser(TbSysUser user) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始创建用户:{}", user.getUsername()); + + // 参数校验 + if (!StringUtils.hasText(user.getUsername())) { + resultDomain.fail("用户名不能为空"); + return resultDomain; + } + + // 检查用户名是否已存在 + ResultDomain checkResult = checkUsernameExists(user.getUsername(), null); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("用户名已存在"); + return resultDomain; + } + + // 检查邮箱是否已存在 + if (StringUtils.hasText(user.getEmail())) { + ResultDomain emailCheckResult = checkEmailExists(user.getEmail(), null); + if (!emailCheckResult.isSuccess()) { + resultDomain.fail(emailCheckResult.getMessage()); + return resultDomain; + } + if (emailCheckResult.getData()) { + resultDomain.fail("邮箱已存在"); + return resultDomain; + } + } + + // 设置基础信息 + user.setID(IDUtils.generateID()); + user.setCreateTime(new Date()); + user.setDeleted(false); + if (user.getStatus() == null) { + user.setStatus(1); // 默认启用状态 + } + + // 插入数据库 + int result = userMapper.insert(user); + + if (result > 0) { + logger.info("创建用户成功:{}", user.getUsername()); + resultDomain.success("创建用户成功", user); + return resultDomain; + } else { + logger.warn("创建用户失败:{}", user.getUsername()); + resultDomain.fail("创建用户失败"); + } + + return resultDomain; + } catch (Exception e) { + logger.error("创建用户异常:{}", user.getUsername(), e); + resultDomain.fail("创建用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain updateUser(TbSysUser user) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始更新用户:{}", user.getID()); + + // 参数校验 + if (!StringUtils.hasText(user.getID())) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + if (!StringUtils.hasText(user.getUsername())) { + resultDomain.fail("用户名不能为空"); + return resultDomain; + } + + // 检查用户是否存在 + ResultDomain existResult = getUserById(user.getID()); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 检查用户名是否已存在(排除自身) + ResultDomain checkResult = checkUsernameExists(user.getUsername(), user.getID()); + if (!checkResult.isSuccess()) { + resultDomain.fail(checkResult.getMessage()); + return resultDomain; + } + if (checkResult.getData()) { + resultDomain.fail("用户名已存在"); + return resultDomain; + } + + // 检查邮箱是否已存在(排除自身) + if (StringUtils.hasText(user.getEmail())) { + ResultDomain emailCheckResult = checkEmailExists(user.getEmail(), user.getID()); + if (!emailCheckResult.isSuccess()) { + resultDomain.fail(emailCheckResult.getMessage()); + return resultDomain; + } + if (emailCheckResult.getData()) { + resultDomain.fail("邮箱已存在"); + return resultDomain; + } + } + + // 设置更新时间 + user.setUpdateTime(new Date()); + + // 更新数据库 + int result = userMapper.updateById(user); + + if (result > 0) { + logger.info("更新用户成功:{}", user.getID()); + resultDomain.success("更新用户成功", user); + return resultDomain; + } else { + logger.warn("更新用户失败:{}", user.getID()); + resultDomain.fail("更新用户失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("更新用户异常:{}", user.getID(), e); + resultDomain.fail("更新用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain deleteUser(String userId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始删除用户:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + // 检查用户是否存在 + ResultDomain existResult = getUserById(userId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + // 逻辑删除 + TbSysUser user = existResult.getData(); + user.setDeleted(true); + user.setDeleteTime(new Date()); + + int result = userMapper.updateById(user); + + if (result > 0) { + logger.info("删除用户成功:{}", userId); + resultDomain.success("删除用户成功", user); + return resultDomain; + } else { + logger.warn("删除用户失败:{}", userId); + resultDomain.fail("删除用户失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("删除用户异常:{}", userId, e); + resultDomain.fail("删除用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkUsernameExists(String username, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查用户名是否存在:{}", username); + + if (!StringUtils.hasText(username)) { + resultDomain.fail("用户名不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysUser::getUsername, username) + .eq(TbSysUser::getDeleted, false); + + if (StringUtils.hasText(excludeId)) { + queryWrapper.ne(TbSysUser::getID, excludeId); + } + + long count = userMapper.selectCount(queryWrapper); + boolean exists = count > 0; + + logger.info("用户名存在性检查完成:{},存在:{}", username, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查用户名存在性失败:{}", username, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain checkEmailExists(String email, String excludeId) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("检查邮箱是否存在:{}", email); + + if (!StringUtils.hasText(email)) { + resultDomain.fail("邮箱不能为空"); + return resultDomain; + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(TbSysUser::getEmail, email) + .eq(TbSysUser::getDeleted, false); + + if (StringUtils.hasText(excludeId)) { + queryWrapper.ne(TbSysUser::getID, excludeId); + } + + long count = userMapper.selectCount(queryWrapper); + boolean exists = count > 0; + + logger.info("邮箱存在性检查完成:{},存在:{}", email, exists); + resultDomain.success("检查完成", exists); + return resultDomain; + + } catch (Exception e) { + logger.error("检查邮箱存在性失败:{}", email, e); + resultDomain.fail("检查失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain searchUsers(String username, String email, String status) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始搜索用户,用户名:{},邮箱:{},状态:{}", username, email, status); + + List users = userMapper.selectUserList(username, email, status); + + logger.info("搜索用户完成,共找到{}个用户", users.size()); + resultDomain.success("搜索成功", users); + return resultDomain; + + } catch (Exception e) { + logger.error("搜索用户失败", e); + resultDomain.fail("搜索用户失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain changeUserStatus(String userId, Integer status) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始修改用户状态:{},状态:{}", userId, status); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + if (status == null) { + resultDomain.fail("用户状态不能为空"); + return resultDomain; + } + + // 检查用户是否存在 + ResultDomain existResult = getUserById(userId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysUser user = existResult.getData(); + user.setStatus(status); + user.setUpdateTime(new Date()); + + int result = userMapper.updateById(user); + + if (result > 0) { + logger.info("修改用户状态成功:{}", userId); + resultDomain.success("修改用户状态成功", user); + return resultDomain; + } else { + logger.warn("修改用户状态失败:{}", userId); + resultDomain.fail("修改用户状态失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("修改用户状态异常:{}", userId, e); + resultDomain.fail("修改用户状态失败:" + e.getMessage()); + return resultDomain; + } + } + + @Override + public ResultDomain resetPassword(String userId, String newPassword) { + ResultDomain resultDomain = new ResultDomain<>(); + try { + logger.info("开始重置用户密码:{}", userId); + + if (!StringUtils.hasText(userId)) { + resultDomain.fail("用户ID不能为空"); + return resultDomain; + } + + if (!StringUtils.hasText(newPassword)) { + resultDomain.fail("新密码不能为空"); + return resultDomain; + } + + // 检查用户是否存在 + ResultDomain existResult = getUserById(userId); + if (!existResult.isSuccess()) { + resultDomain.fail(existResult.getMessage()); + return resultDomain; + } + + TbSysUser user = existResult.getData(); + // TODO: 这里应该对密码进行加密处理 + user.setPassword(newPassword); + user.setUpdateTime(new Date()); + + int result = userMapper.updateById(user); + + if (result > 0) { + logger.info("重置用户密码成功:{}", userId); + resultDomain.success("重置密码成功", user); + return resultDomain; + } else { + logger.warn("重置用户密码失败:{}", userId); + resultDomain.fail("重置密码失败"); + return resultDomain; + } + + } catch (Exception e) { + logger.error("重置用户密码异常:{}", userId, e); + resultDomain.fail("重置密码失败:" + e.getMessage()); + return resultDomain; + } + } +} diff --git a/schoolNewsServ/system/src/main/resources/application.yml b/schoolNewsServ/system/src/main/resources/application.yml new file mode 100644 index 0000000..4003cda --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/application.yml @@ -0,0 +1,98 @@ +server: + port: 8082 + +spring: + application: + name: school-news-system + + # 数据源配置 + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/school_news?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: root + + # Druid 配置 + druid: + initial-size: 5 + min-idle: 5 + max-active: 20 + max-wait: 60000 + time-between-eviction-runs-millis: 60000 + min-evictable-idle-time-millis: 300000 + validation-query: SELECT 1 + test-while-idle: true + test-on-borrow: false + test-on-return: false + pool-prepared-statements: true + max-pool-prepared-statement-per-connection-size: 20 + + # 监控统计配置 + filter: + stat: + enabled: true + db-type: mysql + log-slow-sql: true + slow-sql-millis: 2000 + wall: + enabled: true + db-type: mysql + + # Web监控配置 + web-stat-filter: + enabled: true + url-pattern: /* + exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" + + stat-view-servlet: + enabled: true + url-pattern: /druid/* + reset-enable: false + login-username: admin + login-password: admin123 + +# MyBatis Plus配置 +mybatis-plus: + # 实体类扫描包 + type-aliases-package: org.xyzh.common.dto + # mapper xml文件位置 + mapper-locations: classpath:mapper/*.xml + # 全局配置 + global-config: + db-config: + # 主键策略:雪花算法 + id-type: assign_id + # 逻辑删除字段 + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + # 字段填充策略 + insert-strategy: not_null + update-strategy: not_null + select-strategy: not_empty + # SQL配置 + configuration: + # 开启驼峰命名转换 + map-underscore-to-camel-case: true + # 开启二级缓存 + cache-enabled: true + # 打印SQL + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl + +# 日志配置 +logging: + config: classpath:log4j2-spring.xml + level: + org.xyzh.system: DEBUG + org.xyzh.system.mapper: DEBUG + +# 管理端点配置 +management: + endpoints: + web: + exposure: + include: health,info,metrics + endpoint: + health: + show-details: when-authorized diff --git a/schoolNewsServ/system/src/main/resources/log4j2-spring.xml b/schoolNewsServ/system/src/main/resources/log4j2-spring.xml new file mode 100644 index 0000000..aacd4fa --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/log4j2-spring.xml @@ -0,0 +1,175 @@ + + + + + + + + school-news-system + + ./logs/${APP_NAME} + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%X{traceId}] %logger{36} - %msg%n + + %d{HH:mm:ss.SSS} %highlight{%-5level} [%t] %style{[%X{traceId}]}{cyan} %style{%logger{36}}{magenta} - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1024 + + + + + 1024 + + + + + 1024 + + + + + 1024 + + + + + 1024 + + + + + 512 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/DepartmentMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/DepartmentMapper.xml new file mode 100644 index 0000000..e343f0b --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/DepartmentMapper.xml @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + id, dept_id, name, parent_id, description, creator, updater, + create_time, update_time, delete_time, deleted + + + + + + deleted = 0 + + AND dept_id = #{deptID} + + + AND parent_id = #{parentID} + + + AND name LIKE CONCAT('%', #{name}, '%') + + + + + + + + + + + + + + + + + + + UPDATE tb_sys_dept + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND id IN + + #{deptId} + + + + + + INSERT INTO tb_sys_dept + + id, + dept_id, + parent_id, + name, + description, + creator, + create_time, + deleted + + + #{id}, + #{deptID}, + #{parentID}, + #{name}, + #{description}, + #{creator}, + #{createTime}, + 0 + + + + + + UPDATE tb_sys_dept + + dept_id = #{deptID}, + parent_id = #{parentID}, + name = #{name}, + description = #{description}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_dept + SET deleted = 1, + delete_time = NOW() + WHERE id = #{id} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml new file mode 100644 index 0000000..a1f64c9 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/MenuMapper.xml @@ -0,0 +1,214 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, menu_id, name, parent_id, url, icon, order_num, type, + creator, updater, create_time, update_time, delete_time, deleted + + + + + + deleted = 0 + + AND menu_name LIKE CONCAT('%', #{menuName}, '%') + + + AND menu_type = #{menuType} + + + AND status = #{status} + + + AND visible = #{visible} + + + + + + + + + + + + + + + + + + + + + + UPDATE tb_sys_menu + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND id IN + + #{menuId} + + + + + + INSERT INTO tb_sys_menu + + id, + menu_id, + parent_id, + menu_name, + menu_type, + path, + component, + permission, + icon, + sort, + visible, + status, + external_link, + cache, + frame, + query, + remark, + creator, + create_time, + deleted + + + #{id}, + #{menuID}, + #{parentID}, + #{menuName}, + #{menuType}, + #{path}, + #{component}, + #{permission}, + #{icon}, + #{sort}, + #{visible}, + #{status}, + #{externalLink}, + #{cache}, + #{frame}, + #{query}, + #{remark}, + #{creator}, + #{createTime}, + 0 + + + + + + UPDATE tb_sys_menu + + menu_id = #{menuID}, + parent_id = #{parentID}, + menu_name = #{menuName}, + menu_type = #{menuType}, + path = #{path}, + component = #{component}, + permission = #{permission}, + icon = #{icon}, + sort = #{sort}, + visible = #{visible}, + status = #{status}, + external_link = #{externalLink}, + cache = #{cache}, + frame = #{frame}, + query = #{query}, + remark = #{remark}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_menu + SET deleted = 1, + delete_time = NOW() + WHERE id = #{id} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml new file mode 100644 index 0000000..ab90100 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + id, permission_id, name, code, description, creator, updater, + create_time, update_time, delete_time, deleted + + + + + + deleted = 0 + + AND permission_name LIKE CONCAT('%', #{permissionName}, '%') + + + AND permission_code = #{permissionCode} + + + AND permission_type = #{permissionType} + + + AND status = #{status} + + + + + + + + + + + + + + + + + + + + + + UPDATE tb_sys_permission + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND id IN + + #{permissionId} + + + + + + INSERT INTO tb_sys_permission + + id, + permission_id, + permission_name, + permission_code, + permission_type, + resource_url, + http_method, + description, + status, + sort, + creator, + create_time, + deleted + + + #{id}, + #{permissionID}, + #{permissionName}, + #{permissionCode}, + #{permissionType}, + #{resourceUrl}, + #{httpMethod}, + #{description}, + #{status}, + #{sort}, + #{creator}, + #{createTime}, + 0 + + + + + + UPDATE tb_sys_permission + + permission_id = #{permissionID}, + permission_name = #{permissionName}, + permission_code = #{permissionCode}, + permission_type = #{permissionType}, + resource_url = #{resourceUrl}, + http_method = #{httpMethod}, + description = #{description}, + status = #{status}, + sort = #{sort}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_permission + SET deleted = 1, + delete_time = NOW() + 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 new file mode 100644 index 0000000..838cbef --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/RoleMapper.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + id, role_id, name, description, creator, updater, + create_time, update_time, delete_time, deleted + + + + + + deleted = 0 + + AND role_name LIKE CONCAT('%', #{roleName}, '%') + + + AND role_code = #{roleCode} + + + AND status = #{status} + + + + + + + + + + + + + + + + + + + UPDATE tb_sys_role + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND id IN + + #{roleId} + + + + + + INSERT INTO tb_sys_role + + id, + role_id, + role_name, + role_code, + description, + status, + sort, + creator, + create_time, + deleted + + + #{id}, + #{roleID}, + #{roleName}, + #{roleCode}, + #{description}, + #{status}, + #{sort}, + #{creator}, + #{createTime}, + 0 + + + + + + UPDATE tb_sys_role + + role_id = #{roleID}, + role_name = #{roleName}, + role_code = #{roleCode}, + description = #{description}, + status = #{status}, + sort = #{sort}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_role + SET deleted = 1, + delete_time = NOW() + WHERE id = #{id} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..a633278 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + id, username, password, email, phone, wechat_id, + create_time, update_time, delete_time, deleted, status + + + + + + deleted = 0 + + AND username LIKE CONCAT('%', #{username}, '%') + + + AND email LIKE CONCAT('%', #{email}, '%') + + + AND phone = #{phone} + + + AND status = #{status} + + + + + + + + + + + + + + + + + + + + + + UPDATE tb_sys_user + SET deleted = 1, + delete_time = NOW(), + updater = #{updater} + WHERE deleted = 0 + AND id IN + + #{userId} + + + + + + INSERT INTO tb_sys_user + + id, + username, + password, + email, + phone, + avatar, + nickname, + gender, + birthday, + status, + last_login_time, + last_login_ip, + creator, + create_time, + deleted + + + #{id}, + #{username}, + #{password}, + #{email}, + #{phone}, + #{avatar}, + #{nickname}, + #{gender}, + #{birthday}, + #{status}, + #{lastLoginTime}, + #{lastLoginIp}, + #{creator}, + #{createTime}, + 0 + + + + + + UPDATE tb_sys_user + + username = #{username}, + password = #{password}, + email = #{email}, + phone = #{phone}, + avatar = #{avatar}, + nickname = #{nickname}, + gender = #{gender}, + birthday = #{birthday}, + status = #{status}, + last_login_time = #{lastLoginTime}, + last_login_ip = #{lastLoginIp}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_user + SET deleted = 1, + delete_time = NOW() + WHERE id = #{id} AND deleted = 0 + + +