Files
hzdyjs/backend/hot-start.sh
T
zlwu 249b1dfeb4 feat: 完善项目开发规范和测试文档体系
📝 主要改进:
• Cursor配置模块化:拆分为前端、后端、移动端、文档、API测试5个专门规范文件
• API文档重新组织:按业务模块拆分到docs/开发文档/API/目录下
• 新增维修分类功能完整测试方案和自动化测试脚本
• 后端热启动脚本完善,支持Linux/Windows双平台
• 强化文档同步更新规范,确保代码与文档一致性

🔧 技术改进:
• 优化Cursor AI工作流程和代码生成质量
• 完善API测试规范(AES+RSA双重加密登录方法)
• 提升开发效率和代码质量标准化程度

�� 测试覆盖:
• 维修分类管理功能端到端测试验证通过
• 包含页面加载、CRUD操作、搜索功能等核心测试用例

更新时间:2025-07-01
2025-07-01 17:53:05 +08:00

336 lines
9.9 KiB
Bash
Executable File

#!/bin/bash
# =============================================================================
# RuoYi-Vue-Plus 热启动脚本
# 功能:启动应用并支持热加载、多环境切换等功能
# 位置:backend/hot-start.sh
# 作者:zlwu
# 时间:2025-07-01
# =============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
WHITE='\033[1;37m'
NC='\033[0m' # No Color
# 默认配置
DEFAULT_PROFILE="dev"
DEFAULT_PORT="8080"
DEFAULT_MODULE="ruoyi-admin"
MAVEN_OPTS="-Xms512m -Xmx2048m -XX:+UseG1GC"
# 脚本信息
SCRIPT_NAME="RuoYi热启动脚本"
SCRIPT_VERSION="1.0.0"
# 显示Logo
show_logo() {
echo -e "${CYAN}"
echo "==================================================================================="
echo " ____ __ ___ _ _ _ _ ____ _ _ "
echo " | _ \ _ _ ___ | \/ (_) | | | | ___ | |_ / ___|| |_ __ _ _ __| |_ "
echo " | |_) | | | |/ _ \ | |\/| | |_____| |_| |/ _ \| __| \___ \| __/ _\` | '__| __| "
echo " | _ <| |_| | (_) || | | | |_____| _ | (_) | |_ ___) | || (_| | | | |_ "
echo " |_| \_\\\\__,_|\___/ |_| |_|_| |_| |_|\___/ \__| |____/ \__\__,_|_| \__| "
echo ""
echo " 🚀 ${SCRIPT_NAME} v${SCRIPT_VERSION} 🚀"
echo "==================================================================================="
echo -e "${NC}"
}
# 显示帮助信息
show_help() {
echo -e "${WHITE}用法: $0 [选项]${NC}"
echo ""
echo -e "${YELLOW}选项:${NC}"
echo -e " ${GREEN}-h, --help${NC} 显示此帮助信息"
echo -e " ${GREEN}-p, --profile${NC} 指定环境配置 (dev/test/prod,默认: dev)"
echo -e " ${GREEN}-P, --port${NC} 指定端口号 (默认: 8080)"
echo -e " ${GREEN}-m, --module${NC} 指定启动模块 (默认: ruoyi-admin)"
echo -e " ${GREEN}-c, --clean${NC} 清理编译后启动"
echo -e " ${GREEN}-d, --debug${NC} 启用调试模式"
echo -e " ${GREEN}-j, --jvm-opts${NC} 自定义JVM参数"
echo -e " ${GREEN}-t, --test${NC} 测试模式启动"
echo -e " ${GREEN}--no-hot${NC} 禁用热加载功能"
echo -e " ${GREEN}--check${NC} 检查环境配置"
echo ""
echo -e "${YELLOW}示例:${NC}"
echo -e " $0 # 使用默认配置启动(开发环境+热加载)"
echo -e " $0 -p prod # 生产环境启动"
echo -e " $0 -P 9090 # 指定端口9090启动"
echo -e " $0 -c # 清理编译后启动"
echo -e " $0 -d # 调试模式启动"
echo -e " $0 --no-hot # 禁用热加载启动"
echo -e " $0 --check # 检查环境配置"
echo ""
echo -e "${CYAN}🔥 热加载功能说明:${NC}"
echo -e " - 开发环境默认启用热加载,修改代码后自动重启"
echo -e " - 支持Java代码、配置文件、MyBatis映射文件热加载"
echo -e " - 详细配置见: docs/开发文档/热加载配置说明.md"
}
# 检查环境
check_environment() {
echo -e "${BLUE}🔍 检查运行环境...${NC}"
# 检查Java版本
if command -v java &> /dev/null; then
JAVA_VERSION=$(java -version 2>&1 | head -n 1 | cut -d'"' -f2)
echo -e " ✅ Java版本: ${GREEN}$JAVA_VERSION${NC}"
else
echo -e " ❌ ${RED}未找到Java环境${NC}"
return 1
fi
# 检查Maven版本
if command -v mvn &> /dev/null; then
MVN_VERSION=$(mvn -version 2>/dev/null | head -n 1 | cut -d' ' -f3)
echo -e " ✅ Maven版本: ${GREEN}$MVN_VERSION${NC}"
else
echo -e " ❌ ${RED}未找到Maven环境${NC}"
return 1
fi
# 检查目标模块
if [ -d "$DEFAULT_MODULE" ]; then
echo -e " ✅ 目标模块: ${GREEN}$DEFAULT_MODULE${NC}"
else
echo -e " ❌ ${RED}未找到目标模块: $DEFAULT_MODULE${NC}"
return 1
fi
# 检查热加载配置
if grep -q "spring-boot-devtools" $DEFAULT_MODULE/pom.xml; then
echo -e " ✅ 热加载配置: ${GREEN}已启用${NC}"
else
echo -e " ⚠️ 热加载配置: ${YELLOW}未配置${NC}"
fi
# 检查配置文件
CONFIG_FILE="$DEFAULT_MODULE/src/main/resources/application-$DEFAULT_PROFILE.yml"
if [ -f "$CONFIG_FILE" ]; then
echo -e " ✅ 配置文件: ${GREEN}$CONFIG_FILE${NC}"
else
echo -e " ❌ ${RED}未找到配置文件: $CONFIG_FILE${NC}"
return 1
fi
echo -e "${GREEN}✅ 环境检查完成${NC}"
return 0
}
# 检查端口占用
check_port() {
local port=$1
if lsof -Pi :$port -sTCP:LISTEN -t >/dev/null 2>&1; then
echo -e "${YELLOW}⚠️ 端口 $port 已被占用${NC}"
echo -e "${CYAN}正在尝试找到占用进程...${NC}"
lsof -Pi :$port -sTCP:LISTEN
echo ""
read -p "是否要杀死占用进程并继续启动? (y/n): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}正在杀死端口 $port 的占用进程...${NC}"
lsof -ti:$port | xargs kill -9 2>/dev/null
sleep 2
echo -e "${GREEN}✅ 端口已释放${NC}"
return 0
else
echo -e "${RED}❌ 启动已取消${NC}"
exit 1
fi
fi
return 0
}
# 清理编译
clean_build() {
echo -e "${BLUE}🧹 清理编译...${NC}"
cd $DEFAULT_MODULE
mvn clean > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 清理完成${NC}"
else
echo -e "${RED}❌ 清理失败${NC}"
exit 1
fi
cd ..
}
# 构建项目
build_project() {
echo -e "${BLUE}🔨 编译项目...${NC}"
cd $DEFAULT_MODULE
mvn compile -q
if [ $? -eq 0 ]; then
echo -e "${GREEN}✅ 编译完成${NC}"
else
echo -e "${RED}❌ 编译失败${NC}"
exit 1
fi
cd ..
}
# 启动应用
start_application() {
local profile=$1
local port=$2
local debug_mode=$3
local hot_reload=$4
local jvm_opts=$5
echo -e "${BLUE}🚀 启动应用...${NC}"
echo -e "${CYAN}配置信息:${NC}"
echo -e " 📂 模块: ${GREEN}$DEFAULT_MODULE${NC}"
echo -e " 🌍 环境: ${GREEN}$profile${NC}"
echo -e " 🔌 端口: ${GREEN}$port${NC}"
echo -e " 🔥 热加载: ${GREEN}$([ "$hot_reload" = "true" ] && echo "启用" || echo "禁用")${NC}"
echo -e " 🐛 调试模式: ${GREEN}$([ "$debug_mode" = "true" ] && echo "启用" || echo "禁用")${NC}"
echo ""
cd $DEFAULT_MODULE
# 构建Maven命令
MVN_CMD="mvn spring-boot:run"
# 添加环境配置
MVN_CMD="$MVN_CMD -Dspring-boot.run.profiles=$profile"
# 添加端口配置
if [ "$port" != "$DEFAULT_PORT" ]; then
MVN_CMD="$MVN_CMD -Dspring-boot.run.arguments=--server.port=$port"
fi
# 添加JVM参数
if [ -n "$jvm_opts" ]; then
MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$jvm_opts\""
else
MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS\""
fi
# 调试模式
if [ "$debug_mode" = "true" ]; then
MVN_CMD="$MVN_CMD -Dspring-boot.run.jvmArguments=\"$MAVEN_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005\""
echo -e "${PURPLE}🐛 调试端口: 5005${NC}"
fi
# 禁用热加载
if [ "$hot_reload" = "false" ]; then
MVN_CMD="$MVN_CMD -Dspring.devtools.restart.enabled=false"
fi
echo -e "${CYAN}执行命令: ${WHITE}$MVN_CMD${NC}"
echo -e "${GREEN}==================== 应用启动日志 ====================${NC}"
echo ""
# 执行命令
eval $MVN_CMD
}
# 主函数
main() {
# 参数解析
PROFILE="$DEFAULT_PROFILE"
PORT="$DEFAULT_PORT"
MODULE="$DEFAULT_MODULE"
CLEAN_BUILD=false
DEBUG_MODE=false
HOT_RELOAD=true
JVM_OPTS=""
CHECK_ONLY=false
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-p|--profile)
PROFILE="$2"
shift 2
;;
-P|--port)
PORT="$2"
shift 2
;;
-m|--module)
MODULE="$2"
DEFAULT_MODULE="$2"
shift 2
;;
-c|--clean)
CLEAN_BUILD=true
shift
;;
-d|--debug)
DEBUG_MODE=true
shift
;;
-j|--jvm-opts)
JVM_OPTS="$2"
shift 2
;;
-t|--test)
PROFILE="test"
shift
;;
--no-hot)
HOT_RELOAD=false
shift
;;
--check)
CHECK_ONLY=true
shift
;;
*)
echo -e "${RED}未知参数: $1${NC}"
show_help
exit 1
;;
esac
done
# 显示Logo
show_logo
# 仅检查环境
if [ "$CHECK_ONLY" = "true" ]; then
check_environment
exit $?
fi
# 环境检查
if ! check_environment; then
echo -e "${RED}❌ 环境检查失败,请检查配置${NC}"
exit 1
fi
echo ""
# 端口检查
check_port $PORT
# 清理编译
if [ "$CLEAN_BUILD" = "true" ]; then
clean_build
echo ""
fi
# 编译项目
build_project
echo ""
# 启动应用
start_application "$PROFILE" "$PORT" "$DEBUG_MODE" "$HOT_RELOAD" "$JVM_OPTS"
}
# 错误处理
trap 'echo -e "\n${YELLOW}⚠️ 应用启动已中断${NC}"; exit 1' INT TERM
# 执行主函数
main "$@"