权限菜单管理 - yiyanglij/yiyanglij.github.io GitHub Wiki

权限管理(查询子节点)

实体属性

User

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_user")
@ApiModel(value="User对象", description="后台用户")
public class User extends BaseBean {

private static final long serialVersionUID = 1L;

/**
 * 主键
 */
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;

/**
 * 用户名
 */
@ApiModelProperty(value = "用户名")
private String userName;

/**
 * 密码
 */
@ApiModelProperty(value = "密码")
private String password;

/**
 * salt
 */
@ApiModelProperty(value = "salt")
private String salt;

/**
 * 姓名
 */
@ApiModelProperty(value = "姓名")
private String name;

/**
 * 状态
 */
@ApiModelProperty(value = "状态")
private String status;

/**
 * 创建时间
 */
@ApiModelProperty(value = "创建时间")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

@ApiModelProperty(value = "部门id")
private Long departmentId;


/**
 * 最后一次登录时间
 */
@ApiModelProperty(value = "最后一次登录时间")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime  updateTime;


/**
 * @see #status
 */
public enum EStatus implements IEnum {
    ACTIVE("在职"),
    FORBIDDEN("离职"),
    ;
    private String desc;

    EStatus(String desc) {
        this.desc = desc;
    }

    @Override
    public String desc() {
        return this.desc;
    }

    @Override
    public String val() {
        return this.name();
    }
}

UserVo

  @Data
  @EqualsAndHashCode(callSuper = true)
  @Accessors(chain = true)
  public class UserVo extends User {
/**
 * 二次密码
 */
@ApiModelProperty(value = "二次密码")
private String rePassword;

/**
 * 角色名称
 */
@ApiModelProperty(value = "角色名称")
private String roleName;

@ApiModelProperty(value = "部门名称")
private String departmentName;

List<UserRole> userRoleList;

/**
 * 角色
 */
@ApiModelProperty(value = "角色")
List<Role> roleList;

@ApiModelProperty(value = "当前登录用户ID")
private Long userId;

@ApiModelProperty(value = "角色ID")
private Long roleId;

Role

  @Data
  @EqualsAndHashCode(callSuper = true)
  @Accessors(chain = true)
  @TableName("sys_role")
  @ApiModel(value="Role对象", description="系统角色")
  public class Role extends BaseBean {

private static final long serialVersionUID = 1L;

/**
 * 主键
 */
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;

/**
 * 角色名称
 */
@ApiModelProperty(value = "角色名称")
private String roleName;

/**
 * 创建人ID
 */
@ApiModelProperty(value = "创建人ID")
private Long createUserId;

/**
 * 创建时间
 */
@ApiModelProperty(value = "创建时间")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

/**
 * 排序
 */
@ApiModelProperty(value = "排序")
private Long sort;

/**
 * 角色类型
 */
@ApiModelProperty(value = "角色类型")
private String roleType;

/**
 * 角色类型
 */
@ApiModelProperty(value = "角色编码")
private String roleCode;

/**
 * 描述
 */
@ApiModelProperty(value = "描述")
private String description;

/**
 * 创建人
 */
@ApiModelProperty(value = "创建人")
private String createBy;

/**
 * 更新人
 */
@ApiModelProperty(value = "更新人")
private String updateBy;

/**
 * 更新时间
 */
@ApiModelProperty(value = "更新时间")
private LocalDateTime updateTime;

/**
 * 角色拼音
 */
@ApiModelProperty(value = "角色拼音")
private String rolePy;

/**
 * 删除状态
 */
@ApiModelProperty(value = "删除状态")
private Integer delFlag;

/**
 * 物业ID
 */
@ApiModelProperty(value = "物业ID")
private Long wuyeId;

/**
 * @see #roleType
 */
public enum ERoleType implements IEnum {
    UNDERTAKE("担当"),
    CLERK("文员"),
    DIRECTOR("主任"),
    SUPERVISOR("系长"),
    BUREAU_HEAD("课长"),
    UNDERSECRETARY("次长"),
    MINISTER("部长"),
    DISTRIBUTION("配布"),
    ;
    private String desc;

    ERoleType(String desc) {
        this.desc = desc;
    }

    @Override
    public String desc() {
        return this.desc;
    }

    @Override
    public String val() {
        return this.name();
    }
}

roleVo

@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class RoleVo extends Role {

@ApiModelProperty(value = "创建开始时间")
private LocalDateTime createTimeStart;

@ApiModelProperty(value = "创建结束时间")
private LocalDateTime createTimeEnd;

@ApiModelProperty(value = "角色权限列表")
private List<RolePermission> rolePermissionList;

@ApiModelProperty(value = "角色对应的用户列表")
private List<UserVo> userList;

@ApiModelProperty(value = "用户ID")
private Long userId;

@ApiModelProperty(value = "角色对应用户,用于批量删除角色对应的用户")
private List<UserVo> roleUserList;

@ApiModelProperty(value = "村庄名")
private List<String> villageName;

@ApiModelProperty(value = "物业名")
private List<String> wuyeName;
}

permission

  @Data
  @EqualsAndHashCode(callSuper = true)
  @Accessors(chain = true)
  @TableName("SYS_PERMISSION")
  @ApiModel(value="Permission对象", description="菜单权限表")
  @KeySequence(value = "SYS_PERMISSION")
  public class Permission extends BaseBean {

private static final long serialVersionUID = 1L;

/**
 * 主键id
 */
@ApiModelProperty(value = "主键id")
@TableField("ID")
@TableId(type = IdType.INPUT,value = "id")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Long id;

/**
 * 父id
 */
@ApiModelProperty(value = "父id")
@TableField("PARENT_ID")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Long parentId;

/**
 * 菜单标题
 */
@ApiModelProperty(value = "菜单标题")
@TableField("NAME")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String name;

/**
 * 路径
 */
@ApiModelProperty(value = "路径")
@TableField("URL")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String url;

/**
 * 组件
 */
@ApiModelProperty(value = "组件")
@TableField("COMPONENT")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String component;

/**
 * 组件名字
 */
@ApiModelProperty(value = "组件名字")
@TableField("COMPONENT_NAME")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String componentName;

/**
 * 一级菜单跳转地址
 */
@ApiModelProperty(value = "一级菜单跳转地址")
@TableField("REDIRECT")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String redirect;

/**
 * 菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)
 */
@ApiModelProperty(value = "菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)")
@TableField("MENU_TYPE")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer menuType;

/**
 * 菜单归属(B2C:b2c菜单; OMS:oms菜单)
 */
@ApiModelProperty(value = "菜单归属")
@TableField("MENU_ATTRIBUTION")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String menuAttribution;

/**
 * 菜单权限编码
 */
@ApiModelProperty(value = "菜单权限编码")
@TableField("PERMS")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String perms;

/**
 * 权限策略1显示2禁用
 */
@ApiModelProperty(value = "权限策略1显示2禁用")
@TableField("PERMS_TYPE")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer permsType;

/**
 * 菜单排序
 */
@ApiModelProperty(value = "菜单排序")
@TableField("SORT_NO")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Double sortNo;

/**
 * 菜单图标
 */
@ApiModelProperty(value = "菜单图标")
@TableField("ICON")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String icon;

/**
 * 权限按钮标识
 */
@ApiModelProperty(value = "权限按钮标识")
@TableField("PERMISSION_FLAG")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String permissionFlag;

/**
 * 是否路由菜单: 0:不是  1:是(默认值1)
 */
@ApiModelProperty(value = "是否路由菜单: 0:不是  1:是(默认值1)")
@TableField("IS_ROUTE")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer isRoute;

/**
 * 是否叶子节点:    1:是   0:不是
 */
@ApiModelProperty(value = "是否叶子节点:1:是,0:不是")
@TableField("IS_LEAF")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer isLeaf;

/**
 * 是否隐藏路由: 0否,1是
 */
@ApiModelProperty(value = "是否隐藏路由: 0否,1是")
@TableField("HIDDEN")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Long hidden;

/**
 * 描述
 */
@ApiModelProperty(value = "描述")
@TableField("DESCRIPTION")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String description;

/**
 * 创建人
 */
@ApiModelProperty(value = "创建人")
@TableField("CREATE_BY")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String createBy;

/**
 * 创建时间
 */
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private LocalDateTime createTime;

/**
 * 更新人
 */
@ApiModelProperty(value = "更新人")
@TableField("UPDATE_BY")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String updateBy;

/**
 * 更新时间
 */
@ApiModelProperty(value = "更新时间")
@TableField("UPDATE_TIME")
private LocalDateTime updateTime;

/**
 * 删除状态 0正常 1已删除
 */
@ApiModelProperty(value = "删除状态 0正常 1已删除")
@TableField("DEL_FLAG")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer delFlag;

/**
 * 按钮权限状态(0无效1有效)
 */
@ApiModelProperty(value = "按钮权限状态(0无效1有效)")
@TableField("STATUS")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private String status;

/**
 * 外链菜单打开方式 0/内部打开 1/外部打开
 */
@ApiModelProperty(value = "外链菜单打开方式 0/内部打开 1/外部打开")
@TableField("INTERNAL_OR_EXTERNAL")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Integer internalOrExternal;
}

permissionVo

