feat(msg): announcements 公告模块 + sendBatch 批量优化 + 权限扩展 + nextstep 文档
This commit is contained in:
@@ -138,6 +138,29 @@ CREATE TABLE IF NOT EXISTS `iam_password_history` (
|
||||
INDEX `idx_iam_password_history_user` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 1.11 TOTP 2FA 密钥表(RFC 6238)
|
||||
CREATE TABLE IF NOT EXISTS `iam_user_totp` (
|
||||
`id` CHAR(36) NOT NULL,
|
||||
`user_id` CHAR(36) NOT NULL,
|
||||
`secret` VARCHAR(128) NOT NULL,
|
||||
`status` ENUM('pending','active') NOT NULL DEFAULT 'pending',
|
||||
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uniq_iam_user_totp_user` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 1.12 TOTP 备份码表(10 个一次性使用)
|
||||
CREATE TABLE IF NOT EXISTS `iam_totp_backup_codes` (
|
||||
`id` CHAR(36) NOT NULL,
|
||||
`user_id` CHAR(36) NOT NULL,
|
||||
`code_hash` VARCHAR(255) NOT NULL,
|
||||
`used_at` TIMESTAMP NULL,
|
||||
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `idx_iam_totp_backup_codes_user` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
|
||||
-- ============================================================
|
||||
-- 2. Classes 服务(services/classes/src/classes/classes.schema.ts)
|
||||
@@ -607,3 +630,34 @@ CREATE TABLE IF NOT EXISTS `processed_events` (
|
||||
`processed_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`event_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 5.7 公告主表(广播公告,一条对应一个目标受众)
|
||||
CREATE TABLE IF NOT EXISTS `msg_announcements` (
|
||||
`id` VARCHAR(32) NOT NULL,
|
||||
`title` VARCHAR(255) NOT NULL,
|
||||
`content` TEXT NOT NULL,
|
||||
`status` VARCHAR(32) NOT NULL DEFAULT 'draft',
|
||||
`is_pinned` BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
`author_id` VARCHAR(32) NOT NULL,
|
||||
`target_audience` VARCHAR(32) NOT NULL DEFAULT 'all',
|
||||
`metadata` JSON NULL,
|
||||
`published_at` TIMESTAMP NULL,
|
||||
`archived_at` TIMESTAMP NULL,
|
||||
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
INDEX `idx_msg_announcements_status` (`status`),
|
||||
INDEX `idx_msg_announcements_audience` (`target_audience`),
|
||||
INDEX `idx_msg_announcements_pinned` (`is_pinned`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
-- 5.8 公告已读表(每用户已读跟踪,幂等)
|
||||
CREATE TABLE IF NOT EXISTS `msg_announcement_reads` (
|
||||
`id` VARCHAR(32) NOT NULL,
|
||||
`announcement_id` VARCHAR(32) NOT NULL,
|
||||
`user_id` VARCHAR(32) NOT NULL,
|
||||
`read_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uniq_announcement_user` (`announcement_id`, `user_id`),
|
||||
INDEX `idx_msg_announcement_reads_user` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
|
||||
Reference in New Issue
Block a user