multiple/assets/favicon/BTYXfavicon.icoBinary files differ
multiple/assets/favicon/BWSMfavicon.icoBinary files differ
multiple/assets/favicon/CKGMfavicon.icoBinary files differ
multiple/assets/favicon/DCHXfavicon.icoBinary files differ
multiple/assets/favicon/DYKJfavicon.icoBinary files differ
multiple/assets/favicon/DZZBfavicon.icoBinary files differ
multiple/assets/favicon/HQJCfavicon.icoBinary files differ
multiple/assets/favicon/HTHBfavicon.icoBinary files differ
multiple/assets/favicon/HYJCfavicon.icoBinary files differ
multiple/assets/favicon/HYLQfavicon.icoBinary files differ
multiple/assets/favicon/HYZCfavicon.icoBinary files differ
multiple/assets/favicon/JHHGfavicon.icoBinary files differ
multiple/assets/favicon/JHYfavicon.icoBinary files differ
multiple/assets/favicon/JXJHfavicon.icoBinary files differ
multiple/assets/favicon/JXSMico.icoBinary files differ
multiple/assets/favicon/KHYYfavicon.icoBinary files differ
multiple/assets/favicon/KSfavicon.icoBinary files differ
multiple/assets/favicon/KYHGfavicon.icoBinary files differ
multiple/assets/favicon/LFJZfavicon.icoBinary files differ
multiple/assets/favicon/LSYfavicon.icoBinary files differ
multiple/assets/favicon/NYfavicon.icoBinary files differ
multiple/assets/favicon/QFSWfavicon.icoBinary files differ
multiple/assets/favicon/QXYfavicon.icoBinary files differ
multiple/assets/favicon/RFSYLogo.pngBinary files differ
multiple/assets/favicon/RFSYfavicon.icoBinary files differ
multiple/assets/favicon/SDJCfavicon.icoBinary files differ
multiple/assets/favicon/SDTXfavicon.icoBinary files differ
multiple/assets/favicon/WTXCfavicon.icoBinary files differ
multiple/assets/favicon/XCDQfavicon.icoBinary files differ
multiple/assets/favicon/XHKSfavicon.icoBinary files differ
multiple/assets/favicon/XLGSfavicon.icoBinary files differ
multiple/assets/favicon/XLZBico.icoBinary files differ
multiple/assets/favicon/XSWHfavicon.icoBinary files differ
multiple/assets/favicon/YSJXico.icoBinary files differ
multiple/assets/favicon/YSSfavicon.icoBinary files differ
multiple/assets/favicon/YTJZfavicon.icoBinary files differ
multiple/assets/favicon/ZDJCfavicon.icoBinary files differ
multiple/assets/favicon/ZQSYfavicon.icoBinary files differ
multiple/assets/favicon/ZXZNfavicon.icoBinary files differ
multiple/assets/logo/BTYXLogo.pngBinary files differ
multiple/assets/logo/BWSMLogo.pngBinary files differ
multiple/assets/logo/CKGMLogo.pngBinary files differ
multiple/assets/logo/DCHXLogo.pngBinary files differ
multiple/assets/logo/DYKJLogo.pngBinary files differ
multiple/assets/logo/DZZBLogo.pngBinary files differ
multiple/assets/logo/HQJCLogo.pngBinary files differ
multiple/assets/logo/HTHBLogo.pngBinary files differ
multiple/assets/logo/HYJCLogo.pngBinary files differ
multiple/assets/logo/HYLQLogo.pngBinary files differ
multiple/assets/logo/HYZCLogo.pngBinary files differ
multiple/assets/logo/JHHGLogo.pngBinary files differ
multiple/assets/logo/JHYLogo.pngBinary files differ
multiple/assets/logo/JXJHLogo.pngBinary files differ
multiple/assets/logo/JXSMLogo.pngBinary files differ
multiple/assets/logo/KHYYLogo.pngBinary files differ
multiple/assets/logo/KSLogo.pngBinary files differ
multiple/assets/logo/KYHGLogo.pngBinary files differ
multiple/assets/logo/LFJZLogo.pngBinary files differ
multiple/assets/logo/LSYLogo.pngBinary files differ
multiple/assets/logo/Logo.pngmultiple/assets/logo/NYLogo.pngBinary files differ
multiple/assets/logo/QFSWLogo.pngBinary files differ
multiple/assets/logo/QXYLogo.pngBinary files differ
multiple/assets/logo/RFSYLogo.pngBinary files differ
multiple/assets/logo/SDJCLogo.pngBinary files differ
multiple/assets/logo/SDTXLogo.pngBinary files differ
multiple/assets/logo/WTXCLogo.pngBinary files differ
multiple/assets/logo/XCDQLogo.pngBinary files differ
multiple/assets/logo/XHKSLogo.pngBinary files differ
multiple/assets/logo/XLGSLogo.pngBinary files differ
multiple/assets/logo/XLZBLogo.pngBinary files differ
multiple/assets/logo/XSWHLogo.pngBinary files differ
multiple/assets/logo/YSJXLogo.pngBinary files differ
multiple/assets/logo/YSSLogo.pngBinary files differ
multiple/assets/logo/YTJZLogo.pngBinary files differ
multiple/assets/logo/ZDJCLogo.pngBinary files differ
multiple/assets/logo/ZQSYLogo.pngBinary files differ
multiple/assets/logo/ZXZNLogo.pngBinary files differ
multiple/config.json
@@ -3,281 +3,21 @@ "env": { "VITE_APP_TITLE": "芯导云(管理信息系统)" }, "screen": "screen/PCDZView.png", "logo": "logo/Logo.png", "favicon": "favicon/favicon.ico" }, "TEST": { "JGHG": { "env": { "VITE_APP_TITLE": "工厂数字化MOM系统", "VITE_BASE_API": "http://1.15.17.182:9048", "VITE_JAVA_API": "http://1.15.17.182:9049" "VITE_APP_TITLE": "天津君歌化工设备集团有限公司信息管理", "VITE_BASE_API": "http://1.15.17.182:9053", "VITE_JAVA_API": "http://1.15.17.182:9052" }, "logo": "logo/XDRJ.png", "screen": "screen/login-background.png", "logo": "logo/Logo.png", "favicon": "favicon/favicon.ico" }, "BTYX": { "env": { "VITE_APP_TITLE": "河南帮太优选食品有限公司", "VITE_BASE_API": "http://1.15.17.182:9056", "VITE_JAVA_API": "http://1.15.17.182:9057" }, "logo": "logo/BTYXLogo.png", "favicon": "favicon/BTYXfavicon.ico" }, "ZXZN": { "env": { "VITE_APP_TITLE": "河南智芯智能机器人有限公司", "VITE_BASE_API": "http://127.0.0.1:9001", "VITE_JAVA_API": "http://127.0.0.1:9000" }, "logo": "logo/ZXZNLogo.png", "favicon": "favicon/ZXZNfavicon.ico" }, "SDTX": { "env": { "VITE_APP_TITLE": "河南善鼎通信科技有限公司", "VITE_BASE_API": "http://36.213.156.184:9001", "VITE_JAVA_API": "http://36.213.156.184:9000" }, "logo": "logo/SDTXLogo.png", "favicon": "favicon/SDTXfavicon.ico" }, "QXY": { "env": { "VITE_APP_TITLE": "强信宇电器管理系统", "VITE_BASE_API": "http://36.134.154.10:9001", "VITE_JAVA_API": "http://36.134.154.10:9000" }, "logo": "logo/QXYLogo.png", "favicon": "favicon/QXYfavicon.ico" }, "HQJC": { "env": { "VITE_APP_TITLE": "华强建材管理系统", "VITE_BASE_API": "http://36.134.77.64:9001", "VITE_JAVA_API": "http://36.134.77.64:9000" }, "logo": "logo/HQJCLogo.png", "favicon": "favicon/HQJCfavicon.ico" }, "XCDQ": { "env": { "VITE_APP_TITLE": "旭晨电器管理系统", "VITE_BASE_API": "http://36.133.45.183:9001", "VITE_JAVA_API": "http://36.133.45.183:9002" }, "logo": "logo/XCDQLogo.png", "favicon": "favicon/XCDQfavicon.ico" }, "BWSM": { "env": { "VITE_APP_TITLE": "八维商贸管理系统", "VITE_BASE_API": "http://1.15.17.182:9070", "VITE_JAVA_API": "http://1.15.17.182:9069" }, "logo": "logo/BWSMLogo.png", "favicon": "favicon/BWSMfavicon.ico" }, "CKGM": { "env": { "VITE_APP_TITLE": "宸康工贸管理系统", "VITE_BASE_API": "http://1.15.17.182:9072", "VITE_JAVA_API": "http://1.15.17.182:9071" }, "logo": "logo/CKGMLogo.png", "favicon": "favicon/CKGMfavicon.ico" }, "RFSY": { "env": { "VITE_APP_TITLE": "瑞丰盛业管理系统", "VITE_BASE_API": "http://1.15.17.182:9076", "VITE_JAVA_API": "http://1.15.17.182:9075" }, "logo": "logo/RFSYLogo.png", "favicon": "favicon/RFSYfavicon.ico" }, "ZQSY": { "env": { "VITE_APP_TITLE": "泽淇实业", "VITE_BASE_API": "http://36.213.128.159:9000", "VITE_JAVA_API": "http://36.213.128.159:9001" }, "logo": "logo/ZQSYLogo.png", "favicon": "favicon/ZQSYfavicon.ico" }, "JXJH": { "env": { "VITE_APP_TITLE": "浚县江海水泥制品有限公司", "VITE_BASE_API": "http://36.139.201.20:9000", "VITE_JAVA_API": "http://36.139.201.20:9001" }, "logo": "logo/JXJHLogo.png", "favicon": "favicon/JXJHfavicon.ico" }, "YTJZ": { "env": { "VITE_APP_TITLE": "豫泰建筑材料有限公司", "VITE_BASE_API": "http://36.139.201.181:9000", "VITE_JAVA_API": "http://36.139.201.181:9001" }, "logo": "logo/YTJZLogo.png", "favicon": "favicon/YTJZfavicon.ico" }, "HYLQ": { "env": { "VITE_APP_TITLE": "航逸路桥工程有限公司", "VITE_BASE_API": "http://36.139.202.111:9000", "VITE_JAVA_API": "http://36.139.202.111:9001" }, "logo": "logo/HYLQLogo.png", "favicon": "favicon/HYLQfavicon.ico" }, "QXY": { "env": { "VITE_APP_TITLE": "强信宇电器云主机", "VITE_BASE_API": "http://36.134.154.10:9000", "VITE_JAVA_API": "http://36.134.154.10:9001" }, "logo": "logo/QXYLogo.png", "favicon": "favicon/QXYfavicon.ico" }, "HYJC": { "env": { "VITE_APP_TITLE": "恒洋建材", "VITE_BASE_API": "http://36.138.94.178:9000", "VITE_JAVA_API": "http://36.138.94.178:9001" }, "logo": "logo/HYJCLogo.png", "favicon": "favicon/HYJCfavicon.ico" }, "JHY": { "env": { "VITE_APP_TITLE": "山西省榆社县晋和园食品有限公司", "VITE_BASE_API": "http://223.15.233.27:9001", "VITE_JAVA_API": "http://223.15.233.27:9002" }, "logo": "logo/JHYLogo.png", "favicon": "favicon/JHYfavicon.ico" }, "XCDQ": { "env": { "VITE_APP_TITLE": "旭晨电器管理系统", "VITE_BASE_API": "http://36.133.45.183:9001", "VITE_JAVA_API": "http://36.133.45.183:9002" }, "logo": "logo/XCDQLogo.png", "favicon": "favicon/XCDQfavicon.ico" }, "XHKS": { "env": { "VITE_APP_TITLE": "鑫铧矿山管理系统", "VITE_BASE_API": "http://36.133.45.183:9078", "VITE_JAVA_API": "http://36.133.45.183:9077" }, "logo": "logo/XHKSLogo.png", "favicon": "favicon/XHKSfavicon.ico" }, "QFSW": { "env": { "VITE_APP_TITLE": "乾丰生物管理系统", "VITE_BASE_API": "http://36.133.45.183:9080", "VITE_JAVA_API": "http://36.133.45.183:9079" }, "logo": "logo/QFSWLogo.png", "favicon": "favicon/QFSWfavicon.ico" }, "ZDJC": { "env": { "VITE_APP_TITLE": "正德新型建材管理系统", "VITE_BASE_API": "http://36.133.45.183:9082", "VITE_JAVA_API": "http://36.133.45.183:9081" }, "logo": "logo/ZDJCLogo.png", "favicon": "favicon/ZDJCfavicon.ico" }, "LSY": { "env": { "VITE_APP_TITLE": "山西林昇焱工贸有限公司", "VITE_BASE_API": "http://36.133.45.183:9084", "VITE_JAVA_API": "http://36.133.45.183:9083" }, "logo": "logo/LSYLogo.png", "favicon": "favicon/LSYfavicon.ico" }, "HTHB": { "env": { "VITE_APP_TITLE": "山西宏腾新型环保科技有限责任公司", "VITE_BASE_API": "http://36.133.45.183:9090", "VITE_JAVA_API": "http://36.133.45.183:9089" }, "logo": "logo/HTHBLogo.png", "favicon": "favicon/HTHBfavicon.ico" }, "YSS": { "env": { "VITE_APP_TITLE": "山西羿神晟农生物科技发展有限公司", "VITE_BASE_API": "http://36.133.45.183:9086", "VITE_JAVA_API": "http://36.133.45.183:9085" }, "logo": "logo/YSSLogo.png", "favicon": "favicon/YSSfavicon.ico" }, "KYHG": { "env": { "VITE_APP_TITLE": "山西坤源化工有限公司", "VITE_BASE_API": "http://36.137.13.29:9001", "VITE_JAVA_API": "http://36.137.13.29:9002" }, "logo": "logo/KYHGLogo.png", "favicon": "favicon/KYHGfavicon.ico" }, "JXSM": { "env": { "VITE_APP_TITLE": "襄垣县洁鑫商贸有限公司", "VITE_BASE_API": "http://36.134.76.148:9001", "VITE_JAVA_API": "http://36.134.76.148:9002" }, "logo": "logo/JXSMLogo.png", "favicon": "favicon/JXSMico.ico" }, "DCHX": { "env": { "VITE_APP_TITLE": "山西大成化纤股份有限公司", "VITE_BASE_API": "http://36.134.76.148:9088", "VITE_JAVA_API": "http://36.134.76.148:9087" }, "logo": "logo/DCHXLogo.png", "favicon": "favicon/DCHXfavicon.ico" }, "KHYY": { "env": { "VITE_APP_TITLE": "长治市坤皓液压制造有限公司", "VITE_BASE_API": "http://36.134.76.148:9094", "VITE_JAVA_API": "http://36.134.76.148:9093" }, "logo": "logo/KHYYLogo.png", "favicon": "favicon/KHYYfavicon.ico" }, "XLGS": { "env": { "VITE_APP_TITLE": "长治市鑫浪供水设备有限公司", "VITE_BASE_API": "http://36.134.76.148:9092", "VITE_JAVA_API": "http://36.134.76.148:9091" }, "logo": "logo/XLGSLogo.png", "favicon": "favicon/XLGSfavicon.ico" }, "NY": { "env": { "VITE_APP_TITLE": "山西省诺颢新材料有限公司", "VITE_BASE_API": "http://36.134.76.148:9092", "VITE_JAVA_API": "http://36.134.76.148:9091" }, "logo": "logo/NYLogo.png", "favicon": "favicon/NYfavicon.ico" }, "screen": "/src/assets/images/login-background.png", "logo": "/src/assets/logo/logo.png", "favicon": "/public/favicon.ico" } multiple/multiple-build.js
@@ -1,152 +1,86 @@ import fs from "fs/promises"; import fsSync from "fs"; import path from "path"; import { fileURLToPath } from "url"; import fs from 'fs/promises'; import fsSync from 'fs'; import path from 'path'; import { fileURLToPath } from 'url'; import { execSync } from "child_process"; // 获取 __dirname const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const data = await fs.readFile(path.join(__dirname, "config.json"), "utf-8"); // 读取 JSON 配置 const data = await fs.readFile(path.join(__dirname, 'config.json'), 'utf-8'); const config = JSON.parse(data); const rootPath = path.resolve(__dirname, ".."); const resourcePath = path.join(rootPath, "multiple", "assets"); const replacePath = path.join(rootPath, "replace"); const envFilePath = path.join(rootPath, ".env.production.local"); // 项目路径 const rootPath = path.resolve(__dirname, '..'); const resourcePath = path.join(rootPath, 'multiple', 'assets'); const replacePath = path.join(rootPath, 'replace'); // 获取命令行参数 const params = parseArgs(process.argv); const company = resolveCompany(params); const company = params["company"] ?? "default"; const companyMap = config[company]; if (!companyMap) { const availableCompanies = Object.entries(config) .filter(([, value]) => value && typeof value === "object" && value.env) .map(([key]) => key) .sort(); throw new Error( `未知 company: "${company}"。可选值: ${availableCompanies.join(", ")}` ); } console.log(`当前 company: ${company}`); async function copyFileWithOverwrite(src, dest) { await fs.mkdir(path.dirname(dest), { recursive: true }); if (fsSync.existsSync(dest)) { try { await fs.chmod(dest, 0o666); } catch { // Ignore chmod failure and continue. } await fs.rm(dest, { force: true }); } await fs.copyFile(src, dest); } const envFilePath = path.join(process.cwd(), '.env.production.local'); try { console.log("=======生成.env======="); const envContent = Object.entries(companyMap.env) .map(([key, value]) => `${key}='${value}'`) .join("\n") + "\n"; await fs.writeFile(envFilePath, envContent, "utf-8"); // 1️⃣ 生成 .env console.log("=======生成.env======="); const envContent = Object.entries(companyMap.env) .map(([key, value]) => `${key}='${value}'`) .join('\n') + '\n'; await fs.writeFile(envFilePath, envContent, 'utf-8'); console.log("=======修改资源======="); for (const [key] of Object.entries(companyMap)) { if (key === "env") continue; // 2️⃣ 备份原始资源并替换 console.log("=======修改资源======="); for (const [key, value] of Object.entries(companyMap)) { if (key === 'env') continue; const originFile = path.join(rootPath, config[key]); const backupFile = path.join(replacePath, config[key]); const replaceFile = path.join(resourcePath, companyMap[key]); const originFile = path.join(rootPath, config[key]); const backupFile = path.join(replacePath, config[key]); const replaceFile = path.join(resourcePath, companyMap[key]); await copyFileWithOverwrite(originFile, backupFile); await copyFileWithOverwrite(replaceFile, originFile); } await fs.mkdir(path.dirname(backupFile), { recursive: true }); await fs.copyFile(originFile, backupFile); await fs.copyFile(replaceFile, originFile); } console.log("=====开始打包====="); const buildEnv = createBuildEnv(companyMap.env); execSync("vite build", { stdio: "inherit", cwd: rootPath, env: buildEnv }); console.log("=====打包完成======"); console.log("=====开始打包======"); execSync("vite build", { stdio: "inherit" }); console.log("=====打包完成======"); } finally { console.log("=====恢复资源======"); console.log("=====恢复资源======"); if (fsSync.existsSync(envFilePath)) { await fs.unlink(envFilePath); console.log(`🗑️ 已删除 ${envFilePath}`); } if (fsSync.existsSync(replacePath)) { for (const [key] of Object.entries(companyMap)) { if (key === "env") continue; const originFile = path.join(rootPath, config[key]); const backupFile = path.join(replacePath, config[key]); await copyFileWithOverwrite(backupFile, originFile); // 删除临时 .env 文件 if (fsSync.existsSync(envFilePath)) { await fs.unlink(envFilePath); console.log(`🗑️ 已删除 ${envFilePath}`); } await fs.rm(replacePath, { recursive: true, force: true }); console.log(`🗑️ 已删除 ${replacePath}`); } // 恢复资源文件 if (fsSync.existsSync(replacePath)) { for (const [key, value] of Object.entries(companyMap)) { if (key === 'env') continue; const originFile = path.join(rootPath, config[key]); const backupFile = path.join(replacePath, config[key]); await fs.copyFile(backupFile, originFile); } await fs.rm(replacePath, { recursive: true, force: true }); console.log(`🗑️ 已删除 ${replacePath}`); } } // 简单命令行参数解析 function parseArgs(argv) { const params = {}; for (let index = 2; index < argv.length; index++) { const arg = argv[index]; if (!arg.startsWith("--")) continue; const normalized = arg.slice(2); const equalIndex = normalized.indexOf("="); if (equalIndex >= 0) { const key = normalized.slice(0, equalIndex); const value = normalized.slice(equalIndex + 1); params[key] = value || true; continue; const params = {}; for (const arg of argv.slice(2)) { if (arg.startsWith('--')) { const [key, value] = arg.slice(2).split('='); params[key] = value ?? true; } } const nextArg = argv[index + 1]; if (nextArg && !nextArg.startsWith("--")) { params[normalized] = nextArg; index += 1; continue; } params[normalized] = true; } return params; } function resolveCompany(parsedParams) { const fromArg = parseValue(parsedParams.company); if (fromArg) return fromArg; const fromNpmConfig = parseValue(process.env.npm_config_company); if (fromNpmConfig) return fromNpmConfig; const fromEnv = parseValue(process.env.COMPANY ?? process.env.company); if (fromEnv) return fromEnv; return "default"; } function parseValue(value) { if (value == null || value === true) return undefined; if (typeof value !== "string") return undefined; const trimmed = value.trim(); if (!trimmed) return undefined; return trimmed.replace(/^["']|["']$/g, ""); } function createBuildEnv(companyEnv) { const env = { ...process.env }; for (const key of Object.keys(env)) { if (key.startsWith("VITE_")) { delete env[key]; } } return { ...env, ...companyEnv, VITE_APP_ENV: "production", }; return params; }