  @Data
  @EqualsAndHashCode(callSuper = true)
  @Accessors(chain = true)
  public class PermissionVo extends Permission {

@ApiModelProperty(value = "子菜单")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private List<PermissionVo> children;

@ApiModelProperty(value = "登录用户ID")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Long userId;

@ApiModelProperty(value = "角色ID")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
private Long roleId;

}

userRole

 @Data
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
 @TableName("sys_user_role")
 @ApiModel(value="UserRole对象", description="用户权限表")
 public class UserRole extends BaseBean {

private static final long serialVersionUID = 1L;

/**
 * 主键
 */
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;

/**
 * 角色id
 */
@ApiModelProperty(value = "角色id")
private Long roleId;

/**
 * 用户id
 */
@ApiModelProperty(value = "用户id")
private Long userId;

/**
 * 创建人ID
 */
@ApiModelProperty(value = "创建人ID")
private Long createUserId;

/**
 * 创建时间
 */
@ApiModelProperty(value = "创建时间")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
 }

rolePermission

 @Data
 @EqualsAndHashCode(callSuper = true)
 @Accessors(chain = true)
 @TableName("sys_role_permission")
 @ApiModel(value="RolePermission对象", description="角色权限")
 public class RolePermission extends BaseBean {

private static final long serialVersionUID = 1L;

/**
 * 主键
 */
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.AUTO)
private Long id;

/**
 * 角色id
 */
@ApiModelProperty(value = "角色id")
private Long roleId;

/**
 * 权限名称
 */
@ApiModelProperty(value = "权限名称")
private String permissionTitle;

/**
 * 权限路径
 */
@ApiModelProperty(value = "权限值")
private String permissionValue;

/**
 * 创建人ID
 */
@ApiModelProperty(value = "创建人ID")
private Long createUserId;

/**
 * 创建时间
 */
@ApiModelProperty(value = "创建时间")
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;

/**
 * 权限id
 */
@ApiModelProperty(value = "权限id")
@TableField("PERMISSION_ID")
private Long permissionId;

/**
 * 数据权限ids
 */
@ApiModelProperty(value = "数据权限ids")
@TableField("DATA_RULE_IDS")
private String dataRuleIds;

/**
 * 操作ip
 */
@ApiModelProperty(value = "操作ip")
@TableField("OPERATE_IP")
private String operateIp;

@TableField("CREATE_BY")
private String createBy;


@TableField("UPDATE_BY")
private String updateBy;

@TableField("UPDATE_TIME")
private LocalDateTime updateTime;
 }

rolePermissionVo

  @Data
  @EqualsAndHashCode(callSuper = true)
  @Accessors(chain = true)
  public class RolePermissionVo extends RolePermission {

/**
 * 菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)
 */
@ApiModelProperty(value = "菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)")
@TableField("menu_type")
private Integer menuType;

/**
 * 权限按钮标识
 */
@ApiModelProperty(value = "权限按钮标识")
@TableField("permission_flag")
private String permissionFlag;
}

Controller

@ApiOperation("所有菜单列表(有一二级区分)")
@GetMapping(value = "getPermissionVoList")
public List<PermissionVo> getPermissionVoList(PermissionVo permissionVo){
    return this.adminService.getPermissionVoList(permissionVo);
}

Service

@Override
public List<PermissionVo> getPermissionVoList(PermissionVo permissionVo) {
    List<PermissionVo> permissionVos =  permissionMapper.getSysPermissionVoAllList(permissionVo);
    if (permissionVos.size()==0){
        return null;
    }
    List<PermissionVo> permissionVoList = new ArrayList<>();
    if (permissionVos != null) {
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            for (int j = 0; j < permissionVos.size(); j++) {
                PermissionVo p = permissionVos.get(j);
                if (p.getId().equals(permissionVo1.getParentId())) {
                    if (p.getChildren() == null) {
                        p.setChildren(new ArrayList<>());
                    }
                    p.getChildren().add(permissionVo1);
                }
            }
        }
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            if (permissionVo1.getMenuType() != null && permissionVo1.getMenuType() == 0) {
                permissionVoList.add(permissionVo1);
            }
        }
    }
    return permissionVoList;
}

AdminUserController

@Autowired
private AccountHelper accountHelper;

@Autowired
private AdminService adminService;


@ApiOperation("当前登录用户")
@GetMapping("getUserInfo")
public UserVo getUserInfo() {
    return this.adminService.getUser(this.accountHelper.getUserId());
}

@ApiOperation("添加用户")
@ApiImplicitParams({
        @ApiImplicitParam(name = "account", value = "账号", required = true, dataType = "String"),
        @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String"),
        @ApiImplicitParam(name = "rePassword", value = "确认密码", required = true, dataType = "String"),
        @ApiImplicitParam(name = "departmentId", value = "departmentId", required = false, dataType = "Long"),
        @ApiImplicitParam(name = "role", value = "角色", required = false, dataType = "String"),
        @ApiImplicitParam(name = "userName", value = "姓名", required = false, dataType = "String"),
        @ApiImplicitParam(name = "List<UserRole>", value = "角色",required = false,  dataType = "List<UserRole>")
})
@PostMapping(value = "addUser")
public User addUser(@RequestBody @ApiIgnore UserVo userVo) {
    return this.adminService.addUser(userVo);
}

