This commit is contained in:
2023-05-17 17:28:31 +08:00
parent a161a83023
commit 9be00db5e4
34 changed files with 422 additions and 177 deletions

View File

@ -34,6 +34,7 @@ public class SysDept extends BaseEntity {
/** /**
* 父部门ID * 父部门ID
*/ */
@NotBlank(message = "parentId不能为空")
private String parentId; private String parentId;
/** /**
@ -44,7 +45,8 @@ public class SysDept extends BaseEntity {
/** /**
* 部门名称 * 部门名称
*/ */
@Size(min = 1, max = 20, message = "部门名称允许长度: {min}-{max}") @NotBlank(message = "部门名称不能为空")
@Size(max = 20, message = "部门名称最大长度: {max}")
private String deptName; private String deptName;
/** /**
@ -57,16 +59,19 @@ public class SysDept extends BaseEntity {
/** /**
* 负责人 * 负责人
*/ */
@Size(max = 20, message = "负责人名称过长")
private String leader; private String leader;
/** /**
* 联系电话 * 联系电话
*/ */
@Size(max = 20, message = "手机号过长")
private String phone; private String phone;
/** /**
* 邮箱 * 邮箱
*/ */
@Size(max = 30, message = "邮箱号过长")
private String email; private String email;
/** /**

View File

@ -33,12 +33,14 @@ public class SysPost extends BaseEntity {
@Excel(name = "岗位名称", width = 20) @Excel(name = "岗位名称", width = 20)
@Schema(description = "岗位名称") @Schema(description = "岗位名称")
@Size(min = 1, max = 20, message = "岗位名称允许长度: {min}-{max}") @NotBlank(message = "岗位名称不能为空")
@Size(max = 20, message = "岗位名称最大长度: {max}")
private String postName; private String postName;
@Excel(name = "岗位编码", width = 20) @Excel(name = "岗位编码", width = 20)
@Schema(description = "岗位编码") @Schema(description = "岗位编码")
@Size(min = 1, max = 20, message = "岗位编码允许长度: {min}-{max}") @NotBlank(message = "岗位编码不能为空")
@Size(max = 20, message = "岗位编码最大长度: {max}")
private String postCode; private String postCode;
@Excel(name = "岗位排序", width = 20) @Excel(name = "岗位排序", width = 20)

View File

@ -1,5 +1,6 @@
package com.qiaoba.api.system.entity; package com.qiaoba.api.system.entity;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.qiaoba.common.base.entity.BaseEntity; import com.qiaoba.common.base.entity.BaseEntity;
@ -20,35 +21,23 @@ public class SysRole extends BaseEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
@TableId @TableId
@Excel(name = "岗位序号", width = 20)
private String roleId; private String roleId;
/** @Excel(name = "岗位序号", width = 20)
* 角色名称
*/
private String roleName; private String roleName;
/** @Excel(name = "岗位序号", width = 20)
* 角色权限
*/
private String roleKey; private String roleKey;
/** @Excel(name = "岗位序号", width = 20)
* 角色排序 private Integer roleSort;
*/
private String roleSort;
/** @Excel(name = "数据范围" , width = 20, replace = {"所有数据权限_1" , "自定义数据权限_2" , "本部门数据权限_3" , "本部门及以下数据权限_4" , "仅本人数据权限_5"})
* 数据范围1所有数据权限2自定义数据权限3本部门数据权限4本部门及以下数据权限5仅本人数据权限
*/
private String dataScope; private String dataScope;
/** @Excel(name = "状态", width = 20, replace = {"正常_1", "禁用_0"})
* 角色状态1正常 0停用
*/
private String status; private String status;
} }

View File

@ -1,5 +1,6 @@
package com.qiaoba.api.system.entity.dto; package com.qiaoba.api.system.entity.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -19,49 +20,28 @@ public class SysRoleDto implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** @Schema(description = "角色ID")
* 角色ID
*/
private String roleId; private String roleId;
/** @Schema(description = "角色名称")
* 租户ID
*/
private String tenantId;
/**
* 角色名称
*/
private String roleName; private String roleName;
/** @Schema(description = "权限字符")
* 角色权限
*/
private String roleKey; private String roleKey;
/** @Schema(description = "角色排序")
* 角色排序 private Integer roleSort;
*/
private String roleSort;
/** @Schema(description = "备注")
* 备注
*/
private String remark; private String remark;
/** @Schema(description = "状态(0->禁用,1->正常)")
* 角色状态1正常 0停用
*/
private String status; private String status;
/** @Schema(description = "部门组(数据权限)")
* 部门组(数据权限)
*/
private Set<String> deptIds; private Set<String> deptIds;
/** @Schema(description = "菜单组")
* 菜单组
*/
private Set<String> menuIds; private Set<String> menuIds;
} }

View File

@ -19,13 +19,18 @@ public class SysRoleParam implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Schema(description = "角色名称")
private String roleName; private String roleName;
@Schema(description = "权限字符")
private String roleKey; private String roleKey;
@Schema(description = "状态(0->禁用,1->正常)")
private String status; private String status;
@Schema(description = "开始时间")
private String beginTime; private String beginTime;
@Schema(description = "结束时间")
private String endTime; private String endTime;
} }

View File

@ -1,6 +1,5 @@
package com.qiaoba.api.system.entity.vo; package com.qiaoba.api.system.entity.vo;
import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -20,30 +19,22 @@ public class SysUserVo implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Excel(name = "用户ID", width = 25)
private String userId; private String userId;
@Excel(name = "登录账号", width = 20)
private String username; private String username;
@Excel(name = "姓名", width = 20)
private String nickname; private String nickname;
@Excel(name = "部门", width = 20)
private String deptName; private String deptName;
@Excel(name = "性别", replace = {"男_0", "女_1", "未知_2"})
private String gender; private String gender;
@Excel(name = "手机", width = 20)
private String phone; private String phone;
@Excel(name = "邮箱", width = 20)
private String email; private String email;
@Excel(name = "创建时间", width = 30, format = "yyyy-MM-dd HH:mm:ss") private String status;
private Date createTime; private Date createTime;
@Excel(name = "状态", replace = {"正常_1", "停用_0"})
private String status;
} }

View File

