Merge remote-tracking branch 'origin/zcc' into zcc
# Conflicts: # src/main/java/com/peanut/modules/book/controller/MyUserController.java
This commit is contained in:
@@ -80,6 +80,7 @@ public class MyUserController {
|
|||||||
wrapper.and(p.getKey()!="",k->k.like(MyUserEntity::getName,p.getKey()).or().like(MyUserEntity::getTel,p.getKey()));
|
wrapper.and(p.getKey()!="",k->k.like(MyUserEntity::getName,p.getKey()).or().like(MyUserEntity::getTel,p.getKey()));
|
||||||
wrapper.orderByDesc(MyUserEntity::getCreateTime);
|
wrapper.orderByDesc(MyUserEntity::getCreateTime);
|
||||||
Page<MyUserEntity> myUserEntityPage = userService.getBaseMapper().selectPage(new Page<MyUserEntity>(p.getPage(), p.getLimit()), wrapper);
|
Page<MyUserEntity> myUserEntityPage = userService.getBaseMapper().selectPage(new Page<MyUserEntity>(p.getPage(), p.getLimit()), wrapper);
|
||||||
|
|
||||||
return R.ok().put("user",myUserEntityPage);
|
return R.ok().put("user",myUserEntityPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +93,7 @@ public class MyUserController {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 信息
|
* 信息
|
||||||
*/
|
*/
|
||||||
@@ -99,6 +101,10 @@ public class MyUserController {
|
|||||||
// @RequiresPermissions("book:user:info")
|
// @RequiresPermissions("book:user:info")
|
||||||
public R info(@PathVariable("id") Integer id){
|
public R info(@PathVariable("id") Integer id){
|
||||||
MyUserEntity user = userService.getById(id);
|
MyUserEntity user = userService.getById(id);
|
||||||
|
// List<CouponHistoryEntity> list = couponHistoryService.getBaseMapper().selectList(new QueryWrapper<CouponHistoryEntity>().eq("member_id", id)
|
||||||
|
// .eq("use_status", 0));
|
||||||
|
// user.setConponsCount(list.size());
|
||||||
|
|
||||||
return R.ok().put("user", user);
|
return R.ok().put("user", user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,6 +117,7 @@ public class MyUserController {
|
|||||||
String saltMD5 = MD5Utils.getSaltMD5(password);
|
String saltMD5 = MD5Utils.getSaltMD5(password);
|
||||||
user.setPassword(saltMD5);
|
user.setPassword(saltMD5);
|
||||||
userService.save(user);
|
userService.save(user);
|
||||||
|
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,12 +164,15 @@ public class MyUserController {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除
|
* 删除
|
||||||
*/
|
*/
|
||||||
@RequestMapping("/delete")
|
@RequestMapping("/delete")
|
||||||
|
// @RequiresPermissions("book:user:delete")
|
||||||
public R delete(@RequestBody Integer[] ids){
|
public R delete(@RequestBody Integer[] ids){
|
||||||
userService.removeByIds(Arrays.asList(ids));
|
userService.removeByIds(Arrays.asList(ids));
|
||||||
|
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,18 +240,70 @@ public class MyUserController {
|
|||||||
return MailUtil.sendMail("疯子读书邮箱验证码",code,email);
|
return MailUtil.sendMail("疯子读书邮箱验证码",code,email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定用户电话号
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@RequestMapping("/updateUserTel")
|
||||||
|
public R updateUserTel(@RequestBody Map<String,Object> map){
|
||||||
|
String phone = map.get("phone").toString();
|
||||||
|
String code = map.get("code").toString();
|
||||||
|
Integer id = Integer.valueOf(map.get("id").toString());
|
||||||
|
String redisCode = redisTemplate.opsForValue().get("RegistCode"+phone);
|
||||||
|
if(StringUtils.isEmpty(redisCode)){
|
||||||
|
return R.error("验证码已过期,请重试");
|
||||||
|
}
|
||||||
|
String lcode = redisCode.split("_")[0];
|
||||||
|
if (!lcode.equals(code)) {
|
||||||
|
return R.error("短信验证码不符!");
|
||||||
|
}
|
||||||
|
MyUserEntity userInfo = userService.getById(id);
|
||||||
|
userInfo.setTel(phone);
|
||||||
|
userService.updateById(userInfo);
|
||||||
|
return R.ok();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 绑定用户邮件
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@RequestMapping("/updateUserEmail")
|
||||||
|
public R updateUserEmail(@RequestBody Map<String,Object> map){
|
||||||
|
String email = map.get("email").toString();
|
||||||
|
String code = map.get("code").toString();
|
||||||
|
Integer id = Integer.valueOf(map.get("id").toString());
|
||||||
|
String redisCode = redisTemplate.opsForValue().get("RegistCode"+email);
|
||||||
|
if(StringUtils.isEmpty(redisCode)){
|
||||||
|
return R.error("验证码已过期,请重试");
|
||||||
|
}
|
||||||
|
String lcode = redisCode.split("_")[0];
|
||||||
|
if (!lcode.equals(code)) {
|
||||||
|
return R.error("短信验证码不符!");
|
||||||
|
}
|
||||||
|
MyUserEntity userInfo = userService.getById(id);
|
||||||
|
userInfo.setEmail(email);
|
||||||
|
userService.updateById(userInfo);
|
||||||
|
return R.ok();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@RequestMapping("/register")
|
@RequestMapping("/register")
|
||||||
public R register(@RequestParam("tel") String tel,
|
public R register(@RequestParam("tel") String tel,
|
||||||
@RequestParam("code") String code,
|
@RequestParam("code") String code,
|
||||||
@RequestParam("password") String password){
|
@RequestParam("password") String password){
|
||||||
String redisCode = redisTemplate.opsForValue().get("RegistCode" + tel);
|
String redisCode = redisTemplate.opsForValue().get("RegistCode" + tel);
|
||||||
|
|
||||||
|
|
||||||
if (StringUtils.isEmpty(redisCode)){
|
if (StringUtils.isEmpty(redisCode)){
|
||||||
return R.error(500,"短信验证码已过期,请重试");
|
return R.error(500,"短信验证码已过期,请重试");
|
||||||
}
|
}
|
||||||
|
|
||||||
String lcode = redisCode.split("_")[0];
|
String lcode = redisCode.split("_")[0];
|
||||||
|
|
||||||
if (!lcode.equals(code)) {
|
if (!lcode.equals(code)) {
|
||||||
return R.error(500,"短信验证码不符!");
|
return R.error(500,"短信验证码不符!");
|
||||||
}
|
}
|
||||||
|
|
||||||
MyUserEntity user = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("tel", tel));
|
MyUserEntity user = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("tel", tel));
|
||||||
if(!ObjectUtil.isEmpty(user)){
|
if(!ObjectUtil.isEmpty(user)){
|
||||||
return R.error(500,"该手机号已经注册!");
|
return R.error(500,"该手机号已经注册!");
|
||||||
@@ -253,6 +315,7 @@ public class MyUserController {
|
|||||||
userService.save(myUserEntity);
|
userService.save(myUserEntity);
|
||||||
R r = sysUserTokenService.createToken(myUserEntity.getId());
|
R r = sysUserTokenService.createToken(myUserEntity.getId());
|
||||||
return R.ok("注册成功").put("userInfo",myUserEntity).put("token",r);
|
return R.ok("注册成功").put("userInfo",myUserEntity).put("token",r);
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* 常规注册 / 验证码 登录
|
* 常规注册 / 验证码 登录
|
||||||
@@ -301,6 +364,7 @@ public class MyUserController {
|
|||||||
@RequestMapping("/login")
|
@RequestMapping("/login")
|
||||||
public R login(@RequestParam("phone") String phone,
|
public R login(@RequestParam("phone") String phone,
|
||||||
@RequestParam("password") String password) {
|
@RequestParam("password") String password) {
|
||||||
|
|
||||||
LambdaQueryWrapper<MyUserEntity> wrapper = new LambdaQueryWrapper();
|
LambdaQueryWrapper<MyUserEntity> wrapper = new LambdaQueryWrapper();
|
||||||
if (phone.contains("@")) {
|
if (phone.contains("@")) {
|
||||||
wrapper.eq(MyUserEntity::getEmail,phone);
|
wrapper.eq(MyUserEntity::getEmail,phone);
|
||||||
@@ -314,7 +378,7 @@ public class MyUserController {
|
|||||||
}else {
|
}else {
|
||||||
int flag = 0;
|
int flag = 0;
|
||||||
for (MyUserEntity user : userList) {
|
for (MyUserEntity user : userList) {
|
||||||
if (user.getPassword() == null) {
|
if (user.getPassword() == null|| user.getPassword().equals("")) {
|
||||||
flag++;
|
flag++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -371,40 +435,70 @@ public class MyUserController {
|
|||||||
public R getEverhealthInfo(@RequestParam("phone") String phone,
|
public R getEverhealthInfo(@RequestParam("phone") String phone,
|
||||||
@RequestParam("password") String password,
|
@RequestParam("password") String password,
|
||||||
@RequestParam(value = "hsuserId", required = false) Integer hsuserId) {
|
@RequestParam(value = "hsuserId", required = false) Integer hsuserId) {
|
||||||
|
|
||||||
String s = HttpUtil.get("http://101.201.146.165:8088/App-EH/app/phone.do?login&loginName="+ phone +"&loginPwd="+ password +"");
|
String s = HttpUtil.get("http://101.201.146.165:8088/App-EH/app/phone.do?login&loginName="+ phone +"&loginPwd="+ password +"");
|
||||||
|
|
||||||
|
System.out.println(s);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//将结果转成json 取值
|
//将结果转成json 取值
|
||||||
JSONObject jsonObject = JSON.parseObject(s);
|
JSONObject jsonObject = JSON.parseObject(s);
|
||||||
|
|
||||||
if (jsonObject.getString("msg").equals("登录名或密码错误!")) {
|
if (jsonObject.getString("msg").equals("登录名或密码错误!")) {
|
||||||
|
|
||||||
return R.error(404,jsonObject.getString("msg"));
|
return R.error(404,jsonObject.getString("msg"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
String yljkOid = jsonObject.getJSONObject("obj").getString("customerOid");
|
String yljkOid = jsonObject.getJSONObject("obj").getString("customerOid");
|
||||||
String cellPhone = jsonObject.getJSONObject("obj").getString("cellPhone");
|
String cellPhone = jsonObject.getJSONObject("obj").getString("cellPhone");
|
||||||
String customerIcons = jsonObject.getJSONObject("obj").getString("customerIcons");
|
String customerIcons = jsonObject.getJSONObject("obj").getString("customerIcons");
|
||||||
String nameCN = jsonObject.getJSONObject("obj").getString("nameCN");
|
String nameCN = jsonObject.getJSONObject("obj").getString("nameCN");
|
||||||
|
// String password = jsonObject.getJSONObject("obj").getString("pass");
|
||||||
|
|
||||||
|
System.out.println("=====================yljkOid=============================="+yljkOid);
|
||||||
|
|
||||||
|
|
||||||
//查询 当前 花生账号 和 当前绑定的 一路健康账号是否有绑定 关系
|
//查询 当前 花生账号 和 当前绑定的 一路健康账号是否有绑定 关系
|
||||||
|
|
||||||
MyUserEntity user = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("yljk_oid", yljkOid));
|
MyUserEntity user = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("yljk_oid", yljkOid));
|
||||||
|
|
||||||
if (user != null ) {
|
if (user != null ) {
|
||||||
|
|
||||||
// 判断 hsuserId 是否为空 查询 传入的 花生id 和 查询的花生 id 是否一致
|
// 判断 hsuserId 是否为空 查询 传入的 花生id 和 查询的花生 id 是否一致
|
||||||
if (hsuserId != null && user.getId() == hsuserId){
|
if (hsuserId != null && user.getId() == hsuserId){
|
||||||
|
|
||||||
MyUserEntity myUserEntity = userService.getBaseMapper().selectById(hsuserId);
|
MyUserEntity myUserEntity = userService.getBaseMapper().selectById(hsuserId);
|
||||||
//绑定
|
//绑定
|
||||||
myUserEntity.setYljkOid(yljkOid);
|
myUserEntity.setYljkOid(yljkOid);
|
||||||
userService.updateById(myUserEntity);
|
userService.updateById(myUserEntity);
|
||||||
|
|
||||||
return R.ok("绑定成功!");
|
return R.ok("绑定成功!");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//如果系统存在该用户 并且绑定关系 成立 登录成功 ,返回用户信息
|
//如果系统存在该用户 并且绑定关系 成立 登录成功 ,返回用户信息
|
||||||
R r = sysUserTokenService.createToken(user.getId());
|
R r = sysUserTokenService.createToken(user.getId());
|
||||||
|
|
||||||
return R.ok("登陆成功").put("userInfo",user).put("token",r);
|
return R.ok("登陆成功").put("userInfo",user).put("token",r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//不存在 返回 手机号 oid 姓名 头像
|
//不存在 返回 手机号 oid 姓名 头像
|
||||||
|
|
||||||
HashMap<Object, Object> map = new HashMap<>();
|
HashMap<Object, Object> map = new HashMap<>();
|
||||||
map.put("cellPhone",cellPhone);
|
map.put("cellPhone",cellPhone);
|
||||||
map.put("customerIcons",customerIcons);
|
map.put("customerIcons",customerIcons);
|
||||||
map.put("yljkOid",yljkOid);
|
map.put("yljkOid",yljkOid);
|
||||||
map.put("nameCN",nameCN);
|
map.put("nameCN",nameCN);
|
||||||
|
|
||||||
return R.ok("绑定信息").put("everhealthInfo",map);
|
return R.ok("绑定信息").put("everhealthInfo",map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 一路健康账号注册花生
|
* 一路健康账号注册花生
|
||||||
*/
|
*/
|
||||||
@@ -414,14 +508,22 @@ public class MyUserController {
|
|||||||
@RequestParam("yljkOid") String yljkOid,
|
@RequestParam("yljkOid") String yljkOid,
|
||||||
@RequestParam("userName") String userName,
|
@RequestParam("userName") String userName,
|
||||||
@RequestParam("customerIcons") String customerIcons) {
|
@RequestParam("customerIcons") String customerIcons) {
|
||||||
|
|
||||||
String redisCode = redisTemplate.opsForValue().get("RegistCode" + phone);
|
String redisCode = redisTemplate.opsForValue().get("RegistCode" + phone);
|
||||||
|
|
||||||
|
System.out.println(redisCode);
|
||||||
|
|
||||||
if (StringUtils.isEmpty(redisCode)){
|
if (StringUtils.isEmpty(redisCode)){
|
||||||
return R.error(500,"短信验证码已过期,请重试");
|
return R.error(500,"短信验证码已过期,请重试");
|
||||||
}
|
}
|
||||||
|
|
||||||
String lcode = redisCode.split("_")[0];
|
String lcode = redisCode.split("_")[0];
|
||||||
|
|
||||||
if (!lcode.equals(code)) {
|
if (!lcode.equals(code)) {
|
||||||
return R.error(500,"短信验证码不符!");
|
return R.error(500,"短信验证码不符!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//查询是否存在当前用户手机号
|
//查询是否存在当前用户手机号
|
||||||
MyUserEntity userEntity = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("tel", phone));
|
MyUserEntity userEntity = userService.getBaseMapper().selectOne(new QueryWrapper<MyUserEntity>().eq("tel", phone));
|
||||||
if (userEntity == null) {
|
if (userEntity == null) {
|
||||||
@@ -447,6 +549,7 @@ public class MyUserController {
|
|||||||
R r = sysUserTokenService.createToken(userEntity.getId());
|
R r = sysUserTokenService.createToken(userEntity.getId());
|
||||||
// todo 为什么验证成功以后不能实现页面跳转登录 R返回更新生成的token和电话
|
// todo 为什么验证成功以后不能实现页面跳转登录 R返回更新生成的token和电话
|
||||||
return R.ok().put("userInfo",userEntity).put("token",r);
|
return R.ok().put("userInfo",userEntity).put("token",r);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping("/test")
|
@RequestMapping("/test")
|
||||||
@@ -474,6 +577,7 @@ public class MyUserController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
msg = userService.buyEbook(userId, bookId,couponId);
|
msg = userService.buyEbook(userId, bookId,couponId);
|
||||||
|
|
||||||
if (msg.equals("当前书籍以购买,请勿重复购买!")) {
|
if (msg.equals("当前书籍以购买,请勿重复购买!")) {
|
||||||
return R.ok().put("msg",msg).put("status","error");
|
return R.ok().put("msg",msg).put("status","error");
|
||||||
}else if (msg.equals("余额不足,请充值!")) {
|
}else if (msg.equals("余额不足,请充值!")) {
|
||||||
@@ -504,7 +608,9 @@ public class MyUserController {
|
|||||||
}else {
|
}else {
|
||||||
return R.error("余额不足!扣除失败!");
|
return R.error("余额不足!扣除失败!");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
||||||
transactionDetailsEntity.setUserId(Integer.valueOf(id));
|
transactionDetailsEntity.setUserId(Integer.valueOf(id));
|
||||||
transactionDetailsEntity.setOrderType("后台充扣操作");
|
transactionDetailsEntity.setOrderType("后台充扣操作");
|
||||||
@@ -521,6 +627,8 @@ public class MyUserController {
|
|||||||
BigDecimal balance = new BigDecimal(i);
|
BigDecimal balance = new BigDecimal(i);
|
||||||
transactionDetailsEntity.setUserBalance(balance);
|
transactionDetailsEntity.setUserBalance(balance);
|
||||||
transactionDetailsService.save(transactionDetailsEntity);
|
transactionDetailsService.save(transactionDetailsEntity);
|
||||||
|
|
||||||
|
|
||||||
// 插入 花生币 充值记录
|
// 插入 花生币 充值记录
|
||||||
// IosPayOrderEntity payPaymentOrderEntity = new IosPayOrderEntity();
|
// IosPayOrderEntity payPaymentOrderEntity = new IosPayOrderEntity();
|
||||||
// payPaymentOrderEntity.setUserId(Integer.valueOf(id));
|
// payPaymentOrderEntity.setUserId(Integer.valueOf(id));
|
||||||
@@ -530,6 +638,7 @@ public class MyUserController {
|
|||||||
// payPaymentOrderEntity.setRechargeStatus("success");
|
// payPaymentOrderEntity.setRechargeStatus("success");
|
||||||
// payPaymentOrderEntity.setSuccessTime(new Date());
|
// payPaymentOrderEntity.setSuccessTime(new Date());
|
||||||
// payPaymentOrderService.save(payPaymentOrderEntity);
|
// payPaymentOrderService.save(payPaymentOrderEntity);
|
||||||
|
|
||||||
userService.updateById(byId);
|
userService.updateById(byId);
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
@@ -541,6 +650,7 @@ public class MyUserController {
|
|||||||
*/
|
*/
|
||||||
@RequestMapping("/openVipByVirtualCoin")
|
@RequestMapping("/openVipByVirtualCoin")
|
||||||
public R openVipByVirtualCoin(@RequestParam Map<String,Object> params){
|
public R openVipByVirtualCoin(@RequestParam Map<String,Object> params){
|
||||||
|
|
||||||
Integer configId = Integer.valueOf(params.get("configId").toString());
|
Integer configId = Integer.valueOf(params.get("configId").toString());
|
||||||
String orderSn = params.get("orderSn").toString();
|
String orderSn = params.get("orderSn").toString();
|
||||||
Integer userId = Integer.valueOf(params.get("userId").toString());
|
Integer userId = Integer.valueOf(params.get("userId").toString());
|
||||||
@@ -549,8 +659,14 @@ public class MyUserController {
|
|||||||
BookBuyConfigEntity bookBuyConfigEntity = bookBuyConfigService.getById(configId);
|
BookBuyConfigEntity bookBuyConfigEntity = bookBuyConfigService.getById(configId);
|
||||||
String month = bookBuyConfigEntity.getMonth();
|
String month = bookBuyConfigEntity.getMonth();
|
||||||
BigDecimal amount = new BigDecimal(bookBuyConfigEntity.getRealMoney());
|
BigDecimal amount = new BigDecimal(bookBuyConfigEntity.getRealMoney());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(user.getPeanutCoin().compareTo(amount) >= 0){
|
if(user.getPeanutCoin().compareTo(amount) >= 0){
|
||||||
user.setPeanutCoin(user.getPeanutCoin().subtract(amount));
|
user.setPeanutCoin(user.getPeanutCoin().subtract(amount));
|
||||||
|
|
||||||
this.userService.updateById(user);
|
this.userService.updateById(user);
|
||||||
// 添加消费信息
|
// 添加消费信息
|
||||||
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
||||||
@@ -568,9 +684,14 @@ public class MyUserController {
|
|||||||
}else{
|
}else{
|
||||||
return R.error(500,"余额不足,请检查后操作!");
|
return R.error(500,"余额不足,请检查后操作!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// /**
|
// /**
|
||||||
// * @Description: app微信登陆
|
// * @Description: app微信登陆
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ connection-timeout: 6000000ms
|
|||||||
spring:
|
spring:
|
||||||
# 环境 dev|test|prod
|
# 环境 dev|test|prod
|
||||||
profiles:
|
profiles:
|
||||||
active: test
|
active: dev
|
||||||
# jackson时间格式化
|
# jackson时间格式化
|
||||||
jackson:
|
jackson:
|
||||||
time-zone: GMT+8
|
time-zone: GMT+8
|
||||||
|
|||||||
Reference in New Issue
Block a user