@ApiOperation("修改用户")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "departmentId", value = "departmentId", required = false, dataType = "Long"),
        @ApiImplicitParam(name = "role", value = "角色", required = false, dataType = "String"),
        @ApiImplicitParam(name = "userName", value = "姓名", required = true, dataType = "String"),
        @ApiImplicitParam(name = "List<UserRole>", value = "角色", required = false,  dataType = "List<UserRole>")
})
@PostMapping(value = "updateUser")
public User updateUser(@RequestBody UserVo userVo){
    return this.adminService.updateUser(userVo);
}

@ApiOperation("修改密码")
@ApiImplicitParams({
        @ApiImplicitParam(name = "oldPassword", value = "原密码", required = true, dataType = "String"),
        @ApiImplicitParam(name = "newPassword", value = "新密码", required = true, dataType = "String")
})
@GetMapping(value = "resetPassword")
public User resetPassword(String oldPassword, String newPassword) {
    return this.adminService.resetPassword(this.accountHelper.getUserId(), oldPassword, newPassword);
}

@ApiOperation("所有管理员")
@ApiImplicitParams({
        @ApiImplicitParam(name = "current", value = "第几页", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "size", value = "一页几条", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "roleName", value = "角色", dataType = "String"),
        @ApiImplicitParam(name = "userName", value = "用户名", dataType = "String")
})
@GetMapping(value = "getUserList")
public IPage<UserVo> getUserList(Page page,  UserVo userVo) {
    return this.adminService.getUserList(page,userVo);
}


@ApiOperation("重置密码")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "password", value = "新密码", required = true, dataType = "String")
})
@GetMapping(value = "resetUserPassword")
public void resetUserPassword(Long id,String password){
    this.adminService.resetUserPassword(id,password);
}

@ApiOperation("获取一用户的角色")
@ApiImplicitParams({
        @ApiImplicitParam(name = "userId", value = "userId", required = true, dataType = "Long"),
})
@GetMapping(value = "getUserRole")
public List<Role> getUserRole(Long userId){
    return this.adminService.getUserRole(userId);
}

@ApiOperation("获取所有的角色")
@GetMapping(value = "getUserRoleAll")
public List<Role> getUserRoleAll(){
    return this.adminService.getUserRoleAll();
}

@ApiOperation("获取当前用户的权限")
@GetMapping(value = "getCurrentUserRolePermission")
public List<RolePermission> getCurrentUserRolePermission(){
    return this.adminService.getUserRolePermission(this.accountHelper.getUserId());
}

@ApiOperation("获取当前用户的权限Vo")
@GetMapping(value = "getCurrentUserRolePermissionVo")
public List<RolePermissionVo> getCurrentUserRolePermissionVo(){
    return this.adminService.getCurrentUserRolePermissionVo(this.accountHelper.getUserId());
}

@ApiOperation("获取一用户的权限")
@ApiImplicitParams({
        @ApiImplicitParam(name = "userId", value = "userId", required = true, dataType = "Long"),
})
@GetMapping(value = "getUserRolePermission")
public List<RolePermission> getUserRolePermission(Long userId){
    return this.adminService.getUserRolePermission(userId);
}

@ApiOperation("设置用户的角色")
@ApiImplicitParams({
        @ApiImplicitParam(name = "userId[]", value = "userId", required = true, dataType = "Long[]"),
        @ApiImplicitParam(name = "roleIds", value = "roleIds", required = true, dataType = "Long[]"),
})
@PostMapping(value = "updateUserRole")
void updateUserRole( @RequestBody JSONObject jsonObject) {
    this.adminService.updateUserRole(
            jsonObject.getObject("userIds", Constant.CLASS_TYPE.LIST_LONG),
            jsonObject.getObject("roleIds", Constant.CLASS_TYPE.LIST_LONG),
            accountHelper.getUserId());
}

@ApiOperation("添加角色")
@ApiImplicitParams({
        @ApiImplicitParam(name = "roleName", value = "roleName", required = true, dataType = "String")
})
@PostMapping(value = "addRole")
public void addRole(@RequestBody RoleVo  roleVo) {
    roleVo.setCreateUserId(this.accountHelper.getUserId());
    this.adminService.addRole(roleVo);

}

@ApiOperation("修改角色")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "roleName", value = "roleName", required = true, dataType = "String")
})
@PostMapping(value = "updateRole")
public void updateRole(@RequestBody RoleVo roleVo){
    roleVo.setCreateUserId(this.accountHelper.getUserId());
    this.adminService.updateRole(roleVo);
}

@ApiOperation("删除角色")
@PostMapping(value = "delRole")
@ApiImplicitParams({
        @ApiImplicitParam(name = "编号", value = "id", required = true, dataType = "Long"),
})
public void delRole(@RequestBody RoleVo roleVo) {
    this.adminService.delRole(roleVo);
}

@ApiOperation("查询单个角色")
@PostMapping(value = "getRoleOne")
@ApiImplicitParams({
        @ApiImplicitParam(name = "编号", value = "id", required = true, dataType = "Long"),
})
public RoleVo getRoleOne(@RequestBody RoleVo roleVo) {
    return this.adminService.getRoleOne(roleVo);
}

@ApiOperation("角色列表")
@ApiImplicitParams({
        @ApiImplicitParam(name = "roleName", value = "roleName", required = true, dataType = "String"),
        @ApiImplicitParam(name = "createTimeStart", value = "createTimeStart", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "createTimeEnd", value = "createTimeEnd", required = false, dataType = "createTimeEnd")
})
@GetMapping(value = "getRoleList")
public IPage<Role> getRoleList(Page<Role> page, RoleVo role){
    return this.adminService.getRoleList(page, role);
}


@ApiOperation("角色和权限列表")
@ApiImplicitParams({
        @ApiImplicitParam(name = "roleName", value = "roleName", required = true, dataType = "String"),
        @ApiImplicitParam(name = "createTimeStart", value = "createTimeStart", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "createTimeEnd", value = "createTimeEnd", required = false, dataType = "createTimeEnd")
})
@GetMapping(value = "getRolePermissionList")
public IPage<RoleVo> getRolePermissionList(Page page, RoleVo role){
    return this.adminService.getRolePermissionList(page, role);
}

@ApiOperation("获取一角色权限")
@ApiImplicitParams({
        @ApiImplicitParam(name = "roleName", value = "roleName", required = true, dataType = "String")
})
@GetMapping(value = "getRolePermission")
public List<RolePermission> getRolePermission(Long roleId) {
    return this.adminService.getRolePermission(roleId);
}

@ApiOperation("设置角色权限")
@ApiImplicitParams({
        @ApiImplicitParam(name = "roleIds", value = "roleId", required = true, dataType = "Long[]"),
        @ApiImplicitParam(name = "rolePermissions[].permissionTitle", value = "permissionTitle", required = true, dataType = "String"),
        @ApiImplicitParam(name = "rolePermissions[].permissionValue", value = "permissionValue", required = true, dataType = "String")
})
@PostMapping(value = "updateRolePermission")
public void updateRolePermission(@RequestBody JSONObject  json){
    this.adminService.updateRolePermission(
            json.getObject("roleIds", Constant.CLASS_TYPE.LIST_LONG),
            json.getObject("rolePermissions", new TypeReference<List<RolePermission>>() {}.getType()),
            this.accountHelper.getUserId()
    );
}

