Compare commits
1 Commits
feature/ss
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 1e1e4167d4 |
@@ -1,6 +1,7 @@
|
|||||||
package org.nl.system.controller.permission;
|
package org.nl.system.controller.permission;
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
@@ -85,5 +86,26 @@ public class SysDataPermissionController {
|
|||||||
return new ResponseEntity<>(dataPermissionService.getDataPermissionOption(),HttpStatus.OK);
|
return new ResponseEntity<>(dataPermissionService.getDataPermissionOption(),HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@PostMapping("/saveDataPermission")
|
||||||
|
@Log("保存数据权限")
|
||||||
|
@ApiOperation("保存数据权限")
|
||||||
|
public ResponseEntity<Object> saveDataPermission(@RequestBody JSONObject datas){
|
||||||
|
dataPermissionService.savePermission(datas);
|
||||||
|
return new ResponseEntity<>(HttpStatus.CREATED);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/dataShow")
|
||||||
|
@Log("查看数据权限")
|
||||||
|
@ApiOperation("查看数据权限")
|
||||||
|
public ResponseEntity<Object> getDataShow(@RequestBody String id){
|
||||||
|
return new ResponseEntity<>(dataPermissionService.getDataShow(id),HttpStatus.OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/dataDetail")
|
||||||
|
@Log("查看数据明细")
|
||||||
|
@ApiOperation("查看数据明细")
|
||||||
|
public ResponseEntity<Object> getDataDetail(@RequestBody JSONObject data){
|
||||||
|
return new ResponseEntity<>(dataPermissionService.getDataDetail(data),HttpStatus.OK);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
package org.nl.system.service.permission;
|
package org.nl.system.service.permission;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import org.nl.common.domain.query.PageQuery;
|
import org.nl.common.domain.query.PageQuery;
|
||||||
import org.nl.system.service.dict.dao.Dict;
|
import org.nl.system.service.dict.dao.Dict;
|
||||||
import org.nl.system.service.permission.dao.SysDataPermission;
|
import org.nl.system.service.permission.dao.SysDataPermission;
|
||||||
import com.baomidou.mybatisplus.extension.service.IService;
|
import com.baomidou.mybatisplus.extension.service.IService;
|
||||||
|
import org.nl.system.service.permission.dao.SysDataScope;
|
||||||
import org.nl.system.service.permission.dto.SysDataPermissionQuery;
|
import org.nl.system.service.permission.dto.SysDataPermissionQuery;
|
||||||
|
import org.nl.system.service.user.dto.UserDataPermissionDto;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
@@ -56,5 +59,20 @@ public interface ISysDataPermissionService extends IService<SysDataPermission> {
|
|||||||
* 获取数据权限下拉框
|
* 获取数据权限下拉框
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
Object getDataPermissionOption();
|
List<SysDataPermission> getDataPermissionOption();
|
||||||
|
|
||||||
|
List<UserDataPermissionDto> getDataShow(String id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存数据权限
|
||||||
|
* @param datas
|
||||||
|
*/
|
||||||
|
void savePermission(JSONObject datas);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据展示
|
||||||
|
* @param data
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<SysDataScope> getDataDetail(JSONObject data);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package org.nl.system.service.permission.dao;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>
|
||||||
|
* 数据权限规则表
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @author generator
|
||||||
|
* @since 2022-12-27
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("sys_data_scope")
|
||||||
|
public class SysDataScope implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前用户
|
||||||
|
*/
|
||||||
|
private String selfUserId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据权限类型
|
||||||
|
*/
|
||||||
|
private String permissionScopeType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 部门权限列表
|
||||||
|
*/
|
||||||
|
private String deptId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户权限列表
|
||||||
|
*/
|
||||||
|
private String userId;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
package org.nl.system.service.permission.dao.mapper;
|
package org.nl.system.service.permission.dao.mapper;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.nl.system.service.permission.dao.SysDataPermission;
|
import org.nl.system.service.permission.dao.SysDataPermission;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.nl.system.service.permission.dao.SysDataScope;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -13,4 +17,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface SysDataPermissionMapper extends BaseMapper<SysDataPermission> {
|
public interface SysDataPermissionMapper extends BaseMapper<SysDataPermission> {
|
||||||
|
|
||||||
|
List<String> findDataScopeUserIdBySelfUserIdAndScopeType(String userId, String permissionScopeType);
|
||||||
|
|
||||||
|
List<String> findDataScopeDeptIdBySelfUserIdAndScopeType(String userId, String permissionScopeType);
|
||||||
|
|
||||||
|
void deleteScopeBySelfUserId(String userId);
|
||||||
|
|
||||||
|
void insertDataScope(@Param("dataScope") SysDataScope dataScope);
|
||||||
|
|
||||||
|
void insertDataScopes(@Param("dataScope") SysDataScope dataScope);
|
||||||
|
|
||||||
|
List<SysDataScope> getDataDetail(String selfUserId, String permissionScopeType);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,61 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?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">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="org.nl.system.service.permission.dao.mapper.SysDataPermissionMapper">
|
<mapper namespace="org.nl.system.service.permission.dao.mapper.SysDataPermissionMapper">
|
||||||
|
<insert id="insertDataScope">
|
||||||
|
INSERT INTO sys_data_scope(self_user_id, permission_scope_type, user_id)
|
||||||
|
VALUES (#{dataScope.selfUserId}, #{dataScope.permissionScopeType}, #{dataScope.userId})
|
||||||
|
</insert>
|
||||||
|
<insert id="insertDataScopes">
|
||||||
|
INSERT INTO sys_data_scope(self_user_id, permission_scope_type, user_id, dept_id)
|
||||||
|
VALUES (#{dataScope.selfUserId}, #{dataScope.permissionScopeType}, #{dataScope.userId}, #{dataScope.deptId})
|
||||||
|
</insert>
|
||||||
|
<delete id="deleteScopeBySelfUserId">
|
||||||
|
DELETE FROM sys_data_scope WHERE self_user_id = #{userId}
|
||||||
|
</delete>
|
||||||
|
|
||||||
|
<select id="findDataScopeUserIdBySelfUserIdAndScopeType" resultType="java.lang.String">
|
||||||
|
SELECT user_id FROM sys_data_scope
|
||||||
|
<where>
|
||||||
|
<if test="userId != null and userId != ''">
|
||||||
|
self_user_id = #{userId}
|
||||||
|
</if>
|
||||||
|
<if test="permissionScopeType != null and permissionScopeType != ''">
|
||||||
|
AND permission_scope_type = #{permissionScopeType}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
<select id="findDataScopeDeptIdBySelfUserIdAndScopeType" resultType="java.lang.String">
|
||||||
|
SELECT DISTINCT dept_id FROM sys_data_scope
|
||||||
|
<where>
|
||||||
|
<if test="userId != null and userId != ''">
|
||||||
|
self_user_id = #{userId}
|
||||||
|
</if>
|
||||||
|
<if test="permissionScopeType != null and permissionScopeType != ''">
|
||||||
|
AND permission_scope_type = #{permissionScopeType}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
|
<select id="getDataDetail" resultType="org.nl.system.service.permission.dao.SysDataScope">
|
||||||
|
SELECT
|
||||||
|
scop.*,
|
||||||
|
dept.`name` as deptName,
|
||||||
|
user.person_name,
|
||||||
|
dp.`name` as permissionName,
|
||||||
|
permission.permission_id
|
||||||
|
FROM
|
||||||
|
`sys_data_scope` scop
|
||||||
|
LEFT JOIN sys_user_data_permission permission ON scop.permission_scope_type = permission.permission_scope_type AND permission.user_id = scop.self_user_id
|
||||||
|
LEFT JOIN sys_data_permission dp ON permission.permission_id = dp.permission_id
|
||||||
|
LEFT JOIN sys_dept dept ON scop.dept_id = dept.dept_id
|
||||||
|
LEFT JOIN sys_user user ON scop.user_id = user.user_id
|
||||||
|
<where>
|
||||||
|
<if test="selfUserId != null and selfUserId != ''">
|
||||||
|
scop.self_user_id = #{selfUserId}
|
||||||
|
</if>
|
||||||
|
<if test="permissionScopeType != null and permissionScopeType != ''">
|
||||||
|
AND scop.permission_scope_type = #{permissionScopeType}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
ORDER BY scop.permission_scope_type, scop.dept_id, scop.user_id
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
package org.nl.system.service.permission.dto;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author: lyd
|
||||||
|
* @Description:
|
||||||
|
* @Date: 2022/12/27
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum DataScopeEnum {
|
||||||
|
|
||||||
|
USER("user", "用户数据权限"),
|
||||||
|
DEPT("dept", "部门数据权限"),
|
||||||
|
SELF("self", "自身数据权限");
|
||||||
|
private final String code;
|
||||||
|
private final String name;
|
||||||
|
}
|
||||||
@@ -3,18 +3,23 @@ package org.nl.system.service.permission.impl;
|
|||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.alibaba.fastjson.JSONArray;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.nl.common.domain.query.PageQuery;
|
import org.nl.common.domain.query.PageQuery;
|
||||||
import org.nl.modules.common.exception.BadRequestException;
|
import org.nl.modules.common.exception.BadRequestException;
|
||||||
import org.nl.modules.common.utils.SecurityUtils;
|
import org.nl.modules.common.utils.SecurityUtils;
|
||||||
|
import org.nl.modules.wql.WQL;
|
||||||
import org.nl.system.service.dict.dao.Dict;
|
import org.nl.system.service.dict.dao.Dict;
|
||||||
import org.nl.system.service.dict.dao.mapper.SysDictMapper;
|
import org.nl.system.service.dict.dao.mapper.SysDictMapper;
|
||||||
import org.nl.system.service.permission.dao.SysDataPermission;
|
import org.nl.system.service.permission.dao.SysDataPermission;
|
||||||
|
import org.nl.system.service.permission.dao.SysDataScope;
|
||||||
import org.nl.system.service.permission.dao.mapper.SysDataPermissionMapper;
|
import org.nl.system.service.permission.dao.mapper.SysDataPermissionMapper;
|
||||||
import org.nl.system.service.permission.ISysDataPermissionService;
|
import org.nl.system.service.permission.ISysDataPermissionService;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import org.nl.system.service.permission.dto.DataScopeEnum;
|
||||||
import org.nl.system.service.permission.dto.SysDataPermissionQuery;
|
import org.nl.system.service.permission.dto.SysDataPermissionQuery;
|
||||||
import org.nl.system.service.user.ISysUserService;
|
import org.nl.system.service.user.ISysUserService;
|
||||||
import org.nl.system.service.user.dto.UserDataPermissionDto;
|
import org.nl.system.service.user.dto.UserDataPermissionDto;
|
||||||
@@ -92,7 +97,82 @@ public class SysDataPermissionServiceImpl extends ServiceImpl<SysDataPermissionM
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getDataPermissionOption() {
|
public List<SysDataPermission> getDataPermissionOption() {
|
||||||
return null;
|
return this.list();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UserDataPermissionDto> getDataShow(String userId) {
|
||||||
|
List<UserDataPermissionDto> userDataPermissionDtoList = userService.getUserDataPermissionByUserId(userId);
|
||||||
|
userDataPermissionDtoList.forEach(userDataPermissionDto -> {
|
||||||
|
SysDataPermission sysDataPermission = dataPermissionMapper.selectOne(new LambdaQueryWrapper<SysDataPermission>().eq(SysDataPermission::getPermissionId, userDataPermissionDto.getPermissionId()));
|
||||||
|
if (sysDataPermission.getCode().equals(DataScopeEnum.USER.getCode())) { // 用户权限
|
||||||
|
List<String> userIds = dataPermissionMapper.findDataScopeUserIdBySelfUserIdAndScopeType(userId, userDataPermissionDto.getPermissionScopeType());
|
||||||
|
if (ObjectUtil.isNotEmpty(userIds)) userDataPermissionDto.setUsers(userIds);
|
||||||
|
} else if (sysDataPermission.getCode().equals(DataScopeEnum.DEPT.getCode())) { // 部门权限
|
||||||
|
List<String> deptIds = dataPermissionMapper.findDataScopeDeptIdBySelfUserIdAndScopeType(userId, userDataPermissionDto.getPermissionScopeType());
|
||||||
|
if (ObjectUtil.isNotEmpty(deptIds)) userDataPermissionDto.setDepts(deptIds);
|
||||||
|
} else if (sysDataPermission.getCode().equals(DataScopeEnum.SELF.getCode())) { // 自身
|
||||||
|
List<String> userIds = dataPermissionMapper.findDataScopeUserIdBySelfUserIdAndScopeType(userId, userDataPermissionDto.getPermissionScopeType());
|
||||||
|
if (ObjectUtil.isNotEmpty(userIds)) userDataPermissionDto.setUsers(userIds);
|
||||||
|
}
|
||||||
|
// 其他不做处理
|
||||||
|
});
|
||||||
|
return userDataPermissionDtoList;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void savePermission(JSONObject datas) {
|
||||||
|
String user_id = datas.getString("userId");
|
||||||
|
JSONArray data = datas.getJSONArray("datas");
|
||||||
|
if (ObjectUtil.isEmpty(user_id)) throw new BadRequestException("用户不能为空");
|
||||||
|
// 删除用户绑定的数据
|
||||||
|
userService.deleteDataPermissionById(user_id);
|
||||||
|
dataPermissionMapper.deleteScopeBySelfUserId(user_id);
|
||||||
|
for (int i = 0; i < data.size(); i++) {
|
||||||
|
JSONObject scopeObj = data.getJSONObject(i);
|
||||||
|
String permission_scope_type = scopeObj.getString("value");
|
||||||
|
String permission_id = scopeObj.getString("permissionId");
|
||||||
|
UserDataPermissionDto userDataPermissionDto = new UserDataPermissionDto();
|
||||||
|
userDataPermissionDto.setUserId(user_id);
|
||||||
|
userDataPermissionDto.setPermissionId(permission_id);
|
||||||
|
userDataPermissionDto.setPermissionScopeType(permission_scope_type);
|
||||||
|
// 保存用户数据权限
|
||||||
|
userService.insertDataPermission(userDataPermissionDto);
|
||||||
|
JSONArray users = scopeObj.getJSONArray("users");
|
||||||
|
if (ObjectUtil.isNotEmpty(users)) { // 如果是用户直接将用户的id绑定进去
|
||||||
|
for (int j = 0; j < users.size(); j++) {
|
||||||
|
JSONObject user = users.getJSONObject(j);
|
||||||
|
String userId = user.getString("userId");
|
||||||
|
SysDataScope dataScope = new SysDataScope();
|
||||||
|
dataScope.setUserId(userId);
|
||||||
|
dataScope.setSelfUserId(user_id);
|
||||||
|
dataScope.setPermissionScopeType(permission_scope_type);
|
||||||
|
dataPermissionMapper.insertDataScope(dataScope);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONArray depts = scopeObj.getJSONArray("depts");
|
||||||
|
if (ObjectUtil.isNotEmpty(depts)) { // 如果是部门,先根据部门id求出所有的用户id
|
||||||
|
for (int j = 0; j < depts.size(); j++) {
|
||||||
|
JSONObject dept = depts.getJSONObject(j);
|
||||||
|
String deptId = dept.getString("deptId");
|
||||||
|
List<String> user_ids = userService.getUserIdByDeptId(deptId);
|
||||||
|
user_ids.forEach(id -> {
|
||||||
|
SysDataScope dataScope = new SysDataScope();
|
||||||
|
dataScope.setUserId(id);
|
||||||
|
dataScope.setDeptId(deptId);
|
||||||
|
dataScope.setSelfUserId(user_id);
|
||||||
|
dataScope.setPermissionScopeType(permission_scope_type);
|
||||||
|
dataPermissionMapper.insertDataScopes(dataScope);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<SysDataScope> getDataDetail(JSONObject data) {
|
||||||
|
return dataPermissionMapper.getDataDetail(data.getString("userId"), data.getString("permissionScopeType"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,4 +31,11 @@ public interface ISysUserService extends IService<SysUser> {
|
|||||||
void update(Map userDetail);
|
void update(Map userDetail);
|
||||||
|
|
||||||
List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId);
|
List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId);
|
||||||
|
List<UserDataPermissionDto> getUserDataPermissionByUserId(String userId);
|
||||||
|
|
||||||
|
void deleteDataPermissionById(String userId);
|
||||||
|
|
||||||
|
void insertDataPermission(UserDataPermissionDto userDataPermissionDto);
|
||||||
|
|
||||||
|
List<String> getUserIdByDeptId(String deptId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,4 +27,12 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
|
|||||||
List<Map<String,Object>> getDetailForMap(@Param("query") UserQuery query, @Param("page")PageQuery page);
|
List<Map<String,Object>> getDetailForMap(@Param("query") UserQuery query, @Param("page")PageQuery page);
|
||||||
|
|
||||||
List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId);
|
List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId);
|
||||||
|
|
||||||
|
List<UserDataPermissionDto> getUserDataPermissionByUserId(String userId);
|
||||||
|
|
||||||
|
void deleteDataPermissionById(String userId);
|
||||||
|
|
||||||
|
void insertDataPermission(@Param("dataPermission") UserDataPermissionDto dataPermission);
|
||||||
|
|
||||||
|
List<String> getUserIdByDeptId(String deptId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,12 @@
|
|||||||
sys_user.extperson_id as extpersonId,
|
sys_user.extperson_id as extpersonId,
|
||||||
sys_user.extuser_id as extuserId
|
sys_user.extuser_id as extuserId
|
||||||
</sql>
|
</sql>
|
||||||
|
<insert id="insertDataPermission">
|
||||||
|
INSERT INTO sys_user_data_permission(user_id, permission_scope_type, permission_id) VALUES (#{dataPermission.userId}, #{dataPermission.permissionScopeType}, #{dataPermission.permissionId})
|
||||||
|
</insert>
|
||||||
|
<delete id="deleteDataPermissionById">
|
||||||
|
DELETE FROM sys_user_data_permission WHERE user_id = #{userId}
|
||||||
|
</delete>
|
||||||
<resultMap id="UserDetail" type="org.nl.system.service.user.dto.SysUserDetail" >
|
<resultMap id="UserDetail" type="org.nl.system.service.user.dto.SysUserDetail" >
|
||||||
<id column="userId" property="userId" />
|
<id column="userId" property="userId" />
|
||||||
<result column="username" property="username" />
|
<result column="username" property="username" />
|
||||||
@@ -119,4 +125,19 @@
|
|||||||
resultType="org.nl.system.service.user.dto.UserDataPermissionDto">
|
resultType="org.nl.system.service.user.dto.UserDataPermissionDto">
|
||||||
SELECT * FROM sys_user_data_permission WHERE permission_id = #{permissionId}
|
SELECT * FROM sys_user_data_permission WHERE permission_id = #{permissionId}
|
||||||
</select>
|
</select>
|
||||||
|
<select id="getUserDataPermissionByUserId"
|
||||||
|
resultType="org.nl.system.service.user.dto.UserDataPermissionDto">
|
||||||
|
SELECT * FROM sys_user_data_permission WHERE user_id = #{userId}
|
||||||
|
</select>
|
||||||
|
<select id="getUserIdByDeptId" resultType="java.lang.String">
|
||||||
|
SELECT
|
||||||
|
DISTINCT user_id
|
||||||
|
FROM
|
||||||
|
sys_user_dept
|
||||||
|
<where>
|
||||||
|
<if test="deptId != null and deptId != ''">
|
||||||
|
dept_id = #{deptId}
|
||||||
|
</if>
|
||||||
|
</where>
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
package org.nl.system.service.user.dto;
|
package org.nl.system.service.user.dto;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author: lyd
|
* @Author: lyd
|
||||||
@@ -8,10 +14,18 @@ import lombok.Data;
|
|||||||
* @Date: 2022/12/20
|
* @Date: 2022/12/20
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class UserDataPermissionDto {
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@TableName("sys_user_data_permission")
|
||||||
|
public class UserDataPermissionDto implements Serializable {
|
||||||
private String userId;
|
private String userId;
|
||||||
|
|
||||||
private String permissionScopeType;
|
private String permissionScopeType;
|
||||||
|
|
||||||
private String permissionId;
|
private String permissionId;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private List<String> users;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
private List<String> depts;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -150,4 +150,24 @@ public class ISysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> imp
|
|||||||
public List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId) {
|
public List<UserDataPermissionDto> getUserDataPermissionByPermissionId(String permissionId) {
|
||||||
return sysUserMapper.getUserDataPermissionByPermissionId(permissionId);
|
return sysUserMapper.getUserDataPermissionByPermissionId(permissionId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UserDataPermissionDto> getUserDataPermissionByUserId(String userId) {
|
||||||
|
return sysUserMapper.getUserDataPermissionByUserId(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deleteDataPermissionById(String userId) {
|
||||||
|
sysUserMapper.deleteDataPermissionById(userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void insertDataPermission(UserDataPermissionDto userDataPermissionDto) {
|
||||||
|
sysUserMapper.insertDataPermission(userDataPermissionDto);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getUserIdByDeptId(String deptId) {
|
||||||
|
return sysUserMapper.getUserIdByDeptId(deptId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,6 @@
|
|||||||
end-placeholder="结束日期"
|
end-placeholder="结束日期"
|
||||||
align="right"
|
align="right"
|
||||||
@change="queryData"
|
@change="queryData"
|
||||||
@blur="queryData"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item v-show="showOptions" label="时间段">
|
<el-form-item v-show="showOptions" label="时间段">
|
||||||
|
|||||||
@@ -53,8 +53,8 @@
|
|||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="名称" prop="name" />
|
<el-table-column label="名称" prop="name" />
|
||||||
<el-table-column label="排序" prop="dept_sort" />
|
<el-table-column label="排序" prop="deptSort" />
|
||||||
<el-table-column prop="create_time" label="创建日期" />
|
<el-table-column prop="createTime" label="创建日期" />
|
||||||
</el-table>
|
</el-table>
|
||||||
<!--分页组件-->
|
<!--分页组件-->
|
||||||
<pagination />
|
<pagination />
|
||||||
@@ -76,7 +76,7 @@ export default {
|
|||||||
name: 'RelevanceDeptDialog',
|
name: 'RelevanceDeptDialog',
|
||||||
components: { rrOperation, pagination },
|
components: { rrOperation, pagination },
|
||||||
cruds() {
|
cruds() {
|
||||||
return CRUD({ title: '部门', idField: 'dept_id', url: 'api/dept/vo', crudMethod: { ...crudDept }, query: { is_used: '1' }})
|
return CRUD({ title: '部门', idField: 'deptId', url: 'api/dept/vo', crudMethod: { ...crudDept }, query: { isUsed: '1' }})
|
||||||
},
|
},
|
||||||
mixins: [presenter(), header()],
|
mixins: [presenter(), header()],
|
||||||
dicts: ['product_series'],
|
dicts: ['product_series'],
|
||||||
@@ -119,7 +119,7 @@ export default {
|
|||||||
this.$nextTick(function() {
|
this.$nextTick(function() {
|
||||||
for (var k = 0; k < this.depts.length; k++) {
|
for (var k = 0; k < this.depts.length; k++) {
|
||||||
for (var i = 0; i < this.crud.data.length; i++) {
|
for (var i = 0; i < this.crud.data.length; i++) {
|
||||||
if (this.crud.data[i].dept_id == this.depts[k].dept_id) {
|
if (this.crud.data[i].deptId == this.depts[k].deptId) {
|
||||||
this.$refs.table.toggleRowSelection(this.crud.data[i], true)
|
this.$refs.table.toggleRowSelection(this.crud.data[i], true)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -160,7 +160,7 @@ export default {
|
|||||||
// console.log(this.rows)
|
// console.log(this.rows)
|
||||||
},
|
},
|
||||||
getDeptDatas(tree, treeNode, resolve) {
|
getDeptDatas(tree, treeNode, resolve) {
|
||||||
const params = { pid: tree.dept_id }
|
const params = { pid: tree.deptId }
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
crudDept.getDeptvo(params).then(res => {
|
crudDept.getDeptvo(params).then(res => {
|
||||||
resolve(res.content)
|
resolve(res.content)
|
||||||
|
|||||||
@@ -47,14 +47,14 @@
|
|||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="username" label="用户名" :min-width="flexWidth('username',crud.data,'用户名')" />
|
<el-table-column prop="username" label="用户名" :min-width="flexWidth('username',crud.data,'用户名')" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
prop="person_name"
|
prop="personName"
|
||||||
label="姓名"
|
label="姓名"
|
||||||
:min-width="flexWidth('person_name',crud.data,'姓名')"
|
:min-width="flexWidth('personName',crud.data,'姓名')"
|
||||||
/>
|
/>
|
||||||
<el-table-column show-overflow-tooltip prop="deptnames" label="部门" />
|
<el-table-column show-overflow-tooltip prop="deptnames" label="部门" />
|
||||||
<el-table-column label="状态" align="center" prop="enabled">
|
<el-table-column label="状态" align="center" prop="enabled">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{scope.row.is_used==1?'启用':'禁用'}}
|
{{scope.row.isUsed==1?'启用':'禁用'}}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -78,7 +78,7 @@ export default {
|
|||||||
name: 'RelevanceUserDialog',
|
name: 'RelevanceUserDialog',
|
||||||
components: { rrOperation, pagination },
|
components: { rrOperation, pagination },
|
||||||
cruds() {
|
cruds() {
|
||||||
return CRUD({ title: '用户', idField: 'user_id', url: 'api/users', crudMethod: { ...crudUser }, query: {is_used: '1'}})
|
return CRUD({ title: '用户', idField: 'userId', url: 'api/users', crudMethod: { ...crudUser }, query: {isUsed: '1'}})
|
||||||
},
|
},
|
||||||
mixins: [presenter(), header()],
|
mixins: [presenter(), header()],
|
||||||
dicts: ['product_series'],
|
dicts: ['product_series'],
|
||||||
@@ -118,9 +118,10 @@ export default {
|
|||||||
},
|
},
|
||||||
open() {
|
open() {
|
||||||
this.$nextTick(function() {
|
this.$nextTick(function() {
|
||||||
|
console.log(this.crud.data)
|
||||||
for (var k = 0; k < this.users.length; k++) {
|
for (var k = 0; k < this.users.length; k++) {
|
||||||
for (var i = 0; i < this.crud.data.length; i++) {
|
for (var i = 0; i < this.crud.data.length; i++) {
|
||||||
if (this.crud.data[i].user_id == this.users[k].user_id) {
|
if (this.crud.data[i].userId == this.users[k].userId) {
|
||||||
this.$refs.table.toggleRowSelection(this.crud.data[i], true)
|
this.$refs.table.toggleRowSelection(this.crud.data[i], true)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export default {
|
|||||||
name: 'ShowDataPermissionDialog',
|
name: 'ShowDataPermissionDialog',
|
||||||
components: { rrOperation, pagination },
|
components: { rrOperation, pagination },
|
||||||
cruds() {
|
cruds() {
|
||||||
return CRUD({ title: '权限明细', idField: 'user_id', url: 'api/dataPermission/dataDetail'})
|
return CRUD({ title: '权限明细', idField: 'userId', url: 'api/dataPermission/dataDetail'})
|
||||||
},
|
},
|
||||||
mixins: [presenter(), header()],
|
mixins: [presenter(), header()],
|
||||||
dicts: ['product_series'],
|
dicts: ['product_series'],
|
||||||
|
|||||||
@@ -249,7 +249,7 @@
|
|||||||
<el-form-item label="用户名" prop="username">
|
<el-form-item label="用户名" prop="username">
|
||||||
<el-input v-model="dataDialog.username" disabled style="width: 200px;" />
|
<el-input v-model="dataDialog.username" disabled style="width: 200px;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="姓名" prop="preson_name">
|
<el-form-item label="姓名" prop="presonName">
|
||||||
<el-input v-model="dataDialog.personName" disabled style="width: 200px;" />
|
<el-input v-model="dataDialog.personName" disabled style="width: 200px;" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-table
|
<el-table
|
||||||
@@ -263,15 +263,15 @@
|
|||||||
<el-table-column label="数据权限">
|
<el-table-column label="数据权限">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="scope.row.permission_id"
|
v-model="scope.row.permissionId"
|
||||||
placeholder="请选择"
|
placeholder="请选择"
|
||||||
@change="openRelevance(scope.row, scope.$index)"
|
@change="openRelevance(scope.row, scope.$index)"
|
||||||
>
|
>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in permissions"
|
v-for="item in permissions"
|
||||||
:key="item.permission_id"
|
:key="item.permissionId"
|
||||||
:label="item.name"
|
:label="item.name"
|
||||||
:value="item.permission_id"
|
:value="item.permissionId"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</template>
|
</template>
|
||||||
@@ -306,11 +306,11 @@
|
|||||||
>
|
>
|
||||||
<el-table-column prop="permission_scope_type" label="权限类型" min-width="100" show-overflow-tooltip>
|
<el-table-column prop="permission_scope_type" label="权限类型" min-width="100" show-overflow-tooltip>
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
{{ dict.label.permission_scope_type[scope.row.permission_scope_type] }}
|
{{ dict.label.permissionScopeType[scope.row.permissionScopeType] }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="permission_name" label="权限范围" min-width="100" show-overflow-tooltip />
|
<el-table-column prop="permissionName" label="权限范围" min-width="100" show-overflow-tooltip />
|
||||||
<el-table-column prop="dept_name" label="部门名称" min-width="100" show-overflow-tooltip />
|
<el-table-column prop="deptName" label="部门名称" min-width="100" show-overflow-tooltip />
|
||||||
<el-table-column prop="personName" label="用户名称" min-width="100" show-overflow-tooltip />
|
<el-table-column prop="personName" label="用户名称" min-width="100" show-overflow-tooltip />
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
@@ -393,7 +393,7 @@ export default {
|
|||||||
dataPerm: false,
|
dataPerm: false,
|
||||||
dataDialog: {},
|
dataDialog: {},
|
||||||
permissions: [],
|
permissions: [],
|
||||||
permission_id: '',
|
permissionId: '',
|
||||||
multipleSelection: [], // 选中
|
multipleSelection: [], // 选中
|
||||||
relevanceUser: false, // 关联用户
|
relevanceUser: false, // 关联用户
|
||||||
rowData: {}, // 当行数据
|
rowData: {}, // 当行数据
|
||||||
@@ -686,19 +686,20 @@ export default {
|
|||||||
this.dataDialog.dataScopeType = res
|
this.dataDialog.dataScopeType = res
|
||||||
// permissions
|
// permissions
|
||||||
crudDataPermission.getDataPermissionOption().then(res => {
|
crudDataPermission.getDataPermissionOption().then(res => {
|
||||||
|
// console.log(res)
|
||||||
this.permissions = res
|
this.permissions = res
|
||||||
this.dataDialog.personName = row.personName
|
this.dataDialog.personName = row.personName
|
||||||
this.dataDialog.username = row.username
|
this.dataDialog.username = row.username
|
||||||
this.dataDialog.user_id = row.user_id
|
this.dataDialog.userId = row.userId
|
||||||
this.dataPermissionTitle = '[' + row.personName + '] 数据权限'
|
this.dataPermissionTitle = '[' + row.personName + '] 数据权限'
|
||||||
this.dataPerm = true
|
this.dataPerm = true
|
||||||
// 回显数据
|
// 回显数据
|
||||||
crudDataPermission.getDataShow(row.user_id).then(res => {
|
crudDataPermission.getDataShow(row.userId).then(res => {
|
||||||
this.$nextTick(function() {
|
this.$nextTick(function() {
|
||||||
for (var index = 0; index < res.length; index++) {
|
for (var index = 0; index < res.length; index++) {
|
||||||
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
||||||
if (this.dataDialog.dataScopeType[i].value == res[index].permission_scope_type) {
|
if (this.dataDialog.dataScopeType[i].value == res[index].permissionScopeType) {
|
||||||
this.dataDialog.dataScopeType[i].permission_id = res[index].permission_id
|
this.dataDialog.dataScopeType[i].permissionId = res[index].permissionId
|
||||||
if (res[index].users) this.dataDialog.dataScopeType[i].users = res[index].users
|
if (res[index].users) this.dataDialog.dataScopeType[i].users = res[index].users
|
||||||
if (res[index].depts) this.dataDialog.dataScopeType[i].depts = res[index].depts
|
if (res[index].depts) this.dataDialog.dataScopeType[i].depts = res[index].depts
|
||||||
// 选中
|
// 选中
|
||||||
@@ -717,25 +718,26 @@ export default {
|
|||||||
},
|
},
|
||||||
openRelevance(row, index) {
|
openRelevance(row, index) {
|
||||||
for (var i = 0; i < this.permissions.length; i++) {
|
for (var i = 0; i < this.permissions.length; i++) {
|
||||||
if (this.permissions[i].permission_id != undefined && this.permissions[i].permission_id && this.permissions[i].permission_id != row.permission_id) {
|
if (this.permissions[i].permissionId != undefined && this.permissions[i].permissionId && this.permissions[i].permissionId != row.permissionId) {
|
||||||
this.$delete(this.dataDialog.dataScopeType[index], this.permissions[i].permission_id.toString())
|
this.$delete(this.dataDialog.dataScopeType[index], this.permissions[i].permissionId.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.$set(this.dataDialog.dataScopeType[index], this.dataDialog.dataScopeType[index].permission_id, row.permission_id)
|
this.$set(this.dataDialog.dataScopeType[index], this.dataDialog.dataScopeType[index].permissionId, row.permissionId)
|
||||||
this.rowData = {}
|
this.rowData = {}
|
||||||
this.deptIds = []
|
this.deptIds = []
|
||||||
this.userIds = []
|
this.userIds = []
|
||||||
if (row.permission_id == '1601040560293023744') { // 选择用户
|
console.log(row)
|
||||||
|
if (row.permissionId == '1605129738328870912') { // 选择用户
|
||||||
this.userIds = this.dataDialog.dataScopeType[index].users
|
this.userIds = this.dataDialog.dataScopeType[index].users
|
||||||
this.rowData = row
|
this.rowData = row
|
||||||
this.relevanceUser = true
|
this.relevanceUser = true
|
||||||
} else if (row.permission_id == '1601040621190123520') { // 选择部门
|
} else if (row.permissionId == '1605129882164137984') { // 选择部门
|
||||||
this.deptIds = this.dataDialog.dataScopeType[index].depts
|
this.deptIds = this.dataDialog.dataScopeType[index].depts
|
||||||
this.rowData = row
|
this.rowData = row
|
||||||
this.relevanceDept = true
|
this.relevanceDept = true
|
||||||
} else if (row.permission_id == '1601038030326599680') { // 自身
|
} else if (row.permissionId == '1605128919449735168') { // 自身
|
||||||
const param = {
|
const param = {
|
||||||
user_id: this.dataDialog.user_id
|
userId: this.dataDialog.userId
|
||||||
}
|
}
|
||||||
this.dataDialog.dataScopeType[index].users = []
|
this.dataDialog.dataScopeType[index].users = []
|
||||||
this.dataDialog.dataScopeType[index].users.push(param)
|
this.dataDialog.dataScopeType[index].users.push(param)
|
||||||
@@ -746,7 +748,7 @@ export default {
|
|||||||
},
|
},
|
||||||
selectUsers(row) { // row对话框传来的数据
|
selectUsers(row) { // row对话框传来的数据
|
||||||
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
||||||
if (this.dataDialog.dataScopeType[i].dict_id == this.rowData.dict_id) {
|
if (this.dataDialog.dataScopeType[i].dictId == this.rowData.dictId) {
|
||||||
if (this.dataDialog.dataScopeType[i].depts != undefined && this.dataDialog.dataScopeType[i].depts.length > 0) this.dataDialog.dataScopeType[i].depts = []
|
if (this.dataDialog.dataScopeType[i].depts != undefined && this.dataDialog.dataScopeType[i].depts.length > 0) this.dataDialog.dataScopeType[i].depts = []
|
||||||
this.dataDialog.dataScopeType[i].users = row
|
this.dataDialog.dataScopeType[i].users = row
|
||||||
break
|
break
|
||||||
@@ -756,7 +758,7 @@ export default {
|
|||||||
},
|
},
|
||||||
selectDepts(row) {
|
selectDepts(row) {
|
||||||
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
for (var i = 0; i < this.dataDialog.dataScopeType.length; i++) {
|
||||||
if (this.dataDialog.dataScopeType[i].dict_id == this.rowData.dict_id) {
|
if (this.dataDialog.dataScopeType[i].dictId == this.rowData.dictId) {
|
||||||
if (this.dataDialog.dataScopeType[i].users != undefined && this.dataDialog.dataScopeType[i].users.length > 0) this.dataDialog.dataScopeType[i].users = []
|
if (this.dataDialog.dataScopeType[i].users != undefined && this.dataDialog.dataScopeType[i].users.length > 0) this.dataDialog.dataScopeType[i].users = []
|
||||||
this.dataDialog.dataScopeType[i].depts = row
|
this.dataDialog.dataScopeType[i].depts = row
|
||||||
break
|
break
|
||||||
@@ -769,9 +771,10 @@ export default {
|
|||||||
},
|
},
|
||||||
savePermise() {
|
savePermise() {
|
||||||
const param = {
|
const param = {
|
||||||
user_id: this.dataDialog.user_id,
|
userId: this.dataDialog.userId,
|
||||||
datas: this.multipleSelection
|
datas: this.multipleSelection
|
||||||
}
|
}
|
||||||
|
console.log('param', param)
|
||||||
crudDataPermission.saveDataPermission(param).then(res => {
|
crudDataPermission.saveDataPermission(param).then(res => {
|
||||||
this.dataPerm = false
|
this.dataPerm = false
|
||||||
this.crud.notify('添加数据权限成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
|
this.crud.notify('添加数据权限成功', CRUD.NOTIFICATION_TYPE.SUCCESS)
|
||||||
@@ -861,12 +864,12 @@ export default {
|
|||||||
},
|
},
|
||||||
showDatas(row) {
|
showDatas(row) {
|
||||||
const param = {
|
const param = {
|
||||||
user_id: this.dataDialog.user_id,
|
userId: this.dataDialog.userId,
|
||||||
permission_scope_type: row.value
|
permissionScopeType: row.value
|
||||||
}
|
}
|
||||||
// crudDataPermission.getDataDetail(param).then(res => {
|
crudDataPermission.getDataDetail(param).then(res => {
|
||||||
// this.dataPermissions = res
|
this.dataPermissions = res
|
||||||
// })
|
})
|
||||||
this.showData = true
|
this.showData = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user