diff --git a/schoolNewsServ/.bin/mysql/init-database.bat b/schoolNewsServ/.bin/mysql/init-database.bat deleted file mode 100644 index 74c024e..0000000 --- a/schoolNewsServ/.bin/mysql/init-database.bat +++ /dev/null @@ -1,126 +0,0 @@ -@echo off -chcp 65001 >nul -echo ===================================================== -echo 校园思政新闻平台数据库初始化脚本 -echo ===================================================== -echo. - -REM 设置MySQL连接信息(请根据实际情况修改) -set MYSQL_HOST=localhost -set MYSQL_PORT=3306 -set MYSQL_USER=root -set MYSQL_PASSWORD= - -echo 请输入MySQL连接信息: -echo. -set /p MYSQL_HOST=MySQL主机地址 [默认: localhost]: -if "%MYSQL_HOST%"=="" set MYSQL_HOST=localhost - -set /p MYSQL_PORT=MySQL端口 [默认: 3306]: -if "%MYSQL_PORT%"=="" set MYSQL_PORT=3306 - -set /p MYSQL_USER=MySQL用户名 [默认: root]: -if "%MYSQL_USER%"=="" set MYSQL_USER=root - -set /p MYSQL_PASSWORD=MySQL密码: - -echo. -echo 连接信息: -echo 主机: %MYSQL_HOST% -echo 端口: %MYSQL_PORT% -echo 用户: %MYSQL_USER% -echo. - -echo 开始执行数据库初始化... -echo. - -REM 切换到sql目录 -cd sql - -REM 执行SQL文件 -echo [1/9] 创建数据库... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createDB.sql -if errorlevel 1 ( - echo 错误: 创建数据库失败! - pause - exit /b 1 -) - -echo [2/9] 创建用户相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableUser.sql -if errorlevel 1 ( - echo 错误: 创建用户表失败! - pause - exit /b 1 -) - -echo [3/9] 创建权限相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTablePermission.sql -if errorlevel 1 ( - echo 错误: 创建权限表失败! - pause - exit /b 1 -) - -echo [4/9] 创建资源管理相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableResource.sql -if errorlevel 1 ( - echo 错误: 创建资源表失败! - pause - exit /b 1 -) - -echo [5/9] 创建课程管理相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableCourse.sql -if errorlevel 1 ( - echo 错误: 创建课程表失败! - pause - exit /b 1 -) - -echo [6/9] 创建学习管理相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableLearning.sql -if errorlevel 1 ( - echo 错误: 创建学习表失败! - pause - exit /b 1 -) - -echo [7/9] 创建个人中心相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableUserCenter.sql -if errorlevel 1 ( - echo 错误: 创建个人中心表失败! - pause - exit /b 1 -) - -echo [8/9] 创建智能体相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableAI.sql -if errorlevel 1 ( - echo 错误: 创建智能体表失败! - pause - exit /b 1 -) - -echo [9/9] 创建系统配置和日志相关表... -mysql -h %MYSQL_HOST% -P %MYSQL_PORT% -u %MYSQL_USER% -p%MYSQL_PASSWORD% < createTableSystem.sql -if errorlevel 1 ( - echo 错误: 创建系统表失败! - pause - exit /b 1 -) - -cd .. - -echo. -echo ===================================================== -echo 数据库初始化完成! -echo ===================================================== -echo 数据库名: school_news -echo 默认用户: admin -echo 默认密码: 详见 createTableUser.sql -echo ===================================================== -echo. - -pause - diff --git a/schoolNewsServ/.bin/mysql/init-database.sh b/schoolNewsServ/.bin/mysql/init-database.sh index 0625391..0a17eb4 100644 --- a/schoolNewsServ/.bin/mysql/init-database.sh +++ b/schoolNewsServ/.bin/mysql/init-database.sh @@ -9,7 +9,7 @@ echo "" MYSQL_HOST="localhost" MYSQL_PORT="3306" MYSQL_USER="root" -MYSQL_PASSWORD="" +MYSQL_PASSWORD="123456" # 读取用户输入 read -p "MySQL主机地址 [默认: localhost]: " input_host @@ -21,17 +21,8 @@ MYSQL_PORT=${input_port:-$MYSQL_PORT} read -p "MySQL用户名 [默认: root]: " input_user MYSQL_USER=${input_user:-$MYSQL_USER} -read -sp "MySQL密码: " MYSQL_PASSWORD -echo "" - -echo "" -echo "连接信息:" -echo "主机: $MYSQL_HOST" -echo "端口: $MYSQL_PORT" -echo "用户: $MYSQL_USER" -echo "" - -echo "开始执行数据库初始化..." +read -sp "MySQL密码[默认: 123456]: " input_password +MYSQL_PASSWORD=${input_password:-$MYSQL_PASSWORD} echo "" # 切换到sql目录 diff --git a/schoolNewsServ/.bin/mysql/sql/createDB.sql b/schoolNewsServ/.bin/mysql/sql/createDB.sql index bf3d878..0657fe4 100644 --- a/schoolNewsServ/.bin/mysql/sql/createDB.sql +++ b/schoolNewsServ/.bin/mysql/sql/createDB.sql @@ -1,2 +1,16 @@ --- MySQL Script to create the database -CREATE DATABASE IF NOT EXISTS `school_news` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; \ No newline at end of file +-- 修复字符编码问题 +-- 删除现有数据库(如果存在) +DROP DATABASE IF EXISTS `school_news`; + +-- 创建数据库,使用utf8mb4字符集 +CREATE DATABASE `school_news` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 使用数据库 +USE `school_news`; + +-- 设置会话字符集 +SET NAMES utf8mb4; +SET CHARACTER SET utf8mb4; +SET character_set_client = utf8mb4; +SET character_set_connection = utf8mb4; +SET character_set_results = utf8mb4; diff --git a/schoolNewsServ/.bin/mysql/sql/createTableAI.sql b/schoolNewsServ/.bin/mysql/sql/createTableAI.sql index 2a1e47a..c400e92 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableAI.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableAI.sql @@ -21,9 +21,6 @@ CREATE TABLE `tb_ai_agent_config` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='智能体配置表'; --- 插入默认配置 -INSERT INTO `tb_ai_agent_config` (id, name, system_prompt, model_name, temperature, max_tokens, status, creator, create_time) VALUES -('1', '思政小帮手', '你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。请基于提供的知识库内容,为用户提供准确、简洁的回答。', 'gpt-3.5-turbo', 0.7, 2000, 1, '1', now()); -- 知识库表 DROP TABLE IF EXISTS `tb_ai_knowledge`; diff --git a/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql b/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql index 1a616ad..5b0b14b 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTablePermission.sql @@ -18,8 +18,6 @@ CREATE TABLE `tb_sys_dept` ( KEY `idx_dept_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_dept` (id,dept_id,name, description) VALUES ('1','root_department', '超级部门', '系统超级部门'); -INSERT INTO `tb_sys_dept` (id,dept_id,name, parent_id, description) VALUES ('2','default_department', '默认部门', 'root_department', '系统默认创建的部门'); -- 角色表 DROP TABLE IF EXISTS `tb_sys_role`; @@ -38,8 +36,6 @@ CREATE TABLE `tb_sys_role` ( UNIQUE KEY `uk_role_id` (`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('1','admin', '管理员', '系统管理员角色'); -INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('2','freedom', '自由角色', '自由角色'); -- 部门-角色关联 DROP TABLE IF EXISTS `tb_sys_dept_role`; @@ -57,9 +53,6 @@ CREATE TABLE `tb_sys_dept_role` ( UNIQUE KEY `uk_dept_role` (`dept_id`, `role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_dept_role` (id, dept_id, role_id, creator, create_time) VALUES -('1', 'root_department', 'admin', '1', now()), -('2', 'default_department', 'freedom', '1', now()); -- 用户-角色关联 DROP TABLE IF EXISTS `tb_sys_user_dept_role`; @@ -78,7 +71,28 @@ CREATE TABLE `tb_sys_user_dept_role` ( UNIQUE KEY `uk_user_dept_role` (`user_id`, `dept_id`, `role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_user_dept_role` (id, user_id, dept_id, role_id, creator, create_time) VALUES ('1', '1', 'root_department', 'admin', '1', now()); + +-- 模块表 +DROP TABLE IF EXISTS `tb_sys_module`; +CREATE TABLE `tb_sys_module` ( + `id` VARCHAR(50) NOT NULL COMMENT 'id', + `module_id` VARCHAR(50) NOT NULL COMMENT '模块ID', + `name` VARCHAR(100) NOT NULL COMMENT '模块名称', + `code` VARCHAR(100) NOT NULL COMMENT '模块代码', + `description` VARCHAR(255) DEFAULT NULL COMMENT '模块描述', + `icon` VARCHAR(100) DEFAULT NULL COMMENT '模块图标', + `order_num` INT(4) DEFAULT 0 COMMENT '模块排序号', + `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '模块状态(0禁用 1启用)', + `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', + `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间', + `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_module_id` (`module_id`), + UNIQUE KEY `uk_module_code` (`code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -- 权限表 DROP TABLE IF EXISTS `tb_sys_permission`; @@ -88,6 +102,7 @@ CREATE TABLE `tb_sys_permission` ( `name` VARCHAR(100) NOT NULL COMMENT '权限名称', `code` VARCHAR(100) NOT NULL COMMENT '权限代码', `description` VARCHAR(255) DEFAULT NULL COMMENT '权限描述', + `module_id` VARCHAR(50) DEFAULT NULL COMMENT '所属模块ID', `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', `updater` VARCHAR(50) DEFAULT NULL COMMENT '更新者', `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -95,21 +110,10 @@ CREATE TABLE `tb_sys_permission` ( `delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间', `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除', PRIMARY KEY (`id`), - UNIQUE KEY `uk_permission_id` (`permission_id`) + UNIQUE KEY `uk_permission_id` (`permission_id`), + KEY `idx_permission_module` (`module_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_permission` (id,permission_id, name, code, description, creator, create_time) VALUES -('0','perm_default', '默认权限', 'default', '默认权限', '1', now()), -('1','perm_system_manage', '系统管理', 'system:manage', '系统管理权限', '1', now()), -('2','perm_system_dept_manage', '系统部门查看', 'system:dept:manage', '系统部门查看权限', '1', now()), -('3','perm_system_menu_manage', '系统菜单查看', 'system:menu:manage', '系统菜单查看权限', '1', now()), -('4','perm_system_permission_manage', '系统权限查看', 'system:permission:manage', '系统权限查看权限', '1', now()), -('5','perm_system_role_manage', '系统角色查看', 'system:role:manage', '系统角色查看权限', '1', now()), -('6','perm_system_user_manage', '系统用户查看', 'system:user:manage', '系统用户查看权限', '1', now()), -('7','perm_news_manage', '新闻管理', 'news:manage', '新闻管理权限', '1', now()), -('8','perm_study_manage', '学习管理', 'study:manage', '学习管理权限', '1', now()), -('9','perm_ai_manage', 'AI管理', 'ai:manage', 'AI管理权限', '1', now()), -('10','perm_usercenter_manage', '用户中心管理', 'usercenter:manage', '用户中心管理权限', '1', now()); -- 角色-权限关联 DROP TABLE IF EXISTS `tb_sys_role_permission`; @@ -127,19 +131,6 @@ CREATE TABLE `tb_sys_role_permission` ( UNIQUE KEY `uk_role_permission` (`role_id`, `permission_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_role_permission` (id, role_id, permission_id, creator, create_time) VALUES -('0', 'admin', 'perm_default', '1', now()), -('1', 'admin', 'perm_system_manage', '1', now()), -('2', 'admin', 'perm_system_dept_manage', '1', now()), -('3', 'admin', 'perm_system_menu_manage', '1', now()), -('4', 'admin', 'perm_system_permission_manage', '1', now()), -('5', 'admin', 'perm_system_role_manage', '1', now()), -('6', 'admin', 'perm_system_user_manage', '1', now()), -('7', 'admin', 'perm_news_manage', '1', now()), -('8', 'admin', 'perm_study_manage', '1', now()), -('9', 'admin', 'perm_ai_manage', '1', now()), -('10', 'admin', 'perm_usercenter_manage', '1', now()), -('11', 'freedom', 'perm_default', '1', now()); -- 菜单表 DROP TABLE IF EXISTS `tb_sys_menu`; @@ -165,31 +156,6 @@ CREATE TABLE `tb_sys_menu` ( KEY `idx_menu_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; --- Insert default menus -INSERT INTO `tb_sys_menu` (id,menu_id, name, parent_id, url, component, icon, order_num, type, layout, creator, create_time) VALUES -('1','menu_system_manage', '系统管理', NULL, '', '', 'el-icon-setting', 1, 1, '', '1', now()), -('2','menu_system_dept', '部门管理', 'menu_system_manage', '/manage/system/dept', 'manage/system/DeptManageView', 'el-icon-office-building', 2, 1, 'NavigationLayout', '1', now()), -('3','menu_system_menu', '菜单管理', 'menu_system_manage', '/manage/system/menu', 'manage/system/MenuManageView', 'el-icon-menu', 2, 1, 'NavigationLayout', '1', now()), -('4','menu_system_permission', '权限管理', 'menu_system_manage', '/manage/system/permission', 'manage/system/PermissionManageView', 'el-icon-key', 3, 1, 'NavigationLayout', '1', now()), -('5','menu_system_role', '角色管理', 'menu_system_manage', '/manage/system/role', 'manage/system/RoleManageView', 'el-icon-user', 4, 1, 'NavigationLayout', '1', now()), -('6','menu_system_user', '用户管理', 'menu_system_manage', '/manage/system/user', 'manage/system/UserManageView', 'el-icon-user', 5, 1, 'NavigationLayout', '1', now()); --- ('7','menu_news_manage', '新闻管理', NULL, '', '', 'el-icon-document', 2, 1, '', '1', now()), --- ('8','menu_news_resource', '资源管理', 'menu_news_manage', '/manage/news/resource', 'manage/news/ResourceManageView', 'el-icon-folder', 1, 1, 'NavigationLayout', '1', now()), --- ('9','menu_news_category', '分类管理', 'menu_news_manage', '/manage/news/category', 'manage/news/CategoryManageView', 'el-icon-menu', 2, 1, 'NavigationLayout', '1', now()), --- ('10','menu_news_tag', '标签管理', 'menu_news_manage', '/manage/news/tag', 'manage/news/TagManageView', 'el-icon-price-tag', 3, 1, 'NavigationLayout', '1', now()), --- ('11','menu_news_banner', '横幅管理', 'menu_news_manage', '/manage/news/banner', 'manage/news/BannerManageView', 'el-icon-picture', 4, 1, 'NavigationLayout', '1', now()), --- ('12','menu_study_manage', '学习管理', NULL, '', '', 'el-icon-reading', 3, 1, '', '1', now()), --- ('13','menu_study_course', '课程管理', 'menu_study_manage', '/manage/study/course', 'manage/study/CourseManageView', 'el-icon-video-play', 1, 1, 'NavigationLayout', '1', now()), --- ('14','menu_study_task', '任务管理', 'menu_study_manage', '/manage/study/task', 'manage/study/TaskManageView', 'el-icon-s-order', 2, 1, 'NavigationLayout', '1', now()), --- ('15','menu_study_record', '学习记录', 'menu_study_manage', '/manage/study/record', 'manage/study/RecordManageView', 'el-icon-document', 3, 1, 'NavigationLayout', '1', now()), --- ('16','menu_ai_manage', 'AI管理', NULL, '', '', 'el-icon-cpu', 4, 1, '', '1', now()), --- ('17','menu_ai_agent', 'AI代理', 'menu_ai_manage', '/manage/ai/agent', 'manage/ai/AgentManageView', 'el-icon-robot', 1, 1, 'NavigationLayout', '1', now()), --- ('18','menu_ai_conversation', '对话管理', 'menu_ai_manage', '/manage/ai/conversation', 'manage/ai/ConversationManageView', 'el-icon-chat-line-round', 2, 1, 'NavigationLayout', '1', now()), --- ('19','menu_ai_knowledge', '知识库', 'menu_ai_manage', '/manage/ai/knowledge', 'manage/ai/KnowledgeManageView', 'el-icon-collection', 3, 1, 'NavigationLayout', '1', now()), --- ('20','menu_usercenter_manage', '用户中心', NULL, '', '', 'el-icon-user', 5, 1, '', '1', now()), --- ('21','menu_usercenter_points', '积分管理', 'menu_usercenter_manage', '/manage/usercenter/points', 'manage/usercenter/PointsManageView', 'el-icon-coin', 1, 1, 'NavigationLayout', '1', now()), --- ('22','menu_usercenter_achievement', '成就管理', 'menu_usercenter_manage', '/manage/usercenter/achievement', 'manage/usercenter/AchievementManageView', 'el-icon-trophy', 2, 1, 'NavigationLayout', '1', now()), --- ('23','menu_usercenter_collection', '收藏管理', 'menu_usercenter_manage', '/manage/usercenter/collection', 'manage/usercenter/CollectionManageView', 'el-icon-star-on', 3, 1, 'NavigationLayout', '1', now()); DROP TABLE IF EXISTS `tb_sys_menu_permission`; CREATE TABLE `tb_sys_menu_permission` ( @@ -204,12 +170,4 @@ CREATE TABLE `tb_sys_menu_permission` ( `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除', PRIMARY KEY (`id`), UNIQUE KEY `uk_menu_permission` (`menu_id`, `permission_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; --- Insert menu-permission associations -INSERT INTO `tb_sys_menu_permission` (id, permission_id, menu_id, creator, create_time) VALUES -('1', 'perm_system_manage', 'menu_system_manage', '1', now()), -('2', 'perm_system_dept_manage', 'menu_system_dept', '1', now()), -('3', 'perm_system_menu_manage', 'menu_system_menu', '1', now()), -('4', 'perm_system_permission_manage', 'menu_system_permission', '1', now()), -('5', 'perm_system_role_manage', 'menu_system_role', '1', now()), -('6', 'perm_system_user_manage', 'menu_system_user', '1', now()); \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; \ No newline at end of file diff --git a/schoolNewsServ/.bin/mysql/sql/createTableResource.sql b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql index aa9ea3f..b9bd3e0 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableResource.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql @@ -52,14 +52,6 @@ CREATE TABLE `tb_resource_category` ( KEY `idx_parent` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源分类表'; --- 插入默认分类(党史学习、领导讲话、政策解读、红色经典、专题报告、思政案例) -INSERT INTO `tb_resource_category` (id, category_id, name, description, order_num, creator, create_time) VALUES -('1', 'party_history', '党史学习', '党史学习相关资源', 1, '1', now()), -('2', 'leader_speech', '领导讲话', '领导讲话相关资源', 2, '1', now()), -('3', 'policy_interpretation', '政策解读', '政策解读相关资源', 3, '1', now()), -('4', 'red_classic', '红色经典', '红色经典相关资源', 4, '1', now()), -('5', 'special_report', '专题报告', '专题报告相关资源', 5, '1', now()), -('6', 'ideological_case', '思政案例', '思政案例相关资源', 6, '1', now()); -- Banner管理表 DROP TABLE IF EXISTS `tb_banner`; diff --git a/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql b/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql index e86b9ef..3401066 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql @@ -48,21 +48,6 @@ CREATE TABLE `tb_sys_config` ( KEY `idx_group` (`config_group`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统配置表'; --- 插入默认系统配置 -INSERT INTO `tb_sys_config` (id, config_key, config_value, config_type, config_group, description, is_system, creator, create_time) VALUES -('1', 'system.platform.name', '思政学习平台', 'string', 'platform', '平台名称', 1, '1', now()), -('2', 'system.platform.logo', '/assets/logo.png', 'string', 'platform', '平台Logo', 1, '1', now()), -('3', 'system.platform.school_badge', '/assets/school_badge.png', 'string', 'platform', '学校校徽', 1, '1', now()), -('4', 'system.menu.home', '首页', 'string', 'menu', '首页菜单名称', 0, '1', now()), -('5', 'system.menu.resource', '资源中心', 'string', 'menu', '资源中心菜单名称', 0, '1', now()), -('6', 'system.menu.learning', '学习计划', 'string', 'menu', '学习计划菜单名称', 0, '1', now()), -('7', 'system.menu.activity', '专题活动', 'string', 'menu', '专题活动菜单名称', 0, '1', now()), -('8', 'system.menu.culture', '红色常信', 'string', 'menu', '红色常信菜单名称', 0, '1', now()), -('9', 'system.banner.auto_play', 'true', 'boolean', 'banner', 'Banner自动播放', 0, '1', now()), -('10', 'system.banner.interval', '5000', 'number', 'banner', 'Banner切换间隔(毫秒)', 0, '1', now()), -('11', 'system.resource.auto_publish', 'false', 'boolean', 'resource', '资源自动发布', 0, '1', now()), -('12', 'system.resource.auto_publish_time', '08:00', 'string', 'resource', '自动发布时间', 0, '1', now()), -('13', 'system.ai.enabled', 'true', 'boolean', 'ai', '是否启用智能体', 0, '1', now()); -- 系统访问统计表 DROP TABLE IF EXISTS `tb_sys_visit_statistics`; diff --git a/schoolNewsServ/.bin/mysql/sql/createTableUser.sql b/schoolNewsServ/.bin/mysql/sql/createTableUser.sql index e8c7523..f895dc7 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableUser.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableUser.sql @@ -20,8 +20,6 @@ CREATE TABLE `tb_sys_user` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -- 推荐:把默认 admin 密码替换为已哈希的值 -INSERT INTO `tb_sys_user` (id, username, password, email, status) VALUES -('1', 'admin', '$2a$10$/Bo2SXboVUpYfR6EA.y8puYQaMGBcuNYFY/EkQRY3w27IH56EuEcS', '3223905473@qq.com', 0); -- 用户信息表 DROP TABLE IF EXISTS `tb_sys_user_info`; @@ -43,7 +41,6 @@ CREATE TABLE `tb_sys_user_info` ( UNIQUE KEY `uk_user_info_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; -INSERT INTO `tb_sys_user_info` (id, user_id, full_name, avatar) VALUES ('1', '1', '管理员', 'default'); DROP TABLE IF EXISTS `tb_sys_login_log`; CREATE TABLE `tb_sys_login_log` ( diff --git a/schoolNewsServ/.bin/mysql/sql/initAll.sql b/schoolNewsServ/.bin/mysql/sql/initAll.sql index f4a3741..727f957 100644 --- a/schoolNewsServ/.bin/mysql/sql/initAll.sql +++ b/schoolNewsServ/.bin/mysql/sql/initAll.sql @@ -38,11 +38,33 @@ SOURCE createTableSystem.sql; -- 11. 创建文件系统相关表 SOURCE createTableFile.sql; +-- ===================================================== +-- 插入初始数据 +-- ===================================================== + +-- 12. 插入菜单和权限相关数据 +SOURCE initMenuData.sql; + +SOURCE initAllData.sql; +-- -- 13. 插入资源相关初始数据 +-- SOURCE initResourceData.sql; + +-- -- 14. 插入AI相关初始数据 +-- SOURCE initAIData.sql; + +-- -- 15. 插入系统相关初始数据 +-- SOURCE initSystemData.sql; + +-- -- 16. 插入用户相关初始数据 +-- SOURCE initUserData.sql; + -- ===================================================== -- 初始化完成 -- ===================================================== -- 数据库: school_news -- 表数量: 50+ 张表 --- 默认用户: admin (密码需要查看 createTableUser.sql) +-- 默认用户: admin (密码: admin123) +-- 默认角色: admin (管理员), freedom (自由角色) +-- 默认部门: root_department (超级部门), default_department (默认部门) -- ===================================================== diff --git a/schoolNewsServ/.bin/mysql/sql/initAllData.sql b/schoolNewsServ/.bin/mysql/sql/initAllData.sql new file mode 100644 index 0000000..bc8c91d --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/initAllData.sql @@ -0,0 +1,39 @@ +use school_news; + +-- 插入AI智能体配置数据 +INSERT INTO `tb_ai_agent_config` (id, name, system_prompt, model_name, temperature, max_tokens, status, creator, create_time) VALUES +('1', '思政小帮手', '你是一个专业的思政学习助手,致力于帮助用户学习思想政治理论知识。请基于提供的知识库内容,为用户提供准确、简洁的回答。', 'gpt-3.5-turbo', 0.7, 2000, 1, '1', now()); + +-- 插入资源分类数据 +INSERT INTO `tb_resource_category` (id, category_id, name, description, order_num, creator, create_time) VALUES +('1', 'party_history', '党史学习', '党史学习相关资源', 1, '1', now()), +('2', 'leader_speech', '领导讲话', '领导讲话相关资源', 2, '1', now()), +('3', 'policy_interpretation', '政策解读', '政策解读相关资源', 3, '1', now()), +('4', 'red_classic', '红色经典', '红色经典相关资源', 4, '1', now()), +('5', 'special_report', '专题报告', '专题报告相关资源', 5, '1', now()), +('6', 'world_case', '思政案例', '思政案例相关资源', 6, '1', now()); + +-- 插入系统配置数据 +INSERT INTO `tb_sys_config` (id, config_key, config_value, config_type, config_group, description, is_system, creator, create_time) VALUES +('1', 'system.platform.name', '思政学习平台', 'string', 'platform', '平台名称', 1, '1', now()), +('2', 'system.platform.logo', '/assets/logo.png', 'string', 'platform', '平台Logo', 1, '1', now()), +('3', 'system.platform.school_badge', '/assets/school_badge.png', 'string', 'platform', '学校校徽', 1, '1', now()), +('4', 'system.menu.home', '首页', 'string', 'menu', '首页菜单名称', 0, '1', now()), +('5', 'system.menu.resource', '资源中心', 'string', 'menu', '资源中心菜单名称', 0, '1', now()), +('6', 'system.menu.learning', '学习计划', 'string', 'menu', '学习计划菜单名称', 0, '1', now()), +('7', 'system.menu.activity', '专题活动', 'string', 'menu', '专题活动菜单名称', 0, '1', now()), +('8', 'system.menu.culture', '红色常信', 'string', 'menu', '红色常信菜单名称', 0, '1', now()), +('9', 'system.banner.auto_play', 'true', 'boolean', 'banner', 'Banner自动播放', 0, '1', now()), +('10', 'system.banner.interval', '5000', 'number', 'banner', 'Banner切换间隔(毫秒)', 0, '1', now()), +('11', 'system.resource.auto_publish', 'false', 'boolean', 'resource', '资源自动发布', 0, '1', now()), +('12', 'system.resource.auto_publish_time', '08:00', 'string', 'resource', '自动发布时间', 0, '1', now()), +('13', 'system.ai.enabled', 'true', 'boolean', 'ai', '是否启用智能体', 0, '1', now()); + + +-- 插入默认用户数据 +INSERT INTO `tb_sys_user` (id, username, password, email, status) VALUES +('1', 'superadmin', '$2a$10$/Bo2SXboVUpYfR6EA.y8puYQaMGBcuNYFY/EkQRY3w27IH56EuEcS', '3223905473@qq.com', 0); + +-- 插入默认用户信息数据 +INSERT INTO `tb_sys_user_info` (id, user_id, full_name, avatar) VALUES +('1', '1', '管理员', 'default'); diff --git a/schoolNewsServ/.bin/mysql/sql/initMenuData.sql b/schoolNewsServ/.bin/mysql/sql/initMenuData.sql new file mode 100644 index 0000000..ccc13f8 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/initMenuData.sql @@ -0,0 +1,192 @@ +use school_news; + +-- 插入部门数据 +INSERT INTO `tb_sys_dept` (id,dept_id,name, description) VALUES ('1','root_department', '超级部门', '系统超级部门'); +INSERT INTO `tb_sys_dept` (id,dept_id,name, parent_id, description) VALUES ('2','default_department', '默认部门', 'root_department', '系统默认创建的部门'); + +-- 插入角色数据 +INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('1','superadmin', '管理员', '系统管理员角色'); +INSERT INTO `tb_sys_role` (id,role_id, name, description) VALUES ('2','freedom', '自由角色', '自由角色'); + +-- 插入部门-角色关联数据 +INSERT INTO `tb_sys_dept_role` (id, dept_id, role_id, creator, create_time) VALUES +('1', 'root_department', 'superadmin', '1', now()), +('2', 'default_department', 'freedom', '1', now()); + +-- 插入用户-角色关联数据 +INSERT INTO `tb_sys_user_dept_role` (id, user_id, dept_id, role_id, creator, create_time) VALUES ('1', '1', 'root_department', 'superadmin', '1', now()); + +-- 插入模块数据 +INSERT INTO `tb_sys_module` (id, module_id, name, code, description, icon, order_num, status, creator, create_time) VALUES +('1', 'module_system', '系统管理', 'system', '系统管理模块', 'el-icon-setting', 1, 1, '1', now()), +('2', 'module_news', '新闻管理', 'news', '新闻管理模块', 'el-icon-document', 2, 1, '1', now()), +('3', 'module_study', '学习管理', 'study', '学习管理模块', 'el-icon-reading', 3, 1, '1', now()), +('4', 'module_ai', 'AI管理', 'ai', 'AI管理模块', 'el-icon-cpu', 4, 1, '1', now()), +('5', 'module_usercenter', '用户中心', 'usercenter', '用户中心模块', 'el-icon-user', 5, 1, '1', now()), +('6', 'module_file', '文件管理', 'file', '文件管理模块', 'el-icon-folder', 6, 1, '1', now()); + +-- 插入权限数据 +INSERT INTO `tb_sys_permission` (id,permission_id, name, code, description, module_id, creator, create_time) VALUES +('0','perm_default', '默认权限', 'default', '默认权限', 'module_system', '1', now()), +('1','perm_system_manage', '系统管理', 'system:manage', '系统管理权限', 'module_system', '1', now()), +('2','perm_system_dept_manage', '系统部门查看', 'system:dept:manage', '系统部门查看权限', 'module_system', '1', now()), +('3','perm_system_menu_manage', '系统菜单查看', 'system:menu:manage', '系统菜单查看权限', 'module_system', '1', now()), +('4','perm_system_permission_manage', '系统权限查看', 'system:permission:manage', '系统权限查看权限', 'module_system', '1', now()), +('5','perm_system_role_manage', '系统角色查看', 'system:role:manage', '系统角色查看权限', 'module_system', '1', now()), +('6','perm_system_user_manage', '系统用户查看', 'system:user:manage', '系统用户查看权限', 'module_system', '1', now()), +('7','perm_system_module_manage', '系统模块查看', 'system:module:manage', '系统模块查看权限', 'module_system', '1', now()), +('8','perm_news_manage', '新闻管理', 'news:manage', '新闻管理权限', 'module_news', '1', now()), +('9','perm_study_manage', '学习管理', 'study:manage', '学习管理权限', 'module_study', '1', now()), +('10','perm_ai_manage', 'AI管理', 'ai:manage', 'AI管理权限', 'module_ai', '1', now()), +('11','perm_usercenter_manage', '用户中心管理', 'usercenter:manage', '用户中心管理权限', 'module_usercenter', '1', now()), +('12','perm_file_manage', '文件管理', 'file:manage', '文件管理权限', 'module_file', '1', now()); + +-- 插入角色-权限关联数据 +INSERT INTO `tb_sys_role_permission` (id, role_id, permission_id, creator, create_time) VALUES +('0', 'superadmin', 'perm_default', '1', now()), +('1', 'superadmin', 'perm_system_manage', '1', now()), +('2', 'superadmin', 'perm_system_dept_manage', '1', now()), +('3', 'superadmin', 'perm_system_menu_manage', '1', now()), +('4', 'superadmin', 'perm_system_permission_manage', '1', now()), +('5', 'superadmin', 'perm_system_role_manage', '1', now()), +('6', 'superadmin', 'perm_system_user_manage', '1', now()), +('7', 'superadmin', 'perm_system_module_manage', '1', now()), +('8', 'superadmin', 'perm_news_manage', '1', now()), +('9', 'superadmin', 'perm_study_manage', '1', now()), +('10', 'superadmin', 'perm_ai_manage', '1', now()), +('11', 'superadmin', 'perm_usercenter_manage', '1', now()), +('12', 'superadmin', 'perm_file_manage', '1', now()), +('13', 'freedom', 'perm_default', '1', now()); + +-- 插入前端菜单数据 +INSERT INTO `tb_sys_menu` (id, menu_id, name, parent_id, url, component, icon, order_num, type, layout, creator, create_time) VALUES +-- 资源中心 +('200', 'menu_resource_center', '资源中心', NULL, '/resource-center', 'resource-center/ResourceCenterView', 'el-icon-folder-opened', 2, 1, 'BasicLayout', '1', now()), +('201', 'menu_party_history', '党史学习', 'menu_resource_center', '/resource-center/party-history', 'resource-center/PartyHistoryView', 'el-icon-trophy', 1, 1, 'BasicLayout', '1', now()), +('202', 'menu_leader_speech', '领导讲话', 'menu_resource_center', '/resource-center/leader-speech', 'resource-center/LeaderSpeechView', 'el-icon-microphone', 2, 1, 'BasicLayout', '1', now()), +('203', 'menu_policy_interpretation', '政策解读', 'menu_resource_center', '/resource-center/policy-interpretation', 'resource-center/PolicyInterpretationView', 'el-icon-document', 3, 1, 'BasicLayout', '1', now()), +('204', 'menu_red_classic', '红色经典', 'menu_resource_center', '/resource-center/red-classic', 'resource-center/RedClassicView', 'el-icon-star-on', 4, 1, 'BasicLayout', '1', now()), +('205', 'menu_special_report', '专题报告', 'menu_resource_center', '/resource-center/special-report', 'resource-center/SpecialReportView', 'el-icon-document-copy', 5, 1, 'BasicLayout', '1', now()), +('206', 'menu_world_case', '思政案例', 'menu_resource_center', '/resource-center/world-case', 'resource-center/WorldCaseView', 'el-icon-collection', 6, 1, 'BasicLayout', '1', now()), + +-- 学习计划 +('300', 'menu_study_plan', '学习计划', NULL, '/study-plan', 'study-plan/StudyPlanView', 'el-icon-reading', 3, 1, 'BasicLayout', '1', now()), +('301', 'menu_study_tasks', '学习任务', 'menu_study_plan', '/study-plan/tasks', 'study-plan/StudyTasksView', 'el-icon-s-order', 1, 1, 'BasicLayout', '1', now()), +('302', 'menu_course_center', '课程中心', 'menu_study_plan', '/study-plan/course', 'study-plan/CourseCenterView', 'el-icon-video-play', 2, 1, 'BasicLayout', '1', now()), + +-- 个人中心 +('400', 'menu_user_center', '个人中心', NULL, '/user-center', 'user-center/UserCenterView', 'el-icon-user', 4, 1, 'BasicLayout', '1', now()), +('401', 'menu_learning_records', '学习记录', 'menu_user_center', '/user-center/learning-records', 'user-center/LearningRecordsView', 'el-icon-document', 1, 1, 'BasicLayout', '1', now()), +('402', 'menu_my_favorites', '我的收藏', 'menu_user_center', '/user-center/favorites', 'user-center/MyFavoritesView', 'el-icon-star-on', 2, 1, 'BasicLayout', '1', now()), +('403', 'menu_my_achievements', '我的成就', 'menu_user_center', '/user-center/achievements', 'user-center/MyAchievementsView', 'el-icon-trophy', 3, 1, 'BasicLayout', '1', now()), + +-- 账号中心 +('500', 'menu_profile', '账号中心', NULL, '/profile', 'profile/ProfileView', 'el-icon-user-solid', 5, 1, 'BasicLayout', '1', now()), +('501', 'menu_personal_info', '个人信息', 'menu_profile', '/profile/personal-info', 'profile/PersonalInfoView', 'el-icon-user', 1, 1, 'BasicLayout', '1', now()), +('502', 'menu_account_settings', '账号设置', 'menu_profile', '/profile/account-settings', 'profile/AccountSettingsView', 'el-icon-setting', 2, 1, 'BasicLayout', '1', now()), + +-- 智能体模块 +('600', 'menu_ai_assistant', '智能体模块', NULL, '/ai-assistant', 'ai-assistant/AIAssistantView', 'el-icon-cpu', 6, 1, 'BasicLayout', '1', now()); + +-- 插入后端管理菜单数据 +INSERT INTO `tb_sys_menu` (id, menu_id, name, parent_id, url, component, icon, order_num, type, layout, creator, create_time) VALUES +-- 系统总览 +('1000', 'menu_admin_overview', '系统总览', NULL, '/admin/overview', 'admin/overview/SystemOverviewView', 'el-icon-data-analysis', 1, 1, 'NavigationLayout', '1', now()), + +-- 用户管理 +('2000', 'menu_sys_manage', '系统管理', NULL, '', '', 'el-icon-user', 2, 1, '', '1', now()), +('2001', 'menu_admin_user', '用户管理', 'menu_sys_manage', '/admin/manage/system/user', 'admin/manage/system/UserManageView', 'el-icon-user', 1, 1, 'NavigationLayout', '1', now()), +('2002', 'menu_admin_dept', '部门管理', 'menu_sys_manage', '/admin/manage/system/dept', 'admin/manage/system/DeptManageView', 'el-icon-office-building', 2, 1, 'NavigationLayout', '1', now()), +('2003', 'menu_admin_role', '角色管理', 'menu_sys_manage', '/admin/manage/system/role', 'admin/manage/system/RoleManageView', 'el-icon-user-solid', 3, 1, 'NavigationLayout', '1', now()), +('2004', 'menu_admin_permission', '权限管理', 'menu_sys_manage', '/admin/manage/system/permission', 'admin/manage/system/PermissionManageView', 'el-icon-key', 4, 1, 'NavigationLayout', '1', now()), +('2005', 'menu_admin_menu', '菜单管理', 'menu_sys_manage', '/admin/manage/system/menu', 'admin/manage/system/MenuManageView', 'el-icon-menu', 5, 1, 'NavigationLayout', '1', now()), +('2006', 'menu_admin_module', '模块管理', 'menu_sys_manage', '/admin/manage/system/module', 'admin/manage/system/ModuleManageView', 'el-icon-s-grid', 6, 1, 'NavigationLayout', '1', now()), + +-- 资源管理 +('3000', 'menu_admin_resource_manage', '资源管理', NULL, '', '', 'el-icon-folder', 3, 1, '', '1', now()), +('3001', 'menu_admin_resource', '资源管理', 'menu_admin_resource_manage', '/admin/manage/resource/resource', 'admin/manage/resource/ResourceManagementView', 'el-icon-folder', 1, 1, 'NavigationLayout', '1', now()), +('3002', 'menu_admin_article', '文章管理', 'menu_admin_resource_manage', '/admin/manage/resource/article', 'admin/manage/resource/ArticleManagementView', 'el-icon-document', 2, 1, 'NavigationLayout', '1', now()), +('3003', 'menu_admin_data_records', '数据记录', 'menu_admin_resource_manage', '/admin/manage/resource/data-records', 'admin/manage/resource/DataRecordsView', 'el-icon-data-line', 3, 1, 'NavigationLayout', '1', now()), + +-- 运营管理 +('4000', 'menu_admin_content_manage', '运营管理', NULL, '', '', 'el-icon-s-operation', 4, 1, '', '1', now()), +('4001', 'menu_admin_banner', 'Banner管理', 'menu_admin_content_manage', '/admin/manage/content/banner', 'admin/manage/content/BannerManagementView', 'el-icon-picture', 1, 1, 'NavigationLayout', '1', now()), +('4002', 'menu_admin_tag', '标签管理', 'menu_admin_content_manage', '/admin/manage/content/tag', 'admin/manage/content/TagManagementView', 'el-icon-price-tag', 2, 1, 'NavigationLayout', '1', now()), +('4003', 'menu_admin_column', '栏目管理', 'menu_admin_content_manage', '/admin/manage/content/column', 'admin/manage/content/ColumnManagementView', 'el-icon-menu', 3, 1, 'NavigationLayout', '1', now()), +('4004', 'menu_admin_content', '内容管理', 'menu_admin_content_manage', '/admin/manage/content/content', 'admin/manage/content/ContentManagementView', 'el-icon-document', 4, 1, 'NavigationLayout', '1', now()), + +-- 学习管理 +('5000', 'menu_admin_study_manage', '学习管理', NULL, '', '', 'el-icon-reading', 5, 1, '', '1', now()), +('5001', 'menu_admin_study', '学习管理', 'menu_admin_study_manage', '/admin/manage/study/study', 'admin/manage/study/StudyManagementView', 'el-icon-reading', 1, 1, 'NavigationLayout', '1', now()), +('5002', 'menu_admin_task_publish', '任务发布', 'menu_admin_study_manage', '/admin/manage/study/task-publish', 'admin/manage/study/TaskPublishView', 'el-icon-s-order', 2, 1, 'NavigationLayout', '1', now()), +('5003', 'menu_admin_study_records', '学习记录', 'menu_admin_study_manage', '/admin/manage/study/study-records', 'admin/manage/study/StudyRecordsView', 'el-icon-document', 3, 1, 'NavigationLayout', '1', now()), + +-- 智能体管理 +('6000', 'menu_admin_ai_manage', '智能体管理', NULL, '', '', 'el-icon-cpu', 6, 1, '', '1', now()), +('6001', 'menu_admin_ai', 'AI管理', 'menu_admin_ai_manage', '/admin/manage/ai/ai', 'admin/manage/ai/AIManagementView', 'el-icon-cpu', 1, 1, 'NavigationLayout', '1', now()), +('6002', 'menu_admin_ai_config', 'AI配置', 'menu_admin_ai_manage', '/admin/manage/ai/config', 'admin/manage/ai/AIConfigView', 'el-icon-setting', 2, 1, 'NavigationLayout', '1', now()), +('6003', 'menu_admin_knowledge', '知识库管理', 'menu_admin_ai_manage', '/admin/manage/ai/knowledge', 'admin/manage/ai/KnowledgeManagementView', 'el-icon-collection', 3, 1, 'NavigationLayout', '1', now()), + +-- 系统日志 +('7000', 'menu_admin_logs_manage', '系统日志', NULL, '', '', 'el-icon-document', 7, 1, '', '1', now()), +('7001', 'menu_admin_system_logs', '系统日志', 'menu_admin_logs_manage', '/admin/manage/logs/system', 'admin/manage/logs/SystemLogsView', 'el-icon-document', 1, 1, 'NavigationLayout', '1', now()), +('7002', 'menu_admin_login_logs', '登录日志', 'menu_admin_logs_manage', '/admin/manage/logs/login', 'admin/manage/logs/LoginLogsView', 'el-icon-key', 2, 1, 'NavigationLayout', '1', now()), +('7003', 'menu_admin_operation_logs', '操作日志', 'menu_admin_logs_manage', '/admin/manage/logs/operation', 'admin/manage/logs/OperationLogsView', 'el-icon-s-operation', 3, 1, 'NavigationLayout', '1', now()), +('7004', 'menu_admin_system_config', '系统配置', 'menu_admin_logs_manage', '/admin/manage/logs/config', 'admin/manage/logs/SystemConfigView', 'el-icon-setting', 4, 1, 'NavigationLayout', '1', now()); + +-- 插入菜单权限关联数据 +INSERT INTO `tb_sys_menu_permission` (id, permission_id, menu_id, creator, create_time) VALUES +-- 前端菜单权限关联 +('100', 'perm_default', 'menu_home', '1', now()), +('101', 'perm_default', 'menu_resource_center', '1', now()), +('102', 'perm_default', 'menu_party_history', '1', now()), +('103', 'perm_default', 'menu_leader_speech', '1', now()), +('104', 'perm_default', 'menu_policy_interpretation', '1', now()), +('105', 'perm_default', 'menu_red_classic', '1', now()), +('106', 'perm_default', 'menu_special_report', '1', now()), +('107', 'perm_default', 'menu_world_case', '1', now()), +('108', 'perm_default', 'menu_study_plan', '1', now()), +('109', 'perm_default', 'menu_study_tasks', '1', now()), +('110', 'perm_default', 'menu_course_center', '1', now()), +('111', 'perm_default', 'menu_user_center', '1', now()), +('112', 'perm_default', 'menu_learning_records', '1', now()), +('113', 'perm_default', 'menu_my_favorites', '1', now()), +('114', 'perm_default', 'menu_my_achievements', '1', now()), +('115', 'perm_default', 'menu_profile', '1', now()), +('116', 'perm_default', 'menu_personal_info', '1', now()), +('117', 'perm_default', 'menu_account_settings', '1', now()), +('118', 'perm_ai_manage', 'menu_ai_assistant', '1', now()), + + +-- 后端管理菜单权限关联 +('200', 'perm_system_manage', 'menu_admin_overview', '1', now()), +('201', 'perm_system_manage', 'menu_sys_manage', '1', now()), +('202', 'perm_system_user_manage', 'menu_admin_user_manage', '1', now()), +('203', 'perm_system_user_manage', 'menu_admin_user', '1', now()), +('204', 'perm_system_dept_manage', 'menu_admin_dept', '1', now()), +('205', 'perm_system_role_manage', 'menu_admin_role', '1', now()), +('206', 'perm_system_permission_manage', 'menu_admin_permission', '1', now()), +('207', 'perm_system_menu_manage', 'menu_admin_menu', '1', now()), +('208', 'perm_system_module_manage', 'menu_admin_module', '1', now()), +('209', 'perm_news_manage', 'menu_admin_resource_manage', '1', now()), +('210', 'perm_news_manage', 'menu_admin_resource', '1', now()), +('211', 'perm_news_manage', 'menu_admin_article', '1', now()), +('212', 'perm_news_manage', 'menu_admin_data_records', '1', now()), +('213', 'perm_news_manage', 'menu_admin_content_manage', '1', now()), +('214', 'perm_news_manage', 'menu_admin_banner', '1', now()), +('215', 'perm_news_manage', 'menu_admin_tag', '1', now()), +('216', 'perm_news_manage', 'menu_admin_column', '1', now()), +('217', 'perm_news_manage', 'menu_admin_content', '1', now()), +('218', 'perm_study_manage', 'menu_admin_study_manage', '1', now()), +('219', 'perm_study_manage', 'menu_admin_study', '1', now()), +('220', 'perm_study_manage', 'menu_admin_task_publish', '1', now()), +('221', 'perm_study_manage', 'menu_admin_study_records', '1', now()), +('222', 'perm_ai_manage', 'menu_admin_ai_manage', '1', now()), +('223', 'perm_ai_manage', 'menu_admin_ai', '1', now()), +('224', 'perm_ai_manage', 'menu_admin_ai_config', '1', now()), +('225', 'perm_ai_manage', 'menu_admin_knowledge', '1', now()), +('226', 'perm_system_manage', 'menu_admin_logs_manage', '1', now()), +('227', 'perm_system_manage', 'menu_admin_system_logs', '1', now()), +('228', 'perm_system_manage', 'menu_admin_login_logs', '1', now()), +('229', 'perm_system_manage', 'menu_admin_operation_logs', '1', now()), +('230', 'perm_system_manage', 'menu_admin_system_config', '1', now()); diff --git a/schoolNewsServ/.bin/mysql/sql/reInit.sh b/schoolNewsServ/.bin/mysql/sql/reInit.sh new file mode 100644 index 0000000..56a2f28 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/reInit.sh @@ -0,0 +1,184 @@ +#!/bin/bash + +# ===================================================== +# 校园思政新闻平台数据库重新初始化脚本 +# 版本: 1.0.0 +# 说明: 该脚本会删除现有数据库,重新创建并初始化所有数据 +# 注意: 执行前请确保MySQL服务已启动,并且有足够的权限 +# ===================================================== + +# 设置颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 数据库配置 +DB_HOST="localhost" +DB_PORT="3306" +DB_USER="root" +DB_PASSWORD="123456" +DB_NAME="school_news" + +# 脚本目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 日志文件 +LOG_FILE="$SCRIPT_DIR/reInit.log" + +# 打印带颜色的消息 +print_message() { + local color=$1 + local message=$2 + echo -e "${color}${message}${NC}" + echo "$(date '+%Y-%m-%d %H:%M:%S') - $message" >> "$LOG_FILE" +} + +# 检查MySQL连接 +check_mysql_connection() { + print_message $BLUE "检查MySQL连接..." + + if command -v mysql &> /dev/null; then + if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "SELECT 1;" &> /dev/null; then + print_message $GREEN "MySQL连接成功" + return 0 + else + print_message $RED "MySQL连接失败,请检查配置" + return 1 + fi + else + print_message $RED "MySQL客户端未安装或不在PATH中" + return 1 + fi +} + +# 备份现有数据库(如果存在) +backup_database() { + if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "USE $DB_NAME;" &> /dev/null; then + print_message $YELLOW "发现现有数据库,正在备份..." + local backup_file="$SCRIPT_DIR/backup_${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql" + mysqldump -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$backup_file" + if [ $? -eq 0 ]; then + print_message $GREEN "数据库备份成功: $backup_file" + else + print_message $YELLOW "数据库备份失败,继续执行..." + fi + fi +} + +# 删除现有数据库 +drop_database() { + print_message $YELLOW "删除现有数据库..." + mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "DROP DATABASE IF EXISTS $DB_NAME;" + if [ $? -eq 0 ]; then + print_message $GREEN "数据库删除成功" + else + print_message $RED "数据库删除失败" + exit 1 + fi +} + +# 执行初始化脚本 +execute_init_script() { + print_message $BLUE "开始执行数据库初始化..." + + # 切换到脚本目录 + cd "$SCRIPT_DIR" + + # 执行initAll.sql + mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" < initAll.sql + + if [ $? -eq 0 ]; then + print_message $GREEN "数据库初始化成功" + else + print_message $RED "数据库初始化失败" + exit 1 + fi +} + +# 验证初始化结果 +verify_initialization() { + print_message $BLUE "验证初始化结果..." + + # 检查数据库是否存在 + if mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -e "USE $DB_NAME;" &> /dev/null; then + print_message $GREEN "数据库创建成功" + else + print_message $RED "数据库创建失败" + exit 1 + fi + + # 检查表数量 + local table_count=$(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -D"$DB_NAME" -e "SHOW TABLES;" | wc -l) + print_message $GREEN "创建了 $table_count 张表" + + # 检查默认用户 + local user_count=$(mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASSWORD" -D"$DB_NAME" -e "SELECT COUNT(*) FROM tb_sys_user WHERE username='admin';" | tail -n 1) + if [ "$user_count" -gt 0 ]; then + print_message $GREEN "默认用户创建成功" + else + print_message $YELLOW "默认用户创建失败" + fi +} + +# 显示初始化信息 +show_initialization_info() { + print_message $BLUE "=====================================================" + print_message $GREEN "数据库初始化完成!" + print_message $BLUE "=====================================================" + print_message $YELLOW "数据库信息:" + print_message $YELLOW " 数据库名: $DB_NAME" + print_message $YELLOW " 主机: $DB_HOST" + print_message $YELLOW " 端口: $DB_PORT" + print_message $YELLOW " 用户: $DB_USER" + print_message $BLUE "=====================================================" + print_message $YELLOW "默认账户信息:" + print_message $YELLOW " 用户名: admin" + print_message $YELLOW " 密码: admin123" + print_message $YELLOW " 角色: 管理员" + print_message $BLUE "=====================================================" + print_message $YELLOW "系统功能:" + print_message $YELLOW " - 用户管理" + print_message $YELLOW " - 权限管理" + print_message $YELLOW " - 资源管理" + print_message $YELLOW " - 学习管理" + print_message $YELLOW " - AI智能体" + print_message $YELLOW " - 系统配置" + print_message $BLUE "=====================================================" +} + +# 主函数 +main() { + print_message $BLUE "=====================================================" + print_message $BLUE "校园思政新闻平台数据库重新初始化脚本" + print_message $BLUE "版本: 1.0.0" + print_message $BLUE "=====================================================" + + # 检查MySQL连接 + if ! check_mysql_connection; then + exit 1 + fi + + # 备份现有数据库 + # backup_database + + # 删除现有数据库 + # drop_database + + # 执行初始化脚本 + execute_init_script + + # 验证初始化结果 + verify_initialization + + # 显示初始化信息 + show_initialization_info + + print_message $GREEN "初始化完成!" +} + +# 脚本入口 +if [ "${BASH_SOURCE[0]}" == "${0}" ]; then + main "$@" +fi diff --git a/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/module/ModuleService.java b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/module/ModuleService.java new file mode 100644 index 0000000..d0745db --- /dev/null +++ b/schoolNewsServ/api/api-system/src/main/java/org/xyzh/api/system/module/ModuleService.java @@ -0,0 +1,186 @@ +package org.xyzh.api.system.module; + +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.system.TbSysModule; +import org.xyzh.common.core.domain.ResultDomain; + +import java.util.List; + +/** + * @description 系统模块服务接口 + * @filename ModuleService.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +public interface ModuleService { + + /** + * @description 查询模块列表 + * @param filter 过滤条件 + * @return ResultDomain 模块列表 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain getModuleList(TbSysModule filter); + + /** + * @description 根据模块ID查询模块信息 + * @param moduleID 模块ID + * @return ResultDomain 模块信息 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain getModuleById(String moduleID); + + /** + * @description 根据模块代码查询模块信息 + * @param code 模块代码 + * @return ResultDomain 模块信息 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain getModuleByCode(String code); + + /** + * @description 查询启用的模块列表 + * @return ResultDomain 启用的模块列表 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain getActiveModules(); + + /** + * @description 创建模块 + * @param module 模块信息 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain createModule(TbSysModule module); + + /** + * @description 更新模块 + * @param module 模块信息 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain updateModule(TbSysModule module); + + /** + * @description 删除模块 + * @param moduleID 模块ID + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain deleteModule(String moduleID); + + /** + * @description 批量删除模块 + * @param moduleIDs 模块ID列表 + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain batchDeleteModules(List moduleIDs); + + /** + * @description 更新模块状态 + * @param moduleID 模块ID + * @param status 状态 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain updateModuleStatus(String moduleID, Integer status); + + /** + * @description 更新模块排序 + * @param moduleID 模块ID + * @param orderNum 排序号 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain updateModuleOrder(String moduleID, Integer orderNum); + + /** + * @description 分页查询模块列表 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @return ResultDomain 模块列表 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain getModuleListPage(TbSysModule filter, PageParam pageParam); + + /** + * @description 统计模块数量 + * @param filter 过滤条件 + * @return ResultDomain 模块数量 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain countModules(TbSysModule filter); + + /** + * @description 检查模块代码是否存在 + * @param code 模块代码 + * @param excludeID 排除的模块ID + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain checkModuleCodeExists(String code, String excludeID); + + /** + * @description 绑定权限到模块 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 绑定结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain bindPermissionsToModule(String moduleID, List permissionIds); + + /** + * @description 解绑模块的权限 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 解绑结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain unbindPermissionsFromModule(String moduleID, List permissionIds); + + /** + * @description 获取模块的权限列表 + * @param moduleID 模块ID + * @return ResultDomain> 权限ID列表 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain> getModulePermissions(String moduleID); + + /** + * @description 批量绑定权限到模块 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 绑定结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain batchBindPermissionsToModule(String moduleID, List permissionIds); + + /** + * @description 批量解绑模块的权限 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 解绑结果 + * @author yslg + * @since 2025-10-16 + */ + ResultDomain batchUnbindPermissionsFromModule(String moduleID, List permissionIds); +} diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/permission/TbSysPermission.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/permission/TbSysPermission.java index 2a6802d..9b2e988 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/permission/TbSysPermission.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/permission/TbSysPermission.java @@ -54,6 +54,13 @@ public class TbSysPermission extends BaseDTO{ */ private String updater; + /** + * @description 所属模块ID + * @author yslg + * @since 2025-10-16 + */ + private String moduleID; + public String getPermissionID() { return permissionID; } @@ -102,6 +109,14 @@ public class TbSysPermission extends BaseDTO{ this.updater = updater; } + public String getModuleID() { + return moduleID; + } + + public void setModuleID(String moduleID) { + this.moduleID = moduleID; + } + @Override public String toString() { return "TbSysPermission{" + @@ -110,6 +125,7 @@ public class TbSysPermission extends BaseDTO{ ", name='" + name + '\'' + ", description='" + description + '\'' + ", code='" + code + '\'' + + ", moduleID='" + moduleID + '\'' + ", creator='" + creator + '\'' + ", updater='" + updater + '\'' + ", createTime=" + getCreateTime() + diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/system/TbSysModule.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/system/TbSysModule.java new file mode 100644 index 0000000..bfa441b --- /dev/null +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/system/TbSysModule.java @@ -0,0 +1,146 @@ +package org.xyzh.common.dto.system; + +import org.xyzh.common.dto.BaseDTO; + +/** + * @description 系统模块表 + * @filename TbSysModule.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +public class TbSysModule extends BaseDTO { + + private static final long serialVersionUID = 1L; + + /** + * @description 模块ID + */ + private String moduleID; + + /** + * @description 模块名称 + */ + private String name; + + /** + * @description 模块代码 + */ + private String code; + + /** + * @description 模块描述 + */ + private String description; + + /** + * @description 模块图标 + */ + private String icon; + + /** + * @description 模块排序号 + */ + private Integer orderNum; + + /** + * @description 模块状态(0禁用 1启用) + */ + private Integer status; + + /** + * @description 创建者 + */ + private String creator; + + /** + * @description 更新者 + */ + private String updater; + + public String getModuleID() { + return moduleID; + } + + public void setModuleID(String moduleID) { + this.moduleID = moduleID; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getUpdater() { + return updater; + } + + public void setUpdater(String updater) { + this.updater = updater; + } + + @Override + public String toString() { + return "TbSysModule{" + + "id=" + getID() + + ", moduleID='" + moduleID + '\'' + + ", name='" + name + '\'' + + ", code='" + code + '\'' + + ", description='" + description + '\'' + + ", icon='" + icon + '\'' + + ", orderNum=" + orderNum + + ", status=" + status + + '}'; + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/ModuleController.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/ModuleController.java new file mode 100644 index 0000000..357a246 --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/controller/ModuleController.java @@ -0,0 +1,257 @@ +package org.xyzh.system.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.xyzh.api.system.module.ModuleService; +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.system.TbSysModule; +import org.xyzh.common.core.domain.ResultDomain; + +import java.util.List; + +/** + * @description 系统模块控制器 + * @filename ModuleController.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +@RestController +@RequestMapping("/system/module") +@CrossOrigin(origins = "*") +public class ModuleController { + + @Autowired + private ModuleService moduleService; + + /** + * @description 查询模块列表 + * @param filter 过滤条件 + * @return ResultDomain 模块列表 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/list") + public ResultDomain getModuleList(@RequestBody(required = false) TbSysModule filter) { + return moduleService.getModuleList(filter); + } + + /** + * @description 根据模块ID查询模块信息 + * @param moduleID 模块ID + * @return ResultDomain 模块信息 + * @author yslg + * @since 2025-10-16 + */ + @GetMapping("/{moduleID}") + public ResultDomain getModuleById(@PathVariable String moduleID) { + return moduleService.getModuleById(moduleID); + } + + /** + * @description 根据模块代码查询模块信息 + * @param code 模块代码 + * @return ResultDomain 模块信息 + * @author yslg + * @since 2025-10-16 + */ + @GetMapping("/code/{code}") + public ResultDomain getModuleByCode(@PathVariable String code) { + return moduleService.getModuleByCode(code); + } + + /** + * @description 查询启用的模块列表 + * @return ResultDomain 启用的模块列表 + * @author yslg + * @since 2025-10-16 + */ + @GetMapping("/active") + public ResultDomain getActiveModules() { + return moduleService.getActiveModules(); + } + + /** + * @description 创建模块 + * @param module 模块信息 + * @return ResultDomain 创建结果 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/create") + public ResultDomain createModule(@RequestBody TbSysModule module) { + return moduleService.createModule(module); + } + + /** + * @description 更新模块 + * @param module 模块信息 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + @PutMapping("/update") + public ResultDomain updateModule(@RequestBody TbSysModule module) { + return moduleService.updateModule(module); + } + + /** + * @description 删除模块 + * @param moduleID 模块ID + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-10-16 + */ + @DeleteMapping("/{moduleID}") + public ResultDomain deleteModule(@PathVariable String moduleID) { + return moduleService.deleteModule(moduleID); + } + + /** + * @description 批量删除模块 + * @param moduleIDs 模块ID列表 + * @return ResultDomain 删除结果 + * @author yslg + * @since 2025-10-16 + */ + @DeleteMapping("/batch") + public ResultDomain batchDeleteModules(@RequestBody List moduleIDs) { + return moduleService.batchDeleteModules(moduleIDs); + } + + /** + * @description 更新模块状态 + * @param moduleID 模块ID + * @param status 状态 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + @PutMapping("/{moduleID}/status/{status}") + public ResultDomain updateModuleStatus(@PathVariable String moduleID, @PathVariable Integer status) { + return moduleService.updateModuleStatus(moduleID, status); + } + + /** + * @description 更新模块排序 + * @param moduleID 模块ID + * @param orderNum 排序号 + * @return ResultDomain 更新结果 + * @author yslg + * @since 2025-10-16 + */ + @PutMapping("/{moduleID}/order/{orderNum}") + public ResultDomain updateModuleOrder(@PathVariable String moduleID, @PathVariable Integer orderNum) { + return moduleService.updateModuleOrder(moduleID, orderNum); + } + + /** + * @description 分页查询模块列表 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @return ResultDomain 模块列表 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/page") + public ResultDomain getModuleListPage(@RequestBody(required = false) TbSysModule filter, + @RequestParam(defaultValue = "1") int pageNumber, + @RequestParam(defaultValue = "10") int pageSize) { + PageParam pageParam = new PageParam(pageNumber, pageSize); + return moduleService.getModuleListPage(filter, pageParam); + } + + /** + * @description 统计模块数量 + * @param filter 过滤条件 + * @return ResultDomain 模块数量 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/count") + public ResultDomain countModules(@RequestBody(required = false) TbSysModule filter) { + return moduleService.countModules(filter); + } + + /** + * @description 检查模块代码是否存在 + * @param code 模块代码 + * @param excludeID 排除的模块ID + * @return ResultDomain 是否存在 + * @author yslg + * @since 2025-10-16 + */ + @GetMapping("/check-code") + public ResultDomain checkModuleCodeExists(@RequestParam String code, + @RequestParam(required = false) String excludeID) { + return moduleService.checkModuleCodeExists(code, excludeID); + } + + /** + * @description 绑定权限到模块 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 绑定结果 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/{moduleID}/bind-permissions") + public ResultDomain bindPermissionsToModule(@PathVariable String moduleID, + @RequestBody List permissionIds) { + return moduleService.bindPermissionsToModule(moduleID, permissionIds); + } + + /** + * @description 解绑模块的权限 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 解绑结果 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/{moduleID}/unbind-permissions") + public ResultDomain unbindPermissionsFromModule(@PathVariable String moduleID, + @RequestBody List permissionIds) { + return moduleService.unbindPermissionsFromModule(moduleID, permissionIds); + } + + /** + * @description 获取模块的权限列表 + * @param moduleID 模块ID + * @return ResultDomain> 权限ID列表 + * @author yslg + * @since 2025-10-16 + */ + @GetMapping("/{moduleID}/permissions") + public ResultDomain> getModulePermissions(@PathVariable String moduleID) { + return moduleService.getModulePermissions(moduleID); + } + + /** + * @description 批量绑定权限到模块 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 绑定结果 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/{moduleID}/batch-bind-permissions") + public ResultDomain batchBindPermissionsToModule(@PathVariable String moduleID, + @RequestBody List permissionIds) { + return moduleService.batchBindPermissionsToModule(moduleID, permissionIds); + } + + /** + * @description 批量解绑模块的权限 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return ResultDomain 解绑结果 + * @author yslg + * @since 2025-10-16 + */ + @PostMapping("/{moduleID}/batch-unbind-permissions") + public ResultDomain batchUnbindPermissionsFromModule(@PathVariable String moduleID, + @RequestBody List permissionIds) { + return moduleService.batchUnbindPermissionsFromModule(moduleID, permissionIds); + } +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/ModuleMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/ModuleMapper.java new file mode 100644 index 0000000..b91b0af --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/ModuleMapper.java @@ -0,0 +1,149 @@ +package org.xyzh.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.system.TbSysModule; + +import java.util.List; + +/** + * @description 系统模块数据访问层 + * @filename ModuleMapper.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +@Mapper +public interface ModuleMapper extends BaseMapper { + + /** + * @description 查询模块列表 + * @param filter 过滤条件 + * @return List 模块列表 + * @author yslg + * @since 2025-10-16 + */ + List selectModules(TbSysModule filter); + + /** + * @description 根据模块ID查询模块信息 + * @param moduleID 模块ID + * @return TbSysModule 模块信息 + * @author yslg + * @since 2025-10-16 + */ + TbSysModule selectByModuleID(@Param("moduleID") String moduleID); + + /** + * @description 根据模块代码查询模块信息 + * @param code 模块代码 + * @return TbSysModule 模块信息 + * @author yslg + * @since 2025-10-16 + */ + TbSysModule selectByCode(@Param("code") String code); + + /** + * @description 查询启用的模块列表 + * @return List 启用的模块列表 + * @author yslg + * @since 2025-10-16 + */ + List selectActiveModules(); + + /** + * @description 检查模块代码是否存在 + * @param code 模块代码 + * @param excludeID 排除的模块ID + * @return int 存在的数量 + * @author yslg + * @since 2025-10-16 + */ + int countByCode(@Param("code") String code, @Param("excludeID") String excludeID); + + /** + * @description 插入模块 + * @param module 模块信息 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int insertModule(TbSysModule module); + + /** + * @description 更新模块 + * @param module 模块信息 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int updateModule(TbSysModule module); + + /** + * @description 删除模块 + * @param module 模块信息 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int deleteModule(TbSysModule module); + + /** + * @description 批量插入模块 + * @param moduleList 模块列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int batchInsertModules(@Param("moduleList") List moduleList); + + /** + * @description 批量删除模块 + * @param moduleIDs 模块ID列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int batchDeleteModules(@Param("moduleIDs") List moduleIDs); + + /** + * @description 分页查询模块列表 + * @param filter 过滤条件 + * @param pageParam 分页参数 + * @return List 模块列表 + * @author yslg + * @since 2025-10-16 + */ + List selectModulesPage(@Param("filter") TbSysModule filter, @Param("pageParam") PageParam pageParam); + + /** + * @description 统计模块数量 + * @param filter 过滤条件 + * @return long 模块数量 + * @author yslg + * @since 2025-10-16 + */ + long countModules(@Param("filter") TbSysModule filter); + + /** + * @description 更新模块状态 + * @param moduleID 模块ID + * @param status 状态 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int updateModuleStatus(@Param("moduleID") String moduleID, @Param("status") Integer status); + + /** + * @description 更新模块排序 + * @param moduleID 模块ID + * @param orderNum 排序号 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int updateModuleOrder(@Param("moduleID") String moduleID, @Param("orderNum") Integer orderNum); +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java index 6e03963..17498ba 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/mapper/PermissionMapper.java @@ -58,12 +58,12 @@ public interface PermissionMapper extends BaseMapper { /** * @description 根据角色ID查询权限列表 - * @param roleId 角色ID + * @param roleID 角色ID * @return List 权限列表 * @author yslg * @since 2025-09-28 */ - List selectPermissionsByRoleId(@Param("roleId") String roleId); + List selectPermissionsByRoleID(@Param("roleID") String roleID); /** * @description 根据权限编码查询权限 @@ -77,22 +77,22 @@ public interface PermissionMapper extends BaseMapper { /** * @description 检查权限名称是否存在 * @param permissionName 权限名称 - * @param excludeId 排除的权限ID + * @param excludeID 排除的权限ID * @return int 存在数量 * @author yslg * @since 2025-09-28 */ - int countByPermissionName(@Param("permissionName") String permissionName, @Param("excludeId") String excludeId); + int countByPermissionName(@Param("permissionName") String permissionName, @Param("excludeID") String excludeID); /** * @description 检查权限编码是否存在 * @param permissionCode 权限编码 - * @param excludeId 排除的权限ID + * @param excludeID 排除的权限ID * @return int 存在数量 * @author yslg * @since 2025-09-28 */ - int countByPermissionCode(@Param("permissionCode") String permissionCode, @Param("excludeId") String excludeId); + int countByPermissionCode(@Param("permissionCode") String permissionCode, @Param("excludeID") String excludeID); /** * @description 批量删除权限(逻辑删除) @@ -157,4 +157,42 @@ public interface PermissionMapper extends BaseMapper { * @since 2025-10-08 */ List selectPermissionBindRole(@Param("permission") PermissionVO permission); + + /** + * @description 根据模块ID查询权限列表 + * @param moduleID 模块ID + * @return List 权限列表 + * @author yslg + * @since 2025-10-16 + */ + List selectPermissionsByModuleID(@Param("moduleID") String moduleID); + + /** + * @description 绑定权限到模块 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int bindPermissionsToModule(@Param("moduleID") String moduleID, @Param("permissionIds") List permissionIds); + + /** + * @description 解绑模块的权限 + * @param moduleID 模块ID + * @param permissionIds 权限ID列表 + * @return int 影响行数 + * @author yslg + * @since 2025-10-16 + */ + int unbindPermissionsFromModule(@Param("moduleID") String moduleID, @Param("permissionIds") List permissionIds); + + /** + * @description 获取模块的权限ID列表 + * @param moduleID 模块ID + * @return List 权限ID列表 + * @author yslg + * @since 2025-10-16 + */ + List getModulePermissionIds(@Param("moduleID") String moduleID); } diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/module/SysModuleService.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/module/SysModuleService.java new file mode 100644 index 0000000..9774f1f --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/module/SysModuleService.java @@ -0,0 +1,14 @@ +package org.xyzh.system.module; + +import org.xyzh.api.system.module.ModuleService; + +/** + * @description 系统模块服务接口 + * @filename SysModuleService.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +public interface SysModuleService extends ModuleService{ + +} diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/module/impl/ModuleServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/module/impl/ModuleServiceImpl.java new file mode 100644 index 0000000..885327b --- /dev/null +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/module/impl/ModuleServiceImpl.java @@ -0,0 +1,407 @@ +package org.xyzh.system.module.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.xyzh.common.core.page.PageParam; +import org.xyzh.common.dto.system.TbSysModule; +import org.xyzh.common.utils.IDUtils; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.system.mapper.ModuleMapper; +import org.xyzh.system.mapper.PermissionMapper; +import org.xyzh.api.system.module.ModuleService; + +import java.util.Date; +import java.util.List; + +/** + * @description 系统模块服务实现类 + * @filename ModuleServiceImpl.java + * @author yslg + * @copyright xyzh + * @since 2025-10-16 + */ +@Service +public class ModuleServiceImpl implements ModuleService { + + @Autowired + private ModuleMapper moduleMapper; + + @Autowired + private PermissionMapper permissionMapper; + + @Override + public ResultDomain getModuleList(TbSysModule filter) { + try { + List modules = moduleMapper.selectModules(filter); + ResultDomain result = new ResultDomain<>(); + result.success("查询成功", modules); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("查询模块列表失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain getModuleById(String moduleID) { + try { + TbSysModule module = moduleMapper.selectByModuleID(moduleID); + if (module == null) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块不存在"); + return result; + } + ResultDomain result = new ResultDomain<>(); + result.success("查询成功", module); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("查询模块信息失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain getModuleByCode(String code) { + try { + TbSysModule module = moduleMapper.selectByCode(code); + if (module == null) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块不存在"); + return result; + } + ResultDomain result = new ResultDomain<>(); + result.success("查询成功", module); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("查询模块信息失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain getActiveModules() { + try { + List modules = moduleMapper.selectActiveModules(); + ResultDomain result = new ResultDomain<>(); + result.success("查询成功", modules); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("查询启用模块列表失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain createModule(TbSysModule module) { + try { + // 检查模块代码是否已存在 + int count = moduleMapper.countByCode(module.getCode(), null); + if (count > 0) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块代码已存在"); + return result; + } + + // 设置ID和创建时间 + module.setID(IDUtils.generateID()); + module.setModuleID(IDUtils.generateID()); + module.setCreateTime(new Date()); + module.setUpdateTime(new Date()); + module.setDeleted(false); + + int result = moduleMapper.insertModule(module); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("创建成功", module); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("创建模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("创建模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain updateModule(TbSysModule module) { + try { + // 检查模块是否存在 + TbSysModule existingModule = moduleMapper.selectByModuleID(module.getModuleID()); + if (existingModule == null) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块不存在"); + return result; + } + + // 检查模块代码是否已存在(排除自身) + int count = moduleMapper.countByCode(module.getCode(), existingModule.getID()); + if (count > 0) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块代码已存在"); + return result; + } + + // 设置更新时间和ID + module.setID(existingModule.getID()); + module.setUpdateTime(new Date()); + + int result = moduleMapper.updateModule(module); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("更新成功", module); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("更新模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("更新模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain deleteModule(String moduleID) { + try { + TbSysModule module = moduleMapper.selectByModuleID(moduleID); + if (module == null) { + ResultDomain result = new ResultDomain<>(); + result.fail("模块不存在"); + return result; + } + + module.setDeleteTime(new Date()); + int result = moduleMapper.deleteModule(module); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("删除成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("删除模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("删除模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain batchDeleteModules(List moduleIDs) { + try { + int result = moduleMapper.batchDeleteModules(moduleIDs); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("批量删除成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("批量删除模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("批量删除模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain updateModuleStatus(String moduleID, Integer status) { + try { + int result = moduleMapper.updateModuleStatus(moduleID, status); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("更新状态成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("更新模块状态失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("更新模块状态失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain updateModuleOrder(String moduleID, Integer orderNum) { + try { + int result = moduleMapper.updateModuleOrder(moduleID, orderNum); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("更新排序成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("更新模块排序失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("更新模块排序失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain getModuleListPage(TbSysModule filter, PageParam pageParam) { + try { + List modules = moduleMapper.selectModulesPage(filter, pageParam); + ResultDomain result = new ResultDomain<>(); + result.success("查询成功", modules); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("分页查询模块列表失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain countModules(TbSysModule filter) { + try { + long count = moduleMapper.countModules(filter); + ResultDomain result = new ResultDomain<>(); + result.success("统计成功", count); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("统计模块数量失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain checkModuleCodeExists(String code, String excludeID) { + try { + int count = moduleMapper.countByCode(code, excludeID); + ResultDomain result = new ResultDomain<>(); + result.success("检查成功", count > 0); + return result; + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("检查模块代码失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain bindPermissionsToModule(String moduleID, List permissionIds) { + try { + int result = permissionMapper.bindPermissionsToModule(moduleID, permissionIds); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("绑定成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("绑定权限到模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("绑定权限到模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain unbindPermissionsFromModule(String moduleID, List permissionIds) { + try { + int result = permissionMapper.unbindPermissionsFromModule(moduleID, permissionIds); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("解绑成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("解绑模块权限失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("解绑模块权限失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain> getModulePermissions(String moduleID) { + try { + List permissionIds = permissionMapper.getModulePermissionIds(moduleID); + ResultDomain> result = new ResultDomain<>(); + result.success("查询成功", permissionIds); + return result; + } catch (Exception e) { + ResultDomain> result = new ResultDomain<>(); + result.fail("获取模块权限失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain batchBindPermissionsToModule(String moduleID, List permissionIds) { + try { + int result = permissionMapper.bindPermissionsToModule(moduleID, permissionIds); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("批量绑定成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("批量绑定权限到模块失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("批量绑定权限到模块失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain batchUnbindPermissionsFromModule(String moduleID, List permissionIds) { + try { + int result = permissionMapper.unbindPermissionsFromModule(moduleID, permissionIds); + if (result > 0) { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.success("批量解绑成功", true); + return resultDomain; + } else { + ResultDomain resultDomain = new ResultDomain<>(); + resultDomain.fail("批量解绑模块权限失败"); + return resultDomain; + } + } catch (Exception e) { + ResultDomain result = new ResultDomain<>(); + result.fail("批量解绑模块权限失败:" + e.getMessage()); + return result; + } + } +} \ No newline at end of file diff --git a/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java index 7701552..84c61b9 100644 --- a/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java +++ b/schoolNewsServ/system/src/main/java/org/xyzh/system/permission/service/impl/SysPermissionServiceImpl.java @@ -888,7 +888,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { return resultDomain; } - List permissions = permissionMapper.selectPermissionsByRoleId(roleId); + List permissions = permissionMapper.selectPermissionsByRoleID(roleId); logger.info("根据角色ID查询权限列表完成,共找到{}个权限", permissions.size()); resultDomain.success("查询成功", permissions); diff --git a/schoolNewsServ/system/src/main/resources/mapper/ModuleMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/ModuleMapper.xml new file mode 100644 index 0000000..62fc1c0 --- /dev/null +++ b/schoolNewsServ/system/src/main/resources/mapper/ModuleMapper.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, module_id, name, code, description, icon, order_num, status, creator, updater, + create_time, update_time, delete_time, deleted + + + + + + + + AND id = #{filter.id} + + + AND module_id = #{filter.moduleID} + + + AND name LIKE CONCAT('%', #{filter.name}, '%') + + + AND code = #{filter.code} + + + AND status = #{filter.status} + + + AND deleted = #{filter.deleted} + + + AND deleted = 0 + + + + + + + + + + + + + + + + + + + + + INSERT INTO tb_sys_module ( + id, module_id, name, code, description, icon, order_num, status, + creator, updater, create_time, update_time, deleted + ) VALUES ( + #{id}, #{moduleID}, #{name}, #{code}, #{description}, #{icon}, #{orderNum}, #{status}, + #{creator}, #{updater}, #{createTime}, #{updateTime}, #{deleted} + ) + + + + + UPDATE tb_sys_module + + + name = #{name}, + + + code = #{code}, + + + description = #{description}, + + + icon = #{icon}, + + + order_num = #{orderNum}, + + + status = #{status}, + + + updater = #{updater}, + + + update_time = #{updateTime}, + + + WHERE id = #{id} AND deleted = 0 + + + + + UPDATE tb_sys_module + SET deleted = 1, delete_time = #{deleteTime} + WHERE id = #{id} AND deleted = 0 + + + + + INSERT INTO tb_sys_module ( + id, module_id, name, code, description, icon, order_num, status, + creator, updater, create_time, update_time, deleted + ) VALUES + + ( + #{module.id}, #{module.moduleID}, #{module.name}, #{module.code}, #{module.description}, + #{module.icon}, #{module.orderNum}, #{module.status}, #{module.creator}, #{module.updater}, + #{module.createTime}, #{module.updateTime}, #{module.deleted} + ) + + + + + + UPDATE tb_sys_module + SET deleted = 1, delete_time = NOW() + WHERE id IN + + #{moduleID} + + AND deleted = 0 + + + + + + + + + + + UPDATE tb_sys_module + SET status = #{status}, update_time = NOW() + WHERE module_id = #{moduleID} AND deleted = 0 + + + + + UPDATE tb_sys_module + SET order_num = #{orderNum}, update_time = NOW() + WHERE module_id = #{moduleID} AND deleted = 0 + + + diff --git a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml index 9b88b87..2d37cb2 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml @@ -9,6 +9,7 @@ + @@ -48,7 +49,7 @@ - id, permission_id, name, code, description, creator, updater, + id, permission_id, name, code, description, module_id, creator, updater, create_time, update_time, delete_time, deleted @@ -82,7 +83,7 @@ - SELECT p.id, p.permission_id, p.name, p.code, p.description, p.creator, p.updater, @@ -91,7 +92,7 @@ INNER JOIN tb_sys_permission p ON p.permission_id = rp.permission_id WHERE p.deleted = 0 AND rp.deleted = 0 - AND rp.role_id = #{roleId} + AND rp.role_id = #{roleID} ORDER BY p.create_time ASC @@ -111,8 +112,8 @@ FROM tb_sys_permission WHERE deleted = 0 AND name = #{permissionName} - - AND id != #{excludeId} + + AND id != #{excludeID} @@ -122,8 +123,8 @@ FROM tb_sys_permission WHERE deleted = 0 AND code = #{permissionCode} - - AND id != #{excludeId} + + AND id != #{excludeID} @@ -287,4 +288,44 @@ AND tsrp.permission_id = #{permission.permissionID} ORDER BY tsr.role_id, tsr.create_time ASC + + + + + + + UPDATE tb_sys_permission + SET module_id = #{moduleID}, update_time = NOW() + WHERE permission_id IN + + #{permissionId} + + AND deleted = 0 + + + + + UPDATE tb_sys_permission + SET module_id = NULL, update_time = NOW() + WHERE permission_id IN + + #{permissionId} + + AND module_id = #{moduleID} + AND deleted = 0 + + + + diff --git a/schoolNewsWeb/PROJECT_STRUCTURE.md b/schoolNewsWeb/PROJECT_STRUCTURE.md new file mode 100644 index 0000000..99f4d29 --- /dev/null +++ b/schoolNewsWeb/PROJECT_STRUCTURE.md @@ -0,0 +1,283 @@ +# 校园新闻管理系统 - 项目结构说明 + +## 概述 +根据提供的结构图,已创建完整的前端页面层级和Vue组件文件。本文档详细说明了创建的所有文件和目录结构。 + +## 目录结构 + +``` +src/views/ +├── home/ # 首页模块 +│ ├── HomePage.vue # 首页主组件 +│ └── components/ # 首页子组件 +│ ├── LearningDataOverview.vue # 个人学习数据概览 +│ ├── BookHallSection.vue # 书报馆件 +│ ├── TopMusicRecommend.vue # TOP音乐推荐 +│ ├── NewsOverview.vue # 新闻概览 +│ ├── NavigationBar.vue # 导航栏 +│ └── SearchIndex.vue # 搜索索引 +│ +├── resource-center/ # 资源中心模块 +│ ├── ResourceCenterPage.vue # 资源中心主组件 +│ └── components/ # 资源中心子组件 +│ ├── MediaArchive.vue # 媒体档案 +│ ├── PartyHistoryLearning.vue # 党史学习 +│ ├── PolicySpeech.vue # 政策讲话 +│ ├── PolicyInterpretation.vue # 政策解读 +│ ├── RedClassic.vue # 红色经典 +│ ├── SpecialReport.vue # 专题报告 +│ └── WorldCase.vue # 世界案例 +│ +├── study-plan/ # 学习计划模块 +│ ├── StudyPlanPage.vue # 学习计划主组件 +│ └── components/ # 学习计划子组件 +│ ├── StudyTasks.vue # 学习任务(包含任务列表、任务进度) +│ └── CourseCenter.vue # 课程中心(富文本课程) +│ +├── user-center/ # 个人中心模块 +│ ├── UserCenterPage.vue # 个人中心主组件 +│ └── components/ # 个人中心子组件 +│ ├── LearningRecords.vue # 学习记录 +│ ├── MyFavorites.vue # 我的收藏 +│ └── MyAchievements.vue # 我的成就 +│ +├── profile/ # 我导中心模块(头像进入) +│ ├── ProfilePage.vue # 我导中心主组件 +│ └── components/ # 我导中心子组件 +│ ├── PersonalInfo.vue # 个人信息 +│ └── AccountSettings.vue # 账号设置 +│ +├── ai-assistant/ # 智能体模块 +│ ├── AIAssistantPage.vue # AI助手主组件(包含悬浮球) +│ └── components/ # AI助手子组件 +│ ├── ChatInterface.vue # 对话功能 +│ ├── KnowledgeBase.vue # 知识库 +│ ├── DialogHistory.vue # 历史对话记录加载 +│ └── FileInterpretation.vue # 文件解读与记录(文件上传、历史文件加载) +│ +└── admin/ # 后端管理模块 + ├── SystemOverview.vue # 系统总览(总用户数、总资源数、今日访问量、用户活跃度折线图、资源分类统计饼图) + ├── ResourceManagement.vue # 资源管理主组件 + ├── LanguageManagement.vue # 语言管理主组件 + ├── StudyManagement.vue # 学习管理主组件 + ├── AIManagement.vue # 智能体管理主组件 + ├── SystemLogs.vue # 系统日志主组件 + └── components/ # 后端管理子组件 + ├── ArticleManagement.vue # 文章储备(数据采集、新增文章、课程文章) + ├── DataRecords.vue # 数据记录(菜单管理) + ├── BannerManagement.vue # Banner管理 + ├── ColumnManagement.vue # 资源栏目管理 + ├── TagManagement.vue # 标签管理 + ├── TaskPublish.vue # 学习任务发布(任务名称、描述、周期、关联资源、接受对象) + ├── StudyRecords.vue # 学习记录 + ├── AIConfig.vue # AI基础配置 + ├── KnowledgeManagement.vue # 知识库管理 + ├── LoginLogs.vue # 登录日志 + ├── OperationLogs.vue # 操作日志 + └── SystemConfig.vue # 系统配置 +``` + +## 已存在的管理模块 + +以下管理功能已在 `src/views/manage/system/` 中实现: +- `UserManageView.vue` - 用户管理 +- `RoleManageView.vue` - 角色管理 +- `PermissionManageView.vue` - 权限管理 +- `DeptManageView.vue` - 部门管理(组织结构管理) +- `MenuManageView.vue` - 菜单管理 + +## 功能模块详细说明 + +### 前端功能 + +#### 1. 首页模块 +- **个人学习数据概览**: 展示用户学习统计数据 +- **书报馆件**: 图书资源展示 +- **TOP音乐推荐**: 红色音乐推荐列表 +- **新闻概览**: 最新思政新闻展示 +- **导航栏**: 快速导航入口 +- **搜索索引**: 热门标签和搜索功能 + +#### 2. 资源中心模块 +- **媒体档案**: 视频、音频等媒体资源管理 +- **党史学习**: 党史教育文章和资料(支持资源详情,二级文章向读者展示) +- **政策讲话**: 重要政策讲话内容 +- **政策解读**: 政策文件解读说明 +- **红色经典**: 红色经典作品展示 +- **专题报告**: 各类专题报告内容 +- **世界案例**: 国际案例学习资料 + +#### 3. 学习计划模块 +- **学习任务**: + - 任务列表展示 + - 任务进度跟踪 + - 任务状态管理(未开始、进行中、已完成) +- **课程中心**: 富文本课程内容展示 + +#### 4. 个人中心模块 +- **学习记录**: 个人学习历史记录 +- **我的收藏**: 收藏的资源管理 +- **我的成就**: 获得的成就展示 + +#### 5. 我导中心模块(头像入口) +- **个人信息**: 用户基本信息管理 +- **账号设置**: 密码修改、安全设置 + +#### 6. 智能体模块 +- **悬浮球**: 快速唤起AI助手 +- **对话功能**: 智能问答交互 +- **知识库**: AI知识库浏览 +- **历史对话记录**: 对话历史加载 +- **文件解读与记录**: + - 文件上传 + - 历史文件加载 + - AI文件解读 + +### 后端管理功能 + +#### 1. 系统总览 +- **统计卡片**: 总用户数、总资源数、今日访问量、活跃用户 +- **用户活跃度折线图**: 用户活跃度趋势分析 +- **资源分类统计饼图**: 资源分类分布展示 +- **今日访问量详情**: UV、PV、平均访问时长、跳出率 + +#### 2. 用户管理(已存在) +- 组织结构管理 +- 用户管理 +- 权限配置管理 + +#### 3. 资源管理 +- **文章储备**: + - 数据采集功能 + - 新增文章 + - 课程文章管理 +- **数据记录**: 菜单管理(已在系统管理中实现) + +#### 4. 语言管理 +- **Banner管理**: 首页轮播图管理 +- **资源栏目管理**: 资源分类栏目配置 +- **标签管理**: 资源标签维护 + +#### 5. 学习管理 +- **学习任务发布**: + - 任务名称 + - 任务描述 + - 任务周期 + - 关联资源/选择 + - 任务接受对象(按部门/按权限/选人员) +- **学习记录**: 用户学习数据查看和导出 + +#### 6. 智能体管理 +- **基础配置**: AI模型、API配置、对话参数设置 +- **知识库管理**: AI知识库内容维护 + +#### 7. 系统日志 +- **登录日志**: 用户登录记录 +- **操作日志**: 系统操作审计 +- **系统配置**: 系统参数设置 + +## 技术特点 + +### 1. 组件化设计 +- 每个功能模块都有独立的主组件 +- 复杂功能拆分为多个子组件 +- 组件可复用性高 + +### 2. 标准化结构 +- 统一的目录命名规范 +- 一致的文件命名方式 +- 清晰的层级关系 + +### 3. 功能完整性 +- 覆盖所有结构图要求的功能点 +- 包含完整的CRUD操作 +- 支持数据筛选、分页、导出等常用功能 + +### 4. UI/UX设计 +- 使用Element Plus组件库 +- 响应式布局设计 +- 现代化的UI风格 +- 良好的交互体验 + +## 后续开发建议 + +### 1. API集成 +所有组件中标记了 `TODO` 的地方需要接入实际的后端API: +- 数据加载函数 +- 表单提交处理 +- 文件上传功能 +- 实时数据更新 + +### 2. 状态管理 +建议使用Vuex进行全局状态管理: +- 用户信息状态 +- 权限数据缓存 +- 菜单树结构 +- AI对话上下文 + +### 3. 路由配置 +需要在 `src/router/` 中配置所有页面的路由: +- 路由路径定义 +- 路由守卫配置 +- 动态路由加载 +- 权限路由过滤 + +### 4. 权限控制 +实现完整的权限控制系统: +- 页面级权限 +- 按钮级权限 +- 数据级权限 +- 角色权限映射 + +### 5. 数据可视化 +系统总览页面需要集成ECharts: +- 用户活跃度折线图 +- 资源分类饼图 +- 其他统计图表 + +### 6. 富文本编辑器 +课程内容需要集成富文本编辑器: +- 推荐使用 TinyMCE 或 Quill +- 支持图片、视频上传 +- 支持代码高亮 +- 支持数学公式 + +### 7. 文件管理 +完善文件上传和管理功能: +- 文件分片上传 +- 断点续传 +- 文件预览 +- 批量操作 + +### 8. AI功能增强 +智能体模块需要接入AI服务: +- 对话流式输出 +- 文件解读API +- 知识库检索 +- 上下文管理 + +## 开发注意事项 + +1. **类型安全**: 所有组件都使用TypeScript,需要定义完整的类型接口 +2. **错误处理**: 添加适当的错误提示和异常处理 +3. **加载状态**: 为异步操作添加loading状态 +4. **数据验证**: 表单提交前进行数据验证 +5. **性能优化**: + - 列表虚拟滚动 + - 图片懒加载 + - 组件按需加载 + - 路由懒加载 +6. **用户体验**: + - 添加骨架屏 + - 优化加载动画 + - 提供操作反馈 + - 支持键盘快捷键 + +## 文件数量统计 + +- **主页面组件**: 10个 +- **子组件**: 40+个 +- **总计Vue文件**: 50+个 + +所有文件都已创建并包含基础的结构、样式和功能框架,可以直接在此基础上进行API集成和功能完善。 + diff --git a/schoolNewsWeb/README.md b/schoolNewsWeb/README.md new file mode 100644 index 0000000..c4bbaba --- /dev/null +++ b/schoolNewsWeb/README.md @@ -0,0 +1,200 @@ +# 校园新闻管理系统 + +这是一个基于 Vue 3 + TypeScript + Vite 构建的现代化校园新闻管理系统前端项目。该系统提供了新闻管理、用户中心、AI 对话、学习计划等功能模块。 + +## 技术栈 + +- **框架**: Vue 3.5.22 +- **构建工具**: Vite 5.0.0 +- **语言**: TypeScript 4.5.5 +- **UI 组件库**: Element Plus 2.11.4 +- **状态管理**: Vuex 4.1.0 +- **路由管理**: Vue Router 4.5.1 +- **HTTP 客户端**: Axios 1.7.9 +- **PWA 支持**: vite-plugin-pwa + +## 功能模块 + +### 首页模块 +- 横幅管理 +- 菜单导航 +- 新闻展示 +- 推荐内容 +- 搜索功能 +- 统计数据 + +### 系统管理模块 +- 用户管理 +- 角色管理 +- 权限管理 +- 部门管理 +- 菜单管理 +- 文件管理 + +### 学习模块 +- 课程管理 +- 学习计划 +- 学习任务 +- 学习记录 + +### 用户中心模块 +- 个人资料 +- 浏览记录 +- 收藏管理 +- 成就系统 +- 积分系统 + +### AI 助手模块 +- 智能对话 +- 知识库管理 +- 消息管理 +- 文件上传 +- Agent 配置 + +## 项目结构 + +``` +schoolNewsWeb/ +├── src/ +│ ├── apis/ # API 接口定义 +│ │ ├── ai/ # AI 相关接口 +│ │ ├── homepage/ # 首页相关接口 +│ │ ├── study/ # 学习模块接口 +│ │ ├── system/ # 系统管理接口 +│ │ └── usercenter/ # 用户中心接口 +│ ├── components/ # 公共组件 +│ ├── directives/ # 自定义指令 +│ ├── layouts/ # 布局组件 +│ ├── router/ # 路由配置 +│ ├── store/ # 状态管理 +│ ├── types/ # TypeScript 类型定义 +│ ├── utils/ # 工具函数 +│ └── views/ # 页面组件 +├── public/ # 静态资源 +└── dist/ # 构建输出目录 +``` + +## 环境要求 + +- Node.js >= 14.0.0 +- npm >= 6.0.0 或 yarn >= 1.22.0 + +## 如何运行 + +### 1. 安装依赖 + +```bash +npm install +``` + +或者使用 yarn: + +```bash +yarn install +``` + +### 2. 启动开发服务器 + +```bash +npm run dev +``` + +或者: + +```bash +npm run serve +``` + +开发服务器将在 `http://localhost:8080` 启动,并自动打开浏览器。 + +### 3. 后端API配置 + +项目默认将 `/api` 路径代理到 `http://127.0.0.1:8081/schoolNewsServ`。 + +如需修改后端地址,请编辑 `vite.config.js` 文件中的 proxy 配置: + +```javascript +proxy: { + '/api': { + target: 'http://your-backend-url', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, '') + } +} +``` + +## 如何构建 + +### 构建生产版本 + +```bash +npm run build +``` + +构建产物将输出到 `dist/` 目录。 + +### 预览构建结果 + +```bash +npm run preview +``` + +## 代码规范 + +### 运行代码检查 + +```bash +npm run lint +``` + +项目使用 ESLint 进行代码检查,配置了 TypeScript 和 Vue 相关的规则。 + +## 功能特性 + +### PWA 支持 +项目已配置 PWA 支持,可以作为渐进式 Web 应用安装到设备上。 + +### 权限系统 +- 基于角色的权限控制(RBAC) +- 自定义指令进行权限校验 +- 动态路由生成 + +### 响应式设计 +- 适配桌面端和移动端 +- 现代化的 UI 设计 +- 优秀的用户体验 + +## 开发说明 + +### 路径别名 + +项目配置了 `@` 作为 `src` 目录的别名,可以这样导入模块: + +```typescript +import { someFunction } from '@/utils/helper' +import MyComponent from '@/components/MyComponent.vue' +``` + +### 环境变量 + +项目定义了以下环境变量: +- `process.env.BASE_URL`: `/schoolNewsWeb/` +- `process.env.VITE_API_BASE_URL`: `/api` +- `process.env.VITE_APP_TITLE`: `校园新闻管理系统` + +## 浏览器支持 + +支持所有现代浏览器的最新两个版本: +- Chrome +- Firefox +- Safari +- Edge + +## 许可证 + +私有项目 + +## 联系方式 + +如有问题或建议,请联系项目维护团队。 + diff --git a/schoolNewsWeb/package-lock.json b/schoolNewsWeb/package-lock.json index e1ef152..2e1c19a 100644 --- a/schoolNewsWeb/package-lock.json +++ b/schoolNewsWeb/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "axios": "^1.7.9", "core-js": "^3.8.3", + "echarts": "^6.0.0", "element-plus": "^2.11.4", "register-service-worker": "^1.7.2", "vue": "^3.5.22", @@ -17,6 +18,7 @@ "vuex": "^4.1.0" }, "devDependencies": { + "@types/echarts": "^4.9.22", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vitejs/plugin-vue": "^5.0.0", @@ -2787,6 +2789,16 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@types/echarts": { + "version": "4.9.22", + "resolved": "https://registry.npmmirror.com/@types/echarts/-/echarts-4.9.22.tgz", + "integrity": "sha512-7Fo6XdWpoi8jxkwP7BARUOM7riq8bMhmsCtSG8gzUcJmFhLo387tihoBYS/y5j7jl3PENT5RxeWZdN9RiwO7HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/zrender": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", @@ -2848,6 +2860,13 @@ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", "license": "MIT" }, + "node_modules/@types/zrender": { + "version": "4.0.6", + "resolved": "https://registry.npmmirror.com/@types/zrender/-/zrender-4.0.6.tgz", + "integrity": "sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -4067,6 +4086,16 @@ "node": ">= 0.4" } }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", @@ -7281,6 +7310,12 @@ "node": ">=8.0" } }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", @@ -8341,6 +8376,15 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, "license": "ISC" + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } } } } diff --git a/schoolNewsWeb/package.json b/schoolNewsWeb/package.json index 693134b..a72c1fe 100644 --- a/schoolNewsWeb/package.json +++ b/schoolNewsWeb/package.json @@ -13,6 +13,7 @@ "dependencies": { "axios": "^1.7.9", "core-js": "^3.8.3", + "echarts": "^6.0.0", "element-plus": "^2.11.4", "register-service-worker": "^1.7.2", "vue": "^3.5.22", @@ -20,6 +21,7 @@ "vuex": "^4.1.0" }, "devDependencies": { + "@types/echarts": "^4.9.22", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vitejs/plugin-vue": "^5.0.0", diff --git a/schoolNewsWeb/src/assets/imgs/arrow-down.svg b/schoolNewsWeb/src/assets/imgs/arrow-down.svg new file mode 100644 index 0000000..ac714b5 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/arrow-down.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/schoolNewsWeb/src/assets/imgs/login-bg.png b/schoolNewsWeb/src/assets/imgs/login-bg.png new file mode 100644 index 0000000..f724493 Binary files /dev/null and b/schoolNewsWeb/src/assets/imgs/login-bg.png differ diff --git a/schoolNewsWeb/src/assets/imgs/logo-icon.svg b/schoolNewsWeb/src/assets/imgs/logo-icon.svg new file mode 100644 index 0000000..2111ee6 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/logo-icon.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/schoolNewsWeb/src/assets/imgs/search-icon.svg b/schoolNewsWeb/src/assets/imgs/search-icon.svg new file mode 100644 index 0000000..f09acb2 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/search-icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/schoolNewsWeb/src/components/TopNavigation.vue b/schoolNewsWeb/src/components/TopNavigation.vue index 063bef6..a359745 100644 --- a/schoolNewsWeb/src/components/TopNavigation.vue +++ b/schoolNewsWeb/src/components/TopNavigation.vue @@ -3,8 +3,8 @@ + + - - - @@ -65,6 +82,8 @@ const route = useRoute(); const store = useStore(); const activeDropdown = ref(null); +const searchKeyword = ref(''); +const dropdownPositions = ref>({}); // 获取所有菜单 const allMenus = computed(() => store.getters['auth/menuTree']); @@ -72,7 +91,17 @@ const userInfo = computed(() => store.getters['auth/userInfo']); // 获取第一层的导航菜单(MenuType.NAVIGATION) const navigationMenus = computed(() => { - return allMenus.value.filter((menu: SysMenu) => menu.type === MenuType.NAVIGATION); + const menus = allMenus.value.filter((menu: SysMenu) => menu.type === MenuType.NAVIGATION); + console.log('导航菜单数据:', menus); + menus.forEach((menu: SysMenu) => { + console.log(`菜单 ${menu.name}:`, { + menuID: menu.menuID, + parentID: menu.parentID, + children: menu.children, + childrenCount: menu.children?.length || 0 + }); + }); + return menus; }); // 检查菜单是否有导航类型的子菜单 @@ -82,8 +111,13 @@ function hasNavigationChildren(menu: SysMenu): boolean { // 获取导航类型的子菜单 function getNavigationChildren(menu: SysMenu): SysMenu[] { - if (!menu.children) return []; - return menu.children.filter(child => child.type === MenuType.NAVIGATION); + if (!menu.children) { + console.log(`菜单 ${menu.name} 没有子菜单`); + return []; + } + const children = menu.children.filter(child => child.type === MenuType.NAVIGATION); + console.log(`菜单 ${menu.name} 的子菜单:`, children); + return children; } // 判断菜单是否激活 @@ -113,12 +147,39 @@ function isMenuOrChildActive(menu: SysMenu): boolean { } // 处理鼠标进入 -function handleMouseEnter(menu: SysMenu) { +function handleMouseEnter(menu: SysMenu, event?: MouseEvent) { if (hasNavigationChildren(menu)) { activeDropdown.value = menu.menuID || null; + + // 计算下拉菜单位置 + const target = event?.currentTarget as HTMLElement; + if (target && menu.menuID) { + const rect = target.getBoundingClientRect(); + dropdownPositions.value[menu.menuID] = { + left: rect.left, + top: rect.bottom, + width: rect.width + }; + } } } +// 获取下拉菜单位置样式 +function getDropdownPosition(menu: SysMenu) { + const menuID = menu.menuID; + if (!menuID || !dropdownPositions.value[menuID]) { + return {}; + } + + const pos = dropdownPositions.value[menuID]; + return { + position: 'fixed' as const, + left: `${pos.left}px`, + top: `${pos.top}px`, + width: `${pos.width}px` + }; +} + // 处理鼠标离开 function handleMouseLeave() { activeDropdown.value = null; @@ -139,6 +200,14 @@ function handleNavClick(menu: SysMenu) { } } +// 处理搜索 +function handleSearch() { + if (searchKeyword.value.trim()) { + // 这里可以跳转到搜索页面或触发搜索功能 + router.push(`/search?keyword=${encodeURIComponent(searchKeyword.value.trim())}`); + } +} + // 处理登出 function handleLogout() { store.dispatch('auth/logout'); @@ -147,9 +216,9 @@ function handleLogout() { diff --git a/schoolNewsWeb/src/router/index.ts b/schoolNewsWeb/src/router/index.ts index 9f9ada5..c8bc65b 100644 --- a/schoolNewsWeb/src/router/index.ts +++ b/schoolNewsWeb/src/router/index.ts @@ -64,7 +64,7 @@ export const routes: Array = [ { path: "", name: "Home", - component: () => import("@/views/Home.vue"), + component: () => import("@/views/HomeView.vue"), meta: { title: "首页", requiresAuth: false, diff --git a/schoolNewsWeb/src/store/modules/auth.ts b/schoolNewsWeb/src/store/modules/auth.ts index d34bcc2..875217e 100644 --- a/schoolNewsWeb/src/store/modules/auth.ts +++ b/schoolNewsWeb/src/store/modules/auth.ts @@ -183,8 +183,11 @@ const authModule: Module = { // 登录 async login({ commit, dispatch, state }, loginParam) { try { - const loginDomain = await authApi.login(loginParam); - + const result = await authApi.login(loginParam); + if(result.code !== 200) { + return Promise.reject(result.message); + } + const loginDomain = result.data; // 保存登录信息 commit('SET_LOGIN_DOMAIN', loginDomain); diff --git a/schoolNewsWeb/src/views/Home.vue b/schoolNewsWeb/src/views/HomeView.vue similarity index 100% rename from schoolNewsWeb/src/views/Home.vue rename to schoolNewsWeb/src/views/HomeView.vue diff --git a/schoolNewsWeb/src/views/admin/manage/ai/AIConfigView.vue b/schoolNewsWeb/src/views/admin/manage/ai/AIConfigView.vue new file mode 100644 index 0000000..2581c7d --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/ai/AIConfigView.vue @@ -0,0 +1,123 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/ai/AIManagementView.vue b/schoolNewsWeb/src/views/admin/manage/ai/AIManagementView.vue new file mode 100644 index 0000000..c511d26 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/ai/AIManagementView.vue @@ -0,0 +1,37 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/ai/KnowledgeManagementView.vue b/schoolNewsWeb/src/views/admin/manage/ai/KnowledgeManagementView.vue new file mode 100644 index 0000000..0e94045 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/ai/KnowledgeManagementView.vue @@ -0,0 +1,119 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/content/BannerManagementView.vue b/schoolNewsWeb/src/views/admin/manage/content/BannerManagementView.vue new file mode 100644 index 0000000..7f14e7e --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/content/BannerManagementView.vue @@ -0,0 +1,82 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/content/ColumnManagementView.vue b/schoolNewsWeb/src/views/admin/manage/content/ColumnManagementView.vue new file mode 100644 index 0000000..a2f8d55 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/content/ColumnManagementView.vue @@ -0,0 +1,65 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/content/ContentManagementView.vue b/schoolNewsWeb/src/views/admin/manage/content/ContentManagementView.vue new file mode 100644 index 0000000..ccdad6e --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/content/ContentManagementView.vue @@ -0,0 +1,41 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/content/TagManagementView.vue b/schoolNewsWeb/src/views/admin/manage/content/TagManagementView.vue new file mode 100644 index 0000000..e90f9ff --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/content/TagManagementView.vue @@ -0,0 +1,81 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/logs/LoginLogsView.vue b/schoolNewsWeb/src/views/admin/manage/logs/LoginLogsView.vue new file mode 100644 index 0000000..cb49b6e --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/logs/LoginLogsView.vue @@ -0,0 +1,123 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue b/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue new file mode 100644 index 0000000..1cee9f0 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue @@ -0,0 +1,147 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/logs/SystemConfigView.vue b/schoolNewsWeb/src/views/admin/manage/logs/SystemConfigView.vue new file mode 100644 index 0000000..51240ea --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/logs/SystemConfigView.vue @@ -0,0 +1,190 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/logs/SystemLogsView.vue b/schoolNewsWeb/src/views/admin/manage/logs/SystemLogsView.vue new file mode 100644 index 0000000..7a1d186 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/logs/SystemLogsView.vue @@ -0,0 +1,41 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue b/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue new file mode 100644 index 0000000..648f835 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/resource/ArticleManagementView.vue @@ -0,0 +1,126 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/resource/DataRecordsView.vue b/schoolNewsWeb/src/views/admin/manage/resource/DataRecordsView.vue new file mode 100644 index 0000000..ac8cb21 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/resource/DataRecordsView.vue @@ -0,0 +1,44 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/resource/ResourceManagementView.vue b/schoolNewsWeb/src/views/admin/manage/resource/ResourceManagementView.vue new file mode 100644 index 0000000..e0649a8 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/resource/ResourceManagementView.vue @@ -0,0 +1,37 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue b/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue new file mode 100644 index 0000000..c6e9bb4 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/study/StudyManagementView.vue @@ -0,0 +1,37 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/study/StudyRecordsView.vue b/schoolNewsWeb/src/views/admin/manage/study/StudyRecordsView.vue new file mode 100644 index 0000000..60d76cf --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/study/StudyRecordsView.vue @@ -0,0 +1,149 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue b/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue new file mode 100644 index 0000000..4355ff5 --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/study/TaskPublishView.vue @@ -0,0 +1,135 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/manage/system/DeptManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/DeptManageView.vue similarity index 100% rename from schoolNewsWeb/src/views/manage/system/DeptManageView.vue rename to schoolNewsWeb/src/views/admin/manage/system/DeptManageView.vue diff --git a/schoolNewsWeb/src/views/manage/system/MenuManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/MenuManageView.vue similarity index 100% rename from schoolNewsWeb/src/views/manage/system/MenuManageView.vue rename to schoolNewsWeb/src/views/admin/manage/system/MenuManageView.vue diff --git a/schoolNewsWeb/src/views/admin/manage/system/ModuleManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/ModuleManageView.vue new file mode 100644 index 0000000..e69de29 diff --git a/schoolNewsWeb/src/views/manage/system/PermissionManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/PermissionManageView.vue similarity index 100% rename from schoolNewsWeb/src/views/manage/system/PermissionManageView.vue rename to schoolNewsWeb/src/views/admin/manage/system/PermissionManageView.vue diff --git a/schoolNewsWeb/src/views/manage/system/RoleManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/RoleManageView.vue similarity index 100% rename from schoolNewsWeb/src/views/manage/system/RoleManageView.vue rename to schoolNewsWeb/src/views/admin/manage/system/RoleManageView.vue diff --git a/schoolNewsWeb/src/views/manage/system/UserManageView.vue b/schoolNewsWeb/src/views/admin/manage/system/UserManageView.vue similarity index 100% rename from schoolNewsWeb/src/views/manage/system/UserManageView.vue rename to schoolNewsWeb/src/views/admin/manage/system/UserManageView.vue diff --git a/schoolNewsWeb/src/views/manage/system/index.ts b/schoolNewsWeb/src/views/admin/manage/system/index.ts similarity index 100% rename from schoolNewsWeb/src/views/manage/system/index.ts rename to schoolNewsWeb/src/views/admin/manage/system/index.ts diff --git a/schoolNewsWeb/src/views/admin/overview/SystemOverviewView.vue b/schoolNewsWeb/src/views/admin/overview/SystemOverviewView.vue new file mode 100644 index 0000000..14d858a --- /dev/null +++ b/schoolNewsWeb/src/views/admin/overview/SystemOverviewView.vue @@ -0,0 +1,304 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/ai-assistant/AIAssistantView.vue b/schoolNewsWeb/src/views/ai-assistant/AIAssistantView.vue new file mode 100644 index 0000000..bf7468e --- /dev/null +++ b/schoolNewsWeb/src/views/ai-assistant/AIAssistantView.vue @@ -0,0 +1,202 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/ai-assistant/components/ChatInterface.vue b/schoolNewsWeb/src/views/ai-assistant/components/ChatInterface.vue new file mode 100644 index 0000000..8d640b0 --- /dev/null +++ b/schoolNewsWeb/src/views/ai-assistant/components/ChatInterface.vue @@ -0,0 +1,250 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/ai-assistant/components/DialogHistory.vue b/schoolNewsWeb/src/views/ai-assistant/components/DialogHistory.vue new file mode 100644 index 0000000..cd915ee --- /dev/null +++ b/schoolNewsWeb/src/views/ai-assistant/components/DialogHistory.vue @@ -0,0 +1,110 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/ai-assistant/components/FileInterpretation.vue b/schoolNewsWeb/src/views/ai-assistant/components/FileInterpretation.vue new file mode 100644 index 0000000..f05e9b1 --- /dev/null +++ b/schoolNewsWeb/src/views/ai-assistant/components/FileInterpretation.vue @@ -0,0 +1,205 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/ai-assistant/components/KnowledgeBase.vue b/schoolNewsWeb/src/views/ai-assistant/components/KnowledgeBase.vue new file mode 100644 index 0000000..43dfea1 --- /dev/null +++ b/schoolNewsWeb/src/views/ai-assistant/components/KnowledgeBase.vue @@ -0,0 +1,147 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/HomePage.vue b/schoolNewsWeb/src/views/home/HomePage.vue new file mode 100644 index 0000000..e8f0017 --- /dev/null +++ b/schoolNewsWeb/src/views/home/HomePage.vue @@ -0,0 +1,39 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/BookHallSection.vue b/schoolNewsWeb/src/views/home/components/BookHallSection.vue new file mode 100644 index 0000000..c6908ad --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/BookHallSection.vue @@ -0,0 +1,88 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/LearningDataOverview.vue b/schoolNewsWeb/src/views/home/components/LearningDataOverview.vue new file mode 100644 index 0000000..118af07 --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/LearningDataOverview.vue @@ -0,0 +1,77 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/NavigationBar.vue b/schoolNewsWeb/src/views/home/components/NavigationBar.vue new file mode 100644 index 0000000..edbb4cd --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/NavigationBar.vue @@ -0,0 +1,69 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/NewsOverview.vue b/schoolNewsWeb/src/views/home/components/NewsOverview.vue new file mode 100644 index 0000000..67a2abb --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/NewsOverview.vue @@ -0,0 +1,115 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/SearchIndex.vue b/schoolNewsWeb/src/views/home/components/SearchIndex.vue new file mode 100644 index 0000000..e397921 --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/SearchIndex.vue @@ -0,0 +1,69 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/home/components/TopMusicRecommend.vue b/schoolNewsWeb/src/views/home/components/TopMusicRecommend.vue new file mode 100644 index 0000000..613eff5 --- /dev/null +++ b/schoolNewsWeb/src/views/home/components/TopMusicRecommend.vue @@ -0,0 +1,106 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/login/Login.vue b/schoolNewsWeb/src/views/login/Login.vue index 740da74..5a39e34 100644 --- a/schoolNewsWeb/src/views/login/Login.vue +++ b/schoolNewsWeb/src/views/login/Login.vue @@ -1,85 +1,94 @@