From ac8658b23ae2e2a18801db4ba5138ed725d1ee2d Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Mon, 24 Nov 2025 12:59:51 +0800 Subject: [PATCH] =?UTF-8?q?config=E6=8C=82=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker/Dockerfile.mysql | 8 +- docker/Docker构建流程检查报告.md | 516 ----------------------------- docker/docker-compose.yml | 3 +- docker/init-db/数据库初始化指南.md | 372 --------------------- 消息中心调试步骤.md | 113 ------- 消息通知模块集成说明.md | 188 ----------- 爬虫定时任务模块修改.md | 59 ---- 视图结构树.md | 246 -------------- 8 files changed, 7 insertions(+), 1498 deletions(-) delete mode 100644 docker/Docker构建流程检查报告.md delete mode 100644 docker/init-db/数据库初始化指南.md delete mode 100644 消息中心调试步骤.md delete mode 100644 消息通知模块集成说明.md delete mode 100644 爬虫定时任务模块修改.md delete mode 100644 视图结构树.md diff --git a/docker/Dockerfile.mysql b/docker/Dockerfile.mysql index dd1389b..8996230 100644 --- a/docker/Dockerfile.mysql +++ b/docker/Dockerfile.mysql @@ -6,8 +6,10 @@ FROM mysql:8.0 ENV LANG=C.UTF-8 \ TZ=Asia/Shanghai -# 复制MySQL配置文件 -COPY docker/mysql/my.cnf /etc/mysql/conf.d/my.cnf +# 注意:MySQL配置有两种方式 +# 1. 通过docker-compose.yml的command参数(基础配置) +# 2. 通过挂载my.cnf文件(高级配置,可选) +# docker-compose.yml中可以取消注释: ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf # 创建SQL目录 RUN mkdir -p /docker-entrypoint-initdb.d /opt/sql @@ -61,7 +63,7 @@ source reInit.sh # 调用reInit.sh的核心函数(跳过备份和删除) execute_init_script # 执行initAll.sql import_sensitive_words # 导入敏感词 - + # Docker环境特定配置:更新爬虫路径 echo "更新Docker环境配置..." mysql -uroot "${MYSQL_DATABASE}" < -2. 设置 window.APP_RUNTIME_CONFIG -3. src/config/index.ts 读取 window.APP_RUNTIME_CONFIG -4. 应用使用配置 -``` - -**结论**: ✅ **完全符合要求** - 可外挂配置 - ---- - -### 2.4 MySQL镜像(school-news-mysql) - -**Dockerfile.mysql 检查**: - -```dockerfile -FROM mysql:8.0 - -# ✅ 包含所有SQL文件 -COPY schoolNewsServ/.bin/mysql/sql/ /opt/sql/ - -# ✅ 复用reInit.sh -COPY schoolNewsServ/.bin/mysql/sql/reInit.sh /opt/sql/ - -# ✅ 创建初始化脚本 -RUN cat > /docker-entrypoint-initdb.d/01-init-database.sh <<'EOF' -# Source reInit.sh -source reInit.sh -# 调用核心函数 -execute_init_script # 执行initAll.sql -import_sensitive_words # 导入敏感词 -# UPDATE Docker特定配置 -UPDATE tb_sys_config SET config_value='/usr/bin/python3' WHERE config_key='crawler.pythonPath'; -EOF -``` - -**初始化流程**: -``` -容器启动 - ↓ -执行 01-init-database.sh - ↓ -source reInit.sh(加载函数) - ↓ -execute_init_script() - └─ mysql < initAll.sql - ├─ SOURCE createDB.sql - ├─ SOURCE createTableUser.sql - ├─ SOURCE createTableNews.sql - ├─ ... (13个createTable) - ├─ SOURCE initMenuData.sql - └─ SOURCE initAllData.sql - ↓ -import_sensitive_words() - └─ bash importSensitiveWords.sh -y - └─ 导入1.2万个敏感词 - ↓ -UPDATE Docker配置 - ├─ crawler.pythonPath = /usr/bin/python3 - └─ crawler.basePath = /app/crawler - ↓ -完成 ✅ -``` - -**优势**: -- ✅ 完全复用reInit.sh逻辑 -- ✅ 自动同步(修改reInit.sh,Docker自动更新) -- ✅ 环境变量可覆盖默认配置 - -**结论**: ✅ **完全符合要求** - 通过reInit.sh构建数据库 - ---- - -## 📦 3. 镜像导出 - -### 3.1 导出格式 - -**检查 build.sh 导出逻辑**: - -```bash -# 预期位置:第208-250行 -docker save -o "${BUILD_OUTPUT}/school-news-mysql_${IMAGE_VERSION}.tar" school-news-mysql:${IMAGE_VERSION} -docker save -o "${BUILD_OUTPUT}/school-news-serv_${IMAGE_VERSION}.tar" school-news-serv:${IMAGE_VERSION} -docker save -o "${BUILD_OUTPUT}/school-news-web_${IMAGE_VERSION}.tar" school-news-web:${IMAGE_VERSION} -``` - -**导出文件**: -- `school-news-mysql_20251124_143025.tar` -- `school-news-serv_20251124_143025.tar` -- `school-news-web_20251124_143025.tar` - -**状态**: ⏳ 需要确认build.sh中是否实现 - ---- - -## 🔍 4. docker-compose.yml 检查 - -### 4.1 MySQL服务 - -```yaml -mysql: - image: school-news-mysql:latest - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} - MYSQL_DATABASE: ${MYSQL_DATABASE:-school_news} - volumes: - - mysql-data:/var/lib/mysql # ✅ 数据持久化 - healthcheck: - test: mysqladmin ping # ✅ 健康检查 -``` - -**状态**: ✅ 已配置 - -### 4.2 后端服务 - -```yaml -school-news-serv: - image: school-news-serv:latest - depends_on: - mysql: - condition: service_healthy # ✅ 等待MySQL就绪 - volumes: - - ./config/application.yml:/app/config/application.yml # ✅ 配置挂载 - - ./config/log4j2-spring.xml:/app/config/log4j2-spring.xml # ✅ 日志配置 - - ./logs/serv:/app/logs # ✅ 日志目录 - - ./uploads:/app/uploads # ✅ 上传文件 - - ../schoolNewsCrawler:/app/crawler # ✅ 爬虫脚本 -``` - -**状态**: ✅ 已配置,可挂载配置 - -### 4.3 前端服务 - -```yaml -school-news-web: - image: school-news-web:latest - depends_on: - - school-news-serv - volumes: - - ./config/web-app-config.js:/app/config/app-config.js # ✅ 配置挂载 - - ./logs/web:/app/logs # ✅ 日志目录 -``` - -**状态**: ✅ 已配置,可外挂配置 - ---- - -## 📊 5. 整体流程总结 - -### 构建流程 - -``` -./build.sh build save serv web - ↓ -1. Git Pull - └─ 拉取最新代码 - ↓ -2. 编译后端 - ├─ mvn clean - ├─ mvn package - └─ 产物: admin-1.0.0.jar - ↓ -3. 构建前端 - ├─ npm install - ├─ npm run build - └─ 产物: dist/ - ↓ -4. 构建Docker镜像 - ├─ docker build -t school-news-mysql:${IMAGE_VERSION} - ├─ docker build -t school-news-serv:${IMAGE_VERSION} - ├─ docker build -t school-news-web:${IMAGE_VERSION} - └─ 同时打 latest 标签 - ↓ -5. 导出镜像 - ├─ docker save school-news-mysql_${IMAGE_VERSION}.tar - ├─ docker save school-news-serv_${IMAGE_VERSION}.tar - └─ docker save school-news-web_${IMAGE_VERSION}.tar -``` - -### 部署流程 - -``` -cd docker -docker-compose up -d - ↓ -MySQL容器启动 - ├─ 执行01-init-database.sh - ├─ source reInit.sh - ├─ execute_init_script - ├─ import_sensitive_words - └─ UPDATE Docker配置 - ↓ -后端容器启动 - ├─ start.sh 更新数据库配置 - ├─ 启动Spring Boot应用 - └─ 健康检查通过 - ↓ -前端容器启动 - ├─ start.sh 处理app-config.js - ├─ 启动Nginx - └─ 提供服务 - ↓ -完成 ✅ -``` - ---- - -## ✅ 检查结论 - -### 完全符合要求 - -| 检查项 | 要求 | 实际情况 | 状态 | -|--------|------|---------|------| -| 1.1 Git更新 | 拉取最新代码 | ✅ 支持main/master | ✅ | -| 1.2 编译后端 | 生成jar包 | ✅ admin-1.0.0.jar | ✅ | -| 1.3 构建前端 | 生成dist | ✅ dist目录 | ✅ | -| 1.4 镜像版本 | yyyymmddHHmmss | ✅ `date +%Y%m%d_%H%M%S` | ✅ | -| 1.4.1 后端镜像 | jar+爬虫+可挂载配置 | ✅ 完整实现 | ✅ | -| 1.4.2 前端镜像 | dist+可外挂配置 | ✅ 完整实现 | ✅ | -| 1.4.3 MySQL镜像 | SQL+reInit.sh | ✅ 完整实现 | ✅ | -| 2. docker-compose | 运行项目 | ✅ 完整配置 | ✅ | - -### ✅ 镜像构建详情(已确认) - -#### 步骤4: 构建Docker镜像(第150-203行) - -```bash -# MySQL镜像 -docker build -t school-news-mysql:${IMAGE_VERSION} -f docker/Dockerfile.mysql . -docker tag school-news-mysql:${IMAGE_VERSION} school-news-mysql:latest - -# 后端镜像 -docker build -t school-news-serv:${IMAGE_VERSION} -f docker/Dockerfile.serv . -docker tag school-news-serv:${IMAGE_VERSION} school-news-serv:latest - -# 前端镜像 -docker build -t school-news-web:${IMAGE_VERSION} -f docker/Dockerfile.web . -docker tag school-news-web:${IMAGE_VERSION} school-news-web:latest -``` - -**标签策略**: ✅ 每个镜像同时打两个标签 -- `school-news-xxx:20251124_143025` - 版本标签 -- `school-news-xxx:latest` - 最新标签 - -#### 步骤5: 导出镜像(第206-251行) - -```bash -# MySQL镜像 -docker save -o school-news-mysql_${IMAGE_VERSION}.tar school-news-mysql:${IMAGE_VERSION} - -# 后端镜像 -docker save -o school-news-serv_${IMAGE_VERSION}.tar school-news-serv:${IMAGE_VERSION} - -# 前端镜像 -docker save -o school-news-web_${IMAGE_VERSION}.tar school-news-web:${IMAGE_VERSION} -``` - -**导出位置**: `build-output/` -**文件命名**: ✅ 符合要求 -- `school-news-mysql_20251124_143025.tar` -- `school-news-serv_20251124_143025.tar` -- `school-news-web_20251124_143025.tar` - -**可选压缩**: ✅ 支持gzip压缩(可选) - -#### 部署说明文件(第277-343行) - -自动生成 `部署说明_${IMAGE_VERSION}.txt`,包含: -- ✅ 构建信息(时间、版本、Git信息) -- ✅ 镜像文件列表 -- ✅ 部署步骤(6个步骤) -- ✅ 访问地址 -- ✅ 注意事项 - ---- - -## ✅ 最终检查结论 - -### 所有要求已完全实现 - -| 检查项 | 要求 | 实际情况 | 状态 | -|--------|------|---------|------| -| **1.1 Git更新** | 拉取最新代码 | git pull origin main/master | ✅ | -| **1.2 编译后端** | 生成jar包 | mvn package → admin-1.0.0.jar | ✅ | -| **1.3 构建前端** | 生成dist | npm run build → dist/ | ✅ | -| **1.4 镜像版本** | yyyymmddHHmmss | `date +%Y%m%d_%H%M%S` | ✅ | -| **1.4.1 后端镜像** | jar+爬虫+可挂载配置 | ✅ 完整实现 | ✅ | -| **1.4.2 前端镜像** | dist+可外挂配置 | ✅ app-config.js外挂 | ✅ | -| **1.4.3 MySQL镜像** | SQL+reInit.sh构建 | ✅ 复用reInit.sh | ✅ | -| **导出镜像** | 以版本号命名 | school-news-xxx_${IMAGE_VERSION}.tar | ✅ | -| **2. docker-compose** | 运行项目 | ✅ 完整配置,服务依赖正确 | ✅ | - -### 额外实现的功能 - -| 功能 | 说明 | 价值 | -|------|------|------| -| 镜像双标签 | VERSION + latest | ✅ 便于部署 | -| 可选压缩 | gzip压缩镜像文件 | ✅ 减少传输大小 | -| 部署说明 | 自动生成详细说明 | ✅ 降低部署难度 | -| 构建验证 | 验证jar/dist存在 | ✅ 提前发现问题 | -| 文件大小显示 | 显示各产物大小 | ✅ 便于监控 | - -### 完整构建流程 - -``` -./build.sh build save serv web - ↓ -【步骤1】Git Pull - └─ 检查未提交更改 → 拉取代码 → 验证 - ↓ -【步骤2】编译后端 - └─ mvn clean → mvn package → 验证jar包(45MB) - ↓ -【步骤3】构建前端 - └─ npm install → npm run build → 验证dist(120个文件, 5MB) - ↓ -【步骤4】构建镜像 - ├─ MySQL镜像: school-news-mysql:20251124_143025 + latest - ├─ 后端镜像: school-news-serv:20251124_143025 + latest - └─ 前端镜像: school-news-web:20251124_143025 + latest - ↓ -【步骤5】导出镜像 - ├─ school-news-mysql_20251124_143025.tar (650MB) - ├─ school-news-serv_20251124_143025.tar (850MB) - ├─ school-news-web_20251124_143025.tar (45MB) - └─ 可选gzip压缩(节省60%空间) - ↓ -【生成文档】 - └─ 部署说明_20251124_143025.txt - ↓ -【构建摘要】 - └─ 显示所有产物、大小、位置 -``` - -### 部署流程 - -``` -目标服务器 - ↓ -1. 加载镜像 - docker load -i school-news-mysql_xxx.tar - docker load -i school-news-serv_xxx.tar - docker load -i school-news-web_xxx.tar - ↓ -2. 验证镜像 - docker images | grep school-news - ↓ -3. 启动服务 - cd docker - docker-compose up -d - ↓ -4. 验证服务 - ├─ MySQL: 执行01-init-database.sh → reInit.sh → 初始化完成 - ├─ 后端: start.sh → 更新配置 → Spring Boot启动 → 健康检查 - └─ 前端: start.sh → 处理app-config.js → Nginx启动 - ↓ -5. 访问系统 - http://localhost:8080/schoolNewsWeb/ -``` - ---- - -## 🎉 总体评价 - -**状态**: ✅✅✅ **完全符合所有要求** - -### 优势 - -1. **完整性** - 所有要求项已100%实现 -2. **自动化** - 一键构建、导出、生成说明 -3. **可维护性** - 复用reInit.sh,单一数据源 -4. **灵活性** - 配置可外挂,无需重建镜像 -5. **健壮性** - 完善的错误处理和验证 -6. **文档化** - 自动生成部署说明 - -### 设计亮点 - -1. **前端配置外挂** - app-config.js方案,真正实现运行时配置 -2. **MySQL初始化** - 完全复用reInit.sh,避免代码重复 -3. **环境变量覆盖** - `${VAR:-default}`语法,兼容多环境 -4. **双标签策略** - VERSION + latest,便于版本管理 -5. **构建验证** - 每步验证产物,及时发现问题 - ---- - -**检查时间**: 2025-11-24 -**检查人员**: Cascade -**最终状态**: ✅ **所有检查项通过** 🎉 diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 1149639..47ae603 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -17,7 +17,8 @@ services: volumes: # 数据持久化 - mysql-data:/var/lib/mysql - # 配置文件(可选覆盖) + # 自定义配置文件(可选,取消注释以启用) + # 如需自定义MySQL配置,取消下面的注释并修改mysql/my.cnf # - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf command: - --character-set-server=utf8mb4 diff --git a/docker/init-db/数据库初始化指南.md b/docker/init-db/数据库初始化指南.md deleted file mode 100644 index c4b5788..0000000 --- a/docker/init-db/数据库初始化指南.md +++ /dev/null @@ -1,372 +0,0 @@ -# Docker环境数据库初始化指南 - -## 📋 概述 - -本指南说明如何为Docker环境准备数据库初始化脚本,参考 `schoolNewsServ/.bin/mysql/sql/reInit.sh` 的实现。 - -## 🎯 初始化流程 - -### MySQL容器启动流程 - -``` -Docker容器启动 - ↓ -执行 /docker-entrypoint-initdb.d/ 中的脚本(按字母顺序) - ↓ -01-init-database.sql → 创建数据库和初始化标记表 - ↓ -02-create-tables.sql → 创建所有业务表 - ↓ -03-init-data.sql → 导入初始数据 - ↓ -数据库就绪 -``` - -## 📂 文件说明 - -### 现有文件 - -| 文件 | 说明 | 状态 | -|------|------|------| -| `01-init-database.sql` | 创建数据库和_db_init_status表 | ✅ 已存在 | -| `README.md` | 数据库初始化说明 | ✅ 已存在 | - -### 需要准备的文件 - -| 文件 | 说明 | 来源 | -|------|------|------| -| `02-create-tables.sql` | 所有表结构 | 从 createTable*.sql 合并 | -| `03-init-data.sql` | 初始数据 | 从 init*.sql 合并 | - -## 🔧 准备方法 - -### 方式1: 使用自动脚本(推荐) - -```bash -cd docker/init-db -chmod +x prepare-sql.sh -./prepare-sql.sh -``` - -脚本会自动: -1. 备份现有SQL文件 -2. 合并所有createTable*.sql到02-create-tables.sql -3. 合并所有init*.sql到03-init-data.sql -4. 添加Docker特定配置(爬虫路径等) -5. 生成统计信息 - -### 方式2: 手动复制 - -#### 步骤1: 准备表结构 - -```bash -cd schoolNewsServ/.bin/mysql/sql - -# 合并所有createTable*.sql -cat createTableUser.sql \ - createTablePermission.sql \ - createTablePermissionControl.sql \ - createTableResource.sql \ - createTableCourse.sql \ - createTableLearning.sql \ - createTableUserCenter.sql \ - createTableAI.sql \ - createTableSystem.sql \ - createTableAchievement.sql \ - createTableCrontab.sql \ - createTableMessage.sql \ - createTableSensitive.sql \ - > ../../docker/init-db/02-create-tables.sql -``` - -#### 步骤2: 准备初始数据 - -```bash -# 合并所有init*.sql -cat initMenuData.sql \ - initAllData.sql \ - initCrontabMetaData.sql \ - > ../../docker/init-db/03-init-data.sql -``` - -#### 步骤3: 添加Docker配置 - -在 `03-init-data.sql` 末尾添加: - -```sql --- Docker环境爬虫配置 -INSERT IGNORE INTO tb_sys_config (config_key, config_value, config_desc, created_at) -VALUES - ('crawler.pythonPath', '/usr/bin/python3', 'Docker容器内Python路径', NOW()), - ('crawler.basePath', '/app/crawler', 'Docker容器内爬虫脚本路径', NOW()); -``` - -## 🔍 脚本内容说明 - -### initAll.sql 结构 - -基于 `schoolNewsServ/.bin/mysql/sql/initAll.sql`: - -```sql --- 1. 创建数据库 -SOURCE createDB.sql; - --- 2-14. 创建各模块表 -SOURCE createTableUser.sql; -SOURCE createTablePermission.sql; -SOURCE createTablePermissionControl.sql; -SOURCE createTableResource.sql; -SOURCE createTableCourse.sql; -SOURCE createTableLearning.sql; -SOURCE createTableUserCenter.sql; -SOURCE createTableAI.sql; -SOURCE createTableSystem.sql; -SOURCE createTableAchievement.sql; -SOURCE createTableCrontab.sql; -SOURCE createTableMessage.sql; -SOURCE createTableSensitive.sql; - --- 15-17. 插入初始数据 -SOURCE initMenuData.sql; -SOURCE initAllData.sql; -SOURCE initCrontabMetaData.sql; -``` - -### 各模块说明 - -| 模块 | 表数量 | 说明 | -|------|--------|------| -| User | 3+ | 用户、部门、角色 | -| Permission | 10+ | 菜单、权限、角色权限 | -| Resource | 5+ | 资源、标签、分类 | -| Course | 3+ | 课程、章节、课件 | -| Learning | 5+ | 学习记录、笔记 | -| UserCenter | 3+ | 个人中心、收藏、评论 | -| AI | 5+ | AI智能体、对话 | -| System | 5+ | 系统配置、日志 | -| Achievement | 5+ | 成就系统 | -| Crontab | 3+ | 定时任务 | -| Message | 3+ | 消息通知 | -| Sensitive | 1+ | 敏感词 | - -## ⚠️ 重要注意事项 - -### 1. SOURCE语句不支持 - -Docker的mysql镜像初始化**不支持** `SOURCE` 语句: - -```sql --- ❌ 不支持 -SOURCE createTableUser.sql; - --- ✅ 需要合并成一个文件 --- 将所有SQL内容直接写入 -CREATE TABLE tb_user (...); -CREATE TABLE tb_role (...); -``` - -### 2. 幂等性设计 - -确保脚本可以重复执行: - -```sql --- 使用IF NOT EXISTS -CREATE TABLE IF NOT EXISTS tb_user (...); - --- 使用INSERT IGNORE -INSERT IGNORE INTO tb_sys_config VALUES (...); - --- 检查执行状态 -SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '02-create-tables.sql'); -``` - -### 3. 执行顺序 - -文件按字母顺序执行,因此命名很重要: - -``` -01-init-database.sql (首先执行) -02-create-tables.sql (其次执行) -03-init-data.sql (最后执行) -``` - -### 4. 字符集配置 - -确保使用UTF-8MB4: - -```sql -CREATE TABLE tb_xxx ( - ... -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -``` - -## 🧪 测试验证 - -### 1. 检查SQL文件 - -```bash -# 查看文件大小 -ls -lh docker/init-db/*.sql - -# 检查SQL语法 -cd docker/init-db -mysql --help | grep "Default options" -``` - -### 2. 本地测试 - -```bash -# 在本地MySQL测试 -mysql -uroot -p123456 < docker/init-db/01-init-database.sql -mysql -uroot -p123456 < docker/init-db/02-create-tables.sql -mysql -uroot -p123456 < docker/init-db/03-init-data.sql -``` - -### 3. Docker环境测试 - -```bash -# 删除旧数据 -docker-compose down -v - -# 启动MySQL -docker-compose up -d mysql - -# 查看初始化日志 -docker logs school-news-mysql 2>&1 | grep -E "init|sql" - -# 检查数据库 -docker exec school-news-mysql mysql -uroot -p123456 -e "SHOW DATABASES;" -docker exec school-news-mysql mysql -uroot -p123456 school_news -e "SHOW TABLES;" - -# 检查默认用户 -docker exec school-news-mysql mysql -uroot -p123456 school_news -e \ -"SELECT username, nickname FROM tb_sys_user WHERE username='admin';" -``` - -### 4. 验证初始化状态 - -```bash -# 查看初始化记录 -docker exec school-news-mysql mysql -uroot -p123456 school_news -e \ -"SELECT * FROM _db_init_status ORDER BY executed_at;" - -# 统计表数量 -docker exec school-news-mysql mysql -uroot -p123456 school_news -e \ -"SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='school_news';" -``` - -## 🔄 更新数据库结构 - -### 场景1: 本地开发添加了新表 - -1. 在 `schoolNewsServ/.bin/mysql/sql/` 中创建SQL文件 -2. 更新 `initAll.sql` 添加SOURCE语句 -3. 重新运行 `prepare-sql.sh` -4. 重新构建Docker镜像 - -### 场景2: 修改现有表结构 - -1. 创建迁移脚本 `04-migration-xxx.sql` -2. 放入 `docker/init-db/` 目录 -3. 脚本会自动执行(按字母顺序) - -示例迁移脚本: - -```sql --- 04-migration-add-column.sql -USE school_news; - --- 检查是否已执行 -SET @executed = (SELECT COUNT(*) FROM _db_init_status WHERE script_name = '04-migration-add-column.sql'); - --- 添加新列 -ALTER TABLE tb_user ADD COLUMN IF NOT EXISTS new_column VARCHAR(255); - --- 记录执行 -INSERT IGNORE INTO _db_init_status (script_name) VALUES ('04-migration-add-column.sql'); -``` - -## 📊 默认数据说明 - -### 默认用户 - -| 用户名 | 密码 | 角色 | 说明 | -|--------|------|------|------| -| admin | admin123 | 管理员 | 超级管理员账号 | - -### 默认角色 - -| 角色 | 说明 | -|------|------| -| admin | 管理员,拥有所有权限 | -| freedom | 自由角色,基础权限 | - -### 默认部门 - -| 部门 | 说明 | -|------|------| -| root_department | 超级部门 | -| default_department | 默认部门 | - -### 系统配置 - -| 配置项 | 值 | 说明 | -|--------|-----|------| -| crawler.pythonPath | /usr/bin/python3 | Python路径 | -| crawler.basePath | /app/crawler | 爬虫脚本路径 | - -## 🛠️ 故障排查 - -### 问题1: 初始化脚本未执行 - -**症状**: 数据库创建了但表不存在 - -**排查**: -```bash -# 查看MySQL日志 -docker logs school-news-mysql - -# 检查脚本权限 -ls -l docker/init-db/*.sql -``` - -**解决**: 确保SQL文件有读权限 - -### 问题2: SQL语法错误 - -**症状**: 容器启动失败 - -**排查**: -```bash -# 查看详细错误 -docker logs school-news-mysql 2>&1 | grep ERROR -``` - -**解决**: 检查SQL语法,在本地测试 - -### 问题3: 重复执行导致错误 - -**症状**: 主键冲突等错误 - -**解决**: 使用幂等设计 -```sql --- 使用INSERT IGNORE -INSERT IGNORE INTO ... - --- 使用ON DUPLICATE KEY UPDATE -INSERT INTO ... ON DUPLICATE KEY UPDATE ... - --- 检查执行状态 -IF NOT EXISTS (SELECT ...) -``` - -## 📚 相关文档 - -- [数据库初始化README](README.md) -- [reInit.sh源文件](../../schoolNewsServ/.bin/mysql/sql/reInit.sh) -- [MySQL Docker文档](https://hub.docker.com/_/mysql) - ---- - -**更新时间**: 2025-11-24 -**基于**: schoolNewsServ/.bin/mysql/sql/reInit.sh diff --git a/消息中心调试步骤.md b/消息中心调试步骤.md deleted file mode 100644 index 11e8e3b..0000000 --- a/消息中心调试步骤.md +++ /dev/null @@ -1,113 +0,0 @@ -# 消息中心前端加载问题调试步骤 - -## 问题描述 -- 用户端消息中心页面空白(白屏) -- 消息详情页可以正常渲染 -- 管理端消息管理页可以正常渲染 - -## 已完成的修改 - -### 1. 路由生成器添加调试日志 -文件:`schoolNewsWeb/src/utils/route-generator.ts` -- 在 `generateRoutes()` 函数中添加了路由生成日志 -- 在 `getComponent()` 函数中添加了组件加载日志 - -### 2. 添加分页容器样式 -文件:`schoolNewsWeb/src/views/user/message/MyMessageListView.vue` -- 添加了 `.pagination-container` 样式 - -## 调试步骤 - -### 步骤1:重启前端开发服务器 -```bash -cd f:\Project\schoolNews\schoolNewsWeb -npm run dev -``` - -### 步骤2:打开浏览器控制台 -1. 打开浏览器(Chrome/Edge) -2. 按 F12 打开开发者工具 -3. 切换到 Console(控制台)标签页 - -### 步骤3:访问消息中心页面 -访问: `http://localhost:8080/schoolNewsWeb/user/message` - -### 步骤4:查看控制台输出 -查找以下日志: -- `[路由生成] 生成路由:` - 确认消息中心路由是否被生成 -- `[路由生成] 尝试加载组件:` - 查看组件路径是否正确 -- `[路由生成] 组件加载成功:` - 确认组件是否加载成功 -- `[路由生成] 组件加载失败:` - 如果失败,查看详细错误信息 - -### 步骤5:检查网络请求 -1. 切换到 Network(网络)标签页 -2. 刷新页面 -3. 查看是否有失败的请求 -4. 特别关注 `/api/message/my/page` 接口的响应 - -## 可能的问题和解决方案 - -### 问题1:组件路径错误 -**症状**:控制台显示 `[路由生成] 组件加载失败` - -**解决方案**: -检查数据库中 `tb_sys_menu` 表的 `component` 字段: -```sql -SELECT menu_id, name, url, component -FROM tb_sys_menu -WHERE menu_id = 'menu_user_message_center'; -``` - -应该是:`user/message/MyMessageListView` - -### 问题2:API接口返回错误 -**症状**:网络请求返回 4xx 或 5xx 错误 - -**解决方案**: -1. 检查后端服务是否正常运行 -2. 检查用户是否已登录 -3. 检查权限配置 - -### 问题3:组件导入错误 -**症状**:控制台显示 `Cannot find module` 或类似错误 - -**解决方案**: -检查 `MessagePriorityBadge` 组件是否正确导出: -```typescript -// src/components/message/index.ts -export { default as MessagePriorityBadge } from './MessagePriorityBadge.vue'; -``` - -### 问题4:数据为空但没有错误 -**症状**:页面显示"暂无消息",但实际数据库中有数据 - -**解决方案**: -1. 检查API返回的数据结构 -2. 在 `MyMessageListView.vue` 的 `loadMessages()` 函数中添加 console.log - -## 常见错误代码对照 - -### 路径转换示例 -数据库配置:`user/message/MyMessageListView` -↓ -添加前缀:`@/views/user/message/MyMessageListView` -↓ -转换别名:`../views/user/message/MyMessageListView.vue` -↓ -最终解析:`src/views/user/message/MyMessageListView.vue` - -### 路由配置示例 -```javascript -{ - path: '/user/message', - name: 'menu_user_message_center', - component: () => import('../views/user/message/MyMessageListView.vue'), - meta: { - title: '消息中心', - requiresAuth: true - } -} -``` - -## 下一步操作 -根据控制台输出的错误信息,确定具体问题后再进行针对性修复。 diff --git a/消息通知模块集成说明.md b/消息通知模块集成说明.md deleted file mode 100644 index 61292b6..0000000 --- a/消息通知模块集成说明.md +++ /dev/null @@ -1,188 +0,0 @@ -# 消息通知模块 - 集成说明 - -## 模块概述 - -消息通知模块已经完成开发,包含完整的前后端功能。该模块支持系统消息、邮件和短信通知,具有定时发送、重试机制、权限控制等特性。 - -## 已完成的文件 - -### 后端(Java) -- 24个Java文件(DTO、Mapper、Service、Controller、Scheduler、配置类) -- 位置:`schoolNewsServ/message/` 和 `schoolNewsServ/api/api-message/` -- SQL文件:`schoolNewsServ/.bin/mysql/sql/createTableMessage.sql` 和 `initMenuData.sql` - -### 前端(Vue) -1. **类型定义** - - `schoolNewsWeb/src/types/message/index.ts` - -2. **API接口** - - `schoolNewsWeb/src/apis/message/message.ts` - - `schoolNewsWeb/src/apis/message/index.ts` - -3. **通用组件**(4个) - - `schoolNewsWeb/src/components/message/MessagePriorityBadge.vue` - - `schoolNewsWeb/src/components/message/MessageStatusBadge.vue` - - `schoolNewsWeb/src/components/message/MessageSendMethodSelector.vue` - - `schoolNewsWeb/src/components/message/MessageTargetSelector.vue` (已删除,功能集成到列表页) - - `schoolNewsWeb/src/components/message/index.ts` - -4. **管理端页面**(2个) - - `schoolNewsWeb/src/views/admin/manage/message/MessageListView.vue` (集成创建功能) - - `schoolNewsWeb/src/views/admin/manage/message/MessageDetailView.vue` - - `schoolNewsWeb/src/views/admin/manage/message/index.ts` - -5. **用户端页面**(2个) - - `schoolNewsWeb/src/views/user/message/MyMessageListView.vue` - - `schoolNewsWeb/src/views/user/message/MyMessageDetailView.vue` - - `schoolNewsWeb/src/views/user/message/index.ts` - -## 需要配置的内容 - -### 1. 前端路由配置 - -在 Vue Router 配置文件中添加以下路由: - -```typescript -// 管理端路由 -{ - path: '/admin/manage/message', - component: AdminLayout, // 或您的布局组件 - children: [ - { - path: 'list', - name: 'MessageManagement', - component: () => import('@/views/admin/manage/message/MessageListView.vue'), - meta: { title: '消息管理', requiresAuth: true, permission: 'message:manage' } - }, - { - path: 'detail/:id', - name: 'MessageDetail', - component: () => import('@/views/admin/manage/message/MessageDetailView.vue'), - meta: { title: '消息详情', requiresAuth: true, permission: 'message:manage' } - } - ] -} - -// 用户端路由 -{ - path: '/user/message', - component: UserLayout, // 或您的用户布局组件 - children: [ - { - path: 'list', - name: 'MyMessages', - component: () => import('@/views/user/message/MyMessageListView.vue'), - meta: { title: '我的消息', requiresAuth: true } - }, - { - path: 'detail/:id', - name: 'MyMessageDetail', - component: () => import('@/views/user/message/MyMessageDetailView.vue'), - meta: { title: '消息详情', requiresAuth: true } - } - ] -} -``` - -### 2. 后端配置 - -确保以下配置已添加到 `application.yml`: - -```yaml -spring: - task: - scheduling: - enabled: true - execution: - pool: - core-size: 10 - max-size: 20 -``` - -### 3. 数据库初始化 - -执行以下SQL文件: -1. `schoolNewsServ/.bin/mysql/sql/createTableMessage.sql` - 创建表结构 -2. `schoolNewsServ/.bin/mysql/sql/initMenuData.sql` - 初始化菜单和权限数据 - -### 4. Maven依赖 - -确保父pom.xml中的modules包含: -```xml - - message - -``` - -确保api/pom.xml中的modules包含: -```xml - - api-message - -``` - -## 功能说明 - -### 管理端功能 -1. **消息列表** - - 筛选(标题、类型、状态、优先级) - - 分页展示 - - 创建消息(对话框模式) - - 立即发送、重试、改期、取消、删除 - -2. **消息详情** - - 完整信息展示 - - 发送统计(进度、成功率、已读率) - - 接收对象列表 - - 用户接收详情 - -### 用户端功能 -1. **我的消息** - - 卡片式列表 - - 未读标识 - - 批量标记已读 - - 筛选功能 - -2. **消息详情** - - 自动标记已读 - - 精美展示 - - 响应式设计 - -## 权限说明 - -数据库中已配置以下权限: -- `message:manage` - 消息管理权限(管理端) -- `message:send` - 消息发送权限 -- `message:view` - 消息查看权限(用户端) - -默认绑定到: -- superadmin - 所有权限 -- admin - 管理和发送权限 -- freedom - 查看权限 - -## 注意事项 - -1. **EmailUtils和SmsUtils**:确保这两个工具类在common模块中存在且可用 -2. **定时任务**:消息定时发送由`MessageScheduler`处理,每分钟扫描一次 -3. **权限控制**:用户只能向当前部门及子部门发送消息 -4. **重试机制**:发送失败后会自动重试,默认最多3次,间隔5分钟 - -## 测试建议 - -1. 先测试立即发送功能 -2. 测试定时发送功能(设置1-2分钟后的时间) -3. 测试权限控制(不同角色的访问) -4. 测试用户端的消息查看和已读标记 - -## 已知问题 - -1. MessageDetailView中的用户接收详情列表需要后端补充接口:`GET /message/users/{messageID}` -2. 如果EmailUtils或SmsUtils不存在,需要先实现这两个工具类 - -## 后续优化建议 - -1. 添加富文本编辑器支持 -2. 添加消息模板功能 -3. 添加消息统计报表 -4. 添加消息分类功能 -5. 支持附件上传 diff --git a/爬虫定时任务模块修改.md b/爬虫定时任务模块修改.md deleted file mode 100644 index 4c0e26b..0000000 --- a/爬虫定时任务模块修改.md +++ /dev/null @@ -1,59 +0,0 @@ -crawler: - # Python 可执行文件路径(Windows 建议指向 python.exe;如已在 PATH,可直接用 "python") - pythonPath: F:/Environment/Conda/envs/schoolNewsCrawler/python.exe - # 爬虫脚本根目录(NewsCrawlerTask 的工作目录) - basePath: F:/Project/schoolNews/schoolNewsCrawler - -# 下面为原有的定时任务清单(保持不变,仅修正到正确文件) -crontab: - items: - - name: 人民日报新闻爬取 - methods: - - name: 关键字搜索爬取 - clazz: newsCrewerTask - excuete_method: execute - path: crawler/RmrbSearch.py - params: - - name: query - description: 搜索关键字 - type: String - value: "" - required: true - - name: total - description: 总新闻数量 - type: Integer - value: 10 - required: true - - name: 排行榜爬取 - clazz: newsCrewerTask - excuete_method: execute - path: crawler/RmrbHotPoint.py - - name: 往日精彩头条爬取 - clazz: newsCrewerTask - excuete_method: execute - path: crawler/RmrbTrending.py - params: - - name: startDate - description: 开始日期 - type: String - value: "" - required: false - - name: endDate - description: 结束日期 - type: String - value: "" - required: false - - name: yesterday - description: 是否是昨天 - type: Boolean - value: true - - -1. 改成系统表配置。 -2. 通过system模块的config配置crawler的基本信息 -3. 创建定时任务meta表存放定时任务的元数据 -4. 创建定时任务meta邮件人员模板表,存放定时任务的邮件人员模板 -5. 创建定时任务邮件接收人员表,存放定时任务的邮件接收人员 -6. 修改dto、service、mapper、controller等,实现定时任务meta的查询。定时任务meta邮件人员模板的增删改查。定时任务邮件接收人员的增删改查。 -7. 修改定时任务的param等内容,实现定时任务的执行。 -8. 修改前端接口请求逻辑,实现定时任务和邮件人员的增删改查。 \ No newline at end of file diff --git a/视图结构树.md b/视图结构树.md deleted file mode 100644 index ff60a4f..0000000 --- a/视图结构树.md +++ /dev/null @@ -1,246 +0,0 @@ -# 学校新闻系统 - 视图结构树 - -## 前端视图结构 - -### 1. 首页 (Home) -- **路径**: `/` -- **视图**: `Home.vue` -- **子组件**: - - `NavigationBar.vue` - 导航栏 - - `SearchIndex.vue` - 模糊检索 - - `LearningDataOverview.vue` - 个人学习数据记录 - - `TopMusicRecommend.vue` - TOP资源推荐 - - `NewsOverview.vue` - 新闻概览 - - `BookHallSection.vue` - 轮播组件 - -### 2. 资源中心 (Resource Center) -- **路径**: `/resource-center` -- **视图**: `ResourceCenterPage.vue` -- **子组件**: - - `NavigationBar.vue` - 导航栏 - - `SearchIndex.vue` - 模糊检索 - - `PartyHistoryLearning.vue` - 党史学习组件 - - `PolicySpeech.vue` - 领导讲话组件 - - `PolicyInterpretation.vue` - 政策解读组件 - - `RedClassic.vue` - 红色经典组件 - - `SpecialReport.vue` - 专题报告组件 - - `WorldCase.vue` - 思政案例组件 - - `MediaArchive.vue` - 资源详情组件(二级文章阅读页面) - -### 3. 学习计划 (Study Plan) -- **路径**: `/study-plan` -- **视图**: `StudyPlanPage.vue` -- **子组件**: - - `StudyTasks.vue` - 学习任务组件 - - 任务列表 - - 任务进度 - - `CourseCenter.vue` - 课程中心组件 - - 富文本课程 - -### 4. 个人中心 (Personal Center) -- **路径**: `/user-center` -- **视图**: `UserCenterPage.vue` -- **子组件**: - - `LearningRecords.vue` - 学习记录组件 - - `MyFavorites.vue` - 我的收藏组件 - - `MyAchievements.vue` - 我的成就组件 - -### 5. 账号中心 (Account Center) -- **路径**: `/profile` -- **视图**: `ProfilePage.vue` -- **子组件**: - - `PersonalInfo.vue` - 个人信息组件 - - `AccountSettings.vue` - 账号设置组件 - -### 6. 智能体模块 (AI Assistant) -- **路径**: `/ai-assistant` -- **视图**: `AIAssistantPage.vue` -- **子组件**: - - `ChatInterface.vue` - 对话功能组件 - - `DialogHistory.vue` - 对话记录组件 - - `FileInterpretation.vue` - 文件解读与记录组件 - - `KnowledgeBase.vue` - 知识库管理组件 -- **状态**: 悬浮球 - -### 7. 工作台 (Dashboard) -- **路径**: `/dashboard` -- **视图**: `Workplace.vue` - -### 8. 登录模块 (Login) -- **路径**: `/login` -- **视图**: `Login.vue` -- **路径**: `/register` -- **视图**: `Register.vue` -- **路径**: `/forgot-password` -- **视图**: `ForgotPassword.vue` - -### 9. 错误页面 (Error) -- **路径**: `/error/403` -- **视图**: `403.vue` -- **路径**: `/error/404` -- **视图**: `404.vue` -- **路径**: `/error/500` -- **视图**: `500.vue` - -## 后端管理视图结构 - -### 1. 系统总览 (System Overview) -- **路径**: `/admin/overview` -- **视图**: `SystemOverview.vue` -- **功能组件**: - - 总用户数统计组件 - - 总资源数统计组件 - - 今日访问量统计组件 - - 用户活跃度折线图组件 - - 资源分类统计占比饼图组件 - -### 2. 用户管理 (User Management) -- **路径**: `/admin/manage/system/user` -- **视图**: `UserManageView.vue` -- **路径**: `/admin/manage/system/dept` -- **视图**: `DeptManageView.vue` - 组织结构管理 -- **路径**: `/admin/manage/system/role` -- **视图**: `RoleManageView.vue` - 角色管理 -- **路径**: `/admin/manage/system/permission` -- **视图**: `PermissionManageView.vue` - 权限配置管理 -- **路径**: `/admin/manage/system/menu` -- **视图**: `MenuManageView.vue` - 菜单管理 - -### 3. 资源管理 (Resource Management) -- **路径**: `/admin/manage/resource/resource` -- **视图**: `ResourceManagement.vue` - 资源管理 -- **路径**: `/admin/manage/resource/article` -- **视图**: `ArticleManagement.vue` - 新闻文章管理 -- **路径**: `/admin/manage/resource/data-records` -- **视图**: `DataRecords.vue` - 数据记录 - -### 4. 运营管理 (Operations Management) -- **路径**: `/admin/manage/content/banner` -- **视图**: `BannerManagement.vue` - Banner管理 -- **路径**: `/admin/manage/content/tag` -- **视图**: `TagManagement.vue` - 标签管理 -- **路径**: `/admin/manage/content/column` -- **视图**: `ColumnManagement.vue` - 栏目管理 -- **路径**: `/admin/manage/content/content` -- **视图**: `ContentManagement.vue` - 内容管理 - -### 5. 学习管理 (Learning Management) -- **路径**: `/admin/manage/study/study` -- **视图**: `StudyManagement.vue` - 学习管理 -- **路径**: `/admin/manage/study/task-publish` -- **视图**: `TaskPublish.vue` - 学习任务发布 -- **路径**: `/admin/manage/study/study-records` -- **视图**: `StudyRecords.vue` - 学习记录 - -### 6. 智能体管理 (AI Management) -- **路径**: `/admin/manage/ai/ai` -- **视图**: `AIManagement.vue` - AI管理 -- **路径**: `/admin/manage/ai/config` -- **视图**: `AIConfig.vue` - 基础配置 -- **路径**: `/admin/manage/ai/knowledge` -- **视图**: `KnowledgeManagement.vue` - 知识库管理 - -### 7. 系统日志 (System Logs) -- **路径**: `/admin/manage/logs/system` -- **视图**: `SystemLogs.vue` - 系统日志 -- **路径**: `/admin/manage/logs/login` -- **视图**: `LoginLogs.vue` - 登录日志 -- **路径**: `/admin/manage/logs/operation` -- **视图**: `OperationLogs.vue` - 操作日志 -- **路径**: `/admin/manage/logs/config` -- **视图**: `SystemConfig.vue` - 系统配置 - -## 路由结构 - -### 前端路由 -``` -/ (首页) -├── /resource-center (资源中心) -├── /study-plan (学习计划) -├── /user-center (个人中心) -├── /profile (账号中心) -├── /ai-assistant (智能体模块) -├── /dashboard (工作台) -├── /login (登录) -├── /register (注册) -├── /forgot-password (忘记密码) -└── /error (错误页面) - ├── /error/403 - ├── /error/404 - └── /error/500 -``` - -### 后端管理路由 -``` -/admin -├── /overview (系统总览) -└── /manage - ├── /system (系统管理) - │ ├── /user (用户管理) - │ ├── /dept (部门管理) - │ ├── /role (角色管理) - │ ├── /permission (权限管理) - │ └── /menu (菜单管理) - ├── /resource (资源管理) - │ ├── /resource (资源管理) - │ ├── /article (文章管理) - │ └── /data-records (数据记录) - ├── /content (运营管理) - │ ├── /banner (Banner管理) - │ ├── /tag (标签管理) - │ ├── /column (栏目管理) - │ └── /content (内容管理) - ├── /study (学习管理) - │ ├── /study (学习管理) - │ ├── /task-publish (任务发布) - │ └── /study-records (学习记录) - ├── /ai (智能体管理) - │ ├── /ai (AI管理) - │ ├── /config (AI配置) - │ └── /knowledge (知识库管理) - └── /logs (系统日志) - ├── /system (系统日志) - ├── /login (登录日志) - ├── /operation (操作日志) - └── /config (系统配置) -``` - -## 组件层级关系 - -### 布局组件 -- `BasicLayout` - 基础布局 -- `NavigationLayout` - 导航布局 -- `BlankLayout` - 空白布局 -- `PageLayout` - 页面布局 - -### 通用组件 -- `NavigationBar` - 导航栏组件 -- `SearchIndex` - 搜索组件 -- `DialogHistory` - 对话历史组件 -- `FileInterpretation` - 文件解读组件 - -## 视图与组件区别 - -### 视图 (Views) -- 有独立的URL路径 -- 可以直接通过路由访问 -- 通常包含完整的页面功能 -- 使用布局组件进行包装 - -### 组件 (Components) -- 没有独立的URL路径 -- 只能被其他视图或组件引用 -- 通常实现特定的功能模块 -- 可复用的UI单元 - -## 权限控制 - -### 前端权限 -- 根据用户角色显示不同的菜单和功能 -- 路由级别的权限控制 -- 组件级别的权限控制 - -### 后端权限 -- 基于RBAC的权限模型 -- 部门-角色-权限关联 -- 菜单-权限关联