接入本地认证启动配置

This commit is contained in:
cat-shark
2026-06-20 10:13:00 +08:00
parent 0fd56f8841
commit 8922a3eef6
3 changed files with 82 additions and 16 deletions
+4 -2
View File
@@ -14,7 +14,9 @@
"scripts": { "scripts": {
"start:local": "node scripts/start-local.cjs", "start:local": "node scripts/start-local.cjs",
"start:check": "node scripts/start-local.cjs --check", "start:check": "node scripts/start-local.cjs --check",
"dev": "set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& vite --host 127.0.0.1 --port 3354 --strictPort", "auth:local": "node scripts/local-auth-server.cjs",
"admin:local": "node server/local-auth/index.cjs",
"dev": "set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& vite --host 127.0.0.1 --port 3354 --strictPort",
"typecheck": "vue-tsc --noEmit", "typecheck": "vue-tsc --noEmit",
"build": "node scripts/clean-build-artifacts.cjs && vite build", "build": "node scripts/clean-build-artifacts.cjs && vite build",
"build:dev": "node scripts/clean-build-artifacts.cjs && vite build --mode development", "build:dev": "node scripts/clean-build-artifacts.cjs && vite build --mode development",
@@ -22,7 +24,7 @@
"version:sync": "node scripts/sync-version.cjs", "version:sync": "node scripts/sync-version.cjs",
"dev:all": "npm run dev:electron", "dev:all": "npm run dev:electron",
"dev:win": "npm run dev:electron", "dev:win": "npm run dev:electron",
"dev:electron": "concurrently \"set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& set EXTERNAL_ELECTRON_DEV=1&& vite --host 127.0.0.1 --port 3354 --strictPort\" \"set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& node scripts/dev-electron.cjs\"", "dev:electron": "concurrently \"set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& set EXTERNAL_ELECTRON_DEV=1&& vite --host 127.0.0.1 --port 3354 --strictPort\" \"set AUTH_SERVER_URL=http://127.0.0.1:3302&& set VITE_DEV_SERVER_URL=http://127.0.0.1:3354&& node scripts/dev-electron.cjs\"",
"prepare-package": "node apply-oem.cjs && py -3 scripts/export-runtime-system-templates.py && node scripts/prepare-package.cjs", "prepare-package": "node apply-oem.cjs && py -3 scripts/export-runtime-system-templates.py && node scripts/prepare-package.cjs",
"build:win": "npm run prepare-package && npm run build && node scripts/build-resource-artifacts.cjs && electron-builder --win --x64 && node scripts/fix-latest-yml.cjs && node scripts/assemble-release-artifacts.cjs", "build:win": "npm run prepare-package && npm run build && node scripts/build-resource-artifacts.cjs && electron-builder --win --x64 && node scripts/fix-latest-yml.cjs && node scripts/assemble-release-artifacts.cjs",
"build:win:only": "electron-builder --win --x64", "build:win:only": "electron-builder --win --x64",
+77 -13
View File
@@ -5,6 +5,7 @@ const { spawn, spawnSync } = require("node:child_process");
const projectRoot = path.resolve(__dirname, ".."); const projectRoot = path.resolve(__dirname, "..");
const serverUrl = process.env.VITE_DEV_SERVER_URL || "http://127.0.0.1:3354"; const serverUrl = process.env.VITE_DEV_SERVER_URL || "http://127.0.0.1:3354";
const authServerUrl = process.env.AUTH_SERVER_URL || "http://127.0.0.1:3302";
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm"; const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
const requiredNodeMajor = 20; const requiredNodeMajor = 20;
const checkOnly = process.argv.includes("--check"); const checkOnly = process.argv.includes("--check");
@@ -18,11 +19,11 @@ function fail(message) {
process.exit(1); process.exit(1);
} }
function parseServerUrl(url) { function parseUrl(url, name) {
try { try {
return new URL(url); return new URL(url);
} catch { } catch {
fail(`VITE_DEV_SERVER_URL 无效:${url}`); fail(`${name} 无效:${url}`);
} }
} }
@@ -57,13 +58,13 @@ function checkDependencies() {
} }
} }
function assertPortAvailable(host, port) { function assertPortAvailable(host, port, label) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const server = net.createServer(); const server = net.createServer();
server.once("error", error => { server.once("error", error => {
if (error.code === "EADDRINUSE") { if (error.code === "EADDRINUSE") {
reject(new Error(`端口 ${port} 已被占用,请先关闭已有 Vite/Electron 开发进程。`)); reject(new Error(`${label} 端口 ${port} 已被占用,请先关闭已有进程。`));
return; return;
} }
reject(error); reject(error);
@@ -77,24 +78,75 @@ function assertPortAvailable(host, port) {
}); });
} }
function canConnect(host, port) {
return new Promise(resolve => {
const socket = net.createConnection({ host, port });
const finish = ok => {
socket.destroy();
resolve(ok);
};
socket.setTimeout(500);
socket.once("connect", () => finish(true));
socket.once("timeout", () => finish(false));
socket.once("error", () => finish(false));
});
}
async function startLocalAuth(authUrl) {
const authHost = authUrl.hostname || "127.0.0.1";
const authPort = Number(authUrl.port || 3302);
if (await canConnect(authHost, authPort)) {
log(`本地认证服务已在运行:${authServerUrl}`);
return null;
}
const child = spawn(process.execPath, ["scripts/local-auth-server.cjs"], {
cwd: projectRoot,
stdio: "inherit",
env: {
...process.env,
LOCAL_AUTH_HOST: authHost,
LOCAL_AUTH_PORT: String(authPort),
},
shell: false,
});
child.on("error", error => {
fail(`本地认证服务启动失败:${error.message}`);
});
for (let attempt = 0; attempt < 40; attempt++) {
if (await canConnect(authHost, authPort)) {
return child;
}
await new Promise(resolve => setTimeout(resolve, 250));
}
child.kill();
fail(`本地认证服务未能在 ${authServerUrl} 启动。`);
}
async function main() { async function main() {
process.chdir(projectRoot); process.chdir(projectRoot);
const parsedUrl = parseServerUrl(serverUrl); const parsedServerUrl = parseUrl(serverUrl, "VITE_DEV_SERVER_URL");
const host = parsedUrl.hostname || "127.0.0.1"; const parsedAuthUrl = parseUrl(authServerUrl, "AUTH_SERVER_URL");
const port = Number(parsedUrl.port || 3344); const viteHost = parsedServerUrl.hostname || "127.0.0.1";
const vitePort = Number(parsedServerUrl.port || 3354);
log("========================================"); log("========================================");
log(" 本地快速启动:Vite + Electron"); log(" 本地快速启动:Local Auth + Vite + Electron");
log("========================================"); log("========================================");
log(`项目目录:${projectRoot}`); log(`项目目录:${projectRoot}`);
log(`认证服务:${authServerUrl}`);
log(`开发地址:${serverUrl}`); log(`开发地址:${serverUrl}`);
log(""); log("");
checkNodeVersion(); checkNodeVersion();
const npmVersion = checkCommand(npmCommand, ["--version"], "npm"); const npmVersion = checkCommand(npmCommand, ["--version"], "npm");
checkDependencies(); checkDependencies();
await assertPortAvailable(host, port); await assertPortAvailable(viteHost, vitePort, "Vite");
log(`Node.js${process.version}`); log(`Node.js${process.version}`);
log(`npm${npmVersion}`); log(`npm${npmVersion}`);
@@ -105,24 +157,36 @@ async function main() {
return; return;
} }
const authChild = await startLocalAuth(parsedAuthUrl);
log("");
log("正在启动应用,关闭此窗口即可停止开发服务。"); log("正在启动应用,关闭此窗口即可停止开发服务。");
log("默认本地账号:13800138000 / 123456");
log(""); log("");
const child = spawn(npmCommand, ["run", "dev:electron"], { const appChild = spawn(npmCommand, ["run", "dev:electron"], {
cwd: projectRoot, cwd: projectRoot,
stdio: "inherit", stdio: "inherit",
env: { env: {
...process.env, ...process.env,
VITE_DEV_SERVER_URL: serverUrl, VITE_DEV_SERVER_URL: serverUrl,
AUTH_SERVER_URL: authServerUrl,
}, },
shell: process.platform === "win32", shell: process.platform === "win32",
}); });
child.on("exit", code => { const shutdown = code => {
if (authChild && !authChild.killed) {
authChild.kill();
}
process.exit(code ?? 0); process.exit(code ?? 0);
}); };
child.on("error", error => { process.on("SIGINT", () => shutdown(0));
process.on("SIGTERM", () => shutdown(0));
appChild.on("exit", shutdown);
appChild.on("error", error => {
fail(`启动失败:${error.message}`); fail(`启动失败:${error.message}`);
}); });
} }
+1 -1
View File
@@ -12,7 +12,7 @@ export const AppConfig = {
website: ``, website: ``,
websiteGithub: "", websiteGithub: "",
websiteGitee: "", websiteGitee: "",
apiBaseUrl: `http://49.233.157.120:3002/api`, apiBaseUrl: `http://127.0.0.1:3302/api`,
updaterUrl: ``, updaterUrl: ``,
downloadUrl: ``, downloadUrl: ``,
feedbackUrl: ``, feedbackUrl: ``,