kt-template-online-api/sql/system-notice-menu.sql

370 lines
13 KiB
SQL

-- 增量初始化系统事件站内信表与菜单权限。
-- 用途:已有库不需要重跑完整 vben-admin-init.sql 时,补齐日志级事件通知能力。
SET NAMES utf8mb4;
CREATE TABLE IF NOT EXISTS `admin_notice` (
`id` bigint NOT NULL,
`title` varchar(255) NOT NULL,
`content` longtext NOT NULL,
`summary` text DEFAULT NULL,
`level` int NOT NULL DEFAULT 1,
`status` int NOT NULL DEFAULT 1,
`severity` varchar(16) NOT NULL DEFAULT 'info',
`source` varchar(64) NOT NULL DEFAULT 'system',
`event_type` varchar(120) NOT NULL DEFAULT 'system.event',
`dedupe_key` varchar(255) DEFAULT NULL,
`occurrence_count` int NOT NULL DEFAULT 1,
`notify_role_code` varchar(64) NOT NULL DEFAULT 'super',
`metadata` json DEFAULT NULL,
`is_top` tinyint(1) NOT NULL DEFAULT 0,
`notify_users` text DEFAULT NULL,
`created_by` bigint DEFAULT NULL,
`is_deleted` tinyint(1) NOT NULL DEFAULT 0,
`active_dedupe_key` varchar(255) GENERATED ALWAYS AS (CASE WHEN `is_deleted` = 0 AND `dedupe_key` IS NOT NULL THEN `dedupe_key` ELSE NULL END) VIRTUAL,
`create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`first_seen_at` datetime DEFAULT NULL,
`last_seen_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_admin_notice_active_dedupe_key` (`active_dedupe_key`),
KEY `idx_admin_notice_status` (`status`),
KEY `idx_admin_notice_severity` (`severity`),
KEY `idx_admin_notice_source_event` (`source`, `event_type`),
KEY `idx_admin_notice_dedupe_key` (`dedupe_key`),
KEY `idx_admin_notice_notify_role` (`notify_role_code`),
KEY `idx_admin_notice_is_top` (`is_top`),
KEY `idx_admin_notice_is_deleted` (`is_deleted`),
KEY `idx_admin_notice_create_time` (`create_time`),
KEY `idx_admin_notice_last_seen` (`last_seen_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SET @admin_notice_severity_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'severity'
);
SET @admin_notice_severity_sql := IF(
@admin_notice_severity_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `severity` varchar(16) NOT NULL DEFAULT ''info'' AFTER `status`',
'SELECT 1'
);
PREPARE admin_notice_severity_stmt FROM @admin_notice_severity_sql;
EXECUTE admin_notice_severity_stmt;
DEALLOCATE PREPARE admin_notice_severity_stmt;
SET @admin_notice_source_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'source'
);
SET @admin_notice_source_sql := IF(
@admin_notice_source_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `source` varchar(64) NOT NULL DEFAULT ''system'' AFTER `severity`',
'SELECT 1'
);
PREPARE admin_notice_source_stmt FROM @admin_notice_source_sql;
EXECUTE admin_notice_source_stmt;
DEALLOCATE PREPARE admin_notice_source_stmt;
SET @admin_notice_event_type_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'event_type'
);
SET @admin_notice_event_type_sql := IF(
@admin_notice_event_type_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `event_type` varchar(120) NOT NULL DEFAULT ''system.event'' AFTER `source`',
'SELECT 1'
);
PREPARE admin_notice_event_type_stmt FROM @admin_notice_event_type_sql;
EXECUTE admin_notice_event_type_stmt;
DEALLOCATE PREPARE admin_notice_event_type_stmt;
SET @admin_notice_dedupe_key_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'dedupe_key'
);
SET @admin_notice_dedupe_key_sql := IF(
@admin_notice_dedupe_key_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `dedupe_key` varchar(255) DEFAULT NULL AFTER `event_type`',
'SELECT 1'
);
PREPARE admin_notice_dedupe_key_stmt FROM @admin_notice_dedupe_key_sql;
EXECUTE admin_notice_dedupe_key_stmt;
DEALLOCATE PREPARE admin_notice_dedupe_key_stmt;
SET @admin_notice_active_dedupe_key_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'active_dedupe_key'
);
SET @admin_notice_active_dedupe_key_sql := IF(
@admin_notice_active_dedupe_key_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `active_dedupe_key` varchar(255) GENERATED ALWAYS AS (CASE WHEN `is_deleted` = 0 AND `dedupe_key` IS NOT NULL THEN `dedupe_key` ELSE NULL END) VIRTUAL AFTER `dedupe_key`',
'SELECT 1'
);
PREPARE admin_notice_active_dedupe_key_stmt FROM @admin_notice_active_dedupe_key_sql;
EXECUTE admin_notice_active_dedupe_key_stmt;
DEALLOCATE PREPARE admin_notice_active_dedupe_key_stmt;
SET @admin_notice_occurrence_count_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'occurrence_count'
);
SET @admin_notice_occurrence_count_sql := IF(
@admin_notice_occurrence_count_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `occurrence_count` int NOT NULL DEFAULT 1 AFTER `dedupe_key`',
'SELECT 1'
);
PREPARE admin_notice_occurrence_count_stmt FROM @admin_notice_occurrence_count_sql;
EXECUTE admin_notice_occurrence_count_stmt;
DEALLOCATE PREPARE admin_notice_occurrence_count_stmt;
SET @admin_notice_notify_role_code_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'notify_role_code'
);
SET @admin_notice_notify_role_code_sql := IF(
@admin_notice_notify_role_code_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `notify_role_code` varchar(64) NOT NULL DEFAULT ''super'' AFTER `occurrence_count`',
'SELECT 1'
);
PREPARE admin_notice_notify_role_code_stmt FROM @admin_notice_notify_role_code_sql;
EXECUTE admin_notice_notify_role_code_stmt;
DEALLOCATE PREPARE admin_notice_notify_role_code_stmt;
SET @admin_notice_metadata_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'metadata'
);
SET @admin_notice_metadata_sql := IF(
@admin_notice_metadata_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `metadata` json DEFAULT NULL AFTER `notify_role_code`',
'SELECT 1'
);
PREPARE admin_notice_metadata_stmt FROM @admin_notice_metadata_sql;
EXECUTE admin_notice_metadata_stmt;
DEALLOCATE PREPARE admin_notice_metadata_stmt;
SET @admin_notice_first_seen_at_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'first_seen_at'
);
SET @admin_notice_first_seen_at_sql := IF(
@admin_notice_first_seen_at_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `first_seen_at` datetime DEFAULT NULL AFTER `update_time`',
'SELECT 1'
);
PREPARE admin_notice_first_seen_at_stmt FROM @admin_notice_first_seen_at_sql;
EXECUTE admin_notice_first_seen_at_stmt;
DEALLOCATE PREPARE admin_notice_first_seen_at_stmt;
SET @admin_notice_last_seen_at_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND COLUMN_NAME = 'last_seen_at'
);
SET @admin_notice_last_seen_at_sql := IF(
@admin_notice_last_seen_at_exists = 0,
'ALTER TABLE `admin_notice` ADD COLUMN `last_seen_at` datetime DEFAULT NULL AFTER `first_seen_at`',
'SELECT 1'
);
PREPARE admin_notice_last_seen_at_stmt FROM @admin_notice_last_seen_at_sql;
EXECUTE admin_notice_last_seen_at_stmt;
DEALLOCATE PREPARE admin_notice_last_seen_at_stmt;
SET @admin_notice_uk_active_dedupe_key_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'uk_admin_notice_active_dedupe_key'
);
SET @admin_notice_uk_active_dedupe_key_sql := IF(
@admin_notice_uk_active_dedupe_key_exists = 0,
'ALTER TABLE `admin_notice` ADD UNIQUE KEY `uk_admin_notice_active_dedupe_key` (`active_dedupe_key`)',
'SELECT 1'
);
PREPARE admin_notice_uk_active_dedupe_key_stmt FROM @admin_notice_uk_active_dedupe_key_sql;
EXECUTE admin_notice_uk_active_dedupe_key_stmt;
DEALLOCATE PREPARE admin_notice_uk_active_dedupe_key_stmt;
SET @admin_notice_idx_severity_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'idx_admin_notice_severity'
);
SET @admin_notice_idx_severity_sql := IF(
@admin_notice_idx_severity_exists = 0,
'ALTER TABLE `admin_notice` ADD INDEX `idx_admin_notice_severity` (`severity`)',
'SELECT 1'
);
PREPARE admin_notice_idx_severity_stmt FROM @admin_notice_idx_severity_sql;
EXECUTE admin_notice_idx_severity_stmt;
DEALLOCATE PREPARE admin_notice_idx_severity_stmt;
SET @admin_notice_idx_source_event_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'idx_admin_notice_source_event'
);
SET @admin_notice_idx_source_event_sql := IF(
@admin_notice_idx_source_event_exists = 0,
'ALTER TABLE `admin_notice` ADD INDEX `idx_admin_notice_source_event` (`source`, `event_type`)',
'SELECT 1'
);
PREPARE admin_notice_idx_source_event_stmt FROM @admin_notice_idx_source_event_sql;
EXECUTE admin_notice_idx_source_event_stmt;
DEALLOCATE PREPARE admin_notice_idx_source_event_stmt;
SET @admin_notice_idx_dedupe_key_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'idx_admin_notice_dedupe_key'
);
SET @admin_notice_idx_dedupe_key_sql := IF(
@admin_notice_idx_dedupe_key_exists = 0,
'ALTER TABLE `admin_notice` ADD INDEX `idx_admin_notice_dedupe_key` (`dedupe_key`)',
'SELECT 1'
);
PREPARE admin_notice_idx_dedupe_key_stmt FROM @admin_notice_idx_dedupe_key_sql;
EXECUTE admin_notice_idx_dedupe_key_stmt;
DEALLOCATE PREPARE admin_notice_idx_dedupe_key_stmt;
SET @admin_notice_idx_notify_role_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'idx_admin_notice_notify_role'
);
SET @admin_notice_idx_notify_role_sql := IF(
@admin_notice_idx_notify_role_exists = 0,
'ALTER TABLE `admin_notice` ADD INDEX `idx_admin_notice_notify_role` (`notify_role_code`)',
'SELECT 1'
);
PREPARE admin_notice_idx_notify_role_stmt FROM @admin_notice_idx_notify_role_sql;
EXECUTE admin_notice_idx_notify_role_stmt;
DEALLOCATE PREPARE admin_notice_idx_notify_role_stmt;
SET @admin_notice_idx_last_seen_exists := (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'admin_notice'
AND INDEX_NAME = 'idx_admin_notice_last_seen'
);
SET @admin_notice_idx_last_seen_sql := IF(
@admin_notice_idx_last_seen_exists = 0,
'ALTER TABLE `admin_notice` ADD INDEX `idx_admin_notice_last_seen` (`last_seen_at`)',
'SELECT 1'
);
PREPARE admin_notice_idx_last_seen_stmt FROM @admin_notice_idx_last_seen_sql;
EXECUTE admin_notice_idx_last_seen_stmt;
DEALLOCATE PREPARE admin_notice_idx_last_seen_stmt;
INSERT INTO `admin_menu` (
`id`,
`pid`,
`name`,
`path`,
`component`,
`redirect`,
`auth_code`,
`type`,
`meta`,
`status`,
`sort`
)
VALUES (
2041700000000100206,
2041700000000100002,
'SystemNotice',
'/system/notice',
'/system/notice/list',
NULL,
'System:Notice:List',
'menu',
'{"icon":"mdi:bell-outline","title":"system.notice.title"}',
1,
7
)
ON DUPLICATE KEY UPDATE
`pid` = VALUES(`pid`),
`path` = VALUES(`path`),
`component` = VALUES(`component`),
`redirect` = VALUES(`redirect`),
`auth_code` = VALUES(`auth_code`),
`type` = VALUES(`type`),
`meta` = VALUES(`meta`),
`status` = VALUES(`status`),
`sort` = VALUES(`sort`),
`is_deleted` = 0;
DELETE role_menu
FROM `admin_role_menu` role_menu
JOIN `admin_menu` menu ON menu.`id` = role_menu.`menu_id`
WHERE menu.`name` IN ('SystemNoticeCreate');
DELETE FROM `admin_menu`
WHERE `name` IN ('SystemNoticeCreate');
INSERT INTO `admin_menu` (
`id`,
`pid`,
`name`,
`path`,
`component`,
`redirect`,
`auth_code`,
`type`,
`meta`,
`status`,
`sort`
)
VALUES
(2041700000000120212, 2041700000000100206, 'SystemNoticeEdit', NULL, NULL, NULL, 'System:Notice:Edit', 'button', '{"title":"system.notice.markHandled"}', 1, 1),
(2041700000000120213, 2041700000000100206, 'SystemNoticeDelete', NULL, NULL, NULL, 'System:Notice:Delete', 'button', '{"title":"common.delete"}', 1, 2)
ON DUPLICATE KEY UPDATE
`pid` = VALUES(`pid`),
`path` = VALUES(`path`),
`component` = VALUES(`component`),
`redirect` = VALUES(`redirect`),
`auth_code` = VALUES(`auth_code`),
`type` = VALUES(`type`),
`meta` = VALUES(`meta`),
`status` = VALUES(`status`),
`sort` = VALUES(`sort`),
`is_deleted` = 0;
DELETE role_menu
FROM `admin_role_menu` role_menu
JOIN `admin_role` role ON role.`id` = role_menu.`role_id`
JOIN `admin_menu` menu ON menu.`id` = role_menu.`menu_id`
WHERE role.`role_code` <> 'super'
AND menu.`name` IN ('SystemNotice', 'SystemNoticeEdit', 'SystemNoticeDelete');
INSERT IGNORE INTO `admin_role_menu` (`role_id`, `menu_id`)
SELECT role.`id`, menu.`id`
FROM `admin_role` role
JOIN `admin_menu` menu ON menu.`name` IN ('SystemNotice', 'SystemNoticeEdit', 'SystemNoticeDelete')
WHERE role.`role_code` = 'super'
AND role.`is_deleted` = 0
AND menu.`is_deleted` = 0;