生产管理系统前端 - 环境变量配置
This commit is contained in:
23
crop-x/env/.env.dev
vendored
Normal file
23
crop-x/env/.env.dev
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# 开发环境配置
|
||||||
|
NODE_ENV=development
|
||||||
|
|
||||||
|
# 前端域名
|
||||||
|
FRONTEND_BASE_URL=https://cavin-smart-crop-ui-app.dev.maimaiag.com
|
||||||
|
|
||||||
|
# 后端 API 地址
|
||||||
|
BACKEND_BASE_URL=https://cavin-smart-crop-backend-app.dev.maimaiag.com
|
||||||
|
|
||||||
|
# API 版本
|
||||||
|
API_VERSION=v1
|
||||||
|
|
||||||
|
# 调试模式
|
||||||
|
DEBUG=true
|
||||||
|
|
||||||
|
# 是否开启 Mock 数据
|
||||||
|
USE_MOCK=false
|
||||||
|
|
||||||
|
# 应用名称
|
||||||
|
APP_NAME=智慧农业生产管理系统
|
||||||
|
|
||||||
|
# 环境描述
|
||||||
|
ENV_DESCRIPTION=开发环境
|
||||||
43
crop-x/env/.env.prod
vendored
Normal file
43
crop-x/env/.env.prod
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# 生产环境配置
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# 前端域名
|
||||||
|
FRONTEND_BASE_URL=https://cavin-smart-crop-ui-app.prod.maimaiag.com
|
||||||
|
|
||||||
|
# 后端 API 地址
|
||||||
|
BACKEND_BASE_URL=https://cavin-smart-crop-backend-app.prod.maimaiag.com
|
||||||
|
|
||||||
|
# API 版本
|
||||||
|
API_VERSION=v1
|
||||||
|
|
||||||
|
# 调试模式
|
||||||
|
DEBUG=false
|
||||||
|
|
||||||
|
# 是否开启 Mock 数据
|
||||||
|
USE_MOCK=false
|
||||||
|
|
||||||
|
# 应用名称
|
||||||
|
APP_NAME=智慧农业生产管理系统
|
||||||
|
|
||||||
|
# 环境描述
|
||||||
|
ENV_DESCRIPTION=生产环境
|
||||||
|
|
||||||
|
# 生产环境特有配置
|
||||||
|
API_TIMEOUT=30000
|
||||||
|
ENABLE_ERROR_LOGGING=true
|
||||||
|
ENABLE_PERFORMANCE_MONITORING=true
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING=true
|
||||||
|
ENABLE_ANALYTICS=true
|
||||||
|
|
||||||
|
# 安全配置
|
||||||
|
SENTRY_DSN=https://your-sentry-dsn.prod@sentry.io/project-id
|
||||||
|
CDN_BASE_URL=https://cdn.cavin-smart-crop.com
|
||||||
|
|
||||||
|
# 功能开关
|
||||||
|
ENABLE_MAINTENANCE_MODE=false
|
||||||
|
ENABLE_NEW_FEATURES=true
|
||||||
|
ENABLE_BETA_FEATURES=false
|
||||||
|
|
||||||
|
# 缓存配置
|
||||||
|
CACHE_TTL=3600
|
||||||
|
ENABLE_SERVICE_WORKER=true
|
||||||
28
crop-x/env/.env.test
vendored
Normal file
28
crop-x/env/.env.test
vendored
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# 测试环境配置
|
||||||
|
NODE_ENV=test
|
||||||
|
|
||||||
|
# 前端域名
|
||||||
|
FRONTEND_BASE_URL=https://cavin-smart-crop-ui-app.test.maimaiag.com
|
||||||
|
|
||||||
|
# 后端 API 地址 (等待后端部署,先用开发环境的)
|
||||||
|
BACKEND_BASE_URL=https://cavin-smart-crop-backend-app.dev.maimaiag.com
|
||||||
|
|
||||||
|
# API 版本
|
||||||
|
API_VERSION=v1
|
||||||
|
|
||||||
|
# 调试模式
|
||||||
|
DEBUG=true
|
||||||
|
|
||||||
|
# 是否开启 Mock 数据
|
||||||
|
USE_MOCK=false
|
||||||
|
|
||||||
|
# 应用名称
|
||||||
|
APP_NAME=智慧农业生产管理系统
|
||||||
|
|
||||||
|
# 环境描述
|
||||||
|
ENV_DESCRIPTION=测试环境
|
||||||
|
|
||||||
|
# 其他测试环境特有配置
|
||||||
|
API_TIMEOUT=15000
|
||||||
|
ENABLE_ERROR_LOGGING=true
|
||||||
|
ENABLE_PERFORMANCE_MONITORING=true
|
||||||
30
crop-x/env/.env.uat
vendored
Normal file
30
crop-x/env/.env.uat
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# UAT (用户验收测试) 环境配置
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
# 前端域名
|
||||||
|
FRONTEND_BASE_URL=https://cavin-smart-crop-ui-app.uat.maimaiag.com
|
||||||
|
|
||||||
|
# 后端 API 地址
|
||||||
|
BACKEND_BASE_URL=https://cavin-smart-crop-backend-app.uat.maimaiag.com
|
||||||
|
|
||||||
|
# API 版本
|
||||||
|
API_VERSION=v1
|
||||||
|
|
||||||
|
# 调试模式
|
||||||
|
DEBUG=false
|
||||||
|
|
||||||
|
# 是否开启 Mock 数据
|
||||||
|
USE_MOCK=false
|
||||||
|
|
||||||
|
# 应用名称
|
||||||
|
APP_NAME=智慧农业生产管理系统
|
||||||
|
|
||||||
|
# 环境描述
|
||||||
|
ENV_DESCRIPTION=UAT 环境
|
||||||
|
|
||||||
|
# UAT 特有配置
|
||||||
|
API_TIMEOUT=20000
|
||||||
|
ENABLE_ERROR_LOGGING=true
|
||||||
|
ENABLE_PERFORMANCE_MONITORING=true
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING=true
|
||||||
|
SENTRY_DSN=https://your-sentry-dsn.uat@sentry.io/project-id
|
||||||
@@ -11,7 +11,9 @@ const nextConfig = {
|
|||||||
// 修复CSS构建问题
|
// 修复CSS构建问题
|
||||||
experimental: {
|
experimental: {
|
||||||
// forceSwcTransforms: true,
|
// forceSwcTransforms: true,
|
||||||
turbo: {
|
},
|
||||||
|
// 新的 Turbopack 配置
|
||||||
|
turbopack: {
|
||||||
rules: {
|
rules: {
|
||||||
'*.svg': {
|
'*.svg': {
|
||||||
loaders: ['@svgr/webpack'],
|
loaders: ['@svgr/webpack'],
|
||||||
@@ -19,7 +21,8 @@ const nextConfig = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
// 解决工作区根目录问题
|
||||||
|
outputFileTracingRoot: process.cwd(),
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
@@ -5,19 +5,17 @@
|
|||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev --turbopack",
|
"dev": "next dev --turbopack",
|
||||||
"test:ts": "tsc --noEmit",
|
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
|
||||||
"lint:fix": "eslint . --ext ts,tsx --fix",
|
"lint:fix": "eslint . --ext ts,tsx --fix",
|
||||||
"format": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
||||||
"format:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,css,md}\"",
|
|
||||||
"type-check": "tsc --noEmit",
|
"type-check": "tsc --noEmit",
|
||||||
"scripts:setup": "node scripts/setup-dev-tools.js",
|
|
||||||
"scripts:enable": "node scripts/setup-dev-tools.js --enable",
|
|
||||||
"scripts:disable": "node scripts/setup-dev-tools.js --disable",
|
|
||||||
"api:generate": "node scripts/generate-api.cjs",
|
"api:generate": "node scripts/generate-api.cjs",
|
||||||
"deploy": "node scripts/deploy.js"
|
"deploy": "node scripts/deploy.js",
|
||||||
|
"build:dev": "node scripts/build.cjs dev",
|
||||||
|
"build:test": "node scripts/build.cjs test",
|
||||||
|
"build:uat": "node scripts/build.cjs uat",
|
||||||
|
"build:prod": "node scripts/build.cjs prod"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@hookform/resolvers": "^5.2.2",
|
"@hookform/resolvers": "^5.2.2",
|
||||||
|
|||||||
343
crop-x/scripts/build.cjs
Normal file
343
crop-x/scripts/build.cjs
Normal file
@@ -0,0 +1,343 @@
|
|||||||
|
/**
|
||||||
|
* 统一构建脚本
|
||||||
|
*
|
||||||
|
* 整合环境设置、API生成和Next.js构建的完整构建流程
|
||||||
|
* 支持多环境构建:dev, test, uat, prod
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync, spawn } = require('child_process');
|
||||||
|
|
||||||
|
// ANSI 颜色代码
|
||||||
|
const colors = {
|
||||||
|
reset: '\x1b[0m',
|
||||||
|
red: '\x1b[31m',
|
||||||
|
green: '\x1b[32m',
|
||||||
|
yellow: '\x1b[33m',
|
||||||
|
blue: '\x1b[34m',
|
||||||
|
cyan: '\x1b[36m',
|
||||||
|
white: '\x1b[37m'
|
||||||
|
};
|
||||||
|
|
||||||
|
// 日志函数
|
||||||
|
function log(message, color = 'white') {
|
||||||
|
console.log(`${colors[color]}${message}${colors.reset}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function logSuccess(message) {
|
||||||
|
log(`✓ ${message}`, 'green');
|
||||||
|
}
|
||||||
|
|
||||||
|
function logError(message) {
|
||||||
|
log(`✗ ${message}`, 'red');
|
||||||
|
}
|
||||||
|
|
||||||
|
function logInfo(message) {
|
||||||
|
log(`ℹ ${message}`, 'blue');
|
||||||
|
}
|
||||||
|
|
||||||
|
function logStep(message) {
|
||||||
|
log(`🔄 ${message}`, 'cyan');
|
||||||
|
}
|
||||||
|
|
||||||
|
function logWarning(message) {
|
||||||
|
log(`⚠ ${message}`, 'yellow');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取命令行参数中的环境
|
||||||
|
*/
|
||||||
|
function getEnvironmentFromArgs() {
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
|
||||||
|
// 查找 --env 参数
|
||||||
|
const envArg = args.find(arg => arg.startsWith('--env='));
|
||||||
|
if (envArg) {
|
||||||
|
return envArg.split('=')[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查找直接的参数
|
||||||
|
const directEnv = args[0];
|
||||||
|
if (['dev', 'test', 'uat', 'prod'].includes(directEnv)) {
|
||||||
|
return directEnv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 验证环境名称
|
||||||
|
*/
|
||||||
|
function validateEnvironment(env) {
|
||||||
|
const validEnvs = ['dev', 'test', 'uat', 'prod'];
|
||||||
|
if (!validEnvs.includes(env)) {
|
||||||
|
logError(`无效的环境名称: ${env}`);
|
||||||
|
logInfo(`支持的环境: ${validEnvs.join(', ')}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 复制环境配置文件
|
||||||
|
*/
|
||||||
|
function copyEnvironmentConfig(env) {
|
||||||
|
logStep(`设置 ${env} 环境配置`);
|
||||||
|
|
||||||
|
const envDir = path.join(process.cwd(), 'env');
|
||||||
|
const sourceFile = path.join(envDir, `.env.${env}`);
|
||||||
|
const targetFile = path.join(process.cwd(), '.env.local');
|
||||||
|
|
||||||
|
// 检查源文件是否存在
|
||||||
|
if (!fs.existsSync(sourceFile)) {
|
||||||
|
logError(`环境配置文件不存在: ${sourceFile}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 复制文件
|
||||||
|
fs.copyFileSync(sourceFile, targetFile);
|
||||||
|
logSuccess(`已复制环境配置: ${env}`);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
logError(`复制环境配置文件失败: ${error.message}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清理缓存目录
|
||||||
|
*/
|
||||||
|
function cleanCache() {
|
||||||
|
logStep('清理缓存目录');
|
||||||
|
|
||||||
|
const dirsToClean = ['.next', 'node_modules/.cache'];
|
||||||
|
|
||||||
|
dirsToClean.forEach(dir => {
|
||||||
|
const dirPath = path.join(process.cwd(), dir);
|
||||||
|
if (fs.existsSync(dirPath)) {
|
||||||
|
try {
|
||||||
|
fs.rmSync(dirPath, { recursive: true, force: true });
|
||||||
|
logSuccess(`已清理: ${dir}`);
|
||||||
|
} catch (error) {
|
||||||
|
logWarning(`清理 ${dir} 失败: ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成API客户端代码
|
||||||
|
*/
|
||||||
|
function generateApi(env) {
|
||||||
|
logStep('生成API客户端代码');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 设置环境变量
|
||||||
|
const apiBaseUrl = getApiBaseUrl(env);
|
||||||
|
process.env.API_BASE_URL = apiBaseUrl;
|
||||||
|
|
||||||
|
logInfo(`API服务器: ${apiBaseUrl}`);
|
||||||
|
|
||||||
|
// 执行API生成脚本
|
||||||
|
execSync('node scripts/generate-api.cjs', {
|
||||||
|
stdio: 'inherit',
|
||||||
|
cwd: process.cwd()
|
||||||
|
});
|
||||||
|
|
||||||
|
logSuccess('API客户端代码生成完成');
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
logError(`API生成失败: ${error.message}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取API基础URL
|
||||||
|
*/
|
||||||
|
function getApiBaseUrl(env) {
|
||||||
|
const apiUrls = {
|
||||||
|
dev: 'http://localhost:8080', // 开发环境使用本地后端
|
||||||
|
test: 'http://pengcode.tech:8080', // 测试环境使用指定后端
|
||||||
|
uat: 'https://cavin-smart-crop-backend-app.uat.maimaiag.com',
|
||||||
|
prod: 'https://cavin-smart-crop-backend-app.prod.maimaiag.com'
|
||||||
|
};
|
||||||
|
|
||||||
|
return apiUrls[env] || apiUrls.dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Next.js 构建
|
||||||
|
*/
|
||||||
|
function buildNext(env) {
|
||||||
|
logStep('执行 Next.js 构建');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 设置环境变量
|
||||||
|
process.env.NODE_ENV = 'production'; // 所有构建都使用 production 模式
|
||||||
|
process.env.NEXT_PUBLIC_ENV = env;
|
||||||
|
|
||||||
|
// 执行构建
|
||||||
|
execSync('npm run build', {
|
||||||
|
stdio: 'inherit',
|
||||||
|
cwd: process.cwd()
|
||||||
|
});
|
||||||
|
|
||||||
|
logSuccess('Next.js 构建完成');
|
||||||
|
return true;
|
||||||
|
} catch (error) {
|
||||||
|
logError(`Next.js 构建失败: ${error.message}`);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示构建信息
|
||||||
|
*/
|
||||||
|
function showBuildInfo(env, totalTime) {
|
||||||
|
const config = {
|
||||||
|
dev: { name: '开发环境', url: 'https://cavin-smart-crop-ui-app.dev.maimaiag.com' },
|
||||||
|
test: { name: '测试环境', url: 'https://cavin-smart-crop-ui-app.test.maimaiag.com' },
|
||||||
|
uat: { name: 'UAT环境', url: 'https://cavin-smart-crop-ui-app.uat.maimaiag.com' },
|
||||||
|
prod: { name: '生产环境', url: 'https://cavin-smart-crop-ui-app.prod.maimaiag.com' }
|
||||||
|
};
|
||||||
|
|
||||||
|
const envConfig = config[env];
|
||||||
|
|
||||||
|
log('='.repeat(60), 'green');
|
||||||
|
logSuccess(`构建完成!总耗时: ${totalTime}ms`);
|
||||||
|
logSuccess(`环境: ${envConfig.name} (${env})`);
|
||||||
|
logSuccess(`前端地址: ${envConfig.url}`);
|
||||||
|
logSuccess(`后端地址: ${getApiBaseUrl(env)}`);
|
||||||
|
logSuccess('构建产物: .next 目录');
|
||||||
|
log('='.repeat(60), 'green');
|
||||||
|
|
||||||
|
logInfo('部署建议:');
|
||||||
|
logInfo(` 将 .next 目录和 package.json 部署到 ${envConfig.name}`);
|
||||||
|
if (env !== 'dev') {
|
||||||
|
logInfo(` 确保环境变量 NODE_ENV=production 和 NEXT_PUBLIC_ENV=${env}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示帮助信息
|
||||||
|
*/
|
||||||
|
function showHelp() {
|
||||||
|
log('用法: node scripts/build.cjs [环境] [选项]', 'cyan');
|
||||||
|
log('');
|
||||||
|
log('环境:', 'yellow');
|
||||||
|
log(' dev 开发环境', 'white');
|
||||||
|
log(' test 测试环境', 'white');
|
||||||
|
log(' uat UAT 环境', 'white');
|
||||||
|
log(' prod 生产环境', 'white');
|
||||||
|
log('');
|
||||||
|
log('选项:', 'yellow');
|
||||||
|
log(' --env=<environment> 指定环境 (与直接指定环境等效)', 'white');
|
||||||
|
log(' --clean 构建前清理缓存', 'white');
|
||||||
|
log(' --skip-api 跳过API生成', 'white');
|
||||||
|
log(' --skip-build 跳过Next.js构建(仅设置环境)', 'white');
|
||||||
|
log(' --help 显示此帮助信息', 'white');
|
||||||
|
log('');
|
||||||
|
log('示例:', 'yellow');
|
||||||
|
log(' node scripts/build.cjs dev # 开发环境完整构建', 'white');
|
||||||
|
log(' node scripts/build.cjs test --clean # 测试环境清理缓存后构建', 'white');
|
||||||
|
log(' node scripts/build.cjs prod --skip-api # 生产环境跳过API生成构建', 'white');
|
||||||
|
log(' node scripts/build.cjs uat --skip-build # UAT环境仅设置环境和API生成', 'white');
|
||||||
|
log('');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主函数
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
const startTime = Date.now();
|
||||||
|
|
||||||
|
log('='.repeat(60), 'cyan');
|
||||||
|
log('统一构建脚本', 'cyan');
|
||||||
|
log('整合环境设置、API生成和Next.js构建', 'cyan');
|
||||||
|
log('='.repeat(60), 'cyan');
|
||||||
|
|
||||||
|
// 检查帮助参数
|
||||||
|
if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
||||||
|
showHelp();
|
||||||
|
process.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取环境参数
|
||||||
|
let env = getEnvironmentFromArgs();
|
||||||
|
if (!env) {
|
||||||
|
logError('请指定环境参数');
|
||||||
|
logInfo('使用 --help 查看帮助信息');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 验证环境
|
||||||
|
if (!validateEnvironment(env)) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析选项
|
||||||
|
const shouldClean = process.argv.includes('--clean');
|
||||||
|
const skipApi = process.argv.includes('--skip-api');
|
||||||
|
const skipBuild = process.argv.includes('--skip-build');
|
||||||
|
|
||||||
|
logInfo(`目标环境: ${env}`);
|
||||||
|
logInfo(`工作目录: ${process.cwd()}`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 1. 设置环境配置
|
||||||
|
const envSuccess = copyEnvironmentConfig(env);
|
||||||
|
if (!envSuccess) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 清理缓存(可选)
|
||||||
|
if (shouldClean) {
|
||||||
|
cleanCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 生成API客户端(可选)
|
||||||
|
if (!skipApi) {
|
||||||
|
const apiSuccess = generateApi(env);
|
||||||
|
if (!apiSuccess) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logInfo('跳过API生成');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Next.js 构建(可选)
|
||||||
|
if (!skipBuild) {
|
||||||
|
const buildSuccess = buildNext(env);
|
||||||
|
if (!buildSuccess) {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logInfo('跳过Next.js构建');
|
||||||
|
}
|
||||||
|
|
||||||
|
const totalTime = Date.now() - startTime;
|
||||||
|
showBuildInfo(env, totalTime);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
const totalTime = Date.now() - startTime;
|
||||||
|
logError(`构建失败 (${totalTime}ms): ${error.message}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行主函数
|
||||||
|
if (require.main === module) {
|
||||||
|
main();
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
copyEnvironmentConfig,
|
||||||
|
generateApi,
|
||||||
|
buildNext,
|
||||||
|
validateEnvironment,
|
||||||
|
getEnvironmentFromArgs
|
||||||
|
};
|
||||||
289
crop-x/src/env/index.ts
vendored
Normal file
289
crop-x/src/env/index.ts
vendored
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
/**
|
||||||
|
* 环境变量管理系统
|
||||||
|
*
|
||||||
|
* 这个模块提供统一的环境配置管理,支持多环境切换
|
||||||
|
* 根据构建时的 NODE_ENV 自动加载对应的环境配置文件
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 环境类型定义
|
||||||
|
export type Environment = 'dev' | 'test' | 'uat' | 'prod';
|
||||||
|
|
||||||
|
// 环境配置接口
|
||||||
|
export interface EnvironmentConfig {
|
||||||
|
// 基础配置
|
||||||
|
NODE_ENV: string;
|
||||||
|
FRONTEND_BASE_URL: string;
|
||||||
|
BACKEND_BASE_URL: string;
|
||||||
|
API_VERSION: string;
|
||||||
|
|
||||||
|
// 功能配置
|
||||||
|
DEBUG: boolean;
|
||||||
|
USE_MOCK: boolean;
|
||||||
|
|
||||||
|
// 应用信息
|
||||||
|
APP_NAME: string;
|
||||||
|
ENV_DESCRIPTION: string;
|
||||||
|
|
||||||
|
// 高级配置
|
||||||
|
API_TIMEOUT?: number;
|
||||||
|
ENABLE_ERROR_LOGGING?: boolean;
|
||||||
|
ENABLE_PERFORMANCE_MONITORING?: boolean;
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING?: boolean;
|
||||||
|
SENTRY_DSN?: string;
|
||||||
|
CDN_BASE_URL?: string;
|
||||||
|
|
||||||
|
// 生产环境特有
|
||||||
|
ENABLE_MAINTENANCE_MODE?: boolean;
|
||||||
|
ENABLE_NEW_FEATURES?: boolean;
|
||||||
|
ENABLE_BETA_FEATURES?: boolean;
|
||||||
|
ENABLE_ANALYTICS?: boolean;
|
||||||
|
CACHE_TTL?: number;
|
||||||
|
ENABLE_SERVICE_WORKER?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 环境配置映射
|
||||||
|
const ENV_CONFIGS: Record<Environment, EnvironmentConfig> = {
|
||||||
|
dev: {
|
||||||
|
NODE_ENV: 'development',
|
||||||
|
FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.dev.maimaiag.com',
|
||||||
|
BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.dev.maimaiag.com',
|
||||||
|
API_VERSION: 'v1',
|
||||||
|
DEBUG: true,
|
||||||
|
USE_MOCK: false,
|
||||||
|
APP_NAME: '智慧农业生产管理系统',
|
||||||
|
ENV_DESCRIPTION: '开发环境',
|
||||||
|
API_TIMEOUT: 10000,
|
||||||
|
ENABLE_ERROR_LOGGING: true,
|
||||||
|
ENABLE_PERFORMANCE_MONITORING: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
test: {
|
||||||
|
NODE_ENV: 'test',
|
||||||
|
FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.test.maimaiag.com',
|
||||||
|
BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.dev.maimaiag.com', // 临时使用开发环境后端
|
||||||
|
API_VERSION: 'v1',
|
||||||
|
DEBUG: true,
|
||||||
|
USE_MOCK: false,
|
||||||
|
APP_NAME: '智慧农业生产管理系统',
|
||||||
|
ENV_DESCRIPTION: '测试环境',
|
||||||
|
API_TIMEOUT: 15000,
|
||||||
|
ENABLE_ERROR_LOGGING: true,
|
||||||
|
ENABLE_PERFORMANCE_MONITORING: true,
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
uat: {
|
||||||
|
NODE_ENV: 'production',
|
||||||
|
FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.uat.maimaiag.com',
|
||||||
|
BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.uat.maimaiag.com',
|
||||||
|
API_VERSION: 'v1',
|
||||||
|
DEBUG: false,
|
||||||
|
USE_MOCK: false,
|
||||||
|
APP_NAME: '智慧农业生产管理系统',
|
||||||
|
ENV_DESCRIPTION: 'UAT 环境',
|
||||||
|
API_TIMEOUT: 20000,
|
||||||
|
ENABLE_ERROR_LOGGING: true,
|
||||||
|
ENABLE_PERFORMANCE_MONITORING: true,
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING: true,
|
||||||
|
SENTRY_DSN: 'https://your-sentry-dsn.uat@sentry.io/project-id',
|
||||||
|
},
|
||||||
|
|
||||||
|
prod: {
|
||||||
|
NODE_ENV: 'production',
|
||||||
|
FRONTEND_BASE_URL: 'https://cavin-smart-crop-ui-app.prod.maimaiag.com',
|
||||||
|
BACKEND_BASE_URL: 'https://cavin-smart-crop-backend-app.prod.maimaiag.com',
|
||||||
|
API_VERSION: 'v1',
|
||||||
|
DEBUG: false,
|
||||||
|
USE_MOCK: false,
|
||||||
|
APP_NAME: '智慧农业生产管理系统',
|
||||||
|
ENV_DESCRIPTION: '生产环境',
|
||||||
|
API_TIMEOUT: 30000,
|
||||||
|
ENABLE_ERROR_LOGGING: true,
|
||||||
|
ENABLE_PERFORMANCE_MONITORING: true,
|
||||||
|
ENABLE_USER_BEHAVIOR_TRACKING: true,
|
||||||
|
ENABLE_ANALYTICS: true,
|
||||||
|
SENTRY_DSN: 'https://your-sentry-dsn.prod@sentry.io/project-id',
|
||||||
|
CDN_BASE_URL: 'https://cdn.cavin-smart-crop.com',
|
||||||
|
ENABLE_MAINTENANCE_MODE: false,
|
||||||
|
ENABLE_NEW_FEATURES: true,
|
||||||
|
ENABLE_BETA_FEATURES: false,
|
||||||
|
CACHE_TTL: 3600,
|
||||||
|
ENABLE_SERVICE_WORKER: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前环境
|
||||||
|
*
|
||||||
|
* 优先级:
|
||||||
|
* 1. 环境变量 NEXT_PUBLIC_ENV
|
||||||
|
* 2. 环境变量 NODE_ENV
|
||||||
|
* 3. 默认 'dev' 环境
|
||||||
|
*/
|
||||||
|
export const getEnv = (): Environment => {
|
||||||
|
// 浏览器环境
|
||||||
|
if (typeof window !== 'undefined') {
|
||||||
|
const env = process.env.NEXT_PUBLIC_ENV as Environment;
|
||||||
|
if (env && Object.keys(ENV_CONFIGS).includes(env)) {
|
||||||
|
return env;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 服务端环境
|
||||||
|
const nodeEnv = process.env.NODE_ENV;
|
||||||
|
if (nodeEnv === 'development') return 'dev';
|
||||||
|
if (nodeEnv === 'test') return 'test';
|
||||||
|
if (nodeEnv === 'production') {
|
||||||
|
// 生产环境下需要进一步区分 UAT 和 PROD
|
||||||
|
const env = process.env.NEXT_PUBLIC_ENV as Environment;
|
||||||
|
return (env === 'uat' || env === 'prod') ? env : 'prod';
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'dev'; // 默认开发环境
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前环境配置
|
||||||
|
*/
|
||||||
|
export const getEnvConfig = (): EnvironmentConfig => {
|
||||||
|
const currentEnv = getEnv();
|
||||||
|
return ENV_CONFIGS[currentEnv];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前环境名称
|
||||||
|
*/
|
||||||
|
export const getEnvironmentName = (): string => {
|
||||||
|
const config = getEnvConfig();
|
||||||
|
return config.ENV_DESCRIPTION;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前服务器域名(前端地址)
|
||||||
|
*/
|
||||||
|
export const getLocalhost = (): string => {
|
||||||
|
const config = getEnvConfig();
|
||||||
|
return config.FRONTEND_BASE_URL;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取后端 API 地址
|
||||||
|
*/
|
||||||
|
export const getBackendUrl = (): string => {
|
||||||
|
const config = getEnvConfig();
|
||||||
|
return config.BACKEND_BASE_URL;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取完整的 API 地址
|
||||||
|
*/
|
||||||
|
export const getApiUrl = (path?: string): string => {
|
||||||
|
const backendUrl = getBackendUrl();
|
||||||
|
const apiVersion = getEnvConfig().API_VERSION;
|
||||||
|
const apiPath = `/api/${apiVersion}${path || ''}`;
|
||||||
|
return `${backendUrl}${apiPath}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为开发环境
|
||||||
|
*/
|
||||||
|
export const isDevelopment = (): boolean => {
|
||||||
|
return getEnv() === 'dev';
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为测试环境
|
||||||
|
*/
|
||||||
|
export const isTest = (): boolean => {
|
||||||
|
return getEnv() === 'test';
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为 UAT 环境
|
||||||
|
*/
|
||||||
|
export const isUAT = (): boolean => {
|
||||||
|
return getEnv() === 'uat';
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为生产环境
|
||||||
|
*/
|
||||||
|
export const isProduction = (): boolean => {
|
||||||
|
return getEnv() === 'prod';
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为非开发环境
|
||||||
|
*/
|
||||||
|
export const isNonDevelopment = (): boolean => {
|
||||||
|
return !isDevelopment();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否开启调试模式
|
||||||
|
*/
|
||||||
|
export const isDebugMode = (): boolean => {
|
||||||
|
return getEnvConfig().DEBUG;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否使用 Mock 数据
|
||||||
|
*/
|
||||||
|
export const shouldUseMock = (): boolean => {
|
||||||
|
return getEnvConfig().USE_MOCK;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取 API 超时时间(毫秒)
|
||||||
|
*/
|
||||||
|
export const getApiTimeout = (): number => {
|
||||||
|
return getEnvConfig().API_TIMEOUT || 10000;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取应用名称
|
||||||
|
*/
|
||||||
|
export const getAppName = (): string => {
|
||||||
|
return getEnvConfig().APP_NAME;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 环境信息调试输出
|
||||||
|
*/
|
||||||
|
export const debugEnvInfo = (): void => {
|
||||||
|
if (isDebugMode()) {
|
||||||
|
const config = getEnvConfig();
|
||||||
|
const env = getEnv();
|
||||||
|
|
||||||
|
console.group('🌍 环境信息');
|
||||||
|
console.log('当前环境:', env);
|
||||||
|
console.log('环境描述:', config.ENV_DESCRIPTION);
|
||||||
|
console.log('前端地址:', config.FRONTEND_BASE_URL);
|
||||||
|
console.log('后端地址:', config.BACKEND_BASE_URL);
|
||||||
|
console.log('调试模式:', config.DEBUG);
|
||||||
|
console.log('使用 Mock:', config.USE_MOCK);
|
||||||
|
console.log('NODE_ENV:', process.env.NODE_ENV);
|
||||||
|
console.log('NEXT_PUBLIC_ENV:', process.env.NEXT_PUBLIC_ENV);
|
||||||
|
console.groupEnd();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 默认导出主要函数
|
||||||
|
export default {
|
||||||
|
getEnv,
|
||||||
|
getEnvConfig,
|
||||||
|
getEnvironmentName,
|
||||||
|
getLocalhost,
|
||||||
|
getBackendUrl,
|
||||||
|
getApiUrl,
|
||||||
|
isDevelopment,
|
||||||
|
isTest,
|
||||||
|
isUAT,
|
||||||
|
isProduction,
|
||||||
|
isNonDevelopment,
|
||||||
|
isDebugMode,
|
||||||
|
shouldUseMock,
|
||||||
|
getApiTimeout,
|
||||||
|
getAppName,
|
||||||
|
debugEnvInfo,
|
||||||
|
};
|
||||||
@@ -14,5 +14,5 @@ import type { ClientOptions as ClientOptions2 } from './types.gen';
|
|||||||
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;
|
export type CreateClientConfig<T extends ClientOptions = ClientOptions2> = (override?: Config<ClientOptions & T>) => Config<Required<ClientOptions> & T>;
|
||||||
|
|
||||||
export const client = createClient(createConfig<ClientOptions2>({
|
export const client = createClient(createConfig<ClientOptions2>({
|
||||||
baseUrl: 'http://pengcode.tech:8080/'
|
baseUrl: 'http://pengcode.tech:8080'
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// This file is auto-generated by @hey-api/openapi-ts
|
// This file is auto-generated by @hey-api/openapi-ts
|
||||||
|
|
||||||
export type ClientOptions = {
|
export type ClientOptions = {
|
||||||
baseUrl: 'http://localhost:8080' | (string & {});
|
baseUrl: 'http://pengcode.tech:8080' | (string & {});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user