From e41797c7507806d72f2aca87d85ff1d7508c0d29 Mon Sep 17 00:00:00 2001 From: ailanyin Date: Thu, 18 May 2023 17:29:02 +0800 Subject: [PATCH] add --- .../com/qiaoba/api/system/entity/SysUser.java | 4 - .../api/system/entity/dto/SysUserDto.java | 2 - .../api/system/entity/param/SysUserParam.java | 2 - .../api/system/service/SysUserApiService.java | 3 +- .../auth/advice/SecurityExceptionAdvice.java | 31 +++++ .../main/resources/META-INF/spring.factories | 1 + .../qiaoba/common/base/utils/ObjectUtil.java | 44 +++++++ .../qiaoba/common/poi/utils/ExcelUtil.java | 5 +- .../system/controller/SysDeptController.java | 1 + .../system/controller/SysMenuController.java | 14 ++- .../system/controller/SysUserController.java | 33 +++++- .../module/system/mapper/SysUserMapper.java | 9 -- .../system/mapper/SysUserPostMapper.java | 7 ++ .../system/mapper/SysUserRoleMapper.java | 7 ++ .../system/service/SysUserImportService.java | 23 ++++ .../system/service/SysUserPostService.java | 7 ++ .../system/service/SysUserRoleService.java | 7 ++ .../service/impl/SysLoginServiceImpl.java | 2 - .../impl/SysUserImportServiceImpl.java | 82 +++++++++++++ .../service/impl/SysUserPostServiceImpl.java | 5 + .../service/impl/SysUserRoleServiceImpl.java | 5 + .../service/impl/SysUserServiceImpl.java | 34 +++--- .../system/templates/SysUserExport.java | 11 +- .../system/templates/SysUserImport.java | 52 ++++++++ .../main/resources/mapper/SysDeptMapper.xml | 2 +- .../main/resources/mapper/SysUserMapper.xml | 112 +++++++++--------- .../resources/mapper/SysUserPostMapper.xml | 6 + .../resources/mapper/SysUserRoleMapper.xml | 7 ++ 28 files changed, 413 insertions(+), 105 deletions(-) create mode 100644 qiaoba-auth/src/main/java/com/qiaoba/auth/advice/SecurityExceptionAdvice.java create mode 100644 qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/ObjectUtil.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserImportService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserImportServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserImport.java diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUser.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUser.java index fe9e25d..d52bbf6 100644 --- a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUser.java +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUser.java @@ -52,8 +52,4 @@ public class SysUser extends BaseEntity { @Schema(description = "帐号状态(1正常 0停用)") private String status; - @Schema(description = "是否已删除") - private String isDelete; - - } diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java index a962dfe..5e60945 100644 --- a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java @@ -37,8 +37,6 @@ public class SysUserDto implements Serializable { private String status; - private String isDelete; - private String remark; /** diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysUserParam.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysUserParam.java index b11c50f..da791ee 100644 --- a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysUserParam.java +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysUserParam.java @@ -30,8 +30,6 @@ public class SysUserParam implements Serializable { private String status; - private String isDelete; - private String beginTime; private String endTime; diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysUserApiService.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysUserApiService.java index 3007735..f177bd4 100644 --- a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysUserApiService.java +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysUserApiService.java @@ -65,10 +65,9 @@ public interface SysUserApiService { * 批量删除 * * @param userIds userIds - * @param isSoftDelete 是否软删除 * @return 结果 */ - int deleteByIds(List userIds, Boolean isSoftDelete); + int deleteByIds(List userIds); /** * 用户绑定角色 diff --git a/qiaoba-auth/src/main/java/com/qiaoba/auth/advice/SecurityExceptionAdvice.java b/qiaoba-auth/src/main/java/com/qiaoba/auth/advice/SecurityExceptionAdvice.java new file mode 100644 index 0000000..0e464e9 --- /dev/null +++ b/qiaoba-auth/src/main/java/com/qiaoba/auth/advice/SecurityExceptionAdvice.java @@ -0,0 +1,31 @@ +package com.qiaoba.auth.advice; + + +import com.qiaoba.common.base.result.AjaxResult; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * 全局异常处理 + * + * @author ailanyin + * @version 1.0 + * @since 2021/10/15 0015 下午 16:43 + */ +@ControllerAdvice +public class SecurityExceptionAdvice { + + /** + * 无权限异常 + * + * @param e AccessDeniedException + * @return AjaxResult + */ + @ExceptionHandler({AccessDeniedException.class}) + @ResponseBody + public AjaxResult handlerAccessDeniedException(AccessDeniedException e) { + return AjaxResult.error("此接口无权限访问"); + } +} diff --git a/qiaoba-auth/src/main/resources/META-INF/spring.factories b/qiaoba-auth/src/main/resources/META-INF/spring.factories index 65cc811..45d4f1d 100644 --- a/qiaoba-auth/src/main/resources/META-INF/spring.factories +++ b/qiaoba-auth/src/main/resources/META-INF/spring.factories @@ -3,4 +3,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.qiaoba.auth.handler.AccessDeniedHandler,\ com.qiaoba.auth.handler.LogoutHandler,\ com.qiaoba.auth.filters.JwtAuthenticationTokenFilter,\ + com.qiaoba.auth.advice.SecurityExceptionAdvice,\ com.qiaoba.auth.config.SpringSecurityConfig diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/ObjectUtil.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/ObjectUtil.java new file mode 100644 index 0000000..b777c80 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/utils/ObjectUtil.java @@ -0,0 +1,44 @@ +package com.qiaoba.common.base.utils; + +import java.lang.reflect.Field; + +/** + * 对象工具类 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/18 14:59 + */ +public class ObjectUtil { + + /** + * 判断对象所有属性是否都为空 + * + * @param obj obj + * @return 结果 + */ + public static boolean isAllFieldNull(Object obj) { + // 得到类对象 + Class clazz = (Class) obj.getClass(); + //得到属性集合 + Field[] fs = clazz.getDeclaredFields(); + boolean flag = true; + //遍历属性 + for (Field f : fs) { + try { + // 设置属性是可以访问的(私有的也可以) + f.setAccessible(true); + // 得到此属性的值 + Object val = f.get(obj); + // 只要有1个属性不为空,那么就不是所有的属性值都为空 + if(val != null) { + flag = false; + break; + } + }catch (IllegalAccessException e){ + e.printStackTrace(); + } + } + return flag; + } +} diff --git a/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java b/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java index ec2a681..4d26822 100644 --- a/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java +++ b/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java @@ -29,7 +29,6 @@ import java.util.NoSuchElementException; */ public class ExcelUtil { - /** * 默认导出 * @@ -67,8 +66,8 @@ public class ExcelUtil { private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) { try { response.setCharacterEncoding("UTF-8"); - response.setHeader("content-Type" , "application/vnd.ms-excel"); - response.setHeader("Content-Disposition" , "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx" , "UTF-8")); + response.setHeader("content-Type", "application/vnd.ms-excel"); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8")); workbook.write(response.getOutputStream()); IOUtils.closeQuietly(workbook); } catch (IOException e) { diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java index b3277de..731b710 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java @@ -57,6 +57,7 @@ public class SysDeptController { } @GetMapping(value = "/dept-tree/{roleId}") + @Operation(summary = "角色部门树") public AjaxResult deptTree(@PathVariable("roleId") String roleId, SysDeptParam param) { AjaxResult ajax = AjaxResult.success(); ajax.put("checkedKeys", sysDeptService.selectDeptIdsByRoleId(roleId)); diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java index f20d74e..2c2ee06 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java @@ -5,6 +5,8 @@ import com.qiaoba.api.system.entity.param.SysMenuParam; import com.qiaoba.api.system.entity.vo.SysMenuVo; import com.qiaoba.common.base.result.AjaxResult; import com.qiaoba.module.system.service.SysMenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; @@ -22,11 +24,13 @@ import java.util.List; @RestController @RequestMapping("/system/menu") @RequiredArgsConstructor +@Tag(name = "菜单管理") public class SysMenuController { private final SysMenuService sysMenuService; @GetMapping("/list") + @Operation(summary = "获取列表") public AjaxResult list(SysMenuParam param) { List menus = sysMenuService.selectVoList(param); return AjaxResult.success(menus); @@ -34,35 +38,41 @@ public class SysMenuController { @PreAuthorize("hasAuthority('system:menu:query')") @GetMapping(value = "/{menuId}") + @Operation(summary = "获取详情") public AjaxResult getInfo(@PathVariable String menuId) { return AjaxResult.success(sysMenuService.selectById(menuId)); } @PreAuthorize("hasAuthority('system:menu:add')") @PostMapping + @Operation(summary = "添加菜单") public AjaxResult add(@Validated @RequestBody SysMenu menu) { return AjaxResult.toAjax(sysMenuService.insert(menu)); } @PreAuthorize("hasAuthority('system:menu:edit')") @PutMapping + @Operation(summary = "修改菜单") public AjaxResult edit(@Validated @RequestBody SysMenu menu) { return AjaxResult.toAjax(sysMenuService.updateById(menu)); } @PreAuthorize("hasAuthority('system:menu:remove')") @DeleteMapping("/{menuId}") + @Operation(summary = "删除菜单") public AjaxResult remove(@PathVariable("menuId") String menuId) { return AjaxResult.toAjax(sysMenuService.deleteById(menuId)); } - @GetMapping("/tree_select") + @GetMapping("/tree-select") + @Operation(summary = "构建菜单树") public AjaxResult treeSelect(SysMenuParam param) { List menus = sysMenuService.selectVoList(param); return AjaxResult.success(sysMenuService.buildMenuTree(menus)); } - @GetMapping(value = "/role_menu_tree_select/{roleId}") + @GetMapping(value = "/role-menu-tree-select/{roleId}") + @Operation(summary = "角色菜单树") public AjaxResult roleMenuTreeSelect(@PathVariable("roleId") String roleId) { AjaxResult ajax = AjaxResult.success(); ajax.put("checkedKeys", sysMenuService.selectMenuIdsByRoleId(roleId)); diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysUserController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysUserController.java index adb644a..3850634 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysUserController.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysUserController.java @@ -10,6 +10,7 @@ import com.qiaoba.api.system.entity.param.SysPostParam; import com.qiaoba.api.system.entity.param.SysRoleParam; import com.qiaoba.api.system.entity.param.SysUserParam; import com.qiaoba.api.system.entity.vo.SysUserVo; +import com.qiaoba.auth.utils.SecurityUtil; import com.qiaoba.common.base.enums.BaseEnum; import com.qiaoba.common.base.result.AjaxResult; import com.qiaoba.common.database.entity.PageQuery; @@ -17,14 +18,17 @@ import com.qiaoba.common.database.entity.TableDataInfo; import com.qiaoba.common.poi.utils.ExcelUtil; import com.qiaoba.module.system.service.*; import com.qiaoba.module.system.templates.SysUserExport; +import com.qiaoba.module.system.templates.SysUserImport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -47,6 +51,7 @@ public class SysUserController { private final SysPostService sysPostService; private final SysUserPostService sysUserPostService; private final SysUserRoleService sysUserRoleService; + private final SysUserImportService sysUserImportService; @PreAuthorize("hasAuthority('system:user:add')") @PostMapping @@ -80,7 +85,7 @@ public class SysUserController { @DeleteMapping("/{userIds}") @Operation(summary = "删除用户") public AjaxResult remove(@PathVariable List userIds) { - return AjaxResult.toAjax(sysUserService.deleteByIds(userIds, true)); + return AjaxResult.toAjax(sysUserService.deleteByIds(userIds)); } @GetMapping("/list") @@ -114,6 +119,20 @@ public class SysUserController { ExcelUtil.exportExcel(list, SysUserExport.class, "用户数据", response); } + @PostMapping("/importTemplate") + @Operation(summary = "导出模板") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), SysUserImport.class, "用户导入模板-(*)必填", response); + } + + @PreAuthorize("hasAuthority('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file) throws Exception { + List list = ExcelUtil.importExcel(file, SysUserImport.class); + Integer success = sysUserImportService.importUser(list); + return AjaxResult.success(StrUtil.format("成功导入({})条数据", success)); + } + @PreAuthorize("hasAuthority('system:user:query')") @GetMapping("/authRole/{userId}") @Operation(summary = "已分配角色列表") @@ -134,4 +153,16 @@ public class SysUserController { sysUserService.handleUserRole(userId, Arrays.stream(roleIds).collect(Collectors.toSet()), true); return AjaxResult.success(); } + + /** + * 个人中心-个人信息 + */ + @GetMapping("/profile") + public AjaxResult profile() { + String username = SecurityUtil.getLoginUserId(); + AjaxResult ajax = AjaxResult.success(sysUserService.selectById(username, false)); + ajax.put("roleGroup", "超级管理员,普通角色"); + ajax.put("postGroup", "董事长"); + return ajax; + } } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserMapper.java index d2b7ab8..6cc308f 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserMapper.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserMapper.java @@ -43,15 +43,6 @@ public interface SysUserMapper extends BaseMapper { */ int checkEmailUnique(SysUser sysUser); - /** - * 更新删除状态 - * - * @param userIds userIds - * @param status status - * @return 结果 - */ - int updateUserDeleteStatus(@Param("list") List userIds, String status); - /** * 分页查询用户列表 * diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java index 00a5faa..c063f79 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java @@ -29,4 +29,11 @@ public interface SysUserPostMapper extends BaseMapper { * @return postNames */ List selectUsedPostNameByIds(@Param("list") List postIds); + + /** + * 通过userIds删除 + * + * @param userIds userIds + */ + void deleteByUserIds(@Param("list") List userIds); } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java index 4cccc62..72e32bb 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java @@ -31,4 +31,11 @@ public interface SysUserRoleMapper extends BaseMapper { * @param userIds userIds */ void deleteByRoleIdAndUserIds(@Param("roleId") String roleId, @Param("list") List userIds); + + /** + * 通过userIds删除 + * + * @param userIds userIds + */ + void deleteByUserIds(@Param("list") List userIds); } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserImportService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserImportService.java new file mode 100644 index 0000000..f56a3f5 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserImportService.java @@ -0,0 +1,23 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.module.system.templates.SysUserImport; + +import java.util.List; + +/** + * 用户导入 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/18 14:49 + */ +public interface SysUserImportService { + + /** + * 导入用户信息 + * + * @param users users + * @return 成功条数 + */ + Integer importUser(List users); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java index 834adbf..2cb335b 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java @@ -27,6 +27,13 @@ public interface SysUserPostService { */ void deleteByUserId(String userId); + /** + * 通过userIds删除 + * + * @param userIds userIds + */ + void deleteByUserIds(List userIds); + /** * 通过userId查询所绑定的岗位ID列表 * diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java index 669979b..b050474 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java @@ -27,6 +27,13 @@ public interface SysUserRoleService { */ void deleteByUserId(String userId); + /** + * 通过userIds删除 + * + * @param userIds userIds + */ + void deleteByUserIds(List userIds); + /** * 批量取消角色所绑定的用户 * diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java index 10ad710..f05a342 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysLoginServiceImpl.java @@ -99,8 +99,6 @@ public class SysLoginServiceImpl implements SysLoginService { private void validateUser(String username, SysUser user) { if (ObjectUtil.isNull(user)) { throw new ServiceException(StrUtil.format("登录用户:{} 不存在", username)); - } else if (BaseEnum.YES.getCode().equals(user.getIsDelete())) { - throw new ServiceException(StrUtil.format("对不起, 您的账号:{} 已被删除", username)); } else if (BaseEnum.ABNORMAL.getCode().equals(user.getStatus())) { throw new ServiceException(StrUtil.format("对不起, 您的账号:{} 已被禁用", username)); } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserImportServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserImportServiceImpl.java new file mode 100644 index 0000000..e7938d6 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserImportServiceImpl.java @@ -0,0 +1,82 @@ +package com.qiaoba.module.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.dto.SysUserDto; +import com.qiaoba.auth.utils.SecurityUtil; +import com.qiaoba.common.base.constants.BaseConstant; +import com.qiaoba.common.base.exceptions.ServiceException; +import com.qiaoba.common.base.utils.ObjectUtil; +import com.qiaoba.module.system.service.SysUserImportService; +import com.qiaoba.module.system.service.SysUserService; +import com.qiaoba.module.system.templates.SysUserImport; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 用户导入 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/18 14:50 + */ +@Service +@AllArgsConstructor +public class SysUserImportServiceImpl implements SysUserImportService { + + private final SysUserService sysUserService; + + @Override + @Transactional(rollbackFor = Exception.class) + public Integer importUser(List users) { + Integer success = 0; + + for (SysUserImport importUser : users) { + if (!ObjectUtil.isAllFieldNull(importUser)) { + // 校验数据 + checkParams(importUser); + sysUserService.saveOrUpdate(createUserDto(importUser), false); + success++; + } + } + + return success; + } + + private SysUserDto createUserDto(SysUserImport importUser) { + SysUserDto dto = BeanUtil.copyProperties(importUser, SysUserDto.class); + if (StrUtil.isNotBlank(importUser.getRole())) { + String[] roleArr = importUser.getRole().split(BaseConstant.DEFAULT_SPLIT_STR); + dto.setRoleIds(Arrays.stream(roleArr).collect(Collectors.toSet())); + } + if (StrUtil.isNotBlank(importUser.getPost())) { + String[] postArr = importUser.getPost().split(BaseConstant.DEFAULT_SPLIT_STR); + dto.setPostIds(Arrays.stream(postArr).collect(Collectors.toSet())); + } + return dto; + } + + private void checkParams(SysUserImport importUser) { + if (StrUtil.isBlank(importUser.getUsername())) { + throw new ServiceException("登录账号不能为空"); + } + if (StrUtil.isBlank(importUser.getPassword())) { + throw new ServiceException("登录密码不能为空"); + } + if (StrUtil.isBlank(importUser.getNickname())) { + throw new ServiceException("用户姓名不能为空"); + } + if (StrUtil.isBlank(importUser.getRole())) { + throw new ServiceException("用户角色不能为空"); + } + if (StrUtil.isBlank(importUser.getStatus())) { + throw new ServiceException("用户状态不能为空"); + } + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java index 013d691..1103a7c 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java @@ -33,6 +33,11 @@ public class SysUserPostServiceImpl implements SysUserPostService { sysUserPostMapper.delete(createWrapper(userId)); } + @Override + public void deleteByUserIds(List userIds) { + sysUserPostMapper.deleteByUserIds(userIds); + } + @Override public List selectPostIdsByUserId(String userId) { return sysUserPostMapper.selectPostIdsByUserId(userId); diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java index f02342d..452497a 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java @@ -34,6 +34,11 @@ public class SysUserRoleServiceImpl implements SysUserRoleService { sysUserRoleMapper.delete(createWrapper(userId)); } + @Override + public void deleteByUserIds(List userIds) { + sysUserRoleMapper.deleteByUserIds(userIds); + } + @Override public void deleteByRoleIdAndUserIds(String roleId, List userIds) { sysUserRoleMapper.deleteByRoleIdAndUserIds(roleId, userIds); diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java index c84cfe1..570ba6b 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserServiceImpl.java @@ -2,6 +2,7 @@ package com.qiaoba.module.system.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -13,13 +14,11 @@ import com.qiaoba.api.system.entity.dto.ResetUserStatusDto; import com.qiaoba.api.system.entity.dto.SysUserDto; import com.qiaoba.api.system.entity.param.SysUserParam; import com.qiaoba.api.system.entity.vo.SysUserVo; +import com.qiaoba.auth.utils.SecurityUtil; import com.qiaoba.common.base.enums.BaseEnum; import com.qiaoba.common.base.exceptions.ServiceException; import com.qiaoba.common.database.entity.PageQuery; import com.qiaoba.common.database.entity.TableDataInfo; -import com.qiaoba.common.redis.constants.CacheConstant; -import com.qiaoba.common.redis.service.RedisService; -import com.qiaoba.auth.utils.SecurityUtil; import com.qiaoba.module.system.mapper.SysUserMapper; import com.qiaoba.module.system.service.SysUserPostService; import com.qiaoba.module.system.service.SysUserRoleService; @@ -27,6 +26,7 @@ import com.qiaoba.module.system.service.SysUserService; import com.qiaoba.module.system.templates.SysUserExport; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.*; @@ -44,10 +44,10 @@ public class SysUserServiceImpl implements SysUserService { private final SysUserMapper sysUserMapper; private final SysUserPostService sysUserPostService; private final SysUserRoleService sysUserRoleService; - private final RedisService redisService; @Override - public int saveOrUpdate(SysUserDto dto, Boolean isUpdate) { + @Transactional(rollbackFor = Exception.class) + public synchronized int saveOrUpdate(SysUserDto dto, Boolean isUpdate) { int result = 0; SysUser sysUser = dtoToSysUser(dto, isUpdate); // 检验是否已存在 @@ -97,10 +97,12 @@ public class SysUserServiceImpl implements SysUserService { } @Override - public int deleteByIds(List userIds, Boolean isSoftDelete) { - if (isSoftDelete) { - return sysUserMapper.updateUserDeleteStatus(userIds, BaseEnum.YES.getCode()); - } + @Transactional(rollbackFor = Exception.class) + public int deleteByIds(List userIds) { + // 删除和角色绑定 + sysUserRoleService.deleteByUserIds(userIds); + // 删除和岗位绑定 + sysUserPostService.deleteByUserIds(userIds); return sysUserMapper.deleteBatchIds(userIds); } @@ -133,6 +135,7 @@ public class SysUserServiceImpl implements SysUserService { } @Override + @Transactional(rollbackFor = Exception.class) public void handleUserRole(String userId, Set roleIds, boolean isUpdate) { if (isUpdate) { sysUserRoleService.deleteByUserId(userId); @@ -149,8 +152,12 @@ public class SysUserServiceImpl implements SysUserService { @Override public List selectExportData(SysUserParam param) { - return sysUserMapper.selectExportData(param); - //return sysUserMapper.selectVoList(param); + List list = sysUserMapper.selectExportData(param); + list.forEach(export -> { + export.setRole(CollectionUtil.join(export.getRoles(), "|")); + export.setPost(CollectionUtil.join(export.getPosts(), "|")); + }); + return list; } private QueryWrapper param2Wrapper(SysUserParam sysUserParam) { @@ -158,7 +165,6 @@ public class SysUserServiceImpl implements SysUserService { wrapper.lambda() .orderByAsc(SysUser::getCreateTime) .eq(StrUtil.isNotBlank(sysUserParam.getDeptId()), SysUser::getDeptId, sysUserParam.getDeptId()) - .eq(StrUtil.isNotBlank(sysUserParam.getIsDelete()), SysUser::getIsDelete, sysUserParam.getIsDelete()) .eq(StrUtil.isNotBlank(sysUserParam.getStatus()), SysUser::getStatus, sysUserParam.getStatus()) .ge(StrUtil.isNotBlank(sysUserParam.getBeginTime()), SysUser::getCreateTime, sysUserParam.getBeginTime()) .le(StrUtil.isNotBlank(sysUserParam.getEndTime()), SysUser::getCreateTime, sysUserParam.getEndTime()) @@ -225,7 +231,8 @@ public class SysUserServiceImpl implements SysUserService { } - private void handleUserPost(String userId, Set postIds, boolean isUpdate) { + @Transactional(rollbackFor = Exception.class) + public void handleUserPost(String userId, Set postIds, boolean isUpdate) { if (isUpdate) { sysUserPostService.deleteByUserId(userId); } @@ -239,5 +246,4 @@ public class SysUserServiceImpl implements SysUserService { sysUserPostService.insertBatch(list); } - } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserExport.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserExport.java index 1999526..deb7675 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserExport.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserExport.java @@ -1,8 +1,6 @@ package com.qiaoba.module.system.templates; import cn.afterturn.easypoi.excel.annotation.Excel; -import cn.afterturn.easypoi.excel.annotation.ExcelCollection; -import cn.hutool.core.collection.CollUtil; import lombok.Data; import java.util.Date; @@ -30,6 +28,12 @@ public class SysUserExport { @Excel(name = "部门", width = 20) private String deptName; + @Excel(name = "角色", width = 30) + private String role; + + @Excel(name = "岗位", width = 30) + private String post; + @Excel(name = "性别", replace = {"男_0", "女_1", "未知_2"}) private String gender; @@ -45,11 +49,8 @@ public class SysUserExport { @Excel(name = "创建时间", width = 30, format = "yyyy-MM-dd HH:mm:ss") private Date createTime; - private String role = this.roles.toString(); - //@ExcelCollection(name = "角色") private List roles; - //@ExcelCollection(name = "岗位") private List posts; } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserImport.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserImport.java new file mode 100644 index 0000000..9bd2c59 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/templates/SysUserImport.java @@ -0,0 +1,52 @@ +package com.qiaoba.module.system.templates; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 用户导入模板 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/17 17:16 + */ +@Data +public class SysUserImport { + + @Excel(name = "登录账号(*)", width = 20) + private String username; + + @Excel(name = "账号密码(*)", width = 20) + private String password; + + @Excel(name = "姓名(*)", width = 20) + private String nickname; + + @Excel(name = "角色(*)", width = 20) + private String role; + + @Excel(name = "部门", width = 20) + private String deptId; + + @Excel(name = "岗位", width = 20) + private String post; + + /** + * addressList = true -> 下拉框 + */ + @Excel(name = "性别", replace = {"男_0", "女_1", "未知_2"}, addressList = true) + private String gender; + + @Excel(name = "手机", width = 20) + private String phone; + + @Excel(name = "邮箱", width = 20) + private String email; + + @Excel(name = "状态(*)", replace = {"正常_1", "禁用_0"}, addressList = true) + private String status; + +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml index 8e74d83..3841d64 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml @@ -24,7 +24,7 @@ diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml index 94e833a..ee71361 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml @@ -23,11 +23,11 @@ - + - - + + @@ -43,28 +43,29 @@ FROM sys_user u left join sys_dept t2 on u.dept_id = t2.dept_id - where u.is_delete = #{param.isDelete} - - AND u.username like concat('%', #{param.username}, '%') - - - AND u.nickname like concat('%', #{param.nickname}, '%') - - - AND u.status = #{param.status} - - - AND u.dept_id = #{param.deptId} - - - AND u.phone like concat('%', #{param.phone}, '%') - - - AND u.create_time >= #{param.beginTime} - - - AND u.create_time <= #{param.endTime} - + + + AND u.username like concat('%', #{param.username}, '%') + + + AND u.nickname like concat('%', #{param.nickname}, '%') + + + AND u.status = #{param.status} + + + AND u.dept_id = #{param.deptId} + + + AND u.phone like concat('%', #{param.phone}, '%') + + + AND u.create_time >= #{param.beginTime} + + + AND u.create_time <= #{param.endTime} + + - - update sys_user set is_delete = #{status} where user_id in - - #{userId} - - diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml index a8c17f4..425ca47 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml @@ -19,4 +19,10 @@ + + delete from sys_user_post where user_id in + + #{userId} + + diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml index fa1a7ec..5d58d3a 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml @@ -19,4 +19,11 @@ #{userId} + + + delete from sys_user_role where user_id in + + #{userId} + +