@ApiOperation("添加部门")
@ApiImplicitParams({
        @ApiImplicitParam(name = "departmentName", value = "部门名称", required = true, dataType = "String"),

})
@PostMapping(value = "addDepartment")
public void addDepartment(@RequestBody Department department) {
    department.setUersId(this.accountHelper.getUserId());
    this.adminService.addDepartment(department);
}

@ApiOperation("修改部门")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "部门Id", required = true, dataType = "Long"),

})
@PostMapping(value = "updateDepartment")
public void updateDepartment(@RequestBody Department department) {
    this.adminService.updateDepartment(department);
}
@ApiOperation("删除部门")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long"),
})
@GetMapping(value = "delDepartment")
public void delDepartment(Long id) {
    this.adminService.delDepartment(id);
}

@ApiOperation("部门列表不分页")
@GetMapping(value = "getDepartmentAll")
@ApiImplicitParams({
})
public List<Department> getDepartmentAll() {
    return this.adminService.getDepartmentAll();
}

@ApiOperation("部门列表")
@GetMapping(value = "getDepartmentList")
@ApiImplicitParams({
        @ApiImplicitParam(name = "current", value = "第几页", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "size", value = "一页几条", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "departmentName", value = "部门名称", dataType = "String"),
})
public IPage<DepartmentVo> getDepartmentList(Page page, String departmentName) {
    return this.adminService.getDepartmentList(page, departmentName);
}


@ApiOperation("所有菜单列表(有一二级区分)")
@GetMapping(value = "getPermissionVoList")
public List<PermissionVo> getPermissionVoList(PermissionVo permissionVo){
    return this.adminService.getPermissionVoList(permissionVo);
}

@ApiOperation("修改权限信息")
@PostMapping("editPermissionVo")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "parentId", value = "上级菜单", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "name", value = "菜单标题", required = false, dataType = "String"),
        @ApiImplicitParam(name = "url", value = "路径", required = false, dataType = "String"),
        @ApiImplicitParam(name = "component", value = "组件", required = false, dataType = "String"),
        @ApiImplicitParam(name = "componentName", value = "组件名字", required = false, dataType = "String"),
        @ApiImplicitParam(name = "redirect", value = "一级菜单跳转地址", required = false, dataType = "String"),
        @ApiImplicitParam(name = "menuType", value = "菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)", required = true, dataType = "Integer"),
        @ApiImplicitParam(name = "menuAttribution", value = "菜单归属", required = false, dataType = "String"),
        @ApiImplicitParam(name = "perms", value = "菜单权限编码", required = false, dataType = "String"),
        @ApiImplicitParam(name = "permsType", value = "权限策略1显示2禁用", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "sortNo", value = "菜单排序", required = false, dataType = "Double"),
        @ApiImplicitParam(name = "icon", value = "菜单图标", required = false, dataType = "String"),
        @ApiImplicitParam(name = "permissionFlag", value = "权限按钮标识", required = false, dataType = "String"),
        @ApiImplicitParam(name = "isRoute", value = "是否路由菜单: 0:不是  1:是(默认值1)", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "isLeaf", value = "是否叶子节点:1:是,0:不是", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "hidden", value = "是否隐藏路由: 0否,1是", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "description", value = "描述", required = false, dataType = "String"),
        @ApiImplicitParam(name = "createBy", value = "创建人", required = false, dataType = "String"),
        @ApiImplicitParam(name = "createTime", value = "创建时间", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "updateBy", value = "更新人", required = false, dataType = "String"),
        @ApiImplicitParam(name = "updateTime", value = "更新时间", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "delFlag", value = "删除状态 0正常 1已删除", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "status", value = "按钮权限状态(0无效1有效)", required = false, dataType = "String"),
        @ApiImplicitParam(name = "internalOrExternal", value = "外链菜单打开方式 0/内部打开 1/外部打开", required = false, dataType = "Integer")
})
public void editPermissionVo(@RequestBody PermissionVo permissionVo){
    this.adminService.editPermissionVo(permissionVo);
}

@ApiOperation("删除权限信息")
@PostMapping("delPermissionVo")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long")
})
public void delPermissionVo(@RequestBody PermissionVo permissionVo){
    this.adminService.delPermissionVo(permissionVo);
}

@ApiOperation("根据ID获取菜单详细信息")
@GetMapping("getPermissionInfoById")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "id", required = true, dataType = "Long")
})
public Permission getPermissionInfoById(@RequestParam(value = "id") Long id){
    return this.adminService.getPermissionInfoById(id);
}

@ApiOperation("新增菜单信息")
@PostMapping("addPermission")
@ApiImplicitParams({
        @ApiImplicitParam(name = "parentId", value = "上级菜单", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "name", value = "菜单标题", required = false, dataType = "String"),
        @ApiImplicitParam(name = "url", value = "路径", required = false, dataType = "String"),
        @ApiImplicitParam(name = "component", value = "组件", required = false, dataType = "String"),
        @ApiImplicitParam(name = "componentName", value = "组件名字", required = false, dataType = "String"),
        @ApiImplicitParam(name = "redirect", value = "一级菜单跳转地址", required = false, dataType = "String"),
        @ApiImplicitParam(name = "menuType", value = "菜单类型(0:一级菜单; 1:子菜单:2:按钮权限)", required = true, dataType = "Integer"),
        @ApiImplicitParam(name = "menuAttribution", value = "菜单归属", required = false, dataType = "String"),
        @ApiImplicitParam(name = "perms", value = "菜单权限编码", required = false, dataType = "String"),
        @ApiImplicitParam(name = "permsType", value = "权限策略1显示2禁用", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "sortNo", value = "菜单排序", required = false, dataType = "Double"),
        @ApiImplicitParam(name = "icon", value = "菜单图标", required = false, dataType = "String"),
        @ApiImplicitParam(name = "permissionFlag", value = "权限按钮标识", required = false, dataType = "String"),
        @ApiImplicitParam(name = "isRoute", value = "是否路由菜单: 0:不是  1:是(默认值1)", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "isLeaf", value = "是否叶子节点:1:是,0:不是", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "hidden", value = "是否隐藏路由: 0否,1是", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "description", value = "描述", required = false, dataType = "String"),
        @ApiImplicitParam(name = "createBy", value = "创建人", required = false, dataType = "String"),
        @ApiImplicitParam(name = "createTime", value = "创建时间", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "updateBy", value = "更新人", required = false, dataType = "String"),
        @ApiImplicitParam(name = "updateTime", value = "更新时间", required = false, dataType = "LocalDateTime"),
        @ApiImplicitParam(name = "delFlag", value = "删除状态 0正常 1已删除", required = false, dataType = "Integer"),
        @ApiImplicitParam(name = "status", value = "按钮权限状态(0无效1有效)", required = false, dataType = "String"),
        @ApiImplicitParam(name = "internalOrExternal", value = "外链菜单打开方式 0/内部打开 1/外部打开", required = false, dataType = "Integer")
})
public void addPermission(@RequestBody PermissionVo permissionVo){
    this.adminService.addPermission(permissionVo);
}

