mirror of
https://gitee.com/republicline/rax-remote-v2.git
synced 2025-08-24 04:04:57 +08:00
parent
47508f9294
commit
e17f93d517
|
@ -0,0 +1,28 @@
|
|||
package com.rax.admin.api.dto;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@Schema(description = "医院信息")
|
||||
public class HospitalDTO {
|
||||
|
||||
@Schema(description = "主键")
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "医院名称")
|
||||
private String name;
|
||||
|
||||
@Schema(description = "编码")
|
||||
private String code;
|
||||
|
||||
@Schema(description = "医院所在省")
|
||||
private String province;
|
||||
|
||||
@Schema(description = "医院所在市")
|
||||
private String city;
|
||||
|
||||
@Schema(description = "状态,正常 0, 冻结 1")
|
||||
private Boolean status;
|
||||
|
||||
}
|
|
@ -39,4 +39,16 @@ public class UserDTO extends SysUser {
|
|||
@Schema(description = "新密码")
|
||||
private String newpassword1;
|
||||
|
||||
/**
|
||||
* 验证码
|
||||
*/
|
||||
@Schema(description = "验证码")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 随机值
|
||||
*/
|
||||
@Schema(description = "随机值")
|
||||
private String randomStr;
|
||||
|
||||
}
|
||||
|
|
|
@ -144,4 +144,10 @@ public class SysUser implements Serializable {
|
|||
@Schema(description = "邮箱")
|
||||
private String email;
|
||||
|
||||
@Schema(description = "性别")
|
||||
private String sex;
|
||||
|
||||
@Schema(description = "医院")
|
||||
private String hospital;
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
package com.rax.admin.controller;
|
||||
|
||||
import com.rax.admin.api.dto.HospitalDTO;
|
||||
import com.rax.admin.api.entity.SysHospital;
|
||||
import com.rax.admin.service.SysHospitalService;
|
||||
import com.rax.common.core.util.R;
|
||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/hospital")
|
||||
@Tag(description = "hospital", name = "医院管理模块")
|
||||
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
|
||||
public class SysHospitalController {
|
||||
|
||||
@Autowired
|
||||
private SysHospitalService sysHospitalService;
|
||||
|
||||
@PostMapping("/getHospitalById")
|
||||
R<SysHospital> getHospitalById(String id) {
|
||||
return sysHospitalService.getHospitalById(id);
|
||||
}
|
||||
|
||||
@PostMapping("/deleteHospitalById")
|
||||
R<Boolean> deleteHospitalById(String id) {
|
||||
return sysHospitalService.deleteHospitalById(id);
|
||||
}
|
||||
|
||||
@PostMapping("/updateHospital")
|
||||
R<Boolean> updateHospital(HospitalDTO hospitalDTO) {
|
||||
return sysHospitalService.updateHospital(hospitalDTO);
|
||||
}
|
||||
|
||||
@PostMapping("/saveHospital")
|
||||
R<Boolean> saveHospital(HospitalDTO hospitalDTO) {
|
||||
return sysHospitalService.saveHospital(hospitalDTO);
|
||||
}
|
||||
|
||||
@PostMapping("/getHospitalPage")
|
||||
R<Map> getHospitalPage(String name, long offset, long limit) {
|
||||
return sysHospitalService.getHospitalList(name, offset, limit);
|
||||
}
|
||||
|
||||
@RequestMapping("/getHospitalList")
|
||||
R<List> getHospitalList(String name) {
|
||||
return sysHospitalService.getHospitalList(name);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
package com.rax.admin.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.rax.admin.api.entity.SysHospital;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface SysHospitalMapper extends BaseMapper<SysHospital> {
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
package com.rax.admin.service;
|
||||
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
import com.rax.admin.api.dto.HospitalDTO;
|
||||
import com.rax.admin.api.entity.SysHospital;
|
||||
import com.rax.common.core.util.R;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 医院信息
|
||||
*/
|
||||
public interface SysHospitalService extends IService<SysHospital> {
|
||||
|
||||
R<SysHospital> getHospitalById(String id);
|
||||
|
||||
R<Boolean> deleteHospitalById(String id);
|
||||
|
||||
R<Boolean> updateHospital(HospitalDTO hospitalDTO);
|
||||
|
||||
R<Boolean> saveHospital(HospitalDTO hospitalDTO);
|
||||
|
||||
R<Map> getHospitalList(String name, long offset, long limit);
|
||||
|
||||
R<List> getHospitalList(String name);
|
||||
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
package com.rax.admin.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.OrderItem;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.rax.admin.api.dto.HospitalDTO;
|
||||
import com.rax.admin.api.entity.SysHospital;
|
||||
import com.rax.admin.mapper.SysHospitalMapper;
|
||||
import com.rax.admin.service.SysHospitalService;
|
||||
import com.rax.common.core.util.R;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@Service
|
||||
public class SysHospitalServiceImpl extends ServiceImpl<SysHospitalMapper, SysHospital> implements SysHospitalService {
|
||||
|
||||
@Autowired
|
||||
private SysHospitalMapper sysHospitalMapper;
|
||||
|
||||
public R<SysHospital> getHospitalById(String id) {
|
||||
SysHospital sysHospital = getById(id);
|
||||
return R.ok(sysHospital);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<Boolean> deleteHospitalById(String id) {
|
||||
boolean status = removeById(id);
|
||||
return R.ok(status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<Boolean> updateHospital(HospitalDTO hospitalDTO) {
|
||||
SysHospital sysHospital = new SysHospital();
|
||||
BeanUtils.copyProperties(hospitalDTO, sysHospital);
|
||||
boolean status = updateById(sysHospital);
|
||||
return R.ok(status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<Boolean> saveHospital(HospitalDTO hospitalDTO) {
|
||||
SysHospital sysHospital = new SysHospital();
|
||||
BeanUtils.copyProperties(hospitalDTO, sysHospital);
|
||||
boolean status = save(sysHospital);
|
||||
return R.ok(status);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<Map> getHospitalList(String name, long offset, long limit) {
|
||||
Page<SysHospital> page = new Page<>();
|
||||
page.setSize(limit);
|
||||
page.setCurrent(offset);
|
||||
|
||||
QueryWrapper<SysHospital> queryWrapper = new QueryWrapper<>();
|
||||
if (StringUtils.hasText(name)) {
|
||||
queryWrapper.checkSqlInjection().like("name", name);
|
||||
}
|
||||
queryWrapper.eq("deleted", 0);
|
||||
|
||||
List<OrderItem> orderItems = new ArrayList<>();
|
||||
OrderItem createTimeOrder = new OrderItem();
|
||||
createTimeOrder.setColumn("create_time");
|
||||
createTimeOrder.setAsc(false);
|
||||
orderItems.add(createTimeOrder);
|
||||
page.setOrders(orderItems);
|
||||
|
||||
List<SysHospital> sysHospitals = sysHospitalMapper.selectList(page, queryWrapper);
|
||||
Long count = sysHospitalMapper.selectCount(queryWrapper);
|
||||
|
||||
Map result = new HashMap();
|
||||
result.put("count", count);
|
||||
result.put("list", sysHospitals);
|
||||
return R.ok(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public R<List> getHospitalList(String name) {
|
||||
QueryWrapper<SysHospital> queryWrapper = new QueryWrapper<>();
|
||||
if (StringUtils.hasText(name)) {
|
||||
queryWrapper.checkSqlInjection().like("name", name);
|
||||
}
|
||||
queryWrapper.eq("deleted", 0);
|
||||
queryWrapper.orderByDesc("create_time");
|
||||
String [] columns = {"id", "name", "code", "status", "domain", "province", "city"};
|
||||
queryWrapper.select(columns);
|
||||
|
||||
List sysHospitals = sysHospitalMapper.selectMaps(queryWrapper);
|
||||
return R.ok(sysHospitals);
|
||||
}
|
||||
}
|
|
@ -31,10 +31,12 @@ import org.springframework.beans.BeanUtils;
|
|||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.cache.annotation.CacheEvict;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.springframework.validation.BindingResult;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
@ -65,8 +67,11 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
private final CacheManager cacheManager;
|
||||
|
||||
private final RedisTemplate redisTemplate;
|
||||
|
||||
/**
|
||||
* 保存用户信息
|
||||
*
|
||||
* @param userDto DTO 对象
|
||||
* @return success/fail
|
||||
*/
|
||||
|
@ -95,7 +100,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE");
|
||||
// 默认角色
|
||||
SysRole sysRole = sysRoleService
|
||||
.getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getRoleCode, defaultRole));
|
||||
.getOne(Wrappers.<SysRole>lambdaQuery().eq(SysRole::getRoleCode, defaultRole));
|
||||
userDto.setRole(Collections.singletonList(sysRole.getRoleId()));
|
||||
}
|
||||
|
||||
|
@ -111,6 +116,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 通过查用户的全部信息
|
||||
*
|
||||
* @param sysUser 用户
|
||||
* @return
|
||||
*/
|
||||
|
@ -120,19 +126,19 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
userInfo.setSysUser(sysUser);
|
||||
// 设置角色列表 (ID)
|
||||
List<Long> roleIds = sysRoleService.findRolesByUserId(sysUser.getUserId())
|
||||
.stream()
|
||||
.map(SysRole::getRoleId)
|
||||
.collect(Collectors.toList());
|
||||
.stream()
|
||||
.map(SysRole::getRoleId)
|
||||
.collect(Collectors.toList());
|
||||
userInfo.setRoles(ArrayUtil.toArray(roleIds, Long.class));
|
||||
|
||||
// 设置权限列表(menu.permission)
|
||||
Set<String> permissions = new HashSet<>();
|
||||
roleIds.forEach(roleId -> {
|
||||
List<String> permissionList = sysMenuService.findMenuByRoleId(roleId)
|
||||
.stream()
|
||||
.filter(menu -> StrUtil.isNotEmpty(menu.getPermission()))
|
||||
.map(SysMenu::getPermission)
|
||||
.collect(Collectors.toList());
|
||||
.stream()
|
||||
.filter(menu -> StrUtil.isNotEmpty(menu.getPermission()))
|
||||
.map(SysMenu::getPermission)
|
||||
.collect(Collectors.toList());
|
||||
permissions.addAll(permissionList);
|
||||
});
|
||||
userInfo.setPermissions(ArrayUtil.toArray(permissions, String.class));
|
||||
|
@ -141,7 +147,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 分页查询用户信息(含有角色信息)
|
||||
* @param page 分页对象
|
||||
*
|
||||
* @param page 分页对象
|
||||
* @param userDTO 参数列表
|
||||
* @return
|
||||
*/
|
||||
|
@ -152,6 +159,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 通过ID查询用户信息
|
||||
*
|
||||
* @param id 用户ID
|
||||
* @return 用户信息
|
||||
*/
|
||||
|
@ -162,6 +170,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 删除用户
|
||||
*
|
||||
* @param ids 用户ID 列表
|
||||
* @return Boolean
|
||||
*/
|
||||
|
@ -231,6 +240,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 查询全部的用户
|
||||
*
|
||||
* @param userDTO 查询条件
|
||||
* @return list
|
||||
*/
|
||||
|
@ -243,14 +253,14 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
UserExcelVO excelVO = new UserExcelVO();
|
||||
BeanUtils.copyProperties(userVO, excelVO);
|
||||
String roleNameList = userVO.getRoleList()
|
||||
.stream()
|
||||
.map(SysRole::getRoleName)
|
||||
.collect(Collectors.joining(StrUtil.COMMA));
|
||||
.stream()
|
||||
.map(SysRole::getRoleName)
|
||||
.collect(Collectors.joining(StrUtil.COMMA));
|
||||
excelVO.setRoleNameList(roleNameList);
|
||||
String postNameList = userVO.getPostList()
|
||||
.stream()
|
||||
.map(SysPost::getPostName)
|
||||
.collect(Collectors.joining(StrUtil.COMMA));
|
||||
.stream()
|
||||
.map(SysPost::getPostName)
|
||||
.collect(Collectors.joining(StrUtil.COMMA));
|
||||
excelVO.setPostNameList(postNameList);
|
||||
return excelVO;
|
||||
}).collect(Collectors.toList());
|
||||
|
@ -259,7 +269,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* excel 导入用户, 插入正确的 错误的提示行号
|
||||
* @param excelVOList excel 列表数据
|
||||
*
|
||||
* @param excelVOList excel 列表数据
|
||||
* @param bindingResult 错误数据
|
||||
* @return ok fail
|
||||
*/
|
||||
|
@ -279,7 +290,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
Set<String> errorMsg = new HashSet<>();
|
||||
// 校验用户名是否存在
|
||||
boolean exsitUserName = userList.stream()
|
||||
.anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername()));
|
||||
.anyMatch(sysUser -> excel.getUsername().equals(sysUser.getUsername()));
|
||||
|
||||
if (exsitUserName) {
|
||||
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, excel.getUsername()));
|
||||
|
@ -287,8 +298,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
// 判断输入的部门名称列表是否合法
|
||||
Optional<SysDept> deptOptional = deptList.stream()
|
||||
.filter(dept -> excel.getDeptName().equals(dept.getName()))
|
||||
.findFirst();
|
||||
.filter(dept -> excel.getDeptName().equals(dept.getName()))
|
||||
.findFirst();
|
||||
if (!deptOptional.isPresent()) {
|
||||
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, excel.getDeptName()));
|
||||
}
|
||||
|
@ -296,8 +307,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
// 判断输入的角色名称列表是否合法
|
||||
List<String> roleNameList = StrUtil.split(excel.getRoleNameList(), StrUtil.COMMA);
|
||||
List<SysRole> roleCollList = roleList.stream()
|
||||
.filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name)))
|
||||
.collect(Collectors.toList());
|
||||
.filter(role -> roleNameList.stream().anyMatch(name -> role.getRoleName().equals(name)))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (roleCollList.size() != roleNameList.size()) {
|
||||
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_ROLE_ROLENAME_INEXISTENCE, excel.getRoleNameList()));
|
||||
|
@ -306,8 +317,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
// 判断输入的部门名称列表是否合法
|
||||
List<String> postNameList = StrUtil.split(excel.getPostNameList(), StrUtil.COMMA);
|
||||
List<SysPost> postCollList = postList.stream()
|
||||
.filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name)))
|
||||
.collect(Collectors.toList());
|
||||
.filter(post -> postNameList.stream().anyMatch(name -> post.getPostName().equals(name)))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (postCollList.size() != postNameList.size()) {
|
||||
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_POST_POSTNAME_INEXISTENCE, excel.getPostNameList()));
|
||||
|
@ -316,8 +327,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
// 数据合法情况
|
||||
if (CollUtil.isEmpty(errorMsg)) {
|
||||
insertExcelUser(excel, deptOptional, roleCollList, postCollList);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
// 数据不合法情况
|
||||
errorMessageList.add(new ErrorMessage(excel.getLineNum(), errorMsg));
|
||||
}
|
||||
|
@ -357,12 +367,26 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 注册用户 赋予用户默认角色
|
||||
*
|
||||
* @param userDto 用户信息
|
||||
* @return success/false
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public R<Boolean> registerUser(UserDTO userDto) {
|
||||
String codeCache = (String) redisTemplate.opsForValue().get(CacheConstants.DEFAULT_CODE_KEY + userDto.getRandomStr());
|
||||
if (StringUtils.hasText(codeCache)) {
|
||||
String code = userDto.getCode();
|
||||
if (StringUtils.hasText(code)) {
|
||||
if (!codeCache.equals(code)) {
|
||||
return R.failed("验证码输入错误");
|
||||
}
|
||||
} else {
|
||||
return R.failed("请输入验证码");
|
||||
}
|
||||
} else {
|
||||
return R.failed("验证码已失效");
|
||||
}
|
||||
// 判断用户名是否存在
|
||||
SysUser sysUser = this.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, userDto.getUsername()));
|
||||
if (sysUser != null) {
|
||||
|
@ -374,6 +398,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
|
||||
/**
|
||||
* 锁定用户
|
||||
*
|
||||
* @param username 用户名
|
||||
* @return
|
||||
*/
|
||||
|
@ -412,8 +437,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
String password = ENCODER.encode(userDto.getNewpassword1());
|
||||
|
||||
this.update(Wrappers.<SysUser>lambdaUpdate()
|
||||
.set(SysUser::getPassword, password)
|
||||
.eq(SysUser::getUserId, userVO.getUserId()));
|
||||
.set(SysUser::getPassword, password)
|
||||
.eq(SysUser::getUserId, userVO.getUserId()));
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
|
@ -427,8 +452,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
|
|||
if (!ENCODER.matches(password, sysUser.getPassword())) {
|
||||
log.info("原密码错误");
|
||||
return R.failed("密码输入错误");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return R.ok();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -77,6 +77,7 @@ security:
|
|||
- /actuator/**
|
||||
- /code/**
|
||||
- /rax/**
|
||||
- /hospital/getHospitalList
|
||||
# 临时白名单
|
||||
- /static/**
|
||||
# - /topic/**
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.rax.admin.mapper.SysHospitalMapper">
|
||||
</mapper>
|
|
@ -52,10 +52,4 @@ public class MedicineController {
|
|||
throw new AccessDeniedException("Access is denied");
|
||||
}
|
||||
}
|
||||
|
||||
/* @MessageMapping("/getMedicineFlag")
|
||||
@SendTo("/topic/medicineFlag")
|
||||
public R getMedicineFlag(String id, String name) {
|
||||
|
||||
}*/
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user