chore: 重构开发启动脚本为跨平台 dev.sh,添加 VS Code 任务配置

- 新增 dev.sh:Linux/Git Bash 通用,杀端口旧进程后启动前后端
- 新增 .vscode/tasks.json:Ctrl+Shift+B 一键重启,前后端独立终端
- 删除 restart.sh:旧 Linux 专用脚本(含硬编码路径)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
xuewuerduo 2026-05-18 23:20:02 +08:00
parent a5176016b3
commit ae64616b89
3 changed files with 148 additions and 103 deletions

68
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,68 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "启动后端",
"type": "shell",
"command": "bash dev.sh backend",
"isBackground": true,
"group": "build",
"problemMatcher": {
"pattern": { "regexp": "^(.*)$" },
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "dedicated",
"group": "backend"
}
},
{
"label": "启动前端",
"type": "shell",
"command": "bash dev.sh frontend",
"isBackground": true,
"group": "build",
"problemMatcher": {
"pattern": { "regexp": "^(.*)$" },
"background": {
"activeOnStart": true,
"beginsPattern": ".",
"endsPattern": "."
}
},
"presentation": {
"echo": true,
"reveal": "always",
"focus": false,
"panel": "dedicated",
"group": "frontend"
}
},
{
"label": "重启全部",
"dependsOn": ["启动后端", "启动前端"],
"dependsOrder": "parallel",
"group": { "kind": "build", "isDefault": true },
"problemMatcher": []
},
{
"label": "关闭全部",
"type": "shell",
"command": "bash dev.sh kill",
"problemMatcher": []
},
{
"label": "环境检查",
"type": "shell",
"command": "bash dev.sh check",
"problemMatcher": []
}
]
}

80
dev.sh Normal file
View File

@ -0,0 +1,80 @@
#!/bin/bash
# ============================================================
# 开发启动脚本 (Linux / Git Bash 通用)
# 用法:
# bash dev.sh backend 启动后端 (端口 9999)
# bash dev.sh frontend 启动前端 (端口 3000)
# bash dev.sh kill 关闭所有项目进程
# ============================================================
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
kill_port() {
local port=$1
local pids
if [ "$IS_WIN" = true ]; then
# Windows: netstat -ano 第5列是PID
pids=$(netstat -ano 2>/dev/null | grep ":$port" | grep "LISTENING" | awk '{print $5}' | sort -u)
else
# Linux: lsof 或 ss
pids=$(lsof -ti :$port 2>/dev/null || ss -tlnp 2>/dev/null | grep ":$port" | grep -oP 'pid=\K\d+' | sort -u)
fi
if [ -n "$pids" ]; then
for pid in $pids; do
if [ "$IS_WIN" = true ]; then
taskkill //F //PID "$pid" 2>/dev/null
else
kill -9 "$pid" 2>/dev/null
fi
echo " [KILL] PID $pid (port $port)"
done
else
echo " [OK] 端口 $port 无进程"
fi
}
# 检测系统
case "$OSTYPE" in
msys|cygwin|win32) IS_WIN=true ;;
*) IS_WIN=false ;;
esac
case "${1}" in
backend)
kill_port 9999
sleep 1
cd "$SCRIPT_DIR/our-itam"
echo "=== our-itam 后端启动中... 端口:9999 ==="
mvn spring-boot:run -Dspring-boot.run.profiles=dev
;;
frontend)
kill_port 3000
sleep 1
cd "$SCRIPT_DIR/antdv-next-admin"
echo "=== antdv-next-admin 前端启动中... 端口:3000 ==="
npm run dev
;;
kill)
kill_port 9999
kill_port 3000
echo "=== 已关闭全部 ==="
;;
check)
echo "SCRIPT_DIR: $SCRIPT_DIR"
echo "IS_WIN: $IS_WIN"
echo "mvn: $(which mvn 2>/dev/null || echo 'NOT FOUND')"
echo "npm: $(which npm 2>/dev/null || echo 'NOT FOUND')"
echo "node: $(which node 2>/dev/null || echo 'NOT FOUND')"
echo "---"
echo "pom.xml: $(ls "$SCRIPT_DIR/our-itam/pom.xml" 2>/dev/null || echo 'NOT FOUND')"
echo "package.json: $(ls "$SCRIPT_DIR/antdv-next-admin/package.json" 2>/dev/null || echo 'NOT FOUND')"
;;
*)
echo "用法: bash dev.sh [backend|frontend|kill|check]"
echo ""
echo " backend 启动后端 (端口 9999)"
echo " frontend 启动前端 (端口 3000)"
echo " kill 关闭所有项目进程"
echo " check 检查环境"
;;
esac

