summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhangshuai <[email protected]>2024-08-05 15:01:35 +0800
committerzhangshuai <[email protected]>2024-08-05 15:01:35 +0800
commitba87a497bbfe991f292740229f361c10e85e9741 (patch)
tree8d5daf6f494a127c4fd805993481b0c156101a8c
parentaaff0714205fe398c05f91f29f7e8925f3958b80 (diff)
feat: ASW-22 workspace 接口开发
1.workspace 接口开发 2.新增 application delete, edit, add 按钮
-rw-r--r--src/main/java/net/geedge/asw/common/util/Constants.java6
-rw-r--r--src/main/java/net/geedge/asw/common/util/RCode.java15
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java121
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java5
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java3
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java13
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java14
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java7
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java10
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java65
-rw-r--r--src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java100
-rw-r--r--src/main/resources/db/mapper/workspace/WorkspaceMapper.xml55
-rw-r--r--src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml49
-rw-r--r--src/main/resources/db/migration/R__AZ_sys_i18n.sql38
-rw-r--r--src/main/resources/db/migration/R__AZ_sys_menu.sql3
-rw-r--r--src/main/resources/db/migration/R__AZ_sys_role_menu.sql3
16 files changed, 506 insertions, 1 deletions
diff --git a/src/main/java/net/geedge/asw/common/util/Constants.java b/src/main/java/net/geedge/asw/common/util/Constants.java
index b2f6fd6..40cace2 100644
--- a/src/main/java/net/geedge/asw/common/util/Constants.java
+++ b/src/main/java/net/geedge/asw/common/util/Constants.java
@@ -20,4 +20,10 @@ public class Constants {
*/
public static final List<String> LANG_LIST = T.ListUtil.of("en", "zh");
+
+ /**
+ * 工作空间可见性列表
+ */
+ public static final List<String> VISIBILITY_LIST = T.ListUtil.of("public", "private");
+
}
diff --git a/src/main/java/net/geedge/asw/common/util/RCode.java b/src/main/java/net/geedge/asw/common/util/RCode.java
index 0233989..26d7dba 100644
--- a/src/main/java/net/geedge/asw/common/util/RCode.java
+++ b/src/main/java/net/geedge/asw/common/util/RCode.java
@@ -18,6 +18,10 @@ public enum RCode {
PARAM_CANNOT_EMPTY(100006, "parameter cannot be empty"), // parameter 不能为空
USER_NO_LOGIN(100007, "user not login"), // 用户未登录
SYS_RECORD_NOT_FOUND(100008, "record not found"),// 未找到记录
+ USER_ID_CANNOT_EMPTY(100009, "user id cannot be empty"),// 用户 ID 不能为空
+ ROLE_ID_CANNOT_EMPTY(100010, "role id cannot be empty"),// 权限 ID 不能为空
+ USER_NOT_EXIST(100011, "user does not exist"),
+ ROLE_NOT_EXIST(100012, "role does not exist"),
// Application
@@ -26,7 +30,7 @@ public enum RCode {
APP_LONGNAME_CANNOT_EMPTY(201003, "application longName cannot be empty"),
APP_PROPERTIES_CANNOT_EMPTY(201004, "application properties cannot be empty"),
APP_SURROGATES_CANNOT_EMPTY(201005, "application surrogates cannot be empty"),
- APP_DESCRIPTION_CANNOT_EMPTY(201006, "application surrogates cannot be empty"),
+ APP_DESCRIPTION_CANNOT_EMPTY(201006, "application description cannot be empty"),
APP_DUPLICATE_RECORD(201007, "application duplicate record"),
APP_NOT_EXIST(201008, "application does not exist"),
@@ -46,6 +50,15 @@ public enum RCode {
// Workspace
WORKSPACE_ID_CANNOT_EMPTY(401001, "workspace id cannot be empty"),
+ WORKSPACE_NAME_CANNOT_EMPTY(401002, "workspace name cannot be empty"),
+ WORKSPACE_VISIBILITY_CANNOT_EMPTY(401003, "workspace visibility cannot be empty"),
+ WORKSPACE_USER_CANNOT_EMPTY(401004, "workspace user cannot be empty"),
+ WORKSPACE_ALREADY_EXISTS(401005, "workspace already exists"),
+ WORKSPACE_MEMBER_CANNOT_EMPTY(401006, "workspace member cannot be empty"),
+ WORKSPACE_CANNOT_DELETE(401007, "Built-in workspace cannot be deleted"),
+ WORKSPACE_VISIBILITY_ERROR(401008, "workspace visibility error"),
+ WORKSPACE_BUILT_IN(401009, "Built-in workspace cannot be update"),
+
SUCCESS(200, "success"); // 成功
diff --git a/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java b/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java
new file mode 100644
index 0000000..276cd6f
--- /dev/null
+++ b/src/main/java/net/geedge/asw/module/workspace/controller/WorkspaceController.java
@@ -0,0 +1,121 @@
+package net.geedge.asw.module.workspace.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import net.geedge.asw.common.util.R;
+import net.geedge.asw.common.util.RCode;
+import net.geedge.asw.common.util.T;
+import net.geedge.asw.common.util.VerifyUtil;
+import net.geedge.asw.module.sys.entity.SysUserEntity;
+import net.geedge.asw.module.sys.service.ISysUserService;
+import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
+import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
+import net.geedge.asw.module.workspace.service.IWorkspaceMemberService;
+import net.geedge.asw.module.workspace.service.IWorkspaceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("/api/v1/workspace")
+public class WorkspaceController {
+
+ @Autowired
+ private IWorkspaceService workspaceService;
+
+ @Autowired
+ private IWorkspaceMemberService workspaceMemberService;
+
+ @Autowired
+ private ISysUserService userService;
+
+ @GetMapping("/{id}")
+ public R detail(@PathVariable("id") String id) {
+ WorkspaceEntity workspace = workspaceService.getById(id);
+ String createUserId = workspace.getCreateUserId();
+ String updateUserId = workspace.getUpdateUserId();
+ if (T.StrUtil.isNotEmpty(createUserId)) {
+ SysUserEntity createUser = userService.getById(createUserId);
+ workspace.setCreateUser(createUser);
+ }
+ if (T.StrUtil.isNotEmpty(updateUserId)) {
+ SysUserEntity updateUser = userService.getById(updateUserId);
+ workspace.setUpdateUser(updateUser);
+ }
+ return R.ok().putData("record", workspace);
+ }
+
+ @GetMapping
+ public R list(@RequestParam Map<String, Object> params) {
+ Page page = workspaceService.queryList(params);
+ return R.ok(page);
+ }
+
+ @PostMapping
+ public R save(@RequestBody WorkspaceEntity workspace) {
+ VerifyUtil.is(workspace).notNull()
+ .and(workspace.getName()).notEmpty(RCode.WORKSPACE_NAME_CANNOT_EMPTY)
+ .and(workspace.getVisibility()).notEmpty(RCode.WORKSPACE_VISIBILITY_CANNOT_EMPTY);
+
+ WorkspaceEntity workspaceEntity = workspaceService.saveWorkspace(workspace);
+ return R.ok().putData("record", workspaceEntity.getId());
+ }
+
+
+ @PutMapping
+ public R update(@RequestBody WorkspaceEntity workspace) {
+ VerifyUtil.is(workspace).notNull()
+ .and(workspace.getId()).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY)
+ .and(workspace.getName()).notEmpty(RCode.WORKSPACE_NAME_CANNOT_EMPTY)
+ .and(workspace.getVisibility()).notEmpty(RCode.WORKSPACE_VISIBILITY_CANNOT_EMPTY);
+
+ WorkspaceEntity workspaceEntity = workspaceService.updateWorkspace(workspace);
+ return R.ok().putData("record", workspaceEntity.getId());
+ }
+
+ @DeleteMapping
+ public R delete(@RequestParam String ids) {
+ VerifyUtil.is(ids).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY);
+ workspaceService.deleteWorkspace(ids);
+ return R.ok();
+
+ }
+
+ @GetMapping("/{workspaceId}/member")
+ public R getMember(@PathVariable String workspaceId) {
+ List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId);
+ return R.ok().putData("record", memberEntityList);
+ }
+
+
+ @PostMapping("/{workspaceId}/member")
+ public R saveMember(@PathVariable String workspaceId, @RequestBody List<WorkspaceMemberEntity> workspaceMembers) {
+ VerifyUtil.is(workspaceMembers).notEmpty(RCode.WORKSPACE_MEMBER_CANNOT_EMPTY)
+ .and(workspaceId).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY);
+ List<WorkspaceMemberEntity> workspaceMemberEntityList = workspaceMemberService.saveMember(workspaceId, workspaceMembers);
+ return R.ok().putData("record", workspaceMemberEntityList);
+ }
+
+
+ @PutMapping("/{workspaceId}/member")
+ public R updateMember(@PathVariable String workspaceId, @RequestBody List<WorkspaceMemberEntity> workspaceMembers) {
+ VerifyUtil.is(workspaceMembers).notEmpty(RCode.WORKSPACE_MEMBER_CANNOT_EMPTY)
+ .and(workspaceId).notEmpty(RCode.WORKSPACE_ID_CANNOT_EMPTY);
+ List<WorkspaceMemberEntity> workspaceMemberEntityList = workspaceMemberService.updateMember(workspaceId, workspaceMembers);
+ return R.ok().putData("record", workspaceMemberEntityList);
+ }
+
+ @DeleteMapping("/{workspaceId}/member")
+ public R deleteMember(@PathVariable String workspaceId, @RequestParam String userIds) {
+ VerifyUtil.is(userIds).notEmpty(RCode.USER_ID_CANNOT_EMPTY);
+ List<String> list = Arrays.asList(userIds.split(","));
+ workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>()
+ .eq(WorkspaceMemberEntity::getWorkspaceId, workspaceId)
+ .in(WorkspaceMemberEntity::getUserId, list));
+ return R.ok();
+ }
+
+}
diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java
index d75872d..76cc466 100644
--- a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java
+++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceDao.java
@@ -1,10 +1,15 @@
package net.geedge.asw.module.workspace.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+import java.util.Map;
+
@Mapper
public interface WorkspaceDao extends BaseMapper<WorkspaceEntity> {
+ List<WorkspaceEntity> queryList(Page page, Map<String, Object> params);
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java
index 2f7bfcd..69dec56 100644
--- a/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java
+++ b/src/main/java/net/geedge/asw/module/workspace/dao/WorkspaceMemberDao.java
@@ -4,7 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
@Mapper
public interface WorkspaceMemberDao extends BaseMapper<WorkspaceMemberEntity> {
+ List<WorkspaceMemberEntity> queryList(String workspaceId);
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java
index c659b73..cc09a7e 100644
--- a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java
+++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceEntity.java
@@ -1,9 +1,14 @@
package net.geedge.asw.module.workspace.entity;
import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
+import net.geedge.asw.module.sys.entity.SysRoleEntity;
+import net.geedge.asw.module.sys.entity.SysUserEntity;
+
+import java.util.List;
@Data
@TableName("workspace")
@@ -21,5 +26,13 @@ public class WorkspaceEntity {
private String createUserId;
private String updateUserId;
+ @TableField(exist = false)
+ private SysUserEntity createUser;
+
+ @TableField(exist = false)
+ private SysUserEntity updateUser;
+
+ @TableField(exist = false)
+ private List<WorkspaceMemberEntity> members;
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java
index e82ef79..72baae1 100644
--- a/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java
+++ b/src/main/java/net/geedge/asw/module/workspace/entity/WorkspaceMemberEntity.java
@@ -1,7 +1,12 @@
package net.geedge.asw.module.workspace.entity;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
+import net.geedge.asw.module.sys.entity.SysRoleEntity;
+import net.geedge.asw.module.sys.entity.SysUserEntity;
+
+import java.util.List;
@Data
@TableName("workspace_member")
@@ -14,4 +19,13 @@ public class WorkspaceMemberEntity {
private Long createTimestamp;
private String createUserId;
+ @TableField(exist = false)
+ private SysUserEntity user;
+
+ @TableField(exist = false)
+ private SysRoleEntity role;
+
+ @TableField(exist = false)
+ private SysUserEntity createUser;
+
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java
index 4a6b78e..d5dd209 100644
--- a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java
+++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceMemberService.java
@@ -3,6 +3,13 @@ package net.geedge.asw.module.workspace.service;
import com.baomidou.mybatisplus.extension.service.IService;
import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
+import java.util.List;
+
public interface IWorkspaceMemberService extends IService<WorkspaceMemberEntity>{
+ List<WorkspaceMemberEntity> queryList(String workspaceId);
+
+ List<WorkspaceMemberEntity> saveMember(String workspaceId ,List<WorkspaceMemberEntity> workspaces);
+
+ List<WorkspaceMemberEntity> updateMember(String workspaceId, List<WorkspaceMemberEntity> workspaces);
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java
index 0c62760..b1a3ec0 100644
--- a/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java
+++ b/src/main/java/net/geedge/asw/module/workspace/service/IWorkspaceService.java
@@ -1,8 +1,18 @@
package net.geedge.asw.module.workspace.service;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
+import java.util.Map;
+
public interface IWorkspaceService extends IService<WorkspaceEntity>{
+ Page queryList(Map<String, Object> params);
+
+ WorkspaceEntity saveWorkspace(WorkspaceEntity workspace);
+
+ WorkspaceEntity updateWorkspace(WorkspaceEntity workspace);
+
+ void deleteWorkspace(String ids);
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java
index 97409d7..68b5e5e 100644
--- a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java
+++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceMemberServiceImpl.java
@@ -1,13 +1,78 @@
package net.geedge.asw.module.workspace.service.impl;
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.geedge.asw.common.util.ASWException;
+import net.geedge.asw.common.util.RCode;
+import net.geedge.asw.common.util.T;
+import net.geedge.asw.common.util.VerifyUtil;
+import net.geedge.asw.module.sys.service.ISysRoleService;
+import net.geedge.asw.module.sys.service.ISysUserService;
import net.geedge.asw.module.workspace.dao.WorkspaceMemberDao;
import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
import net.geedge.asw.module.workspace.service.IWorkspaceMemberService;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.List;
+
@Service
public class WorkspaceMemberServiceImpl extends ServiceImpl<WorkspaceMemberDao, WorkspaceMemberEntity> implements IWorkspaceMemberService {
+ @Autowired
+ private IWorkspaceMemberService workspaceMemberService;
+
+ @Autowired
+ private ISysUserService userService;
+
+ @Autowired
+ private ISysRoleService roleService;
+
+ @Override
+ public List<WorkspaceMemberEntity> queryList(String workspaceId) {
+ List<WorkspaceMemberEntity> list = this.baseMapper.queryList(workspaceId);
+ return list;
+ }
+
+ @Override
+ public List<WorkspaceMemberEntity> saveMember(String workspaceId, List<WorkspaceMemberEntity> workspaces) {
+ validateInfo(workspaceId, workspaces);
+ workspaceMemberService.saveBatch(workspaces);
+ List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId);
+ return memberEntityList;
+ }
+
+ @Override
+ public List<WorkspaceMemberEntity> updateMember(String workspaceId, List<WorkspaceMemberEntity> workspaces) {
+ validateInfo(workspaceId, workspaces);
+ workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().eq(WorkspaceMemberEntity::getWorkspaceId, workspaceId));
+ workspaceMemberService.saveBatch(workspaces);
+ List<WorkspaceMemberEntity> memberEntityList = workspaceMemberService.queryList(workspaceId);
+ return memberEntityList;
+ }
+ private void validateInfo(String workspaceId, List<WorkspaceMemberEntity> workspaces) {
+ if (T.StrUtil.equalsIgnoreCase(workspaceId, "1")) {
+ throw new ASWException(RCode.WORKSPACE_BUILT_IN);
+ }
+ List<String> userIds = userService.list().stream().map(x -> x.getId()).toList();
+ List<String> roleIds = roleService.list().stream().map(x -> x.getId()).toList();
+ for (WorkspaceMemberEntity workspace : workspaces) {
+ VerifyUtil.is(workspace).notNull()
+ .and(workspace.getUserId()).notEmpty(RCode.USER_ID_CANNOT_EMPTY)
+ .and(workspace.getRoleId()).notEmpty(RCode.ROLE_ID_CANNOT_EMPTY);
+ if (!userIds.contains(workspace.getUserId())) {
+ throw new ASWException(RCode.USER_NOT_EXIST);
+ }
+ if (!roleIds.contains(workspace.getRoleId())) {
+ throw new ASWException(RCode.ROLE_NOT_EXIST);
+ }
+ }
+ workspaces.stream().forEach(x -> {
+ x.setWorkspaceId(workspaceId);
+ x.setCreateUserId(StpUtil.getLoginIdAsString());
+ x.setCreateTimestamp(System.currentTimeMillis());
+ });
+ }
} \ No newline at end of file
diff --git a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java
index 43b992b..1bc3587 100644
--- a/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java
+++ b/src/main/java/net/geedge/asw/module/workspace/service/impl/WorkspaceServiceImpl.java
@@ -1,13 +1,113 @@
package net.geedge.asw.module.workspace.service.impl;
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import net.geedge.asw.common.util.ASWException;
+import net.geedge.asw.common.util.Constants;
+import net.geedge.asw.common.util.RCode;
+import net.geedge.asw.common.util.T;
import net.geedge.asw.module.workspace.dao.WorkspaceDao;
import net.geedge.asw.module.workspace.entity.WorkspaceEntity;
+import net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity;
+import net.geedge.asw.module.workspace.service.IWorkspaceMemberService;
import net.geedge.asw.module.workspace.service.IWorkspaceService;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
@Service
public class WorkspaceServiceImpl extends ServiceImpl<WorkspaceDao, WorkspaceEntity> implements IWorkspaceService {
+ @Autowired
+ private IWorkspaceService workspaceService;
+
+ @Autowired
+ private IWorkspaceMemberService workspaceMemberService;
+
+ @Override
+ public Page queryList(Map<String, Object> params) {
+ Page page = T.PageUtil.getPage(params);
+ List<WorkspaceEntity> workspaceEntityList = this.getBaseMapper().queryList(page, params);
+ page.setRecords(workspaceEntityList);
+ return page;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public WorkspaceEntity saveWorkspace(WorkspaceEntity workspace) {
+ this.validateWorkspaceInfo(workspace, false);
+ workspace.setCreateUserId(StpUtil.getLoginIdAsString());
+ workspace.setUpdateUserId(StpUtil.getLoginIdAsString());
+ workspace.setCreateTimestamp(System.currentTimeMillis());
+ workspace.setUpdateTimestamp(System.currentTimeMillis());
+ workspaceService.save(workspace);
+
+ if (T.CollectionUtil.isNotEmpty(workspace.getMembers())) {
+ List<WorkspaceMemberEntity> members = workspace.getMembers();
+ members.stream().forEach(x -> {
+ x.setWorkspaceId(workspace.getId());
+ x.setCreateTimestamp(System.currentTimeMillis());
+ x.setCreateUserId(StpUtil.getLoginIdAsString());
+ });
+ workspaceMemberService.saveBatch(members);
+ }
+ return workspace;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public WorkspaceEntity updateWorkspace(WorkspaceEntity workspace) {
+ this.validateWorkspaceInfo(workspace, true);
+ workspace.setUpdateUserId(StpUtil.getLoginIdAsString());
+ workspace.setUpdateTimestamp(System.currentTimeMillis());
+ workspaceService.updateById(workspace);
+
+ if (T.CollectionUtil.isNotEmpty(workspace.getMembers())) {
+ List<WorkspaceMemberEntity> members = workspace.getMembers();
+ members.stream().forEach(x -> {
+ x.setWorkspaceId(workspace.getId());
+ x.setCreateTimestamp(System.currentTimeMillis());
+ x.setCreateUserId(StpUtil.getLoginIdAsString());
+ });
+ workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().eq(WorkspaceMemberEntity::getWorkspaceId, workspace.getId()));
+ workspaceMemberService.saveBatch(members);
+ }
+ return workspace;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void deleteWorkspace(String ids) {
+ List workspaceIds = Arrays.asList(ids.split(","));
+ if (workspaceIds.contains("1")) {
+ throw new ASWException(RCode.WORKSPACE_CANNOT_DELETE);
+ }
+ workspaceService.removeBatchByIds(workspaceIds);
+ workspaceMemberService.remove(new LambdaQueryWrapper<WorkspaceMemberEntity>().in(WorkspaceMemberEntity::getWorkspaceId, workspaceIds));
+ }
+
+ private void validateWorkspaceInfo(WorkspaceEntity workspace, boolean isUpdate) {
+
+ if (!Constants.VISIBILITY_LIST.contains(workspace.getVisibility())) {
+ throw new ASWException(RCode.WORKSPACE_VISIBILITY_ERROR);
+ }
+ if (T.StrUtil.equals(workspace.getVisibility(), "private") && T.CollectionUtil.isEmpty(workspace.getMembers())) {
+ throw new ASWException(RCode.WORKSPACE_USER_CANNOT_EMPTY);
+ }
+
+ List<WorkspaceEntity> list = workspaceService.list(new LambdaQueryWrapper<WorkspaceEntity>().eq(WorkspaceEntity::getName, workspace.getName()));
+ if (!isUpdate && T.CollectionUtil.isNotEmpty(list)) {
+ throw new ASWException(RCode.WORKSPACE_ALREADY_EXISTS);
+ }
+ if (isUpdate && T.CollectionUtil.isNotEmpty(list) && T.StrUtil.equals(workspace.getId(), list.getFirst().getId())) {
+ throw new ASWException(RCode.WORKSPACE_ALREADY_EXISTS);
+ }
+ }
} \ No newline at end of file
diff --git a/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml b/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml
new file mode 100644
index 0000000..9268de5
--- /dev/null
+++ b/src/main/resources/db/mapper/workspace/WorkspaceMapper.xml
@@ -0,0 +1,55 @@
+<?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="net.geedge.asw.module.workspace.dao.WorkspaceDao">
+
+ <resultMap id="workspaceResultMap" type="net.geedge.asw.module.workspace.entity.WorkspaceEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ <result property="tags" column="tags"/>
+ <result property="visibility" column="visibility"/>
+ <result property="description" column="description"/>
+ <result property="createTimestamp" column="create_timestamp"/>
+ <result property="updateTimestamp" column="update_timestamp"/>
+ <result property="createUserId" column="create_user_id"/>
+ <result property="updateUserId" column="update_user_id"/>
+
+ <association property="createUser" columnPrefix="cu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ </association>
+
+ <association property="updateUser" columnPrefix="uu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ </association>
+ </resultMap>
+
+ <select id="queryList" resultMap="workspaceResultMap">
+ SELECT
+ ws.*,
+ cu.id AS cu_id,
+ cu.name AS cu_name,
+ uu.id AS uu_id,
+ uu.name AS uu_name
+ FROM
+ workspace ws
+ LEFT JOIN sys_user cu ON ws.create_user_id = cu.id
+ LEFT JOIN sys_user uu ON ws.update_user_id = uu.id
+ <where>
+ <if test="params.ids != null and params.ids != ''">
+ ws.id in
+ <foreach item="id" collection="params.ids.split(',')" separator="," open="(" close=")">
+ #{id}
+ </foreach>
+ </if>
+ <if test="params.q != null and params.q != ''">
+ AND ( locate(#{params.q}, ws.name) OR locate(#{params.q}, ws.description) OR locate(#{params.q},
+ ws.tags) )
+ </if>
+ </where>
+ <if test="params.orderBy == null or params.orderBy == ''">
+ ORDER BY ws.id
+ </if>
+ </select>
+</mapper> \ No newline at end of file
diff --git a/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml b/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml
new file mode 100644
index 0000000..bb9cf15
--- /dev/null
+++ b/src/main/resources/db/mapper/workspace/WorkspaceMemberMapper.xml
@@ -0,0 +1,49 @@
+<?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="net.geedge.asw.module.workspace.dao.WorkspaceMemberDao">
+
+ <resultMap id="workspaceMemberResultMap" type="net.geedge.asw.module.workspace.entity.WorkspaceMemberEntity">
+
+ <result property="workspaceId" column="workspace_id"/>
+ <result property="userId" column="user_id"/>
+ <result property="roleId" column="role_id"/>
+ <result property="createTimestamp" column="create_timestamp"/>
+ <result property="createUserId" column="create_user_id"/>
+
+ <association property="createUser" columnPrefix="cu_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ </association>
+
+ <association property="user" columnPrefix="su_" javaType="net.geedge.asw.module.sys.entity.SysUserEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ </association>
+
+ <association property="role" columnPrefix="sr_" javaType="net.geedge.asw.module.sys.entity.SysRoleEntity">
+ <id property="id" column="id"/>
+ <result property="name" column="name"/>
+ </association>
+
+ </resultMap>
+ <select id="queryList" resultMap="workspaceMemberResultMap">
+ SELECT
+ wm.*,
+ cu.id AS cu_id,
+ cu.name AS cu_name,
+ su.id AS su_id,
+ su.name AS su_name,
+ sr.id AS sr_id,
+ sr.name AS sr_name
+ FROM
+ workspace_member wm
+ LEFT JOIN sys_user cu ON wm.create_user_id = cu.id
+ LEFT JOIN sys_user su ON wm.user_id = su.id
+ LEFT JOIN sys_role sr ON wm.role_id = sr.id
+ <where>
+ <if test="workspaceId != null and workspaceId != ''">
+ wm.workspace_id = #{workspaceId}
+ </if>
+ </where>
+ </select>
+</mapper> \ No newline at end of file
diff --git a/src/main/resources/db/migration/R__AZ_sys_i18n.sql b/src/main/resources/db/migration/R__AZ_sys_i18n.sql
index 7d6d1ec..d756856 100644
--- a/src/main/resources/db/migration/R__AZ_sys_i18n.sql
+++ b/src/main/resources/db/migration/R__AZ_sys_i18n.sql
@@ -51,6 +51,44 @@ INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_
INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (59, '202002', 'PACKAGE_DESCRIPTION_CANNOT_EMPTY', '安装包描述信息不能为空', 'zh', '', 'admin', 1719280800000);
INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (61, '401001', 'WORKSPACE_ID_CANNOT_EMPTY', 'workspace id cannot be empty', 'en', '', 'admin', 1719280800000);
INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (63, '401001', 'WORKSPACE_ID_CANNOT_EMPTY', '工作空间ID不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (65, '401002', 'WORKSPACE_NAME_CANNOT_EMPTY', 'workspace name cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (67, '401002', 'WORKSPACE_NAME_CANNOT_EMPTY', '工作空间名称不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (69, '401003', 'WORKSPACE_VISIBILITY_CANNOT_EMPTY', 'workspace visibility cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (71, '401003', 'WORKSPACE_VISIBILITY_CANNOT_EMPTY', '工作空间可见性不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (73, '401004', 'WORKSPACE_USER_CANNOT_EMPTY', 'workspace user cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (75, '401004', 'WORKSPACE_USER_CANNOT_EMPTY', '工作空间用户不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (77, '401005', 'WORKSPACE_ALREADY_EXISTS', 'workspace already exists', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (79, '401005', 'WORKSPACE_ALREADY_EXISTS', '工作空间已存在', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (81, '401006', 'WORKSPACE_MEMBER_CANNOT_EMPTY', 'workspace member cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (83, '401006', 'WORKSPACE_MEMBER_CANNOT_EMPTY', '工作空间成员不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (85, '401007', 'WORKSPACE_CANNOT_DELETE', 'Built-in workspace cannot be deleted', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (87, '401007', 'WORKSPACE_CANNOT_DELETE', '内置工作空间不能删除', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (89, '100009', 'USER_ID_CANNOT_EMPTY', 'user id cannot be empty ', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (91, '100009', 'USER_ID_CANNOT_EMPTY', '用户 ID 不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (93, '201002', 'APP_NAME_CANNOT_EMPTY', 'application name cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (95, '201002', 'APP_NAME_CANNOT_EMPTY', '应用程序名称不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (97, '201003', 'APP_LONGNAME_CANNOT_EMPTY', 'application longName cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (99, '201003', 'APP_LONGNAME_CANNOT_EMPTY', '应用程序全称不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (101, '201004', 'APP_PROPERTIES_CANNOT_EMPTY', 'application properties cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (103, '201004', 'APP_PROPERTIES_CANNOT_EMPTY', '应用程序属性不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (105, '201005', 'APP_SURROGATES_CANNOT_EMPTY', 'application surrogates cannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (107, '201005', 'APP_SURROGATES_CANNOT_EMPTY', '应用程序代理不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (109, '201006', 'APP_DESCRIPTION_CANNOT_EMPTY', 'application descriptioncannot be empty', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (111, '201006', 'APP_DESCRIPTION_CANNOT_EMPTY', '应用描述不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (113, '201007', 'APP_DUPLICATE_RECORD', 'application duplicate record', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (115, '201007', 'APP_DUPLICATE_RECORD', '应用程序重复记录', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (117, '201008', 'APP_NOT_EXIST', 'application does not exist', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (119, '201008', 'APP_NOT_EXIST', '应用程序不存在', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (121, '401008', 'WORKSPACE_VISIBILITY_ERROR', 'workspace visibility error', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (123, '401008', 'WORKSPACE_VISIBILITY_ERROR', '工作空间可见性错误', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (125, '401009', 'WORKSPACE_BUILT_IN', 'Built-in workspace cannot be update', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (127, '401009', 'WORKSPACE_BUILT_IN', '内置工作空间不可修改', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (129, '100010', 'ROLE_ID_CANNOT_EMPTY', 'role id cannot be empty ', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (131, '100010', 'ROLE_ID_CANNOT_EMPTY', '权限 ID 不能为空', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (133, '100011', 'USER_NOT_EXIST', 'user does not exist', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (135, '100011', 'USER_NOT_EXIST', '用户不存在', 'zh', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (137, '100012', 'ROLE_NOT_EXIST', 'role does not exist', 'en', '', 'admin', 1719280800000);
+INSERT INTO `sys_i18n`(`id`, `name`, `code`, `value`, `lang`, `remark`, `update_user_id`, `update_timestamp`) VALUES (139, '100012', 'ROLE_NOT_EXIST', '权限不存在', 'zh', '', 'admin', 1719280800000);
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/src/main/resources/db/migration/R__AZ_sys_menu.sql b/src/main/resources/db/migration/R__AZ_sys_menu.sql
index aaee755..cb2bf97 100644
--- a/src/main/resources/db/migration/R__AZ_sys_menu.sql
+++ b/src/main/resources/db/migration/R__AZ_sys_menu.sql
@@ -9,6 +9,9 @@ INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2000', 'applications', 'overall.applications', '0', 'menu', '', '/applications', 'asw-icon icon-Applications', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2001', 'application_view', 'buttons.view', '2000', 'button', '', '', '', 1, 1722478572000, 1);
+INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2002', 'application_add', 'buttons.add', '2000', 'button', '', '', '', 1, 1722478572000, 1);
+INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2003', 'application_edit', 'buttons.edit', '2000', 'button', '', '', '', 1, 1722478572000, 1);
+INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2004', 'application_delete', 'buttons.delete', '2000', 'button', '', '', '', 1, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3000', 'pcaps', 'overall.pcaps', '0', 'menu', '', '/pcaps', 'asw-icon icon-Pcaps', 2, 1722478572000, 1);
INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3001', 'pacp_view', 'buttons.view', '3000', 'button', '', '', '', 1, 1722478572000, 1);
diff --git a/src/main/resources/db/migration/R__AZ_sys_role_menu.sql b/src/main/resources/db/migration/R__AZ_sys_role_menu.sql
index d922d00..23f63cc 100644
--- a/src/main/resources/db/migration/R__AZ_sys_role_menu.sql
+++ b/src/main/resources/db/migration/R__AZ_sys_role_menu.sql
@@ -9,6 +9,9 @@ INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1001');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2001');
+INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2002');
+INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2003');
+INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '2004');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3000');
INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3001');