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