Skip to content
EN

前端工程

前端项目位于 src/web/,是一个 Vue 3 + Vite 单页应用,提供模型管理、场景配置、流水线编排、实时预览、告警视图和系统设置等功能。

项目结构

src/web/
├── package.json              # 依赖和脚本
├── vite.config.js            # 构建配置、别名、代理
├── scripts/                  # i18n 校验和同步脚本
└── src/
    ├── main.js               # 应用入口
    ├── App.vue               # 根组件
    ├── api/                  # API 模块
    │   └── index.js          # 合并所有模块,注入全局 $API
    ├── assets/               # 图片、图标、音频资源
    ├── components/           # 共享组件
    ├── i18n/                 # vue-i18n 配置、locale 文件、short-scopes
    ├── micro/
    │   └── state.js          # 轻量全局状态
    ├── router/
    │   └── index.js          # Hash 模式路由
    ├── styles/
    │   └── global.scss       # 全局 SCSS
    ├── utils/                # Axios 封装、消息提示、图片预览、i18n 加载、WebRTC 播放器
    └── views/                # 页面组件
        ├── main/             # MainLayout(侧栏 + 顶栏 + 菜单)
        ├── home/             # 首页仪表盘
        ├── box/              # 边缘设备视图(摄像头、事件、底库、系统、数据对接)
        └── gam/              # AI 管理视图(任务、模型、编排、图片分析)

技术栈

类别版本用途
框架Vue 3^3.5.35Composition API + <script setup>
构建Vite6.3.5开发服务器、HMR、分块生产构建
路由Vue Router^4.2.0基于 Hash 的客户端路由
UIElement Plus2.13.2组件库(锁定版本)
穿梭框tree-transfer-vue3^1.2.2算法选择的树形穿梭框组件
HTTPAxios^1.7.0API 客户端,带拦截器
图表ECharts^6.0.0仪表盘和统计图表
流程编辑器@vue-flow/core^1.48.2流水线编排编辑器
@vue-flow/background^1.3.2编辑器背景网格
@vue-flow/controls^1.1.3编辑器缩放控件
@vue-flow/minimap^1.5.4编辑器缩略图
国际化Vue I18n^9.14.5多语言支持
视频播放flv.js^1.6.2FLV 流播放
WebRTC原生 RTCPeerConnectionWHEP 协议播放
布局算法dagre^0.8.5流程图布局计算
工具库lodash, moment, uuid, js-md5, mitt各类工具函数

快速开始

环境变量

src/web/ 下创建 .env.env.development 文件:

变量用途
VITE_APP_BASE_URL应用基础路径(默认 /
VITE_APP_API_URL开发代理目标的后端 API 地址

开发服务器

bash
cd src/web
npm install
npm run dev

开发服务器启动在 http://localhost:3000。所有 /gtw/event/weblogo/web 请求会代理到 VITE_APP_API_URL

生产构建

bash
cd src/web
npm run build

prebuild 会在构建前自动执行 npm run i18n:check。i18n 校验不通过会阻止构建。

常用脚本

脚本用途
npm run dev启动 Vite 开发服务器
npm run build生产构建(通过 prebuild → i18n 校验)
npm run preview本地预览生产构建结果
npm run i18n:check运行全部 5 个 i18n 校验脚本
npm run resource-i18n:check检查资源 i18n 同步状态
npm run resource-i18n:sync从 aiboxResource 源同步资源 i18n key(提交前检查 diff)

i18n 校验覆盖:短词 scope 正确性、locale key 一致性、glossary 同步、弹窗操作按钮标签、未使用 key 检测。

新增页面

第一步:创建视图组件

src/web/src/views/ 下的对应子目录中创建新的 .vue 文件(设备相关放 box/,AI 管理相关放 gam/)。

第二步:注册路由

src/web/src/router/index.js 中添加路由:

js
{
  path: '/myModule/myPage',
  name: 'MyPage',
  component: () => import('@/views/myModule/myPage/index.vue')
}

需要侧栏 + 顶栏布局的页面应使用 MainLayout 父路由。独立页面(如登录页、大屏)不需要布局包裹。

需要登录的路由会由全局导航守卫校验 localStorage.getItem('token')

第三步:添加菜单项

编辑 src/web/src/views/main/menu.js,选择对应的 section"core""display""task""resource""system"),添加菜单项:

js
{
  index: '/myModule/myPage',
  titleKey: 'nav.myPage',
  icon: 'el-icon-xxx',
  section: 'task'
}

第四步:添加翻译

在以下两个文件中添加新的 i18n key:

  • src/web/src/i18n/locales/zh-CN.js
  • src/web/src/i18n/locales/en-US.js

菜单标签放在 nav 下,页面专属文案按模块新建顶层 key。

API 层

模式