View File

@ -1,103 +0,0 @@
#!/bin/bash
set -e
# ============================================================
# 重启前后端服务,确保只有一套在运行
# ============================================================
BACKEND_DIR="/data/ssd/WorkSpace/tansci/our-itam"
FRONTEND_DIR="/data/ssd/WorkSpace/tansci/antdv-next-admin"
LOG_DIR="/data/ssd/WorkSpace/tansci/logs"
mkdir -p "$LOG_DIR"
# ==================== 停止旧进程 ====================
echo "==> 停止旧进程..."
# 停止后端 (spring-boot:run)
BACKEND_PIDS=$(pgrep -f "spring-boot:run" 2>/dev/null || true)
if [ -n "$BACKEND_PIDS" ]; then
echo " 停止后端 PID: $BACKEND_PIDS"
kill $BACKEND_PIDS 2>/dev/null || true
# 等待进程退出,最多等 30 秒
for i in $(seq 1 30); do
if ! pgrep -f "spring-boot:run" > /dev/null 2>&1; then
break
fi
sleep 1
done
# 强制杀死残留
pgrep -f "spring-boot:run" > /dev/null 2>&1 && kill -9 $(pgrep -f "spring-boot:run") 2>/dev/null || true
echo " 后端已停止"
else
echo " 后端未运行"
fi
# 停止前端 (vite)
FRONTEND_PIDS=$(pgrep -f "vite.*3000" 2>/dev/null || true)
if [ -n "$FRONTEND_PIDS" ]; then
echo " 停止前端 PID: $FRONTEND_PIDS"
kill $FRONTEND_PIDS 2>/dev/null || true
for i in $(seq 1 10); do
if ! pgrep -f "vite.*3000" > /dev/null 2>&1; then
break
fi
sleep 1
done
pgrep -f "vite.*3000" > /dev/null 2>&1 && kill -9 $(pgrep -f "vite.*3000") 2>/dev/null || true
echo " 前端已停止"
else
echo " 前端未运行"
fi
# 确保端口释放
sleep 1
# ==================== 启动后端 ====================
echo "==> 启动后端..."
cd "$BACKEND_DIR"
nohup mvn spring-boot:run -Dspring-boot.run.profiles=dev > "$LOG_DIR/backend.log" 2>&1 &
BACKEND_PID=$!
echo " 后端 PID: $BACKEND_PID (日志: $LOG_DIR/backend.log)"
# ==================== 启动前端 ====================
echo "==> 启动前端..."
cd "$FRONTEND_DIR"
nohup npm run dev > "$LOG_DIR/frontend.log" 2>&1 &
FRONTEND_PID=$!
echo " 前端 PID: $FRONTEND_PID (日志: $LOG_DIR/frontend.log)"
# ==================== 等待就绪 ====================
echo "==> 等待服务就绪..."
# 等待后端 (最多 120 秒)
for i in $(seq 1 120); do
if curl -s http://localhost:9999 > /dev/null 2>&1; then
echo " 后端已就绪 (http://localhost:9999)"
break
fi
if [ $i -eq 120 ]; then
echo " 后端启动超时,请查看日志: $LOG_DIR/backend.log"
fi
sleep 1
done
# 等待前端 (最多 30 秒)
for i in $(seq 1 30); do
if curl -s http://localhost:3000 > /dev/null 2>&1; then
echo " 前端已就绪 (http://localhost:3000)"
break
fi
if [ $i -eq 30 ]; then
echo " 前端启动超时,请查看日志: $LOG_DIR/frontend.log"
fi
sleep 1
done
echo "==> 重启完成"
echo " 后端日志: tail -f $LOG_DIR/backend.log"
echo " 前端日志: tail -f $LOG_DIR/frontend.log"