#!/bin/bash # ============================================================ # 应用管理模块 - 数据库检查与导入脚本 # 功能:检查表是否存在,如不存在则导入 # 作者:pangu # 日期:2026-02-04 # ============================================================ set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 数据库配置(从 application-dev.yml 读取) DB_HOST="${DB_HOST:-8.148.25.55}" DB_PORT="${DB_PORT:-3306}" DB_NAME="${DB_NAME:-pguser-db}" DB_USER="${DB_USER:-root}" DB_PASS="${DB_PASS}" # SQL 文件路径 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" TABLES_SQL="${SCRIPT_DIR}/pangu_tables.sql" MENU_SQL="${SCRIPT_DIR}/pangu_menu.sql" API_DICT_SQL="${SCRIPT_DIR}/open_api_dict_data.sql" # 打印函数 print_info() { echo -e "${BLUE}[INFO]${NC} $1"; } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; } print_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } print_error() { echo -e "${RED}[ERROR]${NC} $1"; } # 显示帮助 show_help() { echo "用法: ./check_and_import.sh [选项]" echo "" echo "选项:" echo " -h, --host 数据库主机 (默认: 8.148.25.55)" echo " -P, --port 数据库端口 (默认: 3306)" echo " -d, --database 数据库名称 (默认: pguser-db)" echo " -u, --user 数据库用户 (默认: root)" echo " -p, --password 数据库密码 (必填)" echo " --help 显示帮助信息" echo "" echo "示例:" echo " ./check_and_import.sh -p your_password" echo " ./check_and_import.sh -h localhost -u root -p 123456" } # 检查 MySQL 客户端 check_mysql_client() { if ! command -v mysql &> /dev/null; then print_error "未找到 mysql 客户端,请先安装 MySQL" print_info "macOS 安装: brew install mysql-client" print_info "Ubuntu 安装: sudo apt-get install mysql-client" exit 1 fi } # 检查表是否存在 check_table_exists() { local table_name=$1 local result=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SHOW TABLES LIKE '${table_name}';" 2>/dev/null) if [ -n "$result" ]; then return 0 # 表存在 else return 1 # 表不存在 fi } # 检查菜单是否存在 check_menu_exists() { local menu_id=$1 local result=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SELECT COUNT(*) FROM sys_menu WHERE menu_id=${menu_id};" 2>/dev/null) if [ "$result" -gt 0 ]; then return 0 # 菜单存在 else return 1 # 菜单不存在 fi } # 导入 SQL 文件 import_sql() { local sql_file=$1 local description=$2 print_info "正在导入: ${description}" if mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" < "${sql_file}" 2>/dev/null; then print_success "导入成功: ${description}" return 0 else print_error "导入失败: ${description}" return 1 fi } # 主逻辑 main() { # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -h|--host) DB_HOST="$2" shift 2 ;; -P|--port) DB_PORT="$2" shift 2 ;; -d|--database) DB_NAME="$2" shift 2 ;; -u|--user) DB_USER="$2" shift 2 ;; -p|--password) DB_PASS="$2" shift 2 ;; --help) show_help exit 0 ;; *) print_error "未知选项: $1" show_help exit 1 ;; esac done # 检查密码 if [ -z "$DB_PASS" ]; then print_error "请提供数据库密码 (-p 或 --password)" show_help exit 1 fi # 检查 MySQL 客户端 check_mysql_client echo "========================================" echo " 应用管理模块 - 数据库检查与导入" echo "========================================" echo "数据库: ${DB_HOST}:${DB_PORT}/${DB_NAME}" echo "用户: ${DB_USER}" echo "========================================" echo "" # 测试数据库连接 print_info "测试数据库连接..." if ! mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -e "SELECT 1;" &> /dev/null; then print_error "数据库连接失败,请检查配置" exit 1 fi print_success "数据库连接成功" echo "" # 1. 检查表结构 print_info "【步骤 1】检查表结构" echo "----------------------------------------" tables=("pg_application" "pg_api_dict" "pg_app_api") tables_missing=false for table in "${tables[@]}"; do if check_table_exists "$table"; then print_success "✓ 表 ${table} 已存在" else print_warn "✗ 表 ${table} 不存在" tables_missing=true fi done if [ "$tables_missing" = true ]; then echo "" print_warn "检测到缺失的表,开始导入表结构..." import_sql "${TABLES_SQL}" "表结构 (pangu_tables.sql)" fi echo "" # 2. 检查菜单数据 print_info "【步骤 2】检查菜单数据" echo "----------------------------------------" if check_menu_exists "2300"; then print_success "✓ 应用管理菜单已存在 (menu_id=2300)" else print_warn "✗ 应用管理菜单不存在" echo "" print_warn "开始导入菜单数据..." import_sql "${MENU_SQL}" "菜单数据 (pangu_menu.sql)" fi echo "" # 3. 检查 API 字典数据 print_info "【步骤 3】检查 API 字典数据" echo "----------------------------------------" if check_table_exists "pg_api_dict"; then api_count=$(mysql -h"${DB_HOST}" -P"${DB_PORT}" -u"${DB_USER}" -p"${DB_PASS}" -D"${DB_NAME}" -se "SELECT COUNT(*) FROM pg_api_dict WHERE api_code='OPEN_STUDENT_LIST';" 2>/dev/null) if [ "$api_count" -gt 0 ]; then print_success "✓ API 字典数据已存在 (OPEN_STUDENT_LIST)" else print_warn "✗ API 字典数据不存在" echo "" print_warn "开始导入 API 字典数据..." import_sql "${API_DICT_SQL}" "API 字典数据 (open_api_dict_data.sql)" fi else print_warn "表 pg_api_dict 不存在,跳过数据检查" fi echo "" echo "========================================" print_success "检查完成!" echo "========================================" echo "" # 显示验证 SQL print_info "【验证命令】" echo "-- 查看应用管理表" echo "SELECT COUNT(*) FROM pg_application;" echo "SELECT COUNT(*) FROM pg_api_dict;" echo "SELECT COUNT(*) FROM pg_app_api;" echo "" echo "-- 查看应用管理菜单" echo "SELECT menu_id, menu_name, perms FROM sys_menu WHERE menu_id >= 2300 AND menu_id < 2400;" echo "" echo "-- 查看 API 字典" echo "SELECT * FROM pg_api_dict;" echo "" } # 执行主函数 main "$@"