@ -55,13 +55,6 @@ public interface SysDeptApiService {
*/ */
int deleteById(String deptId); int deleteById(String deptId);
/**
* 构建前端部门树
*
* @return tree
*/
List<Tree<String>> selectDeptTree();
/** /**
* 根据角色ID查询部门树信息 * 根据角色ID查询部门树信息
* *

View File

@ -54,7 +54,7 @@ public interface SysRoleApiService {
* @param roleId 角色Id * @param roleId 角色Id
* @return > 0 = success * @return > 0 = success
*/ */
int deleteById(Long roleId); int deleteById(String roleId);
/** /**
* 批量删除 * 批量删除
@ -72,4 +72,12 @@ public interface SysRoleApiService {
*/ */
int authDataScope(DataScopeDto dto); int authDataScope(DataScopeDto dto);
/**
* 更改状态
*
* @param roleId roleId
* @param status status
* @return 结果
*/
int changeStatus(String roleId, String status);
} }

View File

@ -79,12 +79,5 @@ public interface SysUserApiService {
*/ */
void handleUserRole(String userId, Set<String> roleIds, boolean isUpdate); void handleUserRole(String userId, Set<String> roleIds, boolean isUpdate);
/**
* 查询用户列表
*
* @param param 查询条件
* @return list
*/
List<SysUserVo> selectVoList(SysUserParam param);
} }

View File

@ -45,9 +45,4 @@ public class BaseEntity implements Serializable {
*/ */
private String remark; private String remark;
/**
* 租户Id
*/
private String tenantId;
} }

View File

@ -49,13 +49,21 @@ public class SysDeptController {
return AjaxResult.success(sysDeptService.selectById(deptId)); return AjaxResult.success(sysDeptService.selectById(deptId));
} }
@GetMapping("/deptTree") @GetMapping("/dept-tree")
@Operation(summary = "构建部门树") @Operation(summary = "构建部门树")
public AjaxResult deptTree(SysDeptParam param) { public AjaxResult deptTree(SysDeptParam param) {
List<SysDept> list = sysDeptService.selectList(param); List<SysDept> list = sysDeptService.selectList(param);
return AjaxResult.success(sysDeptService.buildDeptTree(list)); return AjaxResult.success(sysDeptService.buildDeptTree(list));
} }
@GetMapping(value = "/dept-tree/{roleId}")
public AjaxResult deptTree(@PathVariable("roleId") String roleId, SysDeptParam param) {
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", sysDeptService.selectDeptIdsByRoleId(roleId));
ajax.put("depts", sysDeptService.buildDeptTree(sysDeptService.selectList(param)));
return ajax;
}
@PreAuthorize("hasAuthority('system:dept:add')") @PreAuthorize("hasAuthority('system:dept:add')")
@PostMapping @PostMapping
@Operation(summary = "新增部门") @Operation(summary = "新增部门")

View File

@ -61,8 +61,4 @@ public class SysLoginController {
//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\"}}]}"; //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\"}}]}";
} }
@PostMapping("/logout")
public AjaxResult logout() {
return AjaxResult.success();
}
} }

View File

