From 96483dc432df9cb126029179d0774a0ebe943ea1 Mon Sep 17 00:00:00 2001 From: zhangshuai Date: Thu, 1 Aug 2024 17:09:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ASW-21=20=E7=94=A8=E6=88=B7=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asw/module/sys/entity/SysRoleEntity.java | 6 + .../asw/module/sys/entity/SysUserEntity.java | 8 + .../sys/service/impl/SysAuthServiceImpl.java | 142 ++++++++++++------ .../workspace/entity/WorkspaceEntity.java | 1 - .../resources/db/migration/R__AZ_sys_menu.sql | 37 +++++ .../db/migration/R__AZ_sys_role_menu.sql | 49 ++++++ .../db/migration/V1.0.01__INIT_TABLES.sql | 15 +- 7 files changed, 204 insertions(+), 54 deletions(-) create mode 100644 src/main/resources/db/migration/R__AZ_sys_menu.sql create mode 100644 src/main/resources/db/migration/R__AZ_sys_role_menu.sql diff --git a/src/main/java/net/geedge/asw/module/sys/entity/SysRoleEntity.java b/src/main/java/net/geedge/asw/module/sys/entity/SysRoleEntity.java index 9e67029..9a449e1 100644 --- a/src/main/java/net/geedge/asw/module/sys/entity/SysRoleEntity.java +++ b/src/main/java/net/geedge/asw/module/sys/entity/SysRoleEntity.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; +import java.util.List; + @Data @TableName("sys_role") public class SysRoleEntity { @@ -20,4 +22,8 @@ public class SysRoleEntity { @TableField(exist = false) private String[] menuIds; private Long createTimestamp; + @TableField(exist = false) + private List menus; + @TableField(exist = false) + private List buttons; } diff --git a/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java b/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java index 803aa6c..77aafd5 100644 --- a/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java +++ b/src/main/java/net/geedge/asw/module/sys/entity/SysUserEntity.java @@ -15,13 +15,21 @@ public class SysUserEntity { @TableId(type = IdType.ASSIGN_UUID) private String id; + private String name; + @TableField("user_name") private String userName; + private String pwd; + @TableField(exist = false) private String roleIds; + @TableField(exist = false) private List roles; + + private String accessLevel; + private Long createTimestamp; } diff --git a/src/main/java/net/geedge/asw/module/sys/service/impl/SysAuthServiceImpl.java b/src/main/java/net/geedge/asw/module/sys/service/impl/SysAuthServiceImpl.java index ec39cf5..775b3d7 100644 --- a/src/main/java/net/geedge/asw/module/sys/service/impl/SysAuthServiceImpl.java +++ b/src/main/java/net/geedge/asw/module/sys/service/impl/SysAuthServiceImpl.java @@ -1,7 +1,11 @@ package net.geedge.asw.module.sys.service.impl; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Pair; +import cn.hutool.core.map.MapUtil; import cn.hutool.log.Log; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import net.geedge.asw.common.util.ASWException; import net.geedge.asw.common.util.Constants; @@ -13,9 +17,16 @@ import net.geedge.asw.module.sys.entity.SysMenuEntity; import net.geedge.asw.module.sys.entity.SysRoleEntity; import net.geedge.asw.module.sys.entity.SysUserEntity; import net.geedge.asw.module.sys.service.ISysAuthService; +import net.geedge.asw.module.workbook.entity.WorkbookMemberEntity; +import net.geedge.asw.module.workbook.service.IWorkbookMemberService; +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 java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -23,57 +34,90 @@ import java.util.stream.Collectors; @Service public class SysAuthServiceImpl implements ISysAuthService { - private static final Log log = Log.get(); + private static final Log log = Log.get(); - @Autowired - private SysUserDao userDao; - @Autowired - private SysRoleDao roleDao; + @Autowired + private SysUserDao userDao; - @Override - public SysUserEntity login(String userName, String pwd) { - SysUserEntity userEntity = userDao - .selectOne(new QueryWrapper().lambda().eq(SysUserEntity::getUserName, userName)); - if (T.ObjectUtil.isNull(userEntity) - || !T.StrUtil.equals(userEntity.getPwd(), T.AesUtil.encrypt(pwd, Constants.AES_KEY))) { - log.warn("user login error, username: {}", userName); - throw ASWException.builder().rcode(RCode.SYS_USER_PWD_ERROR).build(); - } - StpUtil.login(userEntity.getId()); - log.info("user login success, userName: {}", userName); - return userEntity; - } + @Autowired + private SysRoleDao roleDao; - @Override - public void logout() { - StpUtil.logout(); - } + @Autowired + private IWorkspaceService workspaceService; - /** - * 获取登录用户权限 - */ - @Override - public Map userPermissions() { - Map result = T.MapUtil.newHashMap(); - String userId = StpUtil.getLoginIdAsString(); - List roleList = roleDao.findRoleByUserId(userId); - result.put("roles", roleList); - // 组织 menu数据 - List menuList = roleDao.findMenuByUserId(userId); - List buttonList = menuList.stream().filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "button")) - .map(menu -> menu.getName()).collect(Collectors.toList()); - result.put("buttons", buttonList); - //生成 menu tree结构 - Map> groupMap = menuList.stream() - .filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "menu")) - .collect(Collectors.groupingBy(SysMenuEntity::getPid)); - menuList.forEach(menu -> { - menu.setChildren(groupMap.get(menu.getId())); - }); - List collect = menuList.stream().filter(menu -> T.StrUtil.isBlank(menu.getPid())) - .collect(Collectors.toList()); - result.put("menus", collect); - - return result; - } + @Autowired + private IWorkspaceMemberService workspaceMemberService; + + @Override + public SysUserEntity login(String userName, String pwd) { + SysUserEntity userEntity = userDao + .selectOne(new QueryWrapper().lambda().eq(SysUserEntity::getUserName, userName)); + if (T.ObjectUtil.isNull(userEntity) + || !T.StrUtil.equals(userEntity.getPwd(), T.AesUtil.encrypt(pwd, Constants.AES_KEY))) { + log.warn("user login error, username: {}", userName); + throw ASWException.builder().rcode(RCode.SYS_USER_PWD_ERROR).build(); + } + StpUtil.login(userEntity.getId()); + log.info("user login success, userName: {}", userName); + return userEntity; + } + + @Override + public void logout() { + StpUtil.logout(); + } + + /** + * 获取登录用户权限 + */ + @Override + public Map userPermissions() { + String userId = StpUtil.getLoginIdAsString(); + SysUserEntity sysUserEntity = userDao.selectById(userId); + String accessLevel = sysUserEntity.getAccessLevel(); + + List workspaceEntityList = workspaceService.list(); + if (accessLevel.equalsIgnoreCase("regular")) { + List workbookMemberEntityList = workspaceMemberService.list(new LambdaQueryWrapper().eq(WorkspaceMemberEntity::getUserId, userId)); + List workspaceIdList = workbookMemberEntityList.stream().map(x -> x.getWorkspaceId()).toList(); + workspaceEntityList = workspaceService.list(new LambdaQueryWrapper().in(WorkspaceEntity::getId, workspaceIdList)); + // public workspace + List publicWorkspaces = workspaceService.list(new LambdaQueryWrapper().eq(WorkspaceEntity::getVisibility, "public")); + workspaceEntityList.addAll(publicWorkspaces); + } + SysRoleEntity role = roleDao.findRoleByUserId(userId).get(0); + // 组织 button 数据 + List menuList = roleDao.findMenuByUserId(userId); + List buttonList = menuList.stream().filter(menu -> T.StrUtil.equalsIgnoreCase(menu.getType(), "button")) + .map(menu -> menu.getName()).collect(Collectors.toList()); + role.setButtons(buttonList); + + //生成 menu tree结构 + Map> groupMap = menuList.stream() + .filter(menu -> !T.StrUtil.equalsIgnoreCase(menu.getPid(), "0")) + .collect(Collectors.groupingBy(SysMenuEntity::getPid)); + + menuList.forEach(menu -> { + menu.setChildren(groupMap.get(menu.getId())); + }); + + List collect = menuList.stream() + .filter(menu -> T.StrUtil.equals(menu.getPid(), "0")) + .filter(menu -> T.StrUtil.equals(menu.getType(), "menu")) + .collect(Collectors.toList()); + role.setMenus(collect); + + List records = ListUtil.list(false); + for (WorkspaceEntity workspace : workspaceEntityList) { + Map map = MapUtil.builder() + .put("workspace", workspace) + .put("role", role) + .build(); + records.add(map); + } + Map result = T.MapUtil.newHashMap(); + result.put("records", records); + result.put("accessLevel", accessLevel); + return result; + } } 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 e30742a..c659b73 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 @@ -21,6 +21,5 @@ public class WorkspaceEntity { private String createUserId; private String updateUserId; - private String workspaceId; } \ No newline at end of file diff --git a/src/main/resources/db/migration/R__AZ_sys_menu.sql b/src/main/resources/db/migration/R__AZ_sys_menu.sql new file mode 100644 index 0000000..7957ac5 --- /dev/null +++ b/src/main/resources/db/migration/R__AZ_sys_menu.sql @@ -0,0 +1,37 @@ +/** + * 重置 SYS_MENU 数据 + */ +TRUNCATE sys_menu; + + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1000', 'workbooks', 'workbooks', '0', 'menu', '', '/workbooks', '', 0, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1001', 'workbook_view', 'buttons.view', '1000', 'button', '', '', '', 1, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('2000', 'applications', 'applications', '0', 'menu', '', '/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 ('3000', 'pcaps', 'pcaps', '0', 'menu', '', '/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); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3002', 'pacp_upload', 'buttons.upload', '3000', 'button', '', '', '', 2, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3003', 'pacp_delete', 'buttons.delete', '3000', 'button', '', '', '', 3, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3004', 'pacp_parse', 'buttons.parse', '3000', 'button', '', '', '', 4, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('3005', 'pacp_analyze', 'buttons.analyze', '3000', 'button', '', '', '', 5, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('4000', 'signatures', 'signatures', '0', 'menu', '', '/signatures', '', 3, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('4001', 'signature_view', 'buttons.view', '4000', 'button', '', '', '', 1, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('5000', 'packages', 'packages', '0', 'menu', '', '/packages', '', 4, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('5001', 'package_view', 'buttons.view', '5000', 'button', '', '', '', 1, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6000', 'jobs', 'jobs', '0', 'menu', '', '/jobs', '', 5, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6001', 'job_view', 'buttons.view', '6000', 'button', '', '', '', 1, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6002', 'job_add', 'buttons.add', '6000', 'button', '', '', '', 2, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('6003', 'job_delete', 'buttons.delete', '6000', 'button', '', '', '', 3, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('7000', 'playbooks', 'playbooks', '0', 'menu', '', '/playbooks', '', 6, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('7001', 'playbook_view', 'buttons.view', '7000', 'button', '', '', '', 1, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('8000', 'runners', 'runners', '0', 'menu', '', '/runners', '', 7, 1722478572000, 1); +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('8001', 'runner_view', 'buttons.view', '8000', 'button', '', '', '', 1, 1722478572000, 1); + +INSERT INTO `sys_menu` (`id`, `name`, `i18n`, `pid`, `type`, `perms`, `route`, `icon`, `order`, `create_timestamp`, `state`) VALUES ('1', 'workspace_add', 'buttons.add', '0', '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 new file mode 100644 index 0000000..f45e698 --- /dev/null +++ b/src/main/resources/db/migration/R__AZ_sys_role_menu.sql @@ -0,0 +1,49 @@ +/** + * 先清空 sys_role_menu 表中 admin&common 相关数据,再导入 + */ +delete from sys_role_menu where role_id in ('admin' ,'common'); + +-- admin +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1000'); +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', '3000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3002'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3003'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3004'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '3005'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '4000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '4001'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '5000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '5001'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6002'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '6003'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '7000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '7001'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '8000'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '8001'); + +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('admin', '1'); + + +-- common +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '1001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '2001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '3001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '4001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '5001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '6001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '7001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '8001'); +INSERT INTO `sys_role_menu`(`role_id`, `menu_id`) VALUES ('common', '1'); \ No newline at end of file diff --git a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql index d758c74..7724e65 100644 --- a/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql +++ b/src/main/resources/db/migration/V1.0.01__INIT_TABLES.sql @@ -8,13 +8,14 @@ CREATE TABLE `sys_user` ( `name` varchar(255) NOT NULL, `user_name` varchar(255) NOT NULL, `pwd` varchar(255) NOT NULL, + `access_level` varchar(255) NOT NULL, `create_timestamp` bigint(20) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `idx_user_name` (`user_name`) USING BTREE, KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - -INSERT INTO `sys_user`(`id`, `name`, `user_name`, `pwd`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'ad9d757e620d5d9cd8e32c3dbcf37525', UNIX_TIMESTAMP(NOW())*1000); +-- 添加内置用户 +INSERT INTO `sys_user`(`id`, `name`, `user_name`, `pwd`, `access_level`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'ad9d757e620d5d9cd8e32c3dbcf37525', 'administrator', UNIX_TIMESTAMP(NOW())*1000); /** * 1、新增 sys_role 表 @@ -35,6 +36,10 @@ CREATE TABLE `sys_role` ( KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +-- 添加内置角色 +INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'admin', 1, UNIX_TIMESTAMP(NOW())*1000); +INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('common', 'common', 'common', 'common', 1, UNIX_TIMESTAMP(NOW())*1000); + DROP TABLE IF EXISTS `sys_menu`; CREATE TABLE `sys_menu` ( @@ -59,14 +64,14 @@ CREATE TABLE `sys_user_role` ( `role_id` varchar(64) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +INSERT INTO `sys_user_role`(`user_id`, `role_id`) VALUES ('admin', 'admin'); + DROP TABLE IF EXISTS `sys_role_menu`; CREATE TABLE `sys_role_menu` ( `menu_id` varchar(64) NOT NULL, `role_id` varchar(64) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; --- 添加内置角色 -INSERT INTO `sys_role` (`id`, `name`, `i18n`, `remark`, `build_in`, `create_timestamp`) VALUES ('admin', 'admin', 'admin', 'admin', 1, UNIX_TIMESTAMP(NOW())*1000); /** * 1、新增 sys_config 表 @@ -382,6 +387,8 @@ CREATE TABLE `workspace` ( KEY `idx_name` (`name`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +INSERT INTO `workspace` (`id`, `name`, `tags`, `visibility`, `description`, `create_timestamp`, `update_timestamp`, `create_user_id`, `update_user_id`) VALUES ('1', 'default', '', 'public', '', 1722482392000, 1722482392000, 'admin', 'admin'); + DROP TABLE IF EXISTS `workspace_member`; CREATE TABLE `workspace_member` ( `workspace_id` varchar(64) NOT NULL,