@ApiOperation("获取分页菜单列表(没有分一二级菜单)")
@ApiImplicitParams({
        @ApiImplicitParam(name = "current", value = "第几页", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "size", value = "一页几条", required = true, dataType = "Long"),
})
@GetMapping(value = "getPermissionPage")
public IPage<PermissionVo> getPermissionPage(Page page,PermissionVo permissionVo){
    return this.adminService.getPermissionPage(page,permissionVo);
}

@ApiOperation("根据角色ID获取角色对应的用户信息")
@ApiImplicitParams({
        @ApiImplicitParam(name = "current", value = "第几页", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "size", value = "一页几条", required = true, dataType = "Long"),
})
@PostMapping(value = "getUserByRoleId")
public IPage<RoleVo> getUserByRoleId(Page page,@RequestBody RoleVo roleVo){
    return this.adminService.getUserByRoleId(page,roleVo);
}

@PostMapping(value = "delRoleBatchUser")
@ApiOperation("批量删除角色对应的用户信息")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id",value = "角色ID",dataType = "String"),
        @ApiImplicitParam(name = "userIdList",value = "用户ID",dataType = "Long"),

})
public void delRoleBatchUser(@RequestBody RoleVo roleVo){
    this.adminService.delRoleBatchUser(roleVo);
}

@PostMapping(value = "getPermissionVoAllListByRoleId")
@ApiOperation("获取角色对于的权限信息")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "角色id", required = true, dataType = "String"),
})
public List<PermissionVo> getPermissionVoAllListByRoleId(@RequestBody PermissionVo permissionVo){
    return this.adminService.getPermissionVoAllListByRoleId(permissionVo);
}

@ApiOperation("获取菜单信息(没有链表查询)")
@GetMapping(value = "getPermissionInfo")
public List<PermissionVo> getPermissionInfo(PermissionVo permissionVo){
    return this.adminService.getPermissionInfo(permissionVo);
}


@ApiOperation("批量删除菜单信息")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id",value = "主键id集合",dataType = "Long")
})
@PostMapping(value = "delBatchPermissionInfo")
public void delBatchPermissionInfo(@RequestBody List<Long> ids){
    this.adminService.delBatchPermissionInfo(ids);
}

@ApiOperation("编辑角色权限")
@ApiResponse(code = 200, message = "success", response = IPage.class)
@PostMapping(value = "editRolePermission")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "角色id", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "rolePermissionList[].permissionId", value = "权限id数组", dataType = "Long"),
})
public void editRolePermission(@RequestBody RoleVo roleVo){
    adminService.editRolePermission(roleVo);
};

@ApiOperation("批量添加角色用户")
@ApiResponse(code = 200, message = "success", response = IPage.class)
@PostMapping(value = "addRoleBatchUser")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "角色id", dataType = "String"),
        @ApiImplicitParam(name = "userList[].id", value = "用户id", dataType = "Long"),
})
public void addRoleBatchUser(@RequestBody RoleVo roleVo){
    adminService.addRoleBatchUser(roleVo);
};


@ApiOperation("根据用户角色查询村庄")
@GetMapping(value = "getVillageByRoleId")
@ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "角色id", dataType = "String")
})
public List<Village> getVillageByRoleId(){
    List<Village> villages=adminService.getVillageByRoleId(this.accountHelper.getUserId());
    return villages;
};

AdminServiceImpl

   @Autowired
private UserMapper userMapper;
@Autowired
private OauthService oauthService;
@Autowired
private RoleMapper roleMapper;
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Autowired
private UserRoleMapper userRoleMapper;
@Autowired
private DepartmentMapper departmentMapper;
@Autowired
private FlowMapper flowMapper;
@Autowired
private FlowMiddleMapper flowMiddleMapper;
@Autowired
private PermissionMapper permissionMapper;
@Autowired
private RoleVillageMapper roleVillageMapper;
@Autowired
private VillageMapper villageMapper;
@Autowired
private RoleWuyeMapper roleWuyeMapper;

@Override
public UserVo getUser(Long id) {
    AssertExt.hasId(id, "no id");
    UserVo userDB = this.userMapper.getUserById(id);
    AssertExt.notNull(userDB, "user [%s] not exist", id);
    userDB.setPassword(null);
    userDB.setSalt(null);
    userDB.setRoleList(this.roleMapper.getUserRole(id));
    return userDB;
}

@Override
public User addUser(UserVo userVo) {
    AssertExt.notBlank(userVo.getUserName(), "no user name");
    AssertExt.notBlank(userVo.getPassword(), "no password");
    AssertExt.isTrue(userVo.getPassword().equals(userVo.getRePassword()), "password not equal");
    AssertExt.matches("^[A-Za-z0-9][A-Za-z0-9_\\-]{5,10}[A-Za-z0-9]$", userVo.getUserName(),
            "账号是数字、字母、下划线、中横线(不能以下划线、中横线开头结尾);长度7到12位");
    AssertExt.matches(".{8,20}", userVo.getPassword(), "密码长度8到20位");
    User userDB = this.userMapper.selectOne(new QueryWrapper<User>().eq("user_name", userVo.getUserName()));

    AssertExt.isTrue(userDB == null, "user[%s] exists", userVo.getUserName());

    User user = new User();
    BeanUtils.copyProperties(userVo, user);

    user.setSalt(RandomStringUtils.random(10, true, true));
    user.setPassword(DigestUtils.sha1Hex(userVo.getPassword() + user.getSalt()));
    user.setStatus(User.EStatus.ACTIVE.val());
    user.setCreateTime(LocalDateTime.now());
    user.setId(null);
    this.userMapper.insert(user);
    List<Role> roleList = userVo.getRoleList();
    if(roleList.size()>0 && roleList!=null){
        for (Role role : roleList) {
            UserRole userRole = new UserRole();
            userRole.setUserId(userVo.getUserId());
            userRole.setRoleId(role.getId());
            userRole.setUserId(user.getId());
            userRole.setCreateTime(LocalDateTime.now());
            this.userRoleMapper.insert(userRole);
        }
        this.userMapper.updateById(user);
    }
    return user;
}

@Override
public User login(User user) {
    AssertExt.notBlank(user.getUserName(), "no user name");
    AssertExt.notBlank(user.getPassword(), "no password");

    User userDB = this.userMapper.selectOne(new QueryWrapper<User>().eq("user_name", user.getUserName()));
    AssertExt.notNull(userDB, "账号不存在", user.getUserName());

    boolean check = DigestUtils.sha1Hex(user.getPassword() + userDB.getSalt()).equals(userDB.getPassword());
    AssertExt.isTrue(check, "密码错误");
    AssertExt.isTrue(User.EStatus.ACTIVE.val().equals(userDB.getStatus()), "状态不可用【%】", userDB.getStatus());
    userDB.setPassword(null);
    userDB.setSalt(null);
    return userDB;
}

