fix(系统设置): 修复用户管理页面所属项目的展示问题

This commit is contained in:
song-tianyang 2023-08-23 17:53:47 +08:00 committed by 刘瑞斌
parent be995c15c6
commit 7cb734b733
13 changed files with 350 additions and 163 deletions

View File

@ -0,0 +1,28 @@
package io.metersphere.sdk.dto.builder;
import io.metersphere.sdk.dto.LogDTO;
import lombok.Builder;
@Builder
public class LogDTOBuilder {
private String projectId;
private String organizationId;
private String sourceId;
private String createUser;
private String type;
private String method;
private String module;
private String content;
private String path;
private byte[] originalValue;
private byte[] modifiedValue;
public LogDTO getLogDTO() {
LogDTO logDTO = new LogDTO(projectId, organizationId, sourceId, createUser, type, module, content);
logDTO.setPath(path);
logDTO.setMethod(method);
logDTO.setOriginalValue(originalValue);
logDTO.setModifiedValue(modifiedValue);
return logDTO;
}
}

View File

@ -9,7 +9,7 @@ import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
public interface BaseUserMapper { public interface BaseUserMapper {
UserDTO selectByEmail(String email); UserDTO selectDTOByKeyword(String keyword);
UserDTO selectById(String id); UserDTO selectById(String id);

View File

@ -16,11 +16,12 @@
WHERE user.id = #{id} WHERE user.id = #{id}
</select> </select>
<select id="selectByEmail" resultType="io.metersphere.sdk.dto.UserDTO"> <select id="selectDTOByKeyword" resultType="io.metersphere.sdk.dto.UserDTO">
SELECT * SELECT *
FROM user FROM user
LEFT JOIN user_extend ON user.id = user_extend.id LEFT JOIN user_extend ON user.id = user_extend.id
WHERE user.email = #{email} AND deleted IS FALSE WHERE (user.email = #{keyword} OR user.id = #{keyword})
AND deleted IS FALSE
</select> </select>
<select id="findAll" resultType="io.metersphere.system.domain.User"> <select id="findAll" resultType="io.metersphere.system.domain.User">

View File

@ -52,12 +52,14 @@ public class UserController {
private OrganizationService organizationService; private OrganizationService organizationService;
@Resource @Resource
private SystemProjectService systemProjectService; private SystemProjectService systemProjectService;
@Resource
private UserLogService userLogService;
@GetMapping("/get/{email}") @GetMapping("/get/{keyword}")
@Operation(summary = "通过email查找用户") @Operation(summary = "通过email或id查找用户")
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ)
public UserDTO getUser(@PathVariable String email) { public UserDTO getUser(@PathVariable String keyword) {
return userService.getUserDTOByEmail(email); return userService.getUserDTOByKeyword(keyword);
} }
@PostMapping("/add") @PostMapping("/add")
@ -70,7 +72,7 @@ public class UserController {
@PostMapping("/update") @PostMapping("/update")
@Operation(summary = "修改用户") @Operation(summary = "修改用户")
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#request)", msClass = UserService.class) @Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#request)", msClass = UserLogService.class)
public UserEditRequest updateUser(@Validated({Updated.class}) @RequestBody UserEditRequest request) { public UserEditRequest updateUser(@Validated({Updated.class}) @RequestBody UserEditRequest request) {
return userService.updateUser(request, SessionUtils.getUserId()); return userService.updateUser(request, SessionUtils.getUserId());
} }
@ -87,7 +89,7 @@ public class UserController {
@PostMapping("/update/enable") @PostMapping("/update/enable")
@Operation(summary = "启用/禁用用户") @Operation(summary = "启用/禁用用户")
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.batchUpdateLog(#request)", msClass = UserService.class) @Log(type = OperationLogType.UPDATE, expression = "#msClass.batchUpdateLog(#request)", msClass = UserLogService.class)
public TableBatchProcessResponse updateUserEnable(@Validated @RequestBody UserChangeEnableRequest request) { public TableBatchProcessResponse updateUserEnable(@Validated @RequestBody UserChangeEnableRequest request) {
return userService.updateUserEnable(request, SessionUtils.getSessionId()); return userService.updateUserEnable(request, SessionUtils.getSessionId());
} }
@ -101,7 +103,7 @@ public class UserController {
@PostMapping("/delete") @PostMapping("/delete")
@Operation(summary = "删除用户") @Operation(summary = "删除用户")
@Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#request)", msClass = UserService.class) @Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#request)", msClass = UserLogService.class)
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_DELETE) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_DELETE)
public TableBatchProcessResponse deleteUser(@Validated @RequestBody TableBatchProcessDTO request) { public TableBatchProcessResponse deleteUser(@Validated @RequestBody TableBatchProcessDTO request) {
return userService.deleteUser(request, SessionUtils.getUserId()); return userService.deleteUser(request, SessionUtils.getUserId());
@ -110,7 +112,7 @@ public class UserController {
@PostMapping("/reset/password") @PostMapping("/reset/password")
@Operation(summary = "重置用户密码") @Operation(summary = "重置用户密码")
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.resetPasswordLog(#request)", msClass = UserService.class) @Log(type = OperationLogType.UPDATE, expression = "#msClass.resetPasswordLog(#request)", msClass = UserLogService.class)
public TableBatchProcessResponse resetPassword(@Validated @RequestBody TableBatchProcessDTO request) { public TableBatchProcessResponse resetPassword(@Validated @RequestBody TableBatchProcessDTO request) {
return userService.resetPassword(request, SessionUtils.getUserId()); return userService.resetPassword(request, SessionUtils.getUserId());
} }
@ -141,7 +143,7 @@ public class UserController {
@Operation(summary = "批量添加用户到多个用户组中") @Operation(summary = "批量添加用户到多个用户组中")
@RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE) @RequiresPermissions(PermissionConstants.SYSTEM_USER_READ_UPDATE)
@Log(type = OperationLogType.ADD, expression = "#msClass.batchAddLog(#request)", msClass = GlobalUserRoleRelationLogService.class) @Log(type = OperationLogType.ADD, expression = "#msClass.batchAddLog(#request)", msClass = GlobalUserRoleRelationLogService.class)
public TableBatchProcessResponse batchAdd(@Validated({Created.class}) @RequestBody UserRoleBatchRelationRequest request) { public TableBatchProcessResponse batchAddUserGroupRole(@Validated({Created.class}) @RequestBody UserRoleBatchRelationRequest request) {
return globalUserRoleRelationService.batchAdd(request, SessionUtils.getUserId()); return globalUserRoleRelationService.batchAdd(request, SessionUtils.getUserId());
} }
@ -153,6 +155,7 @@ public class UserController {
request.setProjectIds(userRoleBatchRelationRequest.getRoleIds()); request.setProjectIds(userRoleBatchRelationRequest.getRoleIds());
request.setUserIds(userRoleBatchRelationRequest.getSelectIds()); request.setUserIds(userRoleBatchRelationRequest.getSelectIds());
systemProjectService.addProjectMember(request, SessionUtils.getUserId()); systemProjectService.addProjectMember(request, SessionUtils.getUserId());
userLogService.batchAddProjectLog(userRoleBatchRelationRequest, SessionUtils.getUserId());
return new TableBatchProcessResponse(userRoleBatchRelationRequest.getSelectIds().size(), userRoleBatchRelationRequest.getSelectIds().size()); return new TableBatchProcessResponse(userRoleBatchRelationRequest.getSelectIds().size(), userRoleBatchRelationRequest.getSelectIds().size());
} }
@ -166,6 +169,7 @@ public class UserController {
request.setOrganizationIds(userRoleBatchRelationRequest.getRoleIds()); request.setOrganizationIds(userRoleBatchRelationRequest.getRoleIds());
request.setUserIds(userRoleBatchRelationRequest.getSelectIds()); request.setUserIds(userRoleBatchRelationRequest.getSelectIds());
organizationService.addMemberBySystem(request, SessionUtils.getUserId()); organizationService.addMemberBySystem(request, SessionUtils.getUserId());
userLogService.batchAddOrgLog(userRoleBatchRelationRequest, SessionUtils.getUserId());
return new TableBatchProcessResponse(userRoleBatchRelationRequest.getSelectIds().size(), userRoleBatchRelationRequest.getSelectIds().size()); return new TableBatchProcessResponse(userRoleBatchRelationRequest.getSelectIds().size(), userRoleBatchRelationRequest.getSelectIds().size());
} }
} }

View File

@ -8,7 +8,7 @@ import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
public interface ExtUserRoleRelationMapper { public interface ExtUserRoleRelationMapper {
List<UserRoleRelation> listByUserIdAndScope(@Param("userIds") List<String> userIdList); List<UserRoleRelation> selectGlobalRoleByUserIdList(@Param("userIds") List<String> userIdList);
List<UserRoleRelation> selectGlobalRoleByUserId(String userId); List<UserRoleRelation> selectGlobalRoleByUserId(String userId);

View File

@ -2,13 +2,16 @@
<!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="io.metersphere.system.mapper.ExtUserRoleRelationMapper"> <mapper namespace="io.metersphere.system.mapper.ExtUserRoleRelationMapper">
<select id="listByUserIdAndScope" resultType="io.metersphere.system.domain.UserRoleRelation"> <select id="selectGlobalRoleByUserIdList" resultType="io.metersphere.system.domain.UserRoleRelation">
SELECT * FROM SELECT * FROM
user_role_relation user_role_relation
WHERE WHERE
<foreach collection="userIds" item="userId" open="(" close=")" separator="OR"> <foreach collection="userIds" item="userId" open="(" close=")" separator="OR">
user_id = #{userId} user_id = #{userId}
</foreach> </foreach>
AND role_id IN (
SELECT id FROM user_role WHERE scope_id = 'global'
)
</select> </select>
<select id="selectGlobalRoleByUserId" resultType="io.metersphere.system.domain.UserRoleRelation"> <select id="selectGlobalRoleByUserId" resultType="io.metersphere.system.domain.UserRoleRelation">
SELECT * FROM SELECT * FROM

View File

@ -34,6 +34,8 @@ public class GlobalUserRoleRelationLogService {
private BaseUserMapper baseUserMapper; private BaseUserMapper baseUserMapper;
@Resource @Resource
private UserRoleMapper userRoleMapper; private UserRoleMapper userRoleMapper;
@Resource
private UserService userService;
/** /**
* 添加接口日志 * 添加接口日志
@ -62,7 +64,7 @@ public class GlobalUserRoleRelationLogService {
UserRoleExample example = new UserRoleExample(); UserRoleExample example = new UserRoleExample();
example.createCriteria().andIdIn(request.getRoleIds()); example.createCriteria().andIdIn(request.getRoleIds());
List<UserRole> userRoles = userRoleMapper.selectByExample(example); List<UserRole> userRoles = userRoleMapper.selectByExample(example);
List<String> userIds = request.getSelectIds(); List<String> userIds = userService.getBatchUserIds(request);
List<OptionDTO> users = baseUserMapper.selectUserOptionByIds(userIds); List<OptionDTO> users = baseUserMapper.selectUserOptionByIds(userIds);
List<LogDTO> returnList = new ArrayList<>(); List<LogDTO> returnList = new ArrayList<>();

View File

@ -191,7 +191,6 @@ public class OrganizationService {
userRoleRelationMapper.batchInsert(userRoleRelations); userRoleRelationMapper.batchInsert(userRoleRelations);
} }
} }
/** /**
* 删除组织成员 * 删除组织成员
* *

View File

@ -0,0 +1,191 @@
package io.metersphere.system.service;
import io.metersphere.sdk.constants.HttpMethodConstants;
import io.metersphere.sdk.constants.OperationLogConstants;
import io.metersphere.sdk.dto.LogDTO;
import io.metersphere.sdk.dto.TableBatchProcessDTO;
import io.metersphere.sdk.dto.builder.LogDTOBuilder;
import io.metersphere.sdk.log.constants.OperationLogModule;
import io.metersphere.sdk.log.constants.OperationLogType;
import io.metersphere.sdk.log.service.OperationLogService;
import io.metersphere.sdk.util.JSON;
import io.metersphere.system.domain.User;
import io.metersphere.system.domain.UserExample;
import io.metersphere.system.mapper.UserMapper;
import io.metersphere.system.request.user.UserEditRequest;
import io.metersphere.system.request.user.UserRoleBatchRelationRequest;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@Service
@Transactional(rollbackFor = Exception.class)
public class UserLogService {
@Resource
private UserMapper userMapper;
@Resource
private UserService userService;
@Resource
private OperationLogService operationLogService;
//批量添加用户记录日志
public List<LogDTO> getBatchAddLogs(@Valid List<User> userList) {
List<LogDTO> logs = new ArrayList<>();
userList.forEach(user -> {
LogDTO log = new LogDTO();
log.setId(UUID.randomUUID().toString());
log.setCreateUser(user.getCreateUser());
log.setProjectId(OperationLogConstants.SYSTEM);
log.setOrganizationId(OperationLogConstants.SYSTEM);
log.setType(OperationLogType.ADD.name());
log.setModule(OperationLogModule.SYSTEM_USER);
log.setMethod("addUser");
log.setCreateTime(user.getCreateTime());
log.setSourceId(user.getId());
log.setContent(user.getName() + "(" + user.getEmail() + ")");
log.setOriginalValue(JSON.toJSONBytes(user));
logs.add(log);
});
return logs;
}
public LogDTO updateLog(UserEditRequest request) {
User user = userMapper.selectByPrimaryKey(request.getId());
if (user != null) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
request.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
JSON.toJSONString(user));
dto.setPath("/update");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
return dto;
}
return null;
}
public List<LogDTO> batchUpdateLog(TableBatchProcessDTO request) {
List<LogDTO> logDTOList = new ArrayList<>();
request.setSelectIds(userService.getBatchUserIds(request));
List<User> userList = userService.selectByIdList(request.getSelectIds());
for (User user : userList) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
JSON.toJSONString(user));
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
logDTOList.add(dto);
}
return logDTOList;
}
/**
* @param request 批量重置密码 用于记录Log使用
*/
public List<LogDTO> resetPasswordLog(TableBatchProcessDTO request) {
request.setSelectIds(userService.getBatchUserIds(request));
List<LogDTO> returnList = new ArrayList<>();
UserExample example = new UserExample();
example.createCriteria().andIdIn(request.getSelectIds());
List<User> userList = userMapper.selectByExample(example);
for (User user : userList) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
user.getName());
dto.setPath("/reset/password");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
returnList.add(dto);
}
return returnList;
}
public List<LogDTO> deleteLog(TableBatchProcessDTO request) {
List<LogDTO> logDTOList = new ArrayList<>();
request.getSelectIds().forEach(item -> {
User user = userMapper.selectByPrimaryKey(item);
if (user != null) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
user.getCreateUser(),
OperationLogType.DELETE.name(),
OperationLogModule.SYSTEM_PROJECT,
user.getName());
dto.setPath("/delete");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
logDTOList.add(dto);
}
});
return logDTOList;
}
public void batchAddProjectLog(UserRoleBatchRelationRequest request, String operator) {
List<LogDTO> logs = new ArrayList<>();
List<String> userIds = userService.getBatchUserIds(request);
List<User> userList = userService.selectByIdList(userIds);
for (User user : userList) {
//用户管理处修改了用户的组织
LogDTO log = LogDTOBuilder.builder()
.projectId(OperationLogConstants.SYSTEM)
.createUser(operator)
.organizationId(OperationLogConstants.SYSTEM)
.sourceId(user.getId())
.type(OperationLogType.UPDATE.name())
.module(OperationLogModule.SYSTEM_USER)
.content(user.getName())
.path("/system/user/add-project-member")
.modifiedValue(JSON.toJSONBytes(request.getRoleIds()))
.build().getLogDTO();
logs.add(log);
}
operationLogService.batchAdd(logs);
}
public void batchAddOrgLog(UserRoleBatchRelationRequest request, String operator) {
List<LogDTO> logs = new ArrayList<>();
List<String> userIds = userService.getBatchUserIds(request);
List<User> userList = userService.selectByIdList(userIds);
for (User user : userList) {
//用户管理处修改了用户的组织
LogDTO log = LogDTOBuilder.builder()
.projectId(OperationLogConstants.SYSTEM)
.module(OperationLogModule.SYSTEM_USER)
.createUser(operator)
.organizationId(OperationLogConstants.SYSTEM)
.sourceId(user.getId())
.type(OperationLogType.UPDATE.name())
.content(user.getName())
.path("/system/user/add-org-member")
.method(HttpMethodConstants.POST.name())
.modifiedValue(JSON.toJSONBytes(request.getRoleIds()))
.build().getLogDTO();
logs.add(log);
}
operationLogService.batchAdd(logs);
}
}

View File

@ -2,6 +2,7 @@ package io.metersphere.system.service;
import io.metersphere.sdk.constants.OperationLogConstants; import io.metersphere.sdk.constants.OperationLogConstants;
import io.metersphere.sdk.constants.UserRoleEnum; import io.metersphere.sdk.constants.UserRoleEnum;
import io.metersphere.sdk.constants.UserRoleScope;
import io.metersphere.sdk.dto.LogDTO; import io.metersphere.sdk.dto.LogDTO;
import io.metersphere.sdk.log.constants.OperationLogModule; import io.metersphere.sdk.log.constants.OperationLogModule;
import io.metersphere.sdk.log.constants.OperationLogType; import io.metersphere.sdk.log.constants.OperationLogType;
@ -94,7 +95,7 @@ public class UserRoleRelationService {
userRoleRelation.setId(UUID.randomUUID().toString()); userRoleRelation.setId(UUID.randomUUID().toString());
userRoleRelation.setUserId(user.getId()); userRoleRelation.setUserId(user.getId());
userRoleRelation.setRoleId(userRoleId); userRoleRelation.setRoleId(userRoleId);
userRoleRelation.setSourceId("system"); userRoleRelation.setSourceId(UserRoleScope.SYSTEM);
userRoleRelation.setCreateTime(operationTime); userRoleRelation.setCreateTime(operationTime);
userRoleRelation.setCreateUser(user.getCreateUser()); userRoleRelation.setCreateUser(user.getCreateUser());
userRoleRelationSaveList.add(userRoleRelation); userRoleRelationSaveList.add(userRoleRelation);
@ -120,9 +121,9 @@ public class UserRoleRelationService {
} }
public Map<String, UserTableResponse> selectGlobalUserRoleAndOrganization(@Valid @NotEmpty List<String> userIdList) { public Map<String, UserTableResponse> selectGlobalUserRoleAndOrganization(@Valid @NotEmpty List<String> userIdList) {
List<UserRoleRelation> userRoleRelationList = extUserRoleRelationMapper.listByUserIdAndScope(userIdList); List<UserRoleRelation> userRoleRelationList = extUserRoleRelationMapper.selectGlobalRoleByUserIdList(userIdList);
List<String> userRoleIdList = userRoleRelationList.stream().map(UserRoleRelation::getRoleId).collect(Collectors.toList()); List<String> userRoleIdList = userRoleRelationList.stream().map(UserRoleRelation::getRoleId).distinct().collect(Collectors.toList());
List<String> sourceIdList = userRoleRelationList.stream().map(UserRoleRelation::getSourceId).collect(Collectors.toList()); List<String> sourceIdList = userRoleRelationList.stream().map(UserRoleRelation::getSourceId).distinct().collect(Collectors.toList());
Map<String, UserRole> userRoleMap = new HashMap<>(); Map<String, UserRole> userRoleMap = new HashMap<>();
Map<String, Organization> organizationMap = new HashMap<>(); Map<String, Organization> organizationMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(userRoleIdList)) { if (CollectionUtils.isNotEmpty(userRoleIdList)) {
@ -146,9 +147,13 @@ public class UserRoleRelationService {
returnMap.put(userRoleRelation.getUserId(), userInfo); returnMap.put(userRoleRelation.getUserId(), userInfo);
} }
UserRole userRole = userRoleMap.get(userRoleRelation.getRoleId()); UserRole userRole = userRoleMap.get(userRoleRelation.getRoleId());
if (userRole != null && StringUtils.equalsIgnoreCase(userRole.getType(), UserRoleScope.SYSTEM)) {
userInfo.getUserRoleList().add(userRole);
}
Organization organization = organizationMap.get(userRoleRelation.getSourceId()); Organization organization = organizationMap.get(userRoleRelation.getSourceId());
userInfo.getUserRoleList().add(userRole); if (organization != null) {
userInfo.getOrganizationList().add(organization); userInfo.getOrganizationList().add(organization);
}
} }
return returnMap; return returnMap;
} }
@ -176,7 +181,7 @@ public class UserRoleRelationService {
userRoleRelation.setId(UUID.randomUUID().toString()); userRoleRelation.setId(UUID.randomUUID().toString());
userRoleRelation.setUserId(user.getId()); userRoleRelation.setUserId(user.getId());
userRoleRelation.setRoleId(roleId); userRoleRelation.setRoleId(roleId);
userRoleRelation.setSourceId("system"); userRoleRelation.setSourceId(UserRoleScope.SYSTEM);
userRoleRelation.setCreateTime(System.currentTimeMillis()); userRoleRelation.setCreateTime(System.currentTimeMillis());
userRoleRelation.setCreateUser(operator); userRoleRelation.setCreateUser(operator);
saveList.add(userRoleRelation); saveList.add(userRoleRelation);

View File

@ -1,15 +1,14 @@
package io.metersphere.system.service; package io.metersphere.system.service;
import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.EasyExcelFactory;
import io.metersphere.sdk.constants.HttpMethodConstants;
import io.metersphere.sdk.constants.OperationLogConstants;
import io.metersphere.sdk.dto.*; import io.metersphere.sdk.dto.*;
import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.log.constants.OperationLogModule;
import io.metersphere.sdk.log.constants.OperationLogType;
import io.metersphere.sdk.log.service.OperationLogService; import io.metersphere.sdk.log.service.OperationLogService;
import io.metersphere.sdk.mapper.BaseUserMapper; import io.metersphere.sdk.mapper.BaseUserMapper;
import io.metersphere.sdk.util.*; import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.CodingUtil;
import io.metersphere.sdk.util.LogUtils;
import io.metersphere.sdk.util.Translator;
import io.metersphere.system.domain.User; import io.metersphere.system.domain.User;
import io.metersphere.system.domain.UserExample; import io.metersphere.system.domain.UserExample;
import io.metersphere.system.dto.UserBatchCreateDTO; import io.metersphere.system.dto.UserBatchCreateDTO;
@ -35,6 +34,7 @@ import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionUtils; import org.mybatis.spring.SqlSessionUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -65,26 +65,9 @@ public class UserService {
@Resource @Resource
private SqlSessionFactory sqlSessionFactory; private SqlSessionFactory sqlSessionFactory;
//批量添加用户记录日志 @Resource
public List<LogDTO> getBatchAddLogs(@Valid List<User> userList) { @Lazy
List<LogDTO> logs = new ArrayList<>(); private UserLogService userLogService;
userList.forEach(user -> {
LogDTO log = new LogDTO();
log.setId(UUID.randomUUID().toString());
log.setCreateUser(user.getCreateUser());
log.setProjectId(OperationLogConstants.SYSTEM);
log.setOrganizationId(OperationLogConstants.SYSTEM);
log.setType(OperationLogType.ADD.name());
log.setModule(OperationLogModule.SYSTEM_USER);
log.setMethod("addUser");
log.setCreateTime(user.getCreateTime());
log.setSourceId(user.getId());
log.setContent(user.getName() + "(" + user.getEmail() + ")");
log.setOriginalValue(JSON.toJSONBytes(user));
logs.add(log);
});
return logs;
}
public List<User> selectByIdList(@NotEmpty List<String> userIdList) { public List<User> selectByIdList(@NotEmpty List<String> userIdList) {
UserExample example = new UserExample(); UserExample example = new UserExample();
@ -142,13 +125,13 @@ public class UserService {
} }
userRoleRelationService.batchSave(userCreateDTO.getUserRoleIdList(), saveUserList); userRoleRelationService.batchSave(userCreateDTO.getUserRoleIdList(), saveUserList);
//写入操作日志 //写入操作日志
operationLogService.batchAdd(this.getBatchAddLogs(saveUserList)); operationLogService.batchAdd(userLogService.getBatchAddLogs(saveUserList));
return userCreateDTO; return userCreateDTO;
} }
public UserDTO getUserDTOByEmail(String email) { public UserDTO getUserDTOByKeyword(String email) {
UserDTO userDTO = baseUserMapper.selectByEmail(email); UserDTO userDTO = baseUserMapper.selectDTOByKeyword(email);
if (userDTO != null) { if (userDTO != null) {
userDTO.setUserRoleRelations( userDTO.setUserRoleRelations(
userRoleRelationService.selectByUserId(userDTO.getId()) userRoleRelationService.selectByUserId(userDTO.getId())
@ -318,95 +301,6 @@ public class UserService {
return insertIndex; return insertIndex;
} }
public LogDTO updateLog(UserEditRequest request) {
User user = userMapper.selectByPrimaryKey(request.getId());
if (user != null) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
request.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
JSON.toJSONString(user));
dto.setPath("/update");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
return dto;
}
return null;
}
public List<LogDTO> batchUpdateLog(TableBatchProcessDTO request) {
List<LogDTO> logDTOList = new ArrayList<>();
request.setSelectIds(this.getBatchUserIds(request));
List<User> userList = this.selectByIdList(request.getSelectIds());
for (User user : userList) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
JSON.toJSONString(user));
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
logDTOList.add(dto);
}
return logDTOList;
}
/**
* @param request 批量重置密码 用于记录Log使用
*/
public List<LogDTO> resetPasswordLog(TableBatchProcessDTO request) {
request.setSelectIds(this.getBatchUserIds(request));
List<LogDTO> returnList = new ArrayList<>();
UserExample example = new UserExample();
example.createCriteria().andIdIn(request.getSelectIds());
List<User> userList = userMapper.selectByExample(example);
for (User user : userList) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.SYSTEM_USER,
user.getName());
dto.setPath("/reset/password");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
returnList.add(dto);
}
return returnList;
}
public List<LogDTO> deleteLog(TableBatchProcessDTO request) {
List<LogDTO> logDTOList = new ArrayList<>();
request.getSelectIds().forEach(item -> {
User user = userMapper.selectByPrimaryKey(item);
if (user != null) {
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
user.getId(),
user.getCreateUser(),
OperationLogType.DELETE.name(),
OperationLogModule.SYSTEM_PROJECT,
user.getName());
dto.setPath("/delete");
dto.setMethod(HttpMethodConstants.POST.name());
dto.setOriginalValue(JSON.toJSONBytes(user));
logDTOList.add(dto);
}
});
return logDTOList;
}
public List<User> getUserList() { public List<User> getUserList() {
UserExample example = new UserExample(); UserExample example = new UserExample();
example.setOrderByClause("update_time desc"); example.setOrderByClause("update_time desc");

View File

@ -207,36 +207,69 @@ public class UserControllerTests extends BaseTest {
@Test @Test
@Order(3) @Order(3)
public void testPageSuccess() throws Exception { public void testPageSuccess() throws Exception {
List<String> userRoleIdList = USER_ROLE_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList());
this.checkUserList(); this.checkUserList();
BasePageRequest basePageRequest = UserParamUtils.getDefaultPageRequest(); BasePageRequest basePageRequest = UserParamUtils.getDefaultPageRequest();
MvcResult mvcResult = userRequestUtils.responsePost(userRequestUtils.URL_USER_PAGE, basePageRequest);
String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8); Pager<?> returnPager = userRequestUtils.selectUserPage(basePageRequest);
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
//返回请求正常
Assertions.assertNotNull(resultHolder);
Pager<?> returnPager = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class);
//返回值不为空 //返回值不为空
Assertions.assertNotNull(returnPager); Assertions.assertNotNull(returnPager);
//返回值的页码和当前页码相同 //返回值的页码和当前页码相同
Assertions.assertEquals(returnPager.getCurrent(), basePageRequest.getCurrent()); Assertions.assertEquals(returnPager.getCurrent(), basePageRequest.getCurrent());
//返回的数据量不超过规定要返回的数据量相同 //返回的数据量不超过规定要返回的数据量相同
Assertions.assertTrue(JSON.parseArray(JSON.toJSONString(returnPager.getList())).size() <= basePageRequest.getPageSize()); Assertions.assertTrue(JSON.parseArray(JSON.toJSONString(returnPager.getList())).size() <= basePageRequest.getPageSize());
List<UserTableResponse> userList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class);
//用户组不存在非全局用户组
for (UserTableResponse response : userList) {
if (CollectionUtils.isNotEmpty(response.getUserRoleList())) {
response.getUserRoleList().forEach(role -> {
Assertions.assertTrue(userRoleIdList.contains(role.getId()));
});
}
}
//页码为50
basePageRequest = UserParamUtils.getDefaultPageRequest();
basePageRequest.setPageSize(50);
returnPager = userRequestUtils.selectUserPage(basePageRequest);
//返回值不为空
Assertions.assertNotNull(returnPager);
//返回值的页码和当前页码相同
Assertions.assertEquals(returnPager.getCurrent(), basePageRequest.getCurrent());
//返回的数据量不超过规定要返回的数据量相同
Assertions.assertTrue(JSON.parseArray(JSON.toJSONString(returnPager.getList())).size() <= basePageRequest.getPageSize());
//用户组不存在非全局用户组
userList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class);
for (UserTableResponse response : userList) {
if (CollectionUtils.isNotEmpty(response.getUserRoleList())) {
response.getUserRoleList().forEach(role -> {
Assertions.assertTrue(userRoleIdList.contains(role.getId()));
});
}
}
//测试根据创建时间倒叙排列 //测试根据创建时间倒叙排列
basePageRequest = UserParamUtils.getDefaultPageRequest(); basePageRequest = UserParamUtils.getDefaultPageRequest();
basePageRequest.setSort(new HashMap<>() {{ basePageRequest.setSort(new HashMap<>() {{
put("createTime", "desc"); put("createTime", "desc");
}}); }});
mvcResult = userRequestUtils.responsePost(userRequestUtils.URL_USER_PAGE, basePageRequest); returnPager = userRequestUtils.selectUserPage(basePageRequest);
returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
resultHolder = JSON.parseObject(returnData, ResultHolder.class);
returnPager = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class);
//第一个数据的createTime是最大的 //第一个数据的createTime是最大的
List<UserTableResponse> userInfoList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class); List<UserTableResponse> userInfoList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class);
long firstCreateTime = userInfoList.get(0).getCreateTime(); long firstCreateTime = userInfoList.get(0).getCreateTime();
for (UserTableResponse userInfo : userInfoList) { for (UserTableResponse userInfo : userInfoList) {
Assertions.assertFalse(userInfo.getCreateTime() > firstCreateTime); Assertions.assertFalse(userInfo.getCreateTime() > firstCreateTime);
} }
//用户组不存在非全局用户组
userList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class);
for (UserTableResponse response : userList) {
if (CollectionUtils.isNotEmpty(response.getUserRoleList())) {
response.getUserRoleList().forEach(role -> {
Assertions.assertTrue(userRoleIdList.contains(role.getId()));
});
}
}
} }
@Test @Test
@ -766,9 +799,10 @@ public class UserControllerTests extends BaseTest {
this.testGetProjectAndOrganization(); this.testGetProjectAndOrganization();
} }
List<UserCreateInfo> last50Users = USER_LIST.subList(USER_LIST.size() - 50, USER_LIST.size()); List<String> userIds = this.selectUserTableIds(50);
UserRoleBatchRelationRequest request = new UserRoleBatchRelationRequest(); UserRoleBatchRelationRequest request = new UserRoleBatchRelationRequest();
request.setSelectIds(last50Users.stream().map(UserCreateInfo::getId).collect(Collectors.toList())); request.setSelectIds(userIds);
request.setRoleIds(PROJECT_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList())); request.setRoleIds(PROJECT_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList()));
//排除树结构中的组织ID //排除树结构中的组织ID
request.getRoleIds().removeAll(ORG_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList())); request.getRoleIds().removeAll(ORG_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList()));
@ -797,9 +831,10 @@ public class UserControllerTests extends BaseTest {
for (UserSelectOption option : USER_ROLE_LIST) { for (UserSelectOption option : USER_ROLE_LIST) {
this.checkLog(option.getId(), OperationLogType.ADD); this.checkLog(option.getId(), OperationLogType.ADD);
} }
//检查用户表格不会加载出来非全局用户组
this.testPageSuccess();
} }
@Test @Test
@Order(13) @Order(13)
public void testAddOrganization() throws Exception { public void testAddOrganization() throws Exception {
@ -811,11 +846,12 @@ public class UserControllerTests extends BaseTest {
this.testGetProjectAndOrganization(); this.testGetProjectAndOrganization();
} }
List<UserCreateInfo> last50Users = USER_LIST.subList(USER_LIST.size() - 50, USER_LIST.size()); List<String> userIds = this.selectUserTableIds(50);
UserRoleBatchRelationRequest request = new UserRoleBatchRelationRequest(); UserRoleBatchRelationRequest request = new UserRoleBatchRelationRequest();
request.setSelectIds(last50Users.stream().map(UserCreateInfo::getId).collect(Collectors.toList())); request.setSelectIds(userIds);
request.setRoleIds(ORG_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList())); request.setRoleIds(ORG_LIST.stream().map(UserSelectOption::getId).collect(Collectors.toList()));
this.requestPost(userRequestUtils.URL_ADD_ORGANIZATION_MEMBER, request); this.requestPostWithOk(userRequestUtils.URL_ADD_ORGANIZATION_MEMBER, request);
//检查有权限的数据量是否一致 //检查有权限的数据量是否一致
UserRoleRelationExample checkExample = new UserRoleRelationExample(); UserRoleRelationExample checkExample = new UserRoleRelationExample();
for (String orgId : request.getRoleIds()) { for (String orgId : request.getRoleIds()) {
@ -829,9 +865,11 @@ public class UserControllerTests extends BaseTest {
} }
} }
//检查日志 //检查日志
for (UserSelectOption option : USER_ROLE_LIST) { for (String userID : request.getSelectIds()) {
this.checkLog(option.getId(), OperationLogType.ADD); this.checkLog(userID, OperationLogType.UPDATE);
} }
//检查用户表格加载组织
this.testPageSuccess();
} }
@Test @Test
@ -889,20 +927,21 @@ public class UserControllerTests extends BaseTest {
@Order(99) @Order(99)
public void testUserDeleteSuccess() throws Exception { public void testUserDeleteSuccess() throws Exception {
this.checkUserList(); this.checkUserList();
//删除指定的用户 //删除USER_LIST用户
{
UserCreateInfo deleteUser = USER_LIST.get(0);
TableBatchProcessDTO request = new TableBatchProcessDTO(); TableBatchProcessDTO request = new TableBatchProcessDTO();
request.setSelectIds(Collections.singletonList(deleteUser.getId())); request.setSelectIds(USER_LIST.stream().map(UserCreateInfo::getId).collect(Collectors.toList()));
TableBatchProcessResponse response = userRequestUtils.parseObjectFromMvcResult( TableBatchProcessResponse response = userRequestUtils.parseObjectFromMvcResult(
userRequestUtils.responsePost(userRequestUtils.URL_USER_DELETE, request), TableBatchProcessResponse.class); userRequestUtils.responsePost(userRequestUtils.URL_USER_DELETE, request), TableBatchProcessResponse.class);
Assertions.assertEquals(request.getSelectIds().size(), response.getTotalCount()); Assertions.assertEquals(request.getSelectIds().size(), response.getTotalCount());
Assertions.assertEquals(request.getSelectIds().size(), response.getSuccessCount()); Assertions.assertEquals(request.getSelectIds().size(), response.getSuccessCount());
//检查数据库 //检查数据库
List<UserCreateInfo> removeList = new ArrayList<>();
for (UserCreateInfo deleteUser : USER_LIST) {
User user = userMapper.selectByPrimaryKey(deleteUser.getId()); User user = userMapper.selectByPrimaryKey(deleteUser.getId());
Assertions.assertTrue(user.getDeleted()); Assertions.assertTrue(user.getDeleted());
USER_LIST.remove(deleteUser); removeList.add(deleteUser);
} }
USER_LIST.removeAll(removeList);
} }
//删除失败的方法要放在删除成功方法后面执行 //删除失败的方法要放在删除成功方法后面执行
@ -941,6 +980,16 @@ public class UserControllerTests extends BaseTest {
USER_ROLE_LIST.addAll(userRoleList); USER_ROLE_LIST.addAll(userRoleList);
} }
//查找表格用户信息的ID
private List<String> selectUserTableIds(int pageSize) throws Exception {
BasePageRequest basePageRequest = UserParamUtils.getDefaultPageRequest();
basePageRequest.setPageSize(pageSize);
Pager<?> returnPager = userRequestUtils.selectUserPage(basePageRequest);
//用户组不存在非全局用户组
List<UserTableResponse> userList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class);
return userList.stream().map(User::getId).collect(Collectors.toList());
}
//成功入库的用户保存内存中其他用例会使用到 //成功入库的用户保存内存中其他用例会使用到
private void addUser2List(MvcResult mvcResult) throws Exception { private void addUser2List(MvcResult mvcResult) throws Exception {
UserBatchCreateDTO userMaintainRequest = userRequestUtils.parseObjectFromMvcResult(mvcResult, UserBatchCreateDTO.class); UserBatchCreateDTO userMaintainRequest = userRequestUtils.parseObjectFromMvcResult(mvcResult, UserBatchCreateDTO.class);

View File

@ -2,7 +2,9 @@ package io.metersphere.system.utils.user;
import io.metersphere.sdk.constants.SessionConstants; import io.metersphere.sdk.constants.SessionConstants;
import io.metersphere.sdk.controller.handler.ResultHolder; import io.metersphere.sdk.controller.handler.ResultHolder;
import io.metersphere.sdk.dto.BasePageRequest;
import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.Pager;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile; import org.springframework.mock.web.MockMultipartFile;
@ -125,4 +127,13 @@ public class UserRequestUtils {
.andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(content().contentType(MediaType.APPLICATION_JSON))
.andReturn(); .andReturn();
} }
public Pager<?> selectUserPage(BasePageRequest basePageRequest) throws Exception {
MvcResult mvcResult = this.responsePost(this.URL_USER_PAGE, basePageRequest);
String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
//返回请求正常
Assertions.assertNotNull(resultHolder);
return JSON.parseObject(JSON.toJSONString(resultHolder.getData()), Pager.class);
}
} }