镜像制作

This commit is contained in:
2025-11-24 11:50:15 +08:00
parent 12592c5a24
commit 07bd166257
53 changed files with 3822 additions and 2140 deletions

View File

@@ -1,288 +0,0 @@
# 数据库文件索引
## 📋 文件清单
### 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部署方案
- [ ] 添加自动化测试用例

View File

@@ -1,72 +0,0 @@
#!/bin/bash
echo "====================================================="
echo "校园思政新闻平台数据库初始化脚本"
echo "====================================================="
echo ""
# 设置默认值
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
# 读取用户输入
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密码[默认: 123456]: " input_password
MYSQL_PASSWORD=${input_password:-$MYSQL_PASSWORD}
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 ""

View File

@@ -14,12 +14,12 @@ YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 数据库配置
DB_HOST="localhost"
DB_PORT="3306"
DB_USER="root"
DB_PASSWORD="123456"
DB_NAME="school_news"
# 数据库配置(优先使用环境变量)
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-3306}"
DB_USER="${DB_USER:-root}"
DB_PASSWORD="${DB_PASSWORD:-123456}"
DB_NAME="${DB_NAME:-school_news}"
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
@@ -101,19 +101,6 @@ execute_init_script() {
import_sensitive_words() {
print_message $BLUE "开始导入敏感词数据..."
# 检查conda是否可用
if ! command -v conda &> /dev/null; then
print_message $YELLOW "conda命令未找到跳过敏感词导入"
return 0
fi
# 检查schoolNewsCrawler环境是否存在
if ! conda env list | grep -q "schoolNewsCrawler"; then
print_message $YELLOW "conda环境 'schoolNewsCrawler' 不存在,跳过敏感词导入"
print_message $YELLOW "提示: 可以使用以下命令创建环境: conda create -n schoolNewsCrawler python=3.10"
return 0
fi
# 切换到敏感词脚本目录
local sensitive_dir="$SCRIPT_DIR/sensitiveData"
if [ ! -d "$sensitive_dir" ]; then
@@ -121,25 +108,63 @@ import_sensitive_words() {
return 0
fi
if [ ! -f "$sensitive_dir/writeWord.py" ]; then
print_message $YELLOW "敏感词脚本不存在: $sensitive_dir/writeWord.py"
# 检查Shell脚本是否存在
if [ -f "$sensitive_dir/importSensitiveWords.sh" ]; then
print_message $BLUE "使用Shell脚本导入敏感词"
cd "$sensitive_dir"
# 导出数据库配置环境变量
export DB_HOST="$DB_HOST"
export DB_PORT="$DB_PORT"
export DB_USER="$DB_USER"
export DB_PASSWORD="$DB_PASSWORD"
export DB_NAME="$DB_NAME"
export AUTO_CONFIRM=true
bash importSensitiveWords.sh -y
if [ $? -eq 0 ]; then
print_message $GREEN "敏感词数据导入成功"
else
print_message $YELLOW "敏感词数据导入失败,但不影响系统运行"
fi
cd "$SCRIPT_DIR"
return 0
fi
print_message $BLUE "激活conda环境: schoolNewsCrawler"
cd "$sensitive_dir"
# 使用conda run来在指定环境中执行命令添加-y参数自动确认
conda run -n schoolNewsCrawler python writeWord.py -y
if [ $? -eq 0 ]; then
print_message $GREEN "敏感词数据导入成功"
else
print_message $YELLOW "敏感词数据导入失败,但不影响系统运行"
# 兼容旧的Python脚本如果Shell脚本不存在
if [ -f "$sensitive_dir/writeWord.py" ]; then
print_message $YELLOW "使用Python脚本导入敏感词建议使用Shell版本"
# 检查conda是否可用
if ! command -v conda &> /dev/null; then
print_message $YELLOW "conda命令未找到跳过敏感词导入"
return 0
fi
# 检查schoolNewsCrawler环境是否存在
if ! conda env list | grep -q "schoolNewsCrawler"; then
print_message $YELLOW "conda环境 'schoolNewsCrawler' 不存在,跳过敏感词导入"
return 0
fi
cd "$sensitive_dir"
conda run -n schoolNewsCrawler python writeWord.py -y
if [ $? -eq 0 ]; then
print_message $GREEN "敏感词数据导入成功"
else
print_message $YELLOW "敏感词数据导入失败,但不影响系统运行"
fi
cd "$SCRIPT_DIR"
return 0
fi
# 返回脚本目录
cd "$SCRIPT_DIR"
# 如果两个脚本都不存在
print_message $YELLOW "敏感词导入脚本不存在,跳过导入"
print_message $YELLOW "提示: 可以使用 importSensitiveWords.sh (推荐) 或 writeWord.py"
}
# 验证初始化结果

View File

@@ -0,0 +1,182 @@
#!/bin/bash
##############################################
# 敏感词批量导入脚本 (纯Shell实现)
# 功能:从 sensitive_word_dict.txt 读取敏感词并导入数据库
# 优势不需要Python环境只需要MySQL客户端
##############################################
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 数据库配置
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-3306}"
DB_USER="${DB_USER:-root}"
DB_PASSWORD="${DB_PASSWORD:-123456}"
DB_NAME="${DB_NAME:-school_news}"
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DICT_FILE="${SCRIPT_DIR}/sensitive_word_dict.txt"
echo "=================================================="
echo "敏感词批量导入工具 (Shell版本)"
echo "=================================================="
log_info "数据库: ${DB_HOST}:${DB_PORT}/${DB_NAME}"
log_info "敏感词文件: ${DICT_FILE}"
echo "=================================================="
echo ""
# 检查敏感词文件
if [ ! -f "${DICT_FILE}" ]; then
log_error "敏感词文件不存在: ${DICT_FILE}"
exit 1
fi
# 统计敏感词数量
TOTAL_WORDS=$(grep -v '^$' "${DICT_FILE}" | wc -l)
log_info "检测到 ${TOTAL_WORDS} 个敏感词"
if [ ${TOTAL_WORDS} -eq 0 ]; then
log_warn "敏感词文件为空"
exit 0
fi
# 检查MySQL连接
log_info "检查数据库连接..."
if ! mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" -e "SELECT 1;" &>/dev/null; then
log_error "数据库连接失败"
exit 1
fi
log_info "数据库连接成功"
echo ""
# 确认导入
log_warn "准备导入 ${TOTAL_WORDS} 个敏感词到数据库"
log_warn "这将清除现有的 deny 类型敏感词"
echo ""
# 检查是否是自动模式(通过 -y 参数或环境变量)
AUTO_CONFIRM=${AUTO_CONFIRM:-false}
if [ "$1" = "-y" ] || [ "$1" = "--yes" ] || [ "${AUTO_CONFIRM}" = "true" ]; then
log_info "自动确认模式,开始导入..."
else
read -p "是否继续?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_warn "用户取消导入"
exit 0
fi
fi
echo ""
# 开始导入
log_info "开始导入敏感词..."
START_TIME=$(date +%s)
# 创建临时SQL文件
TEMP_SQL=$(mktemp)
trap "rm -f ${TEMP_SQL}" EXIT
# 生成SQL语句
log_info "生成SQL语句..."
cat > "${TEMP_SQL}" <<EOF
-- 敏感词批量导入
USE ${DB_NAME};
-- 设置字符集
SET NAMES utf8mb4;
-- 清除现有的deny类型敏感词
DELETE FROM tb_sensitive_word WHERE type = 'deny';
-- 批量插入敏感词
INSERT INTO tb_sensitive_word (word, type) VALUES
EOF
# 读取敏感词并生成INSERT语句
COUNTER=0
while IFS= read -r word || [ -n "$word" ]; do
# 跳过空行
[ -z "$word" ] && continue
# 转义单引号
word=$(echo "$word" | sed "s/'/''/g")
COUNTER=$((COUNTER + 1))
# 添加到SQL最后一个不加逗号
if [ $COUNTER -eq ${TOTAL_WORDS} ]; then
echo "('${word}', 'deny');" >> "${TEMP_SQL}"
else
echo "('${word}', 'deny')," >> "${TEMP_SQL}"
fi
# 进度提示每1000个
if [ $((COUNTER % 1000)) -eq 0 ]; then
log_info "已处理 ${COUNTER}/${TOTAL_WORDS} 个敏感词..."
fi
done < "${DICT_FILE}"
# 添加查询语句
cat >> "${TEMP_SQL}" <<EOF
-- 验证导入结果
SELECT COUNT(*) AS '导入数量' FROM tb_sensitive_word WHERE type = 'deny';
EOF
log_info "SQL语句生成完成${COUNTER}个敏感词)"
echo ""
# 执行SQL
log_info "执行数据库导入..."
if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" < "${TEMP_SQL}"; then
END_TIME=$(date +%s)
DURATION=$((END_TIME - START_TIME))
echo ""
echo "=================================================="
log_info "导入完成!"
log_info "成功导入: ${COUNTER} 个敏感词"
log_info "耗时: ${DURATION}"
echo "=================================================="
else
log_error "数据库导入失败"
exit 1
fi
# 验证结果
log_info "验证导入结果..."
IMPORTED_COUNT=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASSWORD}" -D"${DB_NAME}" -sNe \
"SELECT COUNT(*) FROM tb_sensitive_word WHERE type = 'deny';")
echo ""
log_info "数据库中当前有 ${IMPORTED_COUNT} 个 deny 类型敏感词"
if [ "${IMPORTED_COUNT}" -eq "${COUNTER}" ]; then
log_info "✅ 验证通过:导入数量与预期一致"
else
log_warn "⚠️ 导入数量不匹配:预期 ${COUNTER},实际 ${IMPORTED_COUNT}"
fi
echo ""
log_info "敏感词导入完成!"

