feat:2.5.0

1. 完成组配置页面
2. 完成不同空间的切换
3. 新增登录用户工具类
This commit is contained in:
byteblogs168 2023-11-22 23:47:33 +08:00
parent db1aab3bbd
commit 9603dd30c7
23 changed files with 225 additions and 88 deletions

View File

@ -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 '步长',

View File

@ -35,6 +35,8 @@ public class SequenceAlloc implements Serializable {
*/ */
private String groupName; private String groupName;
private String namespaceId;
/** /**
* 最大id * 最大id
*/ */

View File

@ -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

View File

@ -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);
} }

View File

@ -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();

View File

@ -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;
} }

View File

@ -22,9 +22,4 @@ public class GroupConfigQueryVO extends BaseQueryVO {
@NotNull(message = "组状态不能为空") @NotNull(message = "组状态不能为空")
private Integer groupStatus; private Integer groupStatus;
/**
* 命名空间id
*/
private Long namespaceId;
} }

View File

@ -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;

View File

@ -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;
}

View File

@ -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();
} }

View File

@ -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);

View File

@ -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);

View File

@ -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,14 +241,26 @@ 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>()
.in(GroupConfig::getNamespaceId, namespaceId) .in(GroupConfig::getNamespaceId, namespaceId)
.select(GroupConfig::getGroupName, GroupConfig::getNamespaceId)).stream() .select(GroupConfig::getGroupName, GroupConfig::getNamespaceId)).stream()
.collect(Collectors.toList()); .collect(Collectors.toList());
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());
}
} }

View File

