diff --git a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/ActivePodQuantityResponseDO.java b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/ActivePodQuantityResponseDO.java
new file mode 100644
index 00000000..6ab59e94
--- /dev/null
+++ b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/dataobject/ActivePodQuantityResponseDO.java
@@ -0,0 +1,17 @@
+package com.aizuda.easy.retry.template.datasource.persistence.dataobject;
+
+import lombok.Data;
+
+/**
+ * @author: xiaowoniu
+ * @date : 2022-04-23 10:39
+ * @since : 2.5.0
+ */
+@Data
+public class ActivePodQuantityResponseDO {
+
+ private Long total;
+
+ private Integer nodeType;
+
+}
diff --git a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/ServerNodeMapper.java b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/ServerNodeMapper.java
index 72af75af..0f93dbd3 100644
--- a/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/ServerNodeMapper.java
+++ b/easy-retry-datasource/easy-retry-datasource-template/src/main/java/com/aizuda/easy/retry/template/datasource/persistence/mapper/ServerNodeMapper.java
@@ -1,5 +1,6 @@
package com.aizuda.easy.retry.template.datasource.persistence.mapper;
+import com.aizuda.easy.retry.template.datasource.persistence.dataobject.ActivePodQuantityResponseDO;
import com.aizuda.easy.retry.template.datasource.persistence.po.ServerNode;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@@ -16,4 +17,6 @@ public interface ServerNodeMapper extends BaseMapper<ServerNode> {
int deleteByExpireAt(@Param("endTime") LocalDateTime endTime);
+ List<ActivePodQuantityResponseDO> countActivePod(@Param("namespaceId") String namespaceId);
+
}
diff --git a/easy-retry-datasource/easy-retry-mariadb-datasource/src/main/resources/mariadb/mapper/ServerNodeMapper.xml b/easy-retry-datasource/easy-retry-mariadb-datasource/src/main/resources/mariadb/mapper/ServerNodeMapper.xml
index bb113548..066cb7dc 100644
--- a/easy-retry-datasource/easy-retry-mariadb-datasource/src/main/resources/mariadb/mapper/ServerNodeMapper.xml
+++ b/easy-retry-datasource/easy-retry-mariadb-datasource/src/main/resources/mariadb/mapper/ServerNodeMapper.xml
@@ -33,4 +33,9 @@
delete from server_node
where expire_at <= #{endTime,jdbcType=TIMESTAMP}
</delete>
+ <select id="countActivePod" resultType="com.aizuda.easy.retry.template.datasource.persistence.dataobject.ActivePodQuantityResponseDO">
+ SELECT node_type as nodeType, count(*) as total
+ from server_node
+ GROUP BY node_type
+ </select>
</mapper>
diff --git a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/ServerNodeMapper.xml b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/ServerNodeMapper.xml
index 60e21271..ce01502b 100644
--- a/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/ServerNodeMapper.xml
+++ b/easy-retry-datasource/easy-retry-mysql-datasource/src/main/resources/mysql/mapper/ServerNodeMapper.xml
@@ -34,4 +34,10 @@
delete from server_node
where expire_at <= #{endTime,jdbcType=TIMESTAMP}
</delete>
+ <select id="countActivePod"
+ resultType="com.aizuda.easy.retry.template.datasource.persistence.dataobject.ActivePodQuantityResponseDO">
+ SELECT node_type as nodeType, count(*) as total
+ from server_node
+ GROUP BY node_type
+ </select>
</mapper>
diff --git a/easy-retry-datasource/easy-retry-postgres-datasource/src/main/resources/postgres/mapper/ServerNodeMapper.xml b/easy-retry-datasource/easy-retry-postgres-datasource/src/main/resources/postgres/mapper/ServerNodeMapper.xml
index 2d61198b..91c6820b 100644
--- a/easy-retry-datasource/easy-retry-postgres-datasource/src/main/resources/postgres/mapper/ServerNodeMapper.xml
+++ b/easy-retry-datasource/easy-retry-postgres-datasource/src/main/resources/postgres/mapper/ServerNodeMapper.xml
@@ -1,40 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.aizuda.easy.retry.template.datasource.persistence.mapper.ServerNodeMapper">
- <resultMap id="BaseResultMap" type="com.aizuda.easy.retry.template.datasource.persistence.po.ServerNode">
- <id column="id" jdbcType="BIGINT" property="id" />
- <result column="group_name" jdbcType="VARCHAR" property="groupName" />
- <result column="host_id" jdbcType="VARCHAR" property="hostId" />
- <result column="host_ip" jdbcType="VARCHAR" property="hostIp" />
- <result column="host_port" jdbcType="INTEGER" property="hostPort" />
- <result column="expire_at" jdbcType="TIMESTAMP" property="expireAt" />
- <result column="node_type" jdbcType="TINYINT" property="nodeType" />
- <result column="context_path" jdbcType="VARCHAR" property="contextPath" />
- <result column="ext_attrs" jdbcType="VARCHAR" property="extAttrs" />
- <result column="create_dt" jdbcType="TIMESTAMP" property="createDt" />
- <result column="update_dt" jdbcType="TIMESTAMP" property="updateDt" />
- </resultMap>
- <sql id="Base_Column_List">
- id, group_name, context_path, host_id, host_ip, host_port, expire_at, node_type,create_dt,update_dt
- </sql>
- <insert id="insertOrUpdate" parameterType="com.aizuda.easy.retry.template.datasource.persistence.po.ServerNode" useGeneratedKeys="true" keyProperty="id">
- INSERT INTO server_node (group_name, host_id, host_ip, host_port,
- expire_at, node_type, ext_attrs, context_path, create_dt)
- VALUES (#{groupName}, #{hostId}, #{hostIp}, #{hostPort},
- #{expireAt}, #{nodeType}, #{extAttrs}, #{contextPath}, #{createDt})
- ON CONFLICT (host_id, host_ip) DO UPDATE SET
- group_name = EXCLUDED.group_name,
- host_id = EXCLUDED.host_id,
- host_ip = EXCLUDED.host_ip,
- host_port = EXCLUDED.host_port,
- expire_at = EXCLUDED.expire_at,
- node_type = EXCLUDED.node_type,
- ext_attrs = EXCLUDED.ext_attrs,
- context_path = EXCLUDED.context_path,
- create_dt = EXCLUDED.create_dt
- </insert>
- <delete id="deleteByExpireAt">
- delete from server_node
- where expire_at <= #{endTime,jdbcType=TIMESTAMP}
- </delete>
+ <resultMap id="BaseResultMap" type="com.aizuda.easy.retry.template.datasource.persistence.po.ServerNode">
+ <id column="id" jdbcType="BIGINT" property="id"/>
+ <result column="group_name" jdbcType="VARCHAR" property="groupName"/>
+ <result column="host_id" jdbcType="VARCHAR" property="hostId"/>
+ <result column="host_ip" jdbcType="VARCHAR" property="hostIp"/>
+ <result column="host_port" jdbcType="INTEGER" property="hostPort"/>
+ <result column="expire_at" jdbcType="TIMESTAMP" property="expireAt"/>
+ <result column="node_type" jdbcType="TINYINT" property="nodeType"/>
+ <result column="context_path" jdbcType="VARCHAR" property="contextPath"/>
+ <result column="ext_attrs" jdbcType="VARCHAR" property="extAttrs"/>
+ <result column="create_dt" jdbcType="TIMESTAMP" property="createDt"/>
+ <result column="update_dt" jdbcType="TIMESTAMP" property="updateDt"/>
+ </resultMap>
+ <sql id="Base_Column_List">
+ id, group_name, context_path, host_id, host_ip, host_port, expire_at, node_type,create_dt,update_dt
+ </sql>
+ <insert id="insertOrUpdate" parameterType="com.aizuda.easy.retry.template.datasource.persistence.po.ServerNode"
+ useGeneratedKeys="true" keyProperty="id">
+ INSERT INTO server_node (group_name, host_id, host_ip, host_port,
+ expire_at, node_type, ext_attrs, context_path, create_dt)
+ VALUES (#{groupName}, #{hostId}, #{hostIp}, #{hostPort},
+ #{expireAt}, #{nodeType}, #{extAttrs}, #{contextPath}, #{createDt})
+ ON CONFLICT (host_id, host_ip) DO UPDATE SET expire_at = EXCLUDED.expire_at
+
+ </insert>
+ <delete id="deleteByExpireAt">
+ delete
+ from server_node
+ where expire_at <= #{endTime,jdbcType=TIMESTAMP}
+ </delete>
+ <select id="countActivePod"
+ resultType="com.aizuda.easy.retry.template.datasource.persistence.dataobject.ActivePodQuantityResponseDO">
+ SELECT node_type as nodeType, count(*) as total
+ from server_node
+ GROUP BY node_type
+ </select>
</mapper>
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/GroupConfigController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/GroupConfigController.java
index 85b4db59..92afbd05 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/GroupConfigController.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/GroupConfigController.java
@@ -43,13 +43,13 @@ public class GroupConfigController {
return groupConfigService.addGroup(systemUser, groupConfigRequestVO);
}
- @LoginRequired
+ @LoginRequired(role = RoleEnum.ADMIN)
@PutMapping("")
public Boolean updateGroup(@RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
return groupConfigService.updateGroup(groupConfigRequestVO);
}
- @LoginRequired
+ @LoginRequired(role = RoleEnum.ADMIN)
@PutMapping("status")
public Boolean updateGroupStatus(@RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) {
String groupName = groupConfigRequestVO.getGroupName();
@@ -81,19 +81,19 @@ public class GroupConfigController {
return groupConfigService.getAllGroupNameList();
}
- @Deprecated
@LoginRequired
- @GetMapping("/partition")
- public Integer getTotalPartition() {
- // 组分区从0开始,所以是最大值减一
- return systemProperties.getTotalPartition() - 1;
+ @GetMapping("/on-line/pods/{groupName}")
+ public List<String> getOnlinePods(@PathVariable("groupName") String groupName) {
+ return groupConfigService.getOnlinePods(groupName);
}
- @LoginRequired
+ @LoginRequired(role = RoleEnum.ADMIN)
@GetMapping("/partition-table/list")
public List<Integer> getTablePartitionList() {
// https://gitee.com/aizuda/easy-retry/issues/I8DAMH
List<String> tableList = jdbcTemplate.queryForList("SHOW TABLES LIKE 'retry_task_%'", String.class);
return tableList.stream().map(ReUtil::getFirstNumber).filter(i -> !Objects.isNull(i) && i <= systemProperties.getTotalPartition()).distinct().collect(Collectors.toList());
}
+
+
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/NamespaceController.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/NamespaceController.java
index 5ff593ef..810d39b0 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/NamespaceController.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/controller/NamespaceController.java
@@ -1,5 +1,7 @@
package com.aizuda.easy.retry.server.web.controller;
+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.model.base.PageResult;
import com.aizuda.easy.retry.server.web.model.request.NamespaceQueryVO;
import com.aizuda.easy.retry.server.web.model.request.NamespaceRequestVO;
@@ -23,26 +25,31 @@ public class NamespaceController {
@Autowired
private NamespaceService namespaceService;
+ @LoginRequired(role = RoleEnum.ADMIN)
@PostMapping
public Boolean saveNamespace(@RequestBody @Validated NamespaceRequestVO namespaceRequestVO) {
return namespaceService.saveNamespace(namespaceRequestVO);
}
+ @LoginRequired(role = RoleEnum.ADMIN)
@PutMapping
public Boolean updateNamespace(@RequestBody @Validated NamespaceRequestVO namespaceRequestVO) {
return namespaceService.updateNamespace(namespaceRequestVO);
}
+ @LoginRequired(role = RoleEnum.ADMIN)
@GetMapping("list")
public PageResult<List<NamespaceResponseVO>> getNamespacePage(NamespaceQueryVO queryVO) {
return namespaceService.getNamespacePage(queryVO);
}
+ @LoginRequired(role = RoleEnum.ADMIN)
@DeleteMapping("{id}")
public Boolean deleteNamespace(@PathVariable("id") Long id) {
return namespaceService.deleteNamespace(id);
}
+ @LoginRequired(role = RoleEnum.ADMIN)
@GetMapping("/all")
public List<NamespaceResponseVO> getAllNamespace() {
return namespaceService.getAllNamespace();
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/GroupConfigService.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/GroupConfigService.java
index db372cf0..472b0f5e 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/GroupConfigService.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/GroupConfigService.java
@@ -28,4 +28,5 @@ public interface GroupConfigService {
List<String> getAllGroupNameList();
+ List<String> getOnlinePods(String groupName);
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/DashBoardServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/DashBoardServiceImpl.java
index c0cb5a8c..ca3a00ec 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/DashBoardServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/DashBoardServiceImpl.java
@@ -10,6 +10,8 @@ import com.aizuda.easy.retry.server.common.dto.ServerNodeExtAttrs;
import com.aizuda.easy.retry.server.common.register.ServerRegister;
import com.aizuda.easy.retry.server.web.service.convert.DispatchQuantityResponseVOConverter;
import com.aizuda.easy.retry.server.web.service.convert.SceneQuantityRankResponseVOConverter;
+import com.aizuda.easy.retry.server.web.util.UserSessionUtils;
+import com.aizuda.easy.retry.template.datasource.persistence.dataobject.ActivePodQuantityResponseDO;
import com.aizuda.easy.retry.template.datasource.persistence.dataobject.DispatchQuantityResponseDO;
import com.aizuda.easy.retry.template.datasource.persistence.dataobject.SceneQuantityRankResponseDO;
import com.aizuda.easy.retry.template.datasource.persistence.mapper.RetryTaskLogMapper;
@@ -32,6 +34,7 @@ import com.aizuda.easy.retry.server.web.model.response.SceneQuantityRankResponse
import com.aizuda.easy.retry.server.web.model.response.TaskQuantityResponseVO;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
+import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -107,9 +110,15 @@ public class DashBoardServiceImpl implements DashBoardService {
public ActivePodQuantityResponseVO countActivePod() {
ActivePodQuantityResponseVO activePodQuantityResponseVO = new ActivePodQuantityResponseVO();
- activePodQuantityResponseVO.setTotal(serverNodeMapper.selectCount(null));
- activePodQuantityResponseVO.setServerTotal(serverNodeMapper.selectCount(new LambdaQueryWrapper<ServerNode>().eq(ServerNode::getNodeType, NodeTypeEnum.SERVER.getType())));
- activePodQuantityResponseVO.setClientTotal(serverNodeMapper.selectCount(new LambdaQueryWrapper<ServerNode>().eq(ServerNode::getNodeType, NodeTypeEnum.CLIENT.getType())));
+
+ List<ActivePodQuantityResponseDO> activePodQuantityDO = serverNodeMapper.countActivePod(UserSessionUtils.currentUserSession().getNamespaceId());
+ Map<Integer, Long> map = activePodQuantityDO.stream().collect(Collectors.toMap(ActivePodQuantityResponseDO::getNodeType, ActivePodQuantityResponseDO::getTotal));
+ Long clientTotal = map.getOrDefault(NodeTypeEnum.CLIENT.getType(), 0L);
+ Long serverTotal = map.getOrDefault(NodeTypeEnum.SERVER.getType(), 0L);
+ activePodQuantityResponseVO.setServerTotal(serverTotal);
+ activePodQuantityResponseVO.setClientTotal(clientTotal);
+
+ activePodQuantityResponseVO.setTotal(clientTotal + serverTotal);
return activePodQuantityResponseVO;
}
@@ -181,6 +190,9 @@ public class DashBoardServiceImpl implements DashBoardService {
PageDTO<ServerNode> pageDTO = new PageDTO<>(queryVO.getPage(), queryVO.getSize());
LambdaQueryWrapper<ServerNode> serverNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
+ serverNodeLambdaQueryWrapper.in(ServerNode::getNamespaceId, Lists.newArrayList(
+ UserSessionUtils.currentUserSession().getNamespaceId(), ServerRegister.NAMESPACE_ID
+ ));
if (StrUtil.isNotBlank(queryVO.getGroupName())) {
serverNodeLambdaQueryWrapper.eq(ServerNode::getGroupName, queryVO.getGroupName());
}
@@ -206,13 +218,13 @@ public class DashBoardServiceImpl implements DashBoardService {
}
ServerNodeExtAttrs serverNodeExtAttrs = JsonUtil
- .parseObject(serverNodeResponseVO.getExtAttrs(), ServerNodeExtAttrs.class);
+ .parseObject(serverNodeResponseVO.getExtAttrs(), ServerNodeExtAttrs.class);
try {
// 从远程节点取
String format = MessageFormat
- .format(URL, serverNodeResponseVO.getHostIp(), serverNodeExtAttrs.getWebPort().toString());
+ .format(URL, serverNodeResponseVO.getHostIp(), serverNodeExtAttrs.getWebPort().toString());
Result<List<Integer>> result = restTemplate.getForObject(format, Result.class);
List<Integer> data = result.getData();
if (!CollectionUtils.isEmpty(data)) {
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/GroupConfigServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/GroupConfigServiceImpl.java
index 65fd389e..c3bc87e1 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/GroupConfigServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/GroupConfigServiceImpl.java
@@ -183,12 +183,6 @@ public class GroupConfigServiceImpl implements GroupConfigService {
records);
for (GroupConfigResponseVO groupConfigResponseVO : responseVOList) {
- List<ServerNode> serverNodes = serverNodeMapper.selectList(
- new LambdaQueryWrapper<ServerNode>().eq(ServerNode::getGroupName,
- groupConfigResponseVO.getGroupName()));
- groupConfigResponseVO.setOnlinePodList(
- serverNodes.stream().map(serverNode -> serverNode.getHostIp() + ":" + serverNode.getHostPort())
- .collect(Collectors.toList()));
Optional.ofNullable(IdGeneratorMode.modeOf(groupConfigResponseVO.getIdGeneratorMode()))
.ifPresent(idGeneratorMode -> {
groupConfigResponseVO.setIdGeneratorModeName(idGeneratorMode.getDesc());
@@ -302,4 +296,14 @@ public class GroupConfigServiceImpl implements GroupConfigService {
return groupConfigs.stream().map(GroupConfig::getGroupName).collect(Collectors.toList());
}
+ @Override
+ public List<String> getOnlinePods(String groupName) {
+ List<ServerNode> serverNodes = serverNodeMapper.selectList(
+ new LambdaQueryWrapper<ServerNode>()
+ .eq(ServerNode::getNamespaceId, UserSessionUtils.currentUserSession().getNamespaceId())
+ .eq(ServerNode::getGroupName, groupName));
+ return serverNodes.stream().map(serverNode -> serverNode.getHostIp() + ":" + serverNode.getHostPort())
+ .collect(Collectors.toList());
+ }
+
}
diff --git a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/NamespaceServiceImpl.java b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/NamespaceServiceImpl.java
index 59c61a56..ff5e51f8 100644
--- a/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/NamespaceServiceImpl.java
+++ b/easy-retry-server/easy-retry-server-web/src/main/java/com/aizuda/easy/retry/server/web/service/impl/NamespaceServiceImpl.java
@@ -39,6 +39,8 @@ public class NamespaceServiceImpl implements NamespaceService {
namespace.setName(namespaceRequestVO.getName());
if (StrUtil.isBlank(namespaceRequestVO.getUniqueId())) {
namespace.setUniqueId(IdUtil.simpleUUID());
+ } else {
+ namespace.setUniqueId(namespaceRequestVO.getUniqueId());
}
return 1 == namespaceMapper.insert(namespace);
}
diff --git a/frontend/src/api/manage.js b/frontend/src/api/manage.js
index 8b2e52ff..456b698d 100644
--- a/frontend/src/api/manage.js
+++ b/frontend/src/api/manage.js
@@ -12,6 +12,7 @@ const api = {
groupConfigByGroupName: `/group`,
allGroupNameList: `/group/all/group-name/list`,
allGroupConfigList: `/group/all/group-config/list`,
+ onlinePods: `/group/on-line/pods/`,
retryTaskPage: '/retry-task/list',
retryTaskById: '/retry-task/',
saveRetryTask: '/retry-task',
@@ -58,6 +59,13 @@ const api = {
export default api
+export function onlinePods (parameter) {
+ return request({
+ url: api.onlinePods + parameter,
+ method: 'get'
+ })
+}
+
export function allGroupConfigList (data) {
return request({
url: api.allGroupConfigList,
diff --git a/frontend/src/config/router.config.js b/frontend/src/config/router.config.js
index aa9da1bf..a9858fbd 100644
--- a/frontend/src/config/router.config.js
+++ b/frontend/src/config/router.config.js
@@ -42,22 +42,40 @@ export const asyncRouterMap = [
path: '/namespace',
name: 'namespace',
component: () => import('@/views/namespace/NamespaceList'),
- meta: { title: '命名空间', icon: 'team', permission: ['group'] }
+ meta: { title: '命名空间', icon: 'team', permission: ['namespace'] }
},
// profile
{
- path: '/basic-config-list',
- name: 'basicConfigList',
- component: () => import('@/views/config/GroupList'),
- meta: { title: '组管理', icon: 'team', permission: ['group'] }
- },
- {
- path: '/basic-config',
- name: 'basicConfig',
- hidden: true,
- component: () => import('@/views/config/basicConfigForm/BasicConfigForm'),
- meta: { title: '基础信息配置', hidden: true, hideChildrenInMenu: true, icon: 'profile', permission: ['basicConfig'] }
+ path: '/group',
+ name: 'GroupConfigList',
+ component: RouteView,
+ hideChildrenInMenu: true,
+ redirect: '/group/list',
+ meta: { title: '组管理', hideChildrenInMenu: true, icon: 'team', permission: ['group'] },
+ children: [
+ {
+ path: '/group/list',
+ name: 'basicConfigList',
+ component: () => import('@/views/config/GroupList'),
+ meta: { title: '组配置列表', hidden: true, icon: 'team', permission: ['group'] }
+ },
+ {
+ path: '/group/config',
+ name: 'GroupConfig',
+ hidden: true,
+ component: () => import('@/views/config/basicConfigForm/BasicConfigForm'),
+ meta: { title: '组信息配置', hidden: true, hideChildrenInMenu: true, icon: 'profile', permission: ['group'] }
+ },
+ {
+ path: '/group/info',
+ name: 'GroupInfo',
+ hidden: true,
+ component: () => import('@/views/config/GroupInfo'),
+ meta: { title: '组配置详情', hidden: true, hideChildrenInMenu: true, icon: 'profile', permission: ['group'] }
+ }
+ ]
},
+
{
path: '/retry',
name: 'RetryTask',
diff --git a/frontend/src/core/permission/permission.js b/frontend/src/core/permission/permission.js
index 75050dd4..2c7eac82 100644
--- a/frontend/src/core/permission/permission.js
+++ b/frontend/src/core/permission/permission.js
@@ -27,18 +27,13 @@ function plugin (Vue) {
const [permission, action] = permissions.split('.')
const permissionList = _this.$store.getters.roles.permissions
- const actionList = permissionList.find((val) => {
+ return permissionList.find((val) => {
return val.permissionId === permission
- }).actionList
- if (actionList) {
- return actionList.findIndex((val) => {
+ }).actionList.findIndex((val) => {
console.log(val)
console.log(action)
return val === action
}) > -1
- } else {
- return true
- }
}
}
}
diff --git a/frontend/src/store/modules/user.js b/frontend/src/store/modules/user.js
index 2ba06563..f269104c 100644
--- a/frontend/src/store/modules/user.js
+++ b/frontend/src/store/modules/user.js
@@ -72,10 +72,11 @@ const user = {
role.permissions = result.role.permissions
role.permissions.map(per => {
if (per.actionEntitySet != null && per.actionEntitySet.length > 0) {
- const action = per.actionEntitySet.map(action => {
+ per.actionList = (per.actionEntitySet || {}).map(action => {
return action.action
})
- per.actionList = action
+ } else {
+ per.actionList = []
}
})
diff --git a/frontend/src/utils/permissionsConfig.js b/frontend/src/utils/permissionsConfig.js
index d6452d82..f52b01fd 100644
--- a/frontend/src/utils/permissionsConfig.js
+++ b/frontend/src/utils/permissionsConfig.js
@@ -1,255 +1,155 @@
+
+const commonAdmin = [
+ {
+ roleId: 2,
+ permissionId: 'group',
+ permissionName: '组配置',
+ actionEntitySet: [
+ {
+ action: 'add',
+ describe: '新增',
+ defaultCheck: false
+ },
+ {
+ action: 'edit',
+ describe: '更新',
+ defaultCheck: false
+ },
+ {
+ action: 'stop',
+ describe: '停止',
+ defaultCheck: false
+ }
+ ]
+ },
+ {
+ roleId: 2,
+ permissionId: 'user',
+ permissionName: '用户'
+ },
+ {
+ roleId: 2,
+ permissionId: 'userForm',
+ permissionName: '新增或更新用户'
+ },
+ {
+ roleId: 2,
+ permissionId: 'basicConfig',
+ permissionName: '基础信息配置'
+ },
+ {
+ roleId: 1,
+ permissionId: 'namespace',
+ permissionName: '命名空间'
+ }
+]
+const retryAdmin = [
+ {
+ roleId: 2,
+ permissionId: 'dashboard',
+ permissionName: '看板'
+ },
+ {
+ roleId: 2,
+ permissionId: 'retryTask',
+ permissionName: '任务管理'
+ },
+ {
+ roleId: 2,
+ permissionId: 'retryDeadLetter',
+ permissionName: '死信队列管理'
+ },
+ {
+ roleId: 2,
+ permissionId: 'retryLog',
+ permissionName: '重试日志管理'
+ }
+]
+const jobAdmin = [
+ {
+ roleId: 2,
+ permissionId: 'dashboard',
+ permissionName: '看板'
+ },
+ {
+ roleId: 1,
+ permissionId: 'job',
+ permissionName: '定时任务管理',
+ actionEntitySet: [
+ {
+ action: 'del',
+ describe: '新增',
+ defaultCheck: false
+ }
+ ]
+ },
+ {
+ roleId: 1,
+ permissionId: 'jobBatch',
+ permissionName: '任务批次'
+ }
+]
+
+const commonUser = [
+ {
+ roleId: 1,
+ permissionId: 'group',
+ permissionName: '组配置',
+ actionEntitySet: []
+ }
+]
+const retryUser = [
+ {
+ roleId: 1,
+ permissionId: 'dashboard',
+ permissionName: '看板'
+ },
+ {
+ roleId: 1,
+ permissionId: 'retryTask',
+ permissionName: '任务管理'
+ },
+ {
+ roleId: 1,
+ permissionId: 'retryDeadLetter',
+ permissionName: '死信队列管理'
+ },
+ {
+ roleId: 1,
+ permissionId: 'retryLog',
+ permissionName: '重试日志管理'
+ }
+]
+const jobUser = [
+ {
+ roleId: 1,
+ permissionId: 'dashboard',
+ permissionName: '看板'
+ },
+ {
+ roleId: 1,
+ permissionId: 'job',
+ permissionName: '定时任务管理'
+ },
+ {
+ roleId: 1,
+ permissionId: 'jobBatch',
+ permissionName: '任务批次'
+ }
+]
+
const permissionsConfig = {
RETRY: {
- 1: [
- {
- roleId: 1,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: []
- },
- {
- roleId: 1,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 1,
- permissionId: 'retryTask',
- permissionName: '任务管理'
- },
- {
- roleId: 1,
- permissionId: 'retryDeadLetter',
- permissionName: '死信队列管理'
- },
- {
- roleId: 1,
- permissionId: 'retryLog',
- permissionName: '重试日志管理'
- },
- {
- roleId: 1,
- permissionId: 'basicConfig',
- permissionName: '基础信息配置'
- }
- ],
- 2: [
- {
- roleId: 2,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: [
- {
- action: 'add',
- describe: '新增',
- defaultCheck: false
- }
- ]
- },
- {
- roleId: 2,
- permissionId: 'user',
- permissionName: '用户'
- },
- {
- roleId: 2,
- permissionId: 'userForm',
- permissionName: '新增或更新用户'
- },
- {
- roleId: 2,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 2,
- permissionId: 'retryTask',
- permissionName: '任务管理'
- },
- {
- roleId: 2,
- permissionId: 'retryDeadLetter',
- permissionName: '死信队列管理'
- },
- {
- roleId: 2,
- permissionId: 'retryLog',
- permissionName: '重试日志管理'
- },
- {
- roleId: 2,
- permissionId: 'basicConfig',
- permissionName: '基础信息配置'
- }
- ]
+ 1: [...retryUser, ...commonUser],
+ 2: [...retryAdmin, ...commonAdmin]
},
JOB: {
- 1: [
- {
- roleId: 1,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: []
- },
- {
- roleId: 1,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 1,
- permissionId: 'job',
- permissionName: '定时任务管理'
- },
- {
- roleId: 1,
- permissionId: 'jobBatch',
- permissionName: '任务批次'
- }
- ],
- 2: [
- {
- roleId: 2,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: [
- {
- action: 'add',
- describe: '新增',
- defaultCheck: false
- }
- ]
- },
- {
- roleId: 2,
- permissionId: 'user',
- permissionName: '用户'
- },
- {
- roleId: 2,
- permissionId: 'userForm',
- permissionName: '新增或更新用户'
- },
- {
- roleId: 2,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 1,
- permissionId: 'job',
- permissionName: '定时任务管理'
- },
- {
- roleId: 1,
- permissionId: 'jobBatch',
- permissionName: '任务批次'
- }
- ]
+ 1: [...jobUser, ...commonUser],
+ 2: [...jobAdmin, ...commonAdmin]
},
ALL: {
- 1: [
- {
- roleId: 1,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: []
- },
- {
- roleId: 1,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 1,
- permissionId: 'retryTask',
- permissionName: '任务管理'
- },
- {
- roleId: 1,
- permissionId: 'retryDeadLetter',
- permissionName: '死信队列管理'
- },
- {
- roleId: 1,
- permissionId: 'retryLog',
- permissionName: '重试日志管理'
- },
- {
- roleId: 1,
- permissionId: 'basicConfig',
- permissionName: '基础信息配置'
- },
- {
- roleId: 1,
- permissionId: 'job',
- permissionName: '定时任务管理'
- },
- {
- roleId: 1,
- permissionId: 'jobBatch',
- permissionName: '任务批次'
- }
- ],
- 2: [
- {
- roleId: 2,
- permissionId: 'group',
- permissionName: '组配置',
- actionEntitySet: [
- {
- action: 'add',
- describe: '新增',
- defaultCheck: false
- }
- ]
- },
- {
- roleId: 2,
- permissionId: 'user',
- permissionName: '用户'
- },
- {
- roleId: 2,
- permissionId: 'userForm',
- permissionName: '新增或更新用户'
- },
- {
- roleId: 2,
- permissionId: 'dashboard',
- permissionName: '看板'
- },
- {
- roleId: 2,
- permissionId: 'retryTask',
- permissionName: '任务管理'
- },
- {
- roleId: 2,
- permissionId: 'retryDeadLetter',
- permissionName: '死信队列管理'
- },
- {
- roleId: 2,
- permissionId: 'retryLog',
- permissionName: '重试日志管理'
- },
- {
- roleId: 2,
- permissionId: 'basicConfig',
- permissionName: '基础信息配置'
- },
- {
- roleId: 1,
- permissionId: 'job',
- permissionName: '定时任务管理'
- },
- {
- roleId: 1,
- permissionId: 'jobBatch',
- permissionName: '任务批次'
- }
- ]
+ 1: [...retryUser, ...jobUser, ...commonUser],
+ 2: [...retryAdmin, ...jobAdmin, ...commonAdmin]
}
}
diff --git a/frontend/src/views/config/GroupInfo.vue b/frontend/src/views/config/GroupInfo.vue
new file mode 100644
index 00000000..90abd7e8
--- /dev/null
+++ b/frontend/src/views/config/GroupInfo.vue
@@ -0,0 +1,101 @@
+<template>
+ <div>
+ <page-header-wrapper @back="() => $router.replace('/group/list')" style="margin: -24px -1px 0" v-if="showHeader">
+ <div></div>
+ </page-header-wrapper>
+ <a-card :bordered="false" v-if="groupInfo !==null ">
+ <a-descriptions title="通用配置" :column="column" bordered>
+ <a-descriptions-item label="组名称">
+ {{ groupInfo.groupName }}
+ </a-descriptions-item>
+ <a-descriptions-item label="状态">
+ <a-tag :color="groupStatus[groupInfo.groupStatus].color">
+ {{ groupStatus[groupInfo.groupStatus].name }}
+ </a-tag>
+ </a-descriptions-item>
+ <a-descriptions-item label="版本">
+ {{ groupInfo.version }}
+ </a-descriptions-item>
+ <a-descriptions-item label="描述" span="3">
+ {{ groupInfo.description }}
+ </a-descriptions-item>
+ <a-descriptions-item label="OnLine机器" span="3">
+ <a-tag color="blue" v-for="item in podInfo" :key="item">
+ {{ item }}
+ </a-tag>
+ </a-descriptions-item>
+ </a-descriptions>
+ <br/>
+ <a-descriptions title="重试配置" :column="column" bordered>
+ <a-descriptions-item label="ID生成模式">
+ <a-tag :color="idGeneratorMode[groupInfo.idGeneratorMode].color">
+ {{ idGeneratorMode[groupInfo.idGeneratorMode].name }}
+ </a-tag>
+ </a-descriptions-item>
+ <a-descriptions-item label="分区">
+ {{ groupInfo.groupPartition }}
+ </a-descriptions-item>
+ <a-descriptions-item label="初始化场景">
+ <a-tag :color="initScene[groupInfo.initScene].color">
+ {{ initScene[groupInfo.initScene].name }}
+ </a-tag>
+ </a-descriptions-item>
+ </a-descriptions>
+ </a-card>
+ </div>
+</template>
+
+<script>
+import { getGroupConfigByGroupName, onlinePods } from '@/api/manage'
+import enums from '@/utils/retryEnum'
+
+export default {
+ name: 'GroupInfo',
+ components: {
+ },
+ props: {
+ showHeader: {
+ type: Boolean,
+ default: true
+ },
+ column: {
+ type: Number,
+ default: 3
+ }
+ },
+ data () {
+ return {
+ groupInfo: null,
+ podInfo: [],
+ initScene: enums.initScene,
+ groupStatus: enums.groupStatus,
+ idGeneratorMode: enums.idGenMode
+ }
+ },
+ created () {
+ const groupName = this.$route.query.groupName
+ if (groupName) {
+ this.groupConfigDetail(groupName)
+ } else {
+ if (this.showHeader) {
+ this.$router.push({ path: '/404' })
+ }
+ }
+ },
+ methods: {
+ groupConfigDetail (groupName) {
+ getGroupConfigByGroupName(groupName).then(res => {
+ this.groupInfo = res.data
+ })
+
+ onlinePods(groupName).then(res => {
+ this.podInfo = res.data
+ })
+ }
+ }
+}
+</script>
+
+<style scoped lang='less'>
+
+</style>
diff --git a/frontend/src/views/config/GroupList.vue b/frontend/src/views/config/GroupList.vue
index 93d9015b..a857664d 100644
--- a/frontend/src/views/config/GroupList.vue
+++ b/frontend/src/views/config/GroupList.vue
@@ -39,8 +39,8 @@
:rowSelection="options.rowSelection"
:scroll="{ x: 1600 }"
>
- <span slot="serial" slot-scope="text, record">
- {{ record.id }}
+ <span slot="groupName" slot-scope="text, record">
+ <a href="#" @click="handlerOpenDrawer(record)">{{ text }}</a>
</span>
<span slot="groupStatus" slot-scope="text">
<a-tag :color="groupStatus[text].color">
@@ -59,19 +59,35 @@
</span>
<span slot="action" slot-scope="text, record">
<template>
- <a @click="handleEdit(record)">编辑</a>
- <a-divider type="vertical" />
+ <a @click="handleInfo(record)">详情</a>
+ <a-divider type="vertical"/>
+ <a @click="handleEdit(record)" v-if="$auth('group.edit')">编辑</a>
+ <a-divider type="vertical" v-if="$auth('group.edit')"/>
<a-popconfirm
:title="record.groupStatus === 1 ? '是否停用?': '是否启用?'"
ok-text="确定"
cancel-text="取消"
@confirm="handleEditStatus(record)"
+ v-if="$auth('group.stop')"
>
<a href="javascript:;">{{ record.groupStatus === 1 ? '停用': '启用' }}</a>
</a-popconfirm>
</template>
</span>
</s-table>
+
+ <Drawer
+ title="组配置详情"
+ placement="right"
+ :width="800"
+ :visibleAmplify="true"
+ :visible="openDrawer"
+ @closeDrawer="onClose"
+ @handlerAmplify="handleInfo"
+ >
+ <group-info ref="groupInfoRef" :showHeader="false" :column="1"/>
+ </Drawer>
+
</a-card>
</template>
@@ -79,13 +95,16 @@
import AInput from 'ant-design-vue/es/input/Input'
import { getGroupConfigForPage, updateGroupStatus } from '@/api/manage'
-import { STable } from '@/components'
+import { Drawer, STable } from '@/components'
import moment from 'moment'
+import GroupInfo from '@/views/config/GroupInfo.vue'
const enums = require('@/utils/retryEnum')
export default {
name: 'TableListWrapper',
components: {
+ GroupInfo,
+ Drawer,
AInput,
STable
},
@@ -97,13 +116,11 @@ export default {
queryParam: {},
// 表头
columns: [
- {
- title: '#',
- scopedSlots: { customRender: 'serial' }
- },
{
title: '名称',
- dataIndex: 'groupName'
+ dataIndex: 'groupName',
+ scopedSlots: { customRender: 'groupName' }
+
},
{
title: '状态',
@@ -139,11 +156,6 @@ export default {
title: '描述',
dataIndex: 'description'
},
- {
- title: 'OnLine机器',
- dataIndex: 'onlinePodList',
- customRender: (text) => text.toString()
- },
{
title: '操作',
dataIndex: 'action',
@@ -173,7 +185,9 @@ export default {
},
initScene: enums.initScene,
groupStatus: enums.groupStatus,
- idGeneratorMode: enums.idGenMode
+ idGeneratorMode: enums.idGenMode,
+ currentShowRecord: null,
+ openDrawer: false
}
},
created () {
@@ -181,10 +195,14 @@ export default {
},
methods: {
handleNew () {
- this.$router.push('/basic-config')
+ this.$router.push('/group/config')
},
handleEdit (record) {
- this.$router.push({ path: '/basic-config', query: { groupName: record.groupName } })
+ this.$router.push({ path: '/group/config', query: { groupName: record.groupName } })
+ },
+ handleInfo (record) {
+ record = record || this.currentShowRecord
+ this.$router.push({ path: '/group/info', query: { groupName: record.groupName } })
},
toggleAdvanced () {
this.advanced = !this.advanced
@@ -205,6 +223,17 @@ export default {
this.$refs.table.refresh()
}
})
+ },
+ handlerOpenDrawer (record) {
+ this.currentShowRecord = record
+ this.openDrawer = true
+ setTimeout(() => {
+ this.$refs.groupInfoRef.groupConfigDetail(record.groupName)
+ }, 200)
+ },
+ onClose () {
+ this.openDrawer = false
+ this.currentShowRecord = null
}
}
}
diff --git a/frontend/src/views/config/basicConfigForm/BasicConfigForm.vue b/frontend/src/views/config/basicConfigForm/BasicConfigForm.vue
index 63a17c26..7f3b001a 100644
--- a/frontend/src/views/config/basicConfigForm/BasicConfigForm.vue
+++ b/frontend/src/views/config/basicConfigForm/BasicConfigForm.vue
@@ -1,6 +1,6 @@
<template>
<div>
- <page-header-wrapper content="配置组、场景、通知配置" @back="() => $router.go(-1)" style="margin: -24px -1px 0">
+ <page-header-wrapper content="配置组" @back="() => $router.go(-1)" style="margin: -24px -1px 0">
<div></div>
</page-header-wrapper>
<a-card class="card" :bordered="false">
diff --git a/frontend/src/views/job/JobList.vue b/frontend/src/views/job/JobList.vue
index bd3809dc..f3df270c 100644
--- a/frontend/src/views/job/JobList.vue
+++ b/frontend/src/views/job/JobList.vue
@@ -150,6 +150,7 @@
ok-text="删除"
cancel-text="取消"
@confirm="handleDel(record)"
+ v-if="$auth('job.del')"
>
<a href="javascript:;" v-if="record.jobStatus === 0">删除</a>
</a-popconfirm>
diff --git a/frontend/src/views/namespace/NamespaceForm.vue b/frontend/src/views/namespace/NamespaceForm.vue
index a448f3c8..0d9d5440 100644
--- a/frontend/src/views/namespace/NamespaceForm.vue
+++ b/frontend/src/views/namespace/NamespaceForm.vue
@@ -7,11 +7,10 @@
v-decorator="['id']" />
</a-form-item>
<a-form-item
- label="唯一标识"
- v-if="isEdit">
+ label="唯一标识(默认UUID)">
<a-input
placeholder="唯一标识"
- disabled
+ :disabled="isEdit"
v-decorator="[
'uniqueId',
{rules: [{ required: false, message: '请输入空间名称', whitespace: true}]}