From 88976d7c47759a1762340a3c7baa2c2b53a8de9a Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Wed, 15 Oct 2025 10:39:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A8=E5=8A=9F=E8=83=BD=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- schoolNewsServ/.bin/mysql/INDEX.md | 288 +++++++++++++ schoolNewsServ/.bin/mysql/init-database.bat | 126 ++++++ schoolNewsServ/.bin/mysql/init-database.sh | 81 ++++ schoolNewsServ/.bin/mysql/sql/ER关系图.md | 290 +++++++++++++ schoolNewsServ/.bin/mysql/sql/README.md | 242 +++++++++++ .../.bin/mysql/sql/createTableAI.sql | 126 ++++++ .../.bin/mysql/sql/createTableCourse.sql | 63 +++ .../.bin/mysql/sql/createTableLearning.sql | 115 +++++ .../sql/createTablePermissionControl.sql | 54 +++ .../.bin/mysql/sql/createTableResource.sql | 172 ++++++++ .../.bin/mysql/sql/createTableSystem.sql | 167 ++++++++ .../.bin/mysql/sql/createTableUserCenter.sql | 101 +++++ schoolNewsServ/.bin/mysql/sql/initAll.sql | 45 ++ .../.bin/mysql/sql/权限控制使用说明.md | 395 ++++++++++++++++++ schoolNewsServ/.bin/mysql/sql/表结构汇总.md | 157 +++++++ schoolNewsServ/.bin/mysql/使用说明.md | 393 +++++++++++++++++ 16 files changed, 2815 insertions(+) create mode 100644 schoolNewsServ/.bin/mysql/INDEX.md create mode 100644 schoolNewsServ/.bin/mysql/init-database.bat create mode 100644 schoolNewsServ/.bin/mysql/init-database.sh create mode 100644 schoolNewsServ/.bin/mysql/sql/ER关系图.md create mode 100644 schoolNewsServ/.bin/mysql/sql/README.md create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableAI.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableCourse.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableLearning.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTablePermissionControl.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableResource.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableSystem.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/createTableUserCenter.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/initAll.sql create mode 100644 schoolNewsServ/.bin/mysql/sql/权限控制使用说明.md create mode 100644 schoolNewsServ/.bin/mysql/sql/表结构汇总.md create mode 100644 schoolNewsServ/.bin/mysql/使用说明.md diff --git a/schoolNewsServ/.bin/mysql/INDEX.md b/schoolNewsServ/.bin/mysql/INDEX.md new file mode 100644 index 0000000..cfc9ba7 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/INDEX.md @@ -0,0 +1,288 @@ +# 数据库文件索引 + +## 📋 文件清单 + +### SQL脚本文件 + +| 文件名 | 说明 | 表数量 | 执行顺序 | +|--------|------|--------|----------| +| `sql/createDB.sql` | 创建数据库 | 0 | 1 | +| `sql/createTableUser.sql` | 用户管理模块 | 3 | 2 | +| `sql/createTablePermission.sql` | 权限管理模块 | 8 | 3 | +| `sql/createTableResource.sql` | 资源管理模块 | 8 | 4 | +| `sql/createTableCourse.sql` | 课程管理模块 | 4 | 5 | +| `sql/createTableLearning.sql` | 学习管理模块 | 6 | 6 | +| `sql/createTableUserCenter.sql` | 个人中心模块 | 6 | 7 | +| `sql/createTableAI.sql` | 智能体模块 | 6 | 8 | +| `sql/createTableSystem.sql` | 系统管理模块 | 8 | 9 | +| `sql/initAll.sql` | 一键执行所有SQL | - | - | + +**总计**: 49张表 + +### 执行脚本 + +| 文件名 | 平台 | 说明 | +|--------|------|------| +| `init-database.bat` | Windows | Windows批处理脚本 | +| `init-database.sh` | Linux/Mac | Shell脚本 | + +### 文档文件 + +| 文件名 | 说明 | 推荐阅读 | +|--------|------|----------| +| `INDEX.md` | 本文件,文件索引 | ⭐⭐⭐ | +| `使用说明.md` | 详细使用说明 | ⭐⭐⭐⭐⭐ | +| `sql/README.md` | 表结构详细说明 | ⭐⭐⭐⭐⭐ | +| `sql/表结构汇总.md` | 表结构汇总列表 | ⭐⭐⭐⭐ | +| `sql/ER关系图.md` | 表关系图 | ⭐⭐⭐⭐ | + +## 📁 完整目录结构 + +``` +.bin/mysql/ +│ +├── init-database.bat # Windows初始化脚本 +├── init-database.sh # Linux/Mac初始化脚本 +├── INDEX.md # 本文件 +├── 使用说明.md # 使用指南 +│ +└── sql/ # SQL脚本目录 + ├── createDB.sql # [1] 创建数据库 + │ + ├── createTableUser.sql # [2] 用户管理模块 + │ ├── tb_sys_user # 用户表 + │ ├── tb_sys_user_info # 用户信息表 + │ └── tb_sys_login_log # 登录日志表 + │ + ├── createTablePermission.sql # [3] 权限管理模块 + │ ├── tb_sys_dept # 部门表 + │ ├── tb_sys_role # 角色表 + │ ├── tb_sys_dept_role # 部门-角色关联表 + │ ├── tb_sys_user_dept_role # 用户-部门-角色关联表 + │ ├── tb_sys_permission # 权限表 + │ ├── tb_sys_role_permission # 角色-权限关联表 + │ ├── tb_sys_menu # 菜单表 + │ └── tb_sys_menu_permission # 菜单-权限关联表 + │ + ├── createTableResource.sql # [4] 资源管理模块 + │ ├── tb_resource # 资源表 + │ ├── tb_resource_category # 资源分类表 + │ ├── tb_banner # Banner表 + │ ├── tb_resource_recommend # 资源推荐表 + │ ├── tb_tag # 标签表 + │ ├── tb_resource_tag # 资源-标签关联表 + │ ├── tb_data_collection_config # 数据采集配置表 + │ └── tb_data_collection_log # 数据采集记录表 + │ + ├── createTableCourse.sql # [5] 课程管理模块 + │ ├── tb_course # 课程表 + │ ├── tb_course_chapter # 课程章节表 + │ ├── tb_course_tag # 课程-标签关联表 + │ └── tb_course_dept # 课程-部门权限表 + │ + ├── createTableLearning.sql # [6] 学习管理模块 + │ ├── tb_learning_task # 学习任务表 + │ ├── tb_task_resource # 任务-资源关联表 + │ ├── tb_task_course # 任务-课程关联表 + │ ├── tb_task_user # 任务-用户表 + │ ├── tb_learning_record # 学习记录表 + │ └── tb_learning_statistics # 学习统计表 + │ + ├── createTableUserCenter.sql # [7] 个人中心模块 + │ ├── tb_user_collection # 用户收藏表 + │ ├── tb_achievement # 成就表 + │ ├── tb_user_achievement # 用户-成就关联表 + │ ├── tb_user_points # 用户积分表 + │ ├── tb_points_record # 积分记录表 + │ └── tb_user_browse_record # 用户浏览记录表 + │ + ├── createTableAI.sql # [8] 智能体模块 + │ ├── tb_ai_agent_config # 智能体配置表 + │ ├── tb_ai_knowledge # 知识库表 + │ ├── tb_ai_conversation # 对话会话表 + │ ├── tb_ai_message # 对话消息表 + │ ├── tb_ai_upload_file # 上传文件表 + │ └── tb_ai_usage_statistics # AI使用统计表 + │ + ├── createTableSystem.sql # [9] 系统管理模块 + │ ├── tb_sys_operation_log # 操作日志表 + │ ├── tb_sys_config # 系统配置表 + │ ├── tb_sys_visit_statistics # 访问统计表 + │ ├── tb_sys_notification # 系统通知表 + │ ├── tb_sys_file # 文件上传记录表 + │ ├── tb_sys_dict_type # 数据字典类型表 + │ └── tb_sys_dict_data # 数据字典详情表 + │ + ├── initAll.sql # 一键执行所有SQL + ├── README.md # 表结构详细说明 + ├── 表结构汇总.md # 表结构汇总 + └── ER关系图.md # 表关系图 +``` + +## 🚀 快速开始 + +### 第一次使用 + +1. **阅读使用说明** + ``` + 打开 使用说明.md + ``` + +2. **执行初始化脚本** + + **Windows:** + ```cmd + 双击 init-database.bat + ``` + + **Linux/Mac:** + ```bash + chmod +x init-database.sh + ./init-database.sh + ``` + +3. **验证安装** + ```sql + USE school_news; + SHOW TABLES; + ``` + +### 了解表结构 + +1. **快速查看**:阅读 `sql/表结构汇总.md` +2. **详细了解**:阅读 `sql/README.md` +3. **理解关系**:阅读 `sql/ER关系图.md` + +## 📊 模块说明 + +### 1️⃣ 用户管理模块 +负责用户账号、用户信息和登录日志管理。 + +**核心表**: +- tb_sys_user (用户表) +- tb_sys_user_info (用户信息表) + +### 2️⃣ 权限管理模块 +实现RBAC权限控制,支持部门、角色、权限、菜单管理。 + +**核心表**: +- tb_sys_dept (部门表) +- tb_sys_role (角色表) +- tb_sys_permission (权限表) + +### 3️⃣ 资源管理模块 +管理新闻资源、分类、标签、推荐和数据采集。 + +**核心表**: +- tb_resource (资源表) +- tb_resource_category (资源分类表) +- tb_banner (Banner表) + +### 4️⃣ 课程管理模块 +管理在线课程、章节、标签和权限。 + +**核心表**: +- tb_course (课程表) +- tb_course_chapter (章节表) + +### 5️⃣ 学习管理模块 +管理学习任务、学习记录和统计数据。 + +**核心表**: +- tb_learning_task (学习任务表) +- tb_learning_record (学习记录表) +- tb_learning_statistics (学习统计表) + +### 6️⃣ 个人中心模块 +管理用户收藏、成就、积分和浏览记录。 + +**核心表**: +- tb_user_collection (收藏表) +- tb_achievement (成就表) +- tb_user_points (积分表) + +### 7️⃣ 智能体模块 +提供AI对话、知识库和文件问答功能。 + +**核心表**: +- tb_ai_agent_config (AI配置表) +- tb_ai_knowledge (知识库表) +- tb_ai_conversation (对话会话表) + +### 8️⃣ 系统管理模块 +管理系统配置、日志、通知和文件。 + +**核心表**: +- tb_sys_config (系统配置表) +- tb_sys_operation_log (操作日志表) +- tb_sys_notification (通知表) + +## 📈 数据量预估 + +| 模块 | 预估数据量 | 增长速度 | +|------|-----------|----------| +| 用户管理 | 1万-10万 | 缓慢 | +| 权限管理 | 100-1000 | 缓慢 | +| 资源管理 | 1万-100万 | 中等 | +| 课程管理 | 100-10000 | 缓慢 | +| 学习管理 | 10万-1000万 | 快速 | +| 个人中心 | 10万-1000万 | 中等 | +| 智能体 | 10万-1000万 | 快速 | +| 系统管理 | 100万-1亿 | 快速 | + +## 🔧 维护建议 + +### 日常维护 +- 每天备份数据库 +- 每周清理过期日志 +- 每月统计表分析 + +### 性能优化 +- 定期执行 ANALYZE TABLE +- 监控慢查询日志 +- 适时添加索引 + +### 数据归档 +- 登录日志:保留3个月 +- 操作日志:保留6个月 +- 学习记录:永久保存 +- 浏览记录:保留1年 + +## 📝 版本信息 + +- **版本**: v1.0.0 +- **发布日期**: 2025-10-15 +- **数据库**: MySQL 5.7+ +- **字符集**: utf8mb4 +- **引擎**: InnoDB + +## 🔗 相关链接 + +- [MySQL官方文档](https://dev.mysql.com/doc/) +- [数据库设计规范](https://www.cnblogs.com/huchong/p/10219318.html) +- [SQL优化指南](https://developer.aliyun.com/article/72501) + +## 📞 技术支持 + +如有问题,请检查: +1. MySQL版本 >= 5.7 +2. 字符集为 utf8mb4 +3. 存储引擎为 InnoDB +4. 是否有足够的磁盘空间 + +## ⚠️ 注意事项 + +1. **首次运行**前,请备份现有数据库 +2. **生产环境**使用前,请修改默认密码 +3. **定期备份**数据,防止数据丢失 +4. **性能监控**,及时发现并解决问题 +5. **安全加固**,限制数据库访问权限 + +## 📅 更新计划 + +- [ ] 添加数据字典详细说明 +- [ ] 补充性能测试报告 +- [ ] 增加示例数据脚本 +- [ ] 提供Docker部署方案 +- [ ] 添加自动化测试用例 + diff --git a/schoolNewsServ/.bin/mysql/init-database.bat b/schoolNewsServ/.bin/mysql/init-database.bat new file mode 100644 index 0000000..74c024e --- /dev/null +++ b/schoolNewsServ/.bin/mysql/init-database.bat @@ -0,0 +1,126 @@ +@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 new file mode 100644 index 0000000..0625391 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/init-database.sh @@ -0,0 +1,81 @@ +#!/bin/bash + +echo "=====================================================" +echo "校园思政新闻平台数据库初始化脚本" +echo "=====================================================" +echo "" + +# 设置默认值 +MYSQL_HOST="localhost" +MYSQL_PORT="3306" +MYSQL_USER="root" +MYSQL_PASSWORD="" + +# 读取用户输入 +read -p "MySQL主机地址 [默认: localhost]: " input_host +MYSQL_HOST=${input_host:-$MYSQL_HOST} + +read -p "MySQL端口 [默认: 3306]: " input_port +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 "开始执行数据库初始化..." +echo "" + +# 切换到sql目录 +cd sql || exit 1 + +# 定义执行SQL的函数 +execute_sql() { + local file=$1 + local description=$2 + + echo "[$description]" + + if [ -z "$MYSQL_PASSWORD" ]; then + mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" < "$file" + else + mysql -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" < "$file" + fi + + if [ $? -ne 0 ]; then + echo "错误: $description 失败!" + exit 1 + fi +} + +# 执行SQL文件 +execute_sql "createDB.sql" "1/9 创建数据库" +execute_sql "createTableUser.sql" "2/9 创建用户相关表" +execute_sql "createTablePermission.sql" "3/9 创建权限相关表" +execute_sql "createTableResource.sql" "4/9 创建资源管理相关表" +execute_sql "createTableCourse.sql" "5/9 创建课程管理相关表" +execute_sql "createTableLearning.sql" "6/9 创建学习管理相关表" +execute_sql "createTableUserCenter.sql" "7/9 创建个人中心相关表" +execute_sql "createTableAI.sql" "8/9 创建智能体相关表" +execute_sql "createTableSystem.sql" "9/9 创建系统配置和日志相关表" + +cd .. + +echo "" +echo "=====================================================" +echo "数据库初始化完成!" +echo "=====================================================" +echo "数据库名: school_news" +echo "默认用户: admin" +echo "默认密码: 详见 createTableUser.sql" +echo "=====================================================" +echo "" + diff --git a/schoolNewsServ/.bin/mysql/sql/ER关系图.md b/schoolNewsServ/.bin/mysql/sql/ER关系图.md new file mode 100644 index 0000000..9ec41c0 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/ER关系图.md @@ -0,0 +1,290 @@ +# 校园思政新闻平台 - ER关系图 + +## 核心模块关系图 + +```mermaid +erDiagram + %% 用户体系 + tb_sys_user ||--|| tb_sys_user_info : "1对1" + tb_sys_user ||--o{ tb_sys_login_log : "1对多" + tb_sys_user ||--o{ tb_sys_user_dept_role : "1对多" + + %% 权限体系 + tb_sys_dept ||--o{ tb_sys_dept : "父子关系" + tb_sys_dept ||--o{ tb_sys_dept_role : "1对多" + tb_sys_role ||--o{ tb_sys_dept_role : "1对多" + tb_sys_role ||--o{ tb_sys_user_dept_role : "1对多" + tb_sys_role ||--o{ tb_sys_role_permission : "1对多" + tb_sys_permission ||--o{ tb_sys_role_permission : "1对多" + tb_sys_permission ||--o{ tb_sys_menu_permission : "1对多" + tb_sys_menu ||--o{ tb_sys_menu : "父子关系" + tb_sys_menu ||--o{ tb_sys_menu_permission : "1对多" + + %% 资源体系 + tb_resource_category ||--o{ tb_resource_category : "父子关系" + tb_resource_category ||--o{ tb_resource : "1对多" + tb_resource ||--o{ tb_resource_tag : "1对多" + tb_resource ||--o| tb_resource_recommend : "1对1" + tb_resource ||--o| tb_banner : "1对1" + tb_tag ||--o{ tb_resource_tag : "1对多" + + %% 课程体系 + tb_course ||--o{ tb_course_chapter : "1对多" + tb_course ||--o{ tb_course_tag : "1对多" + tb_course ||--o{ tb_course_dept : "1对多" + tb_tag ||--o{ tb_course_tag : "1对多" + tb_sys_dept ||--o{ tb_course_dept : "1对多" + + %% 学习体系 + tb_learning_task ||--o{ tb_task_resource : "1对多" + tb_learning_task ||--o{ tb_task_course : "1对多" + tb_learning_task ||--o{ tb_task_user : "1对多" + tb_resource ||--o{ tb_task_resource : "1对多" + tb_course ||--o{ tb_task_course : "1对多" + tb_sys_user ||--o{ tb_task_user : "1对多" + tb_sys_user ||--o{ tb_learning_record : "1对多" + tb_sys_user ||--o{ tb_learning_statistics : "1对多" + + %% 个人中心 + tb_sys_user ||--o{ tb_user_collection : "1对多" + tb_sys_user ||--|| tb_user_points : "1对1" + tb_sys_user ||--o{ tb_points_record : "1对多" + tb_sys_user ||--o{ tb_user_achievement : "1对多" + tb_sys_user ||--o{ tb_user_browse_record : "1对多" + tb_achievement ||--o{ tb_user_achievement : "1对多" + + %% 智能体 + tb_sys_user ||--o{ tb_ai_conversation : "1对多" + tb_sys_user ||--o{ tb_ai_upload_file : "1对多" + tb_sys_user ||--o{ tb_ai_usage_statistics : "1对多" + tb_ai_conversation ||--o{ tb_ai_message : "1对多" + + %% 系统 + tb_sys_user ||--o{ tb_sys_operation_log : "1对多" + tb_sys_user ||--o{ tb_sys_notification : "1对多" +``` + +## 用户权限体系详细关系 + +```mermaid +graph TB + User[用户 tb_sys_user] + UserInfo[用户信息 tb_sys_user_info] + UDR[用户部门角色 tb_sys_user_dept_role] + Dept[部门 tb_sys_dept] + Role[角色 tb_sys_role] + RolePerm[角色权限 tb_sys_role_permission] + Perm[权限 tb_sys_permission] + MenuPerm[菜单权限 tb_sys_menu_permission] + Menu[菜单 tb_sys_menu] + + User -->|1:1| UserInfo + User -->|1:N| UDR + Dept -->|1:N| UDR + Role -->|1:N| UDR + Role -->|1:N| RolePerm + Perm -->|1:N| RolePerm + Perm -->|1:N| MenuPerm + Menu -->|1:N| MenuPerm + + style User fill:#e1f5ff + style Role fill:#fff4e1 + style Perm fill:#ffe1f5 + style Menu fill:#e1ffe1 +``` + +## 资源课程学习体系 + +```mermaid +graph TB + Resource[资源 tb_resource] + Course[课程 tb_course] + Chapter[章节 tb_course_chapter] + Category[分类 tb_resource_category] + Tag[标签 tb_tag] + Task[学习任务 tb_learning_task] + TaskUser[任务用户 tb_task_user] + User[用户 tb_sys_user] + Record[学习记录 tb_learning_record] + + Category -->|1:N| Resource + Resource -->|M:N| Tag + Course -->|M:N| Tag + Course -->|1:N| Chapter + + Task -->|M:N| Resource + Task -->|M:N| Course + Task -->|M:N| User + Task --> TaskUser + + User -->|1:N| Record + Resource -.->|记录| Record + Course -.->|记录| Record + + style Resource fill:#e1f5ff + style Course fill:#ffe1f5 + style Task fill:#fff4e1 + style User fill:#e1ffe1 +``` + +## 智能体对话体系 + +```mermaid +graph TB + User[用户 tb_sys_user] + Config[AI配置 tb_ai_agent_config] + Knowledge[知识库 tb_ai_knowledge] + Conversation[对话会话 tb_ai_conversation] + Message[对话消息 tb_ai_message] + File[上传文件 tb_ai_upload_file] + Stats[使用统计 tb_ai_usage_statistics] + + User -->|1:N| Conversation + User -->|1:N| File + User -->|1:N| Stats + Conversation -->|1:N| Message + File -.->|关联| Message + Knowledge -.->|引用| Message + Config -.->|配置| Message + + style User fill:#e1f5ff + style Conversation fill:#ffe1f5 + style Knowledge fill:#fff4e1 + style Config fill:#e1ffe1 +``` + +## 个人中心体系 + +```mermaid +graph TB + User[用户 tb_sys_user] + Collection[收藏 tb_user_collection] + Points[积分 tb_user_points] + PointsRecord[积分记录 tb_points_record] + Achievement[成就 tb_achievement] + UserAchievement[用户成就 tb_user_achievement] + Browse[浏览记录 tb_user_browse_record] + + Resource[资源] + Course[课程] + + User -->|1:N| Collection + User -->|1:1| Points + User -->|1:N| PointsRecord + User -->|1:N| UserAchievement + User -->|1:N| Browse + + Achievement -->|1:N| UserAchievement + + Resource -.->|收藏| Collection + Course -.->|收藏| Collection + Resource -.->|浏览| Browse + Course -.->|浏览| Browse + + style User fill:#e1f5ff + style Points fill:#ffe1f5 + style Achievement fill:#fff4e1 +``` + +## 表关系类型说明 + +### 1对1关系 (1:1) +- `tb_sys_user` ↔ `tb_sys_user_info`: 用户与用户信息 +- `tb_sys_user` ↔ `tb_user_points`: 用户与积分 +- `tb_resource` ↔ `tb_resource_recommend`: 资源与推荐(可选) +- `tb_resource` ↔ `tb_banner`: 资源与Banner(可选) + +### 1对多关系 (1:N) +- `tb_sys_user` → `tb_sys_login_log`: 用户的登录记录 +- `tb_sys_dept` → `tb_sys_dept`: 部门的子部门 +- `tb_resource_category` → `tb_resource`: 分类下的资源 +- `tb_course` → `tb_course_chapter`: 课程的章节 +- `tb_ai_conversation` → `tb_ai_message`: 会话的消息 + +### 多对多关系 (M:N) +- `tb_sys_user` ↔ `tb_sys_role`: 通过 `tb_sys_user_dept_role` +- `tb_sys_role` ↔ `tb_sys_permission`: 通过 `tb_sys_role_permission` +- `tb_resource` ↔ `tb_tag`: 通过 `tb_resource_tag` +- `tb_course` ↔ `tb_tag`: 通过 `tb_course_tag` +- `tb_learning_task` ↔ `tb_resource`: 通过 `tb_task_resource` +- `tb_learning_task` ↔ `tb_course`: 通过 `tb_task_course` +- `tb_learning_task` ↔ `tb_sys_user`: 通过 `tb_task_user` +- `tb_sys_user` ↔ `tb_achievement`: 通过 `tb_user_achievement` + +## 核心业务流程关系 + +### 用户学习流程 +1. 用户登录 → `tb_sys_user` + `tb_sys_login_log` +2. 查看任务 → `tb_learning_task` + `tb_task_user` +3. 学习资源 → `tb_resource` / `tb_course` +4. 记录学习 → `tb_learning_record` +5. 更新进度 → `tb_task_user` + `tb_learning_statistics` +6. 获得积分 → `tb_user_points` + `tb_points_record` +7. 解锁成就 → `tb_user_achievement` + +### 资源管理流程 +1. 数据采集 → `tb_data_collection_config` + `tb_data_collection_log` +2. 创建资源 → `tb_resource` +3. 设置分类 → `tb_resource_category` +4. 添加标签 → `tb_tag` + `tb_resource_tag` +5. 推荐资源 → `tb_resource_recommend` +6. 设置Banner → `tb_banner` +7. 记录操作 → `tb_sys_operation_log` + +### 智能体交互流程 +1. 创建会话 → `tb_ai_conversation` +2. 发送消息 → `tb_ai_message` +3. 上传文件 → `tb_ai_upload_file` +4. 检索知识库 → `tb_ai_knowledge` +5. 生成回复 → `tb_ai_message` +6. 记录统计 → `tb_ai_usage_statistics` + +## 数据流向图 + +```mermaid +flowchart LR + A[用户操作] --> B{操作类型} + + B -->|学习| C[学习记录] + B -->|浏览| D[浏览记录] + B -->|收藏| E[收藏记录] + B -->|对话| F[对话记录] + + C --> G[学习统计] + D --> H[访问统计] + C --> I[积分系统] + I --> J[成就系统] + + F --> K[AI统计] + + G --> L[数据大屏] + H --> L + K --> L + + style A fill:#e1f5ff + style L fill:#ffe1e1 +``` + +## 性能优化关键点 + +1. **高频查询表** + - `tb_sys_user`: 用户信息(添加缓存) + - `tb_resource`: 资源列表(分页+缓存) + - `tb_course`: 课程列表(分页+缓存) + +2. **大数据量表** + - `tb_learning_record`: 学习记录(分表+归档) + - `tb_sys_operation_log`: 操作日志(分表+归档) + - `tb_user_browse_record`: 浏览记录(分表+归档) + - `tb_ai_message`: 对话消息(分表+归档) + +3. **实时统计表** + - `tb_learning_statistics`: 预聚合统计 + - `tb_sys_visit_statistics`: 预聚合统计 + - `tb_ai_usage_statistics`: 预聚合统计 + +4. **关联查询优化** + - 用户权限查询:缓存权限信息 + - 任务详情查询:适当冗余字段 + - 资源推荐查询:使用物化视图 + diff --git a/schoolNewsServ/.bin/mysql/sql/README.md b/schoolNewsServ/.bin/mysql/sql/README.md new file mode 100644 index 0000000..afba27c --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/README.md @@ -0,0 +1,242 @@ +# 校园思政新闻平台数据库表结构说明 + +## 数据库初始化顺序 + +按照以下顺序执行SQL文件: + +1. `createDB.sql` - 创建数据库 +2. `createTableUser.sql` - 创建用户相关表 +3. `createTablePermission.sql` - 创建权限相关表 +4. `createTablePermissionControl.sql` - **创建统一资源权限控制表** +5. `createTableResource.sql` - 创建资源管理相关表 +6. `createTableCourse.sql` - 创建课程管理相关表 +7. `createTableLearning.sql` - 创建学习管理相关表 +8. `createTableUserCenter.sql` - 创建个人中心相关表 +9. `createTableAI.sql` - 创建智能体相关表 +10. `createTableSystem.sql` - 创建系统配置和日志相关表 + +## 表结构概览 + +### 1. 用户管理模块 (createTableUser.sql) + +- `tb_sys_user` - 用户表 +- `tb_sys_user_info` - 用户信息表 +- `tb_sys_login_log` - 登录日志表 + +### 2. 权限管理模块 (createTablePermission.sql) + +- `tb_sys_dept` - 部门表 +- `tb_sys_role` - 角色表 +- `tb_sys_dept_role` - 部门-角色关联表 +- `tb_sys_user_dept_role` - 用户-部门-角色关联表 +- `tb_sys_permission` - 权限表 +- `tb_sys_role_permission` - 角色-权限关联表 +- `tb_sys_menu` - 菜单表 +- `tb_sys_menu_permission` - 菜单-权限关联表 + +### 3. 资源管理模块 (createTableResource.sql) + +- `tb_resource` - 资源/新闻表 +- `tb_resource_category` - 资源分类表 + - 默认分类:党史学习、领导讲话、政策解读、红色经典、专题报告、思政案例 +- `tb_banner` - Banner轮播图表 +- `tb_resource_recommend` - 资源推荐表(TOP资源) +- `tb_tag` - 标签表 +- `tb_resource_tag` - 资源-标签关联表 +- `tb_data_collection_config` - 数据采集配置表 +- `tb_data_collection_log` - 数据采集记录表 + +### 4. 课程管理模块 (createTableCourse.sql) + +- `tb_course` - 课程表 +- `tb_course_chapter` - 课程章节表 +- `tb_course_tag` - 课程-标签关联表 +- `tb_course_dept` - 课程-部门权限表 + +### 5. 学习管理模块 (createTableLearning.sql) + +- `tb_learning_task` - 学习计划/任务表 +- `tb_task_resource` - 任务-资源关联表 +- `tb_task_course` - 任务-课程关联表 +- `tb_task_user` - 任务-用户关联表(任务接收人员) +- `tb_learning_record` - 学习记录表 +- `tb_learning_statistics` - 学习统计表(按天统计) + +### 6. 个人中心模块 (createTableUserCenter.sql) + +- `tb_user_collection` - 用户收藏表 +- `tb_achievement` - 成就表 +- `tb_user_achievement` - 用户-成就关联表 +- `tb_user_points` - 用户积分表 +- `tb_points_record` - 积分记录表 +- `tb_user_browse_record` - 用户浏览记录表 + +### 7. 智能体模块 (createTableAI.sql) + +- `tb_ai_agent_config` - 智能体配置表 +- `tb_ai_knowledge` - 知识库表 +- `tb_ai_conversation` - 对话会话表 +- `tb_ai_message` - 对话消息表 +- `tb_ai_upload_file` - 上传文件表 +- `tb_ai_usage_statistics` - AI使用统计表 + +### 8. 系统配置和日志模块 (createTableSystem.sql) + +- `tb_sys_operation_log` - 操作日志表 +- `tb_sys_config` - 系统配置表 +- `tb_sys_visit_statistics` - 系统访问统计表 +- `tb_sys_notification` - 系统通知表 +- `tb_sys_file` - 文件上传记录表 +- `tb_sys_dict_type` - 数据字典类型表 +- `tb_sys_dict_data` - 数据字典详情表 + +## 表关系说明 + +### 核心关系 + +1. **用户体系** + - 用户 → 用户信息(1对1) + - 用户 → 部门-角色(多对多) + - 角色 → 权限(多对多) + - 菜单 → 权限(多对多) + +2. **资源体系** + - 资源 → 分类(多对1) + - 资源 → 标签(多对多) + - 资源 → 推荐(1对1) + - 资源 → Banner(1对1) + +3. **课程体系** + - 课程 → 章节(1对多) + - 课程 → 标签(多对多) + - 课程 → 部门权限(多对多) + +4. **学习体系** + - 任务 → 资源/课程(多对多) + - 任务 → 用户(多对多) + - 用户 → 学习记录(1对多) + - 用户 → 学习统计(1对多) + +5. **个人中心** + - 用户 → 收藏(1对多) + - 用户 → 成就(多对多) + - 用户 → 积分(1对1) + - 用户 → 浏览记录(1对多) + +6. **智能体** + - 用户 → 对话会话(1对多) + - 会话 → 消息(1对多) + - 用户 → 上传文件(1对多) + - 知识库(独立) + +## 数据字典 + +### 通用状态码 + +- **deleted**: 0-未删除, 1-已删除 +- **status**: 根据业务模块有不同含义,具体见各表注释 + +### 资源相关 + +- **resource.status**: 0-草稿, 1-已发布, 2-下架 +- **link_type**: 1-资源, 2-课程, 3-外部链接 + +### 课程相关 + +- **course.status**: 0-未上线, 1-已上线, 2-已下架 +- **permission_type**: 0-公开, 1-指定部门 + +### 学习相关 + +- **task.status**: 0-草稿, 1-进行中, 2-已结束 +- **task_user.status**: 0-未完成, 1-已完成 +- **resource_type**: 1-资源, 2-课程, 3-章节 + +### 个人中心相关 + +- **collection_type**: 1-资源, 2-课程 +- **achievement.type**: 1-勋章, 2-等级 +- **condition_type**: 1-学习时长, 2-资源数量, 3-课程数量, 4-连续学习天数 +- **points_record.type**: 1-获得, 2-消费 +- **points_record.source_type**: 1-学习资源, 2-学习课程, 3-完成任务, 4-获得成就 + +### 智能体相关 + +- **ai_knowledge.source_type**: 1-手动添加, 2-文件导入, 3-资源同步 +- **ai_message.role**: user-用户, assistant-助手, system-系统 +- **ai_upload_file.status**: 0-处理中, 1-已完成, 2-失败 + +### 系统相关 + +- **menu.type**: 0-目录, 1-菜单, 2-按钮 +- **notification.type**: 1-系统通知, 2-任务通知, 3-成就通知 +- **config_type**: string-字符串, number-数字, boolean-布尔, json-JSON对象 + +## 索引说明 + +所有表都包含以下基本索引: +- 主键索引(id) +- 唯一键索引(如user_id、role_id等业务唯一标识) +- 外键关联索引 +- 时间字段索引(create_time、update_time等) +- 状态字段索引(status、deleted等) +- 常用查询字段索引 + +## 字段说明 + +### 通用字段 + +所有表都包含以下通用字段: +- `id`: 主键ID(VARCHAR(50)) +- `creator`: 创建者ID +- `updater`: 更新者ID +- `create_time`: 创建时间 +- `update_time`: 更新时间 +- `delete_time`: 删除时间(软删除) +- `deleted`: 是否删除(0-否, 1-是) + +### 特殊字段 + +- 所有表的字符编码为 `utf8mb4`,支持存储表情符号 +- LONGTEXT 用于存储富文本内容 +- TEXT 用于存储较长的文本描述 +- VARCHAR 用于存储固定长度的字符串 +- DECIMAL 用于存储精确的数值(如百分比、金额等) +- TIMESTAMP 用于存储时间(支持时区) +- INT/BIGINT 用于存储整数 + +## 注意事项 + +1. **软删除**:所有业务表都使用软删除机制(deleted字段),删除操作不会真正删除数据 +2. **时间戳**:所有时间字段使用 TIMESTAMP 类型,自动记录创建和更新时间 +3. **字符集**:数据库和所有表都使用 utf8mb4 字符集,支持存储所有Unicode字符 +4. **外键**:建议在应用层维护外键关系,不使用数据库外键约束,以提高性能 +5. **索引优化**:根据实际查询情况可以添加组合索引 +6. **数据量**:对于大数据量表(如日志表、记录表),建议定期归档历史数据 +7. **ID生成**:建议使用雪花算法或UUID生成ID,确保分布式环境下的唯一性 + +## 默认数据 + +系统初始化后会包含以下默认数据: + +1. **用户**:admin(密码已加密) +2. **部门**:超级部门、默认部门 +3. **角色**:管理员、自由角色 +4. **权限**:系统管理相关权限 +5. **菜单**:系统管理菜单 +6. **资源分类**:6个默认分类 +7. **系统配置**:13项默认配置 +8. **智能体配置**:思政小帮手 + +## 扩展建议 + +根据实际业务需求,可以扩展以下功能: + +1. **评论系统**:添加资源/课程评论表 +2. **问答系统**:添加问答相关表 +3. **考试系统**:添加试题库、试卷、考试记录等表 +4. **消息系统**:扩展站内信功能 +5. **工作流**:添加审批流程相关表 +6. **数据分析**:添加更详细的统计分析表 +7. **多租户**:添加租户相关表和字段 + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableAI.sql b/schoolNewsServ/.bin/mysql/sql/createTableAI.sql new file mode 100644 index 0000000..2a1e47a --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableAI.sql @@ -0,0 +1,126 @@ +use school_news; +-- 智能体配置表 +DROP TABLE IF EXISTS `tb_ai_agent_config`; +CREATE TABLE `tb_ai_agent_config` ( + `id` VARCHAR(50) NOT NULL COMMENT '配置ID', + `name` VARCHAR(100) NOT NULL COMMENT '智能体名称', + `avatar` VARCHAR(255) DEFAULT NULL COMMENT '智能体头像', + `system_prompt` TEXT COMMENT '系统提示词', + `model_name` VARCHAR(100) DEFAULT NULL COMMENT '模型名称', + `model_provider` VARCHAR(50) DEFAULT NULL COMMENT '模型提供商', + `temperature` DECIMAL(3,2) DEFAULT 0.70 COMMENT '温度值', + `max_tokens` INT(11) DEFAULT 2000 COMMENT '最大tokens', + `top_p` DECIMAL(3,2) DEFAULT 1.00 COMMENT 'Top P值', + `status` INT(4) 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`) +) 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`; +CREATE TABLE `tb_ai_knowledge` ( + `id` VARCHAR(50) NOT NULL COMMENT '知识ID', + `title` VARCHAR(255) NOT NULL COMMENT '知识标题', + `content` LONGTEXT NOT NULL COMMENT '知识内容', + `source_type` INT(4) DEFAULT 1 COMMENT '来源类型(1手动添加 2文件导入 3资源同步)', + `source_id` VARCHAR(50) DEFAULT NULL COMMENT '来源ID', + `file_name` VARCHAR(255) DEFAULT NULL COMMENT '文件名', + `file_path` VARCHAR(500) DEFAULT NULL COMMENT '文件路径', + `category` VARCHAR(100) DEFAULT NULL COMMENT '分类', + `tags` VARCHAR(500) DEFAULT NULL COMMENT '标签(JSON数组)', + `vector_id` VARCHAR(100) DEFAULT NULL COMMENT '向量ID(用于向量检索)', + `status` INT(4) 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`), + KEY `idx_source` (`source_type`, `source_id`), + KEY `idx_category` (`category`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='知识库表'; + +-- 对话会话表 +DROP TABLE IF EXISTS `tb_ai_conversation`; +CREATE TABLE `tb_ai_conversation` ( + `id` VARCHAR(50) NOT NULL COMMENT '会话ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `title` VARCHAR(255) DEFAULT NULL COMMENT '会话标题', + `status` INT(4) DEFAULT 1 COMMENT '状态(0已结束 1进行中)', + `message_count` INT(11) DEFAULT 0 COMMENT '消息数量', + `last_message_time` TIMESTAMP NULL 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 '更新时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_last_message_time` (`last_message_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话会话表'; + +-- 对话记录表 +DROP TABLE IF EXISTS `tb_ai_message`; +CREATE TABLE `tb_ai_message` ( + `id` VARCHAR(50) NOT NULL COMMENT '消息ID', + `conversation_id` VARCHAR(50) NOT NULL COMMENT '会话ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `role` VARCHAR(20) NOT NULL COMMENT '角色(user用户 assistant助手 system系统)', + `content` LONGTEXT NOT NULL COMMENT '消息内容', + `file_ids` VARCHAR(500) DEFAULT NULL COMMENT '关联文件ID(JSON数组)', + `knowledge_ids` VARCHAR(500) DEFAULT NULL COMMENT '引用知识ID(JSON数组)', + `token_count` INT(11) DEFAULT 0 COMMENT 'Token数量', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_conversation` (`conversation_id`), + KEY `idx_user` (`user_id`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='对话消息表'; + +-- 上传文件表 +DROP TABLE IF EXISTS `tb_ai_upload_file`; +CREATE TABLE `tb_ai_upload_file` ( + `id` VARCHAR(50) NOT NULL COMMENT '文件ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `conversation_id` VARCHAR(50) DEFAULT NULL COMMENT '会话ID', + `file_name` VARCHAR(255) NOT NULL COMMENT '文件名', + `file_path` VARCHAR(500) NOT NULL COMMENT '文件路径', + `file_size` BIGINT(20) DEFAULT 0 COMMENT '文件大小(字节)', + `file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型', + `mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型', + `extracted_text` LONGTEXT COMMENT '提取的文本内容', + `status` INT(4) DEFAULT 1 COMMENT '状态(0处理中 1已完成 2失败)', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_conversation` (`conversation_id`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='上传文件表'; + +-- AI使用统计表 +DROP TABLE IF EXISTS `tb_ai_usage_statistics`; +CREATE TABLE `tb_ai_usage_statistics` ( + `id` VARCHAR(50) NOT NULL COMMENT '统计ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `stat_date` DATE NOT NULL COMMENT '统计日期', + `conversation_count` INT(11) DEFAULT 0 COMMENT '会话数量', + `message_count` INT(11) DEFAULT 0 COMMENT '消息数量', + `total_tokens` INT(11) DEFAULT 0 COMMENT '总Token数', + `file_count` INT(11) DEFAULT 0 COMMENT '上传文件数', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_date` (`user_id`, `stat_date`), + KEY `idx_user` (`user_id`), + KEY `idx_date` (`stat_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='AI使用统计表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableCourse.sql b/schoolNewsServ/.bin/mysql/sql/createTableCourse.sql new file mode 100644 index 0000000..32659f8 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableCourse.sql @@ -0,0 +1,63 @@ +use school_news; +-- 课程表 +DROP TABLE IF EXISTS `tb_course`; +CREATE TABLE `tb_course` ( + `id` VARCHAR(50) NOT NULL COMMENT '课程ID', + `course_id` VARCHAR(50) NOT NULL COMMENT '课程唯一标识', + `name` VARCHAR(255) NOT NULL COMMENT '课程名称', + `cover_image` VARCHAR(255) DEFAULT NULL COMMENT '课程封面图片', + `description` TEXT COMMENT '课程描述', + `content` LONGTEXT COMMENT '课程内容', + `duration` INT(11) DEFAULT 0 COMMENT '课程时长(分钟)', + `teacher` VARCHAR(100) DEFAULT NULL COMMENT '授课老师', + `status` INT(4) DEFAULT 0 COMMENT '状态(0未上线 1已上线 2已下架)', + `view_count` INT(11) DEFAULT 0 COMMENT '浏览次数', + `learn_count` INT(11) DEFAULT 0 COMMENT '学习人数', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `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_course_id` (`course_id`), + KEY `idx_status` (`status`), + KEY `idx_view_count` (`view_count`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='课程表'; + +-- 课程章节表 +DROP TABLE IF EXISTS `tb_course_chapter`; +CREATE TABLE `tb_course_chapter` ( + `id` VARCHAR(50) NOT NULL COMMENT '章节ID', + `course_id` VARCHAR(50) NOT NULL COMMENT '课程ID', + `name` VARCHAR(255) NOT NULL COMMENT '章节名称', + `content` LONGTEXT COMMENT '章节内容', + `video_url` VARCHAR(500) DEFAULT NULL COMMENT '视频URL', + `duration` INT(11) DEFAULT 0 COMMENT '章节时长(分钟)', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `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`), + KEY `idx_course` (`course_id`), + KEY `idx_order` (`order_num`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='课程章节表'; + +-- 课程标签关联表 +DROP TABLE IF EXISTS `tb_course_tag`; +CREATE TABLE `tb_course_tag` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `course_id` VARCHAR(50) NOT NULL COMMENT '课程ID', + `tag_id` VARCHAR(50) NOT NULL COMMENT '标签ID', + `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_course_tag` (`course_id`, `tag_id`), + KEY `idx_course` (`course_id`), + KEY `idx_tag` (`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='课程标签关联表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql new file mode 100644 index 0000000..378ecfb --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql @@ -0,0 +1,115 @@ +use school_news; +-- 学习计划/任务表 +DROP TABLE IF EXISTS `tb_learning_task`; +CREATE TABLE `tb_learning_task` ( + `id` VARCHAR(50) NOT NULL COMMENT '任务ID', + `task_id` VARCHAR(50) NOT NULL COMMENT '任务唯一标识', + `name` VARCHAR(255) NOT NULL COMMENT '任务名称', + `description` TEXT COMMENT '任务描述', + `start_time` TIMESTAMP NULL DEFAULT NULL COMMENT '开始时间', + `end_time` TIMESTAMP NULL DEFAULT NULL COMMENT '结束时间', + `status` INT(4) DEFAULT 1 COMMENT '状态(0草稿 1进行中 2已结束)', + `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_task_id` (`task_id`), + KEY `idx_status` (`status`), + KEY `idx_time` (`start_time`, `end_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习任务表'; + +-- 任务关联资源表 +DROP TABLE IF EXISTS `tb_task_resource`; +CREATE TABLE `tb_task_resource` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `task_id` VARCHAR(50) NOT NULL COMMENT '任务ID', + `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `required` TINYINT(1) DEFAULT 1 COMMENT '是否必须完成', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_task_resource` (`task_id`, `resource_id`), + KEY `idx_task` (`task_id`), + KEY `idx_resource` (`resource_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务资源关联表'; + +-- 任务关联课程表 +DROP TABLE IF EXISTS `tb_task_course`; +CREATE TABLE `tb_task_course` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `task_id` VARCHAR(50) NOT NULL COMMENT '任务ID', + `course_id` VARCHAR(50) NOT NULL COMMENT '课程ID', + `required` TINYINT(1) DEFAULT 1 COMMENT '是否必须完成', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_task_course` (`task_id`, `course_id`), + KEY `idx_task` (`task_id`), + KEY `idx_course` (`course_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务课程关联表'; + +-- 任务接收人员表 +DROP TABLE IF EXISTS `tb_task_user`; +CREATE TABLE `tb_task_user` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `task_id` VARCHAR(50) NOT NULL COMMENT '任务ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `dept_id` VARCHAR(50) DEFAULT NULL COMMENT '部门ID', + `status` INT(4) DEFAULT 0 COMMENT '完成状态(0未完成 1已完成)', + `progress` DECIMAL(5,2) DEFAULT 0.00 COMMENT '完成进度(0-100)', + `complete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间', + `creator` 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 '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_task_user` (`task_id`, `user_id`), + KEY `idx_task` (`task_id`), + KEY `idx_user` (`user_id`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='任务用户表'; + +-- 学习记录表 +DROP TABLE IF EXISTS `tb_learning_record`; +CREATE TABLE `tb_learning_record` ( + `id` VARCHAR(50) NOT NULL COMMENT '记录ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `resource_type` INT(4) NOT NULL COMMENT '资源类型(1资源 2课程 3章节)', + `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `task_id` VARCHAR(50) DEFAULT NULL COMMENT '任务ID', + `duration` INT(11) DEFAULT 0 COMMENT '学习时长(秒)', + `progress` DECIMAL(5,2) DEFAULT 0.00 COMMENT '学习进度(0-100)', + `is_complete` TINYINT(1) DEFAULT 0 COMMENT '是否完成', + `complete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '完成时间', + `last_learn_time` TIMESTAMP NULL 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 '更新时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_resource` (`resource_type`, `resource_id`), + KEY `idx_task` (`task_id`), + KEY `idx_learn_time` (`last_learn_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习记录表'; + +-- 学习统计表(按天统计) +DROP TABLE IF EXISTS `tb_learning_statistics`; +CREATE TABLE `tb_learning_statistics` ( + `id` VARCHAR(50) NOT NULL COMMENT '统计ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `stat_date` DATE NOT NULL COMMENT '统计日期', + `total_duration` INT(11) DEFAULT 0 COMMENT '总学习时长(秒)', + `resource_count` INT(11) DEFAULT 0 COMMENT '学习资源数量', + `course_count` INT(11) DEFAULT 0 COMMENT '学习课程数量', + `complete_count` INT(11) DEFAULT 0 COMMENT '完成数量', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_date` (`user_id`, `stat_date`), + KEY `idx_user` (`user_id`), + KEY `idx_date` (`stat_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习统计表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTablePermissionControl.sql b/schoolNewsServ/.bin/mysql/sql/createTablePermissionControl.sql new file mode 100644 index 0000000..7d5d343 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTablePermissionControl.sql @@ -0,0 +1,54 @@ +use school_news; +-- 统一资源权限控制表 +DROP TABLE IF EXISTS `tb_resource_permission`; +CREATE TABLE `tb_resource_permission` ( + `id` VARCHAR(50) NOT NULL COMMENT '权限ID', + `resource_type` INT(4) NOT NULL COMMENT '资源类型(1资源/新闻 2课程 3课程章节 4学习任务)', + `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `dept_id` VARCHAR(50) DEFAULT NULL COMMENT '部门ID(NULL表示不限制部门)', + `role_id` VARCHAR(50) DEFAULT NULL COMMENT '角色ID(NULL表示不限制角色)', + `can_read` TINYINT(1) DEFAULT 1 COMMENT '读权限(0否 1是)', + `can_write` TINYINT(1) DEFAULT 0 COMMENT '写权限(0否 1是)', + `can_execute` TINYINT(1) DEFAULT 0 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_resource_dept_role` (`resource_type`, `resource_id`, `dept_id`, `role_id`, `deleted`), + KEY `idx_resource` (`resource_type`, `resource_id`), + KEY `idx_dept` (`dept_id`), + KEY `idx_role` (`role_id`), + KEY `idx_permissions` (`can_read`, `can_write`, `can_execute`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='统一资源权限控制表'; + +-- 说明: +-- 1. resource_type 资源类型说明: +-- 1 - 资源/新闻 +-- 2 - 课程 +-- 3 - 课程章节 +-- 4 - 学习任务 +-- 可根据实际业务扩展 +-- +-- 2. dept_id 和 role_id 组合使用: +-- - 都为NULL:不限制,所有人可访问 +-- - dept_id有值,role_id为NULL:该部门所有人可访问 +-- - dept_id为NULL,role_id有值:该角色所有人可访问 +-- - 都有值:该部门的该角色可访问 +-- +-- 3. 权限说明: +-- - can_read:查看权限(浏览、阅读) +-- - can_write:编辑权限(修改、删除) +-- - can_execute:执行权限(发布、审核等操作) +-- +-- 4. 查询示例: +-- 查询用户对某资源的权限: +-- SELECT * FROM tb_resource_permission +-- WHERE resource_type = 1 +-- AND resource_id = 'xxx' +-- AND (dept_id IS NULL OR dept_id = '用户部门') +-- AND (role_id IS NULL OR role_id IN ('用户角色列表')) +-- AND deleted = 0; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableResource.sql b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql new file mode 100644 index 0000000..aa9ea3f --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql @@ -0,0 +1,172 @@ +use school_news; +-- 资源/新闻表 +DROP TABLE IF EXISTS `tb_resource`; +CREATE TABLE `tb_resource` ( + `id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `title` VARCHAR(255) NOT NULL COMMENT '资源标题', + `content` LONGTEXT COMMENT '资源内容', + `summary` VARCHAR(500) DEFAULT NULL COMMENT '资源简介', + `cover_image` VARCHAR(255) DEFAULT NULL COMMENT '封面图片', + `category_id` VARCHAR(50) DEFAULT NULL COMMENT '分类ID', + `author` VARCHAR(100) DEFAULT NULL COMMENT '作者', + `source` VARCHAR(255) DEFAULT NULL COMMENT '来源', + `source_url` VARCHAR(500) DEFAULT NULL COMMENT '来源URL', + `view_count` INT(11) DEFAULT 0 COMMENT '浏览次数', + `like_count` INT(11) DEFAULT 0 COMMENT '点赞次数', + `collect_count` INT(11) DEFAULT 0 COMMENT '收藏次数', + `status` INT(4) DEFAULT 0 COMMENT '状态(0草稿 1已发布 2下架)', + `is_recommend` TINYINT(1) DEFAULT 0 COMMENT '是否推荐', + `is_banner` TINYINT(1) DEFAULT 0 COMMENT '是否轮播', + `publish_time` TIMESTAMP NULL DEFAULT NULL COMMENT '发布时间', + `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`), + KEY `idx_category` (`category_id`), + KEY `idx_status` (`status`), + KEY `idx_publish_time` (`publish_time`), + KEY `idx_view_count` (`view_count`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源表'; + +-- 资源分类表 +DROP TABLE IF EXISTS `tb_resource_category`; +CREATE TABLE `tb_resource_category` ( + `id` VARCHAR(50) NOT NULL COMMENT '分类ID', + `category_id` VARCHAR(50) NOT NULL COMMENT '分类唯一标识', + `name` VARCHAR(100) NOT NULL COMMENT '分类名称', + `parent_id` VARCHAR(50) DEFAULT NULL COMMENT '父分类ID', + `description` VARCHAR(255) DEFAULT NULL COMMENT '分类描述', + `icon` VARCHAR(100) DEFAULT NULL COMMENT '分类图标', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `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_category_id` (`category_id`), + 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`; +CREATE TABLE `tb_banner` ( + `id` VARCHAR(50) NOT NULL COMMENT 'Banner ID', + `title` VARCHAR(255) NOT NULL COMMENT 'Banner标题', + `image_url` VARCHAR(500) NOT NULL COMMENT 'Banner图片URL', + `link_type` INT(4) DEFAULT 1 COMMENT '链接类型(1资源 2课程 3外部链接)', + `link_id` VARCHAR(50) DEFAULT NULL COMMENT '关联ID(资源ID或课程ID)', + `link_url` VARCHAR(500) DEFAULT NULL COMMENT '外部链接URL', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `status` INT(4) 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`), + KEY `idx_order` (`order_num`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Banner表'; + +-- 资源推荐表 +DROP TABLE IF EXISTS `tb_resource_recommend`; +CREATE TABLE `tb_resource_recommend` ( + `id` VARCHAR(50) NOT NULL COMMENT '推荐ID', + `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `reason` VARCHAR(255) DEFAULT NULL COMMENT '推荐理由', + `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_resource` (`resource_id`), + KEY `idx_order` (`order_num`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源推荐表'; + +-- 标签表 +DROP TABLE IF EXISTS `tb_tag`; +CREATE TABLE `tb_tag` ( + `id` VARCHAR(50) NOT NULL COMMENT '标签ID', + `tag_id` VARCHAR(50) NOT NULL COMMENT '标签唯一标识', + `name` VARCHAR(100) NOT NULL COMMENT '标签名称', + `color` VARCHAR(20) DEFAULT NULL COMMENT '标签颜色', + `description` VARCHAR(255) DEFAULT NULL COMMENT '标签描述', + `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_tag_id` (`tag_id`), + UNIQUE KEY `uk_tag_name` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='标签表'; + +-- 资源标签关联表 +DROP TABLE IF EXISTS `tb_resource_tag`; +CREATE TABLE `tb_resource_tag` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID', + `tag_id` VARCHAR(50) NOT NULL COMMENT '标签ID', + `creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_resource_tag` (`resource_id`, `tag_id`), + KEY `idx_resource` (`resource_id`), + KEY `idx_tag` (`tag_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源标签关联表'; + +-- 数据采集配置表 +DROP TABLE IF EXISTS `tb_data_collection_config`; +CREATE TABLE `tb_data_collection_config` ( + `id` VARCHAR(50) NOT NULL COMMENT '配置ID', + `name` VARCHAR(100) NOT NULL COMMENT '配置名称', + `source_url` VARCHAR(500) NOT NULL COMMENT '采集源URL', + `source_type` VARCHAR(50) DEFAULT NULL COMMENT '采集源类型', + `frequency` VARCHAR(20) DEFAULT 'daily' COMMENT '采集频率(daily每天 weekly每周)', + `category_id` VARCHAR(50) DEFAULT NULL COMMENT '默认分类ID', + `status` INT(4) DEFAULT 1 COMMENT '状态(0禁用 1启用)', + `last_collect_time` TIMESTAMP NULL DEFAULT NULL COMMENT '最后采集时间', + `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`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据采集配置表'; + +-- 数据采集记录表 +DROP TABLE IF EXISTS `tb_data_collection_log`; +CREATE TABLE `tb_data_collection_log` ( + `id` VARCHAR(50) NOT NULL COMMENT '记录ID', + `config_id` VARCHAR(50) NOT NULL COMMENT '配置ID', + `collect_count` INT(11) DEFAULT 0 COMMENT '采集数量', + `success_count` INT(11) DEFAULT 0 COMMENT '成功数量', + `fail_count` INT(11) DEFAULT 0 COMMENT '失败数量', + `status` INT(4) DEFAULT 1 COMMENT '状态(0失败 1成功 2部分成功)', + `message` TEXT COMMENT '采集消息', + `collect_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '采集时间', + PRIMARY KEY (`id`), + KEY `idx_config` (`config_id`), + KEY `idx_collect_time` (`collect_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据采集记录表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql b/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql new file mode 100644 index 0000000..e86b9ef --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableSystem.sql @@ -0,0 +1,167 @@ +use school_news; +-- 操作日志表 +DROP TABLE IF EXISTS `tb_sys_operation_log`; +CREATE TABLE `tb_sys_operation_log` ( + `id` VARCHAR(50) NOT NULL COMMENT '日志ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `username` VARCHAR(50) NOT NULL COMMENT '用户名', + `module` VARCHAR(100) DEFAULT NULL COMMENT '操作模块', + `operation` VARCHAR(100) DEFAULT NULL COMMENT '操作类型', + `method` VARCHAR(200) DEFAULT NULL COMMENT '请求方法', + `request_url` VARCHAR(500) DEFAULT NULL COMMENT '请求URL', + `request_method` VARCHAR(20) DEFAULT NULL COMMENT '请求方式(GET/POST等)', + `request_params` TEXT COMMENT '请求参数', + `response_data` TEXT COMMENT '响应数据', + `ip_address` VARCHAR(45) DEFAULT NULL COMMENT 'IP地址', + `ip_source` VARCHAR(100) DEFAULT NULL COMMENT 'IP来源', + `browser` VARCHAR(100) DEFAULT NULL COMMENT '浏览器', + `os` VARCHAR(100) DEFAULT NULL COMMENT '操作系统', + `status` INT(4) DEFAULT 1 COMMENT '操作状态(0失败 1成功)', + `error_message` TEXT COMMENT '错误消息', + `execute_time` INT(11) DEFAULT 0 COMMENT '执行时长(毫秒)', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_module` (`module`), + KEY `idx_create_time` (`create_time`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='操作日志表'; + +-- 系统配置表 +DROP TABLE IF EXISTS `tb_sys_config`; +CREATE TABLE `tb_sys_config` ( + `id` VARCHAR(50) NOT NULL COMMENT '配置ID', + `config_key` VARCHAR(100) NOT NULL COMMENT '配置键', + `config_value` TEXT COMMENT '配置值', + `config_type` VARCHAR(50) DEFAULT 'string' COMMENT '配置类型(string/number/boolean/json)', + `config_group` VARCHAR(50) DEFAULT NULL COMMENT '配置分组', + `description` VARCHAR(255) DEFAULT NULL COMMENT '配置描述', + `is_system` TINYINT(1) DEFAULT 0 COMMENT '是否系统配置', + `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_config_key` (`config_key`), + 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`; +CREATE TABLE `tb_sys_visit_statistics` ( + `id` VARCHAR(50) NOT NULL COMMENT '统计ID', + `stat_date` DATE NOT NULL COMMENT '统计日期', + `total_visits` INT(11) DEFAULT 0 COMMENT '总访问量', + `unique_visitors` INT(11) DEFAULT 0 COMMENT '独立访客数', + `new_users` INT(11) DEFAULT 0 COMMENT '新增用户数', + `active_users` INT(11) DEFAULT 0 COMMENT '活跃用户数', + `page_views` INT(11) DEFAULT 0 COMMENT '页面浏览量', + `avg_visit_duration` INT(11) DEFAULT 0 COMMENT '平均访问时长(秒)', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_stat_date` (`stat_date`), + KEY `idx_date` (`stat_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统访问统计表'; + +-- 通知表 +DROP TABLE IF EXISTS `tb_sys_notification`; +CREATE TABLE `tb_sys_notification` ( + `id` VARCHAR(50) NOT NULL COMMENT '通知ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `type` INT(4) DEFAULT 1 COMMENT '通知类型(1系统通知 2任务通知 3成就通知)', + `title` VARCHAR(255) NOT NULL COMMENT '通知标题', + `content` TEXT COMMENT '通知内容', + `link_type` INT(4) DEFAULT NULL COMMENT '链接类型(1资源 2课程 3任务)', + `link_id` VARCHAR(50) DEFAULT NULL COMMENT '链接ID', + `is_read` TINYINT(1) DEFAULT 0 COMMENT '是否已读', + `read_time` TIMESTAMP NULL DEFAULT NULL COMMENT '阅读时间', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_is_read` (`is_read`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统通知表'; + +-- 文件上传记录表 +DROP TABLE IF EXISTS `tb_sys_file`; +CREATE TABLE `tb_sys_file` ( + `id` VARCHAR(50) NOT NULL COMMENT '文件ID', + `file_name` VARCHAR(255) NOT NULL COMMENT '文件名', + `original_name` VARCHAR(255) NOT NULL COMMENT '原始文件名', + `file_path` VARCHAR(500) NOT NULL COMMENT '文件路径', + `file_url` VARCHAR(500) DEFAULT NULL COMMENT '访问URL', + `file_size` BIGINT(20) DEFAULT 0 COMMENT '文件大小(字节)', + `file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型', + `mime_type` VARCHAR(100) DEFAULT NULL COMMENT 'MIME类型', + `module` VARCHAR(50) DEFAULT NULL COMMENT '所属模块', + `business_id` VARCHAR(50) DEFAULT NULL COMMENT '业务ID', + `uploader` VARCHAR(50) DEFAULT NULL COMMENT '上传者', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间', + PRIMARY KEY (`id`), + KEY `idx_module` (`module`), + KEY `idx_business` (`business_id`), + KEY `idx_uploader` (`uploader`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文件上传记录表'; + +-- 数据字典表 +DROP TABLE IF EXISTS `tb_sys_dict_type`; +CREATE TABLE `tb_sys_dict_type` ( + `id` VARCHAR(50) NOT NULL COMMENT '字典类型ID', + `dict_type` VARCHAR(100) NOT NULL COMMENT '字典类型', + `dict_name` VARCHAR(100) NOT NULL COMMENT '字典名称', + `description` VARCHAR(255) DEFAULT NULL COMMENT '描述', + `status` INT(4) 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_dict_type` (`dict_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典类型表'; + +-- 数据字典详情表 +DROP TABLE IF EXISTS `tb_sys_dict_data`; +CREATE TABLE `tb_sys_dict_data` ( + `id` VARCHAR(50) NOT NULL COMMENT '字典数据ID', + `dict_type` VARCHAR(100) NOT NULL COMMENT '字典类型', + `dict_label` VARCHAR(100) NOT NULL COMMENT '字典标签', + `dict_value` VARCHAR(100) NOT NULL COMMENT '字典值', + `dict_sort` INT(4) DEFAULT 0 COMMENT '排序', + `css_class` VARCHAR(100) DEFAULT NULL COMMENT '样式类', + `list_class` VARCHAR(100) DEFAULT NULL COMMENT '列表样式', + `is_default` TINYINT(1) DEFAULT 0 COMMENT '是否默认', + `status` INT(4) DEFAULT 1 COMMENT '状态(0禁用 1启用)', + `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注', + `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`), + KEY `idx_dict_type` (`dict_type`), + KEY `idx_dict_sort` (`dict_sort`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='字典数据表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/createTableUserCenter.sql b/schoolNewsServ/.bin/mysql/sql/createTableUserCenter.sql new file mode 100644 index 0000000..9e3eb28 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/createTableUserCenter.sql @@ -0,0 +1,101 @@ +use school_news; +-- 用户收藏表 +DROP TABLE IF EXISTS `tb_user_collection`; +CREATE TABLE `tb_user_collection` ( + `id` VARCHAR(50) NOT NULL COMMENT '收藏ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `collection_type` INT(4) NOT NULL COMMENT '收藏类型(1资源 2课程)', + `collection_id` VARCHAR(50) NOT NULL COMMENT '收藏对象ID', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '收藏时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_collection` (`user_id`, `collection_type`, `collection_id`), + KEY `idx_user` (`user_id`), + KEY `idx_collection` (`collection_type`, `collection_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户收藏表'; + +-- 成就表 +DROP TABLE IF EXISTS `tb_achievement`; +CREATE TABLE `tb_achievement` ( + `id` VARCHAR(50) NOT NULL COMMENT '成就ID', + `achievement_id` VARCHAR(50) NOT NULL COMMENT '成就唯一标识', + `name` VARCHAR(100) NOT NULL COMMENT '成就名称', + `description` VARCHAR(255) DEFAULT NULL COMMENT '成就描述', + `icon` VARCHAR(255) DEFAULT NULL COMMENT '成就图标', + `type` INT(4) DEFAULT 1 COMMENT '成就类型(1勋章 2等级)', + `level` INT(4) DEFAULT 1 COMMENT '成就等级', + `condition_type` INT(4) DEFAULT 1 COMMENT '获取条件类型(1学习时长 2资源数量 3课程数量 4连续学习天数)', + `condition_value` INT(11) DEFAULT 0 COMMENT '条件值', + `points` INT(11) DEFAULT 0 COMMENT '获得积分', + `order_num` INT(4) DEFAULT 0 COMMENT '排序号', + `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_achievement_id` (`achievement_id`), + KEY `idx_type` (`type`), + KEY `idx_level` (`level`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='成就表'; + +-- 用户成就关联表 +DROP TABLE IF EXISTS `tb_user_achievement`; +CREATE TABLE `tb_user_achievement` ( + `id` VARCHAR(50) NOT NULL COMMENT '关联ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `achievement_id` VARCHAR(50) NOT NULL COMMENT '成就ID', + `obtain_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '获得时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_achievement` (`user_id`, `achievement_id`), + KEY `idx_user` (`user_id`), + KEY `idx_achievement` (`achievement_id`), + KEY `idx_obtain_time` (`obtain_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户成就表'; + +-- 用户积分表 +DROP TABLE IF EXISTS `tb_user_points`; +CREATE TABLE `tb_user_points` ( + `id` VARCHAR(50) NOT NULL COMMENT '积分ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `total_points` INT(11) DEFAULT 0 COMMENT '总积分', + `current_points` INT(11) DEFAULT 0 COMMENT '当前积分', + `level` INT(4) DEFAULT 1 COMMENT '用户等级', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user` (`user_id`), + KEY `idx_level` (`level`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户积分表'; + +-- 积分记录表 +DROP TABLE IF EXISTS `tb_points_record`; +CREATE TABLE `tb_points_record` ( + `id` VARCHAR(50) NOT NULL COMMENT '记录ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `points` INT(11) NOT NULL COMMENT '积分变动', + `type` INT(4) DEFAULT 1 COMMENT '类型(1获得 2消费)', + `source_type` INT(4) DEFAULT 1 COMMENT '来源类型(1学习资源 2学习课程 3完成任务 4获得成就)', + `source_id` VARCHAR(50) DEFAULT NULL COMMENT '来源ID', + `description` VARCHAR(255) DEFAULT NULL COMMENT '说明', + `create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_create_time` (`create_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='积分记录表'; + +-- 用户浏览记录表 +DROP TABLE IF EXISTS `tb_user_browse_record`; +CREATE TABLE `tb_user_browse_record` ( + `id` VARCHAR(50) NOT NULL COMMENT '记录ID', + `user_id` VARCHAR(50) NOT NULL COMMENT '用户ID', + `browse_type` INT(4) NOT NULL COMMENT '浏览类型(1资源 2课程)', + `browse_id` VARCHAR(50) NOT NULL COMMENT '浏览对象ID', + `browse_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '浏览时间', + `ip_address` VARCHAR(45) DEFAULT NULL COMMENT 'IP地址', + PRIMARY KEY (`id`), + KEY `idx_user` (`user_id`), + KEY `idx_browse` (`browse_type`, `browse_id`), + KEY `idx_time` (`browse_time`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户浏览记录表'; + diff --git a/schoolNewsServ/.bin/mysql/sql/initAll.sql b/schoolNewsServ/.bin/mysql/sql/initAll.sql new file mode 100644 index 0000000..1b1eb32 --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/initAll.sql @@ -0,0 +1,45 @@ +-- ===================================================== +-- 校园思政新闻平台数据库初始化脚本 +-- 版本: 1.0.0 +-- 说明: 该脚本会创建数据库和所有表结构,并插入初始数据 +-- 注意: 执行前请确保MySQL服务已启动,并且有足够的权限 +-- ===================================================== + +-- 1. 创建数据库 +SOURCE createDB.sql; + +-- 2. 创建用户相关表 +SOURCE createTableUser.sql; + +-- 3. 创建权限相关表 +SOURCE createTablePermission.sql; + +-- 4. 创建统一资源权限控制表 +SOURCE createTablePermissionControl.sql; + +-- 5. 创建资源管理相关表 +SOURCE createTableResource.sql; + +-- 6. 创建课程管理相关表 +SOURCE createTableCourse.sql; + +-- 7. 创建学习管理相关表 +SOURCE createTableLearning.sql; + +-- 8. 创建个人中心相关表 +SOURCE createTableUserCenter.sql; + +-- 9. 创建智能体相关表 +SOURCE createTableAI.sql; + +-- 10. 创建系统配置和日志相关表 +SOURCE createTableSystem.sql; + +-- ===================================================== +-- 初始化完成 +-- ===================================================== +-- 数据库: school_news +-- 表数量: 50+ 张表 +-- 默认用户: admin (密码需要查看 createTableUser.sql) +-- ===================================================== + diff --git a/schoolNewsServ/.bin/mysql/sql/权限控制使用说明.md b/schoolNewsServ/.bin/mysql/sql/权限控制使用说明.md new file mode 100644 index 0000000..7a6e14f --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/权限控制使用说明.md @@ -0,0 +1,395 @@ +# 统一资源权限控制使用说明 + +## 📋 概述 + +采用**统一权限表** `tb_resource_permission` 来管理所有资源(新闻、课程、任务等)的访问权限,支持基于**部门**和**角色**的细粒度权限控制。 + +## 🎯 设计优势 + +1. ✅ **统一管理**:所有资源类型的权限在一张表中管理 +2. ✅ **灵活控制**:支持部门、角色、部门+角色三种授权方式 +3. ✅ **细粒度**:支持读、写、执行三种权限级别 +4. ✅ **易扩展**:新增资源类型只需添加类型编号 +5. ✅ **高性能**:合理的索引设计,查询效率高 + +## 📊 表结构 + +```sql +tb_resource_permission ( + id VARCHAR(50) 主键 + resource_type INT(4) 资源类型 + resource_id VARCHAR(50) 资源ID + dept_id VARCHAR(50) 部门ID(可为NULL) + role_id VARCHAR(50) 角色ID(可为NULL) + can_read TINYINT(1) 读权限 + can_write TINYINT(1) 写权限 + can_execute TINYINT(1) 执行权限 + creator VARCHAR(50) 创建者 + create_time TIMESTAMP 创建时间 + ... +) +``` + +## 🏷️ 资源类型编码 + +| 类型值 | 资源类型 | 说明 | +|--------|----------|------| +| 1 | 资源/新闻 | tb_resource | +| 2 | 课程 | tb_course | +| 3 | 课程章节 | tb_course_chapter | +| 4 | 学习任务 | tb_learning_task | + +*可根据业务需要扩展更多类型* + +## 🔐 权限组合说明 + +### 部门和角色组合 + +| dept_id | role_id | 含义 | 应用场景 | +|---------|---------|------|----------| +| NULL | NULL | 公开 | 所有人可访问 | +| 有值 | NULL | 部门限制 | 该部门所有人可访问 | +| NULL | 有值 | 角色限制 | 该角色所有人可访问(跨部门) | +| 有值 | 有值 | 部门+角色 | 特定部门的特定角色可访问 | + +### 权限级别说明 + +| 权限字段 | 含义 | 典型操作 | +|---------|------|----------| +| can_read | 读权限 | 查看、浏览、阅读、下载 | +| can_write | 写权限 | 编辑、修改、删除 | +| can_execute | 执行权限 | 发布、审核、归档、推荐 | + +## 💡 使用示例 + +### 示例1:公开资源 + +```sql +-- 所有人都可以阅读的公开资源 +INSERT INTO tb_resource_permission ( + id, resource_type, resource_id, + dept_id, role_id, + can_read, can_write, can_execute, + creator, create_time +) VALUES ( + '1', 1, 'res_001', + NULL, NULL, -- 部门和角色都为NULL表示公开 + 1, 0, 0, -- 只有读权限 + 'admin', NOW() +); +``` + +### 示例2:部门限制 + +```sql +-- 只有"党委办公室"部门可以访问的资源 +INSERT INTO tb_resource_permission ( + id, resource_type, resource_id, + dept_id, role_id, + can_read, can_write, can_execute, + creator, create_time +) VALUES ( + '2', 1, 'res_002', + 'dept_party_office', NULL, -- 指定部门 + 1, 0, 0, + 'admin', NOW() +); +``` + +### 示例3:角色限制(跨部门) + +```sql +-- 所有"管理员"角色可以编辑的课程(不限部门) +INSERT INTO tb_resource_permission ( + id, resource_type, resource_id, + dept_id, role_id, + can_read, can_write, can_execute, + creator, create_time +) VALUES ( + '3', 2, 'course_001', + NULL, 'admin', -- 只指定角色 + 1, 1, 0, -- 读写权限 + 'admin', NOW() +); +``` + +### 示例4:部门+角色组合 + +```sql +-- "教务处"部门的"教师"角色可以管理的课程 +INSERT INTO tb_resource_permission ( + id, resource_type, resource_id, + dept_id, role_id, + can_read, can_write, can_execute, + creator, create_time +) VALUES ( + '4', 2, 'course_002', + 'dept_academic', 'teacher', -- 部门+角色 + 1, 1, 1, -- 全部权限 + 'admin', NOW() +); +``` + +### 示例5:多个授权组合 + +同一个资源可以有多条权限记录: + +```sql +-- 示例:一个课程有多种访问权限 +-- 1. 所有人可以查看 +INSERT INTO tb_resource_permission VALUES + ('5', 2, 'course_003', NULL, NULL, 1, 0, 0, 'admin', NOW()); + +-- 2. "教师"角色可以编辑 +INSERT INTO tb_resource_permission VALUES + ('6', 2, 'course_003', NULL, 'teacher', 1, 1, 0, 'admin', NOW()); + +-- 3. "教务处"的"管理员"可以发布 +INSERT INTO tb_resource_permission VALUES + ('7', 2, 'course_003', 'dept_academic', 'admin', 1, 1, 1, 'admin', NOW()); +``` + +## 🔍 权限查询 + +### 查询1:检查用户对资源的访问权限 + +```sql +-- 检查用户是否可以访问某个资源 +-- 假设:用户部门='dept_001',角色='teacher',资源类型=2,资源ID='course_001' + +SELECT + MAX(can_read) as has_read, + MAX(can_write) as has_write, + MAX(can_execute) as has_execute +FROM tb_resource_permission +WHERE resource_type = 2 + AND resource_id = 'course_001' + AND deleted = 0 + AND ( + -- 公开资源 + (dept_id IS NULL AND role_id IS NULL) + OR + -- 部门匹配 + (dept_id = 'dept_001' AND role_id IS NULL) + OR + -- 角色匹配 + (dept_id IS NULL AND role_id = 'teacher') + OR + -- 部门+角色匹配 + (dept_id = 'dept_001' AND role_id = 'teacher') + ); +``` + +### 查询2:获取用户可访问的资源列表 + +```sql +-- 获取用户可以访问的所有课程 +-- 假设:用户部门='dept_001',角色列表=['teacher', 'user'] + +SELECT DISTINCT rp.resource_id, c.* +FROM tb_resource_permission rp +INNER JOIN tb_course c ON c.course_id = rp.resource_id +WHERE rp.resource_type = 2 + AND rp.can_read = 1 + AND rp.deleted = 0 + AND ( + (rp.dept_id IS NULL AND rp.role_id IS NULL) + OR (rp.dept_id = 'dept_001' AND rp.role_id IS NULL) + OR (rp.dept_id IS NULL AND rp.role_id IN ('teacher', 'user')) + OR (rp.dept_id = 'dept_001' AND rp.role_id IN ('teacher', 'user')) + ) +ORDER BY c.create_time DESC; +``` + +### 查询3:获取资源的所有权限配置 + +```sql +-- 查看某个资源配置了哪些权限 +SELECT + rp.*, + d.name as dept_name, + r.name as role_name +FROM tb_resource_permission rp +LEFT JOIN tb_sys_dept d ON d.dept_id = rp.dept_id +LEFT JOIN tb_sys_role r ON r.role_id = rp.role_id +WHERE rp.resource_type = 1 + AND rp.resource_id = 'res_001' + AND rp.deleted = 0; +``` + +## 🎨 业务场景实现 + +### 场景1:新闻资源的分级查看 + +```sql +-- 1. 公开新闻:所有人可查看 +INSERT INTO tb_resource_permission VALUES + (UUID(), 1, 'news_public', NULL, NULL, 1, 0, 0, 'admin', NOW()); + +-- 2. 内部新闻:全体员工可查看 +INSERT INTO tb_resource_permission VALUES + (UUID(), 1, 'news_internal', NULL, 'employee', 1, 0, 0, 'admin', NOW()); + +-- 3. 机密新闻:只有党委办公室可查看 +INSERT INTO tb_resource_permission VALUES + (UUID(), 1, 'news_confidential', 'dept_party', NULL, 1, 0, 0, 'admin', NOW()); +``` + +### 场景2:课程权限分配 + +```sql +-- 1. 所有学生可以学习 +INSERT INTO tb_resource_permission VALUES + (UUID(), 2, 'course_101', NULL, 'student', 1, 0, 0, 'admin', NOW()); + +-- 2. 授课教师可以编辑 +INSERT INTO tb_resource_permission VALUES + (UUID(), 2, 'course_101', NULL, 'teacher', 1, 1, 0, 'admin', NOW()); + +-- 3. 教务处管理员可以发布 +INSERT INTO tb_resource_permission VALUES + (UUID(), 2, 'course_101', 'dept_academic', 'admin', 1, 1, 1, 'admin', NOW()); +``` + +### 场景3:学习任务的部门分配 + +```sql +-- 为不同部门分配不同的学习任务 +-- 党委办公室的任务 +INSERT INTO tb_resource_permission VALUES + (UUID(), 4, 'task_party', 'dept_party', NULL, 1, 0, 1, 'admin', NOW()); + +-- 教务处的任务 +INSERT INTO tb_resource_permission VALUES + (UUID(), 4, 'task_academic', 'dept_academic', NULL, 1, 0, 1, 'admin', NOW()); +``` + +## 📝 Java代码示例 + +### 权限检查工具类 + +```java +public class ResourcePermissionChecker { + + /** + * 检查用户是否有资源访问权限 + */ + public boolean hasPermission(String userId, int resourceType, + String resourceId, PermissionType type) { + // 1. 获取用户的部门和角色 + UserInfo user = getUserInfo(userId); + List roleIds = user.getRoleIds(); + String deptId = user.getDeptId(); + + // 2. 查询权限 + List permissions = permissionMapper.selectList( + new QueryWrapper() + .eq("resource_type", resourceType) + .eq("resource_id", resourceId) + .eq("deleted", 0) + .and(wrapper -> wrapper + // 公开 + .or(w -> w.isNull("dept_id").isNull("role_id")) + // 部门匹配 + .or(w -> w.eq("dept_id", deptId).isNull("role_id")) + // 角色匹配 + .or(w -> w.isNull("dept_id").in("role_id", roleIds)) + // 部门+角色匹配 + .or(w -> w.eq("dept_id", deptId).in("role_id", roleIds)) + ) + ); + + // 3. 判断权限 + for (ResourcePermission perm : permissions) { + switch (type) { + case READ: if (perm.getCanRead()) return true; break; + case WRITE: if (perm.getCanWrite()) return true; break; + case EXECUTE: if (perm.getCanExecute()) return true; break; + } + } + + return false; + } + + /** + * 获取用户可访问的资源ID列表 + */ + public List getAccessibleResources(String userId, int resourceType) { + UserInfo user = getUserInfo(userId); + // ... 类似逻辑 + return resourceIds; + } +} +``` + +### 权限注解 + +```java +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface RequirePermission { + ResourceType resourceType(); + PermissionType permission() default PermissionType.READ; +} + +// 使用示例 +@RequirePermission(resourceType = ResourceType.COURSE, permission = PermissionType.WRITE) +public void updateCourse(String courseId, CourseDTO dto) { + // ... +} +``` + +## ⚠️ 注意事项 + +1. **NULL值处理**:dept_id 和 role_id 为 NULL 时有特殊含义,不能用空字符串代替 +2. **权限优先级**:查询时使用 MAX() 聚合,任一条记录授权即有权限 +3. **索引优化**:已创建组合索引 `idx_resource`,确保查询性能 +4. **软删除**:使用 deleted 字段,避免物理删除导致的问题 +5. **唯一约束**:`uk_resource_dept_role` 防止重复配置,包含 deleted 字段支持重复添加 + +## 🔄 权限变更场景 + +### 场景1:资源从公开改为部门限制 + +```sql +-- 1. 删除原公开权限 +UPDATE tb_resource_permission +SET deleted = 1, delete_time = NOW() +WHERE resource_type = 1 + AND resource_id = 'res_001' + AND dept_id IS NULL AND role_id IS NULL; + +-- 2. 添加部门限制 +INSERT INTO tb_resource_permission VALUES + (UUID(), 1, 'res_001', 'dept_target', NULL, 1, 0, 0, 'admin', NOW()); +``` + +### 场景2:提升用户权限(从只读到读写) + +```sql +-- 更新权限级别 +UPDATE tb_resource_permission +SET can_write = 1, + updater = 'admin', + update_time = NOW() +WHERE resource_type = 2 + AND resource_id = 'course_001' + AND role_id = 'teacher'; +``` + +## 📈 性能优化建议 + +1. **合理使用索引**:已创建的索引包括 `idx_resource`、`idx_dept`、`idx_role` +2. **缓存策略**:对频繁访问的资源权限进行Redis缓存 +3. **批量查询**:使用 IN 子句批量查询多个资源的权限 +4. **避免全表扫描**:查询时务必带上 resource_type 和 resource_id + +## 🔗 相关表说明 + +- `tb_sys_dept`: 部门表 +- `tb_sys_role`: 角色表 +- `tb_sys_user_dept_role`: 用户-部门-角色关联表 +- `tb_resource`: 资源表 +- `tb_course`: 课程表 +- `tb_learning_task`: 学习任务表 + diff --git a/schoolNewsServ/.bin/mysql/sql/表结构汇总.md b/schoolNewsServ/.bin/mysql/sql/表结构汇总.md new file mode 100644 index 0000000..fe056bc --- /dev/null +++ b/schoolNewsServ/.bin/mysql/sql/表结构汇总.md @@ -0,0 +1,157 @@ +# 校园思政新闻平台 - 数据库表结构汇总 + +## 一、用户管理模块(3张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_sys_user | 用户表 | 存储用户账号信息 | id, username, password, email, phone, status | +| tb_sys_user_info | 用户信息表 | 存储用户详细信息 | id, user_id, avatar, full_name, gender, address | +| tb_sys_login_log | 登录日志表 | 记录用户登录历史 | id, user_id, ip_address, login_time, status | + +## 二、权限管理模块(8张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_sys_dept | 部门表 | 组织架构 | id, dept_id, name, parent_id, description | +| tb_sys_role | 角色表 | 系统角色 | id, role_id, name, description | +| tb_sys_dept_role | 部门-角色关联表 | 部门与角色关系 | id, dept_id, role_id | +| tb_sys_user_dept_role | 用户-部门-角色关联表 | 用户在部门中的角色 | id, user_id, dept_id, role_id | +| tb_sys_permission | 权限表 | 系统权限定义 | id, permission_id, name, code, description | +| tb_sys_role_permission | 角色-权限关联表 | 角色拥有的权限 | id, role_id, permission_id | +| tb_sys_menu | 菜单表 | 系统菜单 | id, menu_id, name, parent_id, url, type | +| tb_sys_menu_permission | 菜单-权限关联表 | 菜单访问权限 | id, menu_id, permission_id | + +## 三、资源管理模块(8张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_resource | 资源表 | 新闻/文章资源 | id, title, content, category_id, view_count, status | +| tb_resource_category | 资源分类表 | 资源分类(党史学习等6类) | id, category_id, name, parent_id, order_num | +| tb_banner | Banner表 | 轮播图管理 | id, title, image_url, link_type, link_id, order_num | +| tb_resource_recommend | 资源推荐表 | TOP资源推荐 | id, resource_id, order_num, reason | +| tb_tag | 标签表 | 数据标签 | id, tag_id, name, color, description | +| tb_resource_tag | 资源-标签关联表 | 资源标签关系 | id, resource_id, tag_id | +| tb_data_collection_config | 数据采集配置表 | 数据采集源配置 | id, name, source_url, frequency, status | +| tb_data_collection_log | 数据采集记录表 | 采集日志 | id, config_id, collect_count, status, collect_time | + +## 四、课程管理模块(4张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_course | 课程表 | 课程信息 | id, course_id, name, description, teacher, status | +| tb_course_chapter | 课程章节表 | 课程章节内容 | id, course_id, name, content, video_url, order_num | +| tb_course_tag | 课程-标签关联表 | 课程标签关系 | id, course_id, tag_id | +| tb_course_dept | 课程-部门权限表 | 课程访问权限 | id, course_id, dept_id | + +## 五、学习管理模块(6张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_learning_task | 学习任务表 | 学习计划/任务 | id, task_id, name, description, start_time, end_time | +| tb_task_resource | 任务-资源关联表 | 任务关联的资源 | id, task_id, resource_id, required | +| tb_task_course | 任务-课程关联表 | 任务关联的课程 | id, task_id, course_id, required | +| tb_task_user | 任务-用户表 | 任务接收人员及完成情况 | id, task_id, user_id, status, progress | +| tb_learning_record | 学习记录表 | 详细学习记录 | id, user_id, resource_type, resource_id, duration | +| tb_learning_statistics | 学习统计表 | 按天统计学习数据 | id, user_id, stat_date, total_duration, resource_count | + +## 六、个人中心模块(6张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_user_collection | 用户收藏表 | 收藏的资源/课程 | id, user_id, collection_type, collection_id | +| tb_achievement | 成就表 | 勋章/等级定义 | id, achievement_id, name, type, condition_type | +| tb_user_achievement | 用户-成就关联表 | 用户获得的成就 | id, user_id, achievement_id, obtain_time | +| tb_user_points | 用户积分表 | 用户积分和等级 | id, user_id, total_points, current_points, level | +| tb_points_record | 积分记录表 | 积分变动记录 | id, user_id, points, type, source_type | +| tb_user_browse_record | 用户浏览记录表 | 浏览历史 | id, user_id, browse_type, browse_id, browse_time | + +## 七、智能体模块(6张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_ai_agent_config | 智能体配置表 | AI助手配置 | id, name, system_prompt, model_name, temperature | +| tb_ai_knowledge | 知识库表 | AI知识库内容 | id, title, content, source_type, category | +| tb_ai_conversation | 对话会话表 | 对话会话 | id, user_id, title, status, message_count | +| tb_ai_message | 对话消息表 | 对话消息记录 | id, conversation_id, role, content, token_count | +| tb_ai_upload_file | 上传文件表 | 用户上传的文件 | id, user_id, file_name, file_path, extracted_text | +| tb_ai_usage_statistics | AI使用统计表 | AI使用数据统计 | id, user_id, stat_date, conversation_count, total_tokens | + +## 八、系统管理模块(8张表) + +| 表名 | 中文名 | 说明 | 主要字段 | +|------|--------|------|----------| +| tb_sys_operation_log | 操作日志表 | 用户操作记录 | id, user_id, module, operation, status, create_time | +| tb_sys_config | 系统配置表 | 系统参数配置 | id, config_key, config_value, config_type, config_group | +| tb_sys_visit_statistics | 访问统计表 | 系统访问数据 | id, stat_date, total_visits, active_users | +| tb_sys_notification | 系统通知表 | 用户通知消息 | id, user_id, type, title, content, is_read | +| tb_sys_file | 文件上传记录表 | 文件管理 | id, file_name, file_path, file_size, module | +| tb_sys_dict_type | 数据字典类型表 | 字典类型定义 | id, dict_type, dict_name, description | +| tb_sys_dict_data | 数据字典详情表 | 字典数据项 | id, dict_type, dict_label, dict_value, dict_sort | + +## 数据库统计 + +- **总表数**: 49张表 +- **用户管理**: 3张表 +- **权限管理**: 8张表 +- **资源管理**: 8张表 +- **课程管理**: 4张表 +- **学习管理**: 6张表 +- **个人中心**: 6张表 +- **智能体**: 6张表 +- **系统管理**: 8张表 + +## 表命名规范 + +- 系统表前缀: `tb_sys_` +- 资源相关: `tb_resource_` +- 课程相关: `tb_course_` +- 学习相关: `tb_learning_` 或 `tb_task_` +- 用户相关: `tb_user_` +- AI相关: `tb_ai_` +- 其他业务表: `tb_` + 业务名 + +## 关联关系类型 + +- **1对1**: 用户↔用户信息、用户↔积分 +- **1对多**: 部门↔子部门、课程↔章节、会话↔消息 +- **多对多**: 用户↔角色、资源↔标签、任务↔资源/课程 + +## 数据存储容量评估 + +| 表类型 | 预估数据量 | 存储策略 | +|--------|-----------|----------| +| 用户表 | 1万-10万 | 长期保存 | +| 资源表 | 1万-100万 | 长期保存 | +| 课程表 | 100-10000 | 长期保存 | +| 学习记录 | 10万-1000万 | 按年归档 | +| 日志表 | 100万-1亿 | 按月归档 | +| 浏览记录 | 100万-1亿 | 按季度归档 | +| 对话消息 | 10万-1000万 | 按年归档 | + +## 性能优化建议 + +1. **索引优化**: + - 所有外键字段建立索引 + - 常用查询条件字段建立索引 + - 时间范围查询建立时间索引 + +2. **分表策略**: + - 日志表按月分表 + - 记录表按年分表 + - 统计表按天/月预聚合 + +3. **缓存策略**: + - 系统配置使用Redis缓存 + - 热门资源使用缓存 + - 用户权限信息缓存 + +4. **查询优化**: + - 避免全表扫描 + - 使用分页查询 + - 适当使用冗余字段减少JOIN + +5. **数据归档**: + - 定期归档历史日志 + - 清理过期的浏览记录 + - 备份重要业务数据 + diff --git a/schoolNewsServ/.bin/mysql/使用说明.md b/schoolNewsServ/.bin/mysql/使用说明.md new file mode 100644 index 0000000..ea7c57f --- /dev/null +++ b/schoolNewsServ/.bin/mysql/使用说明.md @@ -0,0 +1,393 @@ +# 数据库初始化使用说明 + +## 目录结构 + +``` +.bin/mysql/ +├── init-database.bat # Windows批处理脚本 +├── init-database.sh # Linux/Mac Shell脚本 +├── 使用说明.md # 本文件 +└── sql/ + ├── createDB.sql # 创建数据库 + ├── createTableUser.sql # 用户相关表 + ├── createTablePermission.sql # 权限相关表 + ├── createTableResource.sql # 资源管理相关表 + ├── createTableCourse.sql # 课程管理相关表 + ├── createTableLearning.sql # 学习管理相关表 + ├── createTableUserCenter.sql # 个人中心相关表 + ├── createTableAI.sql # 智能体相关表 + ├── createTableSystem.sql # 系统配置和日志相关表 + ├── initAll.sql # 一键执行所有SQL + ├── README.md # 表结构详细说明 + ├── 表结构汇总.md # 表结构汇总 + └── ER关系图.md # ER关系图 +``` + +## 快速开始 + +### 方法一:使用自动化脚本(推荐) + +#### Windows环境 + +1. 确保已安装MySQL,并且MySQL命令行工具在系统PATH中 +2. 双击运行 `init-database.bat` +3. 按提示输入MySQL连接信息 +4. 等待初始化完成 + +#### Linux/Mac环境 + +1. 确保已安装MySQL客户端 +2. 给脚本添加执行权限: + ```bash + chmod +x init-database.sh + ``` +3. 运行脚本: + ```bash + ./init-database.sh + ``` +4. 按提示输入MySQL连接信息 +5. 等待初始化完成 + +### 方法二:使用MySQL命令行 + +#### 连接到MySQL + +```bash +mysql -u root -p +``` + +#### 执行初始化脚本 + +```sql +SOURCE /path/to/.bin/mysql/sql/initAll.sql; +``` + +或者在命令行中执行: + +```bash +cd .bin/mysql/sql +mysql -u root -p < createDB.sql +mysql -u root -p < createTableUser.sql +mysql -u root -p < createTablePermission.sql +mysql -u root -p < createTableResource.sql +mysql -u root -p < createTableCourse.sql +mysql -u root -p < createTableLearning.sql +mysql -u root -p < createTableUserCenter.sql +mysql -u root -p < createTableAI.sql +mysql -u root -p < createTableSystem.sql +``` + +### 方法三:使用数据库管理工具 + +使用 Navicat、DBeaver、phpMyAdmin 等数据库管理工具: + +1. 连接到MySQL服务器 +2. 依次执行以下SQL文件: + - createDB.sql + - createTableUser.sql + - createTablePermission.sql + - createTableResource.sql + - createTableCourse.sql + - createTableLearning.sql + - createTableUserCenter.sql + - createTableAI.sql + - createTableSystem.sql + +## 初始化后的验证 + +### 检查数据库是否创建成功 + +```sql +SHOW DATABASES LIKE 'school_news'; +``` + +### 检查表是否创建成功 + +```sql +USE school_news; +SHOW TABLES; +``` + +应该看到约49张表。 + +### 检查默认数据是否插入成功 + +```sql +-- 检查默认用户 +SELECT * FROM tb_sys_user; + +-- 检查默认部门 +SELECT * FROM tb_sys_dept; + +-- 检查默认角色 +SELECT * FROM tb_sys_role; + +-- 检查默认权限 +SELECT * FROM tb_sys_permission; + +-- 检查默认菜单 +SELECT * FROM tb_sys_menu; + +-- 检查资源分类 +SELECT * FROM tb_resource_category; + +-- 检查系统配置 +SELECT * FROM tb_sys_config; + +-- 检查AI配置 +SELECT * FROM tb_ai_agent_config; +``` + +## 默认账号信息 + +### 管理员账号 + +- **用户名**: admin +- **密码**: 对应的bcrypt哈希值已在SQL中,原始密码请查看 createTableUser.sql 文件 +- **邮箱**: 3223905473@qq.com +- **角色**: 管理员 +- **部门**: 超级部门 + +## 常见问题 + +### Q1: 执行脚本时提示 "Access denied" + +**原因**: MySQL用户权限不足 + +**解决方案**: +1. 确保使用的MySQL账号有创建数据库和表的权限 +2. 使用root账号或具有足够权限的账号 + +### Q2: 执行脚本时提示 "Table already exists" + +**原因**: 表已存在 + +**解决方案**: +1. 如果要重新初始化,先删除数据库: + ```sql + DROP DATABASE IF EXISTS school_news; + ``` +2. 然后重新执行初始化脚本 + +### Q3: 中文乱码问题 + +**原因**: 字符集配置问题 + +**解决方案**: +1. 确保MySQL服务器配置了UTF-8字符集 +2. 在my.cnf或my.ini中添加: + ```ini + [client] + default-character-set=utf8mb4 + + [mysql] + default-character-set=utf8mb4 + + [mysqld] + character-set-server=utf8mb4 + collation-server=utf8mb4_general_ci + ``` +3. 重启MySQL服务 + +### Q4: Windows脚本执行时中文显示乱码 + +**原因**: 命令行编码问题 + +**解决方案**: +1. 脚本已包含 `chcp 65001` 命令切换为UTF-8编码 +2. 如果仍有问题,可以在命令行中手动执行: + ```cmd + chcp 65001 + ``` + +### Q5: Linux脚本没有执行权限 + +**原因**: 文件权限问题 + +**解决方案**: +```bash +chmod +x init-database.sh +``` + +### Q6: 执行时提示 "mysql: command not found" + +**原因**: MySQL客户端未安装或不在PATH中 + +**解决方案**: + +**Windows**: +1. 将MySQL的bin目录添加到系统PATH +2. 或使用完整路径执行,例如: + ```cmd + "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root -p + ``` + +**Linux/Mac**: +1. 安装MySQL客户端: + ```bash + # Ubuntu/Debian + sudo apt-get install mysql-client + + # CentOS/RHEL + sudo yum install mysql + + # Mac + brew install mysql-client + ``` + +## 数据库连接配置 + +### JDBC连接字符串 + +``` +jdbc:mysql://localhost:3306/school_news?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true +``` + +### 配置参数说明 + +- `useUnicode=true`: 使用Unicode字符集 +- `characterEncoding=utf8mb4`: 使用UTF-8编码,支持表情符号 +- `useSSL=false`: 禁用SSL(开发环境) +- `serverTimezone=Asia/Shanghai`: 设置时区 +- `allowPublicKeyRetrieval=true`: 允许客户端从服务器获取公钥 + +## 备份与恢复 + +### 备份数据库 + +```bash +mysqldump -u root -p school_news > school_news_backup.sql +``` + +### 恢复数据库 + +```bash +mysql -u root -p school_news < school_news_backup.sql +``` + +### 备份单个表 + +```bash +mysqldump -u root -p school_news tb_sys_user > user_backup.sql +``` + +## 性能优化建议 + +### 1. 配置MySQL参数 + +在 my.cnf 或 my.ini 中: + +```ini +[mysqld] +# InnoDB缓冲池大小(建议设置为服务器内存的50-80%) +innodb_buffer_pool_size = 1G + +# 连接数 +max_connections = 500 + +# 查询缓存(MySQL 8.0已移除) +# query_cache_size = 64M + +# 日志 +slow_query_log = 1 +slow_query_log_file = /var/log/mysql/slow.log +long_query_time = 2 +``` + +### 2. 定期维护 + +```sql +-- 分析表 +ANALYZE TABLE tb_resource; + +-- 优化表 +OPTIMIZE TABLE tb_learning_record; + +-- 修复表 +REPAIR TABLE tb_sys_user; +``` + +### 3. 监控慢查询 + +```sql +-- 查看慢查询日志 +SHOW VARIABLES LIKE 'slow_query_log%'; + +-- 查看长时间查询 +SHOW PROCESSLIST; +``` + +## 数据迁移 + +### 从测试环境迁移到生产环境 + +1. **导出测试环境数据** + ```bash + mysqldump -u root -p --single-transaction --quick school_news > school_news_test.sql + ``` + +2. **在生产环境创建数据库** + ```bash + mysql -u root -p < createDB.sql + ``` + +3. **导入数据** + ```bash + mysql -u root -p school_news < school_news_test.sql + ``` + +4. **验证数据** + ```sql + USE school_news; + SELECT COUNT(*) FROM tb_sys_user; + -- 验证其他关键表 + ``` + +## 开发规范 + +### 1. 表命名规范 +- 系统表:`tb_sys_` 前缀 +- 业务表:`tb_` + 业务名 +- 关联表:`tb_` + 表名1 + `_` + 表名2 + +### 2. 字段命名规范 +- 使用小写字母和下划线 +- 主键统一使用 `id` +- 外键使用 `表名_id` +- 布尔值使用 `is_` 前缀 +- 时间字段使用 `_time` 后缀 + +### 3. 索引命名规范 +- 主键:`pk_表名`(默认) +- 唯一索引:`uk_字段名` +- 普通索引:`idx_字段名` +- 组合索引:`idx_字段1_字段2` + +### 4. 注释规范 +- 所有表必须有注释 +- 所有字段必须有注释 +- 注释使用中文,简洁明了 + +## 文档说明 + +- **README.md**: 详细的表结构说明文档 +- **表结构汇总.md**: 所有表的汇总列表 +- **ER关系图.md**: 表关系图(Mermaid格式) +- **使用说明.md**: 本文件,使用指南 + +## 技术支持 + +如遇到问题,请检查: +1. MySQL版本是否为5.7或更高 +2. 字符集是否为utf8mb4 +3. 是否有足够的权限 +4. SQL文件是否完整 + +## 更新日志 + +### v1.0.0 (2025-10-15) +- 初始版本 +- 创建49张表 +- 包含8个功能模块 +- 添加默认数据和配置 +