cosmo/backend/scripts/upgrade_menus_only.sql

127 lines
6.5 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

-- ============================================================
-- Production Database Upgrade Script (Simplified)
-- ============================================================
-- 目标:仅更新菜单相关数据
-- 1. 添加 celestial_bodies.short_name 字段
-- 2. 更新 menus 表
-- 3. 更新 role_menus 表
-- ============================================================
-- 开启"上帝模式":忽略外键约束和触发器
SET session_replication_role = 'replica';
BEGIN;
-- ============================================================
-- 1. Add short_name column to celestial_bodies
-- ============================================================
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_name = 'celestial_bodies'
AND column_name = 'short_name'
) THEN
ALTER TABLE celestial_bodies ADD COLUMN short_name VARCHAR(50);
RAISE NOTICE 'Added short_name column to celestial_bodies';
ELSE
RAISE NOTICE 'short_name column already exists';
END IF;
END $$;
-- ============================================================
-- 2. 更新 menus 表
-- ============================================================
-- 清空现有菜单数据
TRUNCATE TABLE menus CASCADE;
-- 插入新的菜单数据
INSERT INTO menus (id, parent_id, name, title, icon, path, component, sort_order, is_active, description, created_at, updated_at) VALUES
(1, NULL, 'dashboard', '控制台', 'dashboard', '/admin/dashboard', 'admin/Dashboard', 1, true, '系统控制台', '2025-11-28 18:07:11.767382', '2025-11-28 18:07:11.767382'),
(2, NULL, 'data_management', '数据管理', 'database', '', '', 2, true, '数据管理模块', '2025-11-28 18:07:11.767382', '2025-11-28 18:07:11.767382'),
(6, NULL, 'platform_management', '平台管理', 'settings', '', '', 3, true, '管理用户和系统参数', '2025-11-29 19:03:08.776597', '2025-11-29 19:03:08.776597'),
(14, NULL, 'user_profile', '个人资料', 'profile', '/user/profile', 'user/Profile', 1, true, '个人资料管理', '2025-12-18 16:26:11.778475', '2025-12-18 16:26:11.778475'),
(15, NULL, 'user_follow', '我的天体', 'star', '/user/follow', 'user/UserFollow', 2, true, '我关注的天体', '2025-12-18 16:27:48.688747', '2025-12-18 16:27:48.688747'),
(11, 2, 'star_systems', '恒星系统管理', 'StarOutlined', '/admin/star-systems', 'StarSystems', 1, true, '管理太阳系和系外恒星系统', '2025-12-06 02:35:21.137234', '2025-12-06 02:35:21.137234'),
(3, 2, 'celestial_bodies', '天体数据管理', NULL, '/admin/celestial-bodies', 'admin/CelestialBodies', 2, true, '查看和管理天体数据', '2025-11-28 18:07:11.767382', '2025-11-28 18:07:11.767382'),
(4, 2, 'static_data', '静态数据管理', NULL, '/admin/static-data', 'admin/StaticData', 2, true, '查看和管理静态数据(星座、星系等)', '2025-11-28 18:07:11.767382', '2025-11-28 18:07:11.767382'),
(5, 2, 'nasa_data', 'Horizon数据下载', NULL, '/admin/nasa-data', 'admin/NasaData', 3, true, '管理NASA Horizons数据下载', '2025-11-28 18:07:11.767382', '2025-11-28 18:07:11.767382'),
(13, 2, 'celestial_events', '天体事件', 'CalendarOutlined', '/admin/celestial-events', '', 4, true, '', '2025-12-15 03:20:39.798021', '2025-12-15 03:20:39.798021'),
(7, 6, 'user_management', '用户管理', NULL, '/admin/users', 'admin/Users', 1, true, '管理系统用户账号', '2025-11-29 19:03:08.776597', '2025-11-29 19:03:08.776597'),
(8, 6, 'platform_parameters_management', '平台参数管理', NULL, '/admin/settings', 'admin/Settings', 2, true, '管理系统通用配置参数', '2025-11-29 19:03:08.776597', '2025-11-29 19:03:08.776597'),
(12, 6, 'scheduled_jobs', '定时任务设置', 'ClockCircleOutlined', '/admin/scheduled-jobs', 'admin/ScheduledJobs', 5, true, '管理系统定时任务及脚本', '2025-12-10 17:42:38.031518', '2025-12-10 17:42:38.031518'),
(10, 6, 'system_tasks', '系统任务监控', 'schedule', '/admin/tasks', 'admin/Tasks', 30, true, '', '2025-11-30 16:04:59.572869', '2025-11-30 16:04:59.572869');
-- Reset sequence for menus
SELECT setval('menus_id_seq', (SELECT MAX(id) FROM menus));
-- ============================================================
-- 3. 更新 role_menus 表
-- ============================================================
-- 获取 admin 和 user 角色的实际 ID因为生产环境是 3 和 4
DO $$
DECLARE
admin_role_id INTEGER;
user_role_id INTEGER;
BEGIN
-- 查找 admin 角色 ID
SELECT id INTO admin_role_id FROM roles WHERE name = 'admin' LIMIT 1;
-- 查找 user 角色 ID
SELECT id INTO user_role_id FROM roles WHERE name = 'user' LIMIT 1;
IF admin_role_id IS NULL OR user_role_id IS NULL THEN
RAISE EXCEPTION 'Cannot find admin or user role';
END IF;
-- 插入 role_menus使用实际的 role_id
-- Admin role 可以访问所有菜单
INSERT INTO role_menus (role_id, menu_id) VALUES
(admin_role_id, 1), (admin_role_id, 2), (admin_role_id, 3), (admin_role_id, 4),
(admin_role_id, 5), (admin_role_id, 6), (admin_role_id, 7), (admin_role_id, 8),
(admin_role_id, 10), (admin_role_id, 11), (admin_role_id, 12), (admin_role_id, 13),
(admin_role_id, 14), (admin_role_id, 15);
-- User role 只能访问用户菜单
INSERT INTO role_menus (role_id, menu_id) VALUES
(user_role_id, 14), (user_role_id, 15);
RAISE NOTICE 'Inserted role_menus for admin_role_id=% and user_role_id=%', admin_role_id, user_role_id;
END $$;
-- ============================================================
-- 提交事务
-- ============================================================
COMMIT;
-- ============================================================
-- 恢复正常模式
-- ============================================================
SET session_replication_role = 'origin';
-- ============================================================
-- 验证结果
-- ============================================================
-- 检查 short_name 字段
SELECT 'celestial_bodies.short_name' as "Item",
CASE WHEN EXISTS(
SELECT 1 FROM information_schema.columns
WHERE table_name='celestial_bodies' AND column_name='short_name'
) THEN '✓ EXISTS' ELSE '✗ MISSING' END as "Status";
-- 检查记录数
SELECT 'menus' as "Table", COUNT(*)::text || ' records' as "Count" FROM menus
UNION ALL
SELECT 'role_menus', COUNT(*)::text || ' records' FROM role_menus;
-- 检查角色菜单分配
SELECT r.name as role, COUNT(rm.menu_id) as menu_count
FROM roles r
LEFT JOIN role_menus rm ON r.id = rm.role_id
GROUP BY r.id, r.name
ORDER BY r.name;