View File

@@ -1,393 +0,0 @@
# 数据库初始化使用说明
## 目录结构
```
.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个功能模块
- 添加默认数据和配置

View File

@@ -1,64 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "LoginDomain",
"description": "登录域对象",
"type": "object",
"properties": {
"user": {
"description": "用户信息",
"example": null
},
"userInfo": {
"description": "用户详细信息",
"example": null
},
"roles": {
"type": "array",
"description": "用户角色列表",
"items": {},
"example": []
},
"permissions": {
"type": "array",
"description": "用户权限列表",
"items": {},
"example": []
},
"menus": {
"type": "array",
"description": "用户菜单列表",
"items": {},
"example": []
},
"token": {
"type": "string",
"description": "JWT令牌",
"example": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"tokenExpireTime": {
"type": "string",
"format": "date-time",
"description": "令牌过期时间",
"example": "2025-10-06T16:00:00Z"
},
"loginTime": {
"type": "string",
"format": "date-time",
"description": "登录时间",
"example": "2025-10-05T16:00:00Z"
},
"ipAddress": {
"type": "string",
"format": "ipv4",
"description": "登录IP地址",
"example": "192.168.1.100"
},
"loginType": {
"type": "string",
"description": "登录类型",
"enum": ["email", "username", "phone", "wechat"],
"example": "username"
}
},
"required": ["token", "loginTime", "loginType"]
}

View File

@@ -1,56 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "LoginParam",
"description": "登录参数",
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "邮箱",
"example": "user@example.com"
},
"username": {
"type": "string",
"description": "用户名",
"minLength": 1,
"maxLength": 50,
"example": "admin"
},
"phone": {
"type": "string",
"pattern": "^1[3-9]\\d{9}$",
"description": "手机号",
"example": "13800138000"
},
"wechatID": {
"type": "string",
"description": "微信ID",
"example": "wx_123456789"
},
"password": {
"type": "string",
"description": "密码",
"minLength": 6,
"maxLength": 20,
"example": "123456"
},
"captcha": {
"type": "string",
"description": "验证码",
"example": "1234"
},
"loginType": {
"type": "string",
"description": "登录类型",
"enum": ["email", "username", "phone", "wechat"],
"example": "username"
},
"rememberMe": {
"type": "boolean",
"description": "记住我",
"example": false
}
},
"required": ["password", "loginType"]
}

View File

@@ -1,38 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "BaseDTO",
"description": "基础数据传输对象",
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "主键ID",
"example": "1234567890123456789"
},
"createTime": {
"type": "string",
"format": "date-time",
"description": "创建时间",
"example": "2025-10-05T16:00:00Z"
},
"updateTime": {
"type": "string",
"format": "date-time",
"description": "更新时间",
"example": "2025-10-05T16:30:00Z"
},
"deleteTime": {
"type": "string",
"format": "date-time",
"description": "删除时间",
"example": null
},
"deleted": {
"type": "boolean",
"description": "是否删除",
"default": false,
"example": false
}
},
"required": ["id", "createTime", "updateTime", "deleted"]
}

View File

@@ -1,50 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysDept",
"description": "系统部门信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"deptID": {
"type": "string",
"description": "部门ID",
"example": "1234567890123456789"
},
"parentID": {
"type": "string",
"description": "父部门ID",
"example": "1234567890123456789"
},
"name": {
"type": "string",
"description": "部门名称",
"minLength": 1,
"maxLength": 50,
"example": "技术部"
},
"description": {
"type": "string",
"description": "部门描述",
"maxLength": 200,
"example": "技术开发部门"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["deptID", "name"]
}
]
}

View File

@@ -1,37 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysDeptRole",
"description": "部门角色关联信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"deptID": {
"type": "string",
"description": "部门ID",
"example": "1234567890123456789"
},
"roleID": {
"type": "string",
"description": "角色ID",
"example": "1234567890123456789"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["deptID", "roleID"]
}
]
}

View File

@@ -1,76 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysLoginLog",
"description": "系统登录日志信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"userID": {
"type": "string",
"description": "用户ID",
"example": "1234567890123456789"
},
"username": {
"type": "string",
"description": "用户名",
"example": "admin"
},
"ipAddress": {
"type": "string",
"format": "ipv4",
"description": "登录IP地址",
"example": "192.168.1.100"
},
"ipSource": {
"type": "string",
"description": "IP来源",
"example": "北京市"
},
"browser": {
"type": "string",
"description": "浏览器类型",
"example": "Chrome"
},
"os": {
"type": "string",
"description": "操作系统",
"example": "Windows 10"
},
"password": {
"type": "string",
"description": "登录密码",
"example": "******"
},
"loginTime": {
"type": "string",
"format": "date-time",
"description": "登录时间",
"example": "2025-10-05T16:00:00Z"
},
"status": {
"type": "integer",
"description": "登录状态(0-失败,1-成功)",
"enum": [0, 1],
"example": 1
},
"errorCount": {
"type": "integer",
"description": "错误次数",
"minimum": 0,
"example": 0
},
"message": {
"type": "string",
"description": "登录消息",
"example": "登录成功"
}
},
"required": ["userID", "username", "ipAddress", "loginTime", "status"]
}
]
}

View File

@@ -1,72 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysMenu",
"description": "系统菜单信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"menuID": {
"type": "string",
"description": "菜单ID",
"example": "1234567890123456789"
},
"parentID": {
"type": "string",
"description": "父菜单ID",
"example": "1234567890123456789"
},
"name": {
"type": "string",
"description": "菜单名称",
"minLength": 1,
"maxLength": 50,
"example": "用户管理"
},
"description": {
"type": "string",
"description": "菜单描述",
"maxLength": 200,
"example": "用户管理菜单"
},
"url": {
"type": "string",
"description": "菜单URL",
"example": "/user/manage"
},
"icon": {
"type": "string",
"description": "菜单图标",
"example": "user"
},
"orderNum": {
"type": "integer",
"description": "菜单顺序",
"minimum": 0,
"example": 1
},
"type": {
"type": "integer",
"description": "菜单类型(0-目录,1-菜单,2-按钮)",
"enum": [0, 1, 2],
"example": 1
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["menuID", "name", "type"]
}
]
}

View File

@@ -1,37 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysMenuPermission",
"description": "菜单权限关联信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"menuID": {
"type": "string",
"description": "菜单ID",
"example": "1234567890123456789"
},
"permissionID": {
"type": "string",
"description": "权限ID",
"example": "1234567890123456789"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["menuID", "permissionID"]
}
]
}

View File

@@ -1,52 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysPermission",
"description": "系统权限信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"permissionID": {
"type": "string",
"description": "权限ID",
"example": "1234567890123456789"
},
"name": {
"type": "string",
"description": "权限名称",
"minLength": 1,
"maxLength": 50,
"example": "用户管理"
},
"description": {
"type": "string",
"description": "权限描述",
"maxLength": 200,
"example": "用户管理权限"
},
"code": {
"type": "string",
"description": "权限编码",
"minLength": 1,
"maxLength": 50,
"example": "user:manage"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["permissionID", "name", "code"]
}
]
}

View File

@@ -1,45 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysRole",
"description": "系统角色信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"roleID": {
"type": "string",
"description": "角色ID",
"example": "1234567890123456789"
},
"name": {
"type": "string",
"description": "角色名称",
"minLength": 1,
"maxLength": 50,
"example": "管理员"
},
"description": {
"type": "string",
"description": "角色描述",
"maxLength": 200,
"example": "系统管理员角色"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["roleID", "name"]
}
]
}

View File

@@ -1,37 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysRolePermission",
"description": "角色权限关联信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"roleID": {
"type": "string",
"description": "角色ID",
"example": "1234567890123456789"
},
"permissionID": {
"type": "string",
"description": "权限ID",
"example": "1234567890123456789"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["roleID", "permissionID"]
}
]
}

View File

@@ -1,54 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysUser",
"description": "系统用户信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"username": {
"type": "string",
"description": "用户名",
"minLength": 1,
"maxLength": 50,
"example": "admin"
},
"password": {
"type": "string",
"description": "密码",
"minLength": 6,
"maxLength": 20,
"example": "123456"
},
"email": {
"type": "string",
"format": "email",
"description": "邮箱",
"example": "admin@example.com"
},
"phone": {
"type": "string",
"pattern": "^1[3-9]\\d{9}$",
"description": "手机号",
"example": "13800138000"
},
"wechatID": {
"type": "string",
"description": "微信号",
"example": "wx_123456789"
},
"status": {
"type": "integer",
"description": "用户状态",
"enum": [0, 1],
"example": 1
}
},
"required": ["username", "password", "email", "phone", "status"]
}
]
}

View File

@@ -1,63 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysUserInfo",
"description": "用户详细信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"userID": {
"type": "string",
"description": "用户ID",
"example": "1234567890123456789"
},
"avatar": {
"type": "string",
"description": "头像",
"example": "https://example.com/avatar.jpg"
},
"gender": {
"type": "integer",
"description": "性别(0-未知,1-女,2-男)",
"enum": [0, 1, 2],
"example": 1
},
"familyName": {
"type": "string",
"description": "姓",
"maxLength": 50,
"example": "张"
},
"givenName": {
"type": "string",
"description": "名",
"maxLength": 50,
"example": "三"
},
"fullName": {
"type": "string",
"description": "全名",
"maxLength": 100,
"example": "张三"
},
"idCard": {
"type": "string",
"description": "身份证号",
"pattern": "^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$",
"example": "110101199001011234"
},
"address": {
"type": "string",
"description": "地址",
"maxLength": 200,
"example": "北京市朝阳区"
}
},
"required": ["userID"]
}
]
}

View File

@@ -1,37 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "TbSysUserRole",
"description": "用户角色关联信息",
"type": "object",
"allOf": [
{
"$ref": "BaseDTO.json"
},
{
"type": "object",
"properties": {
"userID": {
"type": "string",
"description": "用户ID",
"example": "1234567890123456789"
},
"roleID": {
"type": "string",
"description": "角色ID",
"example": "1234567890123456789"
},
"creator": {
"type": "string",
"description": "创建人",
"example": "admin"
},
"updater": {
"type": "string",
"description": "更新人",
"example": "admin"
}
},
"required": ["userID", "roleID"]
}
]
}

View File

@@ -1,19 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "PageDomain",
"description": "分页数据实体类",
"type": "object",
"properties": {
"pageParam": {
"$ref": "PageParam.json",
"description": "分页参数"
},
"dataList": {
"type": "array",
"description": "数据列表",
"items": {},
"example": []
}
},
"required": ["pageParam", "dataList"]
}

View File

@@ -1,36 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "PageParam",
"description": "分页参数",
"type": "object",
"properties": {
"pageNumber": {
"type": "integer",
"description": "当前页码",
"minimum": 1,
"default": 1,
"example": 1
},
"pageSize": {
"type": "integer",
"description": "每页显示数量",
"minimum": 1,
"maximum": 1000,
"default": 10,
"example": 10
},
"totalPages": {
"type": "integer",
"description": "总页数",
"minimum": 0,
"example": 5
},
"totalElements": {
"type": "integer",
"description": "总记录数",
"minimum": 0,
"example": 50
}
},
"required": ["pageNumber", "pageSize", "totalPages", "totalElements"]
}

View File

@@ -1,99 +0,0 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "ResultDomain",
"description": "统一返回结果实体类",
"type": "object",
"properties": {
"code": {
"type": "integer",
"description": "状态码",
"example": 200
},
"message": {
"type": "string",
"description": "返回消息",
"example": "操作成功"
},
"success": {
"type": "boolean",
"description": "操作是否成功",
"example": true
},
"login": {
"type": "boolean",
"description": "是否登录",
"example": true
},
"auth": {
"type": "boolean",
"description": "是否有权限",
"example": true
},
"data": {
"description": "返回数据",
"example": null
},
"dataList": {
"type": "array",
"description": "返回数据列表",
"items": {},
"example": []
},
"pageParam": {
"$ref": "#/definitions/PageParam",
"description": "分页参数"
},
"pageDomain": {
"$ref": "#/definitions/PageDomain",
"description": "分页信息"
}
},
"required": ["code", "message", "success", "login", "auth"],
"definitions": {
"PageParam": {
"type": "object",
"properties": {
"pageNumber": {
"type": "integer",
"description": "当前页码",
"minimum": 1,
"example": 1
},
"pageSize": {
"type": "integer",
"description": "每页显示数量",
"minimum": 1,
"example": 10
},
"totalPages": {
"type": "integer",
"description": "总页数",
"minimum": 0,
"example": 5
},
"totalElements": {
"type": "integer",
"description": "总记录数",
"minimum": 0,
"example": 50
}
},
"required": ["pageNumber", "pageSize", "totalPages", "totalElements"]
},
"PageDomain": {
"type": "object",
"properties": {
"pageParam": {
"$ref": "#/definitions/PageParam",
"description": "分页参数"
},
"dataList": {
"type": "array",
"description": "数据列表",
"items": {}
}
},
"required": ["pageParam", "dataList"]
}
}
}

View File

@@ -1,139 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
校园新闻管理系统 - 统一日志配置模板
-->
<configuration status="WARN" monitorInterval="30">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期%thread表示线程名%-5level级别从左显示5个字符宽度 %msg日志消息%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="./logs" />
<!-- 模块日志文件名 -->
<property name="FILE_NAME" value="school-news-MODULE_NAME" />
<!-- 设置系统属性 -->
<property name="file.encoding" value="UTF-8" />
<property name="console.encoding" value="UTF-8" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<!--控制台输出debug及以上级别的信息-->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息这个log每次运行程序会自动清空由append属性决定适合临时测试用-->
<File name="Filelog" fileName="${FILE_PATH}/${FILE_NAME}-test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息每次大小超过size则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息onMatch其他的直接拒绝onMismatch-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
<Policies>
<!--interval属性用来指定多久滚动一次默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers只有定义了logger并引入的appenderappender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false则 子Logger 只会在自己的appender里输出不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- 项目包日志配置 - Auth模块 -->
<Logger name="org.xyzh.auth" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="Filelog"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Logger>
<!-- 项目包日志配置 - System模块 -->
<Logger name="org.xyzh.system" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="Filelog"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Logger>
<!-- 项目包日志配置 - News模块 -->
<Logger name="org.xyzh.news" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="Filelog"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Logger>
<!-- 项目包日志配置 - Common模块 -->
<Logger name="org.xyzh.common" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="Filelog"/>
<AppenderRef ref="RollingFileInfo"/>
<AppenderRef ref="RollingFileWarn"/>
<AppenderRef ref="RollingFileError"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>

View File

@@ -1,262 +0,0 @@
# 校园思政新闻平台 - 快速开始
## 📦 项目结构
```
school-news/
├── admin/ # 管理后台入口
├── api/ # API接口定义
│ ├── api-all/
│ ├── api-auth/
│ └── api-system/
├── auth/ # 认证模块
├── system/ # 系统管理模块(用户、权限、部门等)
├── news/ # 资源/新闻管理模块
├── study/ # 学习管理模块 🆕
├── usercenter/ # 个人中心模块 🆕
├── ai/ # 智能体模块 🆕
└── common/ # 公共模块
├── common-all/
├── common-annotation/
├── common-core/
├── common-dto/
├── common-exception/
├── common-jdbc/
├── common-redis/
└── common-util/
```
## 🚀 快速开始
### 1. 环境要求
- **JDK**: 21+
- **Maven**: 3.8+
- **MySQL**: 8.0+
- **Redis**: 6.0+ (可选)
### 2. 数据库初始化
#### Windows环境
```cmd
cd .bin/mysql
init-database.bat
```
#### Linux/Mac环境
```bash
cd .bin/mysql
chmod +x init-database.sh
./init-database.sh
```
#### 手动执行
```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 < createTablePermissionControl.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
```
### 3. 配置数据库连接
修改各模块的 `application.yml`
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/school_news
username: root
password: your_password
```
### 4. 编译项目
```bash
mvn clean install
```
### 5. 启动服务
各模块端口分配:
- **admin**: 8080 (管理后台入口)
- **auth**: 8082 (认证服务)
- **system**: 8081 (系统管理)
- **study**: 8084 (学习管理) 🆕
- **usercenter**: 8085 (个人中心) 🆕
- **ai**: 8086 (智能体) 🆕
启动顺序建议:
1. auth (认证服务)
2. system (系统管理)
3. 其他业务模块
### 6. 访问系统
- **管理后台**: http://localhost:8080
- **默认账号**: admin
- **默认密码**: 查看 `.bin/mysql/sql/createTableUser.sql`
## 📋 模块功能说明
### system (系统管理) - 已有
- 用户管理
- 部门管理
- 角色管理
- 权限管理
- 菜单管理
### news (资源/新闻) - 待扩展
- 资源管理
- 分类管理
- Banner管理
- 推荐管理
- 标签管理
- 数据采集
### study (学习管理) - 新建 🆕
- 学习任务
- 任务分配
- 学习记录
- 学习统计
- 课程管理
- 章节管理
- 课程标签
- 权限控制
### usercenter (个人中心) - 新建 🆕
- 用户收藏
- 成就系统
- 积分系统
- 浏览记录
### ai (智能体) - 新建 🆕
- AI对话
- 知识库
- 文件问答
- 对话历史
## 🔧 开发指南
### 新增接口步骤
1. **定义API接口** (在api模块)
```java
// api-course/src/main/java/org/xyzh/api/course/CourseApi.java
public interface CourseApi {
@GetMapping("/course/list")
Object getCourseList(...);
}
```
2. **创建DTO** (在common-dto)
```java
// common/common-dto/src/main/java/org/xyzh/common/dto/course/TbCourse.java
public class TbCourse extends BaseDTO {
private String courseID;
private String name;
// ...
}
```
3. **创建Mapper** (在业务模块)
```java
// course/src/main/java/org/xyzh/course/mapper/CourseMapper.java
@Mapper
public interface CourseMapper extends BaseMapper<TbCourse> {
}
```
4. **创建Service** (在业务模块)
```java
// course/src/main/java/org/xyzh/course/service/CourseService.java
public interface CourseService {
}
// course/src/main/java/org/xyzh/course/service/impl/CourseServiceImpl.java
@Service
public class CourseServiceImpl implements CourseService {
}
```
5. **创建Controller** (在业务模块)
```java
// course/src/main/java/org/xyzh/course/controller/CourseController.java
@RestController
@RequestMapping("/course")
public class CourseController implements CourseApi {
}
```
### 权限控制使用
详见:[权限控制使用说明](.bin/mysql/sql/权限控制使用说明.md)
基本用法:
```java
// 检查用户对资源的权限
SELECT can_read, can_write, can_execute
FROM tb_resource_permission
WHERE resource_type = 2 -- 课程
AND resource_id = 'course_001'
AND (dept_id IS NULL OR dept_id = '用户部门')
AND (role_id IS NULL OR role_id IN ('用户角色'))
AND deleted = 0;
```
## 📚 参考文档
### 数据库相关
- [表结构详细说明](.bin/mysql/sql/README.md)
- [表结构汇总](.bin/mysql/sql/表结构汇总.md)
- [ER关系图](.bin/mysql/sql/ER关系图.md)
- [使用说明](.bin/mysql/使用说明.md)
### 开发相关
- [模块创建完整指南](.doc/模块创建完整指南.md)
- [模块创建进度](.doc/模块创建进度.md)
- [需求文档](.doc/需求文档.md)
## ⚠️ 注意事项
1. **数据库编码**: 使用 utf8mb4
2. **主键生成**: 使用 UUID
3. **软删除**: 所有表使用 deleted 字段
4. **日志**: 使用 Log4j2不要用 Logback
5. **权限**: 所有资源需配置权限控制
## 🐛 常见问题
### Q1: 启动时提示端口被占用
**A**: 修改对应模块的 `application.yml` 中的 `server.port`
### Q2: 数据库连接失败
**A**: 检查 MySQL 服务是否启动,用户名密码是否正确
### Q3: MyBatis找不到Mapper
**A**: 检查 `mybatis-plus.mapper-locations` 配置是否正确
### Q4: 权限检查失败
**A**: 确保在 `tb_resource_permission` 表中配置了相应的权限记录
## 📞 技术支持
遇到问题请参考:
1. 项目根目录下的 `.doc/` 文档
2. 数据库 SQL 脚本中的注释
3. 代码中的 JavaDoc 注释
## 🎯 后续计划
- [ ] 完成所有模块的业务代码
- [ ] 添加单元测试
- [ ] 集成Swagger文档
- [ ] 添加Redis缓存
- [ ] 性能优化
- [ ] 安全加固

