init
This commit is contained in:
@@ -13,6 +13,8 @@ import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.xq.domain.AreaCode;
|
||||
import com.ruoyi.xq.dto.admin.areacode.AreaCodeAdminTree;
|
||||
import com.ruoyi.xq.dto.app.areacode.AreaCodeTree;
|
||||
import com.ruoyi.xq.service.AreaCodeService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@@ -21,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 行政区划
|
||||
@@ -58,6 +61,12 @@ public class AreaCodeController extends BaseController {
|
||||
return R.ok(areaCodeService.getById(code));
|
||||
}
|
||||
|
||||
@GetMapping("/tree")
|
||||
public R<List<AreaCodeAdminTree>> areaCodeTree(){
|
||||
List<AreaCodeAdminTree> node = areaCodeService.treeAdmin();
|
||||
return R.ok(node);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增行政区划
|
||||
*/
|
||||
|
||||
@@ -15,8 +15,10 @@ import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.xq.domain.User;
|
||||
import com.ruoyi.xq.dto.admin.user.FullUserVo;
|
||||
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
|
||||
import com.ruoyi.xq.dto.admin.user.req.AddUserReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.ResetPasswordAdminReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateUserReq;
|
||||
import com.ruoyi.xq.dto.app.common.IdReq;
|
||||
import com.ruoyi.xq.service.UserInviteService;
|
||||
import com.ruoyi.xq.service.UserService;
|
||||
@@ -169,8 +171,9 @@ public class UserController extends BaseController {
|
||||
@Log(title = "用户管理", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody User bo) {
|
||||
return toAjax(userService.save(bo));
|
||||
public R<Void> add(@RequestBody AddUserReq bo) {
|
||||
userService.saveUser(bo);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -180,8 +183,9 @@ public class UserController extends BaseController {
|
||||
@Log(title = "用户管理", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody User bo) {
|
||||
return toAjax(userService.updateById(bo));
|
||||
public R<Void> edit(@RequestBody UpdateUserReq bo) {
|
||||
userService.updateBaseUser(bo);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -12,7 +12,6 @@ import com.ruoyi.common.core.validate.AddGroup;
|
||||
import com.ruoyi.common.core.validate.EditGroup;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.ruoyi.xq.domain.UserInfo;
|
||||
import com.ruoyi.xq.dto.admin.user.UserInfoDetailAdminVo;
|
||||
import com.ruoyi.xq.dto.admin.user.UserInfoListAdminVo;
|
||||
import com.ruoyi.xq.service.UserInfoService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
@@ -47,13 +46,6 @@ public class UserInfoController extends BaseController {
|
||||
return TableDataInfo.build(page);
|
||||
}
|
||||
|
||||
@SaCheckPermission("xq:userInfo:query")
|
||||
@GetMapping("/fullUserInfo/{id}")
|
||||
public R<UserInfoDetailAdminVo> fullUserInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
|
||||
UserInfoDetailAdminVo vo = userInfoService.fullUserInfo(id);
|
||||
return R.ok(vo);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户信息详细信息
|
||||
*
|
||||
|
||||
@@ -106,7 +106,7 @@ public class User implements Serializable {
|
||||
/**
|
||||
* 户籍地代码
|
||||
*/
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
|
||||
/**
|
||||
* 学历
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.ruoyi.xq.dto.admin.areacode;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class AreaCodeAdminTree {
|
||||
private Integer id;
|
||||
private String label;
|
||||
private Integer parentId;
|
||||
private List<AreaCodeAdminTree> children = new ArrayList<>();
|
||||
|
||||
public void addChild(AreaCodeAdminTree node) {
|
||||
children.add(node);
|
||||
}
|
||||
}
|
||||
@@ -11,5 +11,6 @@ public class FullUserVo {
|
||||
private UserInfo userInfo;
|
||||
private UserAuth userAuth;
|
||||
private UserLogin userLogin;
|
||||
private UserExtend account;
|
||||
private List<UserPictures> userPicturesList;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.ruoyi.xq.dto.admin.user.req;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Data
|
||||
public class AddUserReq {
|
||||
private String mobile;
|
||||
private Integer userType;
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
private Integer gender;
|
||||
private LocalDate birthday;
|
||||
private Integer height;
|
||||
private Integer weight;
|
||||
private Integer residenceCode;
|
||||
private Integer addressCode;
|
||||
private Integer education;
|
||||
private Integer marriage;
|
||||
private String profession;
|
||||
private Integer annualIncome;
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package com.ruoyi.xq.dto.admin.user.req;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@Data
|
||||
public class UpdateUserReq {
|
||||
private Long userId;
|
||||
private Integer userType;
|
||||
private String nickname;
|
||||
private String avatar;
|
||||
private Integer gender;
|
||||
private LocalDate birthday;
|
||||
private Integer height;
|
||||
private Integer weight;
|
||||
private Integer residenceCode;
|
||||
private Integer addressCode;
|
||||
private Integer education;
|
||||
private Integer marriage;
|
||||
private String profession;
|
||||
private Integer annualIncome;
|
||||
}
|
||||
@@ -67,7 +67,7 @@ public class HomePageReq extends PageQuery {
|
||||
@Schema(description = "购车情况")
|
||||
private Integer carStatus;
|
||||
@Schema(description = "户籍地")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
}
|
||||
|
||||
public void initBirthdayByAge(){
|
||||
|
||||
@@ -34,7 +34,7 @@ public class UpdateBaseInfoReq {
|
||||
* 户籍地
|
||||
*/
|
||||
@Schema(description = "户籍地")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
/**
|
||||
* 学历
|
||||
*/
|
||||
|
||||
@@ -32,7 +32,7 @@ public class UpdateUserFullInfoReq {
|
||||
@Schema(description = "居住地")
|
||||
private Integer residenceCode;
|
||||
@Schema(description = "户籍地")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
@Schema(description = "学历")
|
||||
private Integer education;
|
||||
@Schema(description = "婚况")
|
||||
|
||||
@@ -76,7 +76,7 @@ public class CurrentUserFullInfoVo {
|
||||
* 户籍地
|
||||
*/
|
||||
@Schema(description = "户籍地")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
@Schema(description = "户籍地名称")
|
||||
private String addressName;
|
||||
/**
|
||||
|
||||
@@ -51,7 +51,7 @@ public class CurrentUserInfoVo {
|
||||
@Schema(description = "户籍地名称")
|
||||
private String addressName;
|
||||
@Schema(description = "户籍地编码")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
/**
|
||||
* 状态 0 可用 1 不可用
|
||||
*/
|
||||
|
||||
@@ -69,7 +69,7 @@ public class HomeUserVo {
|
||||
@Schema(description = "户籍地名称")
|
||||
private String addressName;
|
||||
@Schema(description = "户籍地编码")
|
||||
private String addressCode;
|
||||
private Integer addressCode;
|
||||
/**
|
||||
* 学历
|
||||
*/
|
||||
|
||||
@@ -140,7 +140,7 @@ public class CurrentUserManager {
|
||||
String cos = systemConfigManager.getSystemConfig(SystemConfigEnum.COS_DOMAIN);
|
||||
updateUser.setAvatar(cos + userGenderEnum.getDefaultAvatar());
|
||||
}
|
||||
if(StringUtils.isNotEmpty(req.getAddressCode())){
|
||||
if(req.getAddressCode() != null){
|
||||
AreaCode areaCode = areaCodeService.getById(req.getAddressCode());
|
||||
updateUser.setAddressCode(req.getAddressCode());
|
||||
updateUser.setAddressName(areaCode.getName());
|
||||
@@ -261,7 +261,7 @@ public class CurrentUserManager {
|
||||
public void updateInfo(UpdateUserFullInfoReq req) {
|
||||
Long userId = LoginHelper.getUserId();
|
||||
User updateUser = BeanConvertUtil.convertTo(req, User::new);
|
||||
if(StringUtils.isNotEmpty(req.getAddressCode())){
|
||||
if(req.getAddressCode() != null){
|
||||
AreaCode areaCode = areaCodeService.getById(req.getAddressCode());
|
||||
updateUser.setAddressCode(req.getAddressCode());
|
||||
updateUser.setAddressName(areaCode.getFullname());
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ruoyi.xq.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.ruoyi.xq.domain.AreaCode;
|
||||
import com.ruoyi.xq.dto.admin.areacode.AreaCodeAdminTree;
|
||||
import com.ruoyi.xq.dto.app.areacode.AreaCodeQuery;
|
||||
import com.ruoyi.xq.dto.app.areacode.AreaCodeTree;
|
||||
|
||||
@@ -17,6 +18,8 @@ public interface AreaCodeService extends IService<AreaCode> {
|
||||
|
||||
List<AreaCode> listAreaCode(AreaCodeQuery query);
|
||||
|
||||
List<AreaCodeAdminTree> treeAdmin();
|
||||
|
||||
List<AreaCodeTree> tree();
|
||||
|
||||
}
|
||||
|
||||
@@ -6,11 +6,14 @@ import com.ruoyi.common.core.domain.PageQuery;
|
||||
import com.ruoyi.xq.domain.User;
|
||||
import com.ruoyi.xq.dto.admin.user.FullUserVo;
|
||||
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
|
||||
import com.ruoyi.xq.dto.admin.user.req.AddUserReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateUserReq;
|
||||
import com.ruoyi.xq.dto.app.user.HomePageReq;
|
||||
import com.ruoyi.xq.dto.app.user.vo.HomeUserListVo;
|
||||
import com.ruoyi.xq.dto.app.user.vo.HomeUserVo;
|
||||
import com.ruoyi.xq.dto.common.user.MinUser;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -49,4 +52,11 @@ public interface UserService extends IService<User> {
|
||||
boolean unlock(Long id);
|
||||
|
||||
FullUserVo fullUserAdmin(Long userId);
|
||||
|
||||
User getByMobile(String mobile);
|
||||
|
||||
void saveUser(AddUserReq bo);
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
void updateBaseUser(UpdateUserReq updateUserReq);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.ruoyi.common.utils.BeanConvertUtil;
|
||||
import com.ruoyi.xq.domain.AreaCode;
|
||||
import com.ruoyi.xq.dto.admin.areacode.AreaCodeAdminTree;
|
||||
import com.ruoyi.xq.dto.app.areacode.AreaCodeQuery;
|
||||
import com.ruoyi.xq.dto.app.areacode.AreaCodeTree;
|
||||
import com.ruoyi.xq.mapper.AreaCodeMapper;
|
||||
@@ -12,7 +13,6 @@ import com.ruoyi.xq.service.AreaCodeService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@@ -32,6 +32,35 @@ public class AreaCodeServiceImpl extends ServiceImpl<AreaCodeMapper,AreaCode> im
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AreaCodeAdminTree> treeAdmin() {
|
||||
List<AreaCode> list = this.list();
|
||||
List<AreaCodeAdminTree> nodeList = list.stream().map(i -> {
|
||||
AreaCodeAdminTree areaCodeAdminTree = new AreaCodeAdminTree();
|
||||
areaCodeAdminTree.setId(i.getCode());
|
||||
areaCodeAdminTree.setLabel(i.getName());
|
||||
areaCodeAdminTree.setParentId(i.getPcode());
|
||||
return areaCodeAdminTree;
|
||||
}).collect(Collectors.toList());
|
||||
Map<Integer, AreaCodeAdminTree> nodeMap = new HashMap<>();
|
||||
Set<AreaCodeAdminTree> roots = new HashSet<>();
|
||||
// 遍历列表构建节点映射表
|
||||
for (AreaCodeAdminTree node : nodeList) {
|
||||
nodeMap.put(node.getId(), node);
|
||||
if (node.getParentId() == 0 || !nodeMap.containsKey(node.getParentId())) {
|
||||
roots.add(node);
|
||||
}
|
||||
}
|
||||
// 建立父子关系
|
||||
for (AreaCodeAdminTree node : nodeList) {
|
||||
if (nodeMap.containsKey(node.getParentId())) {
|
||||
AreaCodeAdminTree parentNode = nodeMap.get(node.getParentId());
|
||||
parentNode.addChild(node);
|
||||
}
|
||||
}
|
||||
return new ArrayList<>(roots);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AreaCodeTree> tree() {
|
||||
List<AreaCode> list = this.list();
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.ruoyi.xq.service.impl;
|
||||
|
||||
import cn.dev33.satoken.secure.BCrypt;
|
||||
import cn.hutool.core.util.PhoneUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@@ -14,7 +15,9 @@ import com.ruoyi.common.utils.BeanConvertUtil;
|
||||
import com.ruoyi.xq.domain.*;
|
||||
import com.ruoyi.xq.dto.admin.user.FullUserVo;
|
||||
import com.ruoyi.xq.dto.admin.user.UserAdminVo;
|
||||
import com.ruoyi.xq.dto.admin.user.req.AddUserReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateMobileAdminReq;
|
||||
import com.ruoyi.xq.dto.admin.user.req.UpdateUserReq;
|
||||
import com.ruoyi.xq.dto.app.user.HomePageReq;
|
||||
import com.ruoyi.xq.dto.app.user.vo.HomeUserListVo;
|
||||
import com.ruoyi.xq.dto.app.user.vo.HomeUserVo;
|
||||
@@ -22,6 +25,8 @@ import com.ruoyi.xq.dto.common.user.MinUser;
|
||||
import com.ruoyi.xq.enums.ErrorEnum;
|
||||
import com.ruoyi.xq.enums.common.SystemConfigEnum;
|
||||
import com.ruoyi.xq.enums.userinfo.UserGenderEnum;
|
||||
import com.ruoyi.xq.lock.LockKey;
|
||||
import com.ruoyi.xq.manager.LoginManager;
|
||||
import com.ruoyi.xq.manager.SystemConfigManager;
|
||||
import com.ruoyi.xq.mapper.UserMapper;
|
||||
import com.ruoyi.xq.service.*;
|
||||
@@ -32,8 +37,11 @@ import com.ruoyi.yunxin.req.UpdateUinfoReq;
|
||||
import com.ruoyi.yunxin.resp.YxCommonR;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.redisson.api.RLock;
|
||||
import org.redisson.api.RedissonClient;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.ArrayList;
|
||||
@@ -68,6 +76,12 @@ public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements Use
|
||||
private UserAuthService userAuthService;
|
||||
@Autowired
|
||||
private UserStatusService userStatusService;
|
||||
@Autowired
|
||||
private UserExtendService userExtendService;
|
||||
@Autowired
|
||||
private RedissonClient redissonClient;
|
||||
@Autowired
|
||||
private AreaCodeService areaCodeService;
|
||||
|
||||
@Override
|
||||
public MinUser getMinUserById(Long userId){
|
||||
@@ -223,7 +237,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements Use
|
||||
if(StringUtils.isNotEmpty(vipQuery.getProfession()) ||
|
||||
vipQuery.getAnnualIncome() != null || vipQuery.getZodiac() != null ||
|
||||
vipQuery.getSign() != null || vipQuery.getChildStatus() != null || vipQuery.getHousingStatus() != null ||
|
||||
vipQuery.getCarStatus() != null || StringUtils.isNotEmpty(vipQuery.getAddressCode())){
|
||||
vipQuery.getCarStatus() != null || vipQuery.getAddressCode() != null){
|
||||
if(userId == null){
|
||||
throw new ServiceException(ErrorEnum.VIP_AUTH);
|
||||
}
|
||||
@@ -290,6 +304,82 @@ public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements Use
|
||||
vo.setUserLogin(userLogin);
|
||||
List<UserPictures> userPicturesList = userPicturesService.listByUserIdSuccess(userId);
|
||||
vo.setUserPicturesList(userPicturesList);
|
||||
UserExtend userExtend = userExtendService.getByUserId(userId);
|
||||
vo.setAccount(userExtend);
|
||||
return vo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getByMobile(String mobile){
|
||||
return this.getOne(Wrappers.lambdaQuery(User.class).eq(User::getMobile, mobile)
|
||||
.last("limit 1"));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private LoginManager loginManager;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveUser(AddUserReq bo) {
|
||||
User user = this.getByMobile(bo.getMobile());
|
||||
if(user != null){
|
||||
throw new ServiceException("手机号已存在!");
|
||||
}
|
||||
String lockKey = LockKey.getRegisterLockKey(bo.getMobile());
|
||||
RLock lock = redissonClient.getLock(lockKey);
|
||||
if(lock.isLocked()){
|
||||
throw new ServiceException("您点击太快了");
|
||||
}
|
||||
lock.lock();
|
||||
try {
|
||||
user = this.getByMobile(bo.getMobile());
|
||||
if(user != null){
|
||||
throw new ServiceException("手机号已存在!");
|
||||
}
|
||||
user = loginManager.registerUser(bo.getMobile(), null);
|
||||
UpdateUserReq updateUser = BeanConvertUtil.convertTo(bo, UpdateUserReq::new);
|
||||
updateUser.setUserId(user.getId());
|
||||
UserService userService = SpringUtil.getBean(UserService.class);
|
||||
userService.updateBaseUser(updateUser);
|
||||
}finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void updateBaseUser(UpdateUserReq updateUserReq){
|
||||
User user = this.getById(updateUserReq.getUserId());
|
||||
if(user == null){
|
||||
throw new ServiceException("用户不存在!");
|
||||
}
|
||||
User updateUser = new User();
|
||||
updateUser.setId(user.getId());
|
||||
updateUser.setType(updateUserReq.getUserType());
|
||||
updateUser.setNickname(updateUserReq.getNickname());
|
||||
updateUser.setAvatar(updateUserReq.getAvatar());
|
||||
updateUser.setGender(updateUserReq.getGender());
|
||||
updateUser.setHeight(updateUserReq.getHeight());
|
||||
updateUser.setWeight(updateUserReq.getWeight());
|
||||
updateUser.setBirthday(updateUserReq.getBirthday());
|
||||
if(updateUserReq.getResidenceCode() != null){
|
||||
updateUser.setResidenceCode(updateUserReq.getResidenceCode());
|
||||
AreaCode areaCode = areaCodeService.getById(updateUserReq.getResidenceCode());
|
||||
updateUser.setResidenceCode(updateUserReq.getResidenceCode());
|
||||
updateUser.setResidenceName(areaCode.getName());
|
||||
updateUser.setResidenceCityCode(areaCode.getPcode());
|
||||
updateUser.setResidenceCityName(areaCode.getPname());
|
||||
}
|
||||
if(updateUserReq.getAddressCode() != null){
|
||||
AreaCode areaCode = areaCodeService.getById(updateUserReq.getAddressCode());
|
||||
updateUser.setAddressCode(updateUserReq.getAddressCode());
|
||||
updateUser.setAddressName(areaCode.getFullname());
|
||||
}
|
||||
updateUser.setEducation(updateUserReq.getEducation());
|
||||
updateUser.setMarriage(updateUserReq.getMarriage());
|
||||
updateUser.setProfession(updateUserReq.getProfession());
|
||||
updateUser.setAnnualIncome(updateUserReq.getAnnualIncome());
|
||||
this.updateById(updateUser);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user