feat(l2): 添加多环境配置及国际化支持

- 新增klp和g30环境配置文件
- 添加vue-i18n实现中英文切换
- 更新package.json添加环境组相关脚本
- 修改vue.config.js支持多环境配置加载
This commit is contained in:
砂糖
2025-12-27 13:35:47 +08:00
parent 3650d87a34
commit 4fa6a1f59a
13 changed files with 349 additions and 43 deletions

View File

@@ -0,0 +1,26 @@
# 页面标题
VUE_APP_TITLE = 'Galvanizing Line & Production Process Management System'
# 开发环境配置
ENV = 'development'
# 若依管理系统/开发环境
VUE_APP_BASE_API = '/dev-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/login'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# L2业务后端地址
VUE_APP_SERVICE_BASE_API = 'http://localhost:8089'
# 语言配置
VUE_APP_I18N_LOCALE = 'en-US'

View File

@@ -0,0 +1,25 @@
# 页面标题
VUE_APP_TITLE = 'Galvanizing Line & Production Process Management System'
# 生产环境配置
ENV = 'production'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = '/admin/login'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
# L2业务后端地址
VUE_APP_SERVICE_BASE_API = 'http://192.168.5.209:8080'
# 语言配置
VUE_APP_I18N_LOCALE = 'en-US'

View File

@@ -0,0 +1,17 @@
# 页面标题
VUE_APP_TITLE = 'Galvanizing Line & Production Process Management System'
BABEL_ENV = development
NODE_ENV = development
# 测试环境配置
ENV = 'staging'
# 若依管理系统/测试环境
VUE_APP_BASE_API = '/stage-api'
VUE_APP_SERVICE_BASE_API = 'http://49.232.87.108:12081'
# 语言配置
VUE_APP_I18N_LOCALE = 'en-US'

View File

@@ -0,0 +1,26 @@
# 页面标题
VUE_APP_TITLE = 镀锌机组及生产工艺管理系统
# 开发环境配置
ENV = 'development'
# 接口基础路径,该路径会被代理到 VUE_APP_SERVICE_BASE_API
VUE_APP_BASE_API = '/dev-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = 'http://localhost:9090/admin/login'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = 'http://localhost:9100/xxl-job-admin'
# 路由懒加载
VUE_CLI_BABEL_TRANSPILE_MODULES = true
# 代理后的真实后端地址
VUE_APP_SERVICE_BASE_API = 'http://localhost:8089'
# 语言配置
VUE_APP_I18N_LOCALE = 'zh-CN'

View File

@@ -0,0 +1,23 @@
# 页面标题
VUE_APP_TITLE = 镀锌机组及生产工艺管理系统
# 生产环境配置
ENV = 'production'
# 若依管理系统/生产环境
VUE_APP_BASE_API = '/prod-api'
# 应用访问路径 例如使用前缀 /admin/
VUE_APP_CONTEXT_PATH = '/'
# 监控地址
VUE_APP_MONITRO_ADMIN = '/admin/login'
# xxl-job 控制台地址
VUE_APP_XXL_JOB_ADMIN = '/xxl-job-admin'
# L2业务后端地址
VUE_APP_SERVICE_BASE_API = 'http://localhost:8089'
# 语言配置
VUE_APP_I18N_LOCALE = 'zh-CN'

View File

@@ -0,0 +1,17 @@
# 页面标题
VUE_APP_TITLE = 镀锌机组及生产工艺管理系统
BABEL_ENV = development
NODE_ENV = development
# 测试环境配置
ENV = staging
# 若依管理系统/测试环境
VUE_APP_BASE_API = /stage-api
VUE_APP_SERVICE_BASE_API = http://140.143.206.120:10082/prod-api
# 语言配置
VUE_APP_I18N_LOCALE = 'zh-CN'

View File