View File

@@ -1,52 +0,0 @@
# (一)前端功能清单
| 模块 | 功能点 | 详细描述 |
|------|--------|----------|
| 登录页面 | 登录认证与风格设计 | 支持对接院校教务系统、统一身份认证平台,页面配色、布局契合学校风格,嵌入校徽,展示学校名称 |
| 首页 | 轮播组件 | 自动轮播核心新闻,支持手动切换,点击跳转新闻详情 |
| | TOP 资源推荐 | 按浏览数据展示高热度新闻,支持后台调控展示顺序与内容 |
| | 思政新闻概览 | 以卡片形式展示新闻标题、发布时间、简介,点击跳转二级详情页 |
| | 顶部菜单栏 | 包含首页、资源中心、学习计划、专题活动、红色常信,支持后台修改菜单名称 |
| | 模糊检索 | 输入关键词实时匹配资源(新闻、课程),展示检索结果 |
| 资源中心 | 专项分栏 | 包含党史学习、领导讲话、政策解读、红色经典、专题报告、思政案例 6 个分栏,各分栏展示对应资源 |
| | 资源检索 | 支持模糊关键词检索,快速定位资源 |
| | 资源详情 | 展示资源完整内容(文字、图片),支持收藏 |
| 学习计划 | 计划列表 | 展示校方统一发布的学习计划(名称、起止时间、任务描述) |
| | 任务进度 | 展示当前用户的学习任务(已完成 / 未完成),用进度条显示完成百分比 |
| 个人中心 | 个人信息 | 查看 / 编辑姓名、部门、联系方式等信息,支持头像上传 |
| | 我的收藏 | 展示收藏的资源列表,支持取消收藏、快速跳转资源详情 |
| | 学习记录 | 用折线图展示每日学习时长,柱状图展示各资源学习次数,支持时间筛选(周 / 月) |
| | 我的成就 | 展示学习获得的勋章、等级,显示成就获取条件 |
| | 账号设置 | 支持修改密码、绑定手机号 / 邮箱,设置账号注销申请 |
| 智能体模块 | 悬浮组件 | "思政小帮手" 悬浮在页面右侧,支持展开 / 收起 |
| | 对话功能 | 输入问题后,结合算法与知识库返回简洁回答,支持多轮对话 |
| | 文件解读与记录 | 支持上传文件进行问答解读,上传文件存储到系统数据中 |
| | 对话记录 | 记录历史对话内容,支持查看、清空对话记录 |
# (二)后端功能清单
| 模块 | 功能点 | 详细描述 |
|------|--------|----------|
| 系统总览 | 数据统计 | 统计系统总用户数、资源总数、今日访问量,实时更新 |
| | 可视化图表 | 活跃图(折线图,展示 7/30 天活跃用户数)、资源分类统计(饼图,展示各类型资源占比)、用户活跃度 |
| 用户管理 | 组织结构维护 | 支持添加 / 删除 / 修改部门,设置部门层级 |
| | 用户管理 | 支持添加 / 编辑 / 禁用用户,录入用户基本信息,支持密码重置 |
| | 权限管理 | 划分普通用户、系统管理员角色,分配功能操作权限(如资源编辑、用户管理),支持多租户数据隔离(不同租户只能查看自身数据) |
| 系统日志 | 登录日志 | 记录用户登录账号、登录时间、登录状态,支持按时间 / 账号筛选查询 |
| | 操作日志 | 记录用户操作模块、操作内容、操作时间、操作结果,支持导出日志 |
| | 系统配置 | 支持配置顶部菜单名称、平台 logo上传图片、平台名称实时生效 |
| 资源管理 | 数据采集 | 配置采集来源、采集频率(天/周协助采集10000 条资源数据,支持手动触发采集 |
| | 文章编辑 | 支持手动新建文章(富文本编辑器,插入图片/链接)、编辑文章内容、删除文章,设置文章状态(草稿/已发布) |
| | 数据记录 | 记录数据采集时间、采集数量、采集状态,记录文章发布时间、发布人、修改记录 |
| | 自动发布 | 配置文章自动发布时间、发布前核验规则(如内容审核),设置通知方式(邮件/站内信)、提醒格式,支持关闭自动发布 |
| 运营管理 | Banner 管理 | 支持添加 Banner 图(上传图片)、设置 Banner 链接(跳转新闻/资源)、调整 Banner 排序、删除 Banner |
| | 资源推荐 | 支持手动调整 TOP 资源推荐列表(上下移动排序)、添加 / 移除推荐资源,实时同步到前端 |
| | 标签管理 | 支持自定义数据标签,标签可关联资源 / 课程,支持按标签筛选数据 |
| 课程管理 | 课程列表 | 分页展示所有课程,支持按课程名称 / 标签筛选,查看课程详情 |
| | 课程添加 | 录入课程名称、上传课程图片、填写课程描述、选择课程标签、设置课程权限(公开 / 指定部门)、设置课程状态(未上线 / 已上线) |
| | 课程维护 | 支持编辑课程信息、更新课程内容、修改课程状态、删除课程 |
| 学习管理 | 任务发布 | 编辑学习任务名称、任务描述、任务周期、关联资源/课程,选择任务接收对象(按部门/个人),发布任务 |
| | 人员选定 | 支持按部门层级筛选人员、手动勾选人员,生成任务接收名单 |
| | 学习记录 | 统计用户学习时长、学习资源数量、任务完成情况,生成可视化数据(图表接口),支持按部门/个人/时间筛选查询 |
| 智能体管理 | 基础配置 | 设置智能体名称(如 "思政小帮手"、系统提示词Prompt、模型选择、参数设置如温度值、最大 tokens 等) |
| | 知识库管理 | 支持导入知识库文件包含常见文本格式Excel/Word/PDF、手动添加知识库内容问题 + 答案)、编辑知识库条目、删除条目 |

