feat(plugin): 集成 WASM 插件系统到主服务并修复链路问题
- 新增 erp-plugin crate:插件管理、WASM 运行时、动态表、数据 CRUD - 新增前端插件管理页面(PluginAdmin/PluginCRUDPage)和 API 层 - 新增插件数据迁移(plugins/plugin_entities/plugin_event_subscriptions) - 新增权限补充迁移(为已有租户补充 plugin.admin/plugin.list 权限) - 修复 PluginAdmin 页面 InstallOutlined 图标不存在的崩溃问题 - 修复 settings 唯一索引迁移顺序错误(先去重再建索引) - 更新 wiki 和 CLAUDE.md 反映插件系统集成状态 - 新增 dev.ps1 一键启动脚本
This commit is contained in:
209
dev.ps1
Normal file
209
dev.ps1
Normal file
@@ -0,0 +1,209 @@
|
||||
#Requires -Version 5.1
|
||||
<#
|
||||
.SYNOPSIS
|
||||
ERP dev environment startup script
|
||||
.EXAMPLE
|
||||
.\dev.ps1 # Start backend + frontend
|
||||
.\dev.ps1 -Stop # Stop all
|
||||
.\dev.ps1 -Restart # Restart all
|
||||
.\dev.ps1 -Status # Show port status
|
||||
#>
|
||||
|
||||
param(
|
||||
[switch]$Stop,
|
||||
[switch]$Restart,
|
||||
[switch]$Status
|
||||
)
|
||||
|
||||
$BackendPort = 3000
|
||||
$FrontendPort = 5174
|
||||
$LogDir = ".logs"
|
||||
|
||||
# --- find PID using port ---
|
||||
function Find-PortPid([int]$Port) {
|
||||
try {
|
||||
$c = Get-NetTCPConnection -LocalPort $Port -State Listen -ErrorAction Stop
|
||||
return $c[0].OwningProcess
|
||||
} catch { return $null }
|
||||
}
|
||||
|
||||
# --- kill process on port ---
|
||||
function Stop-PortProcess([int]$Port, [string]$Label) {
|
||||
$procId = Find-PortPid $Port
|
||||
if ($null -ne $procId) {
|
||||
try { $pName = (Get-Process -Id $procId -ErrorAction SilentlyContinue).ProcessName } catch { $pName = "?" }
|
||||
Write-Host (" {0,-10} port {1} used by PID {2} ({3}), killing..." -f $Label,$Port,$procId,$pName) -ForegroundColor Yellow -NoNewline
|
||||
try {
|
||||
Stop-Process -Id $procId -Force -ErrorAction Stop
|
||||
$w = 0
|
||||
while (($w -lt 5) -and (Find-PortPid $Port)) { Start-Sleep -Seconds 1; $w++ }
|
||||
if (Find-PortPid $Port) { Write-Host " still in use" -ForegroundColor Red }
|
||||
else { Write-Host " done" -ForegroundColor Green }
|
||||
} catch { Write-Host " failed" -ForegroundColor Red }
|
||||
} else {
|
||||
Write-Host (" {0,-10} port {1} free" -f $Label,$Port) -ForegroundColor Green
|
||||
}
|
||||
}
|
||||
|
||||
# --- wait for port ---
|
||||
function Wait-PortReady([int]$Port, [int]$TimeoutSeconds = 60) {
|
||||
$sw = [System.Diagnostics.Stopwatch]::StartNew()
|
||||
while ($sw.ElapsedMilliseconds -lt ($TimeoutSeconds * 1000)) {
|
||||
if (Find-PortPid $Port) { return $true }
|
||||
Start-Sleep -Milliseconds 500
|
||||
}
|
||||
return $false
|
||||
}
|
||||
|
||||
# --- stop all ---
|
||||
function Stop-Services {
|
||||
Write-Host ""
|
||||
Write-Host "Stopping..." -ForegroundColor Cyan
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor DarkGray
|
||||
|
||||
foreach ($svc in @("backend","frontend")) {
|
||||
$pidFile = Join-Path $LogDir "$svc.pid"
|
||||
if (Test-Path $pidFile) {
|
||||
$svcId = Get-Content $pidFile -ErrorAction SilentlyContinue
|
||||
if ($svcId -and (Get-Process -Id $svcId -ErrorAction SilentlyContinue)) {
|
||||
$label = if ($svc -eq "backend") { "Backend" } else { "Frontend" }
|
||||
Write-Host " Stopping $label (PID $svcId)..." -ForegroundColor Cyan -NoNewline
|
||||
Stop-Process -Id $svcId -Force -ErrorAction SilentlyContinue
|
||||
Write-Host " done" -ForegroundColor Green
|
||||
}
|
||||
Remove-Item $pidFile -Force -ErrorAction SilentlyContinue
|
||||
}
|
||||
}
|
||||
Stop-PortProcess $BackendPort "Backend"
|
||||
Stop-PortProcess $FrontendPort "Frontend"
|
||||
Write-Host ""
|
||||
Write-Host "Stopped." -ForegroundColor Green
|
||||
}
|
||||
|
||||
# --- show status ---
|
||||
function Show-Status {
|
||||
Write-Host ""
|
||||
Write-Host "Status:" -ForegroundColor Cyan
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor DarkGray
|
||||
|
||||
$bp = Find-PortPid $BackendPort
|
||||
if ($null -ne $bp) {
|
||||
Write-Host " " -NoNewline; Write-Host "+" -ForegroundColor Green -NoNewline
|
||||
Write-Host " Backend port $BackendPort PID $bp"
|
||||
Write-Host " http://localhost:$BackendPort/api/v1/health" -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host " " -NoNewline; Write-Host "-" -ForegroundColor Red -NoNewline
|
||||
Write-Host " Backend port $BackendPort stopped"
|
||||
}
|
||||
|
||||
$fp = Find-PortPid $FrontendPort
|
||||
if ($null -ne $fp) {
|
||||
Write-Host " " -NoNewline; Write-Host "+" -ForegroundColor Green -NoNewline
|
||||
Write-Host " Frontend port $FrontendPort PID $fp"
|
||||
Write-Host " http://localhost:$FrontendPort" -ForegroundColor Cyan
|
||||
} else {
|
||||
Write-Host " " -NoNewline; Write-Host "-" -ForegroundColor Red -NoNewline
|
||||
Write-Host " Frontend port $FrontendPort stopped"
|
||||
}
|
||||
Write-Host ""
|
||||
}
|
||||
|
||||
# --- start all ---
|
||||
function Start-Services {
|
||||
New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
|
||||
|
||||
Write-Host ""
|
||||
Write-Host "==================================================" -ForegroundColor Cyan
|
||||
Write-Host " ERP Dev Environment Startup" -ForegroundColor Cyan
|
||||
Write-Host "==================================================" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
|
||||
# 1. clean ports
|
||||
Write-Host "[1/3] Checking ports..." -ForegroundColor Cyan
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor DarkGray
|
||||
Stop-PortProcess $BackendPort "Backend"
|
||||
Stop-PortProcess $FrontendPort "Frontend"
|
||||
Write-Host ""
|
||||
|
||||
# 2. backend
|
||||
Write-Host "[2/3] Starting backend (Axum :$BackendPort)..." -ForegroundColor Cyan
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor DarkGray
|
||||
|
||||
$backendLog = Join-Path $LogDir "backend.log"
|
||||
$backendErr = Join-Path $LogDir "backend.err"
|
||||
|
||||
$proc = Start-Process -FilePath "cargo" -ArgumentList "run","-p","erp-server" `
|
||||
-RedirectStandardOutput $backendLog -RedirectStandardError $backendErr `
|
||||
-WindowStyle Hidden -PassThru
|
||||
|
||||
Write-Host " PID: $($proc.Id) log: $backendLog" -ForegroundColor DarkGray
|
||||
Write-Host " Compiling & starting..." -NoNewline
|
||||
|
||||
if (Wait-PortReady $BackendPort 180) {
|
||||
Write-Host " ready" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " timeout (check $backendLog)" -ForegroundColor Yellow
|
||||
}
|
||||
Write-Host ""
|
||||
|
||||
# 3. frontend
|
||||
Write-Host "[3/3] Starting frontend (Vite :$FrontendPort)..." -ForegroundColor Cyan
|
||||
Write-Host "--------------------------------------------------" -ForegroundColor DarkGray
|
||||
|
||||
$webDir = Join-Path $PSScriptRoot "apps\web"
|
||||
if (-not (Test-Path (Join-Path $webDir "node_modules"))) {
|
||||
Write-Host " Installing deps..." -ForegroundColor Yellow
|
||||
Push-Location $webDir
|
||||
pnpm install 2>&1 | ForEach-Object { Write-Host " $_" }
|
||||
Pop-Location
|
||||
}
|
||||
|
||||
$frontendLog = Join-Path $LogDir "frontend.log"
|
||||
$frontendErr = Join-Path $LogDir "frontend.err"
|
||||
|
||||
$proc = Start-Process -FilePath "cmd.exe" `
|
||||
-ArgumentList "/c","cd /d `"$webDir`" && pnpm dev" `
|
||||
-RedirectStandardOutput $frontendLog -RedirectStandardError $frontendErr `
|
||||
-WindowStyle Hidden -PassThru
|
||||
|
||||
Write-Host " PID: $($proc.Id) log: $frontendLog" -ForegroundColor DarkGray
|
||||
Write-Host " Starting..." -NoNewline
|
||||
|
||||
if (Wait-PortReady $FrontendPort 30) {
|
||||
Write-Host " ready" -ForegroundColor Green
|
||||
} else {
|
||||
Write-Host " timeout" -ForegroundColor Red
|
||||
}
|
||||
Write-Host ""
|
||||
|
||||
# save PIDs (use port-based PID, not Start-Process PID which may be cmd.exe wrapper)
|
||||
$bp = Find-PortPid $BackendPort
|
||||
$fp = Find-PortPid $FrontendPort
|
||||
if ($bp) { $bp | Set-Content (Join-Path $LogDir "backend.pid") }
|
||||
if ($fp) { $fp | Set-Content (Join-Path $LogDir "frontend.pid") }
|
||||
|
||||
# done
|
||||
Write-Host "==================================================" -ForegroundColor Green
|
||||
Write-Host " All services started!" -ForegroundColor Green
|
||||
Write-Host "==================================================" -ForegroundColor Green
|
||||
Write-Host ""
|
||||
Write-Host " Frontend: http://localhost:$FrontendPort" -ForegroundColor Cyan
|
||||
Write-Host " Backend: http://localhost:$BackendPort/api/v1" -ForegroundColor Cyan
|
||||
Write-Host " Health: http://localhost:$BackendPort/api/v1/health" -ForegroundColor Cyan
|
||||
Write-Host ""
|
||||
Write-Host " Stop: .\dev.ps1 -Stop" -ForegroundColor DarkGray
|
||||
Write-Host " Restart: .\dev.ps1 -Restart" -ForegroundColor DarkGray
|
||||
Write-Host " Status: .\dev.ps1 -Status" -ForegroundColor DarkGray
|
||||
Write-Host ""
|
||||
}
|
||||
|
||||
# --- entry ---
|
||||
if ($Stop) {
|
||||
Stop-Services
|
||||
} elseif ($Restart) {
|
||||
Stop-Services; Start-Sleep -Seconds 1; Start-Services
|
||||
} elseif ($Status) {
|
||||
Show-Status
|
||||
} else {
|
||||
Start-Services
|
||||
}
|
||||
Reference in New Issue
Block a user