# thingjs-project-js-template **Repository Path**: uinosoft/thingjs-project-js-template ## Basic Information - **Project Name**: thingjs-project-js-template - **Description**: No description available - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-03 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ThingJS 前端项目框架 这是一个集成 ThingJS Editor 资源的 Vue 3 前端项目框架。 ## 技术栈 - **核心框架**:Vue 3 - **开发语言**:Javascript - **构建工具**:Vite 6 - **状态管理**:Pinia - **路由管理**:Vue Router 4 - **UI 组件库**:Element Plus - **HTTP 请求**:Axios - **CSS 预处理器**:SCSS - **代码规范**:ESLint + Prettier - **工具库**: - lodash-es:实用工具库 - echarts:数据可视化图表库 - dayjs:轻量级日期处理库 ### 功能说明 - **3D 场景集成**:与 ThingJS Editor 无缝集成,轻松加载 3D 场景 - **UI 组件**:集成 Element Plus 组件库和自定义通用组件,包括协助页面级整体布局的布局组件 - **业务组件**:内置菜单导航、工具栏、业务菜单、图例等业务组件,可通过配置便捷展示组件内容 - **事件管理**:封装事件总线和事件类型管理,支持界面与 3D 场景之间的事件通信 - **云瞰集成**:对接云瞰工作台,封装接口服务 - **分辨率适配**:自动适配不同屏幕尺寸缩放 - **主题切换**:支持明暗主题切换,提供自定义主题配置 - **国际化**:集成 vue-i18n 框架,支持多语言切换与本地化 ## 开发指南 #### 环境要求 - Node.js >= 16.0.0 - pnpm >= 7.0.0 #### 初始化资源 项目工程中内置了一个编辑器项目资源,请先双击 `public/editor/sample` 中的 `myproj.thing` 打开该项目,从而对项目资源进行初始化。 #### 安装依赖 ```bash pnpm install ``` #### 启动开发服务 ```bash pnpm dev ``` #### 构建生产版本 ```bash pnpm build # 构建分析 pnpm build:analyze ``` #### 预览生产构建 ```bash pnpm preview ```
## 项目目录结构 ``` project-template/ ├── coding-helper/ # AI 代码助手 ├── dist/ # 构建输出目录 ├── node_modules/ # 依赖包 ├── public/ # 静态资源目录 ├── src/ # 源代码目录 ├── .env # 开发环境配置 ├── .env.production # 生产环境配置 ├── .eslintrc # ESLint 配置 ├── .prettierrc # Prettier 配置 ├── index.html # HTML 入口文件 ├── package.json # 包管理 ├── postcss.config.js # 分辨率适配配置 └── vite.config.js # Vite 构建配置 ``` ### 静态资源目录 (public/) ``` public/ └── editor/ # ThingJS Editor 项目资源目录 └── sample/ # 开发环境的项目资源文件 └── dist/ # 生产环境的项目资源目录(项目资源从 ThingJS Editor 中导出) └── sample/ # 生产环境的项目资源文件 ``` 编辑器的项目资源路径需要在环境配置文件中进行指定,开发环境使用 `.env` 文件,生产环境使用 `.env.production` 文件。 环境配置文件中应包含 `VITE_SCENE_URL` 变量,指向编辑器项目资源的路径。 **开发环境配置示例:** ``` // .env VITE_APP_TITLE = 'ThingJS Editor 示例项目 (开发环境)' VITE_SCENE_URL = '/editor/sample' ``` **生产环境配置示例:** ``` // .env.production VITE_APP_TITLE = 'ThingJS Editor 示例项目' VITE_SCENE_URL = '/editor/dist/sample' ``` ### 源代码目录 (src/) ``` src/ ├── api/ # 请求封装 ├── assets/ # 静态资源 │ ├── icons/ # 图标资源 │ └── images/ # 图片资源 ├── chart-components/ # 图表组件库 ├── components/ # 通用组件 │ ├── common/ # 按需引入的通用组件 │ ├── global/ # 全局注册的基础组件 │ ├── layout/ # 全局注册的布局组件 │ └── index.js # 统一导出 ├── config/ # 项目配置 ├── events/ # 事件管理 │ ├── event-bus.js # 事件总线 │ ├── event-types.js # 事件类型枚举 ├── hooks/ # 自定义 Hooks ├── router/ # 路由配置 ├── scene3d/ # 3D 核心代码 ├── stores/ # Pinia 状态管理 ├── styles/ # 全局样式 │ └── themes/ # 主题相关样式 │ ├── variables.scss # 全局变量 │ ├── mixins.scss # 混合器(封装可复用样式) │ ├── element-plus.scss # Element Plus 样式覆盖 │ ├── index.scss # 样式入口文件 ├── utils/ # 工具函数 ├── views/ # 路由页面 │ ├── Error/ # 404 页面 │ └── Home/ # 首页 │ ├── components/ # 业务组件 │ ├── modules/ # 首页模块(子路由组件) │ └── index.vue # 首页入口 ├── App.vue # 根组件 └── main.js # 入口文件 ```
## 将编辑器项目作为 Git 子模块来管理 为了便于对编辑器项目的独立管理,推荐将其转为 Git 子模块。 操作步骤如下: ##### 1. 在Gitlab或其他代码托管平台新建一个空仓库。 ##### 2. 将编辑器项目(sample)内容推送到新仓库: ```bash cd public/editor/sample # 进入编辑器项目目录 git init git remote add origin <新仓库地址> git add . git commit -m "初始化 sample 仓库" git push -u origin main # 或 master,取决于默认分支名 ``` ##### 3. 在主项目中删除原有 sample 目录: ```bash cd ../../.. # 返回主项目目录 rm -rf public/editor/sample git add . git commit -m "移除 sample 目录准备转为子模块" ``` ##### 4. 将新仓库添加为主项目的子模块: ```bash git submodule add <新仓库地址> public/editor/sample git commit -m "添加 sample 作为子模块" ```
#### 初始化子模块(其他开发者) 其他开发者需要执行以下命令来初始化已关联的子模块: ```bash git submodule update --init ``` #### 更新子模块 ##### 1. 拉取子模块最新内容 ```bash # 进入子模块目录 cd public/editor/sample # 拉取更新 git pull origin main ``` ##### 2. 提交子模块更新到主项目 ```bash # 返回主项目目录 cd ../../.. # 提交子模块更新 git add public/editor/sample git commit -m "更新 sample 子模块版本" ```
## 组件系统 项目模板中集成了 Element Plus 组件库,并预置了部分通用组件和业务组件,通用组件目前包括布局组件、SVG图标组件、图例组件、信息面板组件、时间格式化展示组件、主题切换组件等。 #### 3D 场景组件 3D 场景组件会自动根据**环境配置文件**中的**编辑器项目资源路径**,来加载和展示对应的 3D 场景资源。可以在等待场景初始化完成后,继续编写代码操作 3D 场景。 ```html /* Scene3D.vue */ ``` #### 布局组件 布局组件用于快速进行页面级整体布局,包含 Layout(弹性布局容器)、Header(顶部布局)、Content(内容部分)、Sider(侧边栏)、Footer(底部布局)。Layout 布局容器会对内部的布局组件自动进行弹性布局。 ```html ``` #### 业务组件 项目模板内置了多种业务组件,位于 `src/views/Home/components` 目录下。 业务组件展示的内容,在 `src/config` 的配置文件中定义,组件通过交互对内容进行响应式更新。 - **NavMenu** 导航菜单组件,可关联业务模块子路由,在 `src/router` 路由文件中配置子路由组件的映射。 - **ToolBar**: 工具栏组件,用于展示视图操作按钮。 - **BusinessMenu**: 业务菜单组件,支持多级菜单展示,可以配置菜单方向和是否互斥。 - **BusinessLegend**: 图例组件,用于展示数据分类和颜色标识,支持水平或垂直排列。 #### 图表组件 图表组件库位于 `src/chart-components` 目录,有独立的开发服务,可将其作为 Git 子模块来管理。 **图表组件开发** ```bash # 启动图表组件独立开发服务 pnpm dev:chart ``` **图表组件使用** 可选择全局注册或按需导入图表组件两种使用方式: A. 全局注册使用 ```javascript import { createApp } from 'vue' import App from './App.vue' import chartComponents from '@/chart-components' const app = createApp(App) app.use(chartComponents) ``` B. 按需导入使用 ```html ```
## 事件 #### 事件类型 项目模板提供了事件类型管理,通过 `UI_EVENTS` 和 `SCENE_EVENTS` 来定义所有可用的事件类型。 `UI_EVENTS` 为 UI 界面触发的事件类型,`SCENE_EVENTS` 为 3D 场景触发的事件类型。 #### 界面与 3D 场景事件通信 项目中封装了异步获取 ThingJS 3D 场景实例的方法。 通过 `getApp()` 方法获取 app 实例后,可通过其提供的事件方法与 3D 场景进行通信: ```javascript import { getApp } from '@/scene3d' import { SCENE_EVENTS, UI_EVENTS } from '@/events/event-types' // 获取场景实例,场景实例会等待场景加载完成后返回 const app = await getApp() // 监听 3D 场景发送过来的点击事件 app.on(SCENE_EVENTS.CLICK, (event) => { console.log('点击对象:', event.object) }) // 界面向 3D 场景发送切换模式事件 app.trigger(UI_EVENTS.MODE_CHANGE, payload) ``` #### 界面跨组件事件通信 另外也提供了事件总线,用于处理界面内跨组件的事件通信,使用示例: ```javascript import { triggerEvent, listenEvent } from '@/events/event-bus' import { UI_EVENTS } from '@/events/event-types' // 监听事件 const unlisten = listenEvent(UI_EVENTS.SHOW_INFO_PANEL, (payload) => { console.log('显示信息面板:', payload) }) // 触发事件 triggerEvent(UI_EVENTS.SHOW_INFO_PANEL, payload) // 移除监听 unlisten() ```
## 云瞰孪生服务 > 前置条件:使用前确保在编辑器中正确启用了云瞰插件。 项目封装了云瞰工作台的孪生服务接口,支持孪生数据的获取与交互。 当编辑器中启用云瞰插件后,前端项目会自动获取并使用相应的 `API Key`,来提供孪生服务请求。 #### 孪生服务请求 由于孪生服务依赖于云瞰插件,以下方法的调用时机必须在编辑器场景初始化完成之后: - `getTwinServiceUrl`:根据服务名称获取孪生服务 URL - `requestTwinService`:向孪生服务发送请求,自动携带 `API Key` 认证 使用示例: ```javascript import { getApp } from '@/scene3d' import { getTwinServiceUrl, requestTwinService } from '@/api' // 确保编辑器场景初始化完成,即云瞰插件已成功启用 await getApp() // 获取孪生服务 URL const serviceUrl = getTwinServiceUrl('孪生体告警查询服务') // 请求孪生服务数据 const data = await requestTwinService(serviceUrl, params) ```
## 分辨率适配 引入了 postcss-px-to-viewport 插件,编译时将 px 转换为 viewport 视口单位,使元素尺寸始终适配视口分辨率。可在 `postcss.config.js` 文件中**配置设计稿分辨率**。
## 常见问题解答 (FAQ) ### Q: 如何更改 3D 场景资源路径? A: 在 `.env` 或 `.env.production` 文件中修改 `VITE_SCENE_URL` 变量的值。 ### Q: 如何自定义主题? A: 目前内置了 `light` 和 `dark` 明暗两种主题,默认使用的是暗色主题。可修改 `src/styles/themes` 目录下的主题相关样式文件,并使用 `useTheme` hook 进行主题设置或切换。 使用示例: ```javascript import useTheme from '@/hooks/useTheme' const { setTheme, toggleTheme } = useTheme() // 设置主题 setTheme('light') // 切换主题 toggleTheme() ``` ### Q: 如何使用 SCSS mixins? A: 项目提供了常用的 SCSS mixins,位于 `src/styles/mixins.scss` 文件中。目前提供的 mixins 主要包括: - `flex`: 弹性布局,简化 flex 布局设置 - `absolute`: 绝对定位,简化绝对定位的设置 - `glass-effect`: 毛玻璃背景效果 - `ellipsis`: 文本溢出省略,支持单行和多行文本省略 - `scrollbar`: 自定义滚动条样式,美化默认滚动条 在组件样式中可以通过以下方式使用: ```scss ``` ### Q: 如何使用 SVG 图标? A: 项目提供了全局注册的 `SvgIcon` 组件,用于展示 SVG 图标,组件支持以下属性: - `url`:SVG 图标的路径(必填) - `color`:图标颜色,默认为 `currentColor`,会继承父元素的文字颜色 ```html ``` 图标会自动继承当前文字大小(1em),可通过父元素的 `font-size` 来调整大小。