diff --git a/api-admin/pom.xml b/api-admin/pom.xml index 12a0bc0b..324fb051 100644 --- a/api-admin/pom.xml +++ b/api-admin/pom.xml @@ -302,6 +302,12 @@ 3.10.0 + + cn.dev33 + sa-token-spring-boot-starter + 1.30.0 + + diff --git a/api-admin/src/main/java/com/glxp/api/admin/constant/Constant.java b/api-admin/src/main/java/com/glxp/api/admin/constant/Constant.java index 6ac0c6ea..a39e549e 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/constant/Constant.java +++ b/api-admin/src/main/java/com/glxp/api/admin/constant/Constant.java @@ -40,4 +40,69 @@ public class Constant { public static final int CHECK_NULL = 3; //校驗失敗,不存在 + /** + * www主域 + */ + public static String WWW = "www."; + + /** + * http请求 + */ + public static String HTTP = "http://"; + + /** + * https请求 + */ + public static String HTTPS = "https://"; + + + /** + * 菜单类型(目录) + */ + public static String TYPE_DIR = "M"; + + /** + * 菜单类型(菜单) + */ + public static String TYPE_MENU = "C"; + + /** + * 菜单类型(按钮) + */ + public static String TYPE_BUTTON = "F"; + + /** + * Layout组件标识 + */ + public static String LAYOUT = "Layout"; + + /** + * 是否菜单外链(是) + */ + public static String YES_FRAME = "0"; + + /** + * 是否菜单外链(否) + */ + public static String NO_FRAME = "1"; + + + /** + * ParentView组件标识 + */ + public static String PARENT_VIEW = "ParentView"; + + /** + * InnerLink组件标识 + */ + public static String INNER_LINK = "InnerLink"; + + + public static final String ADMIN_ID = "1"; + + public static final String UNIQUE = "0"; + public static final String NOT_UNIQUE = "1"; + public static final String YES = "Y"; + + } diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/BaseController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/BaseController.java new file mode 100644 index 00000000..b80f408a --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/BaseController.java @@ -0,0 +1,36 @@ +package com.glxp.api.admin.controller; + + +import cn.hutool.core.util.StrUtil; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.service.auth.CustomerService; + +import javax.annotation.Resource; + +/** + * + */ +public class BaseController { + + @Resource + CustomerService customerService; + + /** + * 页面跳转 + */ + public String redirect(String url) { + return StrUtil.format("redirect:{}", url); + } + + + public boolean isAdmin(Long userId) { + return Constant.ADMIN_ID.equals(userId); + } + + + public AuthAdmin getUser() { + return customerService.getUserBean(); + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/AuthAdminController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/AuthAdminController.java index d7a6bd2a..2e940aa6 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/AuthAdminController.java +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/AuthAdminController.java @@ -220,8 +220,8 @@ public class AuthAdminController { if (authAdminSaveRequest.getId() == null) { return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "参数错误!"); } - InvSubWarehouseEntity invSubWarehouseEntity=invSubWarehouseService.filterGroupInvSubAndcode(authAdminSaveRequest.getLocSubInvCode()); - if(invSubWarehouseEntity!=null){ + InvSubWarehouseEntity invSubWarehouseEntity = invSubWarehouseService.filterGroupInvSubAndcode(authAdminSaveRequest.getLocSubInvCode()); + if (invSubWarehouseEntity != null) { authAdminSaveRequest.setLocInvCode(invSubWarehouseEntity.getParentId()); } AuthAdmin authAdmin = new AuthAdmin(); diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/LoginController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/LoginController.java index 666eaf2c..bd878978 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/LoginController.java +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/LoginController.java @@ -1,7 +1,12 @@ package com.glxp.api.admin.controller.auth; import cn.hutool.core.util.StrUtil; +import com.glxp.api.admin.controller.BaseController; +import com.glxp.api.admin.dao.auth.AuthLicenseDao; import com.glxp.api.admin.entity.auth.AuthCheckEntity; +import com.glxp.api.admin.entity.auth.SysMenu; +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.entity.info.CompanyEntity; import com.glxp.api.admin.entity.info.DeviceKeyEntity; import com.glxp.api.admin.entity.inventory.InvSubWarehouseEntity; import com.glxp.api.admin.entity.inventory.InvWarehouseEntity; @@ -9,8 +14,8 @@ import com.glxp.api.admin.req.auth.LoginRequest; import com.glxp.api.admin.req.auth.PCLoginRequest; import com.glxp.api.admin.req.auth.UpdatePasswordRequest; import com.glxp.api.admin.res.auth.LoginResponse; -import com.glxp.api.admin.service.auth.AuthCheckService; -import com.glxp.api.admin.service.auth.DeviceKeyService; +import com.glxp.api.admin.service.auth.*; +import com.glxp.api.admin.service.info.CompanyService; import com.glxp.api.admin.service.inventory.InvSubWarehouseService; import com.glxp.api.admin.service.inventory.InvWarehouseService; import com.glxp.api.admin.util.*; @@ -20,8 +25,6 @@ import com.glxp.api.common.util.ResultVOUtils; import com.glxp.api.admin.annotation.AuthRuleAnnotation; import com.glxp.api.admin.entity.auth.AuthAdmin; import com.glxp.api.admin.exception.JsonException; -import com.glxp.api.admin.service.auth.AuthAdminService; -import com.glxp.api.admin.service.auth.AuthLoginService; import com.glxp.api.admin.res.auth.LoginUserInfoResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -42,7 +45,7 @@ import java.util.*; */ @RestController @Slf4j -public class LoginController { +public class LoginController extends BaseController { @Autowired private AuthLoginService authLoginService; @@ -54,6 +57,16 @@ public class LoginController { private AuthCheckService authCheckService; @Resource DeviceKeyService deviceKeyService; + @Resource + SysPermissionService sysPermissionService; + + + @Resource + private CompanyService companyService; + + @Resource + private AuthLicenseDao authLicenseDao; + /** * 用户登录 @@ -226,6 +239,47 @@ public class LoginController { return ResultVOUtils.success(loginUserInfoResponse); } + @Resource + ISysRoleService sysRoleService; + + @AuthRuleAnnotation("") + @GetMapping("/getInfo") + public BaseResponse getUserInfo(HttpServletRequest request) { + String adminId = request.getHeader("ADMIN_ID"); + Long id = Long.valueOf(adminId); + AuthAdmin authAdmin = authAdminService.findById(id); + List authRules = authLoginService.listRuleByAdminId(authAdmin.getId()); + LoginUserInfoResponse loginUserInfoResponse = new LoginUserInfoResponse(); + BeanUtils.copyProperties(authAdmin, loginUserInfoResponse); + loginUserInfoResponse.setAuthRules(authRules); + CompanyEntity companyEntity = companyService.findCompany(); + loginUserInfoResponse.setCompanyName(companyEntity.getName()); + loginUserInfoResponse.setLocInvName(invWarehouseService.getInvName(loginUserInfoResponse.getLocInvCode())); + loginUserInfoResponse.setLocSubInvName(invSubWarehouseService.getSubInvName(loginUserInfoResponse.getLocSubInvCode())); + // 角色集合 + Set roles = sysPermissionService.getRolePermission(authAdmin); + + List sysRoles = sysRoleService.selectRolesByUserId(id); + authAdmin.setRoles(sysRoles); + // 权限集合 + Set permissions = sysPermissionService.getMenuPermission(authAdmin); + + loginUserInfoResponse.setRoles(roles); + loginUserInfoResponse.setPermissions(permissions); + + return ResultVOUtils.success(loginUserInfoResponse); + } + + @Resource + ISysMenuService menuService; + + @GetMapping("/spms/getRouters") + public BaseResponse getRouters() { + AuthAdmin authAdmin = getUser(); + List menus = menuService.selectMenuTreeByUserId(authAdmin.getId()); + return ResultVOUtils.success(menuService.buildMenus(menus)); + } + /** * 登出 * diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictDataController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictDataController.java new file mode 100644 index 00000000..1c75f417 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictDataController.java @@ -0,0 +1,95 @@ +package com.glxp.api.admin.controller.auth; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import com.glxp.api.admin.controller.BaseController; +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.req.auth.SysDictDataRequest; +import com.glxp.api.admin.service.auth.ISysDictDataService; +import com.glxp.api.admin.service.auth.ISysDictTypeService; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/dict/data") +public class SysDictDataController extends BaseController { + + private final ISysDictDataService dictDataService; + private final ISysDictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @GetMapping("/list") + public BaseResponse list(SysDictDataRequest sysDictDataRequest) { + + return ResultVOUtils.success(dictDataService.selectDictDataList(sysDictDataRequest)); + } + + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @GetMapping(value = "/{dictCode}") + public BaseResponse getInfo(@PathVariable Long dictCode) { + return ResultVOUtils.success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public BaseResponse dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return ResultVOUtils.success(data); + } + + /** + * 新增字典类型 + */ + @PostMapping + public BaseResponse add(@Validated @RequestBody SysDictData dict) { + dictDataService.insertDictData(dict); + return ResultVOUtils.success("添加成功!"); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @PutMapping + public BaseResponse edit(@Validated @RequestBody SysDictData dict) { + dictDataService.updateDictData(dict); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @DeleteMapping("/{dictCodes}") + public BaseResponse remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return ResultVOUtils.success("移除成功!"); + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictTypeController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictTypeController.java new file mode 100644 index 00000000..590cda25 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysDictTypeController.java @@ -0,0 +1,98 @@ +package com.glxp.api.admin.controller.auth; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.github.pagehelper.PageInfo; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.controller.BaseController; +import com.glxp.api.admin.entity.auth.SysDictType; +import com.glxp.api.admin.req.auth.SysDictTypeRequest; +import com.glxp.api.admin.res.PageSimpleResponse; +import com.glxp.api.admin.service.auth.ISysDictTypeService; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 数据字典信息 + */ +@RestController +@RequestMapping("/system/dict/type") +public class SysDictTypeController extends BaseController { + @Resource + ISysDictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public BaseResponse list(SysDictTypeRequest sysDictTypeRequest) { + List sysDictTypes = dictTypeService.selectDictTypeList(sysDictTypeRequest); + PageInfo pageInfo = new PageInfo<>(sysDictTypes); + PageSimpleResponse deptEntityPageSimpleResponse = new PageSimpleResponse<>(); + deptEntityPageSimpleResponse.setTotal(pageInfo.getTotal()); + deptEntityPageSimpleResponse.setList(sysDictTypes); + return ResultVOUtils.success(deptEntityPageSimpleResponse); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @GetMapping(value = "/{dictId}") + public BaseResponse getInfo(@PathVariable Long dictId) { + return ResultVOUtils.success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PostMapping + public BaseResponse add(@Validated @RequestBody SysDictType dict) { + if (Constant.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { + return ResultVOUtils.error(500, "新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return ResultVOUtils.success("新增成功!"); + } + + /** + * 修改字典类型 + */ + @PutMapping + public BaseResponse edit(@Validated @RequestBody SysDictType dict) { +// if (Constant.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { +// return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); +// } + dictTypeService.updateDictType(dict); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @DeleteMapping("/{dictIds}") + public BaseResponse remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return ResultVOUtils.success("删除成功!"); + } + + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public BaseResponse optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return ResultVOUtils.success(dictTypes); + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysMenuController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysMenuController.java new file mode 100644 index 00000000..5bc0af6e --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysMenuController.java @@ -0,0 +1,131 @@ +package com.glxp.api.admin.controller.auth; + +import cn.hutool.http.HttpUtil; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.entity.auth.SysMenu; +import com.glxp.api.admin.service.auth.CustomerService; +import com.glxp.api.admin.service.auth.ISysMenuService; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@RestController +@RequestMapping("/system/menu") +public class SysMenuController { + + @Resource + ISysMenuService menuService; + + @Resource + CustomerService customerService; + + + /** + * 获取菜单列表 + */ + @GetMapping("/list") + public BaseResponse list(SysMenu menu) { + AuthAdmin authAdmin = customerService.getUserBean(); + List menus = menuService.selectMenuList(menu, authAdmin.getId()); + return ResultVOUtils.success(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @GetMapping(value = "/{menuId}") + public BaseResponse getInfo(@PathVariable Long menuId) { + return ResultVOUtils.success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public BaseResponse treeselect(SysMenu menu) { + AuthAdmin authAdmin = customerService.getUserBean(); + List menus = menuService.selectMenuList(menu, authAdmin.getId()); + return ResultVOUtils.success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public BaseResponse roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + AuthAdmin authAdmin = customerService.getUserBean(); + List menus = menuService.selectMenuList(authAdmin.getId()); + Map ajax = new HashMap<>(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ResultVOUtils.success(ajax); + } + + /** + * 新增菜单 + */ + @PostMapping + public BaseResponse add(@Validated @RequestBody SysMenu menu) { + if (Constant.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return ResultVOUtils.error(500, "新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (Constant.YES_FRAME.equals(menu.getIsFrame()) && !HttpUtil.isHttp(menu.getPath())) { + return ResultVOUtils.error(500, "新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menuService.insertMenu(menu); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 修改菜单 + */ + @PutMapping + public BaseResponse edit(@Validated @RequestBody SysMenu menu) { + menu.setNeMenuId(menu.getMenuId()); + if (Constant.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return ResultVOUtils.error(500, "修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (Constant.YES_FRAME.equals(menu.getIsFrame()) && !HttpUtil.isHttp(menu.getPath())) { + return ResultVOUtils.error(500, "修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return ResultVOUtils.error(500, "修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menuService.updateMenu(menu); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @DeleteMapping("/{menuId}") + public BaseResponse remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return ResultVOUtils.error(500, "存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return ResultVOUtils.error(500, "菜单已分配,不允许删除"); + } + + menuService.deleteMenuById(menuId); + + return ResultVOUtils.success("修改成功!"); + } + + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysRoleController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysRoleController.java new file mode 100644 index 00000000..303389c5 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysRoleController.java @@ -0,0 +1,219 @@ +package com.glxp.api.admin.controller.auth; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.github.pagehelper.PageInfo; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.controller.BaseController; +import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.entity.auth.SysUserRole; +import com.glxp.api.admin.req.auth.AuthAdminQueryRequest; +import com.glxp.api.admin.req.auth.SysRoleRequest; +import com.glxp.api.admin.res.PageSimpleResponse; +import com.glxp.api.admin.service.auth.AuthAdminService; +import com.glxp.api.admin.service.auth.ISysRoleService; +import com.glxp.api.admin.service.auth.SysPermissionService; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/role") +public class SysRoleController extends BaseController { + @Resource + ISysRoleService roleService; + @Resource + AuthAdminService userService; + @Resource + SysPermissionService permissionService; + + /** + * 获取角色信息列表 + */ + @GetMapping("/list") + public BaseResponse list(SysRoleRequest sysRoleRequest) { + + List sysRoles = roleService.selectPageRoleList(sysRoleRequest); + PageInfo pageInfo = new PageInfo<>(sysRoles); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(sysRoles); + return ResultVOUtils.success(pageSimpleResponse); + + } + + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @GetMapping(value = "/{roleId}") + public BaseResponse getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return ResultVOUtils.success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PostMapping + public BaseResponse add(@Validated @RequestBody SysRole role) { + + if (Constant.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return ResultVOUtils.error(500, "新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (Constant.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return ResultVOUtils.error(500, "新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + role.setCreateBy(getUser().getId() + ""); + role.setCreateTime(new Date()); + int i = roleService.insertRole(role); + return ResultVOUtils.success("新增成功!"); + + } + + /** + * 修改保存角色 + */ + @PutMapping + public BaseResponse edit(@Validated @RequestBody SysRole role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + if (Constant.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return ResultVOUtils.error(500, "修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (Constant.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return ResultVOUtils.error(500, "修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + + role.setUpdateTime(new Date()); + role.setUpdateBy(getUser().getId() + ""); + if (roleService.updateRole(role) > 0) { + // 更新缓存用户权限 + return ResultVOUtils.success("修改成功!"); + } + return ResultVOUtils.error(500, "修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @PutMapping("/dataScope") + public BaseResponse dataScope(@RequestBody SysRole role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + + + int i = roleService.authDataScope(role); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 状态修改 + */ + @PutMapping("/changeStatus") + public BaseResponse changeStatus(@RequestBody SysRole role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + int i = roleService.updateRoleStatus(role); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @DeleteMapping("/{roleIds}") + public BaseResponse remove(@PathVariable Long[] roleIds) { + int i = roleService.deleteRoleByIds(roleIds); + return ResultVOUtils.success("修改成功!"); + } + + /** + * 获取角色选择框列表 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public BaseResponse optionselect() { + + return ResultVOUtils.success(roleService.selectRoleAll()); + + } + + /** + * 查询已分配用户角色列表 + */ + @GetMapping("/authUser/allocatedList") + public BaseResponse allocatedList(AuthAdminQueryRequest authAdminQueryRequest) { + + + List authAdminList = userService.selectAllocatedList(authAdminQueryRequest); + PageInfo pageInfo = new PageInfo<>(authAdminList); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(authAdminList); + return ResultVOUtils.success(pageSimpleResponse); + } + + /** + * 查询未分配用户角色列表 + */ + @GetMapping("/authUser/unallocatedList") + public BaseResponse unallocatedList(AuthAdminQueryRequest authAdminQueryRequest) { + + + List authAdminList = userService.selectUnallocatedList(authAdminQueryRequest); + PageInfo pageInfo = new PageInfo<>(authAdminList); + PageSimpleResponse pageSimpleResponse = new PageSimpleResponse<>(); + pageSimpleResponse.setTotal(pageInfo.getTotal()); + pageSimpleResponse.setList(authAdminList); + return ResultVOUtils.success(pageSimpleResponse); + } + + /** + * 取消授权用户 + */ + @PutMapping("/authUser/cancel") + public BaseResponse cancelAuthUser(@RequestBody SysUserRole userRole) { + int i = roleService.deleteAuthUser(userRole); + return ResultVOUtils.success("取消成功!"); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @PutMapping("/authUser/cancelAll") + public BaseResponse cancelAuthUserAll(Long roleId, Long[] userIds) { + + int i = roleService.deleteAuthUsers(roleId, userIds); + return ResultVOUtils.success("取消成功!"); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @PutMapping("/authUser/selectAll") + public BaseResponse selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + roleService.insertAuthUsers(roleId, userIds); + return ResultVOUtils.success("授权成功!"); + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysUserController.java b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysUserController.java new file mode 100644 index 00000000..5b6b447d --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/controller/auth/SysUserController.java @@ -0,0 +1,235 @@ +package com.glxp.api.admin.controller.auth; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.github.pagehelper.PageInfo; +import com.glxp.api.admin.controller.BaseController; +import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.entity.auth.AuthRoleAdmin; +import com.glxp.api.admin.entity.auth.SysMenu; +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.req.auth.AuthAdminQueryRequest; +import com.glxp.api.admin.req.auth.AuthAdminSaveRequest; +import com.glxp.api.admin.res.PageSimpleResponse; +import com.glxp.api.admin.res.auth.AuthAdminResponse; +import com.glxp.api.admin.service.auth.AuthAdminService; +import com.glxp.api.admin.service.auth.AuthRoleAdminService; +import com.glxp.api.admin.service.auth.ISysMenuService; +import com.glxp.api.admin.service.auth.ISysRoleService; +import com.glxp.api.admin.util.PasswordUtils; +import com.glxp.api.admin.util.StreamUtils; +import com.glxp.api.common.enums.ResultEnum; +import com.glxp.api.common.res.BaseResponse; +import com.glxp.api.common.util.ResultVOUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.BeanUtils; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/user") +public class SysUserController extends BaseController { + + private final AuthAdminService userService; + private final ISysRoleService roleService; + @Resource + private AuthRoleAdminService authRoleAdminService; + @Resource + ISysRoleService sysRoleService; + + @GetMapping("/list") + public BaseResponse list(AuthAdminQueryRequest authAdminQueryRequest, BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); + } + + if (authAdminQueryRequest.getRoleId() != null) { + List authRoleAdmins = authRoleAdminService.listByRoleId(authAdminQueryRequest.getRoleId()); + List ids = new ArrayList<>(); + if (authRoleAdmins != null && !authRoleAdmins.isEmpty()) { + ids = authRoleAdmins.stream().map(AuthRoleAdmin::getAdmin_id).collect(Collectors.toList()); + } + authAdminQueryRequest.setIds(ids); + } + List authAdminList = userService.listAdminPage(authAdminQueryRequest); + // 查询所有的权限 + List adminIds = authAdminList.stream().map(AuthAdmin::getId).collect(Collectors.toList()); + + + // 视图列表 + List authAdminResponseList = authAdminList.stream().map(item -> { + AuthAdminResponse authAdminResponse = new AuthAdminResponse(); + BeanUtils.copyProperties(item, authAdminResponse); +// List roles = authRoleAdminList.stream() +// .filter(authRoleAdmin -> authAdminResponse.getId().equals(authRoleAdmin.getAdmin_id())) +// .map(AuthRoleAdmin::getRole_id) +// .collect(Collectors.toList()); + List roles = sysRoleService.selectRoleListByUserId(authAdminResponse.getId()); + authAdminResponse.setRoles(roles); + return authAdminResponse; + }).collect(Collectors.toList()); + + PageInfo authAdminPageInfo = new PageInfo<>(authAdminList); + PageSimpleResponse authAdminPageSimpleResponse = new PageSimpleResponse<>(); + authAdminPageSimpleResponse.setTotal(authAdminPageInfo.getTotal()); + authAdminPageSimpleResponse.setList(authAdminResponseList); + + return ResultVOUtils.success(authAdminPageSimpleResponse); + } + + + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public BaseResponse getInfo(@PathVariable(value = "userId", required = false) Long userId) { + Map ajax = new HashMap<>(); + List roles = roleService.selectRoleAll(); + ajax.put("roles", isAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isAdmin())); + if (ObjectUtil.isNotNull(userId)) { + AuthAdmin sysUser = userService.findById(userId); + ajax.put("user", sysUser); + ajax.put("roleIds", StreamUtils.toList(sysUser.getRoles(), SysRole::getRoleId)); + } + return ResultVOUtils.success(ajax); + } + + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public BaseResponse authRole(@PathVariable Long userId) { + AuthAdmin user = userService.findById(userId); + List roles = roleService.selectRolesByUserId(userId); + Map ajax = new HashMap<>(); + ajax.put("user", user); + ajax.put("roles", isAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isAdmin())); + return ResultVOUtils.success(ajax); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @PutMapping("/authRole") + public BaseResponse inseinsertUserAuthrtAuthRole(Long userId, Long[] roleIds) { + userService.insertUserAuth(userId, CollUtil.toList(roleIds)); + return ResultVOUtils.success("授权成功!"); + } + + + @PostMapping("/save") + public BaseResponse save(@RequestBody @Valid AuthAdminSaveRequest authAdminSaveRequest, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); + } + AuthAdmin curUser = getUser(); +// if (!curUser.getCustomerId().equals("110")) { +// CustomerInfoEntity customerInfoEntity = customerInfoService.selectById(curUser.getCustomerId()); +// int max = customerInfoEntity.getUserMax(); +// int count = userService.findCountByCustomerId(authAdminSaveRequest.getCustomerId()); +// if (count >= max) { +// return ResultVOUtils.error(ResultEnum.DATA_REPEAT, "已超过最大用户数"); +// } +// } + + // 检查是否存在相同名称的管理员 + AuthAdmin byUserName = userService.findByUserName(authAdminSaveRequest.getUserName()); + if (byUserName != null) { + return ResultVOUtils.error(ResultEnum.DATA_REPEAT, "当前管理员已存在"); + } + + AuthAdmin authAdmin = new AuthAdmin(); + BeanUtils.copyProperties(authAdminSaveRequest, authAdmin); + + if (authAdmin.getPassWord() != null) { + authAdmin.setPassWord(PasswordUtils.authAdminPwd(authAdmin.getPassWord())); + } + authAdmin.setCustomerId(curUser.getCustomerId()); + authAdmin.setLastModifyTime(new Date()); + boolean b = userService.insertAuthAdmin(authAdmin); + authAdmin = userService.findByUserName(authAdmin.getUserName()); + if (!b) { + return ResultVOUtils.error(ResultEnum.NOT_NETWORK); + } + + // 插入角色 + if (authAdminSaveRequest.getRoles() != null) { + userService.insertUserAuth(authAdmin.getId(), authAdminSaveRequest.getRoles()); + } + + Map res = new HashMap<>(); + res.put("id", authAdmin.getId()); + return ResultVOUtils.success(res); + } + + + /** + * 修改用户 + */ + @PostMapping("/edit") + public BaseResponse edit(@RequestBody @Valid AuthAdminSaveRequest authAdminSaveRequest, + BindingResult bindingResult) { + + if (bindingResult.hasErrors()) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, bindingResult.getFieldError().getDefaultMessage()); + } + if (authAdminSaveRequest.getId() == null) { + return ResultVOUtils.error(ResultEnum.PARAM_VERIFY_FALL, "参数错误!"); + } + // 检查是否存在除了当前管理员的其它名称的管理员 + AuthAdmin byUserName = userService.findByUserName(authAdminSaveRequest.getUserName()); + if (byUserName != null && !authAdminSaveRequest.getId().equals(byUserName.getId())) { + return ResultVOUtils.error(ResultEnum.DATA_REPEAT, "当前管理员已存在"); + } + + AuthAdmin authAdmin = new AuthAdmin(); + BeanUtils.copyProperties(authAdminSaveRequest, authAdmin); + if (authAdmin.getPassWord() != null) { + authAdmin.setPassWord(PasswordUtils.authAdminPwd(authAdmin.getPassWord())); + } + authAdmin.setLastModifyTime(new Date()); + boolean b = userService.updateAuthAdmin(authAdmin); + + if (!b) { + return ResultVOUtils.error(ResultEnum.NOT_NETWORK); + } + // 修改角色 + if (authAdminSaveRequest.getRoles() != null && authAdminSaveRequest.getRoles().size() > 0) { + userService.insertUserAuth(authAdmin.getId(), authAdminSaveRequest.getRoles()); + } + + return ResultVOUtils.success(); + } + + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/AuthAdminDao.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/AuthAdminDao.java index f92fd6aa..ac620bf0 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/AuthAdminDao.java +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/AuthAdminDao.java @@ -73,4 +73,9 @@ public interface AuthAdminDao { */ List selectHospitalUser(); + List selectAllocatedList(AuthAdminQueryRequest authAdminQueryRequest); + + List selectUnallocatedList(AuthAdminQueryRequest authAdminQueryRequest); + + } diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictDataMapper.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictDataMapper.java new file mode 100644 index 00000000..b1439d6e --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictDataMapper.java @@ -0,0 +1,31 @@ +package com.glxp.api.admin.dao.auth; + +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.req.auth.SysDictDataRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 字典表 数据层 + */ +@Mapper +public interface SysDictDataMapper { + + List selectDictDataList(SysDictDataRequest sysDictDataRequest); + + SysDictData selectById(@Param("dictCode") Long dictCode); + + int deleteById(Long dictCode); + + int insert(SysDictData sysDictData); + + int updateById(SysDictData sysDictData); + + int updateByType(SysDictData sysDictData); + + SysDictData exists(SysDictDataRequest sysDictDataRequest); + + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictTypeMapper.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictTypeMapper.java new file mode 100644 index 00000000..6837ea4a --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysDictTypeMapper.java @@ -0,0 +1,29 @@ +package com.glxp.api.admin.dao.auth; + + +import com.glxp.api.admin.entity.auth.SysDictType; +import com.glxp.api.admin.req.auth.SysDictTypeRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 字典表 数据层 + */ + +@Mapper +public interface SysDictTypeMapper { + + List selectDictTypeList(SysDictTypeRequest sysDictTypeRequest); + + SysDictType selectById(Long dictId); + + int deleteBatchIds(@Param("dictIds") List dictIds); + + int insert(SysDictType sysDictType); + + int updateById(SysDictType sysDictType); + + SysDictType exists(SysDictTypeRequest sysDictTypeRequest); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysMenuDao.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysMenuDao.java new file mode 100644 index 00000000..36b93c35 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysMenuDao.java @@ -0,0 +1,80 @@ +package com.glxp.api.admin.dao.auth; + +import com.glxp.api.admin.entity.auth.SysMenu; +import com.glxp.api.admin.req.auth.SysMenuRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysMenuDao { + + + SysMenu selectById(Long id); + + + int insert(SysMenu menu); + + int updateById(SysMenu menu); + + int deleteById(Long id); + + + List selectMenuList(SysMenuRequest sysMenuRequest); + + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @return 菜单列表 + */ + List selectMenuListByUserId(SysMenuRequest sysMenuRequest); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + List selectMenuTreeAll(); + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMapper.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMapper.java new file mode 100644 index 00000000..ae67874b --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMapper.java @@ -0,0 +1,57 @@ +package com.glxp.api.admin.dao.auth; + +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.req.auth.SysRoleRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysRoleMapper { + + + int insert(SysRole sysRole); + + int updateById(SysRole sysRole); + + int delete(Long id); + + SysRole selectById(Long id); + + int deleteBatchIds(@Param("ids") List ids); + + + /** + * 根据条件分页查询角色数据 + * + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleRequest sysRoleRequest); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolePermissionByUserId(Long userId); + + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + List selectRolesByUserName(String userName); + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMenuMapper.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMenuMapper.java new file mode 100644 index 00000000..7f73d8e7 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysRoleMenuMapper.java @@ -0,0 +1,24 @@ +package com.glxp.api.admin.dao.auth; + +import com.glxp.api.admin.entity.auth.SysRoleMenu; +import com.glxp.api.admin.req.auth.SysRoleMenuRequest; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SysRoleMenuMapper { + + + List selectRoleMenuList(SysRoleMenuRequest sysRoleMenu); + + + int deleteById(Long id); + + + int deleteByList(@Param("ids") List ids); + + int insertBatch(List list); + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysUserRoleMapper.java b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysUserRoleMapper.java new file mode 100644 index 00000000..35bba139 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/dao/auth/SysUserRoleMapper.java @@ -0,0 +1,18 @@ +package com.glxp.api.admin.dao.auth; + + +import com.glxp.api.admin.entity.auth.SysUserRole; +import com.glxp.api.admin.req.auth.SysUserRoleRequest; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface SysUserRoleMapper { + + List selectUserIdsByRoleId(Long roleId); + + int delete(SysUserRoleRequest sysUserRoleRequest); + + int insertBatch(@Param("sysUserRoles") List sysUserRoles); + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/BaseEntity.java b/api-admin/src/main/java/com/glxp/api/admin/entity/BaseEntity.java new file mode 100644 index 00000000..5e28a14d --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/BaseEntity.java @@ -0,0 +1,46 @@ +package com.glxp.api.admin.entity; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + + +@Data +public class BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 搜索值 + */ + private String searchValue; + + /** + * 创建者 + */ + private String createBy; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新者 + */ + private String updateBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/AuthAdmin.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/AuthAdmin.java index 326f42f6..e3eab306 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/AuthAdmin.java +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/AuthAdmin.java @@ -1,8 +1,10 @@ package com.glxp.api.admin.entity.auth; +import com.glxp.api.admin.constant.Constant; import lombok.Data; import java.util.Date; +import java.util.List; @Data public class AuthAdmin { @@ -32,4 +34,13 @@ public class AuthAdmin { private String dept; private String deptName; + + + private List roles; + private Long[] roleIds; + + + public boolean isAdmin() { + return Constant.ADMIN_ID.equals(this.id + ""); + } } diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/LoginUser.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/LoginUser.java new file mode 100644 index 00000000..11c9890f --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/LoginUser.java @@ -0,0 +1,98 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; +import java.util.Set; + + +@Data +@NoArgsConstructor +public class LoginUser implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private String deptId; + + /** + * 部门名 + */ + private String deptName; + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 用户类型 + */ + private String userType; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 菜单权限 + */ + private Set menuPermission; + + /** + * 角色权限 + */ + private Set rolePermission; + + /** + * 用户名 + */ + private String username; + + /** + * 角色对象 + */ + private List roles; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/MetaEntity.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/MetaEntity.java new file mode 100644 index 00000000..35d0e5e7 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/MetaEntity.java @@ -0,0 +1,60 @@ +package com.glxp.api.admin.entity.auth; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpUtil; +import lombok.Data; + +/** + * 路由显示信息 + */ + +@Data +public class MetaEntity { + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public MetaEntity(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaEntity(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public MetaEntity(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public MetaEntity(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StrUtil.isNotEmpty(link) && HttpUtil.isHttp(link)) { + this.link = link; + } + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RoleEntity.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RoleEntity.java new file mode 100644 index 00000000..5cfa4856 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RoleEntity.java @@ -0,0 +1,36 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 角色 + */ + +@Data +@NoArgsConstructor +public class RoleEntity implements Serializable { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RouterEntity.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RouterEntity.java new file mode 100644 index 00000000..cdb9a5a9 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/RouterEntity.java @@ -0,0 +1,58 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; + +import java.util.List; + +/** + * 路由配置信息 + */ +@Data +public class RouterEntity { + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaEntity meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictData.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictData.java new file mode 100644 index 00000000..bb40d3aa --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictData.java @@ -0,0 +1,77 @@ +package com.glxp.api.admin.entity.auth; + +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.entity.BaseEntity; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 字典数据表 sys_dict_data + */ + +@Data +public class SysDictData extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return Constant.YES.equals(this.isDefault); + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictType.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictType.java new file mode 100644 index 00000000..652cb3d9 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysDictType.java @@ -0,0 +1,44 @@ +package com.glxp.api.admin.entity.auth; + +import com.glxp.api.admin.entity.BaseEntity; +import lombok.Data; + +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 字典类型表 sys_dict_type + */ + +@Data +public class SysDictType extends BaseEntity { + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + private String dictName; + + /** + * 字典类型 + */ + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysMenu.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysMenu.java new file mode 100644 index 00000000..af77d220 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysMenu.java @@ -0,0 +1,82 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; + + +@Data +public class SysMenu extends TreeEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + + private Long neMenuId; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRole.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRole.java new file mode 100644 index 00000000..068082ab --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRole.java @@ -0,0 +1,106 @@ +package com.glxp.api.admin.entity.auth; + +import com.glxp.api.admin.entity.BaseEntity; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; +import java.util.Set; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +public class SysRole extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") + private String roleName; + + /** + * 角色权限 + */ + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + private String roleKey; + + /** + * 角色排序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + private String delFlag; + + /** + * 备注 + */ + private String remark; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + /** + * 角色菜单权限 + */ + private Set permissions; + + + public SysRole() { + } + + public SysRole(Long roleId) { + this.roleId = roleId; + } + + public boolean isAdmin() { + return "1".equals(this.roleId); + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRoleMenu.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRoleMenu.java new file mode 100644 index 00000000..10643bee --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysRoleMenu.java @@ -0,0 +1,18 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; + +@Data +public class SysRoleMenu { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysUserRole.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysUserRole.java new file mode 100644 index 00000000..9f081135 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/SysUserRole.java @@ -0,0 +1,17 @@ +package com.glxp.api.admin.entity.auth; + +import lombok.Data; + +/** + * 用户和角色关联 sys_user_role + * + * @author Lion Li + */ + +@Data +public class SysUserRole { + + private Long userId; + private Long roleId; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/entity/auth/TreeEntity.java b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/TreeEntity.java new file mode 100644 index 00000000..c48e72c2 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/entity/auth/TreeEntity.java @@ -0,0 +1,32 @@ +package com.glxp.api.admin.entity.auth; + +import com.glxp.api.admin.entity.BaseEntity; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree基类 + */ + +@Data +public class TreeEntity extends BaseEntity { + + + /** + * 父菜单名称 + */ + private String parentName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 子部门 + */ + private List children = new ArrayList<>(); + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/exception/ServiceException.java b/api-admin/src/main/java/com/glxp/api/admin/exception/ServiceException.java new file mode 100644 index 00000000..98022d81 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/exception/ServiceException.java @@ -0,0 +1,62 @@ +package com.glxp.api.admin.exception; + +/** + * 业务异常 + */ +public final class ServiceException extends RuntimeException { + private static final long serialVersionUID = 1L; + + /** + * 错误码 + */ + private Integer code; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + *

+ */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(String message) { + this.message = message; + } + + public ServiceException(String message, Integer code) { + this.message = message; + this.code = code; + } + + public String getDetailMessage() { + return detailMessage; + } + + @Override + public String getMessage() { + return message; + } + + public Integer getCode() { + return code; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } + + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictDataRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictDataRequest.java new file mode 100644 index 00000000..63733f60 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictDataRequest.java @@ -0,0 +1,14 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysDictDataRequest extends ListPageRequest { + + private String dictType; + private String status; + private String dictLabel; + private String dictValue; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictTypeRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictTypeRequest.java new file mode 100644 index 00000000..54158aca --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysDictTypeRequest.java @@ -0,0 +1,16 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysDictTypeRequest extends ListPageRequest { + + private Long dictId; + + private String dictName; + + private String dictType; + + private String status; +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysMenuRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysMenuRequest.java new file mode 100644 index 00000000..794f471b --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysMenuRequest.java @@ -0,0 +1,91 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysMenuRequest extends ListPageRequest { + + + private String parentName; + + /** + * 父菜单ID + */ + private Long parentId; + + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + + private String neMenuId; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleMenuRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleMenuRequest.java new file mode 100644 index 00000000..16342e65 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleMenuRequest.java @@ -0,0 +1,19 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysRoleMenuRequest extends ListPageRequest { + + + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleRequest.java new file mode 100644 index 00000000..ca8a1727 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysRoleRequest.java @@ -0,0 +1,18 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysRoleRequest extends ListPageRequest { + + private Long roleId; + private String roleName; + private String roleKey; + + + private String neRoleName; + private String neRoleKey; + private Long neRoleId; + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysUserRoleRequest.java b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysUserRoleRequest.java new file mode 100644 index 00000000..716cb515 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/req/auth/SysUserRoleRequest.java @@ -0,0 +1,12 @@ +package com.glxp.api.admin.req.auth; + +import com.glxp.api.admin.req.ListPageRequest; +import lombok.Data; + +@Data +public class SysUserRoleRequest extends ListPageRequest { + + + private Long userId; + private Long roleId; +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/res/auth/LoginUserInfoResponse.java b/api-admin/src/main/java/com/glxp/api/admin/res/auth/LoginUserInfoResponse.java index f6db2d61..e374cbc1 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/res/auth/LoginUserInfoResponse.java +++ b/api-admin/src/main/java/com/glxp/api/admin/res/auth/LoginUserInfoResponse.java @@ -3,6 +3,7 @@ package com.glxp.api.admin.res.auth; import lombok.Data; import java.util.List; +import java.util.Set; /** * 登录用户的信息视图 @@ -21,4 +22,11 @@ public class LoginUserInfoResponse { private String locInvName; private String locSubInvName; + + Set roles; //用户角色 + Set permissions; //用户权限 + + + private String CustomerId; + private String companyName; } diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/AuthAdminService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/AuthAdminService.java index 1eca8494..7b6244f2 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/service/auth/AuthAdminService.java +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/AuthAdminService.java @@ -30,4 +30,13 @@ public interface AuthAdminService { * @return */ List getHospitalUserList(); + + + List selectAllocatedList(AuthAdminQueryRequest authAdminQueryRequest); + + + List selectUnallocatedList(AuthAdminQueryRequest authAdminQueryRequest); + + + void insertUserAuth(Long userId, List roleIds); } diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictDataService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictDataService.java new file mode 100644 index 00000000..1a918e67 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictDataService.java @@ -0,0 +1,62 @@ +package com.glxp.api.admin.service.auth; + + +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.req.auth.SysDictDataRequest; + +import java.util.List; + +/** + * 字典 业务层 + */ +public interface ISysDictDataService { + + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + List selectDictDataList(SysDictDataRequest sysDictDataRequest); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + SysDictData selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + List insertDictData(SysDictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + List updateDictData(SysDictData dictData); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictTypeService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictTypeService.java new file mode 100644 index 00000000..a9cc2afc --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysDictTypeService.java @@ -0,0 +1,97 @@ +package com.glxp.api.admin.service.auth; + + +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.entity.auth.SysDictType; +import com.glxp.api.admin.req.auth.SysDictTypeRequest; + +import java.util.List; + +/** + * 字典 业务层 + */ +public interface ISysDictTypeService { + + + List selectDictTypeList(SysDictTypeRequest sysDictTypeRequest); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + SysDictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + SysDictType selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + List insertDictType(SysDictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + List updateDictType(SysDictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + String checkDictTypeUnique(SysDictType dictType); + + + String getDictLabel(String dictType, String dictValue, String separator); + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + String getDictValue(String dictType, String dictLabel, String separator); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysMenuService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysMenuService.java new file mode 100644 index 00000000..0b2e50ab --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysMenuService.java @@ -0,0 +1,132 @@ +package com.glxp.api.admin.service.auth; + +import cn.hutool.core.lang.tree.Tree; +import com.glxp.api.admin.entity.auth.RouterEntity; +import com.glxp.api.admin.entity.auth.SysMenu; + +import java.util.List; +import java.util.Set; + +public interface ISysMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysMenu menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysMenu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + int insertMenu(SysMenu menu); + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + int updateMenu(SysMenu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + String checkMenuNameUnique(SysMenu menu); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysRoleService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysRoleService.java new file mode 100644 index 00000000..1bf598a9 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/ISysRoleService.java @@ -0,0 +1,176 @@ +package com.glxp.api.admin.service.auth; + + +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.entity.auth.SysUserRole; +import com.glxp.api.admin.req.auth.SysRoleRequest; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + */ +public interface ISysRoleService { + + + List selectPageRoleList(SysRoleRequest sysRoleRequest); + + /** + * 根据条件分页查询角色数据 + * + * @return 角色数据集合信息 + */ + List selectRoleList(SysRoleRequest sysRoleRequest); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + SysRole selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + String checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + String checkRoleKeyUnique(SysRole role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(SysRole role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + int insertRole(SysRole role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + int updateRole(SysRole role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + int updateRoleStatus(SysRole role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + int authDataScope(SysRole role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(SysUserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/SysPermissionService.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/SysPermissionService.java new file mode 100644 index 00000000..b0f130d7 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/SysPermissionService.java @@ -0,0 +1,62 @@ +package com.glxp.api.admin.service.auth; + +import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.entity.auth.SysRole; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@RequiredArgsConstructor +@Service +public class SysPermissionService { + + private final ISysRoleService roleService; + private final ISysMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(AuthAdmin user) { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + roles.add("admin"); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(user.getId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(AuthAdmin user) { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + perms.add("*:*:*"); + } else { + List roles = user.getRoles(); + if (!roles.isEmpty() && roles.size() > 1) { + // 多角色设置permissions属性,以便数据权限匹配权限 + for (SysRole role : roles) { + Set rolePerms = menuService.selectMenuPermsByRoleId(role.getRoleId()); + role.setPermissions(rolePerms); + perms.addAll(rolePerms); + } + } else { + perms.addAll(menuService.selectMenuPermsByUserId(user.getId())); + } + } + return perms; + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/AuthAdminServiceImpl.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/AuthAdminServiceImpl.java index 464d2d57..8d705935 100644 --- a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/AuthAdminServiceImpl.java +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/AuthAdminServiceImpl.java @@ -1,15 +1,20 @@ package com.glxp.api.admin.service.auth.impl; +import cn.hutool.core.util.ArrayUtil; import com.github.pagehelper.PageHelper; import com.glxp.api.admin.dao.auth.AuthAdminDao; +import com.glxp.api.admin.dao.auth.SysUserRoleMapper; import com.glxp.api.admin.entity.auth.AuthAdmin; +import com.glxp.api.admin.entity.auth.SysUserRole; import com.glxp.api.admin.exception.JsonException; import com.glxp.api.admin.req.auth.AuthAdminQueryRequest; +import com.glxp.api.admin.req.auth.SysUserRoleRequest; import com.glxp.api.admin.service.auth.AuthAdminService; import com.glxp.api.common.enums.ResultEnum; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; @@ -19,6 +24,8 @@ public class AuthAdminServiceImpl implements AuthAdminService { @Resource private AuthAdminDao authAdminDao; + @Resource + SysUserRoleMapper sysUserRoleMapper; @Override public List listAdminPage(AuthAdminQueryRequest authAdminQueryRequest) { @@ -120,4 +127,39 @@ public class AuthAdminServiceImpl implements AuthAdminService { return authAdminDao.selectHospitalUser(); } + + @Override + public List selectAllocatedList(AuthAdminQueryRequest authAdminQueryRequest) { + return authAdminDao.selectAllocatedList(authAdminQueryRequest); + } + + @Override + public List selectUnallocatedList(AuthAdminQueryRequest authAdminQueryRequest) { + return authAdminDao.selectUnallocatedList(authAdminQueryRequest); + } + + @Override + public void insertUserAuth(Long userId, List roleIds) { + + SysUserRoleRequest sysUserRoleRequest = new SysUserRoleRequest(); + sysUserRoleRequest.setUserId(userId); + sysUserRoleMapper.delete(sysUserRoleRequest); + insertUserRole(userId, roleIds); + } + + + public void insertUserRole(Long userId, List roleIds) { + if (ArrayUtil.isNotEmpty(roleIds)) { + // 新增用户与角色管理 + List list = new ArrayList<>(roleIds.size()); + for (Long roleId : roleIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + sysUserRoleMapper.insertBatch(list); + } + } + } diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictDataServiceImpl.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictDataServiceImpl.java new file mode 100644 index 00000000..7ce75989 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictDataServiceImpl.java @@ -0,0 +1,84 @@ +package com.glxp.api.admin.service.auth.impl; + +import cn.hutool.core.collection.CollUtil; +import com.github.pagehelper.PageHelper; +import com.glxp.api.admin.dao.auth.SysDictDataMapper; +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.exception.ServiceException; +import com.glxp.api.admin.req.auth.SysDictDataRequest; +import com.glxp.api.admin.service.auth.ISysDictDataService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 字典 业务层处理 + */ +@Service +public class SysDictDataServiceImpl implements ISysDictDataService { + @Resource + SysDictDataMapper baseMapper; + + + @Override + public List selectDictDataList(SysDictDataRequest sysDictDataRequest) { + + if (sysDictDataRequest.getPage() != null) { + int offset = (sysDictDataRequest.getPage() - 1) * sysDictDataRequest.getLimit(); + PageHelper.offsetPage(offset, sysDictDataRequest.getLimit()); + } + + return baseMapper.selectDictDataList(sysDictDataRequest); + + } + + @Override + public String selectDictLabel(String dictType, String dictValue) { + + SysDictDataRequest sysDictDataRequest = new SysDictDataRequest(); + sysDictDataRequest.setDictType(dictType); + sysDictDataRequest.setDictValue(dictValue); + List dictData = baseMapper.selectDictDataList(sysDictDataRequest); + if (CollUtil.isNotEmpty(dictData)) + return dictData.get(0).getDictLabel(); + else + return null; + } + + @Override + public SysDictData selectDictDataById(Long dictCode) { + return baseMapper.selectById(dictCode); + } + + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + SysDictData data = selectDictDataById(dictCode); + baseMapper.deleteById(dictCode); + } + } + + @Override + public List insertDictData(SysDictData data) { + int row = baseMapper.insert(data); + if (row > 0) { + SysDictDataRequest sysDictDataRequest = new SysDictDataRequest(); + sysDictDataRequest.setDictType(data.getDictType()); + return baseMapper.selectDictDataList(sysDictDataRequest); + } + throw new ServiceException("操作失败"); + } + + @Override + public List updateDictData(SysDictData data) { + int row = baseMapper.updateById(data); + if (row > 0) { + SysDictDataRequest sysDictDataRequest = new SysDictDataRequest(); + sysDictDataRequest.setDictType(data.getDictType()); + return baseMapper.selectDictDataList(sysDictDataRequest); + } + throw new ServiceException("操作失败"); + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictTypeServiceImpl.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictTypeServiceImpl.java new file mode 100644 index 00000000..e45f9392 --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysDictTypeServiceImpl.java @@ -0,0 +1,239 @@ +package com.glxp.api.admin.service.auth.impl; + +import cn.hutool.core.collection.CollUtil; +import com.github.pagehelper.PageHelper; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.dao.auth.SysDictDataMapper; +import com.glxp.api.admin.dao.auth.SysDictTypeMapper; +import com.glxp.api.admin.entity.auth.SysDictData; +import com.glxp.api.admin.entity.auth.SysDictType; +import com.glxp.api.admin.exception.ServiceException; +import com.glxp.api.admin.req.auth.SysDictDataRequest; +import com.glxp.api.admin.req.auth.SysDictTypeRequest; +import com.glxp.api.admin.service.auth.ISysDictTypeService; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 字典 业务层处理 + */ +@RequiredArgsConstructor +@Service +public class SysDictTypeServiceImpl implements ISysDictTypeService { + + private final SysDictTypeMapper baseMapper; + private final SysDictDataMapper dictDataMapper; + + @Override + public List selectDictTypeList(SysDictTypeRequest sysDictTypeRequest) { + if (sysDictTypeRequest.getPage() != null) { + int offset = (sysDictTypeRequest.getPage() - 1) * sysDictTypeRequest.getLimit(); + PageHelper.offsetPage(offset, sysDictTypeRequest.getLimit()); + } + return baseMapper.selectDictTypeList(sysDictTypeRequest); + } + + @Override + public List selectDictTypeAll() { + return baseMapper.selectDictTypeList(new SysDictTypeRequest()); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataByType(String dictType) { + SysDictDataRequest sysDictTypeRequest = new SysDictDataRequest(); + sysDictTypeRequest.setDictType(dictType); + List dictDatas = dictDataMapper.selectDictDataList(sysDictTypeRequest); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeById(Long dictId) { + return baseMapper.selectById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public SysDictType selectDictTypeByType(String dictType) { + SysDictTypeRequest sysDictTypeRequest = new SysDictTypeRequest(); + sysDictTypeRequest.setDictType(dictType); + List sysDictTypes = baseMapper.selectDictTypeList(sysDictTypeRequest); + if (CollUtil.isNotEmpty(sysDictTypes)) { + return sysDictTypes.get(0); + } else + return null; + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + SysDictType dictType = selectDictTypeById(dictId); + + SysDictDataRequest sysDictDataRequest = new SysDictDataRequest(); + sysDictDataRequest.setDictType(dictType.getDictType()); + SysDictData sysDictData = dictDataMapper.exists(sysDictDataRequest); + + if (sysDictData != null) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + } + baseMapper.deleteBatchIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + } + + /** + * 新增保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + public List insertDictType(SysDictType dict) { + int row = baseMapper.insert(dict); + if (row > 0) { + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param dict 字典类型信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(SysDictType dict) { + SysDictType oldDict = baseMapper.selectById(dict.getDictId()); +// dictDataMapper.updateByType(null, new LambdaUpdateWrapper() +// .set(SysDictData::getDictType, dict.getDictType()) +// .eq(SysDictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + SysDictDataRequest sysDictDataRequest = new SysDictDataRequest(); + sysDictDataRequest.setDictType(dict.getDictType()); + return dictDataMapper.selectDictDataList(sysDictDataRequest); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public String checkDictTypeUnique(SysDictType dict) { + + SysDictTypeRequest sysDictTypeRequest = new SysDictTypeRequest(); + sysDictTypeRequest.setDictType(dict.getDictType()); + SysDictType exist = baseMapper.exists(sysDictTypeRequest); + if (exist == null) { + return Constant.NOT_UNIQUE; + } + return Constant.UNIQUE; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + @Override + public String getDictLabel(String dictType, String dictValue, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = selectDictDataByType(dictType); + + if (StringUtils.containsAny(dictValue, separator) && CollUtil.isNotEmpty(datas)) { + for (SysDictData dict : datas) { + for (String value : dictValue.split(separator)) { + if (value.equals(dict.getDictValue())) { + propertyString.append(dict.getDictLabel() + separator); + break; + } + } + } + } else { + for (SysDictData dict : datas) { + if (dictValue.equals(dict.getDictValue())) { + return dict.getDictLabel(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + @Override + public String getDictValue(String dictType, String dictLabel, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = selectDictDataByType(dictType); + + if (StringUtils.containsAny(dictLabel, separator) && CollUtil.isNotEmpty(datas)) { + for (SysDictData dict : datas) { + for (String label : dictLabel.split(separator)) { + if (label.equals(dict.getDictLabel())) { + propertyString.append(dict.getDictValue() + separator); + break; + } + } + } + } else { + for (SysDictData dict : datas) { + if (dictLabel.equals(dict.getDictLabel())) { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysMenuServiceImpl.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysMenuServiceImpl.java new file mode 100644 index 00000000..c21ea75b --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysMenuServiceImpl.java @@ -0,0 +1,460 @@ +package com.glxp.api.admin.service.auth.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.http.HttpUtil; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.dao.auth.SysMenuDao; +import com.glxp.api.admin.dao.auth.SysRoleMapper; +import com.glxp.api.admin.dao.auth.SysRoleMenuMapper; +import com.glxp.api.admin.entity.auth.*; +import com.glxp.api.admin.req.auth.SysMenuRequest; +import com.glxp.api.admin.req.auth.SysRoleMenuRequest; +import com.glxp.api.admin.service.auth.ISysMenuService; +import com.glxp.api.admin.util.TreeBuildUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 菜单 业务层处理 + */ +@Service +public class SysMenuServiceImpl implements ISysMenuService { + + + @Resource + SysMenuDao sysMenuDao; + @Resource + SysRoleMapper sysRoleMapper; + @Resource + SysRoleMenuMapper sysRoleMenuMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + return selectMenuList(new SysMenu(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysMenu menu, Long userId) { + List menuList = null; + // 管理员显示所有菜单信息 + SysMenuRequest sysMenuRequest = new SysMenuRequest(); + BeanUtils.copyProperties(menu, sysMenuRequest); + if (Constant.ADMIN_ID.equals(userId + "")) { + menuList = sysMenuDao.selectMenuList(sysMenuRequest); + } else { + menuList = sysMenuDao.selectMenuListByUserId(sysMenuRequest); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = sysMenuDao.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = sysMenuDao.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + List menus = null; + if (Constant.ADMIN_ID.equals(userId + "")) { + menus = sysMenuDao.selectMenuTreeAll(); + } else { + menus = sysMenuDao.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + SysRole role = sysRoleMapper.selectById(roleId); + return sysMenuDao.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList(); + for (SysMenu menu : menus) { + RouterEntity router = new RouterEntity(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setQuery(menu.getQueryParam()); + router.setMeta(new MetaEntity(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (!cMenus.isEmpty() && Constant.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (isMenuFrame(menu)) { + router.setMeta(null); + List childrenList = new ArrayList(); + RouterEntity children = new RouterEntity(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaEntity(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + children.setQuery(menu.getQueryParam()); + childrenList.add(children); + router.setChildren(childrenList); + } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { + router.setMeta(new MetaEntity(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList(); + RouterEntity children = new RouterEntity(); + String routerPath = innerLinkReplaceEach(menu.getPath()); + children.setPath(routerPath); + children.setComponent(Constant.INNER_LINK); + children.setName(StringUtils.capitalize(routerPath)); + children.setMeta(new MetaEntity(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysMenu selectMenuById(Long menuId) { + return sysMenuDao.selectById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + + + SysMenuRequest sysMenuRequest = new SysMenuRequest(); + sysMenuRequest.setParentId(menuId); + List menuList = sysMenuDao.selectMenuList(sysMenuRequest); + + + if (CollUtil.isEmpty(menuList)) { + return false; + } else + return true; + + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + + + SysRoleMenuRequest sysRoleRequest = new SysRoleMenuRequest(); + sysRoleRequest.setMenuId(menuId); + List sysRoleMenus = sysRoleMenuMapper.selectRoleMenuList(sysRoleRequest); + if (CollUtil.isEmpty(sysRoleMenus)) { + return false; + } + return true; + + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysMenu menu) { + return sysMenuDao.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysMenu menu) { + return sysMenuDao.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return sysMenuDao.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public String checkMenuNameUnique(SysMenu menu) { + + + SysMenuRequest sysMenuRequest = new SysMenuRequest(); + sysMenuRequest.setParentId(menu.getParentId()); + sysMenuRequest.setMenuName(menu.getMenuName()); + List menuList = sysMenuDao.selectMenuList(sysMenuRequest); + if (CollUtil.isEmpty(menuList)) { + return Constant.UNIQUE; + } else + return Constant.NOT_UNIQUE; + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(SysMenu menu) { + String routerName = StringUtils.capitalize(menu.getPath()); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame(menu)) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(SysMenu menu) { + String routerPath = menu.getPath(); + // 内链打开外网方式 + if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && Constant.TYPE_DIR.equals(menu.getMenuType()) + && Constant.NO_FRAME.equals(menu.getIsFrame())) { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame(menu)) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(SysMenu menu) { + String component = Constant.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { + component = menu.getComponent(); + } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) { + component = Constant.INNER_LINK; + } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { + component = Constant.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMenuFrame(SysMenu menu) { + return menu.getParentId().intValue() == 0 && Constant.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(Constant.NO_FRAME); + } + + /** + * 是否为内链组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isInnerLink(SysMenu menu) { + return menu.getIsFrame().equals(Constant.NO_FRAME) && HttpUtil.isHttp(menu.getPath()); + } + + /** + * 是否为parent_view组件 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isParentView(SysMenu menu) { + return menu.getParentId().intValue() != 0 && Constant.TYPE_DIR.equals(menu.getMenuType()); + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + public List getChildPerms(List list, int parentId) { + List returnList = new ArrayList(); + for (SysMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list + * @param t + */ + private void recursionFn(List list, SysMenu t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (SysMenu tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, SysMenu t) { + List tlist = new ArrayList(); + for (SysMenu n : list) { + if (n.getParentId().longValue() == t.getMenuId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, SysMenu t) { + return getChildList(list, t).size() > 0; + } + + /** + * 内链域名特殊字符替换 + * + * @return + */ + public String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constant.HTTP, Constant.HTTPS, Constant.WWW, "."}, + new String[]{"", ""}); + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysRoleServiceImpl.java b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysRoleServiceImpl.java new file mode 100644 index 00000000..f7d9404f --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/service/auth/impl/SysRoleServiceImpl.java @@ -0,0 +1,409 @@ +package com.glxp.api.admin.service.auth.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.github.pagehelper.PageHelper; +import com.glxp.api.admin.constant.Constant; +import com.glxp.api.admin.dao.auth.SysRoleMapper; +import com.glxp.api.admin.dao.auth.SysRoleMenuMapper; +import com.glxp.api.admin.dao.auth.SysUserRoleMapper; +import com.glxp.api.admin.entity.auth.SysRole; +import com.glxp.api.admin.entity.auth.SysRoleMenu; +import com.glxp.api.admin.entity.auth.SysUserRole; +import com.glxp.api.admin.exception.ServiceException; +import com.glxp.api.admin.req.auth.SysRoleRequest; +import com.glxp.api.admin.req.auth.SysUserRoleRequest; +import com.glxp.api.admin.service.auth.ISysRoleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 角色 业务层处理 + */ +@RequiredArgsConstructor +@Service +public class SysRoleServiceImpl implements ISysRoleService { + + + @Resource + SysRoleMapper sysRoleMapper; + @Resource + SysRoleMenuMapper roleMenuMapper; + @Resource + SysUserRoleMapper sysUserRoleMapper; + + @Override + public List selectPageRoleList(SysRoleRequest sysRoleRequest) { + + if (sysRoleRequest.getPage() != null) { + int offset = (sysRoleRequest.getPage() - 1) * sysRoleRequest.getLimit(); + PageHelper.offsetPage(offset, sysRoleRequest.getLimit()); + } + return sysRoleMapper.selectRoleList(sysRoleRequest); + } + + /** + * 根据条件分页查询角色数据 + */ + @Override + public List selectRoleList(SysRoleRequest sysRoleRequest) { + return sysRoleMapper.selectRoleList(sysRoleRequest); + } + + + /** + * 根据用户ID查询角色 + */ + @Override + public List selectRolesByUserId(Long userId) { + List userRoles = sysRoleMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRole role : roles) { + for (SysRole userRole : userRoles) { + if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { + role.setFlag(true); + break; + } + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + List perms = sysRoleMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (SysRole perm : perms) { + if (ObjectUtil.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() { + return this.selectRoleList(new SysRoleRequest()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + return sysRoleMapper.selectRoleListByUserId(userId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public SysRole selectRoleById(Long roleId) { + return sysRoleMapper.selectById(roleId); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleNameUnique(SysRole role) { + + SysRoleRequest sysRoleRequest = new SysRoleRequest(); + sysRoleRequest.setRoleName(role.getRoleName()); + sysRoleRequest.setNeRoleId(role.getRoleId()); + List sysRoles = sysRoleMapper.selectRoleList(sysRoleRequest); + if (CollUtil.isNotEmpty(sysRoles)) { + return Constant.NOT_UNIQUE; + } else { + return Constant.UNIQUE; + } + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleKeyUnique(SysRole role) { + + + SysRoleRequest sysRoleRequest = new SysRoleRequest(); + sysRoleRequest.setRoleKey(role.getRoleKey()); + sysRoleRequest.setNeRoleId(role.getRoleId()); + List sysRoles = sysRoleMapper.selectRoleList(sysRoleRequest); + if (CollUtil.isNotEmpty(sysRoles)) { + return Constant.NOT_UNIQUE; + } else { + return Constant.UNIQUE; + } + + + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(SysRole role) { + if (ObjectUtil.isNotNull(role.getRoleId()) && role.isAdmin()) { + throw new ServiceException("不允许操作超级管理员角色"); + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (roleId != 1) { + SysRoleRequest roleRequest = new SysRoleRequest(); + roleRequest.setRoleId(roleId); + List roles = this.selectRoleList(roleRequest); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public long countUserRoleByRoleId(Long roleId) { + List ids = sysUserRoleMapper.selectUserIdsByRoleId(roleId); + return ids.size(); + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertRole(SysRole role) { + // 新增角色信息 + sysRoleMapper.insert(role); + return insertRoleMenu(role); + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateRole(SysRole role) { + // 修改角色信息 + sysRoleMapper.updateById(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteById(role.getRoleId()); + return insertRoleMenu(role); + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public int updateRoleStatus(SysRole role) { + return sysRoleMapper.updateById(role); + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int authDataScope(SysRole role) { + // 修改角色信息 + sysRoleMapper.updateById(role); + // 删除角色与部门关联 +// roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); +// // 新增角色和部门信息(数据权限) +// return insertRoleDept(role); + return 0; + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(SysRole role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + SysRoleMenu rm = new SysRoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + roleMenuMapper.insertBatch(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ +// public int insertRoleDept(SysRole role) { +// int rows = 1; +// // 新增角色与部门(数据权限)管理 +// List list = new ArrayList(); +// for (Long deptId : role.getDeptIds()) { +// SysRoleDept rd = new SysRoleDept(); +// rd.setRoleId(role.getRoleId()); +// rd.setDeptId(deptId); +// list.add(rd); +// } +// if (list.size() > 0) { +// rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; +// } +// return rows; +// } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.deleteById(roleId); + // 删除角色与部门关联 + return sysRoleMapper.delete(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + checkRoleAllowed(new SysRole(roleId)); + checkRoleDataScope(roleId); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + List ids = Arrays.asList(roleIds); + // 删除角色与菜单关联 + roleMenuMapper.deleteByList(ids); + // 删除角色与部门关联 +// roleDeptMapper.delete(new LambdaQueryWrapper().in(SysRoleDept::getRoleId, ids)); + return sysRoleMapper.deleteBatchIds(ids); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(SysUserRole userRole) { + SysUserRoleRequest sysUserRoleRequest = new SysUserRoleRequest(); + + return sysUserRoleMapper.delete(sysUserRoleRequest); + +// return sysUserRoleMapper.delete(new LambdaQueryWrapper() +// .eq(SysUserRole::getRoleId, userRole.getRoleId()) +// .eq(SysUserRole::getUserId, userRole.getUserId())); + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + + + SysUserRoleRequest sysUserRoleRequest = new SysUserRoleRequest(); + return sysUserRoleMapper.delete(sysUserRoleRequest); +// return sysUserRoleMapper.delete(new LambdaQueryWrapper() +// .eq(SysUserRole::getRoleId, roleId) +// .in(SysUserRole::getUserId, Arrays.asList(userIds))); + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + int rows = 1; + List list = new ArrayList(); + for (Long userId : userIds) { + SysUserRole ur = new SysUserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + list.add(ur); + } + if (list.size() > 0) { + sysUserRoleMapper.insertBatch(list); + } + return rows; + } +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/util/ReflectUtils.java b/api-admin/src/main/java/com/glxp/api/admin/util/ReflectUtils.java new file mode 100644 index 00000000..9799cc5e --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/util/ReflectUtils.java @@ -0,0 +1,54 @@ +package com.glxp.api.admin.util; + +import cn.hutool.core.util.ReflectUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +import java.lang.reflect.Method; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + */ +@SuppressWarnings("rawtypes") +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ReflectUtils extends ReflectUtil { + + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invoke(object, getterMethodName); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invoke(object, getterMethodName); + } else { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + Method method = getMethodByName(object.getClass(), setterMethodName); + invoke(object, method, value); + } + } + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/util/StreamUtils.java b/api-admin/src/main/java/com/glxp/api/admin/util/StreamUtils.java new file mode 100644 index 00000000..beafef7f --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/util/StreamUtils.java @@ -0,0 +1,247 @@ +package com.glxp.api.admin.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class StreamUtils { + + /** + * 将collection过滤 + * + * @param collection 需要转化的集合 + * @param function 过滤方法 + * @return 过滤后的list + */ + public static List filter(Collection collection, Predicate function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection.stream().filter(function).collect(Collectors.toList()); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function) { + return join(collection, function, ","); + } + + /** + * 将collection拼接 + * + * @param collection 需要转化的集合 + * @param function 拼接方法 + * @param delimiter 拼接符 + * @return 拼接后的list + */ + public static String join(Collection collection, Function function, CharSequence delimiter) { + if (CollUtil.isEmpty(collection)) { + return StringUtils.EMPTY; + } + return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter)); + } + + /** + * 将collection排序 + * + * @param collection 需要转化的集合 + * @param comparing 排序方法 + * @return 排序后的list + */ + public static List sorted(Collection collection, Comparator comparing) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection.stream().sorted(comparing).collect(Collectors.toList()); + } + + /** + * 将collection转化为类型不变的map
+ * {@code Collection ----> Map} + * + * @param collection 需要转化的集合 + * @param key V类型转化为K类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @return 转化后的map + */ + public static Map toIdentityMap(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().collect(Collectors.toMap(key, Function.identity(), (l, r) -> l)); + } + + /** + * 将Collection转化为map(value类型与collection的泛型不同)
+ * {@code Collection -----> Map } + * + * @param collection 需要转化的集合 + * @param key E类型转化为K类型的lambda方法 + * @param value E类型转化为V类型的lambda方法 + * @param collection中的泛型 + * @param map中的key类型 + * @param map中的value类型 + * @return 转化后的map + */ + public static Map toMap(Collection collection, Function key, Function value) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection.stream().collect(Collectors.toMap(key, value, (l, r) -> l)); + } + + /** + * 将collection按照规则(比如有相同的班级id)分类成map
+ * {@code Collection -------> Map> } + * + * @param collection 需要分类的集合 + * @param key 分类的规则 + * @param collection中的泛型 + * @param map中的key类型 + * @return 分类后的map + */ + public static Map> groupByKey(Collection collection, Function key) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList())); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map>> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 集合元素类型 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @return 分类后的map + */ + public static Map>> groupBy2Key(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection)) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList()))); + } + + /** + * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map
+ * {@code Collection ---> Map> } + * + * @param collection 需要分类的集合 + * @param key1 第一个分类的规则 + * @param key2 第二个分类的规则 + * @param 第一个map中的key类型 + * @param 第二个map中的key类型 + * @param collection中的泛型 + * @return 分类后的map + */ + public static Map> group2Map(Collection collection, Function key1, Function key2) { + if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { + return MapUtil.newHashMap(); + } + return collection + .stream() + .collect(Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l))); + } + + /** + * 将collection转化为List集合,但是两者的泛型不同
+ * {@code Collection ------> List } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为list泛型的lambda表达式 + * @param collection中的泛型 + * @param List中的泛型 + * @return 转化后的list + */ + public static List toList(Collection collection, Function function) { + if (CollUtil.isEmpty(collection)) { + return CollUtil.newArrayList(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + /** + * 将collection转化为Set集合,但是两者的泛型不同
+ * {@code Collection ------> Set } + * + * @param collection 需要转化的集合 + * @param function collection中的泛型转化为set泛型的lambda表达式 + * @param collection中的泛型 + * @param Set中的泛型 + * @return 转化后的Set + */ + public static Set toSet(Collection collection, Function function) { + if (CollUtil.isEmpty(collection) || function == null) { + return CollUtil.newHashSet(); + } + return collection + .stream() + .map(function) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + } + + + /** + * 合并两个相同key类型的map + * + * @param map1 第一个需要合并的 map + * @param map2 第二个需要合并的 map + * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况 + * @param map中的key类型 + * @param 第一个 map的value类型 + * @param 第二个 map的value类型 + * @param 最终map的value类型 + * @return 合并后的map + */ + public static Map merge(Map map1, Map map2, BiFunction merge) { + if (MapUtil.isEmpty(map1) && MapUtil.isEmpty(map2)) { + return MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map1)) { + map1 = MapUtil.newHashMap(); + } else if (MapUtil.isEmpty(map2)) { + map2 = MapUtil.newHashMap(); + } + Set key = new HashSet<>(); + key.addAll(map1.keySet()); + key.addAll(map2.keySet()); + Map map = new HashMap<>(); + for (K t : key) { + X x = map1.get(t); + Y y = map2.get(t); + V z = merge.apply(x, y); + if (z != null) { + map.put(t, z); + } + } + return map; + } + +} diff --git a/api-admin/src/main/java/com/glxp/api/admin/util/TreeBuildUtils.java b/api-admin/src/main/java/com/glxp/api/admin/util/TreeBuildUtils.java new file mode 100644 index 00000000..3917341a --- /dev/null +++ b/api-admin/src/main/java/com/glxp/api/admin/util/TreeBuildUtils.java @@ -0,0 +1,32 @@ +package com.glxp.api.admin.util; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.lang.tree.parser.NodeParser; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * 扩展 hutool TreeUtil 封装系统树构建 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class TreeBuildUtils extends TreeUtil { + + /** + * 根据前端定制差异化字段 + */ + public static final TreeNodeConfig DEFAULT_CONFIG = TreeNodeConfig.DEFAULT_CONFIG.setNameKey("label"); + + public static List> build(List list, NodeParser nodeParser) { + if (CollUtil.isEmpty(list)) { + return null; + } + K k = ReflectUtils.invokeGetter(list.get(0), "parentId"); + return TreeUtil.build(list, k, DEFAULT_CONFIG, nodeParser); + } + +} diff --git a/api-admin/src/main/resources/application-pro.properties b/api-admin/src/main/resources/application-pro.properties index c8d24d22..5e971639 100644 --- a/api-admin/src/main/resources/application-pro.properties +++ b/api-admin/src/main/resources/application-pro.properties @@ -1,7 +1,7 @@ # \u672C\u5730\u73AF\u5883 server.port=9991 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver -spring.datasource.jdbc-url=jdbc:mysql://192.168.0.148:3306/udiwms?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true +spring.datasource.jdbc-url=jdbc:mysql://192.168.0.109:3306/udiwms?allowMultiQueries=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=root spring.datasource.password=Glxp@6066 #spring.datasource.password=89083fb2fc145533 diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/AuthAdminDao.xml b/api-admin/src/main/resources/mybatis/mapper/auth/AuthAdminDao.xml index c4ae5e9f..6db6f2d7 100644 --- a/api-admin/src/main/resources/mybatis/mapper/auth/AuthAdminDao.xml +++ b/api-admin/src/main/resources/mybatis/mapper/auth/AuthAdminDao.xml @@ -117,7 +117,8 @@ #{CustomerId}, #{locInvCode}, #{locSubInvCode}, - #{dept},#{comments} + #{dept}, + #{comments} ) @@ -150,4 +151,44 @@ from auth_user where userFlag != 0 + + + + + + \ No newline at end of file diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysDictDataMapper.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysDictDataMapper.xml new file mode 100644 index 00000000..e7be729f --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysDictDataMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + delete + from sys_dict_data + where dict_code = #{dictCode} + + + + + INSERT INTO sys_dict_data(`dict_code`, `dict_sort`, dict_label, dict_value + , dict_type, css_class, list_class, is_default, status, remark, + create_by, create_time, update_by) + values (#{dictCode}, + #{dictSort}, #{dictLabel}, #{dictValue}, #{dictType}, #{cssClass}, #{listClass} + , #{isDefault}, #{status}, #{remark}, #{createBy}, #{createTime}, #{updateBy}) + + + + + UPDATE sys_dict_data + + `dict_code`=#{dictCode}, + `dict_sort`=#{dictSort}, + dict_label=#{dictLabel}, + `dict_value`=#{dictValue}, + dict_type=#{dictType}, + `css_class`=#{cssClass}, + `list_class`=#{listClass}, + is_default=#{isDefault}, + status=#{status}, + remark=#{remark}, + create_by=#{createBy}, + `create_time`=#{createTime}, + `update_by`=#{updateBy}, + + WHERE dict_code=#{dictCode} + + + + + + diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysDictTypeMapper.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysDictTypeMapper.xml new file mode 100644 index 00000000..346656e5 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysDictTypeMapper.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + delete + from sys_dict_type + where dict_id = #{dictId} + + + + + delete + from sys_dict_type + where dict_id in + + #{item} + + + + + + + + + + INSERT INTO sys_dict_type(`dict_id`, dict_name, `dict_type`, status + create_by, create_time, update_by, update_time) + values (#{dictId}, + #{dictName}, #{dictType}, #{status}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime}) + + + + + UPDATE sys_dict_type + + `dict_name`=#{dictName}, + dict_type=#{dictType}, + `status`=#{status}, + update_time=#{updateTime}, + create_by=#{createBy}, + `create_time`=#{createTime}, + `update_by`=#{updateBy}, + + WHERE dict_id=#{dictId} + + + + + + + diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysMenuDao.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysMenuDao.xml new file mode 100644 index 00000000..32b98513 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysMenuDao.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO sys_menu(`menu_id`, `menu_name`, parent_id, `order_num`, `path`, component + , query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, + remark, create_by, create_time, update_time, update_by) + values (#{menuId}, + #{menuName}, #{parentId}, + #{orderNum}, #{path}, #{component}, #{queryParam}, #{isFrame}, #{isCache} + , #{menuType}, #{visible}, #{status}, #{perms}, #{icon}, #{remark} + , #{createBy}, #{createTime}, #{updateTime}, #{updateBy}) + + + + UPDATE sys_menu + + `menu_name`=#{menuName}, + `parent_id`=#{parentId}, + order_num=#{orderNum}, + `path`=#{path}, + component=#{component}, + `query_param`=#{queryParam}, + is_frame=#{isFrame}, + is_cache=#{isCache}, + updateTime=#{updateTime}, + `menu_type`=#{menuType}, + `visible`=#{visible}, + status=#{status}, + perms=#{perms}, + icon=#{icon}, + remark=#{remark}, + create_by=#{createBy}, + create_time=#{createTime}, + update_time=#{updateTime}, + update_by=#{updateBy}, + + WHERE menu_id=#{menuId} + + + + delete + from sys_menu + where menu_id = #{id} + + + + + + + + + + + + + + + + + + + + + diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMapper.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMapper.xml new file mode 100644 index 00000000..ae50b3d2 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMapper.xml @@ -0,0 +1,174 @@ + + + + + + + + + + + + + + + + + + + + + + + INSERT INTO sys_role(`role_name`, `role_key`, role_sort, data_scope + , menu_check_strictly, dept_check_strictly, status, del_flag, remark, + create_by, create_time, update_by) + values (#{roleName}, + #{roleKey}, #{roleSort}, #{dataScope}, #{menuCheckStrictly}, #{deptCheckStrictly}, #{status} + , #{delFlag}, #{remark}, #{createBy}, #{createTime}, #{updateBy}) + + + + + UPDATE sys_role + + `role_name`=#{roleName}, + `role_key`=#{roleKey}, + role_sort=#{roleSort}, + `data_scope`=#{dataScope}, + menu_check_strictly=#{menuCheckStrictly}, + `dept_check_strictly`=#{deptCheckStrictly}, + `status`=#{status}, + del_flag=#{delFlag}, + remark=#{remark}, + create_by=#{createBy}, + `create_time`=#{createTime}, + `update_by`=#{updateBy}, + `update_time`=#{updateTime}, + + WHERE role_id=#{roleId} + + + + delete + from sys_role + where role_id in + + #{item} + + + + + + + delete + from sys_role + where role_id = #{id} + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys_role r + left join sys_user_role sur on sur.role_id = r.role_id + left join auth_user u on u.id = sur.user_id + + + + + + + + + + + + + diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMenuMapper.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMenuMapper.xml new file mode 100644 index 00000000..d586bede --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysRoleMenuMapper.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + delete + from sys_role_menu + where role_id = #{id} + + + + delete + from sys_role_menu + where role_id in + + #{item} + + + + + + + insert INTO sys_role_menu + ( + role_id,menu_id + ) + values + + ( + #{item.roleId}, + #{item.menuId} + ) + + + + diff --git a/api-admin/src/main/resources/mybatis/mapper/auth/SysUserRoleMapper.xml b/api-admin/src/main/resources/mybatis/mapper/auth/SysUserRoleMapper.xml new file mode 100644 index 00000000..946de905 --- /dev/null +++ b/api-admin/src/main/resources/mybatis/mapper/auth/SysUserRoleMapper.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + DELETE + FROM sys_user_role + + + AND user_id = #{userId} + + + AND role_id = #{roleId} + + + + + + + insert INTO sys_user_role + ( + user_id,role_id + ) + values + + ( + #{item.userId}, + #{item.roleId} + ) + + + diff --git a/api-admin/src/main/resources/schemas/schema_v2.2.sql b/api-admin/src/main/resources/schemas/schema_v2.2.sql new file mode 100644 index 00000000..e69de29b