@ -6,6 +6,7 @@ import com.qiaoba.api.system.entity.vo.SysMenuVo;
import com.qiaoba.common.base.result.AjaxResult; import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.module.system.service.SysMenuService; import com.qiaoba.module.system.service.SysMenuService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -31,25 +32,25 @@ public class SysMenuController {
return AjaxResult.success(menus); return AjaxResult.success(menus);
} }
//@PreAuthorize("hasAuthority('system:menu:query')") @PreAuthorize("hasAuthority('system:menu:query')")
@GetMapping(value = "/{menuId}") @GetMapping(value = "/{menuId}")
public AjaxResult getInfo(@PathVariable String menuId) { public AjaxResult getInfo(@PathVariable String menuId) {
return AjaxResult.success(sysMenuService.selectById(menuId)); return AjaxResult.success(sysMenuService.selectById(menuId));
} }
//@PreAuthorize("hasAuthority('system:menu:add')") @PreAuthorize("hasAuthority('system:menu:add')")
@PostMapping @PostMapping
public AjaxResult add(@Validated @RequestBody SysMenu menu) { public AjaxResult add(@Validated @RequestBody SysMenu menu) {
return AjaxResult.toAjax(sysMenuService.insert(menu)); return AjaxResult.toAjax(sysMenuService.insert(menu));
} }
//@PreAuthorize("hasAuthority('system:menu:edit')") @PreAuthorize("hasAuthority('system:menu:edit')")
@PutMapping @PutMapping
public AjaxResult edit(@Validated @RequestBody SysMenu menu) { public AjaxResult edit(@Validated @RequestBody SysMenu menu) {
return AjaxResult.toAjax(sysMenuService.updateById(menu)); return AjaxResult.toAjax(sysMenuService.updateById(menu));
} }
//@PreAuthorize("hasAuthority('system:menu:remove')") @PreAuthorize("hasAuthority('system:menu:remove')")
@DeleteMapping("/{menuId}") @DeleteMapping("/{menuId}")
public AjaxResult remove(@PathVariable("menuId") String menuId) { public AjaxResult remove(@PathVariable("menuId") String menuId) {
return AjaxResult.toAjax(sysMenuService.deleteById(menuId)); return AjaxResult.toAjax(sysMenuService.deleteById(menuId));

View File

@ -8,14 +8,18 @@ import com.qiaoba.api.system.entity.param.SysUserParam;
import com.qiaoba.common.base.result.AjaxResult; import com.qiaoba.common.base.result.AjaxResult;
import com.qiaoba.common.database.entity.PageQuery; import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo; import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.system.service.SysDeptService; import com.qiaoba.common.poi.utils.ExcelUtil;
import com.qiaoba.module.system.service.SysRoleService; import com.qiaoba.module.system.service.SysRoleService;
import com.qiaoba.module.system.service.SysUserRoleService; import com.qiaoba.module.system.service.SysUserRoleService;
import com.qiaoba.module.system.service.SysUserService; import com.qiaoba.module.system.service.SysUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
/** /**
@ -28,93 +32,97 @@ import java.util.List;
@RestController @RestController
@RequestMapping("/system/role") @RequestMapping("/system/role")
@RequiredArgsConstructor @RequiredArgsConstructor
@Tag(name = "角色管理")
public class SysRoleController { public class SysRoleController {
private final SysRoleService sysRoleService; private final SysRoleService sysRoleService;
private final SysDeptService sysDeptService;
private final SysUserService sysUserService; private final SysUserService sysUserService;
private final SysUserRoleService sysUserRoleService; private final SysUserRoleService sysUserRoleService;
//@PreAuthorize("hasAuthority('system:role:list')") @PreAuthorize("hasAuthority('system:role:list')")
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "获取列表")
public TableDataInfo<SysRole> list(SysRoleParam param, PageQuery pageQuery) { public TableDataInfo<SysRole> list(SysRoleParam param, PageQuery pageQuery) {
return sysRoleService.selectPageList(param, pageQuery); return sysRoleService.selectPageList(param, pageQuery);
} }
//@PreAuthorize("hasAuthority('system:role:query')") @PreAuthorize("hasAuthority('system:role:export')")
@PostMapping("/export")
@Operation(summary = "导出列表")
public void export(HttpServletResponse response, SysRoleParam param) throws Exception {
List<SysRole> list = sysRoleService.selectList(param);
ExcelUtil.exportExcel(list, SysRole.class, "角色数据", response);
}
@PreAuthorize("hasAuthority('system:role:query')")
@GetMapping(value = "/{roleId}") @GetMapping(value = "/{roleId}")
@Operation(summary = "获取详情")
public AjaxResult getInfo(@PathVariable String roleId) { public AjaxResult getInfo(@PathVariable String roleId) {
return AjaxResult.success(sysRoleService.selectById(roleId)); return AjaxResult.success(sysRoleService.selectById(roleId));
} }
//@PreAuthorize("hasAuthority('system:role:add')") @PreAuthorize("hasAuthority('system:role:add')")
@PostMapping @PostMapping
@Operation(summary = "添加角色")
public AjaxResult add(@Validated @RequestBody SysRoleDto roleDto) { public AjaxResult add(@Validated @RequestBody SysRoleDto roleDto) {
return AjaxResult.toAjax(sysRoleService.insert(roleDto)); return AjaxResult.toAjax(sysRoleService.insert(roleDto));
} }
//@PreAuthorize("hasAuthority('system:role:edit')") @PreAuthorize("hasAuthority('system:role:edit')")
@PutMapping @PutMapping
@Operation(summary = "修改角色")
public AjaxResult edit(@Validated @RequestBody SysRoleDto roleDto) { public AjaxResult edit(@Validated @RequestBody SysRoleDto roleDto) {
return AjaxResult.toAjax(sysRoleService.updateById(roleDto)); return AjaxResult.toAjax(sysRoleService.updateById(roleDto));
} }
//@PreAuthorize("hasAuthority('system:role:edit')") @PreAuthorize("hasAuthority('system:role:edit')")
@PutMapping("/changeStatus") @PutMapping("/changeStatus")
@Operation(summary = "更改状态")
public AjaxResult changeStatus(@RequestBody SysRoleDto dto) { public AjaxResult changeStatus(@RequestBody SysRoleDto dto) {
return AjaxResult.toAjax(sysRoleService.updateById(dto)); return AjaxResult.toAjax(sysRoleService.changeStatus(dto.getRoleId(), dto.getStatus()));
} }
//@PreAuthorize("hasAuthority('system:role:remove')") @PreAuthorize("hasAuthority('system:role:remove')")
@DeleteMapping("/{roleIds}") @DeleteMapping("/{roleIds}")
@Operation(summary = "删除角色")
public AjaxResult remove(@PathVariable List<String> roleIds) { public AjaxResult remove(@PathVariable List<String> roleIds) {
return AjaxResult.toAjax(sysRoleService.deleteByIds(roleIds)); return AjaxResult.toAjax(sysRoleService.deleteByIds(roleIds));
} }
//@PreAuthorize("hasAuthority('system:role:query')") @PreAuthorize("hasAuthority('system:role:edit')")
@GetMapping(value = "/deptTree/{roleId}")
public AjaxResult deptTree(@PathVariable("roleId") String roleId) {
AjaxResult ajax = AjaxResult.success();
ajax.put("checkedKeys", sysDeptService.selectDeptIdsByRoleId(roleId));
ajax.put("depts", sysDeptService.selectDeptTree());
return ajax;
}
//@PreAuthorize("hasAuthority('system:role:edit')")
@PutMapping("/dataScope") @PutMapping("/dataScope")
@Operation(summary = "数据权限")
public AjaxResult dataScope(@RequestBody DataScopeDto dto) { public AjaxResult dataScope(@RequestBody DataScopeDto dto) {
return AjaxResult.toAjax(sysRoleService.authDataScope(dto)); return AjaxResult.toAjax(sysRoleService.authDataScope(dto));
} }
//@PreAuthorize("hasAuthority('system:role:list')") @PreAuthorize("hasAuthority('system:role:list')")
@GetMapping("/authUser/allocatedList") @GetMapping("/authUser/allocatedList")
@Operation(summary = "已绑定用户")
public TableDataInfo allocatedList(SysUserParam param, PageQuery pageQuery) { public TableDataInfo allocatedList(SysUserParam param, PageQuery pageQuery) {
return sysUserService.selectAllocatedList(param, pageQuery); return sysUserService.selectAllocatedList(param, pageQuery);
} }
//@PreAuthorize("hasAuthority('system:role:edit')") @PreAuthorize("hasAuthority('system:role:edit')")
@PutMapping("/authUser/cancel") @PutMapping("/authUser/cancel")
@Operation(summary = "解绑用户")
public AjaxResult cancelAuthUser(@RequestParam("roleId") String roleId, @RequestParam("userIds") List<String> userIds) { public AjaxResult cancelAuthUser(@RequestParam("roleId") String roleId, @RequestParam("userIds") List<String> userIds) {
sysUserRoleService.deleteByRoleIdAndUserIds(roleId, userIds); sysUserRoleService.deleteByRoleIdAndUserIds(roleId, userIds);
return AjaxResult.success(); return AjaxResult.success();
} }
/** @PreAuthorize("hasAuthority('system:role:list')")
* 查询未分配用户角色列表
*/
//@PreAuthorize("hasAuthority('system:role:list')")
@GetMapping("/authUser/unallocatedList") @GetMapping("/authUser/unallocatedList")
@Operation(summary = "未绑定用户")
public TableDataInfo unallocatedList(SysUserParam param, PageQuery pageQuery) { public TableDataInfo unallocatedList(SysUserParam param, PageQuery pageQuery) {
return sysUserService.selectUnAllocatedList(param, pageQuery); return sysUserService.selectUnAllocatedList(param, pageQuery);
} }
/** @PreAuthorize("hasAuthority('system:role:edit')")
* 批量选择用户授权
*/
//@PreAuthorize("hasAuthority('system:role:edit')")
@PutMapping("/authUser/insert") @PutMapping("/authUser/insert")
@Operation(summary = "绑定用户")
public AjaxResult insertAuthUsers(@RequestParam("roleId") String roleId, @RequestParam("userIds") List<String> userIds) { public AjaxResult insertAuthUsers(@RequestParam("roleId") String roleId, @RequestParam("userIds") List<String> userIds) {
sysUserRoleService.insertAuthUsers(roleId, userIds); sysUserRoleService.insertAuthUsers(roleId, userIds);
return AjaxResult.success(); return AjaxResult.success();

View File

@ -16,8 +16,11 @@ import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo; import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.common.poi.utils.ExcelUtil; import com.qiaoba.common.poi.utils.ExcelUtil;
import com.qiaoba.module.system.service.*; import com.qiaoba.module.system.service.*;
import com.qiaoba.module.system.templates.SysUserExport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -45,50 +48,50 @@ public class SysUserController {
private final SysUserPostService sysUserPostService; private final SysUserPostService sysUserPostService;
private final SysUserRoleService sysUserRoleService; private final SysUserRoleService sysUserRoleService;
//@PreAuthorize("hasAuthority('system:user:add')") @PreAuthorize("hasAuthority('system:user:add')")
@PostMapping @PostMapping
@Operation(summary = "新增用户")
public AjaxResult add(@Validated @RequestBody SysUserDto dto) { public AjaxResult add(@Validated @RequestBody SysUserDto dto) {
return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, false)); return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, false));
} }
//@PreAuthorize("hasAuthority('system:user:edit')") @PreAuthorize("hasAuthority('system:user:edit')")
@PutMapping @PutMapping
@Operation(summary = "修改用户")
public AjaxResult edit(@Validated @RequestBody SysUserDto dto) { public AjaxResult edit(@Validated @RequestBody SysUserDto dto) {
return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, true)); return AjaxResult.toAjax(sysUserService.saveOrUpdate(dto, true));
} }
//@PreAuthorize("hasAuthority('system:user:resetPwd')") @PreAuthorize("hasAuthority('system:user:resetPwd')")
@PutMapping("/resetPwd") @PutMapping("/resetPwd")
@Operation(summary = "重置密码")
public AjaxResult resetPwd(@RequestBody ResetPwdDto dto) { public AjaxResult resetPwd(@RequestBody ResetPwdDto dto) {
return AjaxResult.toAjax(sysUserService.resetPwd(dto)); return AjaxResult.toAjax(sysUserService.resetPwd(dto));
} }
//@PreAuthorize("hasAuthority('system:user:edit')") @PreAuthorize("hasAuthority('system:user:edit')")
@PutMapping("/changeStatus") @PutMapping("/changeStatus")
@Operation(summary = "更改状态")
public AjaxResult changeStatus(@RequestBody ResetUserStatusDto dto) { public AjaxResult changeStatus(@RequestBody ResetUserStatusDto dto) {
return AjaxResult.toAjax(sysUserService.updateUserStatus(dto)); return AjaxResult.toAjax(sysUserService.updateUserStatus(dto));
} }
//@PreAuthorize("hasAuthority('system:user:remove')") @PreAuthorize("hasAuthority('system:user:remove')")
@DeleteMapping("/{userIds}") @DeleteMapping("/{userIds}")
@Operation(summary = "删除用户")
public AjaxResult remove(@PathVariable List<String> userIds) { public AjaxResult remove(@PathVariable List<String> userIds) {
return AjaxResult.toAjax(sysUserService.deleteByIds(userIds, true)); return AjaxResult.toAjax(sysUserService.deleteByIds(userIds, true));
} }
@GetMapping("/list") @GetMapping("/list")
@Operation(summary = "分页查询")
public TableDataInfo<SysUserVo> list(SysUserParam param, PageQuery pageQuery) { public TableDataInfo<SysUserVo> list(SysUserParam param, PageQuery pageQuery) {
return sysUserService.selectVoPageList(param, pageQuery); return sysUserService.selectVoPageList(param, pageQuery);
} }
//@PreAuthorize("hasAuthority('system:user:export')") @PreAuthorize("hasAuthority('system:user:query')")
@PostMapping("/export")
public void export(HttpServletResponse response, SysUserParam param) {
List<SysUserVo> list = sysUserService.selectVoList(param);
ExcelUtil.exportExcel(list, SysUserVo.class, "用户数据", response);
}
//@PreAuthorize("hasAuthority('system:user:query')")
@GetMapping(value = {"/", "/{userId}"}) @GetMapping(value = {"/", "/{userId}"})
@Operation(summary = "获取详情")
public AjaxResult getInfo(@PathVariable(value = "userId", required = false) String userId) { public AjaxResult getInfo(@PathVariable(value = "userId", required = false) String userId) {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
List<SysRole> roles = sysRoleService.selectList(new SysRoleParam()); List<SysRole> roles = sysRoleService.selectList(new SysRoleParam());
@ -103,8 +106,17 @@ public class SysUserController {
return ajax; return ajax;
} }
//@PreAuthorize("hasAuthority('system:user:query')") @PreAuthorize("hasAuthority('system:user:export')")
@PostMapping("/export")
@Operation(summary = "导出用户")
public void export(HttpServletResponse response, SysUserParam param) {
List<SysUserExport> list = sysUserService.selectExportData(param);
ExcelUtil.exportExcel(list, SysUserExport.class, "用户数据", response);
}
@PreAuthorize("hasAuthority('system:user:query')")
@GetMapping("/authRole/{userId}") @GetMapping("/authRole/{userId}")
@Operation(summary = "已分配角色列表")
public AjaxResult authRole(@PathVariable("userId") String userId) { public AjaxResult authRole(@PathVariable("userId") String userId) {
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
SysUser user = sysUserService.selectById(userId, false); SysUser user = sysUserService.selectById(userId, false);
@ -115,8 +127,9 @@ public class SysUserController {
return ajax; return ajax;
} }
//@PreAuthorize("hasAuthority('system:user:edit')") @PreAuthorize("hasAuthority('system:user:edit')")
@PutMapping("/authRole") @PutMapping("/authRole")
@Operation(summary = "分配角色")
public AjaxResult handleUserRole(String userId, String[] roleIds) { public AjaxResult handleUserRole(String userId, String[] roleIds) {
sysUserService.handleUserRole(userId, Arrays.stream(roleIds).collect(Collectors.toSet()), true); sysUserService.handleUserRole(userId, Arrays.stream(roleIds).collect(Collectors.toSet()), true);
return AjaxResult.success(); return AjaxResult.success();

View File

@ -22,7 +22,23 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenuMapper, SysMenu, Sy
* @param sysMenu 菜单 * @param sysMenu 菜单
* @return count * @return count
*/ */
int checkMenuNameUnique(SysMenu sysMenu); String checkMenuNameUnique(SysMenu sysMenu);
/**
* 校验是否有子菜单
*
* @param menuId menuId
* @return != null -> 是
*/
String existChild(String menuId);
/**
* 校验菜单是否被绑定
*
* @param menuId menuId
* @return 绑定的角色名称
*/
String existUsed(String menuId);
/** /**
* 根据角色ID查询菜单树信息 * 根据角色ID查询菜单树信息

View File

@ -2,6 +2,9 @@ package com.qiaoba.module.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.api.system.entity.SysRoleDept; import com.qiaoba.api.system.entity.SysRoleDept;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 角色部门关联 数据层 * 角色部门关联 数据层
@ -19,4 +22,12 @@ public interface SysRoleDeptMapper extends BaseMapper<SysRoleDept> {
*/ */
void deleteByRoleId(String roleId); void deleteByRoleId(String roleId);
/**
* 通过角色ID批量删除角色和部门的绑定关系
*
* @param ids 角色ids
*/
void deleteByRoleIds(@Param("list") List<String> ids);
} }

View File

@ -2,6 +2,9 @@ package com.qiaoba.module.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qiaoba.api.system.entity.SysRole; import com.qiaoba.api.system.entity.SysRole;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 角色管理 数据层 * 角色管理 数据层
@ -16,16 +19,24 @@ public interface SysRoleMapper extends BaseMapper<SysRole> {
* 校验角色名称是否唯一 * 校验角色名称是否唯一
* *
* @param role role * @param role role
* @return count * @return != null -> 不唯一
*/ */
int checkRoleNameUnique(SysRole role); String checkRoleNameUnique(SysRole role);
/** /**
* 校验角色权限是否唯一 * 校验角色权限是否唯一
* *
* @param role role * @param role role
* @return count * @return != null -> 不唯一
*/ */
int checkRoleKeyUnique(SysRole role); String checkRoleKeyUnique(SysRole role);
/**
* 查询角色已绑定的第一个人名
*
* @param ids ids
* @return 已绑定的人名
*/
String selectBindUserByRoleId(@Param("list") List<String> ids);
} }

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qiaoba.api.system.entity.SysUser; import com.qiaoba.api.system.entity.SysUser;
import com.qiaoba.api.system.entity.param.SysUserParam; import com.qiaoba.api.system.entity.param.SysUserParam;
import com.qiaoba.api.system.entity.vo.SysUserVo; import com.qiaoba.api.system.entity.vo.SysUserVo;
import com.qiaoba.module.system.templates.SysUserExport;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -68,6 +69,14 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
*/ */
List<SysUserVo> selectVoList(@Param("param") SysUserParam param); List<SysUserVo> selectVoList(@Param("param") SysUserParam param);
/**
* 查询导出数据
*
* @param param 查询条件
* @return list
*/
List<SysUserExport> selectExportData(@Param("param") SysUserParam param);
/** /**
* 分页查询角色已绑定的用户列表 * 分页查询角色已绑定的用户列表
* *

View File

@ -21,9 +21,16 @@ public interface SysRoleDeptService {
void insertBatch(List<SysRoleDept> list); void insertBatch(List<SysRoleDept> list);
/** /**
* 通过角色ID批量删除角色和部门的绑定关系 * 通过角色ID删除角色和部门的绑定关系
* *
* @param roleId 角色id * @param roleId 角色id
*/ */
void deleteByRoleId(String roleId); void deleteByRoleId(String roleId);
/**
* 通过角色ID批量删除角色和部门的绑定关系
*
* @param ids 角色ids
*/
void deleteByRoleIds(List<String> ids);
} }

