feat: 登录信息加密传输

This commit is contained in:
2026-06-23 16:00:47 +08:00
parent 03ad011f64
commit e56f043483
33 changed files with 2273 additions and 113 deletions

View File

@@ -124,7 +124,7 @@ easyflow:
analytical-db:
# 是否启用分析数据库
enabled: true
url: jdbc:clickhouse://114.66.22.180:38123/easyflow_dev?jdbc_ignore_unsupported_values=true&socket_timeout=30000&compress=false&ssl=false
url: jdbc:clickhouse://110.42.53.158:38123/easyflow_dev?jdbc_ignore_unsupported_values=true&socket_timeout=30000&compress=false&ssl=false
username: easyflow
password: 123456
driver-class-name: com.clickhouse.jdbc.ClickHouseDriver

View File

@@ -0,0 +1,109 @@
CREATE TABLE IF NOT EXISTS `tb_skill_category` (
`id` BIGINT NOT NULL COMMENT 'ID',
`tenant_id` BIGINT NULL COMMENT '租户ID',
`parent_id` BIGINT NULL COMMENT '父分类ID',
`category_name` VARCHAR(128) NOT NULL COMMENT '分类名称',
`level_no` INT DEFAULT 1 COMMENT '层级',
`ancestors` VARCHAR(512) NULL COMMENT '祖级路径',
`sort_no` INT DEFAULT 0 COMMENT '排序',
`status` INT DEFAULT 1 COMMENT '状态',
`created` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`created_by` BIGINT NULL COMMENT '创建人',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`modified_by` BIGINT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
KEY `idx_skill_category_tenant_parent` (`tenant_id`, `parent_id`, `status`, `sort_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill 分类';
CREATE TABLE IF NOT EXISTS `tb_skill` (
`id` BIGINT NOT NULL COMMENT 'ID',
`tenant_id` BIGINT NULL COMMENT '租户ID',
`dept_id` BIGINT NULL COMMENT '部门ID',
`category_id` BIGINT NULL COMMENT '分类ID',
`name` VARCHAR(128) NOT NULL COMMENT 'Skill 名称',
`display_name` VARCHAR(128) NULL COMMENT '展示名称',
`description` VARCHAR(1024) NULL COMMENT '描述',
`metadata_json` JSON NULL COMMENT '元数据',
`skill_content` MEDIUMTEXT NULL COMMENT 'SKILL.md 内容',
`enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用',
`visibility_scope` VARCHAR(32) NULL COMMENT '可见范围',
`source_type` VARCHAR(32) NULL COMMENT '来源类型',
`package_hash` VARCHAR(128) NULL COMMENT '包 hash',
`reference_count` INT DEFAULT 0 COMMENT '引用文档数量',
`script_count` INT DEFAULT 0 COMMENT '脚本数量',
`asset_count` INT DEFAULT 0 COMMENT '资产数量',
`publish_status` VARCHAR(32) DEFAULT 'DRAFT' COMMENT '发布状态',
`current_approval_instance_id` BIGINT NULL COMMENT '当前审批实例ID',
`published_snapshot_json` JSON NULL COMMENT '已发布快照',
`published_at` DATETIME NULL COMMENT '发布时间',
`published_by` BIGINT NULL COMMENT '发布人',
`created` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`created_by` BIGINT NULL COMMENT '创建人',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`modified_by` BIGINT NULL COMMENT '修改人',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_skill_tenant_name` (`tenant_id`, `name`),
KEY `idx_skill_tenant_category` (`tenant_id`, `category_id`, `enabled`),
KEY `idx_skill_publish_status` (`publish_status`),
KEY `idx_skill_created_by` (`created_by`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill';
CREATE TABLE IF NOT EXISTS `tb_skill_reference` (
`id` BIGINT NOT NULL COMMENT 'ID',
`tenant_id` BIGINT NULL COMMENT '租户ID',
`skill_id` BIGINT NOT NULL COMMENT 'Skill ID',
`path` VARCHAR(512) NOT NULL COMMENT '逻辑路径',
`name` VARCHAR(255) NULL COMMENT '文件名',
`content` MEDIUMTEXT NULL COMMENT '内容',
`content_hash` VARCHAR(128) NULL COMMENT '内容 hash',
`size` BIGINT DEFAULT 0 COMMENT '大小',
`metadata_json` JSON NULL COMMENT '元数据',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_skill_reference_path` (`skill_id`, `path`),
KEY `idx_skill_reference_skill` (`skill_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill reference';
CREATE TABLE IF NOT EXISTS `tb_skill_script` (
`id` BIGINT NOT NULL COMMENT 'ID',
`tenant_id` BIGINT NULL COMMENT '租户ID',
`skill_id` BIGINT NOT NULL COMMENT 'Skill ID',
`path` VARCHAR(512) NOT NULL COMMENT '逻辑路径',
`language` VARCHAR(32) NULL COMMENT '脚本语言',
`content` MEDIUMTEXT NULL COMMENT '内容',
`content_hash` VARCHAR(128) NULL COMMENT '内容 hash',
`size` BIGINT DEFAULT 0 COMMENT '大小',
`metadata_json` JSON NULL COMMENT '元数据',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_skill_script_path` (`skill_id`, `path`),
KEY `idx_skill_script_skill` (`skill_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill script';
CREATE TABLE IF NOT EXISTS `tb_skill_asset` (
`id` BIGINT NOT NULL COMMENT 'ID',
`tenant_id` BIGINT NULL COMMENT '租户ID',
`skill_id` BIGINT NOT NULL COMMENT 'Skill ID',
`path` VARCHAR(512) NOT NULL COMMENT '逻辑路径',
`name` VARCHAR(255) NULL COMMENT '文件名',
`media_type` VARCHAR(128) NULL COMMENT '媒体类型',
`content_ref` VARCHAR(128) NOT NULL COMMENT '内容引用',
`content_hash` VARCHAR(128) NULL COMMENT '内容 hash',
`size` BIGINT DEFAULT 0 COMMENT '大小',
`metadata_json` JSON NULL COMMENT '元数据',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_skill_asset_path` (`skill_id`, `path`),
KEY `idx_skill_asset_skill` (`skill_id`),
KEY `idx_skill_asset_content_ref` (`content_ref`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill asset';
CREATE TABLE IF NOT EXISTS `tb_skill_asset_content` (
`content_ref` VARCHAR(128) NOT NULL COMMENT '内容引用',
`content_hash` VARCHAR(128) NOT NULL COMMENT '内容 hash',
`file_path` VARCHAR(1024) NOT NULL COMMENT '文件路径',
`media_type` VARCHAR(128) NULL COMMENT '媒体类型',
`size` BIGINT DEFAULT 0 COMMENT '大小',
`ref_count` INT DEFAULT 0 COMMENT '引用数',
`created` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`content_ref`),
KEY `idx_skill_asset_content_hash` (`content_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='Skill asset 内容索引';

View File

@@ -0,0 +1,172 @@
SET NAMES utf8mb4;
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000001, 0, 0, '技能管理', '/ai/skill', '/ai/skill/SkillList', 'lucide:badge-check',
1, '', 3, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, '管理端 Skill 管理菜单'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000001
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000011, 367400000000000001, 1, '查询', '', '', '',
0, '/api/v1/skill/query', 1, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-查询'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000011
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000012, 367400000000000001, 1, '详情', '', '', '',
0, '/api/v1/skill/getDetail', 2, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-详情'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000012
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000013, 367400000000000001, 1, '保存', '', '', '',
0, '/api/v1/skill/save', 3, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-保存'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000013
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000014, 367400000000000001, 1, '更新', '', '', '',
0, '/api/v1/skill/update', 4, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-更新'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000014
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000015, 367400000000000001, 1, '删除', '', '', '',
0, '/api/v1/skill/remove', 5, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-删除'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000015
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000016, 367400000000000001, 1, '发布', '', '', '',
0, '/api/v1/skill/submitPublishApproval', 6, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-发布审批'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000016
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000017, 367400000000000001, 1, '下线', '', '', '',
0, '/api/v1/skill/submitOfflineApproval', 7, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-下线审批'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000017
);
INSERT INTO `tb_sys_menu` (
`id`, `parent_id`, `menu_type`, `menu_title`, `menu_url`, `component`, `menu_icon`,
`is_show`, `permission_tag`, `sort_no`, `status`, `created`, `created_by`, `modified`, `modified_by`, `remark`
)
SELECT
367400000000000018, 367400000000000001, 1, '删除审批', '', '', '',
0, '/api/v1/skill/submitDeleteApproval', 8, 0, '2026-06-05 20:00:00', 1, '2026-06-05 20:00:00', 1, 'Skill-删除审批'
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_menu` WHERE `id` = 367400000000000018
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000101, 1, 367400000000000001
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000001
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000111, 1, 367400000000000011
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000011
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000112, 1, 367400000000000012
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000012
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000113, 1, 367400000000000013
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000013
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000114, 1, 367400000000000014
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000014
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000115, 1, 367400000000000015
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000015
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000116, 1, 367400000000000016
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000016
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000117, 1, 367400000000000017
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000017
);
INSERT INTO `tb_sys_role_menu` (`id`, `role_id`, `menu_id`)
SELECT 367400000000000118, 1, 367400000000000018
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `tb_sys_role_menu` WHERE `role_id` = 1 AND `menu_id` = 367400000000000018
);

View File

@@ -0,0 +1,24 @@
CREATE TABLE IF NOT EXISTS `tb_auth_credential_key` (
`id` BIGINT NOT NULL COMMENT 'ID',
`key_id` VARCHAR(64) NOT NULL COMMENT '密钥标识',
`public_key_pem` TEXT NOT NULL COMMENT '公钥PEM',
`encrypted_private_key` TEXT NOT NULL COMMENT '加密后的私钥PEM',
`fingerprint` VARCHAR(128) NOT NULL COMMENT '公钥指纹',
`status` VARCHAR(32) NOT NULL COMMENT '状态',
`rotate_seq` BIGINT NOT NULL COMMENT '轮换序号',
`parent_key_id` VARCHAR(64) NULL COMMENT '上一密钥标识',
`transition_payload` TEXT NULL COMMENT '轮换载荷',
`transition_signature` TEXT NULL COMMENT '轮换签名',
`not_before` DATETIME NOT NULL COMMENT '生效时间',
`expires_at` DATETIME NOT NULL COMMENT '过期时间',
`rotate_at` DATETIME NOT NULL COMMENT '计划轮换时间',
`previous_until` DATETIME NULL COMMENT '旧密钥保留解密截止时间',
`created` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`modified` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_auth_credential_key_id` (`key_id`),
UNIQUE KEY `uk_auth_credential_fingerprint` (`fingerprint`),
KEY `idx_auth_credential_status` (`status`),
KEY `idx_auth_credential_rotate_seq` (`rotate_seq`),
KEY `idx_auth_credential_previous_until` (`previous_until`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='认证传输密钥环';