@ -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;
@ -61,7 +62,7 @@ public class SystemUserServiceImpl implements SystemUserService {
public SystemUserResponseVO login(SystemUserRequestVO requestVO) { public SystemUserResponseVO login(SystemUserRequestVO requestVO) {
SystemUser systemUser = systemUserMapper.selectOne( SystemUser systemUser = systemUserMapper.selectOne(
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername())); new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
if (Objects.isNull(systemUser)) { if (Objects.isNull(systemUser)) {
throw new EasyRetryServerException("用户名或密码错误"); throw new EasyRetryServerException("用户名或密码错误");
} }
@ -76,36 +77,36 @@ 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()));
} }
List<Namespace> namespaces = namespaceMapper.selectList(queryWrapper); List<Namespace> namespaces = namespaceMapper.selectList(queryWrapper);
systemUserResponseVO.setNamespaceIdList( systemUserResponseVO.setNamespaceIdList(
NamespaceResponseVOConverter.INSTANCE.toNamespaceResponseVOs(namespaces)); NamespaceResponseVOConverter.INSTANCE.toNamespaceResponseVOs(namespaces));
} }
@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;
} }
@ -114,7 +115,7 @@ public class SystemUserServiceImpl implements SystemUserService {
@Transactional @Transactional
public void addUser(SystemUserRequestVO requestVO) { public void addUser(SystemUserRequestVO requestVO) {
long count = systemUserMapper.selectCount( long count = systemUserMapper.selectCount(
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername())); new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
if (count > 0) { if (count > 0) {
throw new EasyRetryServerException("该用户已存在"); throw new EasyRetryServerException("该用户已存在");
} }
@ -138,7 +139,7 @@ public class SystemUserServiceImpl implements SystemUserService {
systemUserPermission.setGroupName(permission.getGroupName()); systemUserPermission.setGroupName(permission.getGroupName());
systemUserPermission.setNamespaceId(permission.getNamespaceId()); systemUserPermission.setNamespaceId(permission.getNamespaceId());
Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission),
() -> new EasyRetryServerException("新增用户权限失败")); () -> new EasyRetryServerException("新增用户权限失败"));
} }
} }
@ -147,14 +148,14 @@ public class SystemUserServiceImpl implements SystemUserService {
@Transactional @Transactional
public void update(SystemUserRequestVO requestVO) { public void update(SystemUserRequestVO requestVO) {
SystemUser systemUser = systemUserMapper.selectOne( SystemUser systemUser = systemUserMapper.selectOne(
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getId, requestVO.getId())); new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getId, requestVO.getId()));
if (Objects.isNull(systemUser)) { if (Objects.isNull(systemUser)) {
throw new EasyRetryServerException("该用户不存在"); throw new EasyRetryServerException("该用户不存在");
} }
if (!systemUser.getUsername().equals(requestVO.getUsername())) { if (!systemUser.getUsername().equals(requestVO.getUsername())) {
long count = systemUserMapper.selectCount( long count = systemUserMapper.selectCount(
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername())); new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, requestVO.getUsername()));
if (count > 0) { if (count > 0) {
throw new EasyRetryServerException("该用户已存在"); throw new EasyRetryServerException("该用户已存在");
} }
@ -176,7 +177,7 @@ public class SystemUserServiceImpl implements SystemUserService {
} }
systemUserPermissionMapper.delete(new LambdaQueryWrapper<SystemUserPermission>() systemUserPermissionMapper.delete(new LambdaQueryWrapper<SystemUserPermission>()
.eq(SystemUserPermission::getSystemUserId, systemUser.getId())); .eq(SystemUserPermission::getSystemUserId, systemUser.getId()));
for (UserPermissionRequestVO permission : permissions) { for (UserPermissionRequestVO permission : permissions) {
SystemUserPermission systemUserPermission = new SystemUserPermission(); SystemUserPermission systemUserPermission = new SystemUserPermission();
@ -184,7 +185,7 @@ public class SystemUserServiceImpl implements SystemUserService {
systemUserPermission.setGroupName(permission.getGroupName()); systemUserPermission.setGroupName(permission.getGroupName());
systemUserPermission.setNamespaceId(permission.getNamespaceId()); systemUserPermission.setNamespaceId(permission.getNamespaceId());
Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission), Assert.isTrue(1 == systemUserPermissionMapper.insert(systemUserPermission),
() -> new EasyRetryServerException("更新用户权限失败")); () -> new EasyRetryServerException("更新用户权限失败"));
} }
} }
@ -199,22 +200,22 @@ public class SystemUserServiceImpl implements SystemUserService {
} }
userPageDTO = systemUserMapper.selectPage(userPageDTO, userPageDTO = systemUserMapper.selectPage(userPageDTO,
systemUserLambdaQueryWrapper.orderByDesc(SystemUser::getId)); systemUserLambdaQueryWrapper.orderByDesc(SystemUser::getId));
List<SystemUserResponseVO> userResponseVOList = SystemUserResponseVOConverter.INSTANCE.batchConvert( List<SystemUserResponseVO> userResponseVOList = SystemUserResponseVOConverter.INSTANCE.batchConvert(
userPageDTO.getRecords()); userPageDTO.getRecords());
userResponseVOList.stream() userResponseVOList.stream()
.filter(systemUserResponseVO -> systemUserResponseVO.getRole().equals(RoleEnum.USER.getRoleId())) .filter(systemUserResponseVO -> systemUserResponseVO.getRole().equals(RoleEnum.USER.getRoleId()))
.forEach(systemUserResponseVO -> { .forEach(systemUserResponseVO -> {
List<SystemUserPermission> systemUserPermissionList = systemUserPermissionMapper.selectList( List<SystemUserPermission> systemUserPermissionList = systemUserPermissionMapper.selectList(
new LambdaQueryWrapper<SystemUserPermission>() new LambdaQueryWrapper<SystemUserPermission>()
.select(SystemUserPermission::getGroupName) .select(SystemUserPermission::getGroupName)
.eq(SystemUserPermission::getSystemUserId, systemUserResponseVO.getId())); .eq(SystemUserPermission::getSystemUserId, systemUserResponseVO.getId()));
systemUserResponseVO.setGroupNameList(systemUserPermissionList.stream() systemUserResponseVO.setGroupNameList(systemUserPermissionList.stream()
.map(SystemUserPermission::getGroupName).collect(Collectors.toList())); .map(SystemUserPermission::getGroupName).collect(Collectors.toList()));
}); });
return new PageResult<>(userPageDTO, userResponseVOList); return new PageResult<>(userPageDTO, userResponseVOList);
} }
@ -222,12 +223,14 @@ public class SystemUserServiceImpl implements SystemUserService {
@Override @Override
public SystemUserResponseVO getSystemUserByUserName(String username) { public SystemUserResponseVO getSystemUserByUserName(String username) {
SystemUser systemUser = systemUserMapper.selectOne( SystemUser systemUser = systemUserMapper.selectOne(
new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, username)); new LambdaQueryWrapper<SystemUser>().eq(SystemUser::getUsername, username));
if (Objects.isNull(systemUser)) { if (Objects.isNull(systemUser)) {
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
@ -241,7 +244,7 @@ public class SystemUserServiceImpl implements SystemUserService {
private String getToken(SystemUser systemUser) { private String getToken(SystemUser systemUser) {
String sign = systemUser.getPassword(); String sign = systemUser.getPassword();
return JWT.create().withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME)) return JWT.create().withExpiresAt(new Date(System.currentTimeMillis() + EXPIRE_TIME))
.withAudience(JsonUtil.toJsonString(SystemUserResponseVOConverter.INSTANCE.convert(systemUser))) .withAudience(JsonUtil.toJsonString(SystemUserResponseVOConverter.INSTANCE.convert(systemUser)))
.sign(Algorithm.HMAC256(sign)); .sign(Algorithm.HMAC256(sign));
} }
} }

View File

@ -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");
}
}

View File

@ -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,

View 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>

View File

@ -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: {

View File

@ -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

View File

@ -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

View 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

View File

@ -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)

View File

@ -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)