Files
ALL-teach_sys/start-industry.sh

310 lines
8.0 KiB
Bash
Raw Permalink Normal View History

#!/bin/bash
# ========================================
# 教务系统 - 智能产业启动脚本
# 功能:自动检测依赖、安装、启动服务
# ========================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 产业配置
declare -A industries=(
["1"]="frontend:文旅产业:5150"
["2"]="frontend_智能制造:智能制造:5151"
["3"]="frontend_智能开发:智能开发:5152"
["4"]="frontend_财经商贸:财经商贸:5153"
["5"]="frontend_视觉设计:视觉设计:5154"
["6"]="frontend_交通物流:交通物流:5155"
["7"]="frontend_大健康:大健康:5156"
["8"]="frontend_土木水利:土木水利:5157"
["9"]="frontend_食品:食品产业:5158"
["10"]="frontend_化工:化工产业:5159"
["11"]="frontend_能源:能源产业:5160"
["12"]="frontend_环保:环保产业:5161"
)
# 打印标题
print_header() {
clear
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} 教务系统 - 智能启动脚本 ${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
}
# 检查端口是否被占用
check_port() {
local port=$1
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
return 0 # 端口被占用
else
return 1 # 端口空闲
fi
}
# 停止指定端口的服务
stop_port() {
local port=$1
local pid=$(lsof -Pi :$port -sTCP:LISTEN -t 2>/dev/null)
if [ ! -z "$pid" ]; then
echo -e "${YELLOW}⚠️ 端口 $port 被占用,正在停止进程 $pid...${NC}"
kill $pid 2>/dev/null
sleep 1
echo -e "${GREEN}✅ 已停止端口 $port 的服务${NC}"
fi
}
# 检查并安装依赖
check_and_install_deps() {
local dir=$1
local name=$2
if [ ! -d "$dir/node_modules" ]; then
echo -e "${YELLOW}📦 检测到 $name 依赖未安装,正在安装...${NC}"
echo -e "${BLUE} 这可能需要1-3分钟请稍候...${NC}"
cd "$dir"
npm install > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "${GREEN}$name 依赖安装成功!${NC}"
cd - > /dev/null
return 0
else
echo -e "${RED}$name 依赖安装失败!${NC}"
cd - > /dev/null
return 1
fi
else
echo -e "${GREEN}$name 依赖已存在${NC}"
return 0
fi
}
# 启动单个产业
start_industry() {
local dir=$1
local name=$2
local port=$3
echo ""
echo -e "${BLUE}🚀 启动 $name (端口: $port)${NC}"
echo "----------------------------------------"
# 检查目录是否存在
if [ ! -d "$dir" ]; then
echo -e "${RED}❌ 目录 $dir 不存在!${NC}"
return 1
fi
# 检查端口
if check_port $port; then
echo -e "${YELLOW}⚠️ 端口 $port 已被占用${NC}"
read -p "是否停止现有服务并重启?(y/n): " choice
if [[ "$choice" == "y" || "$choice" == "Y" ]]; then
stop_port $port
else
echo -e "${YELLOW}跳过 $name${NC}"
return 1
fi
fi
# 检查并安装依赖
check_and_install_deps "$dir" "$name"
if [ $? -ne 0 ]; then
return 1
fi
# 启动服务
echo -e "${BLUE}🔄 正在启动 $name...${NC}"
cd "$dir"
npm run dev > /dev/null 2>&1 &
local pid=$!
cd - > /dev/null
# 等待服务启动
sleep 3
# 验证启动
if check_port $port; then
echo -e "${GREEN}$name 启动成功!${NC}"
echo -e "${GREEN} 访问地址: http://localhost:$port${NC}"
return 0
else
echo -e "${RED}$name 启动失败!${NC}"
return 1
fi
}
# 启动所有产业
start_all() {
echo -e "${BLUE}启动所有产业...${NC}"
echo ""
local success_count=0
local fail_count=0
for key in "${!industries[@]}"; do
IFS=':' read -r dir name port <<< "${industries[$key]}"
start_industry "$dir" "$name" "$port"
if [ $? -eq 0 ]; then
((success_count++))
else
((fail_count++))
fi
done
echo ""
echo "========================================"
echo -e "${GREEN}成功启动: $success_count 个产业${NC}"
if [ $fail_count -gt 0 ]; then
echo -e "${RED}启动失败: $fail_count 个产业${NC}"
fi
}
# 停止所有产业
stop_all() {
echo -e "${YELLOW}停止所有产业服务...${NC}"
for key in "${!industries[@]}"; do
IFS=':' read -r dir name port <<< "${industries[$key]}"
if check_port $port; then
stop_port $port
fi
done
echo -e "${GREEN}✅ 所有服务已停止${NC}"
}
# 显示菜单
show_menu() {
echo -e "${BLUE}请选择操作:${NC}"
echo ""
echo " 0) 启动所有产业"
echo " --------------"
for key in $(echo "${!industries[@]}" | tr ' ' '\n' | sort -n); do
IFS=':' read -r dir name port <<< "${industries[$key]}"
printf " %2s) %-12s (端口: %s)" "$key" "$name" "$port"
# 检查运行状态
if check_port $port; then
echo -e " ${GREEN}[运行中]${NC}"
else
echo -e " ${YELLOW}[未启动]${NC}"
fi
done
echo " --------------"
echo " a) 停止所有产业"
echo " s) 查看运行状态"
echo " q) 退出"
echo ""
}
# 显示运行状态
show_status() {
echo ""
echo -e "${BLUE}产业运行状态:${NC}"
echo "========================================"
local running_count=0
local stopped_count=0
for key in $(echo "${!industries[@]}" | tr ' ' '\n' | sort -n); do
IFS=':' read -r dir name port <<< "${industries[$key]}"
printf "%-15s (端口: %s): " "$name" "$port"
if check_port $port; then
echo -e "${GREEN}运行中${NC}"
echo -e " 访问地址: http://localhost:$port"
((running_count++))
else
echo -e "${YELLOW}未启动${NC}"
((stopped_count++))
fi
done
echo "========================================"
echo -e "${GREEN}运行中: $running_count${NC} | ${YELLOW}未启动: $stopped_count${NC}"
echo ""
}
# 主函数
main() {
# 检查是否有参数传入(快速启动模式)
if [ $# -gt 0 ]; then
case "$1" in
all)
print_header
start_all
;;
stop)
print_header
stop_all
;;
status)
print_header
show_status
;;
[0-9]|1[0-2])
print_header
if [ "$1" == "0" ]; then
start_all
else
IFS=':' read -r dir name port <<< "${industries[$1]}"
start_industry "$dir" "$name" "$port"
fi
;;
*)
echo -e "${RED}无效参数!${NC}"
echo "用法: $0 [all|stop|status|1-12]"
;;
esac
exit 0
fi
# 交互模式
while true; do
print_header
show_menu
read -p "请输入选项: " choice
case "$choice" in
0)
start_all
read -p "按回车键继续..."
;;
[1-9]|1[0-2])
IFS=':' read -r dir name port <<< "${industries[$choice]}"
start_industry "$dir" "$name" "$port"
read -p "按回车键继续..."
;;
a|A)
stop_all
read -p "按回车键继续..."
;;
s|S)
show_status
read -p "按回车键继续..."
;;
q|Q)
echo -e "${BLUE}再见!${NC}"
exit 0
;;
*)
echo -e "${RED}无效选项!${NC}"
sleep 1
;;
esac
done
}
# 启动主程序
main "$@"