@@ -9,7 +9,13 @@
"stage": "vue-cli-service serve --mode staging",
"build:prod": "vue-cli-service build",
"build:stage": "vue-cli-service build --mode staging",
"preview": "node build/index.js --preview"
"preview": "node build/index.js --preview",
"klp:dev": "cross-env ENV_GROUP=klp ENV_MODE=development vue-cli-service serve",
"klp:stage": "cross-env ENV_GROUP=klp ENV_MODE=staging vue-cli-service serve",
"klp:build": "cross-env ENV_GROUP=klp ENV_MODE=production vue-cli-service build",
"g30:dev": "cross-env ENV_GROUP=g30 ENV_MODE=development vue-cli-service serve",
"g30:stage": "cross-env ENV_GROUP=g30 ENV_MODE=staging vue-cli-service serve",
"g30:build": "cross-env ENV_GROUP=g30 ENV_MODE=production vue-cli-service build"
},
"keywords": [
"vue",
@@ -25,10 +31,12 @@
"url": "https://gitee.com/y_project/RuoYi-Vue.git"
},
"dependencies": {
"@klp/ruoyi": "workspace:^1.0.0",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.28.1",
"clipboard": "2.0.8",
"core-js": "3.37.1",
"cross-env": "^10.1.0",
"dayjs": "^1.11.18",
"echarts": "5.4.0",
"element-ui": "2.15.14",
@@ -48,12 +56,12 @@
"vue": "2.6.12",
"vue-count-to": "1.0.13",
"vue-cropper": "0.5.5",
"vue-i18n": "8.x",
"vue-konva": "^2.1.7",
"vue-router": "3.4.9",
"vuedraggable": "2.24.3",
"vuex": "3.6.0",
"xlsx": "^0.18.5",
"@klp/ruoyi": "workspace:^1.0.0"
"xlsx": "^0.18.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "4.4.6",
@@ -62,6 +70,7 @@
"chalk": "4.1.0",
"compression-webpack-plugin": "6.1.2",
"connect": "3.6.6",
"dotenv": "^17.2.3",
"sass": "1.32.13",
"sass-loader": "10.1.1",
"script-ext-html-webpack-plugin": "2.1.5",

50
apps/l2/src/i18n/en-US.js Normal file
View File

@@ -0,0 +1,50 @@
export default {
common: {
title: 'Galvanizing Line & Production Process Management System',
home: 'Home',
dashboard: 'Dashboard',
system: 'System Management',
monitor: 'System Monitoring',
tool: 'Tools',
logout: 'Logout',
login: 'Login',
register: 'Register',
username: 'Username',
password: 'Password',
remember: 'Remember me',
forgetPassword: 'Forgot password',
submit: 'Submit',
reset: 'Reset',
add: 'Add',
edit: 'Edit',
delete: 'Delete',
view: 'View',
search: 'Search',
refresh: 'Refresh',
save: 'Save',
cancel: 'Cancel',
confirm: 'Confirm',
back: 'Back',
success: 'Success',
error: 'Error',
warning: 'Warning',
info: 'Info',
yes: 'Yes',
no: 'No',
operation: 'Operation',
status: 'Status',
createTime: 'Create Time',
updateTime: 'Update Time',
remark: 'Remark',
pleaseSelect: 'Please select',
pleaseInput: 'Please input',
pleaseEnter: 'Please enter'
},
dashboard: {
welcome: 'Welcome to Galvanizing Line & Production Process Management System',
todayData: 'Today\'s Data',
totalData: 'Total Data',
onlineUsers: 'Online Users',
systemInfo: 'System Information'
}
}

34
apps/l2/src/i18n/index.js Normal file
View File

@@ -0,0 +1,34 @@
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import ElementLocale from 'element-ui/lib/locale'
import enLocale from 'element-ui/lib/locale/lang/en'
import zhLocale from 'element-ui/lib/locale/lang/zh-CN'
Vue.use(VueI18n)
// 从环境变量读取语言设置优先使用VUE_APP_I18N_LOCALE
const locale = process.env.VUE_APP_I18N_LOCALE || 'zh-CN'
// 合并系统语言包和Element UI语言包
const messages = {
'zh-CN': {
...require('./zh-CN'),
...zhLocale
},
'en-US': {
...require('./en-US'),
...enLocale
}
}
// 创建i18n实例
const i18n = new VueI18n({
locale,
fallbackLocale: 'zh-CN',
messages
})
// 设置Element UI的i18n
ElementLocale.i18n((key, value) => i18n.t(key, value))
export default i18n

50
apps/l2/src/i18n/zh-CN.js Normal file
View File

@@ -0,0 +1,50 @@
export default {
common: {
title: '镀锌机组及生产工艺管理系统',
home: '首页',
dashboard: '仪表盘',
system: '系统管理',
monitor: '系统监控',
tool: '工具',
logout: '退出登录',
login: '登录',
register: '注册',
username: '用户名',
password: '密码',
remember: '记住我',
forgetPassword: '忘记密码',
submit: '提交',
reset: '重置',
add: '新增',
edit: '编辑',
delete: '删除',
view: '查看',
search: '搜索',
refresh: '刷新',
save: '保存',
cancel: '取消',
confirm: '确认',
back: '返回',
success: '成功',
error: '错误',
warning: '警告',
info: '提示',
yes: '是',
no: '否',
operation: '操作',
status: '状态',
createTime: '创建时间',
updateTime: '更新时间',
remark: '备注',
pleaseSelect: '请选择',
pleaseInput: '请输入',
pleaseEnter: '请输入'
},
dashboard: {
welcome: '欢迎使用镀锌机组及生产工艺管理系统',
todayData: '今日数据',
totalData: '累计数据',
onlineUsers: '在线用户',
systemInfo: '系统信息'
}
}

View File

@@ -5,6 +5,7 @@ import VueKonva from 'vue-konva';
import Element from 'element-ui'
import './assets/styles/element-variables.scss'
import i18n from './i18n' // 引入i18n配置
import '@/assets/styles/index.scss' // global css
// import '@/assets/styles/ruoyi.scss' // ruoyi css
@@ -72,7 +73,8 @@ DictData.install()
*/
Vue.use(Element, {
size: Cookies.get('size') || 'small' // set element-ui default size
size: Cookies.get('size') || 'small', // set element-ui default size
i18n: (key, value) => i18n.t(key, value) // i18n support
})
Vue.config.productionTip = false
@@ -81,5 +83,6 @@ new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
})

