feat: 收口知识库分享链路

- 新增 shareKey 单参数 URL 分享页与失效页

- 新增知识库分享后端鉴权、审计与迁移脚本

- 在访问令牌中增加知识库分享授权入口
This commit is contained in:
2026-04-13 14:44:31 +08:00
parent 8cfe5400fe
commit 31a755a8bc
57 changed files with 5158 additions and 143 deletions

View File

@@ -0,0 +1,111 @@
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `sp_add_column_if_missing`;
DROP PROCEDURE IF EXISTS `sp_drop_index_if_exists`;
DROP PROCEDURE IF EXISTS `sp_add_index_if_missing`;
DELIMITER $$
CREATE PROCEDURE `sp_add_column_if_missing`(
IN in_table_name VARCHAR(128),
IN in_column_name VARCHAR(128),
IN in_definition TEXT
)
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND COLUMN_NAME = in_column_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` ADD COLUMN ', in_definition);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
CREATE PROCEDURE `sp_drop_index_if_exists`(
IN in_table_name VARCHAR(128),
IN in_index_name VARCHAR(128)
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND INDEX_NAME = in_index_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` DROP INDEX `', in_index_name, '`');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
CREATE PROCEDURE `sp_add_index_if_missing`(
IN in_table_name VARCHAR(128),
IN in_index_name VARCHAR(128),
IN in_definition TEXT
)
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND INDEX_NAME = in_index_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` ADD ', in_definition);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
DELIMITER ;
CALL `sp_add_column_if_missing`('tb_sys_api_key_resource_mapping', 'resource_type',
'`resource_type` varchar(32) NULL DEFAULT NULL COMMENT ''资源类型'' AFTER `api_key_resource_id`');
CALL `sp_add_column_if_missing`('tb_sys_api_key_resource_mapping', 'resource_target_id',
'`resource_target_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT ''资源目标ID'' AFTER `resource_type`');
CALL `sp_add_column_if_missing`('tb_sys_api_key_resource_mapping', 'action_scope',
'`action_scope` varchar(64) NULL DEFAULT NULL COMMENT ''动作范围'' AFTER `resource_target_id`');
CALL `sp_drop_index_if_exists`('tb_sys_api_key_resource_mapping', 'uni_api_key_resource');
CALL `sp_add_index_if_missing`(
'tb_sys_api_key_resource_mapping',
'uni_api_key_resource_scope',
'UNIQUE INDEX `uni_api_key_resource_scope`(`api_key_id`, `api_key_resource_id`, `resource_type`, `resource_target_id`, `action_scope`) USING BTREE'
);
CALL `sp_add_index_if_missing`(
'tb_sys_api_key_resource_mapping',
'idx_api_key_resource_scope_lookup',
'INDEX `idx_api_key_resource_scope_lookup`(`api_key_id`, `resource_type`, `resource_target_id`, `action_scope`) USING BTREE'
);
CREATE TABLE IF NOT EXISTS `tb_knowledge_share`
(
`id` bigint UNSIGNED NOT NULL COMMENT 'ID',
`knowledge_id` bigint UNSIGNED NOT NULL COMMENT '知识库ID',
`share_type` varchar(32) NOT NULL COMMENT '分享类型',
`share_code` varchar(64) NOT NULL COMMENT '分享码',
`share_token_hash` varchar(128) NOT NULL COMMENT '分享令牌哈希',
`status` varchar(32) NOT NULL COMMENT '分享状态',
`permission_set` text NULL COMMENT '授权范围',
`expires_at` datetime NOT NULL COMMENT '过期时间',
`tenant_id` bigint UNSIGNED NOT NULL COMMENT '租户ID',
`dept_id` bigint UNSIGNED NOT NULL COMMENT '部门ID',
`created` datetime NULL DEFAULT NULL COMMENT '创建时间',
`created_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '创建人',
`modified` datetime NULL DEFAULT NULL COMMENT '修改时间',
`modified_by` bigint UNSIGNED NULL DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uni_knowledge_share_code`(`share_code`) USING BTREE,
INDEX `idx_knowledge_share_knowledge_id`(`knowledge_id`) USING BTREE,
INDEX `idx_knowledge_share_expires_at`(`expires_at`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '知识库分享记录' ROW_FORMAT = Dynamic;
DROP PROCEDURE IF EXISTS `sp_add_column_if_missing`;
DROP PROCEDURE IF EXISTS `sp_drop_index_if_exists`;
DROP PROCEDURE IF EXISTS `sp_add_index_if_missing`;

View File

@@ -0,0 +1,121 @@
SET NAMES utf8mb4;
DROP PROCEDURE IF EXISTS `sp_drop_index_if_exists`;
DROP PROCEDURE IF EXISTS `sp_drop_column_if_exists`;
DROP PROCEDURE IF EXISTS `sp_rename_column_if_exists`;
DROP PROCEDURE IF EXISTS `sp_add_index_if_missing`;
DELIMITER $$
CREATE PROCEDURE `sp_drop_index_if_exists`(
IN in_table_name VARCHAR(128),
IN in_index_name VARCHAR(128)
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND INDEX_NAME = in_index_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` DROP INDEX `', in_index_name, '`');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
CREATE PROCEDURE `sp_drop_column_if_exists`(
IN in_table_name VARCHAR(128),
IN in_column_name VARCHAR(128)
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND COLUMN_NAME = in_column_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` DROP COLUMN `', in_column_name, '`');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
CREATE PROCEDURE `sp_rename_column_if_exists`(
IN in_table_name VARCHAR(128),
IN in_old_column VARCHAR(128),
IN in_new_column VARCHAR(128),
IN in_definition TEXT
)
BEGIN
IF EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND COLUMN_NAME = in_old_column
) AND NOT EXISTS (
SELECT 1
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND COLUMN_NAME = in_new_column
) THEN
SET @ddl = CONCAT(
'ALTER TABLE `', in_table_name, '` RENAME COLUMN `', in_old_column, '` TO `', in_new_column, '`'
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @ddl = CONCAT(
'ALTER TABLE `', in_table_name, '` MODIFY COLUMN `', in_new_column, '` ', in_definition
);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
CREATE PROCEDURE `sp_add_index_if_missing`(
IN in_table_name VARCHAR(128),
IN in_index_name VARCHAR(128),
IN in_definition TEXT
)
BEGIN
IF NOT EXISTS (
SELECT 1
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = in_table_name
AND INDEX_NAME = in_index_name
) THEN
SET @ddl = CONCAT('ALTER TABLE `', in_table_name, '` ADD ', in_definition);
PREPARE stmt FROM @ddl;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END $$
DELIMITER ;
CALL `sp_drop_index_if_exists`('tb_knowledge_share', 'uni_knowledge_share_code');
CALL `sp_rename_column_if_exists`(
'tb_knowledge_share',
'share_token_hash',
'share_key_hash',
'varchar(128) NOT NULL COMMENT ''分享访问密钥哈希'''
);
CALL `sp_drop_column_if_exists`('tb_knowledge_share', 'share_code');
CALL `sp_add_index_if_missing`(
'tb_knowledge_share',
'uni_knowledge_share_key_hash',
'UNIQUE INDEX `uni_knowledge_share_key_hash`(`share_key_hash`) USING BTREE'
);
DROP PROCEDURE IF EXISTS `sp_drop_index_if_exists`;
DROP PROCEDURE IF EXISTS `sp_drop_column_if_exists`;
DROP PROCEDURE IF EXISTS `sp_rename_column_if_exists`;
DROP PROCEDURE IF EXISTS `sp_add_index_if_missing`;