修改角色管理中权限分配 新增登录日志表
修改 @Create 标识为 @since
This commit is contained in:
@@ -10,7 +10,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||
* 权限管理模块启动类
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/13 17:38
|
||||
* @since 2023/9/13 17:38
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@EnableDiscoveryClient
|
||||
|
@@ -1,14 +1,14 @@
|
||||
package com.yovinchen.xlcs.acl.controller;
|
||||
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.yovinchen.xlcs.acl.service.AdminService;
|
||||
import com.yovinchen.xlcs.acl.service.RoleService;
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.common.utils.MD5;
|
||||
import com.yovinchen.xlcs.model.acl.Admin;
|
||||
import com.yovinchen.xlcs.vo.acl.AdminQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiParam;
|
||||
@@ -25,7 +25,7 @@ import java.util.Map;
|
||||
* 用户管理 前端控制器
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 10:38
|
||||
* @since 2023/9/14 10:38
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/admin/acl/user")
|
||||
|
@@ -15,7 +15,7 @@ import java.util.Map;
|
||||
* Package: com.yovinchen.xlcs.acl.controller
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/13 18:00
|
||||
* @since 2023/9/13 18:00
|
||||
*/
|
||||
|
||||
@Api(tags = "登录接口")
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.controller;
|
||||
|
||||
import com.yovinchen.xlcs.acl.service.PermissionService;
|
||||
import com.yovinchen.xlcs.acl.service.RoleService;
|
||||
import com.yovinchen.xlcs.common.result.Result;
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import io.swagger.annotations.Api;
|
||||
@@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ClassName: PermissionController
|
||||
@@ -17,7 +19,7 @@ import java.util.List;
|
||||
* 菜单服务
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 14:03
|
||||
* @since 2023/9/14 14:03
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/admin/acl/permission")
|
||||
@@ -28,6 +30,8 @@ public class PermissionController {
|
||||
@Autowired
|
||||
private PermissionService permissionService;
|
||||
|
||||
@Autowired
|
||||
private RoleService roleService;
|
||||
@ApiOperation(value = "获取菜单")
|
||||
@GetMapping
|
||||
public Result index() {
|
||||
@@ -71,4 +75,29 @@ public class PermissionController {
|
||||
throw new RuntimeException("递归删除菜单异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据角色获取菜单数据")
|
||||
@GetMapping("/toAssign/{roleId}")
|
||||
public Result toAssign(@PathVariable Long roleId) {
|
||||
Map<String, Object> roleMap = permissionService.findPermissionByRoleId(roleId);
|
||||
return Result.ok(roleMap);
|
||||
}
|
||||
|
||||
@ApiOperation(value = "根据用户分配角色")
|
||||
@PostMapping("/doAssign")
|
||||
public Result doAssign(@RequestParam Long roleId, @RequestParam Long[] permissionId) {
|
||||
permissionService.saveRolePermissionRealtionShip(roleId, permissionId);
|
||||
return Result.ok(null);
|
||||
}
|
||||
// @ApiOperation(value = "获取一个角色的所有权限列表")
|
||||
// @GetMapping("toAssign/{id}")
|
||||
// public Result toAssign(@PathVariable Long id) {
|
||||
// try {
|
||||
// Map<String, Object> result = permissionService.getPermissionById(id);
|
||||
// return Result.ok(result);
|
||||
// } catch (Exception e) {
|
||||
// // 处理异常,例如记录日志或者抛出自定义异常
|
||||
// throw new RuntimeException("获取一个角色的所有权限列表异常", e);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
@@ -15,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* ClassName: RoleController
|
||||
@@ -23,7 +22,7 @@ import java.util.Map;
|
||||
* 角色管理 前端控制器
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 09:09
|
||||
* @since 2023/9/14 09:09
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/admin/acl/role")
|
||||
@@ -111,16 +110,4 @@ public class RoleController {
|
||||
throw new RuntimeException("根据id列表删除角色异常", e);
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation(value = "获取一个角色的所有权限列表")
|
||||
@GetMapping("toAssign/{id}")
|
||||
public Result toAssign(@PathVariable Long id) {
|
||||
try {
|
||||
Map<String, Object> result = permissionService.getPermissionById(id);
|
||||
return Result.ok(result);
|
||||
} catch (Exception e) {
|
||||
// 处理异常,例如记录日志或者抛出自定义异常
|
||||
throw new RuntimeException("获取一个角色的所有权限列表异常", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Admin;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.yovinchen.xlcs.model.acl.Admin;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
@@ -10,7 +10,7 @@ import org.springframework.stereotype.Repository;
|
||||
* 用户管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 10:45
|
||||
* @since 2023/9/14 10:45
|
||||
*/
|
||||
@Repository
|
||||
public interface AdminMapper extends BaseMapper<Admin> {
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
@@ -9,7 +9,7 @@ import org.springframework.stereotype.Repository;
|
||||
* Package: com.yovinchen.xlcs.acl.mapper
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 11:15
|
||||
* @since 2023/9/14 11:15
|
||||
*/
|
||||
@Repository
|
||||
public interface AdminRoleMapper extends BaseMapper<AdminRole> {
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
@@ -10,7 +10,7 @@ import org.springframework.stereotype.Repository;
|
||||
* 菜单Mapper接口
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 13:59
|
||||
* @since 2023/9/14 13:59
|
||||
*/
|
||||
@Repository
|
||||
public interface PermissionMapper extends BaseMapper<Permission> {
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Role;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.yovinchen.xlcs.model.acl.Role;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
@@ -10,7 +10,7 @@ import org.springframework.stereotype.Repository;
|
||||
* 角色管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 09:11
|
||||
* @since 2023/9/14 09:11
|
||||
*/
|
||||
@Repository
|
||||
public interface RoleMapper extends BaseMapper<Role> {
|
||||
|
@@ -1,14 +1,14 @@
|
||||
package com.yovinchen.xlcs.acl.mapper;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.RolePermission;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.yovinchen.xlcs.model.acl.RolePermission;
|
||||
|
||||
/**
|
||||
* ClassName: RolePermissionMapper
|
||||
* Package: com.yovinchen.xlcs.acl.mapper
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 15:07
|
||||
* @since 2023/9/14 15:07
|
||||
*/
|
||||
public interface RolePermissionMapper extends BaseMapper<RolePermission> {
|
||||
}
|
||||
|
@@ -1,14 +1,14 @@
|
||||
package com.yovinchen.xlcs.acl.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
|
||||
/**
|
||||
* ClassName: AdminRoleService
|
||||
* Package: com.yovinchen.xlcs.acl.service
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 11:15
|
||||
* @since 2023/9/14 11:15
|
||||
*/
|
||||
public interface AdminRoleService extends IService<AdminRole> {
|
||||
}
|
||||
|
@@ -1,10 +1,10 @@
|
||||
package com.yovinchen.xlcs.acl.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Admin;
|
||||
import com.yovinchen.xlcs.vo.acl.AdminQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.yovinchen.xlcs.model.acl.Admin;
|
||||
import com.yovinchen.xlcs.vo.acl.AdminQueryVo;
|
||||
|
||||
/**
|
||||
* ClassName: AdminService
|
||||
@@ -12,7 +12,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
||||
* 用户管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 10:44
|
||||
* @since 2023/9/14 10:44
|
||||
*/
|
||||
public interface AdminService extends IService<Admin> {
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
package com.yovinchen.xlcs.acl.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -12,7 +12,7 @@ import java.util.Map;
|
||||
* 权限服务
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 14:01
|
||||
* @since 2023/9/14 14:01
|
||||
*/
|
||||
public interface PermissionService extends IService<Permission> {
|
||||
|
||||
@@ -23,4 +23,8 @@ public interface PermissionService extends IService<Permission> {
|
||||
boolean removeChildById(Long id);
|
||||
|
||||
Map<String, Object> getPermissionById(Long id);
|
||||
|
||||
void saveRolePermissionRealtionShip(Long roleId, Long[] permissionId);
|
||||
|
||||
Map<String, Object> findPermissionByRoleId(Long roleId);
|
||||
}
|
||||
|
@@ -1,10 +1,10 @@
|
||||
package com.yovinchen.xlcs.acl.service;
|
||||
|
||||
import com.yovinchen.xlcs.model.acl.Role;
|
||||
import com.yovinchen.xlcs.vo.acl.RoleQueryVo;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.yovinchen.xlcs.model.acl.Role;
|
||||
import com.yovinchen.xlcs.vo.acl.RoleQueryVo;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.Map;
|
||||
* 用户管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 09:10
|
||||
* @since 2023/9/14 09:10
|
||||
*/
|
||||
public interface RoleService extends IService<Role> {
|
||||
|
||||
|
@@ -1,9 +1,9 @@
|
||||
package com.yovinchen.xlcs.acl.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.yovinchen.xlcs.acl.mapper.AdminRoleMapper;
|
||||
import com.yovinchen.xlcs.acl.service.AdminRoleService;
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
@@ -11,7 +11,7 @@ import org.springframework.stereotype.Service;
|
||||
* Package: com.yovinchen.xlcs.acl.service.impl
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 11:15
|
||||
* @since 2023/9/14 11:15
|
||||
*/
|
||||
@Service
|
||||
public class AdminRoleServiceImpl extends ServiceImpl<AdminRoleMapper, AdminRole>
|
||||
|
@@ -20,7 +20,7 @@ import org.springframework.util.StringUtils;
|
||||
* 用户管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 10:44
|
||||
* @since 2023/9/14 10:44
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
|
@@ -1,27 +1,38 @@
|
||||
package com.yovinchen.xlcs.acl.service.impl;
|
||||
|
||||
import com.yovinchen.xlcs.acl.mapper.PermissionMapper;
|
||||
import com.yovinchen.xlcs.acl.service.PermissionService;
|
||||
import com.yovinchen.xlcs.acl.utils.PermissionHelper;
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.yovinchen.xlcs.acl.mapper.PermissionMapper;
|
||||
import com.yovinchen.xlcs.acl.service.PermissionService;
|
||||
import com.yovinchen.xlcs.acl.service.RolePermissionService;
|
||||
import com.yovinchen.xlcs.acl.utils.PermissionHelper;
|
||||
import com.yovinchen.xlcs.model.acl.Permission;
|
||||
import com.yovinchen.xlcs.model.acl.RolePermission;
|
||||
import com.yovinchen.xlcs.model.base.BaseEntity;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* ClassName: PermissionServiceImpl
|
||||
* Package: com.yovinchen.xlcs.acl.service.impl
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 14:02
|
||||
* @since 2023/9/14 14:02
|
||||
*/
|
||||
@Service
|
||||
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {
|
||||
|
||||
@Autowired
|
||||
private RolePermissionService rolePermissionService;
|
||||
|
||||
/**
|
||||
* 获取所有菜单
|
||||
@@ -57,6 +68,71 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分配菜单
|
||||
*
|
||||
* @param roleId
|
||||
* @param permissionIds
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveRolePermissionRealtionShip(Long roleId, Long[] permissionIds) {
|
||||
//删除用户分配的角色数据
|
||||
rolePermissionService.remove(new LambdaQueryWrapper<RolePermission>().eq(RolePermission::getRoleId, roleId));
|
||||
|
||||
//分配新的角色
|
||||
List<RolePermission> rolePermissionList = new ArrayList<>();
|
||||
for (Long permissionId : permissionIds) {
|
||||
if (StringUtils.isEmpty(roleId)) {
|
||||
continue;
|
||||
}
|
||||
RolePermission rolePermission = new RolePermission();
|
||||
rolePermission.setRoleId(roleId);
|
||||
rolePermission.setPermissionId(permissionId);
|
||||
rolePermissionList.add(rolePermission);
|
||||
}
|
||||
rolePermissionService.saveBatch(rolePermissionList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户获取菜单数据
|
||||
*
|
||||
* @param roleId
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> findPermissionByRoleId(Long roleId) {
|
||||
//查询所有的角色
|
||||
List<Permission> allPermissionList = queryAllMenu();
|
||||
List<Permission> assignPermission1 = baseMapper.selectList(null);
|
||||
|
||||
//拥有的角色id
|
||||
List<RolePermission> existRolePermissionList = rolePermissionService.list(new LambdaQueryWrapper<RolePermission>().eq(RolePermission::getRoleId, roleId)
|
||||
.select(RolePermission::getPermissionId));
|
||||
|
||||
List<Long> existPermissionList = existRolePermissionList.stream()
|
||||
.map(RolePermission::getPermissionId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
//对角色进行分类
|
||||
List<Permission> assignPermission2 = new ArrayList<>();
|
||||
for (Permission permission : assignPermission1) {
|
||||
//已分配
|
||||
if (existPermissionList.contains(permission.getId())) {
|
||||
assignPermission2.add(permission);
|
||||
}
|
||||
}
|
||||
List<Long> assignPermission = assignPermission2.stream()
|
||||
.map(BaseEntity::getId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Map<String, Object> roleMap = new HashMap<>();
|
||||
roleMap.put("assignPermission", assignPermission);
|
||||
roleMap.put("allPermissionList", allPermissionList);
|
||||
return roleMap;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 递归获取子节点
|
||||
*
|
||||
@@ -64,8 +140,7 @@ public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permiss
|
||||
* @param idList
|
||||
*/
|
||||
private void selectChildListById(Long id, List<Long> idList) {
|
||||
List<Permission> childList = baseMapper.selectList(new QueryWrapper<Permission>()
|
||||
.eq("pid", id)
|
||||
List<Permission> childList = baseMapper.selectList(new QueryWrapper<Permission>().eq("pid", id)
|
||||
.select("id"));
|
||||
childList.forEach(item -> {
|
||||
idList.add(item.getId());
|
||||
|
@@ -1,16 +1,16 @@
|
||||
package com.yovinchen.xlcs.acl.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.yovinchen.xlcs.acl.mapper.RoleMapper;
|
||||
import com.yovinchen.xlcs.acl.service.AdminRoleService;
|
||||
import com.yovinchen.xlcs.acl.service.RoleService;
|
||||
import com.yovinchen.xlcs.model.acl.AdminRole;
|
||||
import com.yovinchen.xlcs.model.acl.Role;
|
||||
import com.yovinchen.xlcs.vo.acl.RoleQueryVo;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
|
||||
* 角色管理
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 09:11
|
||||
* @since 2023/9/14 09:11
|
||||
*/
|
||||
@Service
|
||||
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
|
||||
|
@@ -10,7 +10,7 @@ import java.util.List;
|
||||
* Package: com.yovinchen.xlcs.acl.utils
|
||||
*
|
||||
* @author yovinchen
|
||||
* @Create 2023/9/14 14:23
|
||||
* @since 2023/9/14 14:23
|
||||
*/
|
||||
public class PermissionHelper {
|
||||
|
||||
|
Reference in New Issue
Block a user