View File

@@ -1,10 +1,36 @@
'use strict'
const path = require('path')
const dotenv = require('dotenv')
const fs = require('fs')
function resolve(dir) {
return path.join(__dirname, dir)
}
const envGroup = process.env.ENV_GROUP || 'klp' // 默认使用 klp 组
const envMode = process.env.ENV_MODE || 'development' // 默认使用 development 模式
// 2. 拼接环境文件的绝对路径(核心:解决子目录文件找不到问题)
const envFilePath = path.resolve(
process.cwd(), // 项目根目录(避免相对路径歧义)
`config/${envGroup}/.env.${envMode}` // 拼接config/环境组/.env.环境模式
)
// 3. 读取并解析环境文件,注入到 process.env 中
if (fs.existsSync(envFilePath)) {
// 解析 .env 文件
const envConfig = dotenv.config({
path: envFilePath,
override: true
})
if (envConfig.error) {
throw new Error(`加载 ${envGroup} 环境组 ${envMode} 模式配置失败:${envConfig.error.message}`)
}
console.log(`✅ 成功加载环境配置:${envFilePath}`)
} else {
console.warn(`⚠️ 未找到环境配置文件:${envFilePath},请检查 ENV_GROUP 和 ENV_MODE 配置`)
}
const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '镀锌机组及生产工艺管理系统' // 网页标题

78
pnpm-lock.yaml generated
View File