@Override
public User updateUser(UserVo userVo) {
    AssertExt.hasId(userVo.getId(), "id为空");
    AssertExt.notBlank(userVo.getName(), "name为空");
    AssertExt.checkEnum(User.EStatus.class, userVo.getStatus(), "无效status %s", userVo.getStatus());

    User userDB = this.userMapper.selectById(userVo.getId());
    AssertExt.notNull(userDB, "user[%s] not exist", userVo.getId());

    userDB.setName(userVo.getName());
    userDB.setStatus(userVo.getStatus());
    userDB.setDepartmentId(userVo.getDepartmentId());
    this.userMapper.updateById(userDB);
    if (userVo.getUserRoleList().size()>0) {
        this.userRoleMapper.delete(new QueryWrapper<UserRole>().eq("user_id",userVo.getId()));
        this.flowMiddleMapper.deleteByUserId(userVo.getId());//删除用户流程中间表
        userVo.getUserRoleList().forEach(userRole -> {
            userRole.setUserId(userVo.getId());
            userRole.setCreateTime(LocalDateTime.now());
            this.userRoleMapper.insert(userRole);

            //判断是否有流程角色
            Flow flow = this.flowMapper.selectOne(new QueryWrapper<Flow>()
                .eq("role_id", userRole.getRoleId()));
            if(flow!=null){
                //有流程角色先删除原有中间表数据再插入新数据
                FlowMiddle flowMiddle = this.flowMiddleMapper.selectOne(new QueryWrapper<FlowMiddle>()
                    .eq("user_id", userVo.getId())
                    .eq("flow_id", flow.getId()));
                if(flowMiddle==null){
                    FlowMiddle fm_tmp = new FlowMiddle();
                    fm_tmp.setUserId(userVo.getId());
                    fm_tmp.setFlowId(flow.getId());
                    fm_tmp.setCreateTime(LocalDateTime.now());
                    flowMiddleMapper.insert(fm_tmp);
                }else{
                    flowMiddle.setIsDel(0);
                    flowMiddle.setUpdateTime(LocalDateTime.now());
                    flowMiddleMapper.updateById(flowMiddle);
                }
            }
        });
    }

    return userDB;
}

@Override
public User resetPassword(Long userId, String oldPassword, String newPassword) {
    AssertExt.hasId(userId, "userId为空");
    AssertExt.notBlank(oldPassword, "旧密码为空");
    AssertExt.notBlank(newPassword, "新密码为空");

    AssertExt.matches(".{8,20}", newPassword, "密码长度8到20位");
    User userDB = this.userMapper.selectById(userId);
    AssertExt.notNull(userDB, "user[%s] not exist", userId);

    boolean check = DigestUtils.sha1Hex(oldPassword + userDB.getSalt()).equals(userDB.getPassword());
    AssertExt.isTrue(check, "旧密码 错误");

    userDB.setPassword(DigestUtils.sha1Hex(newPassword + userDB.getSalt()));
    this.userMapper.updateById(userDB);
    this.oauthService.kickOutUser(userDB.getUserName());
    return userDB;
}


@Override
public IPage<UserVo> getUserList(Page page, UserVo userVo) {
    IPage<UserVo> userPage = this.userMapper.searchUser(page, userVo);
    userPage.getRecords().forEach(u -> {
        u.setRoleList(this.roleMapper.getUserRole(u.getId()));
        u.setPassword(null);
        u.setSalt(null);
    });
    return userPage;
}

@Override
public void resetUserPassword(Long id, String password) {
    AssertExt.hasId(id, "id为空");
    User userDB = this.userMapper.selectById(id);
    userDB.setPassword(DigestUtils.sha1Hex(password + userDB.getSalt()));
    this.userMapper.updateById(userDB);
    this.oauthService.kickOutUser(userDB.getUserName());
}

@Override
public List<Role> getUserRole(Long userId) {
    AssertExt.hasId(userId, "userId为空");
    User userDB = this.userMapper.selectById(userId);
    AssertExt.notNull(userDB, "无效用户ID[%s]", userId);
    return this.roleMapper.getUserRole(userId);
}

@Override
public List<Role> getUserRoleAll() {
    return this.roleMapper.getUserRoleAll();
}

@Override
public List<RolePermission> getUserRolePermission(Long userId) {
    AssertExt.hasId(userId, "userId为空");
    User userDB = this.userMapper.selectById(userId);
    AssertExt.notNull(userDB, "无效用户ID[%s]", userId);
    return this.roleMapper.getUserRolePermission(userId);
}

@Override
public void updateUserRole(List<Long> userIds, List<Long> roleIds, Long createUserId) {
    AssertExt.notEmpty(userIds, "userIds不能空");
    userIds.forEach(userId -> this.updateUserRole(userId, createUserId, roleIds));
}

private void updateUserRole(Long userId, Long createUserId, List<Long> roles) {
    AssertExt.hasId(userId, "无效userId");
    AssertExt.notNull(roles, "无效rolePermissions");
    User userDB = this.userMapper.selectById(userId);
    AssertExt.notNull(userDB, "user[%s]不存在");

    this.userRoleMapper.delete(new QueryWrapper<UserRole>().eq("user_id", userId));

    if (roles.isEmpty()) {
        log.warn("没有roleId传入");
        return;
    }

    List<Role> roleDBList = this.roleMapper.selectList(new QueryWrapper<Role>().in("id", roles.stream().distinct().collect(Collectors.toList())));
    if (roleDBList.isEmpty()) {
        log.warn("roleId均不存在");
        return;
    }
    roleDBList.stream().map(role -> new UserRole()
            .setUserId(userId)
            .setRoleId(role.getId())
            .setCreateUserId(createUserId)
            .setCreateTime(LocalDateTime.now())
    ).forEach(userRole -> {
        this.userRoleMapper.insert(userRole);
    });
}

@Override
@Transactional
public void addRole(RoleVo roleVo) {
    AssertExt.notNull(roleVo.getRoleName(), "角色名称为空");
    Role roleDB = this.roleMapper.selectOne(new QueryWrapper<Role>().eq("ROLE_NAME", roleVo.getRoleName()));
    AssertExt.isTrue(roleDB == null, "角色名称[%s] 已存在", roleVo.getRoleName());
    roleVo.setCreateTime(LocalDateTime.now());
    this.roleMapper.insert(roleVo);
    RoleVillage roleVillage=new RoleVillage();
    roleVillage.setRoleId(roleVo.getId());
    roleVillage.setVillageName(roleVo.getVillageName());
    int insert1 = this.roleVillageMapper.insert(roleVillage);
    if(insert1<1){
        new RuntimeException("新增角色村庄失败");
    }
    RoleWuye roleWuye=new RoleWuye();
    roleWuye.setRoleId(roleVo.getId());
    roleWuye.setVillageName(roleVo.getWuyeName());
    int insert = roleWuyeMapper.insert(roleWuye);
    if(insert<1){
        new RuntimeException("新增角色物业失败");
    }


}

@Override
public void updateRole(RoleVo roleVo) {
    AssertExt.hasId(roleVo.getId(),"ID为空");
    AssertExt.notNull(roleVo.getRoleName(),"请填写角色名称");
    AssertExt.notNull(roleVo.getRoleCode(),"请填写角色编码");

    Role roleDB = this.roleMapper.selectOne(new QueryWrapper<Role>().ne("id", roleVo.getId()).eq("role_name", roleVo.getRoleName()));
    AssertExt.isTrue(roleDB == null, "角色名称[%s] 已存在", roleVo.getRoleName());
    this.roleMapper.updateById(roleVo);
    this.rolePermissionMapper.delete(new QueryWrapper<RolePermission>().eq("role_id",roleVo.getId()));

    if(roleVo.getRolePermissionList()!=null && roleVo.getRolePermissionList().size()>0){
        for (RolePermission rolePermission:roleVo.getRolePermissionList()){
            rolePermission.setRoleId(roleVo.getId());
            rolePermission.setCreateBy(roleVo.getCreateBy());
            rolePermission.setCreateTime(LocalDateTime.now());
            this.rolePermissionMapper.insert(rolePermission);
        }
    }
    UpdateWrapper<RoleVillage> updateWrapper=new UpdateWrapper();
    LambdaUpdateWrapper<RoleVillage> eq = updateWrapper.lambda().set(RoleVillage::getVillageName, roleVo.getVillageName()).eq(RoleVillage::getRoleId, 
     roleVo.getId());
    int update = roleVillageMapper.update(null, eq);
    if(update<1){
        new RuntimeException("修改中间表失败");
    }
}

