From 076a8aed7035981f9fc1eae602a5b07255bf52cd Mon Sep 17 00:00:00 2001 From: ailanyin Date: Wed, 10 May 2023 17:17:26 +0800 Subject: [PATCH] add --- pom.xml | 20 +- qiaoba-apis/pom.xml | 14 +- .../com/qiaoba/api/system/entity/SysDept.java | 71 +++++++ .../com/qiaoba/api/system/entity/SysMenu.java | 94 +++++++++ .../com/qiaoba/api/system/entity/SysPost.java | 40 ++++ .../com/qiaoba/api/system/entity/SysRole.java | 54 +++++ .../qiaoba/api/system/entity/SysRoleMenu.java | 41 ++++ .../qiaoba/api/system/entity/SysTenant.java | 2 +- .../com/qiaoba/api/system/entity/SysUser.java | 12 +- .../qiaoba/api/system/entity/SysUserPost.java | 40 ++++ .../qiaoba/api/system/entity/SysUserRole.java | 40 ++++ .../api/system/entity/dto/ResetPwdDto.java | 22 ++ .../system/entity/dto/ResetUserStatusDto.java | 22 ++ .../api/system/entity/dto/SysRoleDto.java | 67 ++++++ .../api/system/entity/dto/SysUserDto.java | 54 +++++ .../api/system/entity/param/SysDeptParam.java | 23 +++ .../api/system/entity/param/SysMenuParam.java | 29 +++ .../api/system/entity/param/SysPostParam.java | 33 +++ .../api/system/entity/param/SysRoleParam.java | 24 +++ .../api/system/entity/param/SysUserParam.java | 16 +- .../api/system/entity/vo/SysMenuVo.java | 69 +++++++ .../api/system/entity/vo/SysRoleDto.java | 41 ++++ .../api/system/entity/vo/SysUserVo.java | 49 +++++ .../api/system/service/SysDeptApiService.java | 56 +++++ .../api/system/service/SysMenuApiService.java | 57 ++++++ .../api/system/service/SysPostApiService.java | 64 ++++++ .../api/system/service/SysRoleApiService.java | 65 ++++++ .../api/system/service/SysUserApiService.java | 66 +++++- .../qiaoba/application/QiaoBaApplication.java | 2 + .../src/main/resources/application-dev.yml | 41 +--- .../src/main/resources/application.yml | 11 +- qiaoba-commons/pom.xml | 4 +- qiaoba-commons/qiaoba-common-base/pom.xml | 9 +- .../common/base/constants/BaseConstant.java | 10 + .../qiaoba/common/base/entity/BaseEntity.java | 2 +- .../qiaoba/common/base/result/AjaxResult.java | 167 +++++++++++++++ .../config/DynamicDataSourceConfig.java | 14 ++ .../database/config/MybatisPlusConfig.java | 39 ++++ .../common/database/entity/PageQuery.java | 68 ++++++ .../common/database/entity/TableDataInfo.java | 78 +++++++ .../factories/DynamicDataSourceFactory.java | 5 + .../filters/DynamicDataSourceFilter.java | 12 +- .../common/database/utils/TenantUtil.java | 30 +++ .../main/resources/META-INF/spring.factories | 5 +- qiaoba-commons/qiaoba-common-poi/pom.xml | 27 +++ .../qiaoba/common/poi/model/ExcelSetting.java | 39 ++++ .../qiaoba/common/poi/utils/ExcelUtil.java | 120 +++++++++++ qiaoba-commons/qiaoba-common-security/pom.xml | 21 ++ .../common/security/utils/SecurityUtil.java | 30 +++ qiaoba-commons/qiaoba-common-web/pom.xml | 6 +- .../common/web/advice/ExceptionAdvice.java | 45 ++++ .../main/resources/META-INF/spring.factories | 4 + qiaoba-modules/pom.xml | 3 +- .../system/controller/SysDeptController.java | 68 ++++++ .../system/controller/SysLoginController.java | 31 +++ .../system/controller/SysMenuController.java | 72 +++++++ .../system/controller/SysPostController.java | 90 ++++++++ .../system/controller/SysRoleController.java | 66 ++++++ .../system/controller/SysUserController.java | 121 ++++++++--- .../module/system/mapper/SysDeptMapper.java | 25 +++ .../module/system/mapper/SysMenuMapper.java | 33 +++ .../module/system/mapper/SysPostMapper.java | 31 +++ .../module/system/mapper/SysRoleMapper.java | 31 +++ .../system/mapper/SysRoleMenuMapper.java | 24 +++ .../module/system/mapper/SysUserMapper.java | 56 +++++ .../system/mapper/SysUserPostMapper.java | 23 +++ .../system/mapper/SysUserRoleMapper.java | 24 +++ .../module/system/service/SysDeptService.java | 33 +++ .../module/system/service/SysMenuService.java | 34 +++ .../module/system/service/SysPostService.java | 29 +++ .../system/service/SysRoleMenuService.java | 29 +++ .../module/system/service/SysRoleService.java | 26 +++ .../system/service/SysUserPostService.java | 37 ++++ .../system/service/SysUserRoleService.java | 37 ++++ .../module/system/service/SysUserService.java | 23 +++ .../service/impl/SysDeptServiceImpl.java | 162 +++++++++++++++ .../service/impl/SysMenuServiceImpl.java | 93 +++++++++ .../service/impl/SysPostServiceImpl.java | 106 ++++++++++ .../service/impl/SysRoleMenuServiceImpl.java | 35 ++++ .../service/impl/SysRoleServiceImpl.java | 137 +++++++++++++ .../service/impl/SysUserPostServiceImpl.java | 47 +++++ .../service/impl/SysUserRoleServiceImpl.java | 47 +++++ .../service/impl/SysUserServiceImpl.java | 193 +++++++++++++++++- .../main/resources/mapper/SysDeptMapper.xml | 15 ++ .../main/resources/mapper/SysMenuMapper.xml | 23 +++ .../main/resources/mapper/SysPostMapper.xml | 25 +++ .../main/resources/mapper/SysRoleMapper.xml | 25 +++ .../resources/mapper/SysRoleMenuMapper.xml | 17 ++ .../main/resources/mapper/SysUserMapper.xml | 79 +++++++ .../resources/mapper/SysUserPostMapper.xml | 10 + .../resources/mapper/SysUserRoleMapper.xml | 11 + 91 files changed, 3837 insertions(+), 108 deletions(-) create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysDept.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysMenu.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysPost.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRole.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRoleMenu.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserPost.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserRole.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetPwdDto.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetUserStatusDto.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysRoleDto.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysDeptParam.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysMenuParam.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysPostParam.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysRoleParam.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysMenuVo.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysRoleDto.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysUserVo.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysDeptApiService.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysMenuApiService.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysPostApiService.java create mode 100644 qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysRoleApiService.java create mode 100644 qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/result/AjaxResult.java create mode 100644 qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java create mode 100644 qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/PageQuery.java create mode 100644 qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/TableDataInfo.java create mode 100644 qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/TenantUtil.java create mode 100644 qiaoba-commons/qiaoba-common-poi/pom.xml create mode 100644 qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/model/ExcelSetting.java create mode 100644 qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java create mode 100644 qiaoba-commons/qiaoba-common-security/pom.xml create mode 100644 qiaoba-commons/qiaoba-common-security/src/main/java/com/qiaoba/common/security/utils/SecurityUtil.java create mode 100644 qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/advice/ExceptionAdvice.java create mode 100644 qiaoba-commons/qiaoba-common-web/src/main/resources/META-INF/spring.factories create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysLoginController.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysPostController.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysRoleController.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysDeptMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysPostMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMenuMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysDeptService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysPostService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleMenuService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysDeptServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysPostServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleMenuServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysMenuMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysPostMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMenuMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml create mode 100644 qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml diff --git a/pom.xml b/pom.xml index 497c0bf..d2bc6c5 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,8 @@ 8.0.33 3.5.3.1 + + 4.4.0 4.0.0 @@ -64,6 +66,12 @@ hutool-all ${hutool.version} + + + cn.afterturn + easypoi-spring-boot-starter + ${easypoi.version} + com.github.xiaoymin @@ -126,6 +134,16 @@ qiaoba-common-doc ${qiaoba.version} + + com.qiaoba + qiaoba-common-security + ${qiaoba.version} + + + com.qiaoba + qiaoba-common-poi + ${qiaoba.version} + @@ -175,4 +193,4 @@ - \ No newline at end of file + diff --git a/qiaoba-apis/pom.xml b/qiaoba-apis/pom.xml index dfff4a8..b74aa80 100644 --- a/qiaoba-apis/pom.xml +++ b/qiaoba-apis/pom.xml @@ -17,10 +17,6 @@ - - com.qiaoba - qiaoba-common-base - com.qiaoba qiaoba-common-datasource @@ -33,5 +29,13 @@ jakarta.validation jakarta.validation-api + + com.qiaoba + qiaoba-common-security + + + com.qiaoba + qiaoba-common-poi + - \ No newline at end of file + diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysDept.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysDept.java new file mode 100644 index 0000000..05993eb --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysDept.java @@ -0,0 +1,71 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import com.qiaoba.common.base.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 部门信息 sys_dept + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_dept") +public class SysDept extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId + private String deptId; + + /** + * 父部门ID + */ + private String parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private String leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0停用,1正常 + */ + private String status; + +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysMenu.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysMenu.java new file mode 100644 index 0000000..4e3e91b --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysMenu.java @@ -0,0 +1,94 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.qiaoba.common.base.entity.BaseEntity; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 菜单信息 sys_menu + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_menu") +public class SysMenu extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + @TableId + private String menuId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 10, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 父菜单ID + */ + private String parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String query; + + /** + * 是否为外链(0否 1是) + */ + private String isFrame; + + /** + * 是否缓存(0不缓存 1缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0隐藏 1显示) + */ + private String isVisible; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysPost.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysPost.java new file mode 100644 index 0000000..3528193 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysPost.java @@ -0,0 +1,40 @@ +package com.qiaoba.api.system.entity; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.qiaoba.common.base.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位信息 sys_post + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_post") +public class SysPost extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId + @Excel(name = "岗位序号" , width = 20) + private String postId; + + @Excel(name = "岗位编码" , width = 20) + private String postCode; + + @Excel(name = "岗位名称" , width = 20) + private String postName; + + @Excel(name = "岗位排序" , width = 20) + private String postSort; + + @Excel(name = "状态" , width = 20, replace = {"正常_1" , "异常_0"}) + private String status; + +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRole.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRole.java new file mode 100644 index 0000000..3c73cb6 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRole.java @@ -0,0 +1,54 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.qiaoba.common.base.entity.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 角色信息 sys_role + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_role") +public class SysRole extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @TableId + private String roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private String roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 角色状态(1正常 0停用) + */ + private String status; + +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRoleMenu.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRoleMenu.java new file mode 100644 index 0000000..1d05e44 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysRoleMenu.java @@ -0,0 +1,41 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Getter +@Setter +@NoArgsConstructor +@TableName("sys_role_menu") +public class SysRoleMenu { + + /** + * 角色ID + */ + private String roleId; + + /** + * 菜单ID + */ + private String menuId; + + /** + * 租户ID + */ + private String tenantId; + + public SysRoleMenu(String roleId, String menuId) { + this.roleId = roleId; + this.menuId = menuId; + } +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysTenant.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysTenant.java index 0d69907..6561a28 100644 --- a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysTenant.java +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysTenant.java @@ -23,7 +23,7 @@ public class SysTenant extends BaseEntity { private static final long serialVersionUID = 1L; @TableId - private Long tenantId; + private String tenantId; private String tenantCode; 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 9a27af2..fe9e25d 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 @@ -23,10 +23,10 @@ public class SysUser extends BaseEntity { @TableId @Schema(description = "用户ID") - private Long userId; + private String userId; @Schema(description = "部门ID") - private Long deptId; + private String deptId; @Schema(description = "登陆账号") private String username; @@ -52,14 +52,8 @@ public class SysUser extends BaseEntity { @Schema(description = "帐号状态(1正常 0停用)") private String status; - @Schema(description = "是否是超管") - private Boolean isSuperuser; - - @Schema(description = "是否是管理员") - private Boolean isManager; - @Schema(description = "是否已删除") - private Boolean isDelete; + private String isDelete; } diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserPost.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserPost.java new file mode 100644 index 0000000..fb53e2b --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserPost.java @@ -0,0 +1,40 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * 用户和岗位关联 sys_user_post + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Getter +@Setter +@NoArgsConstructor +@TableName("sys_user_post") +public class SysUserPost { + + /** + * 用户ID + */ + private String userId; + + /** + * 岗位ID + */ + private String postId; + + /** + * 租户ID + */ + private String tenantId; + + public SysUserPost(String userId, String postId) { + this.userId = userId; + this.postId = postId; + } +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserRole.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserRole.java new file mode 100644 index 0000000..2cce2ec --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/SysUserRole.java @@ -0,0 +1,40 @@ +package com.qiaoba.api.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * 用户和角色关联 sys_user_role + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@Getter +@Setter +@NoArgsConstructor +@TableName("sys_user_role") +public class SysUserRole { + + /** + * 用户ID + */ + private String userId; + + /** + * 角色ID + */ + private String roleId; + + /** + * 租户ID + */ + private String tenantId; + + public SysUserRole(String userId, String roleId) { + this.userId = userId; + this.roleId = roleId; + } +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetPwdDto.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetPwdDto.java new file mode 100644 index 0000000..c64b668 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetPwdDto.java @@ -0,0 +1,22 @@ +package com.qiaoba.api.system.entity.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author ailanyin + * @version 1.0 + * @since 2023/5/10 14:03 + */ +@Getter +@Setter +public class ResetPwdDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String userId; + + private String password; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetUserStatusDto.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetUserStatusDto.java new file mode 100644 index 0000000..41c0440 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/ResetUserStatusDto.java @@ -0,0 +1,22 @@ +package com.qiaoba.api.system.entity.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author ailanyin + * @version 1.0 + * @since 2023/5/10 14:03 + */ +@Getter +@Setter +public class ResetUserStatusDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String userId; + + private String status; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysRoleDto.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysRoleDto.java new file mode 100644 index 0000000..d1fe71f --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysRoleDto.java @@ -0,0 +1,67 @@ +package com.qiaoba.api.system.entity.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Set; + +/** + * 角色 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/8 15:54 + */ +@Getter +@Setter +public class SysRoleDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + private String roleId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private String roleSort; + + /** + * 备注 + */ + private String remark; + + /** + * 角色状态(1正常 0停用) + */ + private String status; + + /** + * 部门组(数据权限) + */ + private Set deptIds; + + /** + * 菜单组 + */ + private Set menuIds; + +} 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 new file mode 100644 index 0000000..a962dfe --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/dto/SysUserDto.java @@ -0,0 +1,54 @@ +package com.qiaoba.api.system.entity.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Set; + +/** + * 用户 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/8 15:54 + */ +@Getter +@Setter +public class SysUserDto implements Serializable { + + private static final long serialVersionUID = 1L; + + private String userId; + + private String nickname; + + private String deptId; + + private String phone; + + private String email; + + private String username; + + private String password; + + private String gender; + + private String status; + + private String isDelete; + + private String remark; + + /** + * 岗位组 + */ + private Set postIds; + + /** + * 角色组 + */ + private Set roleIds; + +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysDeptParam.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysDeptParam.java new file mode 100644 index 0000000..4fb456a --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysDeptParam.java @@ -0,0 +1,23 @@ +package com.qiaoba.api.system.entity.param; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 部门查询参数 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 15:37:43 + */ +@Getter +@Setter +public class SysDeptParam implements Serializable { + + private static final long serialVersionUID = 1L; + + private String deptName; + private String status; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysMenuParam.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysMenuParam.java new file mode 100644 index 0000000..1fe651f --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysMenuParam.java @@ -0,0 +1,29 @@ +package com.qiaoba.api.system.entity.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 菜单查询参数 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 11:24 + */ +@Getter +@Setter +public class SysMenuParam implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "菜单名称") + private String menuName; + + /** + * 显示状态(0隐藏 1显示) + */ + private String isVisible; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysPostParam.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysPostParam.java new file mode 100644 index 0000000..387e4e1 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysPostParam.java @@ -0,0 +1,33 @@ +package com.qiaoba.api.system.entity.param; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 岗位查询参数 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 15:37:43 + */ +@Getter +@Setter +public class SysPostParam implements Serializable { + + private static final long serialVersionUID = 1L; + + private String postName; + + private String postCode; + + private String status; + + public SysPostParam() { + } + + public SysPostParam(String status) { + this.status = status; + } +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysRoleParam.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysRoleParam.java new file mode 100644 index 0000000..f509d36 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/param/SysRoleParam.java @@ -0,0 +1,24 @@ +package com.qiaoba.api.system.entity.param; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * 角色查询参数 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 15:37:43 + */ +@Getter +@Setter +public class SysRoleParam implements Serializable { + + private static final long serialVersionUID = 1L; + + private String roleName; + private String status; +} 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 4cf14f2..fa5a362 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 @@ -1,6 +1,5 @@ package com.qiaoba.api.system.entity.param; -import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -19,6 +18,19 @@ public class SysUserParam implements Serializable { private static final long serialVersionUID = 1L; - @Schema(description = "昵称") + private String username; + private String nickname; + + private String phone; + + private String deptId; + + 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/entity/vo/SysMenuVo.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysMenuVo.java new file mode 100644 index 0000000..acddd24 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysMenuVo.java @@ -0,0 +1,69 @@ +package com.qiaoba.api.system.entity.vo; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 菜单 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 14:08 + */ +@Getter +@Setter +public class SysMenuVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private String menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private String parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 组件路径 + */ + private String component; + + /** + * 显示状态(0隐藏 1显示) + */ + private String isVisible; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建时间 + */ + private Date createTime; + + private List children; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysRoleDto.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysRoleDto.java new file mode 100644 index 0000000..450900e --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysRoleDto.java @@ -0,0 +1,41 @@ +package com.qiaoba.api.system.entity.vo; + +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Set; + +/** + * 角色 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 16:50 + */ +@Getter +@Setter +public class SysRoleDto implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + /** + * 角色菜单权限 + */ + private Set permissions; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysUserVo.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysUserVo.java new file mode 100644 index 0000000..e05dafc --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/entity/vo/SysUserVo.java @@ -0,0 +1,49 @@ +package com.qiaoba.api.system.entity.vo; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/10 15:50 + */ +@Getter +@Setter +public class SysUserVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @Excel(name = "用户ID", width = 25) + private String userId; + + @Excel(name = "登录账号", width = 20) + private String username; + + @Excel(name = "姓名", width = 20) + private String nickname; + + @Excel(name = "部门", width = 20) + private String deptName; + + @Excel(name = "性别", replace = {"男_0", "女_1", "未知_2"}) + private String gender; + + @Excel(name = "手机", width = 20) + private String phone; + + @Excel(name = "邮箱", width = 20) + private String email; + + @Excel(name = "创建时间", width = 30, format = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @Excel(name = "状态", replace = {"正常_1", "停用_0"}) + private String status; +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysDeptApiService.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysDeptApiService.java new file mode 100644 index 0000000..75d18ec --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysDeptApiService.java @@ -0,0 +1,56 @@ +package com.qiaoba.api.system.service; + +import com.qiaoba.api.system.entity.SysDept; +import com.qiaoba.api.system.entity.param.SysDeptParam; + +import java.util.List; + +/** + * 部门对外暴露接口 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 20:33:43 + */ +public interface SysDeptApiService { + + /** + * 新增部门 + * + * @param sysDept sysDept + * @return > 0 = success + */ + int insert(SysDept sysDept); + + /** + * 更新部门 + * + * @param sysDept sysDept + * @return > 0 = success + */ + int updateById(SysDept sysDept); + + /** + * 查询列表 + * + * @param param 条件 + * @return 部门列表 + */ + List selectList(SysDeptParam param); + + /** + * 查询详细 + * + * @param deptId 部门Id + * @return 部门信息 + */ + SysDept selectById(Long deptId); + + /** + * 删除部门 + * + * @param deptId 部门Id + * @return > 0 = success + */ + int deleteById(Long deptId); +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysMenuApiService.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysMenuApiService.java new file mode 100644 index 0000000..0977453 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysMenuApiService.java @@ -0,0 +1,57 @@ +package com.qiaoba.api.system.service; + +import com.qiaoba.api.system.entity.SysMenu; +import com.qiaoba.api.system.entity.param.SysMenuParam; +import com.qiaoba.api.system.entity.vo.SysMenuVo; + +import java.util.List; + +/** + * 菜单对外暴露接口 + * + * @author ailanyin + * @version 1.0 + * @since 2023-5-5 11:25:33 + */ +public interface SysMenuApiService { + + /** + * 新增菜单 + * + * @param sysMenu sysMenu + * @return > 0 = success + */ + int insert(SysMenu sysMenu); + + /** + * 更新菜单 + * + * @param sysMenu sysMenu + * @return > 0 = success + */ + int updateById(SysMenu sysMenu); + + /** + * 查询列表 + * + * @param param 条件 + * @return 菜单列表 + */ + List selectVoList(SysMenuParam param); + + /** + * 查询详细 + * + * @param menuId 菜单Id + * @return 菜单信息 + */ + SysMenu selectById(String menuId); + + /** + * 删除菜单 + * + * @param menuId 菜单Id + * @return > 0 = success + */ + int deleteById(String menuId); +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysPostApiService.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysPostApiService.java new file mode 100644 index 0000000..eb45366 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysPostApiService.java @@ -0,0 +1,64 @@ +package com.qiaoba.api.system.service; + +import com.qiaoba.api.system.entity.SysPost; +import com.qiaoba.api.system.entity.param.SysPostParam; + +import java.util.List; + +/** + * 岗位对外暴露接口 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 20:33:43 + */ +public interface SysPostApiService { + + /** + * 新增岗位 + * + * @param sysPost sysPost + * @return > 0 = success + */ + int insert(SysPost sysPost); + + /** + * 更新岗位 + * + * @param sysPost sysPost + * @return > 0 = success + */ + int updateById(SysPost sysPost); + + /** + * 查询列表 + * + * @param param 条件 + * @return 岗位列表 + */ + List selectList(SysPostParam param); + + /** + * 查询详细 + * + * @param deptId 岗位Id + * @return 岗位信息 + */ + SysPost selectById(String deptId); + + /** + * 删除岗位 + * + * @param deptId 岗位Id + * @return > 0 = success + */ + int deleteById(String deptId); + + /** + * 批量删除岗位 + * + * @param ids 岗位Ids + * @return > 0 = success + */ + int deleteByIds(List ids); +} diff --git a/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysRoleApiService.java b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysRoleApiService.java new file mode 100644 index 0000000..ebc64c9 --- /dev/null +++ b/qiaoba-apis/qiaoba-api-system/src/main/java/com/qiaoba/api/system/service/SysRoleApiService.java @@ -0,0 +1,65 @@ +package com.qiaoba.api.system.service; + +import com.qiaoba.api.system.entity.SysRole; +import com.qiaoba.api.system.entity.dto.SysRoleDto; +import com.qiaoba.api.system.entity.param.SysRoleParam; + +import java.util.List; + +/** + * 角色对外暴露接口 + * + * @author ailanyin + * @version 1.0 + * @since 2023-04-23 20:33:43 + */ +public interface SysRoleApiService { + + /** + * 新增角色 + * + * @param roleDto roleDto + * @return > 0 = success + */ + int insert(SysRoleDto roleDto); + + /** + * 更新角色 + * + * @param roleDto roleDto + * @return > 0 = success + */ + int updateById(SysRoleDto roleDto); + + /** + * 查询列表 + * + * @param param 条件 + * @return 角色列表 + */ + List selectList(SysRoleParam param); + + /** + * 查询详细 + * + * @param roleId 角色Id + * @return 角色信息 + */ + SysRole selectById(String roleId); + + /** + * 删除角色 + * + * @param roleId 角色Id + * @return > 0 = success + */ + int deleteById(Long roleId); + + /** + * 批量删除 + * + * @param ids 角色ID列表 + * @return > 0 = success + */ + int deleteByIds(List ids); +} 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 92928fd..bb987a7 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 @@ -1,6 +1,14 @@ package com.qiaoba.api.system.service; import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.dto.ResetPwdDto; +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 java.util.List; +import java.util.Set; /** * 用户对外暴露接口 @@ -12,18 +20,62 @@ import com.qiaoba.api.system.entity.SysUser; public interface SysUserApiService { /** - * 新增用户 + * 新增或更新用户 * - * @param sysUser sysUser + * @param dto dto + * @param isUpdate 是->更新 * @return > 0 = success */ - int insert(SysUser sysUser); + int saveOrUpdate(SysUserDto dto, Boolean isUpdate); /** - * 更新租户 + * 查询用户 * - * @param sysUser sysUser - * @return > 0 = success + * @param userId userId + * @param hasPassword 是否需要密码 + * @return SysUser */ - int update(SysUser sysUser); + SysUser selectById(String userId, Boolean hasPassword); + + /** + * 重置密码 + * + * @param dto dto + * @return 结果 + */ + int resetPwd(ResetPwdDto dto); + + /** + * 更改用户状态 + * + * @param dto dto + * @return 结果 + */ + int updateUserStatus(ResetUserStatusDto dto); + + /** + * 批量删除 + * + * @param userIds userIds + * @param isSoftDelete 是否软删除 + * @return 结果 + */ + int deleteByIds(List userIds, Boolean isSoftDelete); + + /** + * 用户绑定角色 + * + * @param userId userId + * @param roleIds roleIds + * @param isUpdate 是否是更新操作 + */ + void handleUserRole(String userId, Set roleIds, boolean isUpdate); + + /** + * 查询用户列表 + * + * @param param 查询条件 + * @return list + */ + List selectVoList(SysUserParam param); } diff --git a/qiaoba-application/src/main/java/com/qiaoba/application/QiaoBaApplication.java b/qiaoba-application/src/main/java/com/qiaoba/application/QiaoBaApplication.java index 3c29c28..787bc7f 100644 --- a/qiaoba-application/src/main/java/com/qiaoba/application/QiaoBaApplication.java +++ b/qiaoba-application/src/main/java/com/qiaoba/application/QiaoBaApplication.java @@ -1,5 +1,7 @@ package com.qiaoba.application; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.api.system.entity.SysMenu; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/qiaoba-application/src/main/resources/application-dev.yml b/qiaoba-application/src/main/resources/application-dev.yml index 05c6ae3..2690cce 100644 --- a/qiaoba-application/src/main/resources/application-dev.yml +++ b/qiaoba-application/src/main/resources/application-dev.yml @@ -30,34 +30,15 @@ qiaoba: max: 20 is-use: false # 不使用该库 -qiaoba: - datasource: - master: - driver: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true - username: root - password: LpYN7LUoL?l0OSpR2 - pool: - init: 5 #连接池初始化大小 - min: 10 #最小空闲连接数 - max: 20 #最大连接数 - slaves: - - url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true - username: root - password: LpYN7LUoL?l0OSpR2 - weight: 2 - pool: - init: 5 - min: 10 - max: 20 - use: true - - url: jdbc:mysql://121.5.136.69:3306/qiaoba-boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true&allowMultiQueries=true - username: root - password: LpYN7LUoL?l0OSpR2 - weight: - pool: - init: 5 #连接池初始化大小 - min: 10 #最小空闲连接数 - max: 20 #最大连接数 - is-use: false +mybatis-plus: + configuration: + # 自动驼峰命名规则(camel case)映射 + mapUnderscoreToCamelCase: true + # MyBatis 自动映射策略 + # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 + autoMappingBehavior: PARTIAL + # MyBatis 自动映射时未知列或未知属性处理策 + # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 + autoMappingUnknownColumnBehavior: NONE + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/qiaoba-application/src/main/resources/application.yml b/qiaoba-application/src/main/resources/application.yml index 74efe31..ea168f1 100644 --- a/qiaoba-application/src/main/resources/application.yml +++ b/qiaoba-application/src/main/resources/application.yml @@ -1,5 +1,5 @@ server: - port: 80 + port: 8080 spring: main: allow-bean-definition-overriding: true #新创建的bean覆盖旧的bean @@ -36,4 +36,11 @@ knife4j: language: zh_cn enable-swagger-models: false enable-footer-custom: true - footer-custom-content: create by ailanyin \ No newline at end of file + footer-custom-content: create by ailanyin + +# mybatis-plus: + # 对应的 XML 文件位置 + # mapperLocations: classpath*:mapper/**/*Mapper.xml + # 实体扫描,多个package用逗号或者分号分隔 + # typeAliasesPackage: com.qiaoba.**.entity + diff --git a/qiaoba-commons/pom.xml b/qiaoba-commons/pom.xml index aea1807..73cfdd6 100644 --- a/qiaoba-commons/pom.xml +++ b/qiaoba-commons/pom.xml @@ -17,7 +17,9 @@ qiaoba-common-web qiaoba-common-doc qiaoba-common-redis + qiaoba-common-security + qiaoba-common-poi - \ No newline at end of file + diff --git a/qiaoba-commons/qiaoba-common-base/pom.xml b/qiaoba-commons/qiaoba-common-base/pom.xml index 230e3cc..68fd04f 100644 --- a/qiaoba-commons/qiaoba-common-base/pom.xml +++ b/qiaoba-commons/qiaoba-common-base/pom.xml @@ -11,5 +11,10 @@ qiaoba-common-base - - \ No newline at end of file + + + cn.hutool + hutool-all + + + diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/BaseConstant.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/BaseConstant.java index 3ee02f2..5b53377 100644 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/BaseConstant.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/constants/BaseConstant.java @@ -18,4 +18,14 @@ public class BaseConstant { * 默认的字符拼接/切割符号: ','(英文逗号) */ public static final String DEFAULT_SPLIT_STR = ","; + + /** + * 树的key的命名 + */ + public static final String TREE_KEY_NAME = "label"; + + /** + * 默认的父ID = 0 + */ + public static final String DEFAULT_PARENT_ID_VALUE = "0"; } diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/entity/BaseEntity.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/entity/BaseEntity.java index 790209c..6ba59ce 100644 --- a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/entity/BaseEntity.java +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/entity/BaseEntity.java @@ -48,6 +48,6 @@ public class BaseEntity implements Serializable { /** * 租户Id */ - private Long tenantId; + private String tenantId; } diff --git a/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/result/AjaxResult.java b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/result/AjaxResult.java new file mode 100644 index 0000000..751cddd --- /dev/null +++ b/qiaoba-commons/qiaoba-common-base/src/main/java/com/qiaoba/common/base/result/AjaxResult.java @@ -0,0 +1,167 @@ +package com.qiaoba.common.base.result; + + +import java.util.HashMap; + +/** + * 通用返回 + * + * @author ailanyin + * @version 1.0 + * @since 2021-08-31 + */ +public class AjaxResult extends HashMap { + + private static final long serialVersionUID = 1L; + + /** + * 状态码 + */ + public static final String CODE_TAG = "code"; + + /** + * 返回内容 + */ + public static final String MSG_TAG = "msg"; + + /** + * 数据对象 + */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + super.put(DATA_TAG, data); + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) { + return AjaxResult.success("操作成功" , data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) { + return new AjaxResult(200, msg, data); + } + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(String msg) { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult error(String msg, Object data) { + return new AjaxResult(500, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(int code, String msg) { + return new AjaxResult(code, msg, null); + } + + /** + * 方便链式调用 + * + * @param key 键 + * @param value 值 + * @return 数据对象 + */ + @Override + public AjaxResult put(String key, Object value) { + super.put(key, value); + return this; + } + + public static AjaxResult toAjax(int result) { + return result > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + public static AjaxResult rateLimit() { + return new AjaxResult(300, "您访问速度过快,系统繁忙!"); + } + + public static AjaxResult noPermissionResult(String uri) { + return new AjaxResult(401, "无 " + uri + " 路径访问权限"); + } + +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java index b5f4ee2..33542b9 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/DynamicDataSourceConfig.java @@ -12,11 +12,13 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import javax.annotation.Resource; import java.sql.SQLException; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** @@ -79,6 +81,18 @@ public class DynamicDataSourceConfig { } } + /** + * 程序关闭后,要释放数据源连接池 + */ + @PreDestroy + public void close() { + Set> entries = DATA_SOURCE_MAP.entrySet(); + for (Map.Entry entry : entries) { + DruidDataSource dataSource = (DruidDataSource) entry.getValue(); + dataSource.close(); + } + } + private void addDataSourceToMap(String name, Object dataSource) { if (Objects.nonNull(dataSource)) { DATA_SOURCE_MAP.put(name, dataSource); diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java new file mode 100644 index 0000000..37f669a --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/config/MybatisPlusConfig.java @@ -0,0 +1,39 @@ +package com.qiaoba.common.database.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; +import com.qiaoba.common.database.utils.TenantUtil; +import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.StringValue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author ailanyin + * @version 1.0 + * @since 2023/5/8 11:18 + */ +@Configuration +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() { + @Override + public Expression getTenantId() { + return new StringValue(TenantUtil.getTenantId()); + } + + @Override + public boolean ignoreTable(String tableName) { + return false; + } + })); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } + +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/PageQuery.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/PageQuery.java new file mode 100644 index 0000000..2e07a5b --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/PageQuery.java @@ -0,0 +1,68 @@ +package com.qiaoba.common.database.entity; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 分页查询实体类 + * + * @author Lion Li + */ + +@Data +public class PageQuery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 分页大小 + */ + private Integer pageSize; + + /** + * 当前页数 + */ + private Integer pageNum; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc; + + /** + * 当前记录起始索引 默认值 + */ + public static final int DEFAULT_PAGE_NUM = 1; + + /** + * 每页显示记录数 默认值 默认查全部 + */ + public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + + public Page build() { + Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); + Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); + if (pageNum <= 0) { + pageNum = DEFAULT_PAGE_NUM; + } + Page page = new Page<>(pageNum, pageSize); +/* List orderItems = buildOrderItem(); + if (CollUtil.isNotEmpty(orderItems)) { + page.addOrder(orderItems); + }*/ + return page; + } + +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/TableDataInfo.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/TableDataInfo.java new file mode 100644 index 0000000..a5953ec --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/entity/TableDataInfo.java @@ -0,0 +1,78 @@ +package com.qiaoba.common.database.entity; + +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class TableDataInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, long total) { + this.rows = list; + this.total = total; + } + + public static TableDataInfo build(IPage page) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + public static TableDataInfo build(List list) { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + public static TableDataInfo build() { + TableDataInfo rspData = new TableDataInfo<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/factories/DynamicDataSourceFactory.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/factories/DynamicDataSourceFactory.java index 4ec84bf..3f21982 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/factories/DynamicDataSourceFactory.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/factories/DynamicDataSourceFactory.java @@ -1,7 +1,11 @@ package com.qiaoba.common.database.factories; +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.qiaoba.common.database.config.DynamicDataSourceConfig; import com.qiaoba.common.database.config.DynamicDataSourceContext; +import com.qiaoba.common.database.config.MybatisPlusConfig; import com.qiaoba.common.database.filters.DynamicDataSourceFilter; import com.qiaoba.common.database.properties.DefaultDataSourceProperties; import org.springframework.context.annotation.Bean; @@ -36,4 +40,5 @@ public class DynamicDataSourceFactory { public DefaultDataSourceProperties defaultDataSourceProperties() { return new DefaultDataSourceProperties(); } + } diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java index 94f2bbc..37a6955 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/filters/DynamicDataSourceFilter.java @@ -1,6 +1,8 @@ package com.qiaoba.common.database.filters; import com.qiaoba.common.database.config.DynamicDataSourceContext; +import com.qiaoba.common.database.constants.DynamicDatasourceConstant; +import com.qiaoba.common.database.utils.TenantUtil; import com.qiaoba.common.web.utils.ResponseUtil; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -27,16 +29,12 @@ public class DynamicDataSourceFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - HttpServletRequest request = (HttpServletRequest) servletRequest; - String tenantCode = request.getParameter("tenant"); - if (!checkTenantInfo(tenantCode, servletResponse)) { - return; - } //设置当前租户对应的数据库 - dynamicDataSourceContext.setDataSource(tenantCode); - System.out.println("当前数据源是:" + dynamicDataSourceContext.getDataSource()); + dynamicDataSourceContext.setDataSource(DynamicDatasourceConstant.DEFAULT_MASTER_DATASOURCE_KEY); + TenantUtil.setTenantId("1"); filterChain.doFilter(servletRequest, servletResponse); dynamicDataSourceContext.clearDataSource(); + TenantUtil.clearTenantId(); } private boolean checkTenantInfo(String tenantCode, ServletResponse servletResponse) throws IOException { diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/TenantUtil.java b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/TenantUtil.java new file mode 100644 index 0000000..c72d3ff --- /dev/null +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/java/com/qiaoba/common/database/utils/TenantUtil.java @@ -0,0 +1,30 @@ +package com.qiaoba.common.database.utils; + +/** + * 租户工具类 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 12:57 + */ +public class TenantUtil { + + private static final ThreadLocal TENANT_ID_HOLDER = new ThreadLocal<>(); + + /** + * 获取登录用户的租户ID + * + * @return username + */ + public static String getTenantId() { + return TENANT_ID_HOLDER.get(); + } + + public static void clearTenantId() { + TENANT_ID_HOLDER.remove(); + } + + public static void setTenantId(String tenantId) { + TENANT_ID_HOLDER.set(tenantId); + } +} diff --git a/qiaoba-commons/qiaoba-common-datasource/src/main/resources/META-INF/spring.factories b/qiaoba-commons/qiaoba-common-datasource/src/main/resources/META-INF/spring.factories index 352d668..49807c2 100644 --- a/qiaoba-commons/qiaoba-common-datasource/src/main/resources/META-INF/spring.factories +++ b/qiaoba-commons/qiaoba-common-datasource/src/main/resources/META-INF/spring.factories @@ -1,4 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.qiaoba.common.database.factories.DynamicDataSourceFactory + com.qiaoba.common.database.factories.DynamicDataSourceFactory,\ + com.qiaoba.common.database.config.MybatisPlusConfig + - diff --git a/qiaoba-commons/qiaoba-common-poi/pom.xml b/qiaoba-commons/qiaoba-common-poi/pom.xml new file mode 100644 index 0000000..4569924 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-poi/pom.xml @@ -0,0 +1,27 @@ + + + + qiaoba-commons + com.qiaoba + 1.0 + + 4.0.0 + + qiaoba-common-poi + + + + + cn.afterturn + easypoi-spring-boot-starter + + + + javax.servlet + javax.servlet-api + + + + diff --git a/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/model/ExcelSetting.java b/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/model/ExcelSetting.java new file mode 100644 index 0000000..741978b --- /dev/null +++ b/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/model/ExcelSetting.java @@ -0,0 +1,39 @@ +package com.qiaoba.common.poi.model; + +import lombok.Data; + +import java.io.Serializable; + +/** + * Excel导出设置对象 + * + * @author ailanyin + * @version 1.0 + * @since 2021/10/25 0025 上午 9:15 + */ +@Data +public class ExcelSetting implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String EXCEL_FIELD_SHOW_FLAG = "1"; + + private Long id; + + private String className; + + private String fieldId; + + private String fieldName; + + private String width; + + private Integer sort; + + private String show; + + private String dateFormat; + + private String replace; + +} 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 new file mode 100644 index 0000000..ec2a681 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-poi/src/main/java/com/qiaoba/common/poi/utils/ExcelUtil.java @@ -0,0 +1,120 @@ +package com.qiaoba.common.poi.utils; + +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.common.poi.model.ExcelSetting; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.util.IOUtils; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.NoSuchElementException; + +/** + * Excel 工具类 + * + * @author ailanyin + * @version 1.0 + * @since 2021/10/25 0025 上午 9:15 + */ +public class ExcelUtil { + + + /** + * 默认导出 + * + * @param list 数据 + * @param pojoClass java类 + * @param fileName 文件名 + * @param response response + */ + public static void exportExcel(List list, Class pojoClass, String fileName, HttpServletResponse response) { + defaultExport(list, pojoClass, fileName, new ExportParams(fileName, fileName, ExcelType.XSSF), response); + } + + /** + * 自定义导出 + * + * @param list 数据 + * @param entities 字段设置 + * @param fileName 文件名 + * @param response response + */ + public static void exportExcel(List list, List entities, String fileName, HttpServletResponse response) { + exportBySettings(list, entities, fileName, new ExportParams(fileName, fileName, ExcelType.XSSF), response); + } + + private static void exportBySettings(List list, List entities, String fileName, ExportParams exportParams, HttpServletResponse response) { + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entities, list); + downLoadExcel(fileName, response, workbook); + } + + private static void defaultExport(List list, Class pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) { + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list); + downLoadExcel(fileName, response, workbook); + } + + 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")); + workbook.write(response.getOutputStream()); + IOUtils.closeQuietly(workbook); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static List importExcel(MultipartFile file, Class pojoClass) throws IOException { + return importExcel(file.getInputStream(), 1, 1, pojoClass); + } + + private static List importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, Class pojoClass) throws IOException { + if (inputStream == null) { + return null; + } + ImportParams params = new ImportParams(); + params.setTitleRows(titleRows); + params.setHeadRows(headerRows); + params.setSaveUrl("/excel/"); + try { + return ExcelImportUtil.importExcel(inputStream, pojoClass, params); + } catch (NoSuchElementException e) { + throw new IOException("excel文件不能为空"); + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + public static List createExcelEntry(List settings) { + List entities = new ArrayList<>(); + for (ExcelSetting setting : settings) { + // 去除隐藏 + if (!ExcelSetting.EXCEL_FIELD_SHOW_FLAG.equals(setting.getShow())) { + continue; + } + ExcelExportEntity entity = new ExcelExportEntity(setting.getFieldName(), setting.getFieldId()); + entity.setWidth(Double.valueOf(setting.getWidth())); + String replace = setting.getReplace(); + if (StrUtil.isNotBlank(replace) && replace.contains(",")) { + entity.setReplace(replace.split(",")); + } + entity.setFormat(setting.getDateFormat()); + entity.setOrderNum(setting.getSort()); + entities.add(entity); + } + return entities; + } + +} diff --git a/qiaoba-commons/qiaoba-common-security/pom.xml b/qiaoba-commons/qiaoba-common-security/pom.xml new file mode 100644 index 0000000..05c0f09 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-security/pom.xml @@ -0,0 +1,21 @@ + + + + qiaoba-commons + com.qiaoba + 1.0 + + 4.0.0 + + qiaoba-common-security + + + + com.qiaoba + qiaoba-common-web + + + + diff --git a/qiaoba-commons/qiaoba-common-security/src/main/java/com/qiaoba/common/security/utils/SecurityUtil.java b/qiaoba-commons/qiaoba-common-security/src/main/java/com/qiaoba/common/security/utils/SecurityUtil.java new file mode 100644 index 0000000..3833885 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-security/src/main/java/com/qiaoba/common/security/utils/SecurityUtil.java @@ -0,0 +1,30 @@ +package com.qiaoba.common.security.utils; + +/** + * SecurityUtil + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:22 + */ +public class SecurityUtil { + + /** + * 获取登录用户的账号 + * + * @return username + */ + public static String getLoginUsername() { + return "admin"; + } + + /** + * 获取登录用户的ID + * + * @return username + */ + public static String getLoginUserId() { + return "1L"; + } + +} diff --git a/qiaoba-commons/qiaoba-common-web/pom.xml b/qiaoba-commons/qiaoba-common-web/pom.xml index da92364..b7c2afc 100644 --- a/qiaoba-commons/qiaoba-common-web/pom.xml +++ b/qiaoba-commons/qiaoba-common-web/pom.xml @@ -13,12 +13,12 @@ - cn.hutool - hutool-all + com.qiaoba + qiaoba-common-base org.springframework.boot spring-boot-starter-web - \ No newline at end of file + diff --git a/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/advice/ExceptionAdvice.java b/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/advice/ExceptionAdvice.java new file mode 100644 index 0000000..87e4f05 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-web/src/main/java/com/qiaoba/common/web/advice/ExceptionAdvice.java @@ -0,0 +1,45 @@ +package com.qiaoba.common.web.advice; + + +import com.qiaoba.common.base.exceptions.ServiceException; +import com.qiaoba.common.base.result.AjaxResult; +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 ExceptionAdvice { + + /** + * 非自定义异常 + * + * @param e Exception + * @return AjaxResult + */ + @ExceptionHandler(value = Exception.class) + @ResponseBody + public AjaxResult error(Exception e) { + e.printStackTrace(); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义异常, 控制台不打印 + * + * @param e ServiceException + * @return AjaxResult + */ + @ExceptionHandler(ServiceException.class) + @ResponseBody + public AjaxResult handlerApiException(ServiceException e) { + return AjaxResult.error(e.getMessage()); + } + +} diff --git a/qiaoba-commons/qiaoba-common-web/src/main/resources/META-INF/spring.factories b/qiaoba-commons/qiaoba-common-web/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..8a372b1 --- /dev/null +++ b/qiaoba-commons/qiaoba-common-web/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.qiaoba.common.web.advice.ExceptionAdvice + + diff --git a/qiaoba-modules/pom.xml b/qiaoba-modules/pom.xml index e9807b2..00f40d1 100644 --- a/qiaoba-modules/pom.xml +++ b/qiaoba-modules/pom.xml @@ -16,5 +16,4 @@ qiaoba-module-job - - \ No newline at end of file + 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 new file mode 100644 index 0000000..89a7726 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysDeptController.java @@ -0,0 +1,68 @@ +package com.qiaoba.module.system.controller; + +import com.qiaoba.api.system.entity.SysDept; +import com.qiaoba.api.system.entity.param.SysDeptParam; +import com.qiaoba.common.base.result.AjaxResult; +import com.qiaoba.module.system.service.SysDeptService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门管理 Web层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:06 + */ +@RestController +@RequestMapping("/system/dept") +@RequiredArgsConstructor +public class SysDeptController { + + private final SysDeptService sysDeptService; + + //@PreAuthorize("hasAuthority('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(SysDeptParam param) { + return AjaxResult.success(sysDeptService.selectList(param)); + } + + //@PreAuthorize("hasAuthority('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) String deptId) { + return AjaxResult.success(sysDeptService.excludeChild(deptId)); + } + + //@PreAuthorize("hasAuthority('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) { + return AjaxResult.success(sysDeptService.selectById(deptId)); + } + + @GetMapping("/deptTree") + public AjaxResult deptTree(SysDeptParam param) { + List list = sysDeptService.selectList(param); + return AjaxResult.success(sysDeptService.buildDeptTree(list)); + } + + //@PreAuthorize("hasAuthority('system:dept:add')") + @PostMapping + public AjaxResult add(@Validated @RequestBody SysDept dept) { + return AjaxResult.toAjax(sysDeptService.insert(dept)); + } + + //@PreAuthorize("hasAuthority('system:dept:edit')") + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysDept dept) { + return AjaxResult.toAjax(sysDeptService.updateById(dept)); + } + + //@PreAuthorize("hasAuthority('system:dept:remove')") + @DeleteMapping("/{id}") + public AjaxResult remove(@PathVariable Long id) { + return AjaxResult.toAjax(sysDeptService.deleteById(id)); + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysLoginController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysLoginController.java new file mode 100644 index 0000000..26a5335 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysLoginController.java @@ -0,0 +1,31 @@ +package com.qiaoba.module.system.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 登录 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 9:43 + */ +@RestController +public class SysLoginController { + + @PostMapping("/login") + public String login() { + return "{\"msg\":\"操作成功\",\"code\":200,\"token\":\"eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjhhNjY4MGY1LTI0OTAtNDUyYi1hYzQ1LWE5YWI0MzQ0YTRlYyJ9.mTZr7TN1Jk2-_7zbeUbOBuHijVLiqY2QSbhcAIfWuX4oF22xGw_DpxOz3I2_-TLeYlJN4y2Gm1qmw6ricqCBqw\"}"; + } + + @GetMapping("/getInfo") + public String getInfo() { + return "{\"msg\":\"操作成功\",\"code\":200,\"permissions\":[\"*:*:*\"],\"roles\":[\"admin\"],\"user\":{\"createBy\":\"admin\",\"createTime\":\"2023-04-23 16:11:38\",\"updateBy\":null,\"updateTime\":null,\"remark\":\"管理员\",\"userId\":1,\"deptId\":103,\"userName\":\"admin\",\"nickName\":\"若依\",\"email\":\"ry@163.com\",\"phonenumber\":\"15888888888\",\"sex\":\"1\",\"avatar\":\"\",\"password\":\"$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2\",\"status\":\"0\",\"delFlag\":\"0\",\"loginIp\":\"27.154.23.192\",\"loginDate\":\"2023-05-05T09:45:24.000+08:00\",\"dept\":{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"deptId\":103,\"parentId\":101,\"ancestors\":\"0,100,101\",\"deptName\":\"研发部门\",\"orderNum\":1,\"leader\":\"若依\",\"phone\":null,\"email\":null,\"status\":\"0\",\"delFlag\":null,\"parentName\":null,\"children\":[]},\"roles\":[{\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"remark\":null,\"roleId\":1,\"roleName\":\"超级管理员\",\"roleKey\":\"admin\",\"roleSort\":1,\"dataScope\":\"1\",\"menuCheckStrictly\":false,\"deptCheckStrictly\":false,\"status\":\"0\",\"delFlag\":null,\"flag\":false,\"menuIds\":null,\"deptIds\":null,\"permissions\":null,\"admin\":true}],\"roleIds\":null,\"postIds\":null,\"roleId\":null,\"admin\":true}}"; + } + + @GetMapping("/getRouters") + public String getRouters() { + return "{\"msg\":\"操作成功\",\"code\":200,\"data\":[{\"name\":\"System\",\"path\":\"/system\",\"hidden\":false,\"redirect\":\"noRedirect\",\"component\":\"Layout\",\"alwaysShow\":true,\"meta\":{\"title\":\"系统管理\",\"icon\":\"system\",\"noCache\":false,\"link\":null},\"children\":[{\"name\":\"User\",\"path\":\"user\",\"hidden\":false,\"component\":\"system/user/index\",\"meta\":{\"title\":\"用户管理\",\"icon\":\"user\",\"noCache\":false,\"link\":null}},{\"name\":\"Role\",\"path\":\"role\",\"hidden\":false,\"component\":\"system/role/index\",\"meta\":{\"title\":\"角色管理\",\"icon\":\"peoples\",\"noCache\":false,\"link\":null}},{\"name\":\"Menu\",\"path\":\"menu\",\"hidden\":false,\"component\":\"system/menu/index\",\"meta\":{\"title\":\"菜单管理\",\"icon\":\"tree-table\",\"noCache\":false,\"link\":null}},{\"name\":\"Dept\",\"path\":\"dept\",\"hidden\":false,\"component\":\"system/dept/index\",\"meta\":{\"title\":\"部门管理\",\"icon\":\"tree\",\"noCache\":false,\"link\":null}},{\"name\":\"Post\",\"path\":\"post\",\"hidden\":false,\"component\":\"system/post/index\",\"meta\":{\"title\":\"岗位管理\",\"icon\":\"post\",\"noCache\":false,\"link\":null}},{\"name\":\"Dict\",\"path\":\"dict\",\"hidden\":false,\"component\":\"system/dict/index\",\"meta\":{\"title\":\"字典管理\",\"icon\":\"dict\",\"noCache\":false,\"link\":null}},{\"name\":\"Config\",\"path\":\"config\",\"hidden\":false,\"component\":\"system/config/index\",\"meta\":{\"title\":\"参数设置\",\"icon\":\"edit\",\"noCache\":false,\"link\":null}},{\"name\":\"Notice\",\"path\":\"notice\",\"hidden\":false,\"component\":\"system/notice/index\",\"meta\":{\"title\":\"通知公告\",\"icon\":\"message\",\"noCache\":false,\"link\":null}},{\"name\":\"Log\",\"path\":\"log\",\"hidden\":false,\"redirect\":\"noRedirect\",\"component\":\"ParentView\",\"alwaysShow\":true,\"meta\":{\"title\":\"日志管理\",\"icon\":\"log\",\"noCache\":false,\"link\":null},\"children\":[{\"name\":\"Operlog\",\"path\":\"operlog\",\"hidden\":false,\"component\":\"monitor/operlog/index\",\"meta\":{\"title\":\"操作日志\",\"icon\":\"form\",\"noCache\":false,\"link\":null}},{\"name\":\"Logininfor\",\"path\":\"logininfor\",\"hidden\":false,\"component\":\"monitor/logininfor/index\",\"meta\":{\"title\":\"登录日志\",\"icon\":\"logininfor\",\"noCache\":false,\"link\":null}}]}]},{\"name\":\"Monitor\",\"path\":\"/monitor\",\"hidden\":false,\"redirect\":\"noRedirect\",\"component\":\"Layout\",\"alwaysShow\":true,\"meta\":{\"title\":\"系统监控\",\"icon\":\"monitor\",\"noCache\":false,\"link\":null},\"children\":[{\"name\":\"Online\",\"path\":\"online\",\"hidden\":false,\"component\":\"monitor/online/index\",\"meta\":{\"title\":\"在线用户\",\"icon\":\"online\",\"noCache\":false,\"link\":null}},{\"name\":\"Job\",\"path\":\"job\",\"hidden\":false,\"component\":\"monitor/job/index\",\"meta\":{\"title\":\"定时任务\",\"icon\":\"job\",\"noCache\":false,\"link\":null}},{\"name\":\"Druid\",\"path\":\"druid\",\"hidden\":false,\"component\":\"monitor/druid/index\",\"meta\":{\"title\":\"数据监控\",\"icon\":\"druid\",\"noCache\":false,\"link\":null}},{\"name\":\"Server\",\"path\":\"server\",\"hidden\":false,\"component\":\"monitor/server/index\",\"meta\":{\"title\":\"服务监控\",\"icon\":\"server\",\"noCache\":false,\"link\":null}},{\"name\":\"Cache\",\"path\":\"cache\",\"hidden\":false,\"component\":\"monitor/cache/index\",\"meta\":{\"title\":\"缓存监控\",\"icon\":\"redis\",\"noCache\":false,\"link\":null}},{\"name\":\"CacheList\",\"path\":\"cacheList\",\"hidden\":false,\"component\":\"monitor/cache/list\",\"meta\":{\"title\":\"缓存列表\",\"icon\":\"redis-list\",\"noCache\":false,\"link\":null}}]},{\"name\":\"Tool\",\"path\":\"/tool\",\"hidden\":false,\"redirect\":\"noRedirect\",\"component\":\"Layout\",\"alwaysShow\":true,\"meta\":{\"title\":\"系统工具\",\"icon\":\"tool\",\"noCache\":false,\"link\":null},\"children\":[{\"name\":\"Build\",\"path\":\"build\",\"hidden\":false,\"component\":\"tool/build/index\",\"meta\":{\"title\":\"表单构建\",\"icon\":\"build\",\"noCache\":false,\"link\":null}},{\"name\":\"Gen\",\"path\":\"gen\",\"hidden\":false,\"component\":\"tool/gen/index\",\"meta\":{\"title\":\"代码生成\",\"icon\":\"code\",\"noCache\":false,\"link\":null}},{\"name\":\"Swagger\",\"path\":\"swagger\",\"hidden\":false,\"component\":\"tool/swagger/index\",\"meta\":{\"title\":\"系统接口\",\"icon\":\"swagger\",\"noCache\":false,\"link\":null}}]},{\"name\":\"Http://ruoyi.vip\",\"path\":\"http://ruoyi.vip\",\"hidden\":false,\"component\":\"Layout\",\"meta\":{\"title\":\"若依官网\",\"icon\":\"guide\",\"noCache\":false,\"link\":\"http://ruoyi.vip\"}}]}"; + } +} 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 new file mode 100644 index 0000000..c79ea63 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysMenuController.java @@ -0,0 +1,72 @@ +package com.qiaoba.module.system.controller; + +import com.qiaoba.api.system.entity.SysMenu; +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.common.security.utils.SecurityUtil; +import com.qiaoba.module.system.service.SysMenuService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单管理 Web层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 10:06 + */ +@RestController +@RequestMapping("/system/menu") +@RequiredArgsConstructor +public class SysMenuController { + + private final SysMenuService sysMenuService; + + @GetMapping("/list") + public AjaxResult list(SysMenuParam param) { + List menus = sysMenuService.selectVoList(param); + return AjaxResult.success(menus); + } + + //@PreAuthorize("hasAuthority('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable String menuId) { + return AjaxResult.success(sysMenuService.selectById(menuId)); + } + + //@PreAuthorize("hasAuthority('system:menu:add')") + @PostMapping + public AjaxResult add(@Validated @RequestBody SysMenu menu) { + return AjaxResult.toAjax(sysMenuService.insert(menu)); + } + + //@PreAuthorize("hasAuthority('system:menu:edit')") + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysMenu menu) { + return AjaxResult.toAjax(sysMenuService.updateById(menu)); + } + + //@PreAuthorize("hasAuthority('system:menu:remove')") + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") String menuId) { + return AjaxResult.toAjax(sysMenuService.deleteById(menuId)); + } + + @GetMapping("/tree_select") + public AjaxResult treeSelect(SysMenuParam param) { + List menus = sysMenuService.selectVoList(param); + return AjaxResult.success(sysMenuService.buildMenuTree(menus)); + } + + @GetMapping(value = "/role_menu_tree_select/{roleId}") + public AjaxResult roleMenuTreeSelect(@PathVariable("roleId") String roleId) { + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", sysMenuService.selectMenuIdsByRoleId(roleId)); + ajax.put("menus", sysMenuService.buildMenuTree(sysMenuService.selectVoList(new SysMenuParam()))); + return ajax; + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysPostController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysPostController.java new file mode 100644 index 0000000..aa52bed --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysPostController.java @@ -0,0 +1,90 @@ +package com.qiaoba.module.system.controller; + +import com.qiaoba.api.system.entity.SysPost; +import com.qiaoba.api.system.entity.param.SysPostParam; +import com.qiaoba.common.base.result.AjaxResult; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; +import com.qiaoba.common.poi.utils.ExcelUtil; +import com.qiaoba.module.system.service.SysPostService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 岗位管理 web层 + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@RestController +@RequestMapping("/system/post") +@RequiredArgsConstructor +public class SysPostController { + + private final SysPostService sysPostService; + + /** + * 获取岗位列表 + */ + @GetMapping("/list") + //@PreAuthorize("hasAuthority('system:post:list')") + public TableDataInfo list(SysPostParam param, PageQuery pageQuery) { + return sysPostService.selectPageList(param, pageQuery); + } + + @PostMapping("/export") + //@PreAuthorize("hasAuthority('system:post:export')") + public void export(HttpServletResponse response, SysPostParam param) { + List list = sysPostService.selectList(param); + ExcelUtil.exportExcel(list, SysPost.class, "岗位数据", response); + } + + /** + * 根据岗位编号获取详细信息 + */ + @GetMapping(value = "/{postId}") + //@PreAuthorize("hasAuthority('system:post:query')") + public AjaxResult getInfo(@PathVariable("postId") String postId) { + return AjaxResult.success(sysPostService.selectById(postId)); + } + + /** + * 新增岗位 + */ + @PostMapping + //@PreAuthorize("hasAuthority('system:post:add')") + public AjaxResult add(@RequestBody SysPost post) { + return AjaxResult.toAjax(sysPostService.insert(post)); + } + + /** + * 修改岗位 + */ + @PutMapping + //@PreAuthorize("hasAuthority('system:post:edit')") + public AjaxResult edit(@RequestBody SysPost post) { + return AjaxResult.toAjax(sysPostService.updateById(post)); + } + + /** + * 删除岗位 + */ + @DeleteMapping("/{ids}") + //@PreAuthorize("hasAuthority('system:post:remove')") + public AjaxResult remove(@PathVariable List ids) { + return AjaxResult.toAjax(sysPostService.deleteByIds(ids)); + } + + /** + * 获取岗位选择框列表 + */ +/* @GetMapping("/optionSelect") + public AjaxResult optionSelect() { + List posts = postService.selectPostAll(); + return AjaxResult.success(posts); + }*/ +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysRoleController.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysRoleController.java new file mode 100644 index 0000000..0d4abb1 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/controller/SysRoleController.java @@ -0,0 +1,66 @@ +package com.qiaoba.module.system.controller; + +import com.qiaoba.api.system.entity.SysRole; +import com.qiaoba.api.system.entity.dto.SysRoleDto; +import com.qiaoba.api.system.entity.param.SysRoleParam; +import com.qiaoba.common.base.result.AjaxResult; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; +import com.qiaoba.module.system.service.SysRoleService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 角色管理 web层 + * + * @author ailanyin + * @version 1.0 + * @since 2022-09-22 04:20:28 + */ +@RestController +@RequestMapping("/system/role") +@RequiredArgsConstructor +public class SysRoleController { + + private final SysRoleService sysRoleService; + + //@PreAuthorize("hasAuthority('system:role:list')") + @GetMapping("/list") + public TableDataInfo list(SysRoleParam param, PageQuery pageQuery) { + return sysRoleService.selectPageList(param, pageQuery); + } + + //@PreAuthorize("hasAuthority('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable String roleId) { + return AjaxResult.success(sysRoleService.selectById(roleId)); + } + + //@PreAuthorize("hasAuthority('system:role:add')") + @PostMapping + public AjaxResult add(@Validated @RequestBody SysRoleDto roleDto) { + return AjaxResult.toAjax(sysRoleService.insert(roleDto)); + + } + + //@PreAuthorize("hasAuthority('system:role:edit')") + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysRoleDto roleDto) { + return AjaxResult.toAjax(sysRoleService.updateById(roleDto)); + + } + //@PreAuthorize("hasAuthority('system:role:edit')") + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody SysRoleDto dto) { + return AjaxResult.toAjax(sysRoleService.updateById(dto)); + } + + //@PreAuthorize("hasAuthority('system:role:remove')") + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable List roleIds) { + return AjaxResult.toAjax(sysRoleService.deleteByIds(roleIds)); + } +} 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 c63841d..6193bc5 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 @@ -1,17 +1,30 @@ package com.qiaoba.module.system.controller; -import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import com.qiaoba.api.system.entity.SysRole; import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.dto.ResetPwdDto; +import com.qiaoba.api.system.entity.dto.ResetUserStatusDto; +import com.qiaoba.api.system.entity.dto.SysUserDto; +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.module.system.service.SysUserService; +import com.qiaoba.api.system.entity.vo.SysUserVo; +import com.qiaoba.common.base.enums.BaseEnum; +import com.qiaoba.common.base.result.AjaxResult; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; +import com.qiaoba.common.poi.utils.ExcelUtil; +import com.qiaoba.module.system.service.*; import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; /** * 用户管理 web层 @@ -23,27 +36,89 @@ import java.util.List; @RestController @RequestMapping("/system/user") @Tag(name = "用户管理") +@RequiredArgsConstructor public class SysUserController { - @Resource - private SysUserService baseService; + private final SysUserService sysUserService; + private final SysRoleService sysRoleService; + private final SysPostService sysPostService; + private final SysUserPostService sysUserPostService; + private final SysUserRoleService sysUserRoleService; - @GetMapping("/add") - public String add() { - SysUser sysUser = new SysUser(); - sysUser.setUsername(RandomUtil.randomString(8)); - sysUser.setNickname(RandomUtil.randomString(8)); - sysUser.setIsSuperuser(false); - sysUser.setIsDelete(true); - sysUser.setIsManager(true); - baseService.insert(sysUser); - return "OK"; + //@PreAuthorize("hasAuthority('system:user:add')") + @PostMapping + public AjaxResult add(@Validated @RequestBody SysUserDto dto) { + return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, false)); + } + + //@PreAuthorize("hasAuthority('system:user:edit')") + @PutMapping + public AjaxResult edit(@Validated @RequestBody SysUserDto dto) { + return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, true)); + } + + //@PreAuthorize("hasAuthority('system:user:resetPwd')") + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody ResetPwdDto dto) { + return AjaxResult.toAjax(sysUserService.resetPwd(dto)); + } + + //@PreAuthorize("hasAuthority('system:user:edit')") + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody ResetUserStatusDto dto) { + return AjaxResult.toAjax(sysUserService.updateUserStatus(dto)); + } + + //@PreAuthorize("hasAuthority('system:user:remove')") + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable List userIds) { + return AjaxResult.toAjax(sysUserService.deleteByIds(userIds, true)); } @GetMapping("/list") - public List list(@RequestParam String name) { - SysUserParam dto = new SysUserParam(); - dto.setNickname(name); - return baseService.selectList(dto); + public TableDataInfo list(SysUserParam param, PageQuery pageQuery) { + return sysUserService.selectVoPageList(param, pageQuery); + } + + //@PreAuthorize("hasAuthority('system:user:export')") + @PostMapping("/export") + public void export(HttpServletResponse response, SysUserParam param) { + List list = sysUserService.selectVoList(param); + ExcelUtil.exportExcel(list, SysUserVo.class, "用户数据", response); + } + + //@PreAuthorize("hasAuthority('system:user:query')") + @GetMapping(value = {"/", "/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) String userId) { + AjaxResult ajax = AjaxResult.success(); + List roles = sysRoleService.selectList(new SysRoleParam()); + ajax.put("roles", roles); + ajax.put("posts", sysPostService.selectList(new SysPostParam(BaseEnum.NORMAL.getCode()))); + if (StrUtil.isNotBlank(userId)) { + SysUser sysUser = sysUserService.selectById(userId, false); + ajax.put(AjaxResult.DATA_TAG, sysUser); + ajax.put("postIds", sysUserPostService.selectPostIdsByUserId(userId)); + ajax.put("roleIds", sysUserRoleService.selectRoleIdsByUserId(userId)); + } + return ajax; + } + + //@PreAuthorize("hasAuthority('system:user:query')") + @GetMapping("/authRole/{userId}") + public AjaxResult authRole(@PathVariable("userId") String userId) { + AjaxResult ajax = AjaxResult.success(); + SysUser user = sysUserService.selectById(userId, false); + List roles = sysRoleService.selectList(new SysRoleParam()); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("hasRoleIds", sysUserRoleService.selectRoleIdsByUserId(userId)); + return ajax; + } + + //@PreAuthorize("hasAuthority('system:user:edit')") + @PutMapping("/authRole") + public AjaxResult handleUserRole(String userId, String[] roleIds) { + sysUserService.handleUserRole(userId, Arrays.stream(roleIds).collect(Collectors.toSet()), true); + return AjaxResult.success(); } } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysDeptMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysDeptMapper.java new file mode 100644 index 0000000..85ca038 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysDeptMapper.java @@ -0,0 +1,25 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysDept; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:03 + */ +public interface SysDeptMapper extends BaseMapper { + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + int checkDeptNameUnique(SysDept dept); + +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java new file mode 100644 index 0000000..61f7e4e --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysMenuMapper.java @@ -0,0 +1,33 @@ +package com.qiaoba.module.system.mapper; + +import com.qiaoba.api.system.entity.SysMenu; +import com.qiaoba.api.system.entity.vo.SysMenuVo; +import com.qiaoba.common.database.mapper.BaseMapperPlus; + +import java.util.List; + +/** + * 菜单管理 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 11:36 + */ +public interface SysMenuMapper extends BaseMapperPlus { + + /** + * 校验菜单名称是否唯一 + * + * @param sysMenu 菜单 + * @return count + */ + int checkMenuNameUnique(SysMenu sysMenu); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单ID列表 + */ + List selectMenuIdsByRoleId(String roleId); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysPostMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysPostMapper.java new file mode 100644 index 0000000..cac5ee0 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysPostMapper.java @@ -0,0 +1,31 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysPost; + +/** + * 岗位管理 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:03 + */ +public interface SysPostMapper extends BaseMapper { + + /** + * 校验岗位名称 + * + * @param sysPost 岗位名称 + * @return 结果 + */ + int checkPostNameUnique(SysPost sysPost); + + /** + * 校验岗位编码 + * + * @param sysPost 岗位编码 + * @return 结果 + */ + int checkPostCodeUnique(SysPost sysPost); + +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMapper.java new file mode 100644 index 0000000..a86f93f --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMapper.java @@ -0,0 +1,31 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysRole; + +/** + * 角色管理 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:03 + */ +public interface SysRoleMapper extends BaseMapper { + + /** + * 校验角色名称是否唯一 + * + * @param role role + * @return count + */ + int checkRoleNameUnique(SysRole role); + + /** + * 校验角色权限是否唯一 + * + * @param role role + * @return count + */ + int checkRoleKeyUnique(SysRole role); + +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMenuMapper.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..b909318 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysRoleMenuMapper.java @@ -0,0 +1,24 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysRoleMenu; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 角色菜单关联 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysRoleMenuMapper extends BaseMapper { + + /** + * 通过角色ID批量删除角色和菜单的绑定关系 + * + * @param ids 角色ids + */ + void deleteByRoleIds(@Param("list") List ids); +} 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 566b372..707c17f 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 @@ -1,7 +1,13 @@ package com.qiaoba.module.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.param.SysUserParam; +import com.qiaoba.api.system.entity.vo.SysUserVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 用户管理 数据层 @@ -11,4 +17,54 @@ import com.qiaoba.api.system.entity.SysUser; * @since 2023-04-23 20:38:55 */ public interface SysUserMapper extends BaseMapper { + + /** + * 校验用户名是否唯一 + * + * @param sysUser sysUser + * @return count + */ + int checkUsernameUnique(SysUser sysUser); + + /** + * 校验手机号码是否唯一 + * + * @param sysUser sysUser + * @return count + */ + int checkPhoneUnique(SysUser sysUser); + + /** + * 校验email是否唯一 + * + * @param sysUser sysUser + * @return count + */ + int checkEmailUnique(SysUser sysUser); + + /** + * 更新删除状态 + * + * @param userIds userIds + * @param status status + * @return 结果 + */ + int updateUserDeleteStatus(@Param("list") List userIds, String status); + + /** + * 分页查询用户列表 + * + * @param page 分页信息 + * @param param 查询条件 + * @return list + */ + Page selectVoPageList(Page page, @Param("param") SysUserParam param); + + /** + * 查询用户列表 + * + * @param param 查询条件 + * @return list + */ + List selectVoList(@Param("param") SysUserParam param); } 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 new file mode 100644 index 0000000..b69a8ee --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserPostMapper.java @@ -0,0 +1,23 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysUserPost; + +import java.util.List; + +/** + * 用户岗位关联 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysUserPostMapper extends BaseMapper { + /** + * 通过userId查询所绑定的岗位ID列表 + * + * @param userId userId + * @return postIds + */ + List selectPostIdsByUserId(String userId); +} 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 new file mode 100644 index 0000000..f017773 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/mapper/SysUserRoleMapper.java @@ -0,0 +1,24 @@ +package com.qiaoba.module.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qiaoba.api.system.entity.SysUserRole; + +import java.util.List; + +/** + * 用户角色关联 数据层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysUserRoleMapper extends BaseMapper { + + /** + * 通过userId查询所绑定的角色ID列表 + * + * @param userId userId + * @return roleIds + */ + List selectRoleIdsByUserId(String userId); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysDeptService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysDeptService.java new file mode 100644 index 0000000..db8671e --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysDeptService.java @@ -0,0 +1,33 @@ +package com.qiaoba.module.system.service; + +import cn.hutool.core.lang.tree.Tree; +import com.qiaoba.api.system.entity.SysDept; +import com.qiaoba.api.system.service.SysDeptApiService; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:02 + */ +public interface SysDeptService extends SysDeptApiService { + + /** + * 查询部门列表(排除节点) + * + * @param deptId deptId + * @return list + */ + List excludeChild(String deptId); + + /** + * 构建前端所需要下拉树结构 + * + * @param list 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTree(List list); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java new file mode 100644 index 0000000..d124c63 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysMenuService.java @@ -0,0 +1,34 @@ +package com.qiaoba.module.system.service; + +import cn.hutool.core.lang.tree.Tree; +import com.qiaoba.api.system.entity.vo.SysMenuVo; +import com.qiaoba.api.system.service.SysMenuApiService; + +import java.util.List; + +/** + * 菜单管理 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 11:30 + */ +public interface SysMenuService extends SysMenuApiService { + + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTree(List menus); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单ID列表 + */ + List selectMenuIdsByRoleId(String roleId); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysPostService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysPostService.java new file mode 100644 index 0000000..1ca6ac9 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysPostService.java @@ -0,0 +1,29 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.api.system.entity.SysPost; +import com.qiaoba.api.system.entity.SysRole; +import com.qiaoba.api.system.entity.param.SysPostParam; +import com.qiaoba.api.system.entity.param.SysRoleParam; +import com.qiaoba.api.system.service.SysPostApiService; +import com.qiaoba.api.system.service.SysRoleApiService; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; + +/** + * 岗位管理 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 16:57 + */ +public interface SysPostService extends SysPostApiService { + + /** + * 分页查询岗位列表 + * + * @param param param + * @param pageQuery pageQuery + * @return list + */ + TableDataInfo selectPageList(SysPostParam param, PageQuery pageQuery); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleMenuService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleMenuService.java new file mode 100644 index 0000000..f532903 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleMenuService.java @@ -0,0 +1,29 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.api.system.entity.SysRoleMenu; + +import java.util.List; + +/** + * 角色菜单关联 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysRoleMenuService { + + /** + * 批量新增 + * + * @param list list + */ + void insertBatch(List list); + + /** + * 通过角色ID批量删除角色和菜单的绑定关系 + * + * @param ids 角色ids + */ + void deleteByRoleIds(List ids); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleService.java new file mode 100644 index 0000000..4cf26fa --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysRoleService.java @@ -0,0 +1,26 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.api.system.entity.SysRole; +import com.qiaoba.api.system.entity.param.SysRoleParam; +import com.qiaoba.api.system.service.SysRoleApiService; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; + +/** + * 角色管理 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 16:57 + */ +public interface SysRoleService extends SysRoleApiService { + + /** + * 分页查询角色列表 + * + * @param param param + * @param pageQuery pageQuery + * @return list + */ + TableDataInfo selectPageList(SysRoleParam param, PageQuery pageQuery); +} 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 new file mode 100644 index 0000000..ac2138e --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserPostService.java @@ -0,0 +1,37 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.api.system.entity.SysUserPost; + +import java.util.List; + +/** + * 用户岗位关联 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysUserPostService { + + /** + * 批量新增 + * + * @param list list + */ + void insertBatch(List list); + + /** + * 通过userId删除 + * + * @param userId userId + */ + void deleteByUserId(String userId); + + /** + * 通过userId查询所绑定的岗位ID列表 + * + * @param userId userId + * @return postIds + */ + List selectPostIdsByUserId(String userId); +} 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 new file mode 100644 index 0000000..2958e5d --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserRoleService.java @@ -0,0 +1,37 @@ +package com.qiaoba.module.system.service; + +import com.qiaoba.api.system.entity.SysUserRole; + +import java.util.List; + +/** + * 用户角色关联 服务层 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 9:50 + */ +public interface SysUserRoleService { + + /** + * 批量新增 + * + * @param list list + */ + void insertBatch(List list); + + /** + * 通过userId批量删除 + * + * @param userId userId + */ + void deleteByUserId(String userId); + + /** + * 通过userId查询所绑定的角色ID列表 + * + * @param userId userId + * @return roleIds + */ + List selectRoleIdsByUserId(String userId); +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserService.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserService.java index 2f4c05f..18abd13 100644 --- a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserService.java +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/SysUserService.java @@ -1,8 +1,12 @@ package com.qiaoba.module.system.service; import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.dto.ResetPwdDto; import com.qiaoba.api.system.entity.param.SysUserParam; +import com.qiaoba.api.system.entity.vo.SysUserVo; import com.qiaoba.api.system.service.SysUserApiService; +import com.qiaoba.common.database.entity.PageQuery; +import com.qiaoba.common.database.entity.TableDataInfo; import java.util.List; @@ -22,4 +26,23 @@ public interface SysUserService extends SysUserApiService { * @return list */ List selectList(SysUserParam sysUserParam); + + /** + * 条件分页查询列表 + * + * @param param 查询参数 + * @param pageQuery 分页参数 + * @return list + */ + TableDataInfo selectPageList(SysUserParam param, PageQuery pageQuery); + + /** + * 分页查询用户列表 + * + * @param pageQuery 分页信息 + * @param param 查询条件 + * @return list + */ + TableDataInfo selectVoPageList(SysUserParam param, PageQuery pageQuery); + } diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysDeptServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..da3ff77 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,162 @@ +package com.qiaoba.module.system.service.impl; + +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.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.qiaoba.api.system.entity.SysDept; +import com.qiaoba.api.system.entity.param.SysDeptParam; +import com.qiaoba.common.base.constants.BaseConstant; +import com.qiaoba.common.base.enums.BaseEnum; +import com.qiaoba.common.base.exceptions.ServiceException; +import com.qiaoba.common.security.utils.SecurityUtil; +import com.qiaoba.module.system.mapper.SysDeptMapper; +import com.qiaoba.module.system.service.SysDeptService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * 部门管理 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 15:02 + */ +@Service +@RequiredArgsConstructor +public class SysDeptServiceImpl implements SysDeptService { + + private final SysDeptMapper sysDeptMapper; + + @Override + public int insert(SysDept sysDept) { + if (checkDeptNameNotUnique(sysDept)) { + throw new ServiceException("同级下部门名称不允许重复!"); + } + sysDept.setCreateTime(new Date()); + sysDept.setCreateUser(SecurityUtil.getLoginUsername()); + if (Objects.isNull(sysDept.getParentId()) || BaseConstant.DEFAULT_PARENT_ID_VALUE.equals(sysDept.getParentId())) { + return sysDeptMapper.insert(sysDept); + } + SysDept info = sysDeptMapper.selectById(sysDept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (BaseEnum.ABNORMAL.getCode().equals(info.getStatus())) { + throw new ServiceException("上级部门停用,不允许新增"); + } + sysDept.setAncestors(info.getAncestors() + BaseConstant.DEFAULT_SPLIT_STR + sysDept.getParentId()); + return sysDeptMapper.insert(sysDept); + } + + @Override + public int updateById(SysDept sysDept) { + if (checkDeptNameNotUnique(sysDept)) { + throw new ServiceException("同级下部门名称不允许重复!"); + } + sysDept.setUpdateTime(new Date()); + sysDept.setUpdateUser(SecurityUtil.getLoginUsername()); + SysDept newParentDept = sysDeptMapper.selectById(sysDept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (Objects.nonNull(newParentDept) && BaseEnum.ABNORMAL.getCode().equals(newParentDept.getStatus())) { + throw new ServiceException("上级部门停用,不允许插入"); + } + SysDept oldDept = sysDeptMapper.selectById(sysDept.getDeptId()); + if (Objects.nonNull(newParentDept) && Objects.nonNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + BaseConstant.DEFAULT_SPLIT_STR + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + sysDept.setAncestors(newAncestors); + updateDeptChildren(sysDept.getDeptId(), newAncestors, oldAncestors); + } + return sysDeptMapper.updateById(sysDept); + } + + @Override + public List selectList(SysDeptParam param) { + return sysDeptMapper.selectList(param2Wrapper(param)); + } + + @Override + public SysDept selectById(Long deptId) { + return sysDeptMapper.selectById(deptId); + } + + @Override + public int deleteById(Long deptId) { + return sysDeptMapper.deleteById(deptId); + } + + @Override + public List excludeChild(String deptId) { + List deptList = selectList(new SysDeptParam()); + deptList.removeIf(dept -> dept.getDeptId().equals(deptId) + || StrUtil.split(dept.getAncestors(), BaseConstant.DEFAULT_SPLIT_STR).contains(deptId)); + return deptList; + } + + @Override + public List> buildDeptTree(List list) { + if (CollUtil.isEmpty(list)) { + return CollUtil.newArrayList(); + } + TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG.setNameKey(BaseConstant.TREE_KEY_NAME); + return TreeUtil.build(list, BaseConstant.DEFAULT_PARENT_ID_VALUE, config, (dept, tree) -> + tree.setId(dept.getDeptId()) + .setParentId(dept.getParentId()) + .setName(dept.getDeptName()) + .setWeight(dept.getOrderNum())); + } + + private QueryWrapper param2Wrapper(SysDeptParam param) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .orderByAsc(SysDept::getOrderNum) + .like(StrUtil.isNotBlank(param.getDeptName()), SysDept::getDeptName, param.getDeptName()) + .eq(StrUtil.isNotBlank(param.getStatus()), SysDept::getStatus, param.getStatus()); + return wrapper; + } + + private boolean checkDeptNameNotUnique(SysDept dept) { + return sysDeptMapper.checkDeptNameUnique(dept) > 0; + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateDeptChildren(String deptId, String newAncestors, String oldAncestors) { + List children = selectChildrenDeptById(deptId); + if (CollUtil.isEmpty(children)) { + return; + } + for (SysDept child : children) { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + } + List list = new ArrayList<>(); + for (SysDept child : children) { + SysDept dept = new SysDept(); + dept.setDeptId(child.getDeptId()); + dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(dept); + } + if (CollUtil.isEmpty(list)) { + return; + } + Db.updateBatchById(list); + } + + private List selectChildrenDeptById(String deptId) { + List deptList = selectList(new SysDeptParam()); + deptList.removeIf(dept -> !StrUtil.split(dept.getAncestors(), BaseConstant.DEFAULT_SPLIT_STR).contains(deptId)); + return deptList; + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..c46f9cd --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,93 @@ +package com.qiaoba.module.system.service.impl; + +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.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qiaoba.api.system.entity.SysMenu; +import com.qiaoba.api.system.entity.param.SysMenuParam; +import com.qiaoba.api.system.entity.vo.SysMenuVo; +import com.qiaoba.common.base.constants.BaseConstant; +import com.qiaoba.common.base.exceptions.ServiceException; +import com.qiaoba.module.system.mapper.SysMenuMapper; +import com.qiaoba.module.system.service.SysMenuService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 菜单管理 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/5 11:30 + */ +@Service +@RequiredArgsConstructor +public class SysMenuServiceImpl implements SysMenuService { + + private final SysMenuMapper sysMenuMapper; + + @Override + public int insert(SysMenu sysMenu) { + if (checkMenuNameNotUnique(sysMenu)) { + throw new ServiceException("同级下菜单名称不允许重复!"); + } + sysMenu.setCreateTime(new Date()); + return sysMenuMapper.insert(sysMenu); + } + + @Override + public int updateById(SysMenu sysMenu) { + if (checkMenuNameNotUnique(sysMenu)) { + throw new ServiceException("同级下菜单名称不允许重复!"); + } + return sysMenuMapper.updateById(sysMenu); + } + + @Override + public List selectVoList(SysMenuParam param) { + return sysMenuMapper.selectVoList(param2Wrapper((param))); + } + + @Override + public SysMenu selectById(String menuId) { + return sysMenuMapper.selectById(menuId); + } + + @Override + public int deleteById(String menuId) { + return sysMenuMapper.deleteById(menuId); + } + + private QueryWrapper param2Wrapper(SysMenuParam param) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .orderByAsc(SysMenu::getOrderNum) + .eq(StrUtil.isNotBlank(param.getIsVisible()), SysMenu::getIsVisible, param.getIsVisible()) + .like(StrUtil.isNotBlank(param.getMenuName()), SysMenu::getMenuName, param.getMenuName()); + return wrapper; + } + + @Override + public List> buildMenuTree(List menus) { + TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG.setNameKey(BaseConstant.TREE_KEY_NAME); + return TreeUtil.build(menus, BaseConstant.DEFAULT_PARENT_ID_VALUE, config, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + @Override + public List selectMenuIdsByRoleId(String roleId) { + return sysMenuMapper.selectMenuIdsByRoleId(roleId); + } + + private boolean checkMenuNameNotUnique(SysMenu menu) { + return sysMenuMapper.checkMenuNameUnique(menu) > 0; + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysPostServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysPostServiceImpl.java new file mode 100644 index 0000000..56b69db --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysPostServiceImpl.java @@ -0,0 +1,106 @@ +package com.qiaoba.module.system.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qiaoba.api.system.entity.SysPost; +import com.qiaoba.api.system.entity.param.SysPostParam; +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.security.utils.SecurityUtil; +import com.qiaoba.module.system.mapper.SysPostMapper; +import com.qiaoba.module.system.service.SysPostService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; + +/** + * 岗位管理 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 16:09 + */ +@Service +@RequiredArgsConstructor +public class SysPostServiceImpl implements SysPostService { + + private final SysPostMapper sysPostMapper; + + @Override + public TableDataInfo selectPageList(SysPostParam param, PageQuery pageQuery) { + return TableDataInfo.build(sysPostMapper.selectPage(pageQuery.build(), param2Wrapper(param))); + } + + @Override + public int insert(SysPost sysPost) { + checkPostNameUnique(sysPost); + checkPostCodeUnique(sysPost); + sysPost.setCreateUser(SecurityUtil.getLoginUsername()); + sysPost.setCreateTime(new Date()); + return sysPostMapper.insert(sysPost); + } + + @Override + public int updateById(SysPost sysPost) { + checkPostNameUnique(sysPost); + checkPostCodeUnique(sysPost); + sysPost.setUpdateUser(SecurityUtil.getLoginUsername()); + sysPost.setUpdateTime(new Date()); + return sysPostMapper.updateById(sysPost); + } + + @Override + public List selectList(SysPostParam param) { + return sysPostMapper.selectList(param2Wrapper(param)); + } + + @Override + public SysPost selectById(String deptId) { + return sysPostMapper.selectById(deptId); + } + + @Override + public int deleteById(String deptId) { + return sysPostMapper.deleteById(deptId); + } + + @Override + public int deleteByIds(List ids) { + return sysPostMapper.deleteBatchIds(ids); + } + + private QueryWrapper param2Wrapper(SysPostParam param) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .orderByAsc(SysPost::getPostSort) + .like(StrUtil.isNotBlank(param.getPostName()), SysPost::getPostName, param.getPostName()) + .like(StrUtil.isNotBlank(param.getPostCode()), SysPost::getPostCode, param.getPostCode()) + .eq(StrUtil.isNotBlank(param.getStatus()), SysPost::getStatus, param.getStatus()); + return wrapper; + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + */ + private void checkPostNameUnique(SysPost post) { + if (sysPostMapper.checkPostNameUnique(post) > 0) { + throw new ServiceException(StrUtil.format("处理岗位'{}'失败,岗位名称已存在", post.getPostName())); + } + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + */ + private void checkPostCodeUnique(SysPost post) { + if (sysPostMapper.checkPostCodeUnique(post) > 0) { + throw new ServiceException(StrUtil.format("处理岗位'{}'失败,岗位编码已存在", post.getPostName())); + } + } +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleMenuServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..d40ea05 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,35 @@ +package com.qiaoba.module.system.service.impl; + +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.qiaoba.api.system.entity.SysRoleMenu; +import com.qiaoba.module.system.mapper.SysRoleMenuMapper; +import com.qiaoba.module.system.service.SysRoleMenuService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 角色菜单关联 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/9 10:08 + */ +@Service +@RequiredArgsConstructor +public class SysRoleMenuServiceImpl implements SysRoleMenuService { + + private final SysRoleMenuMapper sysRoleMenuMapper; + + @Override + public void insertBatch(List list) { + Db.saveBatch(list); + } + + @Override + public void deleteByRoleIds(List ids) { + sysRoleMenuMapper.deleteByRoleIds(ids); + } + +} diff --git a/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..4f26c57 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,137 @@ +package com.qiaoba.module.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.qiaoba.api.system.entity.SysRole; +import com.qiaoba.api.system.entity.SysRoleMenu; +import com.qiaoba.api.system.entity.dto.SysRoleDto; +import com.qiaoba.api.system.entity.param.SysRoleParam; +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.security.utils.SecurityUtil; +import com.qiaoba.module.system.mapper.SysRoleMapper; +import com.qiaoba.module.system.service.SysRoleMenuService; +import com.qiaoba.module.system.service.SysRoleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + * 角色管理 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/6 16:58 + */ +@Service +@RequiredArgsConstructor +public class SysRoleServiceImpl implements SysRoleService { + + private final SysRoleMapper sysRoleMapper; + private final SysRoleMenuService sysRoleMenuService; + + @Override + @Transactional(rollbackFor = Exception.class) + public int insert(SysRoleDto roleDto) { + SysRole sysRole = BeanUtil.copyProperties(roleDto, SysRole.class); + sysRole.setCreateUser(SecurityUtil.getLoginUsername()); + sysRole.setCreateTime(new Date()); + + checkAllowAddOrUpdate(sysRole); + int row = sysRoleMapper.insert(sysRole); + insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds()); + return row; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateById(SysRoleDto roleDto) { + SysRole sysRole = BeanUtil.copyProperties(roleDto, SysRole.class); + sysRoleMenuService.deleteByRoleIds(CollUtil.toList(sysRole.getRoleId())); + insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds()); + return sysRoleMapper.updateById(sysRole); + } + + @Override + public List selectList(SysRoleParam param) { + return sysRoleMapper.selectList(param2Wrapper(param)); + } + + @Override + public SysRole selectById(String roleId) { + return sysRoleMapper.selectById(roleId); + } + + @Override + public int deleteById(Long roleId) { + return 0; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteByIds(List ids) { + sysRoleMenuService.deleteByRoleIds(ids); + return sysRoleMapper.deleteBatchIds(ids); + } + + private QueryWrapper param2Wrapper(SysRoleParam param) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .orderByAsc(SysRole::getRoleSort) + .like(StrUtil.isNotBlank(param.getRoleName()), SysRole::getRoleName, param.getRoleName()); + return wrapper; + } + + @Override + public TableDataInfo selectPageList(SysRoleParam param, PageQuery pageQuery) { + return TableDataInfo.build(sysRoleMapper.selectPage(pageQuery.build(), param2Wrapper(param))); + } + + private void checkAllowAddOrUpdate(SysRole role) { + if (!checkRoleNameUnique(role)) { + throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色名称已存在", role.getRoleName())); + } + if (!checkRoleKeyUnique(role)) { + throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色权限已存在", role.getRoleName())); + } + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + private boolean checkRoleNameUnique(SysRole role) { + return sysRoleMapper.checkRoleNameUnique(role) == 0; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + private boolean checkRoleKeyUnique(SysRole role) { + return sysRoleMapper.checkRoleKeyUnique(role) == 0; + } + + private void insertRoleMenu(String roleId, Set menuIds) { + if (CollUtil.isEmpty(menuIds)) { + return; + } + List list = new ArrayList<>(); + for (String menuId : menuIds) { + list.add(new SysRoleMenu(roleId, menuId)); + } + sysRoleMenuService.insertBatch(list); + } +} 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 new file mode 100644 index 0000000..40142c6 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserPostServiceImpl.java @@ -0,0 +1,47 @@ +package com.qiaoba.module.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.qiaoba.api.system.entity.SysUserPost; +import com.qiaoba.module.system.mapper.SysUserPostMapper; +import com.qiaoba.module.system.service.SysUserPostService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户岗位关联 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/10 13:03 + */ +@Service +@RequiredArgsConstructor +public class SysUserPostServiceImpl implements SysUserPostService { + + private final SysUserPostMapper sysUserPostMapper; + + @Override + public void insertBatch(List list) { + Db.saveBatch(list); + } + + @Override + public void deleteByUserId(String userId) { + sysUserPostMapper.delete(createWrapper(userId)); + } + + @Override + public List selectPostIdsByUserId(String userId) { + return sysUserPostMapper.selectPostIdsByUserId(userId); + } + + private QueryWrapper createWrapper(String userId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .eq(SysUserPost::getUserId, userId); + return wrapper; + } +} 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 new file mode 100644 index 0000000..943f041 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/java/com/qiaoba/module/system/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,47 @@ +package com.qiaoba.module.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.qiaoba.api.system.entity.SysUserRole; +import com.qiaoba.module.system.mapper.SysUserRoleMapper; +import com.qiaoba.module.system.service.SysUserRoleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 用户角色关联 服务层实现 + * + * @author ailanyin + * @version 1.0 + * @since 2023/5/10 13:03 + */ +@Service +@RequiredArgsConstructor +public class SysUserRoleServiceImpl implements SysUserRoleService { + + private final SysUserRoleMapper sysUserRoleMapper; + + @Override + public void insertBatch(List list) { + Db.saveBatch(list); + } + + @Override + public void deleteByUserId(String userId) { + sysUserRoleMapper.delete(createWrapper(userId)); + } + + @Override + public List selectRoleIdsByUserId(String userId) { + return sysUserRoleMapper.selectRoleIdsByUserId(userId); + } + + private QueryWrapper createWrapper(String userId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda() + .eq(SysUserRole::getUserId, userId); + return wrapper; + } +} 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 c5eaded..c66f428 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 @@ -1,15 +1,31 @@ package com.qiaoba.module.system.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.qiaoba.api.system.entity.SysUser; +import com.qiaoba.api.system.entity.SysUserPost; +import com.qiaoba.api.system.entity.SysUserRole; +import com.qiaoba.api.system.entity.dto.ResetPwdDto; +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.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.security.utils.SecurityUtil; import com.qiaoba.module.system.mapper.SysUserMapper; +import com.qiaoba.module.system.service.SysUserPostService; +import com.qiaoba.module.system.service.SysUserRoleService; import com.qiaoba.module.system.service.SysUserService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.util.List; +import java.util.*; /** * 用户管理 服务层实现 @@ -19,29 +35,186 @@ import java.util.List; * @since 2023-04-23 20:38:09 */ @Service +@RequiredArgsConstructor public class SysUserServiceImpl implements SysUserService { - @Resource - private SysUserMapper baseMapper; + private final SysUserMapper sysUserMapper; + private final SysUserPostService sysUserPostService; + private final SysUserRoleService sysUserRoleService; @Override - public int insert(SysUser sysUser) { - return baseMapper.insert(sysUser); + public int saveOrUpdate(SysUserDto dto, Boolean isUpdate) { + int result = 0; + SysUser sysUser = dtoToSysUser(dto, isUpdate); + // 检验是否已存在 + checkAddOrUpdate(sysUser); + if (isUpdate) { + // 更新sysUser + result = sysUserMapper.updateById(sysUser); + } else { + // 插入sysUser + result = sysUserMapper.insert(sysUser); + } + // 处理角色 + handleUserRole(sysUser.getUserId(), dto.getRoleIds(), isUpdate); + // 处理岗位 + handleUserPost(sysUser.getUserId(), dto.getPostIds(), isUpdate); + return result; } @Override - public int update(SysUser sysUser) { - return baseMapper.updateById(sysUser); + public SysUser selectById(String userId, Boolean hasPassword) { + SysUser sysUser = sysUserMapper.selectById(userId); + if (Objects.nonNull(sysUser) && !hasPassword) { + sysUser.setPassword(null); + } + return sysUser; + } + + @Override + public int resetPwd(ResetPwdDto dto) { + // todo 加密密码 + dto.setPassword("123456"); + SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class); + return sysUserMapper.updateById(sysUser); + } + + @Override + public int updateUserStatus(ResetUserStatusDto dto) { + SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class); + return sysUserMapper.updateById(sysUser); + } + + @Override + public int deleteByIds(List userIds, Boolean isSoftDelete) { + if (isSoftDelete) { + return sysUserMapper.updateUserDeleteStatus(userIds, BaseEnum.YES.getCode()); + } + return sysUserMapper.deleteBatchIds(userIds); } @Override public List selectList(SysUserParam sysUserParam) { - return baseMapper.selectList(param2Wrapper(sysUserParam)); + return sysUserMapper.selectList(param2Wrapper(sysUserParam)); + } + + @Override + public TableDataInfo selectPageList(SysUserParam param, PageQuery pageQuery) { + return TableDataInfo.build(sysUserMapper.selectPage(pageQuery.build(), param2Wrapper(param))); + } + + @Override + public TableDataInfo selectVoPageList(SysUserParam param, PageQuery pageQuery) { + Page page = sysUserMapper.selectVoPageList(pageQuery.build(), param); + return TableDataInfo.build(page); + } + + @Override + public void handleUserRole(String userId, Set roleIds, boolean isUpdate) { + if (isUpdate) { + sysUserRoleService.deleteByUserId(userId); + } + if (CollUtil.isEmpty(roleIds)) { + return; + } + List list = new ArrayList<>(); + for (String role : roleIds) { + list.add(new SysUserRole(userId, role)); + } + sysUserRoleService.insertBatch(list); + } + + @Override + public List selectVoList(SysUserParam param) { + return sysUserMapper.selectVoList(param); } private QueryWrapper param2Wrapper(SysUserParam sysUserParam) { QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda().like(StrUtil.isNotBlank(sysUserParam.getNickname()), SysUser::getNickname, sysUserParam.getNickname()); + 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()) + .like(StrUtil.isNotBlank(sysUserParam.getNickname()), SysUser::getNickname, sysUserParam.getNickname()) + .like(StrUtil.isNotBlank(sysUserParam.getPhone()), SysUser::getPhone, sysUserParam.getPhone()); return wrapper; } + + private SysUser dtoToSysUser(SysUserDto dto, Boolean isUpdate) { + if (StrUtil.isNotBlank(dto.getPassword())) { + // todo 加密密码 + dto.setPassword("123456"); + } + SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class); + if (isUpdate) { + sysUser.setUpdateTime(new Date()); + sysUser.setUpdateUser(SecurityUtil.getLoginUsername()); + } else { + sysUser.setCreateTime(new Date()); + sysUser.setCreateUser(SecurityUtil.getLoginUsername()); + } + return sysUser; + } + + private void checkAddOrUpdate(SysUser sysUser) { + if (checkUsernameNotUnique(sysUser)) { + throw new ServiceException(StrUtil.format("新增或修改用户'{}'失败,登录账号已存在", sysUser.getUsername())); + } + if (StrUtil.isNotBlank(sysUser.getPhone()) && checkPhoneNotUnique(sysUser)) { + throw new ServiceException(StrUtil.format("新增或修改用户'{}'失败,手机号已存在", sysUser.getUsername())); + } + if (StrUtil.isNotBlank(sysUser.getEmail()) && checkEmailNotUnique(sysUser)) { + throw new ServiceException(StrUtil.format("新增或修改用户'{}'失败,邮箱号已存在", sysUser.getUsername())); + } + } + + /** + * 校验用户名称是否唯一 + * + * @param sysUser 用户信息 + * @return 结果 + */ + private boolean checkUsernameNotUnique(SysUser sysUser) { + return sysUserMapper.checkUsernameUnique(sysUser) > 0; + } + + /** + * 校验手机号码是否唯一 + * + * @param sysUser 用户信息 + * @return 结果 + */ + private boolean checkPhoneNotUnique(SysUser sysUser) { + return sysUserMapper.checkPhoneUnique(sysUser) > 0; + } + + /** + * 校验email是否唯一 + * + * @param sysUser 用户信息 + * @return 结果 + */ + private boolean checkEmailNotUnique(SysUser sysUser) { + return sysUserMapper.checkEmailUnique(sysUser) > 0; + + } + + private void handleUserPost(String userId, Set postIds, boolean isUpdate) { + if (isUpdate) { + sysUserPostService.deleteByUserId(userId); + } + if (CollUtil.isEmpty(postIds)) { + return; + } + List list = new ArrayList<>(); + for (String postId : postIds) { + list.add(new SysUserPost(userId, postId)); + } + sysUserPostService.insertBatch(list); + } + + } 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 new file mode 100644 index 0000000..54ddd33 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysDeptMapper.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysMenuMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysMenuMapper.xml new file mode 100644 index 0000000..e3aaecd --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysMenuMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysPostMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysPostMapper.xml new file mode 100644 index 0000000..5406bb3 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysPostMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMapper.xml new file mode 100644 index 0000000..4dd3d4f --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMenuMapper.xml b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..11c5794 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + delete from sys_role_menu where role_id in + + #{roleId} + + + 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 new file mode 100644 index 0000000..27f2a55 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserMapper.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + SELECT u.user_id,u.dept_id,u.username,u.nickname,u.gender,u.phone,u.status,u.email,u.create_time,t2.dept_name + 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} + + + + + + + + + + + + + + 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 new file mode 100644 index 0000000..602dcf5 --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserPostMapper.xml @@ -0,0 +1,10 @@ + + + + + + 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 new file mode 100644 index 0000000..ae117bb --- /dev/null +++ b/qiaoba-modules/qiaoba-module-system/src/main/resources/mapper/SysUserRoleMapper.xml @@ -0,0 +1,11 @@ + + + + + + +