@@ -29,6 +29,9 @@ importers:
core-js:
specifier: 3.37.1
version: 3.37.1
cross-env:
specifier: ^10.1.0
version: 10.1.0
dayjs:
specifier: ^1.11.18
version: 1.11.18
@@ -86,6 +89,9 @@ importers:
vue-cropper:
specifier: 0.5.5
version: 0.5.5
vue-i18n:
specifier: 8.x
version: 8.28.2(vue@2.6.12)
vue-konva:
specifier: ^2.1.7
version: 2.1.7(konva@10.0.2)
@@ -120,6 +126,9 @@ importers:
connect:
specifier: 3.6.6
version: 3.6.6
dotenv:
specifier: ^17.2.3
version: 17.2.3
sass:
specifier: 1.32.13
version: 1.32.13
@@ -469,7 +478,7 @@ importers:
version: 1.13.2
element-ui:
specifier: ^2.15.14
version: 2.15.14(vue@2.7.16)
version: 2.15.14(vue@2.6.12)
file-saver:
specifier: ^2.0.5
version: 2.0.5
@@ -2036,6 +2045,10 @@ packages:
vue: 3.5.25(typescript@5.9.3)
dev: false
/@epic-web/invariant@1.0.0:
resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==}
dev: false
/@esbuild/aix-ppc64@0.21.5:
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@@ -3748,16 +3761,6 @@ packages:
'@vue/compiler-core': 3.5.25
'@vue/shared': 3.5.25
/@vue/compiler-sfc@2.7.16:
resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==}
dependencies:
'@babel/parser': 7.28.5
postcss: 8.5.6
source-map: 0.6.1
optionalDependencies:
prettier: 2.8.8
dev: false
/@vue/compiler-sfc@3.5.22:
resolution: {integrity: sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==}
dependencies:
@@ -6208,6 +6211,15 @@ packages:
sha.js: 2.4.12
dev: true
/cross-env@10.1.0:
resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==}
engines: {node: '>=20'}
hasBin: true
dependencies:
'@epic-web/invariant': 1.0.0
cross-spawn: 7.0.6
dev: false
/cross-spawn@5.1.0:
resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==}
dependencies:
@@ -6234,7 +6246,6 @@ packages:
path-key: 3.1.1
shebang-command: 2.0.0
which: 2.0.2
dev: true
/crypto-browserify@3.12.1:
resolution: {integrity: sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==}
@@ -6927,6 +6938,11 @@ packages:
resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==}
dev: true
/dotenv@17.2.3:
resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==}
engines: {node: '>=12'}
dev: true
/dotenv@8.6.0:
resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==}
engines: {node: '>=10'}
@@ -7059,20 +7075,6 @@ packages:
vue: 2.6.12
dev: false
/element-ui@2.15.14(vue@2.7.16):
resolution: {integrity: sha512-2v9fHL0ZGINotOlRIAJD5YuVB8V7WKxrE9Qy7dXhRipa035+kF7WuU/z+tEmLVPBcJ0zt8mOu1DKpWcVzBK8IA==}
peerDependencies:
vue: ^2.5.17
dependencies:
async-validator: 1.8.5
babel-helper-vue-jsx-merge-props: 2.0.3
deepmerge: 1.5.2
normalize-wheel: 1.0.1
resize-observer-polyfill: 1.5.1
throttle-debounce: 1.1.0
vue: 2.7.16
dev: false
/elliptic@6.6.1:
resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
dependencies:
@@ -9746,7 +9748,6 @@ packages:
/isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
/isobject@2.1.0:
resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
@@ -11622,7 +11623,6 @@ packages:
/path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
dev: true
/path-key@4.0.0:
resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
@@ -12259,6 +12259,7 @@ packages:
engines: {node: '>=10.13.0'}
hasBin: true
requiresBuild: true
dev: true
optional: true
/prettier@3.7.1:
@@ -13244,7 +13245,6 @@ packages:
engines: {node: '>=8'}
dependencies:
shebang-regex: 3.0.0
dev: true
/shebang-regex@1.0.0:
resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
@@ -13254,7 +13254,6 @@ packages:
/shebang-regex@3.0.0:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
dev: true
/shell-quote@1.8.3:
resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==}
@@ -13498,6 +13497,7 @@ packages:
/source-map@0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
dev: true
/source-map@0.7.6:
resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
@@ -15030,6 +15030,15 @@ packages:
resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==}
dev: true
/vue-i18n@8.28.2(vue@2.6.12):
resolution: {integrity: sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==}
deprecated: Vue I18n v8.x has reached EOL and is no longer actively maintained. About maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html
peerDependencies:
vue: ^2
dependencies:
vue: 2.6.12
dev: false
/vue-konva@2.1.7(konva@10.0.2):
resolution: {integrity: sha512-uKFp1/tGbt9HAcTXukk/PuPtCMfCSmNyU3Feo3Av4XVfcoBgVQA69+H9r2VQMX+Vwphez1qSfGf7ZNstM3nYRw==}
engines: {node: '>= 4.0.0', npm: '>= 3.0.0'}
@@ -15179,14 +15188,6 @@ packages:
resolution: {integrity: sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==}
deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.
/vue@2.7.16:
resolution: {integrity: sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==}
deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.
dependencies:
'@vue/compiler-sfc': 2.7.16
csstype: 3.2.3
dev: false
/vue@3.5.25(typescript@5.9.3):
resolution: {integrity: sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==}
peerDependencies:
@@ -15503,7 +15504,6 @@ packages:
hasBin: true
dependencies:
isexe: 2.0.0
dev: true
/wmf@1.0.2:
resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==}