@Override
public IPage<Role> getRoleList(IPage<Role> page, RoleVo role) {
    QueryWrapper<Role> queryWrapper = new QueryWrapper<>();
    if (StringUtils.isNotBlank(role.getRoleName())) {
        queryWrapper.like("role_name", role.getRoleName());
    }
    if (role.getCreateTimeStart() != null) {
        queryWrapper.gt("create_time", role.getCreateTimeStart());
    }
    if (role.getCreateTimeEnd() != null) {
        queryWrapper.lt("create_time_end", role.getCreateTimeEnd());
    }
    queryWrapper.eq("del_flag",0);
    queryWrapper.orderByDesc("create_time");
    return this.roleMapper.selectPage(page, queryWrapper);
}

@Override
public List<RolePermission> getRolePermission(Long roleId) {
    AssertExt.hasId(roleId, "无效roleId");
    return this.rolePermissionMapper.selectList(new QueryWrapper<RolePermission>().eq("role_id", roleId));
}

@Override
public void updateRolePermission(List<Long> roleIds, List<RolePermission> rolePermissions, Long createUserId) {
    AssertExt.notEmpty(roleIds, "roleIds不能空");
    AssertExt.notNull(rolePermissions, "无效rolePermissions");
    rolePermissions.forEach((rolePermission) -> {
        AssertExt.notBlank(rolePermission.getPermissionValue(), "permissionValue 不能空");
        AssertExt.notBlank(rolePermission.getPermissionTitle(), "permissionTitle 不能空");
    });
    roleIds.forEach(id -> this.updateRolePermission(id, createUserId, rolePermissions));
}

private void updateRolePermission(Long roleId, Long createUserId, List<RolePermission> rolePermissions) {
    AssertExt.hasId(roleId, "无效roleId");
    AssertExt.notNull(rolePermissions, "无效rolePermissions");
    Role roleDB = this.roleMapper.selectById(roleId);
    AssertExt.notNull(roleDB, "role[%s]不存在");
    this.rolePermissionMapper.delete(new QueryWrapper<RolePermission>().eq("role_id", roleId));
    rolePermissions.forEach(rolePermission -> {
        rolePermission.setRoleId(roleId);
        rolePermission.setCreateUserId(createUserId);
        rolePermission.setCreateTime(LocalDateTime.now());
        this.rolePermissionMapper.insert(rolePermission);
    });
}


@Override
public void addDepartment(Department department) {
    AssertExt.notNull(department.getDepartmentName(), "部门名称为空");
    Department departmentDB = this.departmentMapper.selectOne(new QueryWrapper<Department>().eq("department_name", department.getDepartmentName()));
    AssertExt.isTrue(departmentDB == null, "该部门名称的已存在");

    department.setCreateTime(LocalDateTime.now());
    this.departmentMapper.insert(department);
}

@Override
public void updateDepartment(Department department) {
    AssertExt.hasId(department.getId(), "id为空");
    AssertExt.notNull(department.getDepartmentName(), "部门名称为空");
    Department departmentDB = this.departmentMapper.selectById(department.getId());
    AssertExt.notNull(departmentDB, "无效id【%s】", department.getId());
    List<Department> departmentList = this.departmentMapper.selectList(new QueryWrapper<Department>().ne("id", department.getId()).eq("department_name", department.getDepartmentName()));
    AssertExt.isTrue(departmentList.size() == 0, "该部门名称的已存在");

    this.departmentMapper.updateById(department);
}

@Override
public void delDepartment(Long id) {
    Department department = this.departmentMapper.selectById(id);
    AssertExt.notNull(department, "无效id");
   /* List<Member> member = this.memberMapper.selectList(new QueryWrapper<Member>().eq("department_id", id).ne("status", Member.EStatus.DIMISSION.val()));
    AssertExt.isTrue(member.size() <= 0, "不能删除,下面还有员工");*/
    department.setIsDel(1);
    this.departmentMapper.updateById(department);
}

@Override
public List<Department> getDepartmentAll() {
    return this.departmentMapper.selectList(new QueryWrapper<Department>().eq("is_del", 0));
}

@Override
public IPage<DepartmentVo> getDepartmentList(Page page, String departmentName) {
    IPage<DepartmentVo> departmentVoIPage = this.departmentMapper.getDepartmentList(page, departmentName);
    return departmentVoIPage;
}

@Override
public IPage<RoleVo> getRolePermissionList(Page page, RoleVo role) {
    IPage<RoleVo> rolePermissionList = this.roleMapper.getRolePermissionList(page, role);
    rolePermissionList.getRecords().forEach(role1 ->{
        role1.setRolePermissionList(this.rolePermissionMapper.selectList(new QueryWrapper<RolePermission>().eq("role_id",role1.getId())));
    });
    return rolePermissionList;

}

@Override
public void delRole(RoleVo roleVo) {
    AssertExt.hasId(roleVo.getId(),"id为空");
    Role role = this.roleMapper.selectById(roleVo.getId());
    AssertExt.isTrue(role!=null,"角色不存在");
    role.setDelFlag(1);
    role.setCreateTime(LocalDateTime.now());
    this.roleMapper.updateById(role);
}

@Override
public List<PermissionVo> getPermissionVoList(PermissionVo permissionVo) {
    List<PermissionVo> permissionVos =  permissionMapper.getSysPermissionVoAllList(permissionVo);
    if (permissionVos.size()==0){
        return null;
    }
    List<PermissionVo> permissionVoList = new ArrayList<>();
    if (permissionVos != null) {
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            for (int j = 0; j < permissionVos.size(); j++) {
                PermissionVo p = permissionVos.get(j);
                if (p.getId().equals(permissionVo1.getParentId())) {
                    if (p.getChildren() == null) {
                        p.setChildren(new ArrayList<>());
                    }
                    p.getChildren().add(permissionVo1);
                }
            }
        }
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            if (permissionVo1.getMenuType() != null && permissionVo1.getMenuType() == 0) {
                permissionVoList.add(permissionVo1);
            }
        }
    }
    return permissionVoList;
}

@Override
public void editPermissionVo(PermissionVo permissionVo) {
    AssertExt.notNull(permissionVo.getId(),"菜单ID不能为空");
    Permission permission = this.permissionMapper.selectById(permissionVo.getId());
    AssertExt.isFalse(permission==null,"菜单不存在");
    BeanUtils.copyProperties(permissionVo,permission);
    permissionVo.setCreateTime(LocalDateTime.now());
    this.permissionMapper.updateById(permissionVo);
}

