-- Author: fruit.com.cn -- FruitShorts 短剧服务 · 初始化数据(PostgreSQL 18,可重复执行) -- 演示账号:admin / admin123(其余种子账号密码相同) -- -- MySQL 的 ON DUPLICATE KEY UPDATE 在这里换成 ON CONFLICT (id) DO UPDATE; -- INSERT IGNORE 换成 ON CONFLICT DO NOTHING。 -- 末尾会把自增序列对齐到已有最大 ID,避免后续插入主键冲突。 -- ---------- 角色分类 ---------- INSERT INTO sys_role_category (id, name, description, sort) VALUES (1, '系统管理员', '负责账号、权限和菜单配置', 1), (2, '内容管理', '负责短剧与剧集内容维护', 2), (3, '数据分析', '负责查看运营数据', 3) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, description = EXCLUDED.description, sort = EXCLUDED.sort; -- ---------- 角色 ---------- INSERT INTO sys_role (id, name, code, category_id, level, description, status, is_builtin) VALUES (1, '超级管理员', 'super_admin', 1, 1, '拥有系统全部管理权限', 1, 1), (2, '内容运营', 'content_operator', 2, 2, '管理短剧、剧集及封面素材', 1, 1), (3, '审核专员', 'content_reviewer', 2, 3, '审核短剧内容与发布状态', 1, 1), (4, '数据分析师', 'data_analyst', 3, 4, '查看内容数据与运营报表', 1, 1) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, code = EXCLUDED.code, description = EXCLUDED.description, category_id = EXCLUDED.category_id, level = EXCLUDED.level; -- ---------- 权限点 ---------- INSERT INTO sys_permission (id, code, name, group_name, type, sort) VALUES (1, 'drama:list', '查看短剧列表', '短剧管理', 'BUTTON', 1), (2, 'drama:create', '创建短剧', '短剧管理', 'BUTTON', 2), (3, 'drama:update', '编辑短剧信息', '短剧管理', 'BUTTON', 3), (4, 'drama:delete', '删除短剧', '短剧管理', 'BUTTON', 4), (5, 'episode:list', '查看剧集列表', '剧集管理', 'BUTTON', 5), (6, 'episode:upload', '上传剧集视频', '剧集管理', 'BUTTON', 6), (7, 'episode:sort', '管理剧集排序', '剧集管理', 'BUTTON', 7), (8, 'cover:upload', '上传封面素材', '封面管理', 'BUTTON', 8), (9, 'drama:review', '审核并发布', '审核与系统', 'BUTTON', 9), (10, 'stat:view', '查看数据报表', '审核与系统', 'BUTTON', 10), (11, 'system:role', '角色与权限配置', '后台管理', 'BUTTON', 11), (12, 'system:admin-user', '管理员用户列表', '后台管理', 'BUTTON', 12), (13, 'system:menu', '菜单管理', '后台管理', 'BUTTON', 13), (14, 'system:role-category', '角色分类管理', '后台管理', 'BUTTON', 14), (15, 'banner:list', '查看轮播图', '运营编排', 'BUTTON', 15), (16, 'banner:create', '新建轮播图', '运营编排', 'BUTTON', 16), (17, 'banner:update', '编辑轮播图', '运营编排', 'BUTTON', 17), (18, 'banner:delete', '删除轮播图', '运营编排', 'BUTTON', 18), (19, 'log:list', '查看操作日志', '后台管理', 'BUTTON', 19) ON CONFLICT (id) DO UPDATE SET code = EXCLUDED.code, name = EXCLUDED.name, group_name = EXCLUDED.group_name, sort = EXCLUDED.sort; -- ---------- 菜单 ---------- INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES (1, 0, '工作台', '/dashboard', 'Dashboard', '#', '/dashboard/index', 'material-symbols:dashboard-rounded', 'drama:list', 'CATALOG', 0, 0, 1), (2, 1, '工作台', 'index', 'dashboard', 'views/common/DashboardView', '', '', 'drama:list', 'MENU', 0, 1, 1), (3, 0, '内容管理', '/content', 'Content', '#', '/content/dramas', 'material-symbols:video-library-rounded', 'drama:list', 'CATALOG', 1, 0, 2), (4, 3, '短剧管理', 'dramas', 'dramas', 'views/contentManagement/DramaManagementView', '', '', 'drama:list', 'MENU', 0, 0, 1), (5, 3, '剧集管理', 'episodes', 'episodes', 'views/contentManagement/EpisodeManagementView', '', '', 'episode:list', 'MENU', 0, 0, 2), (12, 3, '轮播图管理', 'banners', 'banners', 'views/contentManagement/BannerManagementView', '', '', 'banner:list', 'MENU', 0, 0, 3), (13, 3, '类型管理', 'categories', 'categories', 'views/contentManagement/CategoryManagementView','', '', 'drama:list', 'MENU', 0, 0, 4), (6, 0, '后台管理', '/system', 'System', '#', '/system/access', 'material-symbols:settings-rounded', 'system:role', 'CATALOG', 1, 0, 3), (7, 6, '角色权限配置', 'access', 'access', 'views/permission/RoleManagementView', '', '', 'system:role', 'MENU', 0, 0, 1), (8, 6, '管理员用户列表','admin-users','admin-users', 'views/userManagement/AdminUsersView', '', '', 'system:admin-user','MENU', 0, 0, 2), (9, 6, '菜单管理', 'menus', 'menus', 'views/permission/MenuManagementView', '', '', 'system:menu', 'MENU', 0, 0, 3), (10, 6, '角色分类', 'role-categories','role-categories','views/permission/RoleCategoriesView', '', '', 'system:role-category','MENU', 0, 0, 4), (11, 6, '系统设置', 'settings', 'settings', 'views/systemManagement/SettingsView', '', '', 'system:role', 'MENU', 0, 0, 5) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, redirect = EXCLUDED.redirect, icon = EXCLUDED.icon, permission_code = EXCLUDED.permission_code, type = EXCLUDED.type, always_show = EXCLUDED.always_show, affix = EXCLUDED.affix, sort = EXCLUDED.sort; -- 操作日志菜单(挂在后台管理下,仅超级管理员可见) INSERT INTO sys_menu (id, parent_id, title, route_path, route_name, component, redirect, icon, permission_code, type, always_show, affix, sort) VALUES (14, 6, '操作日志', 'operation-logs', 'operation-logs', 'views/systemManagement/OperationLogView', '', '', 'log:list', 'MENU', 0, 0, 6) ON CONFLICT (id) DO UPDATE SET parent_id = EXCLUDED.parent_id, title = EXCLUDED.title, route_path = EXCLUDED.route_path, route_name = EXCLUDED.route_name, component = EXCLUDED.component, redirect = EXCLUDED.redirect, icon = EXCLUDED.icon, permission_code = EXCLUDED.permission_code, type = EXCLUDED.type, always_show = EXCLUDED.always_show, affix = EXCLUDED.affix, sort = EXCLUDED.sort; -- K23:二级菜单统一只显示文字,历史图标值也一并清空。 UPDATE sys_menu SET icon = '' WHERE type = 'MENU'; -- ---------- 角色-权限 ---------- INSERT INTO sys_role_permission (id, role_id, permission_id) SELECT r.id * 1000000 + p.id, r.id, p.id FROM sys_role r CROSS JOIN sys_permission p WHERE r.code = 'super_admin' ON CONFLICT DO NOTHING; INSERT INTO sys_role_permission (id, role_id, permission_id) SELECT r.id * 1000000 + p.id, r.id, p.id FROM sys_role r CROSS JOIN sys_permission p WHERE r.code = 'content_operator' AND p.code IN ('drama:list','drama:create','drama:update','drama:delete', 'episode:list','episode:upload','episode:sort','cover:upload', 'banner:list','banner:create','banner:update','banner:delete') ON CONFLICT DO NOTHING; INSERT INTO sys_role_permission (id, role_id, permission_id) SELECT r.id * 1000000 + p.id, r.id, p.id FROM sys_role r CROSS JOIN sys_permission p WHERE r.code = 'content_reviewer' AND p.code IN ('drama:list','episode:list','drama:review','stat:view','banner:list') ON CONFLICT DO NOTHING; INSERT INTO sys_role_permission (id, role_id, permission_id) SELECT r.id * 1000000 + p.id, r.id, p.id FROM sys_role r CROSS JOIN sys_permission p WHERE r.code = 'data_analyst' AND p.code IN ('drama:list','stat:view','banner:list') ON CONFLICT DO NOTHING; -- ---------- 角色-菜单 ---------- INSERT INTO sys_role_menu (id, role_id, menu_id) SELECT r.id * 1000000 + m.id, r.id, m.id FROM sys_role r CROSS JOIN sys_menu m WHERE r.code = 'super_admin' ON CONFLICT DO NOTHING; INSERT INTO sys_role_menu (id, role_id, menu_id) SELECT r.id * 1000000 + m.id, r.id, m.id FROM sys_role r CROSS JOIN sys_menu m WHERE r.code IN ('content_operator','content_reviewer','data_analyst') AND m.id IN (1,2,3,4,5,12,13) ON CONFLICT DO NOTHING; -- ---------- 管理员(密码均为 admin123) ---------- INSERT INTO sys_admin_user (id, username, password, real_name, mobile, email, status, ip_whitelist, two_factor, last_login_at, created_at) VALUES (1001, 'admin', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '系统管理员', '', '', 1, '', 0, NULL, '2026-09-01 09:00:00'), (1002, 'lin.xiaoman', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '林小满', '', '', 1, '', 1, '2026-10-12 09:41:22', '2026-09-18 09:30:00'), (1003, 'content.editor01', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '陈一诺', '', '', 1, '', 0, '2026-10-11 16:20:15', '2026-09-21 10:15:00'), (1004, 'content.editor02', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '周子瑜', '', '', 1, '', 0, '2026-10-11 13:34:10', '2026-09-25 14:20:00'), (1005, 'content.reviewer01', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '林晓彤', '', '', 1, '', 1, '2026-10-10 11:20:08', '2026-10-02 11:05:00'), (1006, 'data.analyst01', '$2a$10$cknSDsmYgEADwwv0HdwzUOPqiz8D6mO/OOWMm3QEx.zmJW4iQqLcq', '程予安', '', '', 1, '', 0, '2026-10-09 14:10:02', '2026-10-05 13:02:00') ON CONFLICT (id) DO UPDATE SET username = EXCLUDED.username, real_name = EXCLUDED.real_name, status = EXCLUDED.status, two_factor = EXCLUDED.two_factor, last_login_at = EXCLUDED.last_login_at; INSERT INTO sys_admin_user_role (id, user_id, role_id) VALUES (1001000001, 1001, 1), (1002000001, 1002, 1), (1003000002, 1003, 2), (1004000002, 1004, 2), (1005000003, 1005, 3), (1006000004, 1006, 4) ON CONFLICT DO NOTHING; -- ---------- 系统配置 ---------- INSERT INTO sys_config (id, config_key, config_value, remark) VALUES (1, 'workspace.name', 'FruitShorts Studio', '工作空间名称'), (2, 'content.default-status', 'draft', '内容默认状态') ON CONFLICT (config_key) DO UPDATE SET config_value = EXCLUDED.config_value, remark = EXCLUDED.remark; -- ---------- 短剧类型 ---------- INSERT INTO drama_category (id, name, sort, status) VALUES (1, '都市情感', 1, 1), (2, '重生逆袭', 2, 1), (3, '甜宠爱情', 3, 1), (4, '悬疑复仇', 4, 1) ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, sort = EXCLUDED.sort, status = EXCLUDED.status; -- ---------- 短剧 ---------- INSERT INTO drama (id, code, title, category_id, genre, synopsis, total_episodes, free_episodes, unlock_coin, is_hot, status, published_at, view_count, sort, created_at) VALUES (1, 'D20250612001', '替嫁新娘:总裁的掌心宠', 1, '都市情感', '一场意外替嫁,让她成为冷面总裁的契约新娘。', 68, 3, 60, 1, 'published', '2025-06-12 10:00:00', 2400000, 1, '2025-06-01 09:00:00'), (2, 'D20250618002', '重生之我在豪门当千金', 2, '重生逆袭', '重活一世,她要拿回属于自己的一切。', 42, 3, 60, 0, 'reviewing', NULL, 0, 2, '2025-06-05 09:00:00'), (3, 'D20250529003', '心动信号:请和我恋爱', 3, '甜宠爱情', '恋爱观察室里,心动正在悄悄发生。', 56, 3, 50, 0, 'published', '2025-05-29 10:00:00', 1800000, 3, '2025-05-20 09:00:00'), (4, 'D20250620004', '她从深渊中走来', 4, '悬疑复仇', '真相只有一个,而她亲手揭开迷雾。', 24, 3, 80, 0, 'draft', NULL, 0, 4, '2025-06-15 09:00:00'), (5, 'D20250521005', '闪婚后,傅先生每天都在撒糖', 1, '都市情感', '一纸婚约,开启了甜蜜又心动的同居生活。', 72, 3, 60, 1, 'published', '2025-05-21 10:00:00', 3100000, 5, '2025-05-10 09:00:00') ON CONFLICT (id) DO UPDATE SET code = EXCLUDED.code, title = EXCLUDED.title, genre = EXCLUDED.genre, synopsis = EXCLUDED.synopsis, category_id = EXCLUDED.category_id, status = EXCLUDED.status, total_episodes = EXCLUDED.total_episodes, free_episodes = EXCLUDED.free_episodes, unlock_coin = EXCLUDED.unlock_coin, is_hot = EXCLUDED.is_hot, view_count = EXCLUDED.view_count; -- ---------- 剧集(示例:短剧 1) ---------- INSERT INTO drama_episode (id, drama_id, ep_no, title, duration_sec, is_free, unlock_coin, status, play_count) VALUES (1, 1, 1, '命运的相遇', 138, 1, 0, 'published', 48201), (2, 1, 2, '意外的婚约', 116, 1, 0, 'published', 42817), (3, 1, 3, '心动的开始', 124, 1, 0, 'published', 39506), (4, 1, 4, '他的秘密', 151, 0, 60, 'draft', 0) ON CONFLICT (id) DO UPDATE SET drama_id = EXCLUDED.drama_id, ep_no = EXCLUDED.ep_no, title = EXCLUDED.title, duration_sec = EXCLUDED.duration_sec, is_free = EXCLUDED.is_free, unlock_coin = EXCLUDED.unlock_coin, status = EXCLUDED.status, play_count = EXCLUDED.play_count; -- ---------- 关于主键 ---------- -- S0 之后主键由应用侧雪花算法生成(MyBatis-Plus IdType.ASSIGN_ID),数据库里已经没有自增序列, -- 所以本文件不再需要"把 IDENTITY 序列对齐到最大 ID"那段收尾逻辑(原来那段是防止显式 ID 之后 -- 自增从 1 重新开始而撞主键;序列已经不存在,这个风险也随之消失)。 -- -- 种子行的主键约定(三端一致,改动时请沿用): -- 1) 普通种子行沿用既有小整数区间(如角色 1-5、菜单 1-30、管理员 1001+); -- 2) 关联表用「左键 * 1000000 + 右键」拼出的确定性 ID,重复执行结果完全一致; -- 3) 应用运行时产生的数据才用雪花 ID(19 位),两者不会相撞。