mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/per-boe/java-servers.git
synced 2025-12-11 03:46:50 +08:00
Merge branch 'refs/heads/zcwy0813-yang' into dev0525
This commit is contained in:
@@ -14,6 +14,7 @@ import com.xboe.module.boecase.service.ICasesRecommendPushRecordService;
|
||||
import com.xboe.module.boecase.vo.CaseExportVo;
|
||||
import com.xboe.module.boecase.vo.CaseRankingVo;
|
||||
import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo;
|
||||
import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo;
|
||||
import com.xboe.module.dict.entity.DictItem;
|
||||
import com.xboe.module.excel.ExportsExcelSenderUtil;
|
||||
|
||||
@@ -739,16 +740,21 @@ public class CasesApi extends ApiBaseController {
|
||||
|
||||
/**
|
||||
* 查询收藏
|
||||
* @param pageIndex
|
||||
* @param pageSize
|
||||
* @param orderField
|
||||
* @param orderAsc
|
||||
* @return
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
@GetMapping("/queryFavoriteCaseOfIndex")
|
||||
public JsonResponse<PageList<FavoriteCaseDto>> queryFavoriteCaseOfIndex(@RequestParam(required = false,defaultValue = "1") Integer pageIndex,
|
||||
public JsonResponse<PageList<FavoriteCaseOfIndexVo>> queryFavoriteCaseOfIndex(@RequestParam(required = false,defaultValue = "1") Integer pageIndex,
|
||||
@RequestParam(required = false,defaultValue = "5") Integer pageSize,
|
||||
@RequestParam(required = false) String orderField,
|
||||
@RequestParam(required = false) Boolean orderAsc) {
|
||||
// String accountId = this.getCurrent().getAccountId();
|
||||
String accountId = "965342027497607168";
|
||||
PageList<FavoriteCaseDto> casesList = casesService.queryFavoriteCaseOfIndex(pageIndex,pageSize,accountId,orderField,orderAsc);
|
||||
PageList<FavoriteCaseOfIndexVo> casesList = casesService.queryFavoriteCaseOfIndex(pageIndex,pageSize,accountId,orderField,orderAsc);
|
||||
return success(casesList);
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import com.xboe.module.boecase.dto.*;
|
||||
import com.xboe.module.boecase.entity.Cases;
|
||||
import com.xboe.module.boecase.vo.CaseRankingVo;
|
||||
import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo;
|
||||
import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo;
|
||||
import com.xboe.module.dict.entity.DictItem;
|
||||
import com.xboe.module.interaction.dto.FavoriteCaseDto;
|
||||
import com.xboe.school.vo.CasesVo;
|
||||
@@ -132,6 +133,6 @@ public interface ICasesService{
|
||||
|
||||
List<Cases> queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId);
|
||||
|
||||
PageList<FavoriteCaseDto> queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc);
|
||||
PageList<FavoriteCaseOfIndexVo> queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,9 +21,9 @@ import com.xboe.module.boecase.service.ICasesService;
|
||||
import com.xboe.module.boecase.vo.CaseRankingVo;
|
||||
import com.xboe.module.boecase.vo.CaseViewRankingItemVo;
|
||||
import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo;
|
||||
import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo;
|
||||
import com.xboe.module.dict.dao.SysDictionaryDao;
|
||||
import com.xboe.module.dict.entity.DictItem;
|
||||
import com.xboe.module.interaction.dto.FavoriteCaseDto;
|
||||
import com.xboe.module.interaction.entity.Favorites;
|
||||
import com.xboe.orm.CustomFieldInFilter;
|
||||
import com.xboe.school.vo.CasesVo;
|
||||
@@ -31,6 +31,7 @@ import com.xboe.standard.enums.BoedxResourceType;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.PageRequest;
|
||||
@@ -44,7 +45,6 @@ import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.IntStream;
|
||||
|
||||
@@ -329,12 +329,129 @@ public class CasesServiceImpl implements ICasesService {
|
||||
casesList.forEach(it->{
|
||||
it.setBreCommend(0);
|
||||
});
|
||||
casesList = addTags(casesList, caseVo.getUserId());
|
||||
casesList = caseListCommonHandle(casesList, caseVo.getUserId());
|
||||
page.setList(casesList);
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public PageList<Cases> queryRecommendPageCasesV2(CasePageVo caseVo) {
|
||||
|
||||
PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex() - 1, caseVo.getPageSize());
|
||||
|
||||
|
||||
String majorType = caseVo.getMajorType();
|
||||
if (StringUtil.isNotBlank(majorType)) {
|
||||
List<CasesMajorType> casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ","));
|
||||
if (CollUtil.isNotEmpty(casesTypes)) {
|
||||
List<String> caseIds = casesTypes.stream().map(CasesMajorType::getCaseId).collect(Collectors.toList());
|
||||
caseVo.setCaseIds(caseIds);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
List<OrgDomainDto> orgDomainDtos = caseVo.getOrgDomainDtos();
|
||||
List<String> level1 = new ArrayList<>();
|
||||
List<String> level2 = new ArrayList<>();
|
||||
List<String> level3 = new ArrayList<>();
|
||||
if (CollUtil.isNotEmpty(orgDomainDtos)) {
|
||||
for (int i = 0; i < orgDomainDtos.size(); i++) {
|
||||
OrgDomainDto domainDto = orgDomainDtos.get(i);
|
||||
List<OrgDomainDto> orgDomainParent2 = domainDto.getChildren();
|
||||
if (CollUtil.isNotEmpty(orgDomainParent2)) {
|
||||
for (OrgDomainDto orgDomainDto : orgDomainParent2) {
|
||||
List<OrgDomainDto> orgDomainParent3 = orgDomainDto.getChildren();
|
||||
if (CollUtil.isNotEmpty(orgDomainParent3)) {
|
||||
List<String> parent = orgDomainParent3.stream().map(OrgDomainDto::getParent).collect(Collectors.toList());
|
||||
level3.addAll(parent);
|
||||
} else {
|
||||
String parent = orgDomainDto.getParent();
|
||||
level2.add(parent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
String orgDomainParent = domainDto.getParent();
|
||||
level1.add(orgDomainParent);
|
||||
}
|
||||
}
|
||||
}
|
||||
caseVo.setOrg1(level1);
|
||||
caseVo.setOrg2(level2);
|
||||
caseVo.setOrg3(level3);
|
||||
|
||||
Page<Cases> cases = casesRecordDao.queryList(pageRequest,caseVo);
|
||||
PageList<Cases> pageList = new PageList<>();
|
||||
pageList.setCount((int) cases.getTotalElements());
|
||||
pageList.setPageSize(cases.getSize());
|
||||
List<Cases> content = cases.getContent();
|
||||
|
||||
caseListCommonHandle(content, caseVo.getUserId());
|
||||
|
||||
pageList.setList(content);
|
||||
return pageList;
|
||||
}
|
||||
|
||||
private List<Cases> caseListCommonHandle(List<Cases> casesList, String accountId) {
|
||||
if (CollUtil.isEmpty(casesList)) {
|
||||
return casesList;
|
||||
}
|
||||
//1.推荐案例数据处理
|
||||
recommendCasesDataHandle(casesList, accountId);
|
||||
//2.标签处理,添加作者标签和新的案例标签
|
||||
addAuthorTagAndCaseNewTag(casesList);
|
||||
|
||||
return casesList;
|
||||
}
|
||||
|
||||
private void recommendCasesDataHandle(List<Cases> casesList, String accountId) {
|
||||
if (StrUtil.isNotBlank(accountId)) {
|
||||
List<String> caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList());
|
||||
QueryBuilder queryBuilder = QueryBuilder.from(CasesRecommendPushRecord.class)
|
||||
.addField("new CasesRecommendPushRecord(id,recommendId,caseId)")
|
||||
.addFilters(Arrays.asList(
|
||||
FieldFilters.eq("pushUserId", accountId),
|
||||
FieldFilters.in("caseId", caseIdList),
|
||||
FieldFilters.eq("pushStatus", 3),
|
||||
FieldFilters.eq("deleted", Boolean.FALSE)
|
||||
))
|
||||
.addOrder("sysCreateTime", OrderDirection.DESC)
|
||||
.addGroupBy("caseId");
|
||||
|
||||
List<CasesRecommendPushRecord> pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder());
|
||||
|
||||
if (CollUtil.isNotEmpty(pushRecords)) {
|
||||
List<String> rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList());
|
||||
QueryBuilder builder = QueryBuilder.from(CasesRecommend.class)
|
||||
.addField("new CasesRecommend(id,recommendOrgName,recommendTime)")
|
||||
.addFilters(Arrays.asList(
|
||||
FieldFilters.eq("deleted", Boolean.FALSE),
|
||||
FieldFilters.in("id", rIds)
|
||||
));
|
||||
|
||||
List<CasesRecommend> recommands = casesRecommendDao.findList(builder.builder());
|
||||
if (CollUtil.isNotEmpty(recommands)) {
|
||||
Map<String, CasesRecommend> collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item -> item));
|
||||
casesList.forEach(it -> {
|
||||
CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId()));
|
||||
if (Objects.nonNull(one)) {
|
||||
CasesRecommend recommend = collect.get(one.getRecommendId());
|
||||
it.setBreCommend(1);
|
||||
it.setRefId(one.getId());
|
||||
it.setRecommendOrgName(recommend.getRecommendOrgName());
|
||||
it.setSysCreateTime(recommend.getRecommendTime());
|
||||
} else {
|
||||
it.setBreCommend(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加案例标签、作者标签(最佳案例N篇、上榜浏览量TOP榜单N次)、案例标签(xx分类浏览量TOP、最佳案例)
|
||||
*/
|
||||
@@ -395,65 +512,6 @@ public class CasesServiceImpl implements ICasesService {
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public PageList<Cases> queryRecommendPageCasesV2(CasePageVo caseVo) {
|
||||
|
||||
PageRequest pageRequest = PageRequest.of(caseVo.getPageIndex() - 1, caseVo.getPageSize());
|
||||
|
||||
|
||||
String majorType = caseVo.getMajorType();
|
||||
if (StringUtil.isNotBlank(majorType)) {
|
||||
List<CasesMajorType> casesTypes = casesMajorTypeRepoDao.findCasesBy(StrUtil.split(majorType, ","));
|
||||
if (CollUtil.isNotEmpty(casesTypes)) {
|
||||
List<String> caseIds = casesTypes.stream().map(CasesMajorType::getCaseId).collect(Collectors.toList());
|
||||
caseVo.setCaseIds(caseIds);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
List<OrgDomainDto> orgDomainDtos = caseVo.getOrgDomainDtos();
|
||||
List<String> level1 = new ArrayList<>();
|
||||
List<String> level2 = new ArrayList<>();
|
||||
List<String> level3 = new ArrayList<>();
|
||||
if (CollUtil.isNotEmpty(orgDomainDtos)) {
|
||||
for (int i = 0; i < orgDomainDtos.size(); i++) {
|
||||
OrgDomainDto domainDto = orgDomainDtos.get(i);
|
||||
List<OrgDomainDto> orgDomainParent2 = domainDto.getChildren();
|
||||
if (CollUtil.isNotEmpty(orgDomainParent2)) {
|
||||
for (OrgDomainDto orgDomainDto : orgDomainParent2) {
|
||||
List<OrgDomainDto> orgDomainParent3 = orgDomainDto.getChildren();
|
||||
if (CollUtil.isNotEmpty(orgDomainParent3)) {
|
||||
List<String> parent = orgDomainParent3.stream().map(OrgDomainDto::getParent).collect(Collectors.toList());
|
||||
level3.addAll(parent);
|
||||
} else {
|
||||
String parent = orgDomainDto.getParent();
|
||||
level2.add(parent);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
String orgDomainParent = domainDto.getParent();
|
||||
level1.add(orgDomainParent);
|
||||
}
|
||||
}
|
||||
}
|
||||
caseVo.setOrg1(level1);
|
||||
caseVo.setOrg2(level2);
|
||||
caseVo.setOrg3(level3);
|
||||
|
||||
Page<Cases> cases = casesRecordDao.queryList(pageRequest,caseVo);
|
||||
PageList<Cases> pageList = new PageList<>();
|
||||
pageList.setCount((int) cases.getTotalElements());
|
||||
pageList.setPageSize(cases.getSize());
|
||||
List<Cases> content = cases.getContent();
|
||||
|
||||
addTags(content, caseVo.getUserId());
|
||||
|
||||
pageList.setList(content);
|
||||
return pageList;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
String rename = "a.name".replaceAll("\\.", "");
|
||||
@@ -949,7 +1007,7 @@ public class CasesServiceImpl implements ICasesService {
|
||||
builder.addFilter(FieldFilters.in("id", ids));
|
||||
builder.addFields("new Cases(id,title,summary,coverUrl,authorId,authorName,sysCreateTime,breCommend,views,comments,praises,shares,favorites,deleted,sysCreateBy,sysCreateAid)");
|
||||
List<Cases> cases = casesDao.findList(builder.builder());
|
||||
cases = addTags(cases, accountId);
|
||||
cases = caseListCommonHandle(cases, accountId);
|
||||
return cases;
|
||||
}
|
||||
|
||||
@@ -1169,7 +1227,7 @@ public class CasesServiceImpl implements ICasesService {
|
||||
// 缓存不存在数据,数据库中不存在数据,重建缓存
|
||||
List<String> serializedCases = casesList.stream().map(item -> JSONUtil.toJsonStr(item)).collect(Collectors.toList());
|
||||
stringRedisTemplate.opsForList().rightPushAll(cacheKey, serializedCases);
|
||||
stringRedisTemplate.expire(cacheKey, 10000, TimeUnit.SECONDS);
|
||||
stringRedisTemplate.expire(cacheKey, 600, TimeUnit.SECONDS);
|
||||
return casesList;
|
||||
}
|
||||
return Collections.emptyList();
|
||||
@@ -1192,67 +1250,11 @@ public class CasesServiceImpl implements ICasesService {
|
||||
query.addFilter(FieldFilters.eq("deleted",false));
|
||||
|
||||
List<Cases> casesList = casesDao.findList(query.builder());
|
||||
casesList = addTags(casesList, accountId);
|
||||
casesList = caseListCommonHandle(casesList, accountId);
|
||||
|
||||
return casesList;
|
||||
}
|
||||
|
||||
private List<Cases> addTags(List<Cases> casesList, String accountId) {
|
||||
if (CollUtil.isEmpty(casesList)) {
|
||||
return casesList;
|
||||
}
|
||||
//1.推荐案例处理,获取的数据主要用于生成推荐案例标签
|
||||
recommendCasesTagDataHandle(casesList, accountId);
|
||||
//2.标签处理,添加作者标签和新的案例标签
|
||||
addAuthorTagAndCaseNewTag(casesList);
|
||||
|
||||
return casesList;
|
||||
}
|
||||
|
||||
private void recommendCasesTagDataHandle(List<Cases> casesList, String accountId) {
|
||||
if (StrUtil.isNotBlank(accountId)) {
|
||||
List<String> caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList());
|
||||
QueryBuilder queryBuilder = QueryBuilder.from(CasesRecommendPushRecord.class)
|
||||
.addField("new CasesRecommendPushRecord(id,recommendId,caseId)")
|
||||
.addFilters(Arrays.asList(
|
||||
FieldFilters.eq("pushUserId", accountId),
|
||||
FieldFilters.in("caseId", caseIdList),
|
||||
FieldFilters.eq("pushStatus", 3),
|
||||
FieldFilters.eq("deleted", Boolean.FALSE)
|
||||
))
|
||||
.addOrder("sysCreateTime", OrderDirection.DESC)
|
||||
.addGroupBy("caseId");
|
||||
|
||||
List<CasesRecommendPushRecord> pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder());
|
||||
|
||||
if (CollUtil.isNotEmpty(pushRecords)) {
|
||||
List<String> rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList());
|
||||
QueryBuilder builder = QueryBuilder.from(CasesRecommend.class)
|
||||
.addField("new CasesRecommend(id,recommendOrgName,recommendTime)")
|
||||
.addFilters(Arrays.asList(
|
||||
FieldFilters.eq("deleted", Boolean.FALSE),
|
||||
FieldFilters.in("id", rIds)
|
||||
));
|
||||
|
||||
List<CasesRecommend> recommands = casesRecommendDao.findList(builder.builder());
|
||||
if (CollUtil.isNotEmpty(recommands)) {
|
||||
Map<String, CasesRecommend> collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item -> item));
|
||||
casesList.forEach(it -> {
|
||||
CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId()));
|
||||
if (Objects.nonNull(one)) {
|
||||
CasesRecommend recommend = collect.get(one.getRecommendId());
|
||||
it.setBreCommend(1);
|
||||
it.setRefId(one.getId());
|
||||
it.setRecommendOrgName(recommend.getRecommendOrgName());
|
||||
it.setSysCreateTime(recommend.getRecommendTime());
|
||||
} else {
|
||||
it.setBreCommend(0);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
@@ -1358,7 +1360,7 @@ public class CasesServiceImpl implements ICasesService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageList<FavoriteCaseDto> queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc) {
|
||||
public PageList<FavoriteCaseOfIndexVo> queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId, String orderField, Boolean orderAsc) {
|
||||
String from = Favorites.class.getSimpleName()+" f,"+ Cases.class.getSimpleName()+" c";
|
||||
QueryBuilder builder = QueryBuilder.from(from);
|
||||
builder.addFields("f.id","f.sysCreateTime","c");
|
||||
@@ -1394,25 +1396,27 @@ public class CasesServiceImpl implements ICasesService {
|
||||
}
|
||||
|
||||
List<Object[]> list = pageFields.getList();
|
||||
|
||||
// 提取出 Cases 对象,添加标签
|
||||
List<Cases> casesList = list.stream().map(o -> (Cases) o[2]).collect(Collectors.toList());
|
||||
casesList = addTags(casesList, accountId);
|
||||
Map<String, Cases> caseMap = casesList.stream().collect(Collectors.toMap(Cases::getId, Function.identity()));
|
||||
List<Cases> casesList = list.stream().map(o -> {
|
||||
Cases cases = (Cases) o[2];
|
||||
FavoriteCaseOfIndexVo favoriteCaseOfIndexVo = new FavoriteCaseOfIndexVo();
|
||||
BeanUtils.copyProperties(cases, favoriteCaseOfIndexVo);
|
||||
favoriteCaseOfIndexVo.setFavoriteId(o[0].toString());
|
||||
favoriteCaseOfIndexVo.setFavoriteTime(LocalDateTime.parse(o[1].toString()));
|
||||
return favoriteCaseOfIndexVo;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
PageList<FavoriteCaseDto> favoriteCaseDtoPageList = new PageList<>();
|
||||
favoriteCaseDtoPageList.setList(new ArrayList<>());
|
||||
favoriteCaseDtoPageList.setPageSize(pageSize);
|
||||
favoriteCaseDtoPageList.setCount(pageFields.getCount());
|
||||
for (Object[] o: list) {
|
||||
FavoriteCaseDto favoriteCaseDto = new FavoriteCaseDto();
|
||||
favoriteCaseDto.setId(o[0].toString());
|
||||
favoriteCaseDto.setTime(LocalDateTime.parse(o[1].toString()));
|
||||
Cases cases = caseMap.get(((Cases) o[2]).getId());
|
||||
favoriteCaseDto.setCases(cases);
|
||||
favoriteCaseDtoPageList.getList().add(favoriteCaseDto);
|
||||
}
|
||||
casesList = caseListCommonHandle(casesList, accountId);
|
||||
|
||||
return favoriteCaseDtoPageList;
|
||||
List<FavoriteCaseOfIndexVo> collect = casesList.stream().map(cases -> (FavoriteCaseOfIndexVo) cases).collect(Collectors.toList());
|
||||
|
||||
PageList<FavoriteCaseOfIndexVo> favoriteCaseOfIndexVoPageList = new PageList<>();
|
||||
favoriteCaseOfIndexVoPageList.setList(collect);
|
||||
favoriteCaseOfIndexVoPageList.setPageSize(pageSize);
|
||||
favoriteCaseOfIndexVoPageList.setCount(pageFields.getCount());
|
||||
|
||||
return favoriteCaseOfIndexVoPageList;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.xboe.module.boecase.vo;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.xboe.module.boecase.entity.Cases;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
public class FavoriteCaseOfIndexVo extends Cases{
|
||||
|
||||
|
||||
private String favoriteId;
|
||||
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime favoriteTime;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user