API 模块位于 src/web/src/api/。每个模块默认导出一个由请求函数组成的对象;api/index.js 通过对象展开把所有模块合并为扁平对象,main.js 再将它注入为全局 $API

组件中使用方式:this.$API.dologin(params)proxy.$API.dologin(params)(Composition API)。

现有模块

模块文件领域
认证login.js登录/登出、验证码、密码重置、用户信息
设备管理box.js摄像头、事件、系统设置、音频、联动
AI 管理gam.js算法、任务、模型、编排、图片分析
算法管理countManage.js算法增删改查、许可证、硬件信息
底库basePic.js人脸库、人体库、物品库、文件导入
实时流screen.js摄像头列表、拉流生命周期、WebSocket
首次引导onboarding.js引导状态查询、完成和重置

新增端点

在对应模块对象中添加函数;如果新建模块文件,再把默认导出对象展开到 api/index.js

js
// api/myModule.js
import { request } from '@/utils/request'

export default {
  queryMyData: data => request({
    url: '/gtw/cwai/MyModule/Query',
    method: 'post',
    data
  })
}

// api/index.js
import myModule from './myModule'

export default {
  ...login,
  ...box,
  ...screen,
  ...basePic,
  ...gam,
  ...countManage,
  ...onboarding,
  ...myModule
}

展开后组件通过 proxy.$API.queryMyData(data) 调用;当前 API 层不是 proxy.$API.myModule.queryMyData(data) 这种命名空间结构。

所有 API 调用共用 utils/request.js 中的 Axios 实例,会自动附加 mtktokenfileModelang 等请求头,并处理认证失败的跳转。

国际化(i18n)

架构

  • 默认语言zh-CN
  • 回退语言en-US
  • 语言偏好持久化在 localStoragecosmo.locale 字段

翻译分三层管理:

层级来源用途
静态 locale 文件i18n/locales/{zh-CN,en-US}.js所有内置 UI 文案、导航、校验、状态等
短词 glossaryi18n/glossary.js紧凑布局场景下的缩写
动态资源 i18npublic/resource-i18n/resource.{locale}.json算法名称、参数、选项等后端配置项

翻译 API

  • $t('key.path') — 始终返回当前语言版本的完整文案。
  • $tShort('key.path', scope) — 仅当 glossary 中该 key 允许在指定 scope 下使用短形式时才返回短词,否则回退到完整文案。

短词 Scope

9 种 UI 上下文 scope 控制短词的使用场景:

Scope ID典型组件
btn.compact紧凑按钮(≤100px)
table.header表格列头
sidebar.menu侧栏菜单(约 180px 宽)
flow.node流水线编排节点标签
dashboard.card大屏指标卡标题
tag.badge状态徽标
inline.action表格行内操作链接
tab.compact紧凑 tab 标题
placeholder输入框 placeholder

构建配置

Vite 配置(vite.config.js

  • 别名@src/
  • 开发代理/gtw/event/weblogo/webVITE_APP_API_URL
  • CSS:通过 sass-embedded 使用 modern-compiler API 编译 SCSS
  • 构建分块(手动拆分):
    • vendor-vue — Vue + Router + I18n
    • vendor-element — Element Plus
    • vendor-echarts — ECharts
    • vendor-vue-flow — @vue-flow/*
    • vendor-graph — @antv/x6、@antv/layout(依赖当前未在 package.json 中安装,为预留规则)
    • vendor-lodash — lodash, dagre
    • vendor-moment — moment
    • vendor-md — highlight.js、markdown-it(依赖当前未安装,为预留规则)
    • vendor — 其余依赖

环境变量

应用在构建时读取 VITE_APP_BASE_URL,开发代理使用 VITE_APP_API_URL。仓库不跟踪 .env 文件,需本地自行创建。

状态管理

未使用 Pinia 或 Vuex。状态通过以下方式管理:

  • localStorage:认证 token(mtk)、账户信息、语言偏好、运行模式。
  • micro/state.js:轻量全局响应式对象,管理 loading 和登录状态,供 Axios 拦截器控制加载遮罩。
  • 组件内状态:大部分 UI 状态在各视图组件内通过 reactive() / ref() 管理。

关键工具

文件用途
utils/request.jsAxios 实例,自动附加 mtk/token/lang 等头,处理认证失效跳转,上传/升级等长时间请求不显示 loading
utils/message.js单例去重的 ElMessage 封装
utils/imagePreview.js全屏图片预览
utils/resourceLocaleLoader.js应用启动时从服务端拉取动态 i18n JSON 并合并到 vue-i18n
utils/i18nResource.js解析后端算法/参数配置中的 *I18nKey 字段
utils/whepPlayer.js基于原生 RTCPeerConnection 的 WHEP WebRTC 播放器

Released under the Apache 2.0 License.