Compare commits
1 Commits
77769558ac
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22f0b546ad |
56
pom.xml
56
pom.xml
@@ -3,9 +3,9 @@
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<parent>
|
||||
<groupId>com.xiang</groupId>
|
||||
<artifactId>xservice-parent-starter</artifactId>
|
||||
<version>2.0</version>
|
||||
<groupId>com.xiang.pom</groupId>
|
||||
<artifactId>xmc-parent</artifactId>
|
||||
<version>1.0</version>
|
||||
</parent>
|
||||
<packaging>pom</packaging>
|
||||
<modules>
|
||||
@@ -53,40 +53,42 @@
|
||||
<version>5.7.11</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.xiang</groupId>
|
||||
<artifactId>xservice-common</artifactId>
|
||||
<version>2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.xiang</groupId>
|
||||
<artifactId>xservice-mysql-starter</artifactId>
|
||||
<version>2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.xiang</groupId>
|
||||
<artifactId>xservice-cache-starter</artifactId>
|
||||
<version>2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.mapstruct</groupId>
|
||||
<artifactId>mapstruct</artifactId>
|
||||
<version>1.5.5.Final</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 系统二方包 -->
|
||||
<dependency>
|
||||
<groupId>com.xiang</groupId>
|
||||
<artifactId>xservice-message-starter</artifactId>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-mysql-starter</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-cache-starter</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-common</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-message-starter</artifactId>
|
||||
<version>1.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-http-starter</artifactId>
|
||||
<version>2.0</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.pagehelper</groupId>
|
||||
<artifactId>pagehelper-spring-boot-starter</artifactId>
|
||||
<version>1.4.7</version>
|
||||
<groupId>com.xiang.starter</groupId>
|
||||
<artifactId>xmc-logger-starter</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.xiang;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||
@@ -7,11 +9,14 @@ import org.springframework.security.config.annotation.method.configuration.Enabl
|
||||
|
||||
@SpringBootApplication
|
||||
@ConfigurationPropertiesScan(basePackages = {
|
||||
"com.xiang.xservice.basic.xservice.aliyun.config"
|
||||
|
||||
})
|
||||
@EnableMethodSecurity(prePostEnabled = true)
|
||||
public class AuthApplication {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AuthApplication.class);
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(AuthApplication.class, args);
|
||||
log.info("auth-center start success!");
|
||||
}
|
||||
}
|
||||
@@ -34,13 +34,13 @@ public class DeptController {
|
||||
private final XDeptService deptService;
|
||||
|
||||
@PostMapping("/private/dept/list")
|
||||
public Result<DeptDTO> getDeptList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") DeptQueryRequest request) {
|
||||
return Result.success(deptService.getDeptList(request));
|
||||
public Result<List<DeptDTO>> getDeptList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") DeptQueryRequest request) {
|
||||
return Result.data(deptService.getDeptList(request));
|
||||
}
|
||||
|
||||
@GetMapping("/private/dept/info/{id}")
|
||||
public Result<DeptDTO> getDeptInfo(@PathVariable Long id) {
|
||||
return Result.success(deptService.getDeptInfo(id));
|
||||
return Result.data(deptService.getDeptInfo(id));
|
||||
}
|
||||
|
||||
@PostMapping("/private/dept/add")
|
||||
|
||||
@@ -34,19 +34,19 @@ public class RoleController {
|
||||
private final XRoleService roleService;
|
||||
|
||||
@PostMapping("/private/role/list")
|
||||
public Result<RoleDTO> getRoleList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") RoleQueryRequest request) {
|
||||
return Result.success(roleService.getRoleList(request));
|
||||
public Result<List<RoleDTO>> getRoleList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") RoleQueryRequest request) {
|
||||
return Result.data(roleService.getRoleList(request));
|
||||
}
|
||||
|
||||
@GetMapping("/private/role/info/{id}")
|
||||
public Result<RoleDTO> getRoleInfo(@PathVariable Long id) {
|
||||
return Result.success(roleService.getRoleInfo(id));
|
||||
return Result.data(roleService.getRoleInfo(id));
|
||||
}
|
||||
|
||||
@PostMapping("/private/role/add")
|
||||
public Result<Boolean> addRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") RoleAddRequest request) {
|
||||
try {
|
||||
return Result.success(roleService.addRole(request));
|
||||
return Result.data(roleService.addRole(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("角色新增异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -59,7 +59,7 @@ public class RoleController {
|
||||
@PostMapping("/private/role/update")
|
||||
public Result<Boolean> updateRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") RoleUpdateRequest request) {
|
||||
try {
|
||||
return Result.success(roleService.updateRole(request));
|
||||
return Result.data(roleService.updateRole(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("角色编辑异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -72,7 +72,7 @@ public class RoleController {
|
||||
@PostMapping("/private/role/del")
|
||||
public Result<Boolean> delRole(@RequestParam @Valid @NotEmpty(message = "请求参数不能为空") List<Long> ids) {
|
||||
try {
|
||||
return Result.success(roleService.delRole(ids));
|
||||
return Result.data(roleService.delRole(ids));
|
||||
} catch (BusinessException e) {
|
||||
log.error("角色删除异常,请求:{}", ids, e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -85,7 +85,7 @@ public class RoleController {
|
||||
@PostMapping("/private/role/setUser")
|
||||
public Result<Boolean> setUserRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") RoleUserUpdateRequest request) {
|
||||
try {
|
||||
return Result.success(roleService.setUserRole(request));
|
||||
return Result.data(roleService.setUserRole(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("角色用户关联异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
|
||||
@@ -31,7 +31,7 @@ public class TokenController implements TokenApi {
|
||||
public Result<LoginResp> login(@RequestBody @NotNull(message = "请求参数不能为空") @Valid LoginRequest request) {
|
||||
try {
|
||||
LoginResp login = userService.login(request);
|
||||
return Result.success("操作成功", login);
|
||||
return Result.data(login);
|
||||
} catch (BusinessException e) {
|
||||
log.error("【用户登录】用户登录失败,{}", e.getMessage(), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -47,7 +47,7 @@ public class TokenController implements TokenApi {
|
||||
try {
|
||||
RegisterResp registerResp = userService.userRegister(request);
|
||||
if (Objects.nonNull(registerResp)) {
|
||||
return Result.success("操作成功", registerResp);
|
||||
return Result.data(registerResp);
|
||||
}
|
||||
} catch (BusinessException e) {
|
||||
log.error("【用户注册】用户注册失败:{}", e.getMessage(), e);
|
||||
@@ -61,6 +61,6 @@ public class TokenController implements TokenApi {
|
||||
@GetMapping("/private/auth/getInfo")
|
||||
public Result<UserDTO> getUserInfo() {
|
||||
// todo token的工具类,直接获取token中的userId无需传参
|
||||
return Result.success(userService.getUserDetail(1L));
|
||||
return Result.data(userService.getUserDetail(1L));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.xiang.xservice.auth.server.controller;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserDeptUpdateRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest;
|
||||
@@ -33,19 +33,19 @@ public class UserController {
|
||||
private final XUserService userService;
|
||||
|
||||
@PostMapping("/private/user/list")
|
||||
public Result<PageInfo<UserResp>> getUserList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserQueryRequest request) {
|
||||
return Result.success(userService.getUserList(request));
|
||||
public Result<Page<UserResp>> getUserList(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserQueryRequest request) {
|
||||
return Result.data(userService.getUserList(request));
|
||||
}
|
||||
|
||||
@GetMapping("/private/user/info/{id}")
|
||||
public Result<UserResp> getUserById(@PathVariable("id") Long id) {
|
||||
return Result.success(userService.getUserInfo(id));
|
||||
return Result.data(userService.getUserInfo(id));
|
||||
}
|
||||
|
||||
@PostMapping("/private/user/add")
|
||||
public Result<Boolean> addUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserAddRequest request) {
|
||||
try {
|
||||
return Result.success(userService.addUser(request));
|
||||
return Result.data(userService.addUser(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("用户新增异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -58,7 +58,7 @@ public class UserController {
|
||||
@PostMapping("/private/user/update")
|
||||
public Result<Boolean> updateUser(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserUpdateRequest request) {
|
||||
try {
|
||||
return Result.success(userService.updateUser(request));
|
||||
return Result.data(userService.updateUser(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("用户编辑异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -71,7 +71,7 @@ public class UserController {
|
||||
@PostMapping("/private/user/del")
|
||||
public Result<Boolean> delUser(@RequestParam @Valid @NotEmpty(message = "请求参数不能为空") List<Long> ids) {
|
||||
try {
|
||||
return Result.success(userService.delUser(ids));
|
||||
return Result.data(userService.delUser(ids));
|
||||
} catch (BusinessException e) {
|
||||
log.error("用户删除异常,请求:{}", JSON.toJSONString(ids), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -84,7 +84,7 @@ public class UserController {
|
||||
@PostMapping("/private/user/setDept")
|
||||
public Result<Boolean> setUserDept(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserDeptUpdateRequest request) {
|
||||
try {
|
||||
return Result.success(userService.setUserDept(request));
|
||||
return Result.data(userService.setUserDept(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("用户设置部门异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
@@ -97,7 +97,7 @@ public class UserController {
|
||||
@PostMapping("/private/user/setRole")
|
||||
public Result<Boolean> setUserRole(@RequestBody @Valid @NotNull(message = "请求参数不能为空") UserRoleUpdateRequest request) {
|
||||
try {
|
||||
return Result.success(userService.setUserRole(request));
|
||||
return Result.data(userService.setUserRole(request));
|
||||
} catch (BusinessException e) {
|
||||
log.error("用户设置角色异常,请求:{}", JSON.toJSONString(request), e);
|
||||
return Result.error(e.getMessage());
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.xiang.xservice.auth.server.controller;
|
||||
|
||||
import com.xiang.xmc.service.message.aliyun.smscode.ISmsCodeService;
|
||||
import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest;
|
||||
import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO;
|
||||
import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum;
|
||||
import com.xiang.xservice.auth.service.service.ValidCodeGenerateFactory;
|
||||
import com.xiang.xservice.basic.common.resp.Result;
|
||||
import com.xiang.xservice.basic.utils.RandomCodeUtils;
|
||||
import com.xiang.xservice.basic.xservice.aliyun.smscode.ISmsCodeService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@@ -45,7 +45,7 @@ public class ValidationCodeController {
|
||||
captchaImage = validCodeGenerateFactory.get(CaptchaTypeEnum.NORMAL_CAPTCHA_IMAGE.getType()).getCaptchaImage(request);
|
||||
}
|
||||
}
|
||||
return Result.success(captchaImage);
|
||||
return Result.data(captchaImage);
|
||||
} catch (Exception e) {
|
||||
log.error("获取验证码失败", e);
|
||||
}
|
||||
|
||||
@@ -12,16 +12,16 @@ spring:
|
||||
primary: master
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://rm-bp15t34gqx62jm069ro.mysql.rds.aliyuncs.com:3306/xservice-user?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
||||
url: jdbc:mysql://120.27.153.87:3306/xservice-user?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
|
||||
username: root
|
||||
password: xb#UWqnhH24&XpX
|
||||
password: sdkljfikdfn@123
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
sshConnect: false
|
||||
redis:
|
||||
host: r-bp1wt59a6nfyt4e3ltpd.redis.rds.aliyuncs.com
|
||||
port: 6379
|
||||
password: Xiang0000 # 如果无密码可以省略
|
||||
database: 0
|
||||
database: 10
|
||||
timeout: 5000
|
||||
lettuce:
|
||||
pool:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.xiang.xservice.auth.service.convert;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserQueryRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserUpdateRequest;
|
||||
@@ -17,7 +17,7 @@ public interface XUserConvert {
|
||||
XUser toDO (UserAddRequest request);
|
||||
XUser toDO (UserUpdateRequest request);
|
||||
|
||||
PageInfo<UserResp> toPage(PageInfo<XUser> list);
|
||||
|
||||
UserResp toResp(XUser user);
|
||||
|
||||
Page<UserResp> toPage(Page<XUser> page);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.xiang.xservice.auth.service.repository.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xiang.xservice.auth.service.entity.XUser;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
@@ -10,7 +12,7 @@ import java.util.List;
|
||||
|
||||
@Repository
|
||||
@Mapper
|
||||
public interface XUserMapper {
|
||||
public interface XUserMapper extends BaseMapper<XUser> {
|
||||
|
||||
/**
|
||||
* 根据用户名查询用户
|
||||
@@ -38,7 +40,7 @@ public interface XUserMapper {
|
||||
* @param user
|
||||
* @return
|
||||
*/
|
||||
List<XUser> getUserList(XUser user);
|
||||
Page<XUser> getUserList(XUser user);
|
||||
|
||||
/**
|
||||
* 查询用户详情
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.xiang.xservice.auth.service.service;
|
||||
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.xiang.xservice.auth.api.dto.req.LoginRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.RegisterRequest;
|
||||
import com.xiang.xservice.auth.api.dto.req.user.UserAddRequest;
|
||||
@@ -23,7 +23,7 @@ public interface XUserService {
|
||||
|
||||
RegisterResp userRegister(RegisterRequest request);
|
||||
|
||||
PageInfo<UserResp> getUserList(UserQueryRequest request);
|
||||
Page<UserResp> getUserList(UserQueryRequest request);
|
||||
|
||||
UserResp getUserInfo(Long id);
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package com.xiang.xservice.auth.service.service.impl;
|
||||
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.xiang.xmc.service.cache.service.IRedisService;
|
||||
import com.xiang.xservice.auth.api.code.Code01UserErrorCode;
|
||||
import com.xiang.xservice.auth.api.code.Code02RoleErrorCode;
|
||||
import com.xiang.xservice.auth.api.code.Code03DeptErrorCode;
|
||||
@@ -41,7 +43,6 @@ import com.xiang.xservice.auth.service.service.XUserService;
|
||||
import com.xiang.xservice.basic.enums.DelStatusEnum;
|
||||
import com.xiang.xservice.basic.exception.BusinessException;
|
||||
import com.xiang.xservice.basic.utils.PrimaryKeyUtils;
|
||||
import com.xiang.xservice.cache.service.IRedisService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
@@ -220,14 +221,10 @@ public class XUserServiceImpl implements XUserService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageInfo<UserResp> getUserList(UserQueryRequest request) {
|
||||
PageHelper.startPage(request.getCurrent(), request.getPageSize());
|
||||
List<XUser> userList = userMapper.getUserList(userConvert.toDO(request));
|
||||
if (CollectionUtils.isEmpty(userList)) {
|
||||
return new PageInfo<>();
|
||||
}
|
||||
PageInfo<XUser> pageInfo = new PageInfo<>(userList);
|
||||
return userConvert.toPage(pageInfo);
|
||||
public Page<UserResp> getUserList(UserQueryRequest request) {
|
||||
Page<XUser> page = new Page<>(request.getCurrent(), request.getPageSize());
|
||||
LambdaQueryWrapper<XUser> lambdaQueryWrapper = Wrappers.lambdaQuery();
|
||||
return userConvert.toPage(userMapper.selectPage(page, lambdaQueryWrapper));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.xiang.xservice.auth.service.service.impl.captcha;
|
||||
|
||||
import com.xiang.xmc.service.cache.service.IRedisService;
|
||||
import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest;
|
||||
import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO;
|
||||
import com.xiang.xservice.auth.service.constants.RedisConstant;
|
||||
import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum;
|
||||
import com.xiang.xservice.auth.service.service.ICaptchaService;
|
||||
import com.xiang.xservice.basic.utils.RandomCodeUtils;
|
||||
import com.xiang.xservice.cache.service.IRedisService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.xiang.xservice.auth.service.service.impl.captcha;
|
||||
|
||||
import com.xiang.xmc.service.cache.service.IRedisService;
|
||||
import com.xiang.xservice.auth.api.dto.req.CaptchaImageRequest;
|
||||
import com.xiang.xservice.auth.api.dto.resp.CaptchaDTO;
|
||||
import com.xiang.xservice.auth.service.constants.RedisConstant;
|
||||
import com.xiang.xservice.auth.service.enums.CaptchaTypeEnum;
|
||||
import com.xiang.xservice.auth.service.service.ICaptchaService;
|
||||
import com.xiang.xservice.basic.utils.RandomCodeUtils;
|
||||
import com.xiang.xservice.cache.service.IRedisService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user