规范性编码
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
package com.gis.xian.mapper;
|
package com.gis.xian.mapper;
|
||||||
|
|
||||||
import com.gis.xian.vo.XianHiddenDangerSpotsBasePointVo;
|
import com.gis.xian.entity.XianHiddenDangerSpots;
|
||||||
import com.gis.xian.vo.XianHiddenDangerSpotsPointDetailVo;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -16,14 +15,14 @@ public interface XianHiddenDangerSpotsMapper {
|
|||||||
* 获取所有基础点:滑坡、泥石流、山洪、内涝
|
* 获取所有基础点:滑坡、泥石流、山洪、内涝
|
||||||
* @return 基础点列表
|
* @return 基础点列表
|
||||||
*/
|
*/
|
||||||
List<XianHiddenDangerSpotsBasePointVo> getBasePoints(String disasterType);
|
List<XianHiddenDangerSpots> getBasePoints(String disasterType);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据id获取隐患点详情
|
* 根据id获取隐患点详情
|
||||||
* @param id 隐患点id
|
* @param id 隐患点id
|
||||||
* @return 隐患点详情
|
* @return 隐患点详情
|
||||||
*/
|
*/
|
||||||
XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id);
|
XianHiddenDangerSpots getPointDetailById(Long id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.gis.xian.mapper;
|
package com.gis.xian.mapper;
|
||||||
|
|
||||||
import com.gis.xian.vo.XianRiskSpotsBasePointVo;
|
import com.gis.xian.entity.XianRiskSpots;
|
||||||
import com.gis.xian.vo.XianRiskSpotsPointDetailVo;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -16,7 +15,7 @@ public interface XianRiskSpotsMapper {
|
|||||||
* 获取所有风险点基础信息
|
* 获取所有风险点基础信息
|
||||||
* @return 风险点基础列表
|
* @return 风险点基础列表
|
||||||
*/
|
*/
|
||||||
List<XianRiskSpotsBasePointVo> getBasePoints();
|
List<XianRiskSpots> getBasePoints();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,7 +23,7 @@ public interface XianRiskSpotsMapper {
|
|||||||
* @param id 风险点id
|
* @param id 风险点id
|
||||||
* @return 风险点详情
|
* @return 风险点详情
|
||||||
*/
|
*/
|
||||||
XianRiskSpotsPointDetailVo getPointDetailById(Long id);
|
XianRiskSpots getPointDetailById(Long id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.gis.xian.service.impl;
|
package com.gis.xian.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.gis.xian.entity.XianHiddenDangerSpots;
|
||||||
import com.gis.xian.vo.XianHiddenDangerSpotsBasePointVo;
|
import com.gis.xian.vo.XianHiddenDangerSpotsBasePointVo;
|
||||||
import com.gis.xian.vo.XianHiddenDangerSpotsPointDetailVo;
|
import com.gis.xian.vo.XianHiddenDangerSpotsPointDetailVo;
|
||||||
import com.gis.xian.enums.DisasterTypeEnum;
|
import com.gis.xian.enums.DisasterTypeEnum;
|
||||||
@@ -40,7 +41,7 @@ public class IXianHiddenDangerSpotsServiceImpl implements XianHiddenDangerSpotsS
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
List<XianHiddenDangerSpotsBasePointVo> basePoints = xianHiddenDangerSpotsMapper.getBasePoints(disasterType);
|
List<XianHiddenDangerSpotsBasePointVo> basePoints = XianHiddenDangerSpotsBasePointVo.entity2Vo(xianHiddenDangerSpotsMapper.getBasePoints(disasterType));
|
||||||
|
|
||||||
if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) {
|
if(DisasterTypeEnum.RAINSTORM.getType().equals(disasterType)) {
|
||||||
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(basePoints));
|
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(basePoints));
|
||||||
@@ -55,6 +56,6 @@ public class IXianHiddenDangerSpotsServiceImpl implements XianHiddenDangerSpotsS
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id) {
|
public XianHiddenDangerSpotsPointDetailVo getPointDetailById(Long id) {
|
||||||
return xianHiddenDangerSpotsMapper.getPointDetailById(id);
|
return XianHiddenDangerSpotsPointDetailVo.entity2Vo(xianHiddenDangerSpotsMapper.getPointDetailById(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class IXianRiskSpotsServiceImpl implements XianRiskSpotsService {
|
|||||||
Object data = redisTemplate.opsForValue().get(riskPointKey);
|
Object data = redisTemplate.opsForValue().get(riskPointKey);
|
||||||
|
|
||||||
if (data == null) {
|
if (data == null) {
|
||||||
List<XianRiskSpotsBasePointVo> basePoints = xianRiskSpotsMapper.getBasePoints();
|
List<XianRiskSpotsBasePointVo> basePoints = XianRiskSpotsBasePointVo.entity2Vo(xianRiskSpotsMapper.getBasePoints());
|
||||||
redisTemplate.opsForValue().set(riskPointKey, JSON.toJSONString(basePoints));
|
redisTemplate.opsForValue().set(riskPointKey, JSON.toJSONString(basePoints));
|
||||||
return basePoints;
|
return basePoints;
|
||||||
}
|
}
|
||||||
@@ -40,6 +40,6 @@ public class IXianRiskSpotsServiceImpl implements XianRiskSpotsService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XianRiskSpotsPointDetailVo getPointDetailById(Long id) {
|
public XianRiskSpotsPointDetailVo getPointDetailById(Long id) {
|
||||||
return xianRiskSpotsMapper.getPointDetailById(id);
|
return XianRiskSpotsPointDetailVo.entity2Vo(xianRiskSpotsMapper.getPointDetailById(id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import com.alibaba.fastjson2.JSON;
|
|||||||
import com.gis.xian.enums.DisasterTypeEnum;
|
import com.gis.xian.enums.DisasterTypeEnum;
|
||||||
import com.gis.xian.mapper.XianHiddenDangerSpotsMapper;
|
import com.gis.xian.mapper.XianHiddenDangerSpotsMapper;
|
||||||
import com.gis.xian.mapper.XianRiskSpotsMapper;
|
import com.gis.xian.mapper.XianRiskSpotsMapper;
|
||||||
|
import com.gis.xian.vo.XianHiddenDangerSpotsBasePointVo;
|
||||||
|
import com.gis.xian.vo.XianRiskSpotsBasePointVo;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -43,11 +45,23 @@ public class InitializeData {
|
|||||||
log.info("开始初始化数据");
|
log.info("开始初始化数据");
|
||||||
|
|
||||||
// 加载滑坡、泥石流、山洪、内涝隐患点信息并写入redis
|
// 加载滑坡、泥石流、山洪、内涝隐患点信息并写入redis
|
||||||
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType())));
|
redisTemplate.opsForValue().set(rainstormBasePointsKey, JSON.toJSONString(
|
||||||
redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString(xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType())));
|
XianHiddenDangerSpotsBasePointVo.entity2Vo(
|
||||||
|
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.RAINSTORM.getType()))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
redisTemplate.opsForValue().set(earthquakeBasePointsKey, JSON.toJSONString(
|
||||||
|
XianHiddenDangerSpotsBasePointVo.entity2Vo(
|
||||||
|
xianHiddenDangerSpotsMapper.getBasePoints(DisasterTypeEnum.EARTHQUAKE.getType()))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// 加载风险点基本信息写入redis
|
// 加载风险点基本信息写入redis
|
||||||
redisTemplate.opsForValue().set(riskBasePointsKey, JSON.toJSONString(xianRiskSpotsMapper.getBasePoints()));
|
redisTemplate.opsForValue().set(riskBasePointsKey, JSON.toJSONString(
|
||||||
|
XianRiskSpotsBasePointVo.entity2Vo(
|
||||||
|
xianRiskSpotsMapper.getBasePoints())
|
||||||
|
)
|
||||||
|
);
|
||||||
log.info("初始化数据完成");
|
log.info("初始化数据完成");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.gis.xian.vo;
|
package com.gis.xian.vo;
|
||||||
|
|
||||||
|
import com.gis.xian.entity.XianHiddenDangerSpots;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,6 +28,23 @@ public class XianHiddenDangerSpotsBasePointVo {
|
|||||||
*/
|
*/
|
||||||
private Double lat;
|
private Double lat;
|
||||||
|
|
||||||
|
public static XianHiddenDangerSpotsBasePointVo entity2Vo(XianHiddenDangerSpots entity) {
|
||||||
|
XianHiddenDangerSpotsBasePointVo vo = new XianHiddenDangerSpotsBasePointVo();
|
||||||
|
vo.setId(entity.getId());
|
||||||
|
vo.setLon(entity.getLon());
|
||||||
|
vo.setLat(entity.getLat());
|
||||||
|
vo.setDisasterType(entity.getDisasterType());
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<XianHiddenDangerSpotsBasePointVo> entity2Vo(List<XianHiddenDangerSpots> entityList) {
|
||||||
|
List<XianHiddenDangerSpotsBasePointVo> voList = new ArrayList<>();
|
||||||
|
for (XianHiddenDangerSpots entity : entityList) {
|
||||||
|
voList.add(entity2Vo(entity));
|
||||||
|
}
|
||||||
|
return voList;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 灾害类型
|
* 灾害类型
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.gis.xian.vo;
|
package com.gis.xian.vo;
|
||||||
|
|
||||||
|
import com.gis.xian.entity.XianHiddenDangerSpots;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -41,6 +44,26 @@ public class XianHiddenDangerSpotsPointDetailVo {
|
|||||||
*/
|
*/
|
||||||
private String riskGrade;
|
private String riskGrade;
|
||||||
|
|
||||||
|
public static XianHiddenDangerSpotsPointDetailVo entity2Vo(XianHiddenDangerSpots entity) {
|
||||||
|
XianHiddenDangerSpotsPointDetailVo vo = new XianHiddenDangerSpotsPointDetailVo();
|
||||||
|
vo.setId(entity.getId());
|
||||||
|
vo.setFieldCode(entity.getFieldCode());
|
||||||
|
vo.setDisasterName(entity.getDisasterName());
|
||||||
|
vo.setPosition(entity.getPosition());
|
||||||
|
vo.setDisasterType(entity.getDisasterType());
|
||||||
|
vo.setScaleGrade(entity.getScaleGrade());
|
||||||
|
vo.setRiskGrade(entity.getRiskGrade());
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<XianHiddenDangerSpotsPointDetailVo> entity2Vo(List<XianHiddenDangerSpots> entityList) {
|
||||||
|
List<XianHiddenDangerSpotsPointDetailVo> voList = new ArrayList<>();
|
||||||
|
for (XianHiddenDangerSpots entity : entityList) {
|
||||||
|
voList.add(entity2Vo(entity));
|
||||||
|
}
|
||||||
|
return voList;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.gis.xian.vo;
|
package com.gis.xian.vo;
|
||||||
|
|
||||||
|
import com.gis.xian.entity.XianRiskSpots;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -21,6 +24,22 @@ public class XianRiskSpotsBasePointVo {
|
|||||||
*/
|
*/
|
||||||
private Double lat;
|
private Double lat;
|
||||||
|
|
||||||
|
public static XianRiskSpotsBasePointVo entity2Vo(XianRiskSpots entity) {
|
||||||
|
XianRiskSpotsBasePointVo vo = new XianRiskSpotsBasePointVo();
|
||||||
|
vo.setId(entity.getId());
|
||||||
|
vo.setLon(entity.getLon());
|
||||||
|
vo.setLat(entity.getLat());
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<XianRiskSpotsBasePointVo> entity2Vo(List<XianRiskSpots> entityList) {
|
||||||
|
List<XianRiskSpotsBasePointVo> voList = new ArrayList<>();
|
||||||
|
for (XianRiskSpots entity : entityList) {
|
||||||
|
voList.add(entity2Vo(entity));
|
||||||
|
}
|
||||||
|
return voList;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
|||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.gis.xian.vo;
|
package com.gis.xian.vo;
|
||||||
|
|
||||||
|
import com.gis.xian.entity.XianRiskSpots;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -66,6 +69,31 @@ public class XianRiskSpotsPointDetailVo {
|
|||||||
*/
|
*/
|
||||||
private Double lat;
|
private Double lat;
|
||||||
|
|
||||||
|
public static XianRiskSpotsPointDetailVo entity2Vo(XianRiskSpots entity) {
|
||||||
|
XianRiskSpotsPointDetailVo vo = new XianRiskSpotsPointDetailVo();
|
||||||
|
vo.setId(entity.getId());
|
||||||
|
vo.setRiskName(entity.getRiskName());
|
||||||
|
vo.setUnitCode(entity.getUnitCode());
|
||||||
|
vo.setPosition(entity.getPosition());
|
||||||
|
vo.setResidentCounts(entity.getResidentCounts());
|
||||||
|
vo.setRiskProperty(entity.getRiskProperty());
|
||||||
|
vo.setPermanentPopulation(entity.getPermanentPopulation());
|
||||||
|
vo.setHousing(entity.getHousing());
|
||||||
|
vo.setInspectorName(entity.getInspectorName());
|
||||||
|
vo.setInspectorTele(entity.getInspectorTele());
|
||||||
|
vo.setLon(entity.getLon());
|
||||||
|
vo.setLat(entity.getLat());
|
||||||
|
return vo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<XianRiskSpotsPointDetailVo> entity2Vo(List<XianRiskSpots> entityList) {
|
||||||
|
List<XianRiskSpotsPointDetailVo> voList = new ArrayList<>();
|
||||||
|
for (XianRiskSpots entity : entityList) {
|
||||||
|
voList.add(entity2Vo(entity));
|
||||||
|
}
|
||||||
|
return voList;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
|
|||||||
@@ -25,25 +25,8 @@
|
|||||||
<result property="isDelete" column="is_delete" />
|
<result property="isDelete" column="is_delete" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="XianHiddenDangerSpotsBasePointResultMap" type="com.gis.xian.vo.XianHiddenDangerSpotsBasePointVo">
|
|
||||||
<id property="id" column="id" />
|
|
||||||
<result property="lon" column="lon" />
|
|
||||||
<result property="lat" column="lat" />
|
|
||||||
<result property="disasterType" column="disaster_type" />
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<resultMap id="XianHiddenDangerSpotsPointDetailResultMap" type="com.gis.xian.vo.XianHiddenDangerSpotsPointDetailVo">
|
|
||||||
<id property="id" column="id" />
|
|
||||||
<result property="fieldCode" column="field_code" />
|
|
||||||
<result property="disasterName" column="disaster_name" />
|
|
||||||
<result property="position" column="position" />
|
|
||||||
<result property="disasterType" column="disaster_type" />
|
|
||||||
<result property="scaleGrade" column="scale_grade" />
|
|
||||||
<result property="riskGrade" column="risk_grade" />
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<!-- 获取所有基础点:滑坡、泥石流、山洪、内涝 -->
|
<!-- 获取所有基础点:滑坡、泥石流、山洪、内涝 -->
|
||||||
<select id="getBasePoints" resultMap="XianHiddenDangerSpotsBasePointResultMap">
|
<select id="getBasePoints" resultMap="XianHiddenDangerSpotsResultMap">
|
||||||
SELECT id, lon, lat, disaster_type FROM xian_hidden_danger_spots
|
SELECT id, lon, lat, disaster_type FROM xian_hidden_danger_spots
|
||||||
<where>
|
<where>
|
||||||
<choose>
|
<choose>
|
||||||
@@ -58,7 +41,7 @@
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 根据id获取隐患点详情 -->
|
<!-- 根据id获取隐患点详情 -->
|
||||||
<select id="getPointDetailById" resultMap="XianHiddenDangerSpotsPointDetailResultMap">
|
<select id="getPointDetailById" resultMap="XianHiddenDangerSpotsResultMap">
|
||||||
SELECT id, field_code, disaster_name, position, disaster_type, scale_grade, risk_grade FROM xian_hidden_danger_spots
|
SELECT id, field_code, disaster_name, position, disaster_type, scale_grade, risk_grade FROM xian_hidden_danger_spots
|
||||||
<where>
|
<where>
|
||||||
id = #{id}
|
id = #{id}
|
||||||
|
|||||||
@@ -29,34 +29,13 @@
|
|||||||
<result property="isDelete" column="is_delete" />
|
<result property="isDelete" column="is_delete" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="XianRiskSpotsBasePointResultMap" type="com.gis.xian.vo.XianRiskSpotsBasePointVo">
|
|
||||||
<id property="id" column="id" />
|
|
||||||
<result property="lon" column="lon" />
|
|
||||||
<result property="lat" column="lat" />
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<resultMap id="XianRiskSpotsPointDetailResultMap" type="com.gis.xian.vo.XianRiskSpotsPointDetailVo">
|
|
||||||
<id property="id" column="id" />
|
|
||||||
<result property="riskName" column="risk_name" />
|
|
||||||
<result property="unitCode" column="unit_code" />
|
|
||||||
<result property="position" column="position" />
|
|
||||||
<result property="residentCounts" column="resident_counts" />
|
|
||||||
<result property="riskProperty" column="risk_property" />
|
|
||||||
<result property="permanentPopulation" column="permanent_population" />
|
|
||||||
<result property="housing" column="housing" />
|
|
||||||
<result property="inspectorName" column="inspector_name" />
|
|
||||||
<result property="inspectorTele" column="inspector_tele" />
|
|
||||||
<result property="lon" column="lon" />
|
|
||||||
<result property="lat" column="lat" />
|
|
||||||
</resultMap>
|
|
||||||
|
|
||||||
<!-- 获取所有风险点基础信息 -->
|
<!-- 获取所有风险点基础信息 -->
|
||||||
<select id="getBasePoints" resultMap="XianRiskSpotsBasePointResultMap">
|
<select id="getBasePoints" resultMap="XianRiskSpotsResultMap">
|
||||||
SELECT id, lon, lat FROM xian_risk_spots
|
SELECT id, lon, lat FROM xian_risk_spots
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 根据id获取风险点信息 -->
|
<!-- 根据id获取风险点信息 -->
|
||||||
<select id="getPointDetailById" resultType="com.gis.xian.vo.XianRiskSpotsPointDetailVo">
|
<select id="getPointDetailById" resultMap="XianRiskSpotsResultMap">
|
||||||
SELECT id, risk_name, unit_code, position, resident_counts, risk_property, permanent_population, housing, inspector_name, inspector_tele, lon, lat FROM xian_risk_spots
|
SELECT id, risk_name, unit_code, position, resident_counts, risk_property, permanent_population, housing, inspector_name, inspector_tele, lon, lat FROM xian_risk_spots
|
||||||
<where>
|
<where>
|
||||||
id = #{id}
|
id = #{id}
|
||||||
|
|||||||
Reference in New Issue
Block a user