
后端前端物联网边缘计算【免费下载链接】openemsOpenEMS - Open Source Energy Management System项目地址https://gitcode.com/gh_mirrors/op/openems点击查看免费下载导读OpenEMS UI 是基于 Angular 的 Web 前端负责为 OpenEMS 能源管理系统提供实时监控、历史数据与设备配置界面。本指南以仓库内 ui/README.md 为骨架结合 ui/angular.json、ui/src/themes/openems/environments/ 与 ui/package.json 等源码证据系统讲解 OpenEMS UI 的两种连接模式Edge / Backend、开发与生产构建、自定义主题、Android/iOS App 打包、i18n 国际化与 RxJS 订阅规范。读完本文你将能独立完成 OpenEMS UI 的本地开发、多主题构建与移动端发布流程。OpenEMS UI 概览一个 UI两种连接模式OpenEMS UI 本身是一个 Angular 应用由 angular-cli 生成但它既可以直接连接运行在用户本地的OpenEMS Edge也可以连接云端聚合平台OpenEMS Backend。这两种模式由不同的 Angular build configuration 驱动主要差异在于 WebSocket 连接地址与目标端口模式连接对象默认端口对应 configurationOpenEMS EdgeEdge 的Controller.Api.Websocket8085openems-edge-dev/openems-edge-prodOpenEMS BackendBackend 的Ui.Websocket8082openems-backend-dev/openems-backend-prod从源码看这两种模式的端口定义分别位于 ui/src/themes/openems/environments/edge-dev.tsws://${location.hostname}:8085与 ui/src/themes/openems/environments/backend-dev.tsws://${location.hostname}:8082。生产环境的 Edge 模式默认使用8075端口见 ui/src/themes/openems/environments/edge-prod.ts。值得注意的一个实现细节连接协议ws还是wss并非硬编码而是由 ui/src/environments/index.ts 中的getWebsocketScheme()函数根据页面当前协议动态决定——HTTPS 页面自动使用wssHTTP 页面使用ws从而保证 UI 在本地 HTTP 调试与线上 HTTPS 部署两种场景下都能正确建立 WebSocket 连接。开发服务器快速启动本地调试Edge 模式启动OpenEMS Edge 主题默认将 UI 服务到4200端口并期望在8085端口找到 Edge 的 WebSocket 服务。使用 Angular CLI 的ng serve即可启动开发服务器ng serve如需自动打开浏览器并使用 Edge 开发配置可执行ng serve -o -c openems-edge-dev-c--configuration指定使用 ui/angular.json 中预定义的构建配置组合-o表示自动打开浏览器。Backend 模式启动当 UI 需要对接 OpenEMS Backend端口8082时使用ng serve -o -c openems-backend-dev值得注意的是ui/angular.json 中serve目标的默认配置就是app:build:openems,openems-edge-dev这意味着不带任何参数直接运行ng serve时默认即采用 Edge 开发模式。构建开发版与生产版开发构建ng buildEdge 开发构建ng build -c openems,openems-edge-devEdge 生产构建ng build -c openems,openems-edge-prod,prodBackend 开发 / 生产构建ng build -c openems,openems-backend-dev ng build -c openems,openems-backend-prod,prod从 ui/angular.json 的prodconfiguration 可以看到生产构建会开启 AOT 编译aot: true、启用资源压缩优化scripts、styles、fonts、开启outputHashing: all并关闭 sourceMap而开发构建则使用aot: false、optimization: false以加快编译速度、方便调试。此外构建产物输出到target目录outputPath: { base: target, browser: }这也是后续 Capacitor 打包时读取webDir: target的原因见 ui/capacitor.config.ts。配置组合机制剖析fileReplacements 与 environmentsng serve/ng build中的多个 configuration 之所以能串联生效核心机制是 ui/angular.json 中的fileReplacements文件替换。以openems-edge-dev为例它执行三组替换src/environments/theme.ts→src/themes/openems/environments/theme.tssrc/environments/dummy.ts→src/themes/openems/environments/edge-dev.tssrc/environments/oem-meta.ts→src/themes/openems/environments/oem-meta.ts也就是说Angular 编译时会将占位的dummy.ts等文件内容替换为对应主题环境的实现从而实现一套 UI 代码 不同主题环境的灵活切换。仓库中预置了多套环境配置全部位于 ui/src/themes/openems/environments/环境文件用途edge-dev.tsEdge 开发环境端口 8085debugMode 开启edge-prod.tsEdge 生产环境端口 8075debugMode 关闭edge-docker.tsEdge Docker 部署连接${location.host}/openems-edgebackend-dev.tsBackend 开发环境端口 8082backend-prod.tsBackend 生产环境端口 8082backend-docker.tsBackend Docker 部署gitpod.tsGitPod 云端开发wss://8082-前缀适配 GitPod 端口转发规则karma.ts单元测试环境默认语言 enoem-meta.tsOEM 品牌元数据图标、图片、跳转链接、手册地址等其中 ui/src/themes/openems/environments/oem-meta.ts 内容最为丰富集中定义了 UI 各处的图标路径、产品图片、下载/手册/质保等跳转链接大量字段可置为null或#以禁用同时提供Environment接口的完整类型约束见 ui/src/environments/index.ts。自动化测试ng test 与本地 Karma 界面常规测试ng test该命令使用 ui/karma.conf.js 作为 Karma 配置并通过 ui/angular.json 中test目标将dummy.ts替换为 ui/src/themes/openems/environments/karma.ts该文件额外将localStorage.LANGUAGE设为de、defaultLanguage设为en保证测试环境的语言确定性。带 Karma UI 的本地测试ng test -c locallocalconfiguration 使用 ui/karma.conf.local.js其特点包括clearContext: false测试运行后保留 Jasmine Spec Runner 输出界面、restartOnFileChange: true文件变更自动重跑、支持 Chrome / ChromeHeadless / ChromeHeadlessCI 三种浏览器启动器且singleRun: false便于持续观察测试结果。创建自定义主题ThemeOpenEMS UI 通过主题Theme机制实现品牌化定制。创建新主题的步骤如下在/src/themes下新建主题文件夹现有示例为openems见 ui/src/themes/。主题文件夹需包含root/子目录其中的文件会原样复制到 OpenEMS UI 的根路径/例如 favicon、site.webmanifest等静态资源参见 ui/src/themes/openems/root/scss/variables.scss用于主题样式定制参见 ui/src/themes/openems/scss/variables.scss其中通过:root[data-themelight]/:root[data-themedark]定义了两套 Ionic 颜色变量覆盖 primary/secondary/tertiary 等配色environments/*.ts定义 Backend/Edge、开发/生产环境的各项设置URL、端口、production/debugMode 开关、OEM 元数据等。使用 realfavicongenerator.net 生成root/目录内容并放入root子目录注意root中需提供/resources/logo-dark.png与logo.png两个 Logo 文件。参照 openems 现有的 configurations在angular.json中为新主题添加对应条目包括 build configurations、fileReplacements 与 serve configurations。从 ui/angular.json 可看到openems主题的构建配置还会把src/themes/openems/root的 glob 内容输出到站点根目录、src/themes/openems/assets输出到./assets、node_modules/ionicons的 svg 输出到./svg并将src/themes/openems/scss加入stylePreprocessorOptions.includePaths同时将variables.scss作为全局样式入口之一。构建 Android 与 iOS AppCapacitorOpenEMS UI 使用 Capacitor 将 Web 应用封装为移动端 App其核心配置在 ui/capacitor.config.ts 中webDir指向构建产物目录target并启用 Capacitor Cookies、SplashScreen 等插件。1. 添加 Capacitor 配置在 capacitor.config.ts 中按主题补充配置该文件根据NODE_ENV环境变量选择对应主题的配置仓库当前仅预置了EXAMPLE示例并被注释因此需要按需实现。2. 构建 AppNODE_ENV$theme ionic cap build android -c $theme,$theme-backend-deploy-app3. 扩展 Android 构建脚本扩展 build.gradle 相关配置扩展 capacitor.config.ts。4. 生成并放置资源npx capacitor/assets generate --logoSplashScale 0.3 --pwaManifestPath src/manifest.webmanifest[!IMPORTANT] 关键信息此步骤只提供/resources/logo-dark.png和logo.png两个 Logo 文件。将res目录中除values和xml之外的文件移动到/android/app/src/$theme/其中/main目录作为默认主题。5. 按顺序构建 AppNODE_ENV{$theme} ./node_modules/.bin/ionic cap build android -c $theme,$theme-backend-deploy-app --no-open; THEME{$theme} gradlew bundleThemeRelease提示若某些文件未自动生成可复制现有主题下的文件并调整包括ui\android\app\src\{$theme}\res\xml\file_paths.xml与ui\android\app\src\{$theme}\res\values。6. 安装与调试gradlew install{$theme}Release # 将 Release 包安装到任意已连接设备 gradlew tasks # 查看可用 Gradle 任务 $npx native-run android --list --json # 列出可用设备与模拟器 $ionic cap open android # 用 Android Studio 打开工程进行调试Android 工程位于 ui/android/其app/src下已按main默认、androidTest、test分层组织源码。i18n 国际化基于 ngx-translate 的多语言方案OpenEMS UI 的翻译基于 ngx-translate 实现语言可在运行时通过 UI 的 About UI 对话框切换。在 HTML 模板中使用p translateGeneral.storageSystem/p为标签添加translate属性标签内容即翻译键路径指向翻译文件中的对应条目。在 TypeScript 代码中使用import { TranslateService } from ngx-translate/core; constructor(translate: TranslateService) {} this.translate.instant(General.storageSystem)语言体系的源码实现从源码层面看翻译键的加载并非直接使用TranslateService默认行为而是通过自定义的MyTranslateLoader与Language类完成。在 ui/src/app/shared/type/language.ts 中内置 7 种语言德语de、英语en、捷克语cs、荷兰语nl、西班牙语es、法语fr、日语ja默认语言为英语每种语言同时绑定 Angular 的angular/commonlocale 与date-fnslocale保证日期/数字格式化与语言一致语言优先级为localStorage.LANGUAGE用户显式选择 浏览器语言navigator.language 默认英语翻译资源 JSON 位于 ui/src/assets/i18n/如en.json、de.json等 7 个语言文件。翻译键质量保障仓库还提供了翻译键一致性校验脚本 ui/scripts/lint-translation-keys.js通过npm run lint:i18n见 ui/package.json检查各语言文件之间是否存在缺失或多余的翻译键防止多语言资源漂移。RxJS 订阅规范takeUntil 防内存泄漏在 Angular 组件中使用 RxJS 订阅时README 明确推荐使用takeUntil模式在ngOnDestroy中主动退订避免内存泄漏import { Subject } from rxjs/Subject; import { takeUntil } from rxjs/operators; private stopOnDestroy: Subjectvoid new Subjectvoid(); ngOnInit() { /*subject*/.pipe(takeUntil(this.stopOnDestroy)).subscribe(/*variable*/ { ... }); } ngOnDestroy() { this.stopOnDestroy.next(); this.stopOnDestroy.complete(); }核心思路是组件持有唯一的stopOnDestroy: Subjectvoid所有订阅都通过takeUntil(this.stopOnDestroy)收口组件销毁时触发next()与complete()一次性结束全部订阅。这套模式在 OpenEMS UI 的众多组件中均有应用如 history 图表、live 视图等模块是保持长驻页面监控大屏、图表刷新稳定运行的关键实践。调试 Angular PWA通过 USB 连接移动设备当需要调试在移动设备上运行的 PWA 版本时可借助 Chrome 的远程调试能力通过 USB 将 Android 设备连接到开发机在 Chrome 地址栏访问chrome://inspect即可对移动端页面进行元素检查、控制台输出与网络分析配合ng serve的开发服务器实现真机实时调试。依赖与技术栈速览从 ui/package.json 可以确认 OpenEMS UI 的核心技术栈Angular22.x Ionic8.x移动端 UI 框架、ngx-translate17.x国际化、Capacitor8.x跨平台封装、chart.js / ng2-charts 数据可视化、d3、date-fns 时间处理、RxJS 响应式编程以及 ESLint/Prettier 代码规范体系。该仓库当前版本标识为2026.11.0-SNAPSHOT采用 AGPL-3.0 许可。小结OpenEMS UI 以一套代码、双端接入、多主题定制为设计主线通过angular.json的 configuration 与 fileReplacements 机制无缝切换 Edge8085与 Backend8082两种 WebSocket 连接模式通过src/themes主题目录承载品牌化资源与环境配置通过 Capacitor 完成 Android/iOS 打包通过 ngx-translate 提供 7 语言运行时切换。开发者只要掌握ng serve/ng build/ng test三条命令的 configuration 组合规则并遵循 takeUntil 订阅规范即可高效地在此基础上进行二次开发与发布。赞分享后端前端物联网边缘计算【免费下载链接】openemsOpenEMS - Open Source Energy Management System项目地址https://gitcode.com/gh_mirrors/op/openems点击查看免费下载相关推荐Cloudflare RealtimeKit 配置实战指南客户端 SDK、Wrangler 后端与主题国际化全解析Cloudflare RealtimeKit 配置实战指南客户端 SDK、Wrangler 后端与主题国际化全解析 导读 RealtimeKit 是 ClouFlet 移动端支持与 Server-Driven UI 架构解析从移动端战略到 APK/IPA 打包实战Flet 移动端支持与 Server Driven UI 架构解析从移动端战略到 APK/IPA 打包实战 本篇技术指南聚焦 Flet 移动端支持Mobil前端跨平台桌面应用移动开发Vant国际化解决方案多语言移动端应用开发实战Vant国际化解决方案多语言移动端应用开发实战 Vant作为一款优秀的移动端Vue组件库提供了完整的国际化 i18n 支持让开发者能够轻松构建多语言移动应示例工程前端上一篇Hyperf Query 插件使用指南在 PhpStorm 中为 Hyperf 查询构造器获得数据库智能补全下一篇Matcha-TTS5大优势让你爱上这款快速语音合成神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考