View File

@@ -0,0 +1,77 @@
#!/bin/bash
set -e
echo "========================================"
echo "校园新闻管理系统 - 后端服务启动"
echo "========================================"
# 如果挂载的配置文件不存在,使用模板
if [ ! -f /app/config/application.yml ]; then
echo "[INFO] 未找到application.yml使用模板配置"
cp /app/config/application.yml.template /app/config/application.yml
else
echo "[INFO] 使用挂载的application.yml配置"
fi
if [ ! -f /app/config/log4j2-spring.xml ]; then
echo "[INFO] 未找到log4j2-spring.xml使用模板配置"
cp /app/config/log4j2-spring.xml.template /app/config/log4j2-spring.xml
else
echo "[INFO] 使用挂载的log4j2-spring.xml配置"
fi
# 等待数据库就绪
if [ ! -z "$MYSQL_HOST" ]; then
echo "[INFO] 等待MySQL启动 ($MYSQL_HOST:${MYSQL_PORT:-3306})..."
RETRY_COUNT=0
MAX_RETRIES=30
while ! nc -z $MYSQL_HOST ${MYSQL_PORT:-3306}; do
RETRY_COUNT=$((RETRY_COUNT+1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "[ERROR] MySQL连接超时"
exit 1
fi
echo "[INFO] 等待MySQL就绪... ($RETRY_COUNT/$MAX_RETRIES)"
sleep 2
done
echo "[INFO] MySQL已就绪"
sleep 3
# 注意爬虫配置路径已在MySQL容器初始化时配置好
# 详见docker/Dockerfile.mysql 的 01-init-database.sh
fi
# 等待Redis就绪
if [ ! -z "$REDIS_HOST" ]; then
echo "[INFO] 等待Redis启动 ($REDIS_HOST:${REDIS_PORT:-6379})..."
RETRY_COUNT=0
MAX_RETRIES=30
while ! nc -z $REDIS_HOST ${REDIS_PORT:-6379}; do
RETRY_COUNT=$((RETRY_COUNT+1))
if [ $RETRY_COUNT -ge $MAX_RETRIES ]; then
echo "[ERROR] Redis连接超时"
exit 1
fi
echo "[INFO] 等待Redis就绪... ($RETRY_COUNT/$MAX_RETRIES)"
sleep 2
done
echo "[INFO] Redis已就绪"
fi
# 显示配置信息
echo "========================================"
echo "[INFO] 数据库: $MYSQL_HOST:${MYSQL_PORT:-3306}/$MYSQL_DATABASE"
echo "[INFO] Redis: $REDIS_HOST:${REDIS_PORT:-6379}"
echo "[INFO] 爬虫路径: /app/crawler"
echo "[INFO] Python: $(python3 --version)"
echo "========================================"
# 启动应用
echo "[INFO] 启动Spring Boot应用..."
exec java \
-Djava.security.egd=file:/dev/./urandom \
-Dspring.config.location=/app/config/application.yml \
-Dlogging.config=/app/config/log4j2-spring.xml \
-Dfile.encoding=UTF-8 \
${JAVA_OPTS} \
-jar /app/app.jar