@Override
public void delPermissionVo(PermissionVo permissionVo) {
    AssertExt.notNull(permissionVo.getId(), "菜单ID不能为空");
    Permission permission = this.permissionMapper.selectById(permissionVo.getId());
    AssertExt.isFalse(permission == null, "菜单不存在");
    permission.setDelFlag(1);
    this.permissionMapper.updateById(permission);
}

@Override
public Permission getPermissionInfoById(Long id) {
    AssertExt.hasId(id, "id为空");
    QueryWrapper<Permission> wrapper = new QueryWrapper<>();
    wrapper.eq("id", id).eq("DEL_FLAG", 0);
    Permission permission = this.permissionMapper.selectOne(wrapper);
    return permission;
}

@Override
public void addPermission(PermissionVo permissionVo) {
    AssertExt.notNull(permissionVo.getMenuType(), "菜单类型不能为空");
    if (permissionVo.getMenuType() > 0) {
        AssertExt.notNull(permissionVo.getParentId(), "请选择父类菜单");
    }
    permissionVo.setCreateTime(LocalDateTime.now());
    permissionVo.setUpdateTime(LocalDateTime.now());
    this.permissionMapper.insert(permissionVo);
}

@Override
public IPage<PermissionVo> getPermissionPage(Page page, PermissionVo permissionVo) {
    IPage<PermissionVo> permissionVoIPage=this.permissionMapper.getPermissionPage(page,permissionVo);
    return permissionVoIPage;
}

@Override
public IPage<RoleVo> getUserByRoleId(Page page,RoleVo roleVo) {
    IPage<RoleVo> roleIPage= roleMapper.getRoleList(page,roleVo);
    roleIPage.getRecords().forEach(role->{
        role.setUserList(this.userMapper.getUserByRoleId(role.getId()));
    });
    return roleIPage;
}

@Override
public void delRoleBatchUser(RoleVo roleVo) {
    AssertExt.notEmpty(roleVo.getRoleUserList(),"需要删除的用户列表不能为空");
    AssertExt.notNull(roleVo.getId(),"角色ID不能为空");

    for (UserVo userVo:roleVo.getRoleUserList()){
        QueryWrapper<UserRole> ur=new QueryWrapper<>();
        ur.eq("user_id",userVo.getId()).eq("role_id",roleVo.getId());
        this.userRoleMapper.delete(ur);
    }
}

@Override
public RoleVo getRoleOne(RoleVo roleVo) {
    //获取角色权限信息
    List<RolePermission> rolePermissions = rolePermissionMapper.selectList(new QueryWrapper<RolePermission>().eq("role_id", roleVo.getId()));
    roleVo.setRolePermissionList(rolePermissions);

    Role role = this.roleMapper.selectById(roleVo.getId());
    BeanUtils.copyProperties(role,roleVo);
}

@Override
public List<PermissionVo> getPermissionVoAllListByRoleId(PermissionVo permissionVo) {
    AssertExt.notNull(permissionVo.getRoleId(), "角色Id不能为空");
    Role role = this.roleMapper.selectById(permissionVo.getRoleId());
    if (role == null) {
        AssertExt.notNull(null, "角色不存在");
    }
    List<PermissionVo> permissionVos=permissionMapper.getPermissionVoAllListByRoleId(permissionVo);
    return permissionVos;
}

@Override
public List<PermissionVo> getPermissionInfo(PermissionVo permissionVo) {
    List<PermissionVo> permissionVos= permissionMapper.getPermissionInfo(permissionVo);
    if (permissionVos.size()==0){
        return null;
    }
    List<PermissionVo> permissionVoList = new ArrayList<>();
    if (permissionVos != null) {
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            for (int j = 0; j < permissionVos.size(); j++) {
                PermissionVo p = permissionVos.get(j);
                if (p.getId().equals(permissionVo1.getParentId())) {
                    if (p.getChildren() == null) {
                        p.setChildren(new ArrayList<>());
                    }
                    p.getChildren().add(permissionVo1);
                }
            }
        }
        for (int i = 0; i < permissionVos.size(); i++) {
            PermissionVo permissionVo1 = permissionVos.get(i);
            if (permissionVo1.getMenuType() != null && permissionVo1.getMenuType() == 0) {
                permissionVoList.add(permissionVo1);
            }
        }
    }
    return permissionVoList;
}

@Override
@Transactional
public void delBatchPermissionInfo(List<Long> ids) {
    AssertExt.notNull(ids,"未获取到id");
    UpdateWrapper<Permission> wrapper = new UpdateWrapper<>();
    wrapper.set("del_flag",1).in("id",ids);
    this.permissionMapper.update(null,wrapper);

    rolePermissionMapper.deleteBatch(ids);
}

@Override
public void editRolePermission(RoleVo roleVo) {
    AssertExt.hasId(roleVo.getId(), "角色ID不可为空");
    AssertExt.notNull(roleVo.getRolePermissionList(), "权限数据不可为空");
    Role roleDB = this.roleMapper.selectById(roleVo.getId());
    if (roleDB == null) {
        AssertExt.notNull(null, "当前角色不存在");
    }

    this.rolePermissionMapper.delete(new QueryWrapper<RolePermission>().eq("ROLE_ID", roleVo.getId()));

    if (roleVo.getRolePermissionList() != null && roleVo.getRolePermissionList().size() > 0) {
        for (RolePermission rolePermission : roleVo.getRolePermissionList()) {
            rolePermission.setRoleId(roleVo.getId());
            rolePermission.setCreateTime(LocalDateTime.now());
            this.rolePermissionMapper.insert(rolePermission);
        }
    }
}

@Override
public void addRoleBatchUser(RoleVo roleVo) {
    AssertExt.notNull(roleVo.getUserList(), "用户列表不能为空");
    AssertExt.notNull(roleVo.getId(), "角色id不能为空");
    Role role = this.roleMapper.selectById(roleVo.getId());
    if (role == null) {
        AssertExt.notNull(null, "角色不存在");
    }
    for (UserVo userVo : roleVo.getUserList()) {
        User u = this.userMapper.selectById(userVo.getId());
        AssertExt.notNull(u, "用户不存在");
        UserRole userVo1 = this.userRoleMapper.selectOne(new QueryWrapper<UserRole>()
                .eq("USER_ID", userVo.getId())
                .eq("ROLE_ID", roleVo.getId()));
        if (userVo1 == null) {
            UserRole ur = new UserRole();
            ur.setUserId(userVo.getId());
            ur.setRoleId(roleVo.getId());
            ur.setCreateTime(LocalDateTime.now());
            this.userRoleMapper.insert(ur);
        }
    }
}

@Override
public List<RolePermissionVo> getCurrentUserRolePermissionVo(Long userId) {
    AssertExt.hasId(userId, "userId为空");
    User userDB = this.userMapper.selectById(userId);
    AssertExt.notNull(userDB, "无效用户ID[%s]", userId);
    List<RolePermissionVo> permissionVos = this.roleMapper.getUserRolePermissionVo(userId);
    return permissionVos;
}

@Override
public List<Village> getVillageByRoleId(Long userId) {
    if(userId==1){
        List<Village> adminVillage=villageMapper.getVillage();
        return adminVillage;
    }
    List<Village> village=userRoleMapper.getVillage(userId);

    return village;
}
⚠️ **GitHub.com Fallback** ⚠️