View File

@ -26,4 +26,11 @@ public interface SysRoleMenuService {
* @param ids 角色ids * @param ids 角色ids
*/ */
void deleteByRoleIds(List<String> ids); void deleteByRoleIds(List<String> ids);
/**
* 通过角色ID删除角色和菜单的绑定关系
*
* @param roleId 角色id
*/
void deleteByRoleId(String roleId);
} }

View File

@ -7,6 +7,8 @@ import com.qiaoba.api.system.entity.vo.SysUserVo;
import com.qiaoba.api.system.service.SysUserApiService; import com.qiaoba.api.system.service.SysUserApiService;
import com.qiaoba.common.database.entity.PageQuery; import com.qiaoba.common.database.entity.PageQuery;
import com.qiaoba.common.database.entity.TableDataInfo; import com.qiaoba.common.database.entity.TableDataInfo;
import com.qiaoba.module.system.templates.SysUserExport;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
@ -63,4 +65,13 @@ public interface SysUserService extends SysUserApiService {
*/ */
TableDataInfo selectUnAllocatedList(SysUserParam param, PageQuery pageQuery); TableDataInfo selectUnAllocatedList(SysUserParam param, PageQuery pageQuery);
/**
* 查询导出数据
*
* @param param 查询条件
* @return list
*/
List<SysUserExport> selectExportData(@Param("param") SysUserParam param);
} }

