优化:优化使用 MyBatis Plus ChainWrapper 的方式
This commit is contained in:
parent
304615ea23
commit
25f6e3402b
@ -18,6 +18,12 @@ package top.charles7c.cnadmin.common.base;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
||||
|
||||
/**
|
||||
@ -40,4 +46,60 @@ public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.Base
|
||||
default boolean insertBatch(Collection<T> entityList) {
|
||||
return Db.saveBatch(entityList);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询
|
||||
*
|
||||
* @return QueryWrapper 的包装类
|
||||
*/
|
||||
default QueryChainWrapper<T> query() {
|
||||
return ChainWrappers.queryChain(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询(lambda 式)
|
||||
*
|
||||
* @return LambdaQueryWrapper 的包装类
|
||||
*/
|
||||
default LambdaQueryChainWrapper<T> lambdaQuery() {
|
||||
return ChainWrappers.lambdaQueryChain(this, this.currentEntityClass());
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询(lambda 式)
|
||||
*
|
||||
* @param entity
|
||||
* 实体对象
|
||||
* @return LambdaQueryWrapper 的包装类
|
||||
*/
|
||||
default LambdaQueryChainWrapper<T> lambdaQuery(T entity) {
|
||||
return ChainWrappers.lambdaQueryChain(this, entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式更改
|
||||
*
|
||||
* @return UpdateWrapper 的包装类
|
||||
*/
|
||||
default UpdateChainWrapper<T> update() {
|
||||
return ChainWrappers.updateChain(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式更改(lambda 式)
|
||||
*
|
||||
* @return LambdaUpdateWrapper 的包装类
|
||||
*/
|
||||
default LambdaUpdateChainWrapper<T> lambdaUpdate() {
|
||||
return ChainWrappers.lambdaUpdateChain(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取实体类 Class 对象
|
||||
*
|
||||
* @return 实体类 Class 对象
|
||||
*/
|
||||
default Class<T> currentEntityClass() {
|
||||
return (Class<T>)ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapper.class, 0);
|
||||
}
|
||||
}
|
||||
|
@ -34,11 +34,6 @@ import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Assert;
|
||||
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.QueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.conditions.update.UpdateChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.toolkit.ChainWrappers;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.bean.copier.CopyOptions;
|
||||
@ -267,53 +262,6 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T, V, D, Q, C ext
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询
|
||||
*
|
||||
* @return QueryWrapper 的包装类
|
||||
*/
|
||||
protected QueryChainWrapper<T> query() {
|
||||
return ChainWrappers.queryChain(baseMapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询(lambda 式)
|
||||
*
|
||||
* @return LambdaQueryWrapper 的包装类
|
||||
*/
|
||||
protected LambdaQueryChainWrapper<T> lambdaQuery() {
|
||||
return ChainWrappers.lambdaQueryChain(baseMapper, entityClass);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式查询(lambda 式)
|
||||
*
|
||||
* @param entity
|
||||
* 实体对象
|
||||
* @return LambdaQueryWrapper 的包装类
|
||||
*/
|
||||
protected LambdaQueryChainWrapper<T> lambdaQuery(T entity) {
|
||||
return ChainWrappers.lambdaQueryChain(baseMapper, entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式更改
|
||||
*
|
||||
* @return UpdateWrapper 的包装类
|
||||
*/
|
||||
protected UpdateChainWrapper<T> update() {
|
||||
return ChainWrappers.updateChain(baseMapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 链式更改(lambda 式)
|
||||
*
|
||||
* @return LambdaUpdateWrapper 的包装类
|
||||
*/
|
||||
protected LambdaUpdateChainWrapper<T> lambdaUpdate() {
|
||||
return ChainWrappers.lambdaUpdateChain(baseMapper);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取实体类 ID 名称
|
||||
*
|
||||
|
@ -78,9 +78,9 @@ public class MybatisPlusConfiguration {
|
||||
// 对于单一数据库类型来说,都建议配置该值,避免每次分页都去抓取数据库类型
|
||||
// PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
|
||||
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
|
||||
// 溢出总页数后是否进行处理
|
||||
// 溢出总页数后是否进行处理,默认不处理
|
||||
paginationInnerInterceptor.setOverflow(false);
|
||||
// 单页分页条数限制
|
||||
// 单页分页条数限制,默认无限制
|
||||
paginationInnerInterceptor.setMaxLimit(-1L);
|
||||
return paginationInnerInterceptor;
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ import lombok.NoArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
@ -56,7 +55,7 @@ public class QueryHelper {
|
||||
* @return MyBatis Plus 查询条件封装对象
|
||||
*/
|
||||
public static <Q, R> QueryWrapper<R> build(Q query) {
|
||||
QueryWrapper<R> queryWrapper = Wrappers.query();
|
||||
QueryWrapper<R> queryWrapper = new QueryWrapper<>();
|
||||
// 没有查询条件,直接返回
|
||||
if (query == null) {
|
||||
return queryWrapper;
|
||||
|
@ -59,7 +59,6 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
|
||||
boolean isExists = this.checkNameExists(deptName, request.getParentId(), request.getDeptId());
|
||||
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", deptName));
|
||||
|
||||
// 保存信息
|
||||
request.setStatus(DisEnableStatusEnum.ENABLE);
|
||||
return super.add(request);
|
||||
}
|
||||
@ -79,7 +78,7 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
|
||||
public void delete(List<Long> ids) {
|
||||
CheckUtils.throwIf(() -> userService.countByDeptIds(ids) > 0, "所选部门存在用户关联,请解除关联后重试");
|
||||
super.delete(ids);
|
||||
super.lambdaUpdate().in(DeptDO::getParentId, ids).remove();
|
||||
baseMapper.lambdaUpdate().in(DeptDO::getParentId, ids).remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -103,7 +102,7 @@ public class DeptServiceImpl extends BaseServiceImpl<DeptMapper, DeptDO, DeptVO,
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean checkNameExists(String name, Long parentId, Long id) {
|
||||
return super.lambdaQuery().eq(DeptDO::getDeptName, name).eq(DeptDO::getParentId, parentId)
|
||||
return baseMapper.lambdaQuery().eq(DeptDO::getDeptName, name).eq(DeptDO::getParentId, parentId)
|
||||
.ne(id != null, DeptDO::getDeptId, id).exists();
|
||||
}
|
||||
}
|
||||
|
@ -51,7 +51,6 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
boolean isExists = this.checkNameExists(menuName, request.getParentId(), request.getMenuId());
|
||||
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", menuName));
|
||||
|
||||
// 保存信息
|
||||
request.setStatus(DisEnableStatusEnum.ENABLE);
|
||||
return super.add(request);
|
||||
}
|
||||
@ -63,7 +62,6 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
boolean isExists = this.checkNameExists(menuName, request.getParentId(), request.getMenuId());
|
||||
CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s'已存在", menuName));
|
||||
|
||||
// 更新信息
|
||||
super.update(request);
|
||||
}
|
||||
|
||||
@ -71,7 +69,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void delete(List<Long> ids) {
|
||||
super.delete(ids);
|
||||
super.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
|
||||
baseMapper.lambdaUpdate().in(MenuDO::getParentId, ids).remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -91,7 +89,7 @@ public class MenuServiceImpl extends BaseServiceImpl<MenuMapper, MenuDO, MenuVO,
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean checkNameExists(String name, Long parentId, Long id) {
|
||||
return super.lambdaQuery().eq(MenuDO::getMenuName, name).eq(MenuDO::getParentId, parentId)
|
||||
return baseMapper.lambdaQuery().eq(MenuDO::getMenuName, name).eq(MenuDO::getParentId, parentId)
|
||||
.ne(id != null, MenuDO::getMenuId, id).exists();
|
||||
}
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import top.charles7c.cnadmin.system.mapper.RoleDeptMapper;
|
||||
@ -49,7 +47,7 @@ public class RoleDeptServiceImpl implements RoleDeptService {
|
||||
return;
|
||||
}
|
||||
// 删除原有关联
|
||||
roleDeptMapper.delete(Wrappers.<RoleDeptDO>lambdaQuery().eq(RoleDeptDO::getRoleId, roleId));
|
||||
roleDeptMapper.lambdaUpdate().eq(RoleDeptDO::getRoleId, roleId).remove();
|
||||
// 保存最新关联
|
||||
List<RoleDeptDO> roleDeptList =
|
||||
deptIds.stream().map(deptId -> new RoleDeptDO(roleId, deptId)).collect(Collectors.toList());
|
||||
|
@ -24,8 +24,6 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import top.charles7c.cnadmin.system.mapper.RoleMenuMapper;
|
||||
@ -50,7 +48,7 @@ public class RoleMenuServiceImpl implements RoleMenuService {
|
||||
return;
|
||||
}
|
||||
// 删除原有关联
|
||||
roleMenuMapper.delete(Wrappers.<RoleMenuDO>lambdaQuery().eq(RoleMenuDO::getRoleId, roleId));
|
||||
roleMenuMapper.lambdaUpdate().eq(RoleMenuDO::getRoleId, roleId).remove();
|
||||
// 保存最新关联
|
||||
List<RoleMenuDO> roleMenuList =
|
||||
menuIds.stream().map(menuId -> new RoleMenuDO(roleId, menuId)).collect(Collectors.toList());
|
||||
|
@ -68,7 +68,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()),
|
||||
String.format("新增失败,'%s'已存在", roleCode));
|
||||
|
||||
// 新增角色
|
||||
// 新增信息
|
||||
request.setStatus(DisEnableStatusEnum.ENABLE);
|
||||
Long roleId = super.add(request);
|
||||
// 保存角色和菜单关联
|
||||
@ -88,7 +88,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
CheckUtils.throwIf(() -> this.checkCodeExists(roleCode, request.getRoleId()),
|
||||
String.format("修改失败,'%s'已存在", roleCode));
|
||||
|
||||
// 更新角色
|
||||
// 更新信息
|
||||
super.update(request);
|
||||
Long roleId = request.getRoleId();
|
||||
// 保存角色和菜单关联
|
||||
@ -131,14 +131,16 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
|
||||
@Override
|
||||
public List<String> listRoleNamesByRoleIds(List<Long> roleIds) {
|
||||
List<RoleDO> roleList = super.lambdaQuery().select(RoleDO::getRoleName).in(RoleDO::getRoleId, roleIds).list();
|
||||
List<RoleDO> roleList =
|
||||
baseMapper.lambdaQuery().select(RoleDO::getRoleName).in(RoleDO::getRoleId, roleIds).list();
|
||||
return roleList.stream().map(RoleDO::getRoleName).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> listRoleCodesByUserId(Long userId) {
|
||||
List<Long> roleIds = userRoleService.listRoleIdsByUserId(userId);
|
||||
List<RoleDO> roleList = super.lambdaQuery().select(RoleDO::getRoleCode).in(RoleDO::getRoleId, roleIds).list();
|
||||
List<RoleDO> roleList =
|
||||
baseMapper.lambdaQuery().select(RoleDO::getRoleCode).in(RoleDO::getRoleId, roleIds).list();
|
||||
return roleList.stream().map(RoleDO::getRoleCode).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@ -152,7 +154,7 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean checkNameExists(String name, Long id) {
|
||||
return super.lambdaQuery().eq(RoleDO::getRoleName, name).ne(id != null, RoleDO::getRoleId, id).exists();
|
||||
return baseMapper.lambdaQuery().eq(RoleDO::getRoleName, name).ne(id != null, RoleDO::getRoleId, id).exists();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -165,6 +167,6 @@ public class RoleServiceImpl extends BaseServiceImpl<RoleMapper, RoleDO, RoleVO,
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean checkCodeExists(String code, Long id) {
|
||||
return super.lambdaQuery().eq(RoleDO::getRoleCode, code).ne(id != null, RoleDO::getRoleId, id).exists();
|
||||
return baseMapper.lambdaQuery().eq(RoleDO::getRoleCode, code).ne(id != null, RoleDO::getRoleId, id).exists();
|
||||
}
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ import lombok.RequiredArgsConstructor;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import top.charles7c.cnadmin.system.mapper.UserRoleMapper;
|
||||
@ -49,7 +47,7 @@ public class UserRoleServiceImpl implements UserRoleService {
|
||||
return;
|
||||
}
|
||||
// 删除原有关联
|
||||
userRoleMapper.delete(Wrappers.<UserRoleDO>lambdaQuery().eq(UserRoleDO::getUserId, userId));
|
||||
userRoleMapper.lambdaUpdate().eq(UserRoleDO::getUserId, userId).remove();
|
||||
// 保存最新关联
|
||||
List<UserRoleDO> userRoleList =
|
||||
roleIds.stream().map(roleId -> new UserRoleDO(userId, roleId)).collect(Collectors.toList());
|
||||
@ -58,7 +56,7 @@ public class UserRoleServiceImpl implements UserRoleService {
|
||||
|
||||
@Override
|
||||
public Long countByRoleIds(List<Long> roleIds) {
|
||||
return userRoleMapper.selectCount(Wrappers.<UserRoleDO>lambdaQuery().in(UserRoleDO::getRoleId, roleIds));
|
||||
return userRoleMapper.lambdaQuery().in(UserRoleDO::getRoleId, roleIds).count();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -77,10 +77,10 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
boolean isExists = this.checkNameExists(username, request.getUserId());
|
||||
CheckUtils.throwIf(() -> isExists, String.format("新增失败,'%s'已存在", username));
|
||||
|
||||
// 新增用户
|
||||
// 新增信息
|
||||
request.setStatus(DisEnableStatusEnum.ENABLE);
|
||||
Long userId = super.add(request);
|
||||
super.lambdaUpdate()
|
||||
baseMapper.lambdaUpdate()
|
||||
.set(UserDO::getPassword, SecureUtils.md5Salt(SysConsts.DEFAULT_PASSWORD, userId.toString()))
|
||||
.set(UserDO::getPwdResetTime, LocalDateTime.now()).eq(UserDO::getUserId, userId).update();
|
||||
// 保存用户和角色关联
|
||||
@ -95,7 +95,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
boolean isExists = this.checkNameExists(username, request.getUserId());
|
||||
CheckUtils.throwIf(() -> isExists, String.format("修改失败,'%s'已存在", username));
|
||||
|
||||
// 更新用户
|
||||
// 更新信息
|
||||
super.update(request);
|
||||
Long userId = request.getUserId();
|
||||
// 保存用户和角色关联
|
||||
@ -133,7 +133,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
|
||||
// 更新用户头像
|
||||
String newAvatar = newAvatarFile.getName();
|
||||
super.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId).update();
|
||||
baseMapper.lambdaUpdate().set(UserDO::getAvatar, newAvatar).eq(UserDO::getUserId, userId).update();
|
||||
|
||||
// 删除原头像
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
@ -157,7 +157,7 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
|
||||
// 更新密码和密码重置时间
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
super.lambdaUpdate().set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString()))
|
||||
baseMapper.lambdaUpdate().set(UserDO::getPassword, SecureUtils.md5Salt(newPassword, userId.toString()))
|
||||
.set(UserDO::getPwdResetTime, now).eq(UserDO::getUserId, userId).update();
|
||||
|
||||
// 更新登录用户信息
|
||||
@ -172,12 +172,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
UserDO userDO = super.getById(userId);
|
||||
CheckUtils.throwIfNotEqual(SecureUtils.md5Salt(currentPassword, userId.toString()), userDO.getPassword(),
|
||||
"当前密码错误");
|
||||
Long count = super.lambdaQuery().eq(UserDO::getEmail, newEmail).count();
|
||||
Long count = baseMapper.lambdaQuery().eq(UserDO::getEmail, newEmail).count();
|
||||
CheckUtils.throwIf(() -> count > 0, "邮箱已绑定其他账号,请更换其他邮箱");
|
||||
CheckUtils.throwIfEqual(newEmail, userDO.getEmail(), "新邮箱不能与当前邮箱相同");
|
||||
|
||||
// 更新邮箱
|
||||
super.lambdaUpdate().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId).update();
|
||||
baseMapper.lambdaUpdate().set(UserDO::getEmail, newEmail).eq(UserDO::getUserId, userId).update();
|
||||
|
||||
// 更新登录用户信息
|
||||
LoginUser loginUser = LoginHelper.getLoginUser();
|
||||
@ -202,12 +202,12 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
|
||||
@Override
|
||||
public UserDO getByUsername(String username) {
|
||||
return super.lambdaQuery().eq(UserDO::getUsername, username).one();
|
||||
return baseMapper.lambdaQuery().eq(UserDO::getUsername, username).one();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long countByDeptIds(List<Long> deptIds) {
|
||||
return super.lambdaQuery().in(UserDO::getDeptId, deptIds).count();
|
||||
return baseMapper.lambdaQuery().in(UserDO::getDeptId, deptIds).count();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -225,6 +225,6 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, UserDO, UserVO,
|
||||
* @return 是否存在
|
||||
*/
|
||||
private boolean checkNameExists(String name, Long id) {
|
||||
return super.lambdaQuery().eq(UserDO::getUsername, name).ne(id != null, UserDO::getUserId, id).exists();
|
||||
return baseMapper.lambdaQuery().eq(UserDO::getUsername, name).ne(id != null, UserDO::getUserId, id).exists();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user