feat:2.5.0
1. 完成组配置页面 2. 完成不同空间的切换 3. 新增登录用户工具类
This commit is contained in:
parent
db1aab3bbd
commit
9603dd30c7
@ -259,6 +259,7 @@ CREATE TABLE `system_user_permission`
|
||||
CREATE TABLE `sequence_alloc`
|
||||
(
|
||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
`namespace_id` varchar(64) NOT NULL DEFAULT '764d604ec6fc45f68cd92514c40e9e1a' COMMENT '命名空间id',
|
||||
`group_name` varchar(64) NOT NULL DEFAULT '' COMMENT '组名称',
|
||||
`max_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '最大id',
|
||||
`step` int(11) NOT NULL DEFAULT '100' COMMENT '步长',
|
||||
|
@ -35,6 +35,8 @@ public class SequenceAlloc implements Serializable {
|
||||
*/
|
||||
private String groupName;
|
||||
|
||||
private String namespaceId;
|
||||
|
||||
/**
|
||||
* 最大id
|
||||
*/
|
||||
|
@ -2,9 +2,11 @@ package com.aizuda.easy.retry.server.web.controller;
|
||||
|
||||
import cn.hutool.core.util.ReUtil;
|
||||
import com.aizuda.easy.retry.server.common.config.SystemProperties;
|
||||
import com.aizuda.easy.retry.server.web.annotation.LoginUser;
|
||||
import com.aizuda.easy.retry.server.web.model.base.PageResult;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigRequestVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.model.response.GroupConfigResponseVO;
|
||||
import com.aizuda.easy.retry.server.web.annotation.LoginRequired;
|
||||
import com.aizuda.easy.retry.server.web.annotation.RoleEnum;
|
||||
@ -37,8 +39,8 @@ public class GroupConfigController {
|
||||
|
||||
@LoginRequired(role = RoleEnum.ADMIN)
|
||||
@PostMapping("")
|
||||
public Boolean addGroup(@RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
|
||||
return groupConfigService.addGroup(groupConfigRequestVO);
|
||||
public Boolean addGroup(@LoginUser UserSessionVO systemUser, @RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
|
||||
return groupConfigService.addGroup(systemUser, groupConfigRequestVO);
|
||||
}
|
||||
|
||||
@LoginRequired
|
||||
@ -68,9 +70,15 @@ public class GroupConfigController {
|
||||
}
|
||||
|
||||
@LoginRequired
|
||||
@PostMapping("/all/group-name/list")
|
||||
@PostMapping("/all/group-config/list")
|
||||
public List<GroupConfigResponseVO> getAllGroupNameList(@RequestBody List<String> namespaceIds) {
|
||||
return groupConfigService.getAllGroupNameList(namespaceIds);
|
||||
return groupConfigService.getAllGroupConfigList(namespaceIds);
|
||||
}
|
||||
|
||||
@LoginRequired
|
||||
@PostMapping("/all/group-name/list")
|
||||
public List<String> getAllGroupNameList() {
|
||||
return groupConfigService.getAllGroupNameList();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
|
@ -1,7 +1,7 @@
|
||||
package com.aizuda.easy.retry.server.web.controller;
|
||||
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.service.SystemUserService;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||
import com.aizuda.easy.retry.server.web.model.base.PageResult;
|
||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
||||
@ -34,7 +34,7 @@ public class SystemUserController {
|
||||
|
||||
@LoginRequired
|
||||
@GetMapping("/user/info")
|
||||
public SystemUserResponseVO getUserInfo(@LoginUser SystemUser systemUser) {
|
||||
public SystemUserResponseVO getUserInfo(@LoginUser UserSessionVO systemUser) {
|
||||
return systemUserService.getUserInfo(systemUser);
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.aizuda.easy.retry.server.web.interceptor;
|
||||
|
||||
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.SystemUserMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||
import com.auth0.jwt.JWT;
|
||||
@ -33,6 +34,7 @@ import java.util.Objects;
|
||||
public class AuthenticationInterceptor implements HandlerInterceptor {
|
||||
|
||||
public static final String AUTHENTICATION = "EASY-RETRY-AUTH";
|
||||
public static final String NAMESPACE_ID = "EASY-RETRY-NAMESPACE-ID";
|
||||
|
||||
@Autowired
|
||||
private SystemUserMapper systemUserMapper;
|
||||
@ -41,6 +43,7 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
|
||||
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
|
||||
// 从 http 请求头中取出 token
|
||||
String token = httpServletRequest.getHeader(AUTHENTICATION);
|
||||
String namespaceId = httpServletRequest.getHeader(NAMESPACE_ID);
|
||||
|
||||
// 如果不是映射到方法直接通过
|
||||
if (!(object instanceof HandlerMethod)) {
|
||||
@ -74,7 +77,13 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
|
||||
throw new EasyRetryServerException("{} 用户不存在", systemUser.getUsername());
|
||||
}
|
||||
|
||||
httpServletRequest.setAttribute("currentUser", systemUser);
|
||||
UserSessionVO userSessionVO = new UserSessionVO();
|
||||
userSessionVO.setId(systemUser.getId());
|
||||
userSessionVO.setUsername(systemUser.getUsername());
|
||||
userSessionVO.setRole(systemUser.getRole());
|
||||
userSessionVO.setNamespaceId(namespaceId);
|
||||
|
||||
httpServletRequest.setAttribute("currentUser", userSessionVO);
|
||||
|
||||
// 验证 token
|
||||
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(systemUser.getPassword())).build();
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.aizuda.easy.retry.server.web.interceptor;
|
||||
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||
import com.aizuda.easy.retry.server.web.annotation.LoginUser;
|
||||
import org.springframework.core.MethodParameter;
|
||||
@ -21,13 +22,13 @@ public class LoginUserMethodArgumentResolver implements HandlerMethodArgumentRes
|
||||
|
||||
@Override
|
||||
public boolean supportsParameter(MethodParameter parameter) {
|
||||
return parameter.getParameterType().isAssignableFrom(SystemUser.class)
|
||||
return parameter.getParameterType().isAssignableFrom(UserSessionVO.class)
|
||||
&& parameter.hasParameterAnnotation(LoginUser.class);
|
||||
}
|
||||
@Override
|
||||
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
|
||||
WebDataBinderFactory binderFactory) throws Exception {
|
||||
SystemUser userInfo = (SystemUser) webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST);
|
||||
UserSessionVO userInfo = (UserSessionVO) webRequest.getAttribute("currentUser", RequestAttributes.SCOPE_REQUEST);
|
||||
if (userInfo != null) {
|
||||
return userInfo;
|
||||
}
|
||||
|
@ -22,9 +22,4 @@ public class GroupConfigQueryVO extends BaseQueryVO {
|
||||
@NotNull(message = "组状态不能为空")
|
||||
private Integer groupStatus;
|
||||
|
||||
/**
|
||||
* 命名空间id
|
||||
*/
|
||||
private Long namespaceId;
|
||||
|
||||
}
|
||||
|
@ -17,12 +17,6 @@ import javax.validation.constraints.Pattern;
|
||||
@Data
|
||||
public class GroupConfigRequestVO {
|
||||
|
||||
/**
|
||||
* 命名空间id
|
||||
*/
|
||||
@NotNull(message = "命名空间id 不能为空")
|
||||
private Long namespaceId;
|
||||
|
||||
@NotBlank(message = "组名称不能为空")
|
||||
@Pattern(regexp = "^[A-Za-z0-9_]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母和下划线")
|
||||
private String groupName;
|
||||
|
@ -0,0 +1,21 @@
|
||||
package com.aizuda.easy.retry.server.web.model.request;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @author xiaowoniu
|
||||
* @date 2023-11-22 22:42:26
|
||||
* @since 2.5.0
|
||||
*/
|
||||
@Data
|
||||
public final class UserSessionVO {
|
||||
|
||||
private Long id;
|
||||
|
||||
private String username;
|
||||
|
||||
private Integer role;
|
||||
|
||||
private String namespaceId;
|
||||
|
||||
}
|
@ -3,6 +3,7 @@ package com.aizuda.easy.retry.server.web.service;
|
||||
import com.aizuda.easy.retry.server.web.model.base.PageResult;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigRequestVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.model.response.GroupConfigResponseVO;
|
||||
|
||||
import java.util.List;
|
||||
@ -13,7 +14,7 @@ import java.util.List;
|
||||
*/
|
||||
public interface GroupConfigService {
|
||||
|
||||
Boolean addGroup(GroupConfigRequestVO groupConfigRequestVO);
|
||||
Boolean addGroup(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO);
|
||||
|
||||
Boolean updateGroup(GroupConfigRequestVO groupConfigRequestVO);
|
||||
|
||||
@ -23,5 +24,8 @@ public interface GroupConfigService {
|
||||
|
||||
GroupConfigResponseVO getGroupConfigByGroupName(String groupName);
|
||||
|
||||
List<GroupConfigResponseVO> getAllGroupNameList(final List<String> namespaceId);
|
||||
List<GroupConfigResponseVO> getAllGroupConfigList(final List<String> namespaceId);
|
||||
|
||||
List<String> getAllGroupNameList();
|
||||
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
package com.aizuda.easy.retry.server.web.service;
|
||||
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.model.base.PageResult;
|
||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
||||
@ -20,7 +20,7 @@ public interface SystemUserService {
|
||||
|
||||
SystemUserResponseVO login(SystemUserRequestVO requestVO);
|
||||
|
||||
SystemUserResponseVO getUserInfo(SystemUser systemUser);
|
||||
SystemUserResponseVO getUserInfo(UserSessionVO systemUser);
|
||||
|
||||
void addUser(SystemUserRequestVO requestVO);
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
package com.aizuda.easy.retry.server.web.service.convert;
|
||||
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||
import com.aizuda.easy.retry.server.web.model.response.SystemUserResponseVO;
|
||||
import org.mapstruct.Mapper;
|
||||
@ -17,6 +18,8 @@ public interface SystemUserResponseVOConverter {
|
||||
|
||||
SystemUserResponseVOConverter INSTANCE = Mappers.getMapper(SystemUserResponseVOConverter.class);
|
||||
|
||||
SystemUserResponseVO convert(UserSessionVO systemUser);
|
||||
|
||||
SystemUserResponseVO convert(SystemUser systemUser);
|
||||
|
||||
List<SystemUserResponseVO> batchConvert(List<SystemUser> systemUsers);
|
||||
|
@ -11,10 +11,12 @@ import com.aizuda.easy.retry.server.retry.task.support.handler.ConfigVersionSync
|
||||
import com.aizuda.easy.retry.server.web.model.base.PageResult;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigRequestVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.model.response.GroupConfigResponseVO;
|
||||
import com.aizuda.easy.retry.server.web.service.GroupConfigService;
|
||||
import com.aizuda.easy.retry.server.web.service.convert.GroupConfigConverter;
|
||||
import com.aizuda.easy.retry.server.web.service.convert.GroupConfigResponseVOConverter;
|
||||
import com.aizuda.easy.retry.server.web.util.UserSessionUtils;
|
||||
import com.aizuda.easy.retry.template.datasource.access.AccessTemplate;
|
||||
import com.aizuda.easy.retry.template.datasource.access.ConfigAccess;
|
||||
import com.aizuda.easy.retry.template.datasource.access.TaskAccess;
|
||||
@ -62,7 +64,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public Boolean addGroup(GroupConfigRequestVO groupConfigRequestVO) {
|
||||
public Boolean addGroup(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO) {
|
||||
|
||||
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
||||
Assert.isTrue(groupConfigAccess.count(new LambdaQueryWrapper<GroupConfig>()
|
||||
@ -70,10 +72,10 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
() -> new EasyRetryServerException("GroupName已经存在 {}", groupConfigRequestVO.getGroupName()));
|
||||
|
||||
// 保存组配置
|
||||
doSaveGroupConfig(groupConfigRequestVO);
|
||||
doSaveGroupConfig(systemUser, groupConfigRequestVO);
|
||||
|
||||
// 保存生成唯一id配置
|
||||
doSaveSequenceAlloc(groupConfigRequestVO);
|
||||
doSaveSequenceAlloc(systemUser, groupConfigRequestVO);
|
||||
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
@ -81,11 +83,13 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
/**
|
||||
* 保存序号生成规则配置失败
|
||||
*
|
||||
* @param systemUser
|
||||
* @param groupConfigRequestVO 组、场景、通知配置类
|
||||
*/
|
||||
private void doSaveSequenceAlloc(final GroupConfigRequestVO groupConfigRequestVO) {
|
||||
private void doSaveSequenceAlloc(UserSessionVO systemUser, final GroupConfigRequestVO groupConfigRequestVO) {
|
||||
SequenceAlloc sequenceAlloc = new SequenceAlloc();
|
||||
sequenceAlloc.setGroupName(groupConfigRequestVO.getGroupName());
|
||||
sequenceAlloc.setNamespaceId(systemUser.getNamespaceId());
|
||||
sequenceAlloc.setStep(systemProperties.getStep());
|
||||
sequenceAlloc.setUpdateDt(LocalDateTime.now());
|
||||
Assert.isTrue(1 == sequenceAllocMapper.insert(sequenceAlloc), () -> new EasyRetryServerException("failed to save sequence generation rule configuration [{}].", groupConfigRequestVO.getGroupName()));
|
||||
@ -141,7 +145,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
public PageResult<List<GroupConfigResponseVO>> getGroupConfigForPage(GroupConfigQueryVO queryVO) {
|
||||
|
||||
LambdaQueryWrapper<GroupConfig> groupConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
groupConfigLambdaQueryWrapper.eq(GroupConfig::getNamespaceId, queryVO.getNamespaceId());
|
||||
groupConfigLambdaQueryWrapper.eq(GroupConfig::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId());
|
||||
if (StrUtil.isNotBlank(queryVO.getGroupName())) {
|
||||
groupConfigLambdaQueryWrapper.like(GroupConfig::getGroupName, queryVO.getGroupName() + "%");
|
||||
}
|
||||
@ -172,10 +176,11 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
private void doSaveGroupConfig(GroupConfigRequestVO groupConfigRequestVO) {
|
||||
private void doSaveGroupConfig(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO) {
|
||||
GroupConfig groupConfig = GroupConfigConverter.INSTANCE.convert(groupConfigRequestVO);
|
||||
groupConfig.setCreateDt(LocalDateTime.now());
|
||||
groupConfig.setVersion(1);
|
||||
groupConfig.setNamespaceId(systemUser.getNamespaceId());
|
||||
groupConfig.setGroupName(groupConfigRequestVO.getGroupName());
|
||||
groupConfig.setDescription(Optional.ofNullable(groupConfigRequestVO.getDescription()).orElse(StrUtil.EMPTY));
|
||||
if (Objects.isNull(groupConfigRequestVO.getGroupPartition())) {
|
||||
@ -236,14 +241,26 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<GroupConfigResponseVO> getAllGroupNameList(final List<String> namespaceId) {
|
||||
public List<GroupConfigResponseVO> getAllGroupConfigList(final List<String> namespaceId) {
|
||||
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
||||
|
||||
List<GroupConfig> groupConfigs = groupConfigAccess.list(new LambdaQueryWrapper<GroupConfig>()
|
||||
.in(GroupConfig::getNamespaceId, namespaceId)
|
||||
.select(GroupConfig::getGroupName, GroupConfig::getNamespaceId)).stream()
|
||||
.collect(Collectors.toList());
|
||||
.in(GroupConfig::getNamespaceId, namespaceId)
|
||||
.select(GroupConfig::getGroupName, GroupConfig::getNamespaceId)).stream()
|
||||
.collect(Collectors.toList());
|
||||
return GroupConfigResponseVOConverter.INSTANCE.toGroupConfigResponseVO(groupConfigs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getAllGroupNameList() {
|
||||
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
||||
|
||||
List<GroupConfig> groupConfigs = groupConfigAccess.list(new LambdaQueryWrapper<GroupConfig>()
|
||||
.in(GroupConfig::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId())
|
||||
.select(GroupConfig::getGroupName)).stream()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return groupConfigs.stream().map(GroupConfig::getGroupName).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import cn.hutool.crypto.SecureUtil;
|
||||
import com.aizuda.easy.retry.server.common.config.SystemProperties;
|
||||
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserPermissionRequestVO;
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import com.aizuda.easy.retry.server.web.service.convert.NamespaceResponseVOConverter;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.NamespaceMapper;
|
||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.SystemUserMapper;
|
||||
@ -61,7 +62,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
public SystemUserResponseVO login(SystemUserRequestVO requestVO) {
|
||||
|
||||
SystemUser systemUser = systemUserMapper.selectOne(
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
if (Objects.isNull(systemUser)) {
|
||||
throw new EasyRetryServerException("用户名或密码错误");
|
||||
}
|
||||
@ -76,36 +77,36 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
systemUserResponseVO.setToken(token);
|
||||
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
||||
|
||||
getPermission(systemUser, systemUserResponseVO);
|
||||
getPermission(systemUser.getRole(), systemUser.getId(), systemUserResponseVO);
|
||||
|
||||
return systemUserResponseVO;
|
||||
}
|
||||
|
||||
private void getPermission(final SystemUser systemUser, final SystemUserResponseVO systemUserResponseVO) {
|
||||
private void getPermission(Integer role, Long userId, final SystemUserResponseVO systemUserResponseVO) {
|
||||
|
||||
LambdaQueryWrapper<Namespace> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.select(Namespace::getId, Namespace::getUniqueId, Namespace::getName);
|
||||
if (RoleEnum.USER.getRoleId().equals(systemUser.getRole())) {
|
||||
if (RoleEnum.USER.getRoleId().equals(role)) {
|
||||
List<SystemUserPermission> systemUserPermissions = systemUserPermissionMapper.selectList(
|
||||
new LambdaQueryWrapper<SystemUserPermission>()
|
||||
.select(SystemUserPermission::getNamespaceId)
|
||||
.eq(SystemUserPermission::getSystemUserId, systemUser.getId())
|
||||
.groupBy(SystemUserPermission::getNamespaceId));
|
||||
new LambdaQueryWrapper<SystemUserPermission>()
|
||||
.select(SystemUserPermission::getNamespaceId)
|
||||
.eq(SystemUserPermission::getSystemUserId, userId)
|
||||
.groupBy(SystemUserPermission::getNamespaceId));
|
||||
queryWrapper.in(Namespace::getId, systemUserPermissions.stream()
|
||||
.map(SystemUserPermission::getNamespaceId).collect(Collectors.toList()));
|
||||
.map(SystemUserPermission::getNamespaceId).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
List<Namespace> namespaces = namespaceMapper.selectList(queryWrapper);
|
||||
systemUserResponseVO.setNamespaceIdList(
|
||||
NamespaceResponseVOConverter.INSTANCE.toNamespaceResponseVOs(namespaces));
|
||||
NamespaceResponseVOConverter.INSTANCE.toNamespaceResponseVOs(namespaces));
|
||||
}
|
||||
|
||||
@Override
|
||||
public SystemUserResponseVO getUserInfo(SystemUser systemUser) {
|
||||
public SystemUserResponseVO getUserInfo(UserSessionVO systemUser) {
|
||||
SystemUserResponseVO systemUserResponseVO = SystemUserResponseVOConverter.INSTANCE.convert(systemUser);
|
||||
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
||||
|
||||
getPermission(systemUser, systemUserResponseVO);
|
||||
getPermission(systemUser.getRole(), systemUser.getId(), systemUserResponseVO);
|
||||
|
||||
return systemUserResponseVO;
|
||||
}
|
||||
@ -114,7 +115,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
@Transactional
|
||||
public void addUser(SystemUserRequestVO requestVO) {
|
||||
long count = systemUserMapper.selectCount(
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
if (count > 0) {
|
||||
throw new EasyRetryServerException("该用户已存在");
|
||||
}
|
||||
@ -138,7 +139,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
systemUserPermission.setGroupName(permission.getGroupName());
|
||||
systemUserPermission.setNamespaceId(permission.getNamespaceId());
|
||||
Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission),
|
||||
() -> new EasyRetryServerException("新增用户权限失败"));
|
||||
() -> new EasyRetryServerException("新增用户权限失败"));
|
||||
}
|
||||
|
||||
}
|
||||
@ -147,14 +148,14 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
@Transactional
|
||||
public void update(SystemUserRequestVO requestVO) {
|
||||
SystemUser systemUser = systemUserMapper.selectOne(
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getId, requestVO.getId()));
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getId, requestVO.getId()));
|
||||
if (Objects.isNull(systemUser)) {
|
||||
throw new EasyRetryServerException("该用户不存在");
|
||||
}
|
||||
|
||||
if (!systemUser.getUsername().equals(requestVO.getUsername())) {
|
||||
long count = systemUserMapper.selectCount(
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
|
||||
if (count > 0) {
|
||||
throw new EasyRetryServerException("该用户已存在");
|
||||
}
|
||||
@ -176,7 +177,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
}
|
||||
|
||||
systemUserPermissionMapper.delete(new LambdaQueryWrapper<SystemUserPermission>()
|
||||
.eq(SystemUserPermission::getSystemUserId, systemUser.getId()));
|
||||
.eq(SystemUserPermission::getSystemUserId, systemUser.getId()));
|
||||
|
||||
for (UserPermissionRequestVO permission : permissions) {
|
||||
SystemUserPermission systemUserPermission = new SystemUserPermission();
|
||||
@ -184,7 +185,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
systemUserPermission.setGroupName(permission.getGroupName());
|
||||
systemUserPermission.setNamespaceId(permission.getNamespaceId());
|
||||
Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission),
|
||||
() -> new EasyRetryServerException("更新用户权限失败"));
|
||||
() -> new EasyRetryServerException("更新用户权限失败"));
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,22 +200,22 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
}
|
||||
|
||||
userPageDTO = systemUserMapper.selectPage(userPageDTO,
|
||||
systemUserLambdaQueryWrapper.orderByDesc(SystemUser::getId));
|
||||
systemUserLambdaQueryWrapper.orderByDesc(SystemUser::getId));
|
||||
|
||||
List<SystemUserResponseVO> userResponseVOList = SystemUserResponseVOConverter.INSTANCE.batchConvert(
|
||||
userPageDTO.getRecords());
|
||||
userPageDTO.getRecords());
|
||||
|
||||
userResponseVOList.stream()
|
||||
.filter(systemUserResponseVO -> systemUserResponseVO.getRole().equals(RoleEnum.USER.getRoleId()))
|
||||
.forEach(systemUserResponseVO -> {
|
||||
List<SystemUserPermission> systemUserPermissionList = systemUserPermissionMapper.selectList(
|
||||
new LambdaQueryWrapper<SystemUserPermission>()
|
||||
.select(SystemUserPermission::getGroupName)
|
||||
.eq(SystemUserPermission::getSystemUserId, systemUserResponseVO.getId()));
|
||||
.filter(systemUserResponseVO -> systemUserResponseVO.getRole().equals(RoleEnum.USER.getRoleId()))
|
||||
.forEach(systemUserResponseVO -> {
|
||||
List<SystemUserPermission> systemUserPermissionList = systemUserPermissionMapper.selectList(
|
||||
new LambdaQueryWrapper<SystemUserPermission>()
|
||||
.select(SystemUserPermission::getGroupName)
|
||||
.eq(SystemUserPermission::getSystemUserId, systemUserResponseVO.getId()));
|
||||
|
||||
systemUserResponseVO.setGroupNameList(systemUserPermissionList.stream()
|
||||
.map(SystemUserPermission::getGroupName).collect(Collectors.toList()));
|
||||
});
|
||||
systemUserResponseVO.setGroupNameList(systemUserPermissionList.stream()
|
||||
.map(SystemUserPermission::getGroupName).collect(Collectors.toList()));
|
||||
});
|
||||
|
||||
return new PageResult<>(userPageDTO, userResponseVOList);
|
||||
}
|
||||
@ -222,12 +223,14 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
@Override
|
||||
public SystemUserResponseVO getSystemUserByUserName(String username) {
|
||||
SystemUser systemUser = systemUserMapper.selectOne(
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, username));
|
||||
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, username));
|
||||
if (Objects.isNull(systemUser)) {
|
||||
throw new EasyRetryServerException("用户不存在");
|
||||
}
|
||||
|
||||
return getUserInfo(systemUser);
|
||||
SystemUserResponseVO responseVO = SystemUserResponseVOConverter.INSTANCE.convert(systemUser);
|
||||
getPermission(systemUser.getRole(), systemUser.getId(), responseVO);
|
||||
return responseVO;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -241,7 +244,7 @@ public class SystemUserServiceImpl implements SystemUserService {
|
||||
private String getToken(SystemUser systemUser) {
|
||||
String sign = systemUser.getPassword();
|
||||
return JWT.create().withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME))
|
||||
.withAudience(JsonUtil.toJsonString(SystemUserResponseVOConverter.INSTANCE.convert(systemUser)))
|
||||
.sign(Algorithm.HMAC256(sign));
|
||||
.withAudience(JsonUtil.toJsonString(SystemUserResponseVOConverter.INSTANCE.convert(systemUser)))
|
||||
.sign(Algorithm.HMAC256(sign));
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,20 @@
|
||||
package com.aizuda.easy.retry.server.web.util;
|
||||
|
||||
import com.aizuda.easy.retry.server.web.model.request.UserSessionVO;
|
||||
import org.springframework.web.context.request.RequestContextHolder;
|
||||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @author www.byteblogs.com
|
||||
* @date 2023-11-22 23:14:53
|
||||
* @since 2.4.0
|
||||
*/
|
||||
public final class UserSessionUtils {
|
||||
|
||||
public static UserSessionVO currentUserSession() {
|
||||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
||||
return (UserSessionVO) request.getAttribute("currentUser");
|
||||
}
|
||||
}
|
@ -70,6 +70,14 @@ export function delNamespace (id) {
|
||||
})
|
||||
}
|
||||
|
||||
export function updateNamespace (data) {
|
||||
return request({
|
||||
url: api.addNamespace,
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function addNamespace (data) {
|
||||
return request({
|
||||
url: api.addNamespace,
|
||||
|
36
frontend/src/components/GlobalHeader/Namespace.vue
Normal file
36
frontend/src/components/GlobalHeader/Namespace.vue
Normal file
@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<a-dropdown>
|
||||
<a-menu slot="overlay" @click="handleMenuClick">
|
||||
<a-menu-item :key="item.uniqueId" v-for="item in namespaceIds">
|
||||
<a href="javascript:;">{{ item.name }}</a>
|
||||
</a-menu-item>
|
||||
</a-menu>
|
||||
<a-button shape="round"> {{ name }} <a-icon type="down" /> </a-button>
|
||||
</a-dropdown>
|
||||
</template>
|
||||
<script>
|
||||
import namespaceMixin from '@/store/namespace-mixin'
|
||||
import storage from 'store'
|
||||
import { APP_NAMESPACE } from '@/store/mutation-types'
|
||||
export default {
|
||||
mixins: [namespaceMixin],
|
||||
data () {
|
||||
return {
|
||||
namespaceIds: [],
|
||||
name: 'Default'
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
setTimeout(() => {
|
||||
this.namespaceIds = this.$store.getters.namespaces
|
||||
this.name = this.namespaceIds.find(i => i.uniqueId === storage.get(APP_NAMESPACE)).name
|
||||
}, 1500)
|
||||
},
|
||||
methods: {
|
||||
handleMenuClick (e) {
|
||||
this.name = this.namespaceIds.find(i => i.uniqueId === e.key).name
|
||||
this.$store.dispatch('setNamespace', e.key)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
@ -1,21 +1,6 @@
|
||||
<template>
|
||||
<div :class="wrpCls">
|
||||
<a-dropdown>
|
||||
<span placement="bottomRight">
|
||||
Default <a-icon type="down" />
|
||||
</span>
|
||||
<a-menu slot="overlay">
|
||||
<a-menu-item>
|
||||
<a href="javascript:;">Uat</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item>
|
||||
<a href="javascript:;">Dev</a>
|
||||
</a-menu-item>
|
||||
<a-menu-item>
|
||||
<a href="javascript:;">Prod</a>
|
||||
</a-menu-item>
|
||||
</a-menu>
|
||||
</a-dropdown>
|
||||
<Namespace/>
|
||||
<a href="https://www.easyretry.com" target="_blank" :class="prefixCls"><a-icon type="question-circle" :style="{ fontSize: '18px', color: '#08c' }"/></a>
|
||||
<avatar-dropdown :menu="showMenu" :current-user="currentUser" :class="prefixCls"/>
|
||||
<!-- <select-lang :class="prefixCls" />-->
|
||||
@ -25,12 +10,14 @@
|
||||
<script>
|
||||
import AvatarDropdown from './AvatarDropdown'
|
||||
import SelectLang from '@/components/SelectLang'
|
||||
import Namespace from '@/components/GlobalHeader/Namespace'
|
||||
|
||||
export default {
|
||||
name: 'RightContent',
|
||||
components: {
|
||||
AvatarDropdown,
|
||||
SelectLang
|
||||
SelectLang,
|
||||
Namespace
|
||||
},
|
||||
props: {
|
||||
prefixCls: {
|
||||
|
@ -10,7 +10,8 @@ const getters = {
|
||||
roles: state => state.user.roles,
|
||||
userInfo: state => state.user.info,
|
||||
addRouters: state => state.permission.addRouters,
|
||||
multiTab: state => state.app.multiTab
|
||||
multiTab: state => state.app.multiTab,
|
||||
namespaces: state => state.user.namespaces
|
||||
}
|
||||
|
||||
export default getters
|
||||
|
@ -10,7 +10,8 @@ const user = {
|
||||
welcome: '',
|
||||
avatar: '',
|
||||
roles: [],
|
||||
info: {}
|
||||
info: {},
|
||||
namespaces: []
|
||||
},
|
||||
|
||||
mutations: {
|
||||
@ -29,6 +30,9 @@ const user = {
|
||||
},
|
||||
SET_INFO: (state, info) => {
|
||||
state.info = info
|
||||
},
|
||||
SET_NAMESPACES: (state, namespaces) => {
|
||||
state.namespaces = namespaces
|
||||
}
|
||||
},
|
||||
|
||||
@ -56,6 +60,8 @@ const user = {
|
||||
permissions: permissionsConfig(result.role, result.mode)
|
||||
}
|
||||
|
||||
commit('SET_NAMESPACES', result.namespaceIdList)
|
||||
|
||||
if (result.role && result.role.permissions.length > 0) {
|
||||
const role = result.role
|
||||
role.permissions = result.role.permissions
|
||||
|
16
frontend/src/store/namespace-mixin.js
Normal file
16
frontend/src/store/namespace-mixin.js
Normal file
@ -0,0 +1,16 @@
|
||||
import { mapState } from 'vuex'
|
||||
|
||||
const namespaceMixin = {
|
||||
computed: {
|
||||
...mapState({
|
||||
currentLang: state => state.app.lang
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
setNamespace (namespaceId) {
|
||||
this.$store.dispatch('setNamespace', namespaceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default namespaceMixin
|
@ -3,7 +3,7 @@ import store from '@/store'
|
||||
import storage from 'store'
|
||||
import notification from 'ant-design-vue/es/notification'
|
||||
import { VueAxios } from './axios'
|
||||
import { ACCESS_TOKEN } from '@/store/mutation-types'
|
||||
import { ACCESS_TOKEN, APP_NAMESPACE } from '@/store/mutation-types'
|
||||
|
||||
// 创建 axios 实例
|
||||
const request = axios.create({
|
||||
@ -44,11 +44,16 @@ const errorHandler = (error) => {
|
||||
// request interceptor
|
||||
request.interceptors.request.use(config => {
|
||||
const token = storage.get(ACCESS_TOKEN)
|
||||
const namespaceId = storage.get(APP_NAMESPACE)
|
||||
// 如果 token 存在
|
||||
// 让每个请求携带自定义 token 请根据实际情况自行修改
|
||||
if (token) {
|
||||
config.headers['EASY-RETRY-AUTH'] = token
|
||||
}
|
||||
if (namespaceId) {
|
||||
config.headers['EASY-RETRY-NAMESPACE-ID'] = namespaceId
|
||||
}
|
||||
|
||||
return config
|
||||
}, errorHandler)
|
||||
|
||||
|
@ -66,7 +66,7 @@ export default {
|
||||
e.preventDefault()
|
||||
this.form.validateFields((err, values) => {
|
||||
if (!err) {
|
||||
if (this.formType === 'create') {
|
||||
if (!this.isEdit) {
|
||||
addNamespace(values).then(res => {
|
||||
this.$message.success('操作成功')
|
||||
this.$emit('refreshTable', 1)
|
||||
|
Loading…
Reference in New Issue
Block a user