View File

@ -95,21 +95,11 @@ public class SysDeptServiceImpl implements SysDeptService {
} }
String nickname = sysDeptMapper.existUsed(deptId); String nickname = sysDeptMapper.existUsed(deptId);
if (StrUtil.isNotBlank(nickname)) { if (StrUtil.isNotBlank(nickname)) {
throw new ServiceException(StrUtil.format("用户[{}]已绑定部门,不允许删除", nickname)); throw new ServiceException(StrUtil.format("用户[{}]已绑定部门,请解绑后删除", nickname));
} }
return sysDeptMapper.deleteById(deptId); return sysDeptMapper.deleteById(deptId);
} }
@Override
public List<Tree<String>> selectDeptTree() {
List<SysDept> deptList = selectList(new SysDeptParam());
TreeNodeConfig config = TreeNodeConfig.DEFAULT_CONFIG.setNameKey(BaseConstant.TREE_KEY_NAME);
return TreeUtil.build(deptList, BaseConstant.DEFAULT_PARENT_ID_VALUE, config, (dept, tree) ->
tree.setId(dept.getDeptId())
.setParentId(dept.getParentId())
.setName(dept.getDeptName())
.setWeight(dept.getOrderNum()));
}
@Override @Override
public List<String> selectDeptIdsByRoleId(String roleId) { public List<String> selectDeptIdsByRoleId(String roleId) {

View File

@ -9,6 +9,7 @@ import com.qiaoba.api.system.entity.SysMenu;
import com.qiaoba.api.system.entity.param.SysMenuParam; import com.qiaoba.api.system.entity.param.SysMenuParam;
import com.qiaoba.api.system.entity.vo.RouterVo; import com.qiaoba.api.system.entity.vo.RouterVo;
import com.qiaoba.api.system.entity.vo.SysMenuVo; import com.qiaoba.api.system.entity.vo.SysMenuVo;
import com.qiaoba.auth.utils.SecurityUtil;
import com.qiaoba.common.base.constants.BaseConstant; import com.qiaoba.common.base.constants.BaseConstant;
import com.qiaoba.common.base.exceptions.ServiceException; import com.qiaoba.common.base.exceptions.ServiceException;
import com.qiaoba.module.system.mapper.SysMenuMapper; import com.qiaoba.module.system.mapper.SysMenuMapper;
@ -40,6 +41,7 @@ public class SysMenuServiceImpl implements SysMenuService {
throw new ServiceException("同级下菜单名称不允许重复!"); throw new ServiceException("同级下菜单名称不允许重复!");
} }
sysMenu.setCreateTime(new Date()); sysMenu.setCreateTime(new Date());
sysMenu.setCreateUser(SecurityUtil.getLoginUsername());
return sysMenuMapper.insert(sysMenu); return sysMenuMapper.insert(sysMenu);
} }
@ -48,6 +50,8 @@ public class SysMenuServiceImpl implements SysMenuService {
if (checkMenuNameNotUnique(sysMenu)) { if (checkMenuNameNotUnique(sysMenu)) {
throw new ServiceException("同级下菜单名称不允许重复!"); throw new ServiceException("同级下菜单名称不允许重复!");
} }
sysMenu.setUpdateTime(new Date());
sysMenu.setUpdateUser(SecurityUtil.getLoginUsername());
return sysMenuMapper.updateById(sysMenu); return sysMenuMapper.updateById(sysMenu);
} }
@ -63,6 +67,7 @@ public class SysMenuServiceImpl implements SysMenuService {
@Override @Override
public int deleteById(String menuId) { public int deleteById(String menuId) {
checkAllowDelete(menuId);
return sysMenuMapper.deleteById(menuId); return sysMenuMapper.deleteById(menuId);
} }
@ -107,8 +112,17 @@ public class SysMenuServiceImpl implements SysMenuService {
private boolean checkMenuNameNotUnique(SysMenu menu) { private boolean checkMenuNameNotUnique(SysMenu menu) {
return sysMenuMapper.checkMenuNameUnique(menu) > 0; return StrUtil.isNotBlank(sysMenuMapper.checkMenuNameUnique(menu));
} }
private void checkAllowDelete(String menuId) {
if (StrUtil.isNotBlank(sysMenuMapper.existChild(menuId))) {
throw new ServiceException("存在子菜单, 不允许删除!");
}
String role = sysMenuMapper.existUsed(menuId);
if (StrUtil.isNotBlank(role)) {
throw new ServiceException(StrUtil.format("已绑定角色: {}, 请解绑后删除!", role));
}
}
} }

