-- iMeeting latest seed initialization script -- 用途: -- 1. 面向“已执行最新全量建表脚本”的全新部署 -- 2. 仅初始化系统基础数据,不包含历史会议、附件、任务、知识库等业务数据 -- 3. 尽量支持重复执行(幂等),便于新库初始化或回放 -- -- 重要前提: -- 1. 已先执行 imeeting-schema-latest.sql -- 2. 当前库已存在以下最新结构: -- sys_roles / sys_users / sys_menus / sys_role_menu_permissions -- prompts(desc,is_system) / prompt_config -- sys_system_parameters / llm_model_config / audio_model_config -- hot_word_group / hot_word_item / sys_dict_data -- -- 默认账号: -- admin / admin123 -- demo / 123456 -- -- 说明: -- 1. 模型 API Key 默认留空,优先走环境变量配置 -- 2. ASR 默认绑定“默认热词组”,首次执行后仍可在后台继续同步词表 SET NAMES utf8mb4; START TRANSACTION; -- ===================================================================== -- 1. 基础角色 -- ===================================================================== INSERT INTO `sys_roles` (`role_id`, `role_name`, `created_at`) VALUES (1, '平台管理员', NOW()), (2, '普通用户', NOW()) ON DUPLICATE KEY UPDATE `role_name` = VALUES(`role_name`); -- ===================================================================== -- 2. 基础用户 -- 密码说明: -- admin -> admin123 -- demo -> 123456 -- ===================================================================== INSERT INTO `sys_users` (`user_id`, `username`, `caption`, `email`, `avatar_url`, `password_hash`, `role_id`, `created_at`) VALUES (1, 'admin', '系统管理员', 'admin@imeeting.local', NULL, '240be518fabd2724ddb6f04eeb1da5967448d7e831c08c8fa822809f74c720a9', 1, NOW()), (2, 'demo', '演示用户', 'demo@imeeting.local', NULL, '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', 2, NOW()) ON DUPLICATE KEY UPDATE `username` = VALUES(`username`), `caption` = VALUES(`caption`), `email` = VALUES(`email`), `avatar_url` = VALUES(`avatar_url`), `password_hash` = VALUES(`password_hash`), `role_id` = VALUES(`role_id`); -- ===================================================================== -- 3. 系统默认提示词模版 -- ===================================================================== INSERT INTO `prompts` (`id`, `name`, `task_type`, `content`, `desc`, `is_default`, `is_active`, `creator_id`, `is_system`, `created_at`) VALUES ( 1, '系统默认会议总结', 'MEETING_TASK', '你是一名专业的会议纪要助手。请基于会议转写内容输出结构化 Markdown,总结以下内容: ## 会议概览 - 说明会议主题、时间、参与方、目标 ## 核心讨论 - 按议题归纳讨论重点,不按逐句流水账整理 ## 决策事项 - 明确已经形成共识的决定、口径与结论 ## 待办事项 - 使用表格列出事项、责任人、时间要求、当前状态 ## 风险与建议 - 提醒未决问题、依赖项、潜在风险,并给出后续建议 输出要求: 1. 仅基于原文,不臆测未提及内容 2. 信息缺失时明确标注“未提及” 3. 语言简洁、可直接归档共享', '会议转写默认总结模板', 1, 1, 1, 1, NOW() ), ( 2, '系统默认知识整理', 'KNOWLEDGE_TASK', '你是一名专业的知识整理助手。请基于输入材料生成一篇适合归档到知识库的 Markdown 文档,包含以下部分: ## 标题 - 产出准确、可检索的标题 ## 摘要 - 用 3 至 5 句话概括核心内容 ## 关键事实 - 提炼重要信息、规则、约束和背景 ## 操作步骤或处理方案 - 如果材料中包含流程或做法,请按步骤梳理 ## 风险与注意事项 - 标记边界条件、限制项和容易出错的点 ## 相关名词与标签 - 提炼适合检索和分类的关键词 输出要求: 1. 保持事实准确,避免编造 2. 优先结构化、可复用、可沉淀 3. 文风专业、简洁、便于知识检索', '知识库整理默认模板', 1, 1, 1, 1, NOW() ) ON DUPLICATE KEY UPDATE `name` = VALUES(`name`), `task_type` = VALUES(`task_type`), `content` = VALUES(`content`), `desc` = VALUES(`desc`), `is_default` = VALUES(`is_default`), `is_active` = VALUES(`is_active`), `creator_id` = VALUES(`creator_id`), `is_system` = VALUES(`is_system`); -- 为初始化账号补充默认模版启用配置 INSERT INTO `prompt_config` (`user_id`, `task_type`, `prompt_id`, `is_enabled`, `sort_order`, `created_at`, `updated_at`) VALUES (1, 'MEETING_TASK', 1, 1, 1, NOW(), NOW()), (1, 'KNOWLEDGE_TASK', 2, 1, 1, NOW(), NOW()), (2, 'MEETING_TASK', 1, 1, 1, NOW(), NOW()), (2, 'KNOWLEDGE_TASK', 2, 1, 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE `is_enabled` = VALUES(`is_enabled`), `sort_order` = VALUES(`sort_order`), `updated_at` = VALUES(`updated_at`); -- ===================================================================== -- 4. 系统参数 -- ===================================================================== INSERT INTO `sys_system_parameters` (`param_key`, `param_name`, `param_value`, `value_type`, `category`, `description`, `is_active`, `created_at`, `updated_at`) VALUES ('token_expire_days', 'Token过期时间', '7', 'number', 'system', '控制登录 token 的过期时间,单位:天。', 1, NOW(), NOW()), ('default_reset_password', '默认重置密码', '123456', 'string', 'system', '管理员重置用户密码时使用的默认密码。', 1, NOW(), NOW()), ('page_size', '系统分页大小', '10', 'number', 'public', '系统通用分页数量。', 1, NOW(), NOW()), ('max_audio_size', '音频上传大小限制', '100', 'number', 'public', '音频上传大小限制,单位:MB。', 1, NOW(), NOW()), ('max_image_size', '图片上传大小限制', '10', 'number', 'public', '图片上传大小限制,单位:MB。', 1, NOW(), NOW()), ('app_name', '系统名称', 'iMeeting', 'string', 'public', '前端应用标题。', 1, NOW(), NOW()), ('console_subtitle', '控制台副标题', '智能会议协作平台', 'string', 'public', '登录后控制台副标题。', 1, NOW(), NOW()), ('preview_title', '会议预览标题', '会议预览', 'string', 'public', '会议预览页标题。', 1, NOW(), NOW()), ('login_welcome', '登录欢迎语', '欢迎登录 iMeeting,请输入您的账号信息。', 'string', 'public', '登录页欢迎语。', 1, NOW(), NOW()), ('footer_text', '页脚文案', '©2026 iMeeting', 'string', 'public', '系统页脚文案。', 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE `param_name` = VALUES(`param_name`), `param_value` = VALUES(`param_value`), `value_type` = VALUES(`value_type`), `category` = VALUES(`category`), `description` = VALUES(`description`), `is_active` = VALUES(`is_active`), `updated_at` = VALUES(`updated_at`); -- ===================================================================== -- 5. 默认热词组与热词 -- ===================================================================== INSERT INTO `hot_word_group` (`name`, `description`, `status`, `create_time`, `update_time`) SELECT '默认热词组', '系统初始化热词组,供默认 ASR 模型绑定使用。', 1, NOW(), NOW() FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM `hot_word_group` WHERE `name` = '默认热词组' ); UPDATE `hot_word_group` SET `description` = '系统初始化热词组,供默认 ASR 模型绑定使用。', `status` = 1, `update_time` = NOW() WHERE `name` = '默认热词组'; SET @default_hot_word_group_id := ( SELECT `id` FROM `hot_word_group` WHERE `name` = '默认热词组' ORDER BY `id` LIMIT 1 ); INSERT INTO `hot_word_item` (`group_id`, `text`, `weight`, `lang`, `status`, `create_time`, `update_time`) SELECT @default_hot_word_group_id, 'iMeeting', 8, 'zh', 1, NOW(), NOW() FROM DUAL WHERE @default_hot_word_group_id IS NOT NULL ON DUPLICATE KEY UPDATE `weight` = VALUES(`weight`), `lang` = VALUES(`lang`), `status` = VALUES(`status`), `update_time` = VALUES(`update_time`); INSERT INTO `hot_word_item` (`group_id`, `text`, `weight`, `lang`, `status`, `create_time`, `update_time`) SELECT @default_hot_word_group_id, '会议纪要', 7, 'zh', 1, NOW(), NOW() FROM DUAL WHERE @default_hot_word_group_id IS NOT NULL ON DUPLICATE KEY UPDATE `weight` = VALUES(`weight`), `lang` = VALUES(`lang`), `status` = VALUES(`status`), `update_time` = VALUES(`update_time`); INSERT INTO `hot_word_item` (`group_id`, `text`, `weight`, `lang`, `status`, `create_time`, `update_time`) SELECT @default_hot_word_group_id, '语音转写', 6, 'zh', 1, NOW(), NOW() FROM DUAL WHERE @default_hot_word_group_id IS NOT NULL ON DUPLICATE KEY UPDATE `weight` = VALUES(`weight`), `lang` = VALUES(`lang`), `status` = VALUES(`status`), `update_time` = VALUES(`update_time`); -- ===================================================================== -- 6. 默认模型配置 -- ===================================================================== INSERT INTO `llm_model_config` (`model_code`, `model_name`, `provider`, `endpoint_url`, `api_key`, `llm_model_name`, `llm_timeout`, `llm_temperature`, `llm_top_p`, `llm_max_tokens`, `llm_system_prompt`, `description`, `is_active`, `is_default`, `created_at`, `updated_at`) VALUES ( 'llm_model', '默认文本模型', 'dashscope', 'https://dashscope.aliyuncs.com/compatible-mode/v1', NULL, 'qwen-plus', 120, 0.70, 0.90, 2048, '你是一名专业的会议与知识整理助手,请基于输入内容给出准确、结构化、可复用的输出。', '系统初始化的默认 LLM 模型配置,API Key 优先使用环境变量。', 1, 1, NOW(), NOW() ) ON DUPLICATE KEY UPDATE `model_name` = VALUES(`model_name`), `provider` = VALUES(`provider`), `endpoint_url` = VALUES(`endpoint_url`), `api_key` = VALUES(`api_key`), `llm_model_name` = VALUES(`llm_model_name`), `llm_timeout` = VALUES(`llm_timeout`), `llm_temperature` = VALUES(`llm_temperature`), `llm_top_p` = VALUES(`llm_top_p`), `llm_max_tokens` = VALUES(`llm_max_tokens`), `llm_system_prompt` = VALUES(`llm_system_prompt`), `description` = VALUES(`description`), `is_active` = VALUES(`is_active`), `is_default` = VALUES(`is_default`), `updated_at` = VALUES(`updated_at`); INSERT INTO `audio_model_config` (`model_code`, `model_name`, `audio_scene`, `provider`, `endpoint_url`, `api_key`, `request_timeout_seconds`, `hot_word_group_id`, `extra_config`, `description`, `is_active`, `is_default`, `created_at`, `updated_at`) SELECT 'audio_model', '默认语音识别模型', 'asr', 'dashscope', 'https://dashscope.aliyuncs.com', NULL, 300, g.`id`, JSON_OBJECT( 'model', 'paraformer-v2', 'vocabulary_id', g.`vocabulary_id`, 'speaker_count', 10, 'language_hints', JSON_ARRAY('zh', 'en'), 'disfluency_removal_enabled', TRUE, 'diarization_enabled', TRUE ), '系统初始化的默认 ASR 模型配置。', 1, 1, NOW(), NOW() FROM `hot_word_group` g WHERE g.`id` = @default_hot_word_group_id ON DUPLICATE KEY UPDATE `model_name` = VALUES(`model_name`), `audio_scene` = VALUES(`audio_scene`), `provider` = VALUES(`provider`), `endpoint_url` = VALUES(`endpoint_url`), `api_key` = VALUES(`api_key`), `request_timeout_seconds` = VALUES(`request_timeout_seconds`), `hot_word_group_id` = VALUES(`hot_word_group_id`), `extra_config` = VALUES(`extra_config`), `description` = VALUES(`description`), `is_active` = VALUES(`is_active`), `is_default` = VALUES(`is_default`), `updated_at` = VALUES(`updated_at`); INSERT INTO `audio_model_config` (`model_code`, `model_name`, `audio_scene`, `provider`, `endpoint_url`, `api_key`, `request_timeout_seconds`, `hot_word_group_id`, `extra_config`, `description`, `is_active`, `is_default`, `created_at`, `updated_at`) VALUES ( 'voiceprint_model', '默认声纹配置', 'voiceprint', 'funasr', NULL, NULL, 120, NULL, JSON_OBJECT( 'template_text', '我正在进行声纹采集,这段语音将用于身份识别和验证。声纹技术能够准确识别每个人独特的声音特征。', 'duration_seconds', 12, 'sample_rate', 16000, 'channels', 1, 'max_size_bytes', 5242880 ), '系统初始化的默认声纹采集配置。', 1, 1, NOW(), NOW() ) ON DUPLICATE KEY UPDATE `model_name` = VALUES(`model_name`), `audio_scene` = VALUES(`audio_scene`), `provider` = VALUES(`provider`), `endpoint_url` = VALUES(`endpoint_url`), `api_key` = VALUES(`api_key`), `request_timeout_seconds` = VALUES(`request_timeout_seconds`), `hot_word_group_id` = VALUES(`hot_word_group_id`), `extra_config` = VALUES(`extra_config`), `description` = VALUES(`description`), `is_active` = VALUES(`is_active`), `is_default` = VALUES(`is_default`), `updated_at` = VALUES(`updated_at`); -- ===================================================================== -- 7. 基础字典数据 -- ===================================================================== INSERT INTO `sys_dict_data` (`dict_type`, `dict_code`, `parent_code`, `tree_path`, `label_cn`, `label_en`, `sort_order`, `extension_attr`, `is_default`, `status`, `create_time`, `update_time`) VALUES ('client_platform', 'DESKTOP', 'ROOT', NULL, '桌面端', 'Desktop', 1, JSON_OBJECT('icon', 'monitor'), 0, 1, NOW(), NOW()), ('client_platform', 'MOBILE', 'ROOT', NULL, '移动端', 'Mobile', 2, JSON_OBJECT('icon', 'phone'), 0, 1, NOW(), NOW()), ('client_platform', 'TERMINAL', 'ROOT', NULL, '专用终端', 'Terminal', 3, JSON_OBJECT('icon', 'router'), 0, 1, NOW(), NOW()), ('client_platform', 'WIN', 'DESKTOP', NULL, 'Windows', 'Windows', 1, JSON_OBJECT('suffix', '.exe', 'arch_support', JSON_ARRAY('x86', 'x64')), 0, 1, NOW(), NOW()), ('client_platform', 'MAC', 'DESKTOP', NULL, 'macOS', 'macOS', 2, JSON_OBJECT('suffix', '.dmg', 'arch_support', JSON_ARRAY('x64', 'arm64')), 0, 1, NOW(), NOW()), ('client_platform', 'LINUX', 'DESKTOP', NULL, 'Linux', 'Linux', 3, JSON_OBJECT('suffix', '.deb', 'arch_support', JSON_ARRAY('x64', 'arm64')), 0, 1, NOW(), NOW()), ('client_platform', 'IOS', 'MOBILE', NULL, '苹果iOS', 'iOS', 1, JSON_OBJECT('suffix', '.ipa', 'store_link', TRUE), 0, 1, NOW(), NOW()), ('client_platform', 'ANDROID', 'MOBILE', NULL, '安卓', 'Android', 2, JSON_OBJECT('suffix', '.apk'), 0, 1, NOW(), NOW()), ('client_platform', 'TERM_STD', 'TERMINAL', NULL, '通用终端', 'Standard Terminal', 1, JSON_OBJECT('vendor', 'Generic', 'os', 'Android'), 1, 1, NOW(), NOW()), ('client_platform', 'TERM_S100','TERMINAL', NULL, '中兴 S100', 'ZTE S100', 2, JSON_OBJECT('vendor', 'ZTE', 'os', 'Android'), 0, 1, NOW(), NOW()), ('client_platform', 'TERM_A133','TERMINAL', NULL, '全志 A133', 'Allwinner A133', 3, JSON_OBJECT('vendor', 'Allwinner', 'os', 'Android'), 0, 1, NOW(), NOW()), ('terminal_type', 'TERM_STD', 'ROOT', NULL, '通用终端', 'Standard Terminal', 1, NULL, 1, 1, NOW(), NOW()), ('terminal_type', 'TERM_S100','ROOT', NULL, '中兴 S100', 'ZTE S100', 2, NULL, 0, 1, NOW(), NOW()), ('terminal_type', 'TERM_A133','ROOT', NULL, '全志 A133', 'Allwinner A133', 3, NULL, 0, 1, NOW(), NOW()), ('task_type', 'MEETING_TASK', 'ROOT', NULL, '会议任务', 'Meeting Task', 1, NULL, 0, 1, NOW(), NOW()), ('task_type', 'KNOWLEDGE_TASK', 'ROOT', NULL, '知识库任务', 'Knowledge Task', 2, NULL, 0, 1, NOW(), NOW()), ('external_apps', 'NATIVE', 'ROOT', NULL, '原生应用', 'Native App', 1, JSON_OBJECT('protocol', 'apk'), 0, 1, NOW(), NOW()), ('external_apps', 'WEB', 'ROOT', NULL, 'Web应用', 'Web App', 2, JSON_OBJECT('protocol', 'https'), 0, 1, NOW(), NOW()) ON DUPLICATE KEY UPDATE `parent_code` = VALUES(`parent_code`), `tree_path` = VALUES(`tree_path`), `label_cn` = VALUES(`label_cn`), `label_en` = VALUES(`label_en`), `sort_order` = VALUES(`sort_order`), `extension_attr` = VALUES(`extension_attr`), `is_default` = VALUES(`is_default`), `status` = VALUES(`status`), `update_time` = VALUES(`update_time`); -- ===================================================================== -- 8. 菜单定义 -- 最终菜单树: -- dashboard -- desktop -- meeting_manage -- ├─ meeting_center -- └─ prompt_config -- platform_admin -- ├─ hot_word_management -- ├─ model_management -- ├─ prompt_management -- ├─ client_management -- ├─ external_app_management -- └─ terminal_management -- system_management -- ├─ user_management -- ├─ permission_management -- │ └─ permission_menu_tree (隐藏) -- ├─ dict_management -- └─ parameter_management -- ===================================================================== INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) VALUES ('dashboard', 'Dashboard', 'DashboardOutlined', '/dashboard', 'link', NULL, 1, NULL, 1, 1, 1, '管理员桌面', NOW(), NOW()), ('desktop', 'Desktop', 'DesktopOutlined', '/dashboard', 'link', NULL, 1, NULL, 2, 1, 1, '普通用户桌面', NOW(), NOW()), ('meeting_manage', '会议管理', 'CalendarOutlined', '/meetings/center', 'link', NULL, 1, NULL, 3, 1, 1, '普通用户会议功能入口', NOW(), NOW()), ('platform_admin', '平台管理', 'Shield', '/admin/management/hot-word-management', 'link', NULL, 1, NULL, 4, 1, 1, '平台能力配置入口', NOW(), NOW()), ('system_management', '系统管理', 'Setting', '/admin/management/system-overview', 'link', NULL, 1, NULL, 5, 1, 1, '系统治理入口', NOW(), NOW()) ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); SET @meeting_manage_id := (SELECT `menu_id` FROM `sys_menus` WHERE `menu_code` = 'meeting_manage' LIMIT 1); SET @platform_admin_id := (SELECT `menu_id` FROM `sys_menus` WHERE `menu_code` = 'platform_admin' LIMIT 1); SET @system_management_id := (SELECT `menu_id` FROM `sys_menus` WHERE `menu_code` = 'system_management' LIMIT 1); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'meeting_center', '会议中心', 'CalendarOutlined', '/meetings/center', 'link', @meeting_manage_id, 2, NULL, 1, 1, 1, '普通用户会议中心', NOW(), NOW() FROM DUAL WHERE @meeting_manage_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'prompt_config', '提示词配置', 'Book', '/prompt-config', 'link', @meeting_manage_id, 2, NULL, 2, 1, 1, '用户提示词启用与排序配置', NOW(), NOW() FROM DUAL WHERE @meeting_manage_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'hot_word_management', '热词管理', 'Text', '/admin/management/hot-word-management', 'link', @platform_admin_id, 2, NULL, 1, 1, 1, 'ASR 热词管理与同步', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'model_management', '模型管理', 'Appstore', '/admin/management/model-management', 'link', @platform_admin_id, 2, NULL, 2, 1, 1, '音频模型与 LLM 模型配置', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'prompt_management', '提示词库', 'BookText', '/prompt-management', 'link', @platform_admin_id, 2, NULL, 3, 1, 1, '系统提示词库管理', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'client_management', '客户端管理', 'Smartphone', '/admin/management/client-management', 'link', @platform_admin_id, 2, NULL, 4, 1, 1, '客户端下载与版本管理', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'external_app_management', '外部应用管理', 'AppWindow', '/admin/management/external-app-management', 'link', @platform_admin_id, 2, NULL, 5, 1, 1, '外部系统入口管理', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'terminal_management', '终端管理', 'Monitor', '/admin/management/terminal-management', 'link', @platform_admin_id, 2, NULL, 6, 1, 1, '专用终端管理', NOW(), NOW() FROM DUAL WHERE @platform_admin_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'user_management', '用户管理', 'Users', '/admin/management/user-management', 'link', @system_management_id, 2, NULL, 1, 1, 1, '账号、角色、密码管理', NOW(), NOW() FROM DUAL WHERE @system_management_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'permission_management', '权限管理', 'KeyRound', '/admin/management/permission-management', 'link', @system_management_id, 2, NULL, 2, 1, 1, '菜单与角色授权管理', NOW(), NOW() FROM DUAL WHERE @system_management_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'dict_management', '字典管理', 'BookMarked', '/admin/management/dict-management', 'link', @system_management_id, 2, NULL, 3, 1, 1, '平台字典与码表管理', NOW(), NOW() FROM DUAL WHERE @system_management_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'parameter_management', '参数管理', 'Setting', '/admin/management/parameter-management', 'link', @system_management_id, 2, NULL, 4, 1, 1, '系统参数管理', NOW(), NOW() FROM DUAL WHERE @system_management_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); SET @permission_management_id := ( SELECT `menu_id` FROM `sys_menus` WHERE `menu_code` = 'permission_management' LIMIT 1 ); INSERT INTO `sys_menus` (`menu_code`, `menu_name`, `menu_icon`, `menu_url`, `menu_type`, `parent_id`, `menu_level`, `tree_path`, `sort_order`, `is_active`, `is_visible`, `description`, `created_at`, `updated_at`) SELECT 'permission_menu_tree', '菜单树维护', 'AppstoreAdd', '/admin/management/permission-management', 'link', @permission_management_id, 3, NULL, 20, 1, 0, '权限管理中的隐藏入口,用于菜单树维护。', NOW(), NOW() FROM DUAL WHERE @permission_management_id IS NOT NULL ON DUPLICATE KEY UPDATE `menu_name` = VALUES(`menu_name`), `menu_icon` = VALUES(`menu_icon`), `menu_url` = VALUES(`menu_url`), `menu_type` = VALUES(`menu_type`), `parent_id` = VALUES(`parent_id`), `menu_level` = VALUES(`menu_level`), `sort_order` = VALUES(`sort_order`), `is_active` = VALUES(`is_active`), `is_visible` = VALUES(`is_visible`), `description` = VALUES(`description`), `updated_at` = VALUES(`updated_at`); -- 回填本次初始化菜单的树结构 UPDATE `sys_menus` SET `menu_level` = 1, `tree_path` = CONCAT('/', `menu_id`) WHERE `menu_code` IN ('dashboard', 'desktop', 'meeting_manage', 'platform_admin', 'system_management'); UPDATE `sys_menus` c JOIN `sys_menus` p ON c.`parent_id` = p.`menu_id` SET c.`menu_level` = p.`menu_level` + 1, c.`tree_path` = CONCAT(p.`tree_path`, '/', c.`menu_id`) WHERE c.`menu_code` IN ( 'meeting_center', 'prompt_config', 'hot_word_management', 'model_management', 'prompt_management', 'client_management', 'external_app_management', 'terminal_management', 'user_management', 'permission_management', 'dict_management', 'parameter_management' ); UPDATE `sys_menus` c JOIN `sys_menus` p ON c.`parent_id` = p.`menu_id` SET c.`menu_level` = p.`menu_level` + 1, c.`tree_path` = CONCAT(p.`tree_path`, '/', c.`menu_id`) WHERE c.`menu_code` IN ('permission_menu_tree'); -- ===================================================================== -- 9. 角色授权 -- 管理员: 所有启用菜单 -- 普通用户: dashboard / desktop / meeting_manage / meeting_center / prompt_config -- ===================================================================== INSERT INTO `sys_role_menu_permissions` (`role_id`, `menu_id`, `granted_by`, `granted_at`) SELECT 1, m.`menu_id`, 1, NOW() FROM `sys_menus` m WHERE m.`is_active` = 1 ON DUPLICATE KEY UPDATE `granted_by` = VALUES(`granted_by`), `granted_at` = VALUES(`granted_at`); INSERT INTO `sys_role_menu_permissions` (`role_id`, `menu_id`, `granted_by`, `granted_at`) SELECT 2, m.`menu_id`, 1, NOW() FROM `sys_menus` m WHERE m.`is_active` = 1 AND m.`menu_code` IN ('dashboard', 'desktop', 'meeting_manage', 'meeting_center', 'prompt_config') ON DUPLICATE KEY UPDATE `granted_by` = VALUES(`granted_by`), `granted_at` = VALUES(`granted_at`); -- ===================================================================== -- 10. 自增游标兜底 -- ===================================================================== COMMIT; ALTER TABLE `sys_roles` AUTO_INCREMENT = 3; ALTER TABLE `sys_users` AUTO_INCREMENT = 3; ALTER TABLE `prompts` AUTO_INCREMENT = 3;