Files
nl-blogs/server/scripts/migrate_video_module.sql
2026-07-04 17:58:19 +08:00

128 lines
6.8 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ============================================================
-- 视频模块 + 作品演示视频 数据库迁移脚本
-- 文件server/scripts/migrate_video_module.sql
-- 说明:可重复执行(幂等),适用于已有 nl_blog 数据库的增量升级
-- 用法mysql -u root -p your_database < scripts/migrate_video_module.sql
-- ============================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- 1. 视频分类表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `video_categories` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '分类名称',
`slug` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URL标识',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '分类描述',
`sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序(越小越靠前)',
`deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
`created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间Unix秒',
`updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间Unix秒',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_slug`(`slug` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频分类表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- 2. 视频专辑表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `video_albums` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '专辑ID',
`name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '专辑名称',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '专辑描述',
`cover` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '专辑封面URL',
`category_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属视频分类ID',
`is_active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用0否 1是',
`sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序(越小越靠前)',
`deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
`created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间Unix秒',
`updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间Unix秒',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_category_id`(`category_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频专辑表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- 3. 视频表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `videos` (
`id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频唯一标识',
`title` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频标题',
`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '视频描述',
`video_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频文件URL',
`cover` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '封面图URL',
`poster` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '播放器封面URL',
`category_id` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属视频分类ID',
`duration` int NOT NULL DEFAULT 0 COMMENT '时长(秒)',
`is_published` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否发布0草稿 1已发布',
`deleted_at` bigint NOT NULL DEFAULT 0 COMMENT '软删除时间戳',
`created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间Unix秒',
`updated_at` bigint NOT NULL DEFAULT 0 COMMENT '更新时间Unix秒',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_category_id`(`category_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '视频表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- 4. 专辑-视频关联表
-- ----------------------------
CREATE TABLE IF NOT EXISTS `album_videos` (
`album_id` int UNSIGNED NOT NULL COMMENT '专辑ID',
`video_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '视频ID',
`sort_order` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '专辑内排序',
`created_at` bigint NOT NULL DEFAULT 0 COMMENT '创建时间Unix秒',
PRIMARY KEY (`album_id`, `video_id`) USING BTREE,
INDEX `idx_video_id`(`video_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '专辑视频关联表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- 5. 作品表新增演示视频字段(幂等添加)
-- ----------------------------
-- 5.1 hero_video独立上传的视频 URL
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'works' AND COLUMN_NAME = 'hero_video'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `works` ADD COLUMN `hero_video` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ''演示视频URL'' AFTER `hero_img`',
'SELECT ''works.hero_video already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- 5.2 video_id关联 videos 表 ID从视频库选择时使用
SET @col_exists = (
SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'works' AND COLUMN_NAME = 'video_id'
);
SET @sql = IF(@col_exists = 0,
'ALTER TABLE `works` ADD COLUMN `video_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT ''关联视频库ID'' AFTER `hero_video`',
'SELECT ''works.video_id already exists'' AS info'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- ----------------------------
-- 6. 视频模块后台权限videos:read/create/update/delete
-- ----------------------------
INSERT IGNORE INTO `permissions` (`name`, `resource`, `action`, `deleted_at`, `created_at`, `updated_at`) VALUES
('videos:read', 'videos', 'read', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
('videos:create', 'videos', 'create', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
('videos:update', 'videos', 'update', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
('videos:delete', 'videos', 'delete', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
-- 为管理员角色role_id = 1授予 videos 权限
INSERT IGNORE INTO `role_permissions` (`role_id`, `permission_id`)
SELECT 1, p.id FROM `permissions` p
WHERE p.resource = 'videos' AND p.deleted_at = 0
AND NOT EXISTS (
SELECT 1 FROM `role_permissions` rp
WHERE rp.role_id = 1 AND rp.permission_id = p.id
);
SET FOREIGN_KEY_CHECKS = 1;
SELECT 'migrate_video_module.sql executed successfully' AS result;