View File

@ -32,4 +32,9 @@ public class SysRoleDeptServiceImpl implements SysRoleDeptService {
sysRoleDeptMapper.deleteByRoleId(roleId); sysRoleDeptMapper.deleteByRoleId(roleId);
} }
@Override
public void deleteByRoleIds(List<String> ids) {
sysRoleDeptMapper.deleteByRoleIds(ids);
}
} }

View File

@ -1,5 +1,6 @@
package com.qiaoba.module.system.service.impl; package com.qiaoba.module.system.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.toolkit.Db; import com.baomidou.mybatisplus.extension.toolkit.Db;
import com.qiaoba.api.system.entity.SysRoleMenu; import com.qiaoba.api.system.entity.SysRoleMenu;
import com.qiaoba.module.system.mapper.SysRoleMenuMapper; import com.qiaoba.module.system.mapper.SysRoleMenuMapper;
@ -32,4 +33,11 @@ public class SysRoleMenuServiceImpl implements SysRoleMenuService {
sysRoleMenuMapper.deleteByRoleIds(ids); sysRoleMenuMapper.deleteByRoleIds(ids);
} }
@Override
public void deleteByRoleId(String roleId) {
QueryWrapper<SysRoleMenu> wrapper = new QueryWrapper<>();
wrapper.lambda().eq(SysRoleMenu::getRoleId, roleId);
sysRoleMenuMapper.delete(wrapper);
}
} }

View File

