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`
|
CREATE TABLE `sequence_alloc`
|
||||||
(
|
(
|
||||||
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
|
`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 '组名称',
|
`group_name` varchar(64) NOT NULL DEFAULT '' COMMENT '组名称',
|
||||||
`max_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '最大id',
|
`max_id` bigint(20) NOT NULL DEFAULT '1' COMMENT '最大id',
|
||||||
`step` int(11) NOT NULL DEFAULT '100' COMMENT '步长',
|
`step` int(11) NOT NULL DEFAULT '100' COMMENT '步长',
|
||||||
|
@ -35,6 +35,8 @@ public class SequenceAlloc implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String groupName;
|
private String groupName;
|
||||||
|
|
||||||
|
private String namespaceId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 最大id
|
* 最大id
|
||||||
*/
|
*/
|
||||||
|
@ -2,9 +2,11 @@ package com.aizuda.easy.retry.server.web.controller;
|
|||||||
|
|
||||||
import cn.hutool.core.util.ReUtil;
|
import cn.hutool.core.util.ReUtil;
|
||||||
import com.aizuda.easy.retry.server.common.config.SystemProperties;
|
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.base.PageResult;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
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.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.model.response.GroupConfigResponseVO;
|
||||||
import com.aizuda.easy.retry.server.web.annotation.LoginRequired;
|
import com.aizuda.easy.retry.server.web.annotation.LoginRequired;
|
||||||
import com.aizuda.easy.retry.server.web.annotation.RoleEnum;
|
import com.aizuda.easy.retry.server.web.annotation.RoleEnum;
|
||||||
@ -37,8 +39,8 @@ public class GroupConfigController {
|
|||||||
|
|
||||||
@LoginRequired(role = RoleEnum.ADMIN)
|
@LoginRequired(role = RoleEnum.ADMIN)
|
||||||
@PostMapping("")
|
@PostMapping("")
|
||||||
public Boolean addGroup(@RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
|
public Boolean addGroup(@LoginUser UserSessionVO systemUser, @RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
|
||||||
return groupConfigService.addGroup(groupConfigRequestVO);
|
return groupConfigService.addGroup(systemUser, groupConfigRequestVO);
|
||||||
}
|
}
|
||||||
|
|
||||||
@LoginRequired
|
@LoginRequired
|
||||||
@ -68,9 +70,15 @@ public class GroupConfigController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@LoginRequired
|
@LoginRequired
|
||||||
@PostMapping("/all/group-name/list")
|
@PostMapping("/all/group-config/list")
|
||||||
public List<GroupConfigResponseVO> getAllGroupNameList(@RequestBody List<String> namespaceIds) {
|
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
|
@Deprecated
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package com.aizuda.easy.retry.server.web.controller;
|
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.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.base.PageResult;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
||||||
@ -34,7 +34,7 @@ public class SystemUserController {
|
|||||||
|
|
||||||
@LoginRequired
|
@LoginRequired
|
||||||
@GetMapping("/user/info")
|
@GetMapping("/user/info")
|
||||||
public SystemUserResponseVO getUserInfo(@LoginUser SystemUser systemUser) {
|
public SystemUserResponseVO getUserInfo(@LoginUser UserSessionVO systemUser) {
|
||||||
return systemUserService.getUserInfo(systemUser);
|
return systemUserService.getUserInfo(systemUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.aizuda.easy.retry.server.web.interceptor;
|
package com.aizuda.easy.retry.server.web.interceptor;
|
||||||
|
|
||||||
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
|
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.mapper.SystemUserMapper;
|
||||||
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
import com.aizuda.easy.retry.template.datasource.persistence.po.SystemUser;
|
||||||
import com.auth0.jwt.JWT;
|
import com.auth0.jwt.JWT;
|
||||||
@ -33,6 +34,7 @@ import java.util.Objects;
|
|||||||
public class AuthenticationInterceptor implements HandlerInterceptor {
|
public class AuthenticationInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
public static final String AUTHENTICATION = "EASY-RETRY-AUTH";
|
public static final String AUTHENTICATION = "EASY-RETRY-AUTH";
|
||||||
|
public static final String NAMESPACE_ID = "EASY-RETRY-NAMESPACE-ID";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private SystemUserMapper systemUserMapper;
|
private SystemUserMapper systemUserMapper;
|
||||||
@ -41,6 +43,7 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
|
|||||||
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
|
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
|
||||||
// 从 http 请求头中取出 token
|
// 从 http 请求头中取出 token
|
||||||
String token = httpServletRequest.getHeader(AUTHENTICATION);
|
String token = httpServletRequest.getHeader(AUTHENTICATION);
|
||||||
|
String namespaceId = httpServletRequest.getHeader(NAMESPACE_ID);
|
||||||
|
|
||||||
// 如果不是映射到方法直接通过
|
// 如果不是映射到方法直接通过
|
||||||
if (!(object instanceof HandlerMethod)) {
|
if (!(object instanceof HandlerMethod)) {
|
||||||
@ -74,7 +77,13 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
|
|||||||
throw new EasyRetryServerException("{} 用户不存在", systemUser.getUsername());
|
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
|
// 验证 token
|
||||||
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(systemUser.getPassword())).build();
|
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(systemUser.getPassword())).build();
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.aizuda.easy.retry.server.web.interceptor;
|
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.template.datasource.persistence.po.SystemUser;
|
||||||
import com.aizuda.easy.retry.server.web.annotation.LoginUser;
|
import com.aizuda.easy.retry.server.web.annotation.LoginUser;
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
@ -21,13 +22,13 @@ public class LoginUserMethodArgumentResolver implements HandlerMethodArgumentRes
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsParameter(MethodParameter parameter) {
|
public boolean supportsParameter(MethodParameter parameter) {
|
||||||
return parameter.getParameterType().isAssignableFrom(SystemUser.class)
|
return parameter.getParameterType().isAssignableFrom(UserSessionVO.class)
|
||||||
&& parameter.hasParameterAnnotation(LoginUser.class);
|
&& parameter.hasParameterAnnotation(LoginUser.class);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
|
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
|
||||||
WebDataBinderFactory binderFactory) throws Exception {
|
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) {
|
if (userInfo != null) {
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,4 @@ public class GroupConfigQueryVO extends BaseQueryVO {
|
|||||||
@NotNull(message = "组状态不能为空")
|
@NotNull(message = "组状态不能为空")
|
||||||
private Integer groupStatus;
|
private Integer groupStatus;
|
||||||
|
|
||||||
/**
|
|
||||||
* 命名空间id
|
|
||||||
*/
|
|
||||||
private Long namespaceId;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,6 @@ import javax.validation.constraints.Pattern;
|
|||||||
@Data
|
@Data
|
||||||
public class GroupConfigRequestVO {
|
public class GroupConfigRequestVO {
|
||||||
|
|
||||||
/**
|
|
||||||
* 命名空间id
|
|
||||||
*/
|
|
||||||
@NotNull(message = "命名空间id 不能为空")
|
|
||||||
private Long namespaceId;
|
|
||||||
|
|
||||||
@NotBlank(message = "组名称不能为空")
|
@NotBlank(message = "组名称不能为空")
|
||||||
@Pattern(regexp = "^[A-Za-z0-9_]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母和下划线")
|
@Pattern(regexp = "^[A-Za-z0-9_]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母和下划线")
|
||||||
private String groupName;
|
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.base.PageResult;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
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.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.model.response.GroupConfigResponseVO;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -13,7 +14,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public interface GroupConfigService {
|
public interface GroupConfigService {
|
||||||
|
|
||||||
Boolean addGroup(GroupConfigRequestVO groupConfigRequestVO);
|
Boolean addGroup(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO);
|
||||||
|
|
||||||
Boolean updateGroup(GroupConfigRequestVO groupConfigRequestVO);
|
Boolean updateGroup(GroupConfigRequestVO groupConfigRequestVO);
|
||||||
|
|
||||||
@ -23,5 +24,8 @@ public interface GroupConfigService {
|
|||||||
|
|
||||||
GroupConfigResponseVO getGroupConfigByGroupName(String groupName);
|
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;
|
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.base.PageResult;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
import com.aizuda.easy.retry.server.web.model.request.SystemUserQueryVO;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
import com.aizuda.easy.retry.server.web.model.request.SystemUserRequestVO;
|
||||||
@ -20,7 +20,7 @@ public interface SystemUserService {
|
|||||||
|
|
||||||
SystemUserResponseVO login(SystemUserRequestVO requestVO);
|
SystemUserResponseVO login(SystemUserRequestVO requestVO);
|
||||||
|
|
||||||
SystemUserResponseVO getUserInfo(SystemUser systemUser);
|
SystemUserResponseVO getUserInfo(UserSessionVO systemUser);
|
||||||
|
|
||||||
void addUser(SystemUserRequestVO requestVO);
|
void addUser(SystemUserRequestVO requestVO);
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package com.aizuda.easy.retry.server.web.service.convert;
|
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.template.datasource.persistence.po.SystemUser;
|
||||||
import com.aizuda.easy.retry.server.web.model.response.SystemUserResponseVO;
|
import com.aizuda.easy.retry.server.web.model.response.SystemUserResponseVO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
@ -17,6 +18,8 @@ public interface SystemUserResponseVOConverter {
|
|||||||
|
|
||||||
SystemUserResponseVOConverter INSTANCE = Mappers.getMapper(SystemUserResponseVOConverter.class);
|
SystemUserResponseVOConverter INSTANCE = Mappers.getMapper(SystemUserResponseVOConverter.class);
|
||||||
|
|
||||||
|
SystemUserResponseVO convert(UserSessionVO systemUser);
|
||||||
|
|
||||||
SystemUserResponseVO convert(SystemUser systemUser);
|
SystemUserResponseVO convert(SystemUser systemUser);
|
||||||
|
|
||||||
List<SystemUserResponseVO> batchConvert(List<SystemUser> systemUsers);
|
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.base.PageResult;
|
||||||
import com.aizuda.easy.retry.server.web.model.request.GroupConfigQueryVO;
|
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.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.model.response.GroupConfigResponseVO;
|
||||||
import com.aizuda.easy.retry.server.web.service.GroupConfigService;
|
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.GroupConfigConverter;
|
||||||
import com.aizuda.easy.retry.server.web.service.convert.GroupConfigResponseVOConverter;
|
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.AccessTemplate;
|
||||||
import com.aizuda.easy.retry.template.datasource.access.ConfigAccess;
|
import com.aizuda.easy.retry.template.datasource.access.ConfigAccess;
|
||||||
import com.aizuda.easy.retry.template.datasource.access.TaskAccess;
|
import com.aizuda.easy.retry.template.datasource.access.TaskAccess;
|
||||||
@ -62,7 +64,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public Boolean addGroup(GroupConfigRequestVO groupConfigRequestVO) {
|
public Boolean addGroup(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO) {
|
||||||
|
|
||||||
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
||||||
Assert.isTrue(groupConfigAccess.count(new LambdaQueryWrapper<GroupConfig>()
|
Assert.isTrue(groupConfigAccess.count(new LambdaQueryWrapper<GroupConfig>()
|
||||||
@ -70,10 +72,10 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
() -> new EasyRetryServerException("GroupName已经存在 {}", groupConfigRequestVO.getGroupName()));
|
() -> new EasyRetryServerException("GroupName已经存在 {}", groupConfigRequestVO.getGroupName()));
|
||||||
|
|
||||||
// 保存组配置
|
// 保存组配置
|
||||||
doSaveGroupConfig(groupConfigRequestVO);
|
doSaveGroupConfig(systemUser, groupConfigRequestVO);
|
||||||
|
|
||||||
// 保存生成唯一id配置
|
// 保存生成唯一id配置
|
||||||
doSaveSequenceAlloc(groupConfigRequestVO);
|
doSaveSequenceAlloc(systemUser, groupConfigRequestVO);
|
||||||
|
|
||||||
return Boolean.TRUE;
|
return Boolean.TRUE;
|
||||||
}
|
}
|
||||||
@ -81,11 +83,13 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
/**
|
/**
|
||||||
* 保存序号生成规则配置失败
|
* 保存序号生成规则配置失败
|
||||||
*
|
*
|
||||||
|
* @param systemUser
|
||||||
* @param groupConfigRequestVO 组、场景、通知配置类
|
* @param groupConfigRequestVO 组、场景、通知配置类
|
||||||
*/
|
*/
|
||||||
private void doSaveSequenceAlloc(final GroupConfigRequestVO groupConfigRequestVO) {
|
private void doSaveSequenceAlloc(UserSessionVO systemUser, final GroupConfigRequestVO groupConfigRequestVO) {
|
||||||
SequenceAlloc sequenceAlloc = new SequenceAlloc();
|
SequenceAlloc sequenceAlloc = new SequenceAlloc();
|
||||||
sequenceAlloc.setGroupName(groupConfigRequestVO.getGroupName());
|
sequenceAlloc.setGroupName(groupConfigRequestVO.getGroupName());
|
||||||
|
sequenceAlloc.setNamespaceId(systemUser.getNamespaceId());
|
||||||
sequenceAlloc.setStep(systemProperties.getStep());
|
sequenceAlloc.setStep(systemProperties.getStep());
|
||||||
sequenceAlloc.setUpdateDt(LocalDateTime.now());
|
sequenceAlloc.setUpdateDt(LocalDateTime.now());
|
||||||
Assert.isTrue(1 == sequenceAllocMapper.insert(sequenceAlloc), () -> new EasyRetryServerException("failed to save sequence generation rule configuration [{}].", groupConfigRequestVO.getGroupName()));
|
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) {
|
public PageResult<List<GroupConfigResponseVO>> getGroupConfigForPage(GroupConfigQueryVO queryVO) {
|
||||||
|
|
||||||
LambdaQueryWrapper<GroupConfig> groupConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<GroupConfig> groupConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||||
groupConfigLambdaQueryWrapper.eq(GroupConfig::getNamespaceId, queryVO.getNamespaceId());
|
groupConfigLambdaQueryWrapper.eq(GroupConfig::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId());
|
||||||
if (StrUtil.isNotBlank(queryVO.getGroupName())) {
|
if (StrUtil.isNotBlank(queryVO.getGroupName())) {
|
||||||
groupConfigLambdaQueryWrapper.like(GroupConfig::getGroupName, queryVO.getGroupName() + "%");
|
groupConfigLambdaQueryWrapper.like(GroupConfig::getGroupName, queryVO.getGroupName() + "%");
|
||||||
}
|
}
|
||||||
@ -172,10 +176,11 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
return pageResult;
|
return pageResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doSaveGroupConfig(GroupConfigRequestVO groupConfigRequestVO) {
|
private void doSaveGroupConfig(UserSessionVO systemUser, GroupConfigRequestVO groupConfigRequestVO) {
|
||||||
GroupConfig groupConfig = GroupConfigConverter.INSTANCE.convert(groupConfigRequestVO);
|
GroupConfig groupConfig = GroupConfigConverter.INSTANCE.convert(groupConfigRequestVO);
|
||||||
groupConfig.setCreateDt(LocalDateTime.now());
|
groupConfig.setCreateDt(LocalDateTime.now());
|
||||||
groupConfig.setVersion(1);
|
groupConfig.setVersion(1);
|
||||||
|
groupConfig.setNamespaceId(systemUser.getNamespaceId());
|
||||||
groupConfig.setGroupName(groupConfigRequestVO.getGroupName());
|
groupConfig.setGroupName(groupConfigRequestVO.getGroupName());
|
||||||
groupConfig.setDescription(Optional.ofNullable(groupConfigRequestVO.getDescription()).orElse(StrUtil.EMPTY));
|
groupConfig.setDescription(Optional.ofNullable(groupConfigRequestVO.getDescription()).orElse(StrUtil.EMPTY));
|
||||||
if (Objects.isNull(groupConfigRequestVO.getGroupPartition())) {
|
if (Objects.isNull(groupConfigRequestVO.getGroupPartition())) {
|
||||||
@ -236,7 +241,7 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<GroupConfigResponseVO> getAllGroupNameList(final List<String> namespaceId) {
|
public List<GroupConfigResponseVO> getAllGroupConfigList(final List<String> namespaceId) {
|
||||||
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
ConfigAccess<GroupConfig> groupConfigAccess = accessTemplate.getGroupConfigAccess();
|
||||||
|
|
||||||
List<GroupConfig> groupConfigs = groupConfigAccess.list(new LambdaQueryWrapper<GroupConfig>()
|
List<GroupConfig> groupConfigs = groupConfigAccess.list(new LambdaQueryWrapper<GroupConfig>()
|
||||||
@ -246,4 +251,16 @@ public class GroupConfigServiceImpl implements GroupConfigService {
|
|||||||
return GroupConfigResponseVOConverter.INSTANCE.toGroupConfigResponseVO(groupConfigs);
|
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.config.SystemProperties;
|
||||||
import com.aizuda.easy.retry.server.common.exception.EasyRetryServerException;
|
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.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.server.web.service.convert.NamespaceResponseVOConverter;
|
||||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.NamespaceMapper;
|
import com.aizuda.easy.retry.template.datasource.persistence.mapper.NamespaceMapper;
|
||||||
import com.aizuda.easy.retry.template.datasource.persistence.mapper.SystemUserMapper;
|
import com.aizuda.easy.retry.template.datasource.persistence.mapper.SystemUserMapper;
|
||||||
@ -76,20 +77,20 @@ public class SystemUserServiceImpl implements SystemUserService {
|
|||||||
systemUserResponseVO.setToken(token);
|
systemUserResponseVO.setToken(token);
|
||||||
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
||||||
|
|
||||||
getPermission(systemUser, systemUserResponseVO);
|
getPermission(systemUser.getRole(), systemUser.getId(), systemUserResponseVO);
|
||||||
|
|
||||||
return 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<>();
|
LambdaQueryWrapper<Namespace> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.select(Namespace::getId, Namespace::getUniqueId, Namespace::getName);
|
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(
|
List<SystemUserPermission> systemUserPermissions = systemUserPermissionMapper.selectList(
|
||||||
new LambdaQueryWrapper<SystemUserPermission>()
|
new LambdaQueryWrapper<SystemUserPermission>()
|
||||||
.select(SystemUserPermission::getNamespaceId)
|
.select(SystemUserPermission::getNamespaceId)
|
||||||
.eq(SystemUserPermission::getSystemUserId, systemUser.getId())
|
.eq(SystemUserPermission::getSystemUserId, userId)
|
||||||
.groupBy(SystemUserPermission::getNamespaceId));
|
.groupBy(SystemUserPermission::getNamespaceId));
|
||||||
queryWrapper.in(Namespace::getId, systemUserPermissions.stream()
|
queryWrapper.in(Namespace::getId, systemUserPermissions.stream()
|
||||||
.map(SystemUserPermission::getNamespaceId).collect(Collectors.toList()));
|
.map(SystemUserPermission::getNamespaceId).collect(Collectors.toList()));
|
||||||
@ -101,11 +102,11 @@ public class SystemUserServiceImpl implements SystemUserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SystemUserResponseVO getUserInfo(SystemUser systemUser) {
|
public SystemUserResponseVO getUserInfo(UserSessionVO systemUser) {
|
||||||
SystemUserResponseVO systemUserResponseVO = SystemUserResponseVOConverter.INSTANCE.convert(systemUser);
|
SystemUserResponseVO systemUserResponseVO = SystemUserResponseVOConverter.INSTANCE.convert(systemUser);
|
||||||
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
systemUserResponseVO.setMode(systemProperties.getMode().name());
|
||||||
|
|
||||||
getPermission(systemUser, systemUserResponseVO);
|
getPermission(systemUser.getRole(), systemUser.getId(), systemUserResponseVO);
|
||||||
|
|
||||||
return systemUserResponseVO;
|
return systemUserResponseVO;
|
||||||
}
|
}
|
||||||
@ -227,7 +228,9 @@ public class SystemUserServiceImpl implements SystemUserService {
|
|||||||
throw new EasyRetryServerException("用户不存在");
|
throw new EasyRetryServerException("用户不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
return getUserInfo(systemUser);
|
SystemUserResponseVO responseVO = SystemUserResponseVOConverter.INSTANCE.convert(systemUser);
|
||||||
|
getPermission(systemUser.getRole(), systemUser.getId(), responseVO);
|
||||||
|
return responseVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -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) {
|
export function addNamespace (data) {
|
||||||
return request({
|
return request({
|
||||||
url: api.addNamespace,
|
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>
|
<template>
|
||||||
<div :class="wrpCls">
|
<div :class="wrpCls">
|
||||||
<a-dropdown>
|
<Namespace/>
|
||||||
<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>
|
|
||||||
<a href="https://www.easyretry.com" target="_blank" :class="prefixCls"><a-icon type="question-circle" :style="{ fontSize: '18px', color: '#08c' }"/></a>
|
<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"/>
|
<avatar-dropdown :menu="showMenu" :current-user="currentUser" :class="prefixCls"/>
|
||||||
<!-- <select-lang :class="prefixCls" />-->
|
<!-- <select-lang :class="prefixCls" />-->
|
||||||
@ -25,12 +10,14 @@
|
|||||||
<script>
|
<script>
|
||||||
import AvatarDropdown from './AvatarDropdown'
|
import AvatarDropdown from './AvatarDropdown'
|
||||||
import SelectLang from '@/components/SelectLang'
|
import SelectLang from '@/components/SelectLang'
|
||||||
|
import Namespace from '@/components/GlobalHeader/Namespace'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'RightContent',
|
name: 'RightContent',
|
||||||
components: {
|
components: {
|
||||||
AvatarDropdown,
|
AvatarDropdown,
|
||||||
SelectLang
|
SelectLang,
|
||||||
|
Namespace
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
prefixCls: {
|
prefixCls: {
|
||||||
|
@ -10,7 +10,8 @@ const getters = {
|
|||||||
roles: state => state.user.roles,
|
roles: state => state.user.roles,
|
||||||
userInfo: state => state.user.info,
|
userInfo: state => state.user.info,
|
||||||
addRouters: state => state.permission.addRouters,
|
addRouters: state => state.permission.addRouters,
|
||||||
multiTab: state => state.app.multiTab
|
multiTab: state => state.app.multiTab,
|
||||||
|
namespaces: state => state.user.namespaces
|
||||||
}
|
}
|
||||||
|
|
||||||
export default getters
|
export default getters
|
||||||
|
@ -10,7 +10,8 @@ const user = {
|
|||||||
welcome: '',
|
welcome: '',
|
||||||
avatar: '',
|
avatar: '',
|
||||||
roles: [],
|
roles: [],
|
||||||
info: {}
|
info: {},
|
||||||
|
namespaces: []
|
||||||
},
|
},
|
||||||
|
|
||||||
mutations: {
|
mutations: {
|
||||||
@ -29,6 +30,9 @@ const user = {
|
|||||||
},
|
},
|
||||||
SET_INFO: (state, info) => {
|
SET_INFO: (state, info) => {
|
||||||
state.info = info
|
state.info = info
|
||||||
|
},
|
||||||
|
SET_NAMESPACES: (state, namespaces) => {
|
||||||
|
state.namespaces = namespaces
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -56,6 +60,8 @@ const user = {
|
|||||||
permissions: permissionsConfig(result.role, result.mode)
|
permissions: permissionsConfig(result.role, result.mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
commit('SET_NAMESPACES', result.namespaceIdList)
|
||||||
|
|
||||||
if (result.role && result.role.permissions.length > 0) {
|
if (result.role && result.role.permissions.length > 0) {
|
||||||
const role = result.role
|
const role = result.role
|
||||||
role.permissions = result.role.permissions
|
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 storage from 'store'
|
||||||
import notification from 'ant-design-vue/es/notification'
|
import notification from 'ant-design-vue/es/notification'
|
||||||
import { VueAxios } from './axios'
|
import { VueAxios } from './axios'
|
||||||
import { ACCESS_TOKEN } from '@/store/mutation-types'
|
import { ACCESS_TOKEN, APP_NAMESPACE } from '@/store/mutation-types'
|
||||||
|
|
||||||
// 创建 axios 实例
|
// 创建 axios 实例
|
||||||
const request = axios.create({
|
const request = axios.create({
|
||||||
@ -44,11 +44,16 @@ const errorHandler = (error) => {
|
|||||||
// request interceptor
|
// request interceptor
|
||||||
request.interceptors.request.use(config => {
|
request.interceptors.request.use(config => {
|
||||||
const token = storage.get(ACCESS_TOKEN)
|
const token = storage.get(ACCESS_TOKEN)
|
||||||
|
const namespaceId = storage.get(APP_NAMESPACE)
|
||||||
// 如果 token 存在
|
// 如果 token 存在
|
||||||
// 让每个请求携带自定义 token 请根据实际情况自行修改
|
// 让每个请求携带自定义 token 请根据实际情况自行修改
|
||||||
if (token) {
|
if (token) {
|
||||||
config.headers['EASY-RETRY-AUTH'] = token
|
config.headers['EASY-RETRY-AUTH'] = token
|
||||||
}
|
}
|
||||||
|
if (namespaceId) {
|
||||||
|
config.headers['EASY-RETRY-NAMESPACE-ID'] = namespaceId
|
||||||
|
}
|
||||||
|
|
||||||
return config
|
return config
|
||||||
}, errorHandler)
|
}, errorHandler)
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ export default {
|
|||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
this.form.validateFields((err, values) => {
|
this.form.validateFields((err, values) => {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
if (this.formType === 'create') {
|
if (!this.isEdit) {
|
||||||
addNamespace(values).then(res => {
|
addNamespace(values).then(res => {
|
||||||
this.$message.success('操作成功')
|
this.$message.success('操作成功')
|
||||||
this.$emit('refreshTable', 1)
|
this.$emit('refreshTable', 1)
|
||||||
|
Loading…
Reference in New Issue
Block a user