@ -50,6 +50,7 @@ public class SysRoleServiceImpl implements SysRoleService {
sysRole.setCreateTime(new Date()); sysRole.setCreateTime(new Date());
checkAllowAddOrUpdate(sysRole); checkAllowAddOrUpdate(sysRole);
int row = sysRoleMapper.insert(sysRole); int row = sysRoleMapper.insert(sysRole);
insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds()); insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds());
return row; return row;
@ -59,6 +60,11 @@ public class SysRoleServiceImpl implements SysRoleService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int updateById(SysRoleDto roleDto) { public int updateById(SysRoleDto roleDto) {
SysRole sysRole = BeanUtil.copyProperties(roleDto, SysRole.class); SysRole sysRole = BeanUtil.copyProperties(roleDto, SysRole.class);
sysRole.setUpdateUser(SecurityUtil.getLoginUsername());
sysRole.setUpdateTime(new Date());
checkAllowAddOrUpdate(sysRole);
sysRoleMenuService.deleteByRoleIds(CollUtil.toList(sysRole.getRoleId())); sysRoleMenuService.deleteByRoleIds(CollUtil.toList(sysRole.getRoleId()));
insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds()); insertRoleMenu(sysRole.getRoleId(), roleDto.getMenuIds());
return sysRoleMapper.updateById(sysRole); return sysRoleMapper.updateById(sysRole);
@ -75,18 +81,25 @@ public class SysRoleServiceImpl implements SysRoleService {
} }
@Override @Override
public int deleteById(Long roleId) { @Transactional(rollbackFor = Exception.class)
return 0; public int deleteById(String roleId) {
checkAllowDelete(CollUtil.toList(roleId));
sysRoleMenuService.deleteByRoleId(roleId);
sysRoleDeptService.deleteByRoleId(roleId);
return sysRoleMapper.deleteById(roleId);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public int deleteByIds(List<String> ids) { public int deleteByIds(List<String> ids) {
checkAllowDelete(ids);
sysRoleDeptService.deleteByRoleIds(ids);
sysRoleMenuService.deleteByRoleIds(ids); sysRoleMenuService.deleteByRoleIds(ids);
return sysRoleMapper.deleteBatchIds(ids); return sysRoleMapper.deleteBatchIds(ids);
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public int authDataScope(DataScopeDto dto) { public int authDataScope(DataScopeDto dto) {
// 更新信息 // 更新信息
SysRole sysRole = BeanUtil.copyProperties(dto, SysRole.class); SysRole sysRole = BeanUtil.copyProperties(dto, SysRole.class);
@ -105,6 +118,14 @@ public class SysRoleServiceImpl implements SysRoleService {
return row; return row;
} }
@Override
public int changeStatus(String roleId, String status) {
SysRole sysRole = new SysRole();
sysRole.setRoleId(roleId);
sysRole.setStatus(status);
return sysRoleMapper.updateById(sysRole);
}
private QueryWrapper<SysRole> param2Wrapper(SysRoleParam param) { private QueryWrapper<SysRole> param2Wrapper(SysRoleParam param) {
QueryWrapper<SysRole> wrapper = new QueryWrapper<>(); QueryWrapper<SysRole> wrapper = new QueryWrapper<>();
@ -124,10 +145,10 @@ public class SysRoleServiceImpl implements SysRoleService {
} }
private void checkAllowAddOrUpdate(SysRole role) { private void checkAllowAddOrUpdate(SysRole role) {
if (!checkRoleNameUnique(role)) { if (checkRoleNameNotUnique(role)) {
throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色名称已存在", role.getRoleName())); throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色名称已存在", role.getRoleName()));
} }
if (!checkRoleKeyUnique(role)) { if (checkRoleKeyNotUnique(role)) {
throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色权限已存在", role.getRoleName())); throw new ServiceException(StrUtil.format("新增或修改角色'{}'失败,角色权限已存在", role.getRoleName()));
} }
} }
@ -138,8 +159,8 @@ public class SysRoleServiceImpl implements SysRoleService {
* @param role 角色信息 * @param role 角色信息
* @return 结果 * @return 结果
*/ */
private boolean checkRoleNameUnique(SysRole role) { private boolean checkRoleNameNotUnique(SysRole role) {
return sysRoleMapper.checkRoleNameUnique(role) == 0; return StrUtil.isNotBlank(sysRoleMapper.checkRoleNameUnique(role));
} }
/** /**
@ -148,10 +169,11 @@ public class SysRoleServiceImpl implements SysRoleService {
* @param role 角色信息 * @param role 角色信息
* @return 结果 * @return 结果
*/ */
private boolean checkRoleKeyUnique(SysRole role) { private boolean checkRoleKeyNotUnique(SysRole role) {
return sysRoleMapper.checkRoleKeyUnique(role) == 0; return StrUtil.isNotBlank(sysRoleMapper.checkRoleKeyUnique(role));
} }
private void insertRoleMenu(String roleId, Set<String> menuIds) { private void insertRoleMenu(String roleId, Set<String> menuIds) {
if (CollUtil.isEmpty(menuIds)) { if (CollUtil.isEmpty(menuIds)) {
return; return;
@ -162,4 +184,11 @@ public class SysRoleServiceImpl implements SysRoleService {
} }
sysRoleMenuService.insertBatch(list); sysRoleMenuService.insertBatch(list);
} }
private void checkAllowDelete(List<String> ids) {
String user = sysRoleMapper.selectBindUserByRoleId(ids);
if (StrUtil.isNotBlank(user)) {
throw new ServiceException(StrUtil.format("删除角色失败,已绑定用户: {}", user));
}
}
} }

View File

@ -34,7 +34,6 @@ public class SysUserDetailsServiceImpl implements UserDetailsService {
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
SysUser user = sysUserService.selectByUsername(username); SysUser user = sysUserService.selectByUsername(username);
StrUtil.format("{}",1);
return createUserDetails(user); return createUserDetails(user);
} }

View File

@ -24,6 +24,7 @@ import com.qiaoba.module.system.mapper.SysUserMapper;
import com.qiaoba.module.system.service.SysUserPostService; import com.qiaoba.module.system.service.SysUserPostService;
import com.qiaoba.module.system.service.SysUserRoleService; import com.qiaoba.module.system.service.SysUserRoleService;
import com.qiaoba.module.system.service.SysUserService; import com.qiaoba.module.system.service.SysUserService;
import com.qiaoba.module.system.templates.SysUserExport;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -84,9 +85,8 @@ public class SysUserServiceImpl implements SysUserService {
@Override @Override
public int resetPwd(ResetPwdDto dto) { public int resetPwd(ResetPwdDto dto) {
// todo 加密密码
dto.setPassword("123456");
SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class); SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class);
sysUser.setPassword(SecurityUtil.encryptPassword(dto.getPassword()));
return sysUserMapper.updateById(sysUser); return sysUserMapper.updateById(sysUser);
} }
@ -148,8 +148,9 @@ public class SysUserServiceImpl implements SysUserService {
} }
@Override @Override
public List<SysUserVo> selectVoList(SysUserParam param) { public List<SysUserExport> selectExportData(SysUserParam param) {
return sysUserMapper.selectVoList(param); return sysUserMapper.selectExportData(param);
//return sysUserMapper.selectVoList(param);
} }
private QueryWrapper<SysUser> param2Wrapper(SysUserParam sysUserParam) { private QueryWrapper<SysUser> param2Wrapper(SysUserParam sysUserParam) {
@ -168,7 +169,7 @@ public class SysUserServiceImpl implements SysUserService {
private SysUser dtoToSysUser(SysUserDto dto, Boolean isUpdate) { private SysUser dtoToSysUser(SysUserDto dto, Boolean isUpdate) {
if (StrUtil.isNotBlank(dto.getPassword())) { if (StrUtil.isNotBlank(dto.getPassword())) {
dto.setPassword("123456"); dto.setPassword(SecurityUtil.encryptPassword(dto.getPassword()));
} }
SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class); SysUser sysUser = BeanUtil.copyProperties(dto, SysUser.class);
if (isUpdate) { if (isUpdate) {

View File

@ -0,0 +1,55 @@
package com.qiaoba.module.system.templates;
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
import cn.hutool.core.collection.CollUtil;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 用户导出模板
*
* @author ailanyin
* @version 1.0
* @since 2023/5/17 17:16
*/
@Data
public class SysUserExport {
@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 = "状态", replace = {"正常_1", "停用_0"})
private String status;
@Excel(name = "创建时间", width = 30, format = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
private String role = this.roles.toString();
//@ExcelCollection(name = "角色")
private List<String> roles;
//@ExcelCollection(name = "岗位")
private List<String> posts;
}

View File

@ -4,13 +4,24 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoba.module.system.mapper.SysMenuMapper"> <mapper namespace="com.qiaoba.module.system.mapper.SysMenuMapper">
<select id="checkMenuNameUnique" parameterType="com.qiaoba.api.system.entity.SysMenu" resultType="int"> <select id="checkMenuNameUnique" parameterType="com.qiaoba.api.system.entity.SysMenu" resultType="string">
select count(1) from sys_menu select menu_id from sys_menu
where menu_name= #{menuName} and parent_id = #{parentId} where menu_name= #{menuName} and parent_id = #{parentId}
<if test="menuId != null"> <if test="menuId != null">
and menu_id != #{menuId} and menu_id != #{menuId}
</if> </if>
limit 1 </select>
<select id="existChild" resultType="string">
select menu_id from sys_menu where parent_id = #{menuId} limit 1
</select>
<select id="existUsed" resultType="string">
SELECT t2.role_name
FROM sys_role_menu t1
left join sys_role t2
on t1.role_id = t2.role_id
where t1.menu_id = #{menuId} limit 1
</select> </select>
<select id="selectMenuIdsByRoleId" resultType="string"> <select id="selectMenuIdsByRoleId" resultType="string">
@ -45,4 +56,5 @@
on t4.role_id = t3.role_id on t4.role_id = t3.role_id
where t4.user_id = #{userId} AND t3.status = '1' where t4.user_id = #{userId} AND t3.status = '1'
</select> </select>
</mapper> </mapper>

View File

@ -7,4 +7,12 @@
<delete id="deleteByRoleId"> <delete id="deleteByRoleId">
delete from sys_role_dept where role_id = #{roleId} delete from sys_role_dept where role_id = #{roleId}
</delete> </delete>
<delete id="deleteByRoleIds">
delete from sys_role_dept where role_id in
<foreach collection="list" item="roleId" open="(" separator="," close=")">
#{roleId}
</foreach>
</delete>
</mapper> </mapper>

View File

@ -4,22 +4,33 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qiaoba.module.system.mapper.SysRoleMapper"> <mapper namespace="com.qiaoba.module.system.mapper.SysRoleMapper">
<select id="checkRoleNameUnique" parameterType="String" resultType="int"> <select id="checkRoleNameUnique" parameterType="String" resultType="string">
select count(*) from sys_role select role_id from sys_role
where role_name = #{roleName} and tenant_id = #{tenantId} where role_name = #{roleName}
<if test="roleId != null and roleId != 0"> <if test="roleId != null and roleId != 0">
and role_id != #{roleId} and role_id != #{roleId}
</if> </if>
limit 1 limit 1
</select> </select>
<select id="checkRoleKeyUnique" parameterType="String" resultType="int"> <select id="checkRoleKeyUnique" parameterType="String" resultType="string">
select count(*) from sys_role select role_id from sys_role
where role_key = #{roleKey} and tenant_id = #{tenantId} where role_key = #{roleKey}
<if test="roleId != null and roleId != 0"> <if test="roleId != null and roleId != 0">
and role_id != #{roleId} and role_id != #{roleId}
</if> </if>
limit 1 limit 1
</select> </select>
<select id="selectBindUserByRoleId" resultType="string">
SELECT t2.nickname
FROM sys_user_role t1
left join sys_user t2
on t1.user_id = t2.user_id
where t1.role_id in
<foreach collection="list" item="roleId" open="(" separator="," close=")">
#{roleId}
</foreach>
LIMIT 1
</select>
</mapper> </mapper>

View File

@ -16,6 +16,28 @@
<result property="createTime" column="create_time"/> <result property="createTime" column="create_time"/>
</resultMap> </resultMap>
<resultMap type="com.qiaoba.module.system.templates.SysUserExport" id="ExportData">
<id property="userId" column="user_id"/>
<result property="deptName" column="dept_name"/>
<result property="username" column="username"/>
<result property="nickname" column="nickname"/>
<result property="email" column="email"/>
<result property="phone" column="phone"/>
<result property="sex" column="sex"/>
<result property="status" column="status"/>
<result property="createTime" column="create_time"/>
<collection property="roles" javaType="java.util.List" resultMap="RoleResult"/>
<collection property="posts" javaType="java.util.List" resultMap="PostResult"/>
</resultMap>
<resultMap id="RoleResult" type="string">
<result property="roleName" column="role_name"/>
</resultMap>
<resultMap id="PostResult" type="string">
<result property="postName" column="post_name"/>
</resultMap>
<sql id="selectUserVo"> <sql id="selectUserVo">
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 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 FROM sys_user u
@ -49,6 +71,38 @@
<include refid="selectUserVo"/> <include refid="selectUserVo"/>
</select> </select>
<select id="selectExportData" resultMap="ExportData">
select t1.user_id, t1.username, t1.nickname, t1.email, t1.phone, t1.gender, t1.status,t1.create_time, t2.dept_name,t4.role_name,t6.post_name
from sys_user t1
left join sys_dept t2 on t1.dept_id = t2.dept_id
left join sys_user_role t3 on t1.user_id = t3.user_id
left join sys_role t4 on t4.role_id = t3.role_id
left join sys_user_post t5 on t5.user_id = t1.user_id
left join sys_post t6 on t6.post_id = t5.post_id
where t1.is_delete = #{param.isDelete}
<if test="param.username != null and param.username != ''">
AND t1.username like concat('%', #{param.username}, '%')
</if>
<if test="param.nickname != null and param.nickname != ''">
AND t1.nickname like concat('%', #{param.nickname}, '%')
</if>
<if test="param.status != null and param.status != ''">
AND t1.status = #{param.status}
</if>
<if test="param.deptId != null and param.deptId != ''">
AND t1.dept_id = #{param.deptId}
</if>
<if test="param.phone != null and param.phone != ''">
AND t1.phone like concat('%', #{param.phone}, '%')
</if>
<if test="param.beginTime != null and param.beginTime != ''">
AND t1.create_time &gt;= #{param.beginTime}
</if>
<if test="param.endTime != null and param.endTime != ''">
AND t1.create_time &lt;= #{param.endTime}
</if>
</select>
<select id="selectAllocatedList" resultMap="SysUserVoResult"> <select id="selectAllocatedList" resultMap="SysUserVoResult">
select distinct t1.user_id, t2.dept_name, t1.username, t1.nickname, t1.email, t1.phone, t1.status,t1.create_time select distinct t1.user_id, t2.dept_name, t1.username, t1.nickname, t1.email, t1.phone, t1.status,t1.create_time
from sys_user t1 from sys_user t1