如何在yudao-ui-admin-vue3里集成https://github.com/KNXCloud/lowcode-engine-vue,想要实现设计器编辑出来的页面,在ruoyi里的某个菜单点了后能显示运行,为和内置功能页面一样的vue view来接入打开
时间: 2025-07-23 12:00:38 浏览: 4
<think>我们正在将 lowcode-engine-vue 集成到 yudao-ui-admin-vue3 项目中,目标有两个:
1. 提供设计器页面(用于编辑页面)
2. 将设计器编辑出来的页面作为普通的Vue视图(View)在菜单中打开,与系统内置的页面一样
步骤分解:
1. 安装依赖
2. 创建设计器页面(Designer)
3. 创建页面渲染器(Renderer)用于运行设计好的页面
4. 配置路由(设计器路由和动态页面路由)
5. 配置菜单(添加设计器入口和动态页面的菜单)
6. 对接后端API(保存和获取页面配置)
详细步骤:
第一步:安装依赖
我们需要安装 lowcode-engine-vue 和 monaco-editor(低代码引擎依赖的编辑器)
注意:根据引用[2]中提到的,Vite项目在安装依赖时可能会遇到问题,因此我们需要注意版本和配置。
在项目根目录下执行:
```bash
npm install @knxcloud/lowcode-engine-vue [email protected]
```
第二步:创建设计器页面
在 `src/views` 目录下创建一个 `lowcode` 文件夹,然后在该文件夹中创建 `Designer.vue` 文件。
代码示例:
```vue
<template>
<div ref="container" class="designer-container"></div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { init } from '@knxcloud/lowcode-engine-vue';
import { useRoute } from 'vue-router';
const container = ref(null);
const route = useRoute();
onMounted(() => {
// 初始化设计器
init(container.value, {
designMode: 'live', // 实时设计模式
enableCondition: true, // 启用条件
// 可以传递其他配置,比如页面ID(从路由获取)
pageId: route.query.pageId || 'default', // 假设通过query传递页面ID
});
});
</script>
<style scoped>
.designer-container {
height: calc(100vh - 50px); // 根据实际布局调整高度
background: #fff;
}
</style>
```
第三步:创建页面渲染器
在同一个 `lowcode` 文件夹中创建 `Renderer.vue` 文件,用于渲染设计器生成的页面。
代码示例:
```vue
<template>
<div v-if="schema">
<VueRenderer :schema="schema" />
</div>
<div v-else>
页面未配置
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import { VueRenderer } from '@knxcloud/lowcode-engine-vue';
import { useRoute } from 'vue-router';
import { getLowcodePage } from '@/api/lowcode'; // 需要创建对应的API
const route = useRoute();
const schema = ref(null);
onMounted(async () => {
// 从路由参数中获取页面ID
const pageId = route.params.pageId;
// 调用API获取页面配置
const response = await getLowcodePage(pageId);
schema.value = JSON.parse(response.data.schema); // 假设后端返回的数据结构中有schema字段,是字符串形式的JSON
});
</script>
```
第四步:配置路由
在 `src/router/index.js` 中配置设计器和页面渲染器的路由。
设计器路由:
```javascript
{
path: '/lowcode/designer',
name: 'LowcodeDesigner',
component: () => import('@/views/lowcode/Designer.vue'),
meta: {
title: '低代码设计器',
requiresAuth: true, // 需要登录
permissions: ['lowcode:design'] // 需要设计权限,根据实际权限系统配置
}
}
```
页面渲染路由(动态路由,因为每个页面ID不同):
```javascript
{
path: '/lowcode/view/:pageId',
name: 'LowcodePage',
component: () => import('@/views/lowcode/Renderer.vue'),
meta: {
title: '低代码页面',
requiresAuth: true // 需要登录,可能还需要根据页面配置权限
}
}
```
第五步:配置菜单
在 `src/config/menu.js` 中添加菜单项,包括设计器入口和示例页面(或者动态菜单需要从后端获取,这里以静态配置为例)。
示例:
```javascript
export default [
// ...其他菜单
{
path: '/lowcode',
name: 'Lowcode',
meta: { title: '低代码平台', icon: 'magic-stick' },
children: [
{
path: 'designer',
name: 'Designer',
meta: { title: '设计器', icon: 'edit' }
},
// 这里可以配置一个示例页面,实际中可能从后端获取动态菜单
{
path: 'view/dashboard', // 对应路由中的 /lowcode/view/dashboard,其中dashboard就是页面ID
name: 'LowcodeDashboard',
meta: { title: '仪表盘', icon: 'data-line' }
}
]
}
];
```
第六步:创建API
在 `src/api` 目录下创建 `lowcode.js` 文件,定义保存和获取页面配置的API。
示例:
```javascript
import request from '@/utils/request'
// 获取页面配置
export function getLowcodePage(pageId) {
return request({
url: `/lowcode/page/get/${pageId}`,
method: 'get'
})
}
// 保存页面配置
export function saveLowcodePage(data) {
return request({
url: '/lowcode/page/save',
method: 'post',
data
})
}
```
注意:后端接口需要自行实现(RuoYi-Vue后端),这里只提供了前端的API定义。
第七步:解决Vite兼容性问题(参考引用[2])
在 `vite.config.js` 中配置优化依赖和别名:
```javascript
import { defineConfig } from 'vite'
export default defineConfig({
// ...其他配置
optimizeDeps: {
include: [
'@knxcloud/lowcode-engine-vue',
'monaco-editor/esm/vs/editor/editor.worker'
],
exclude: ['@knxcloud/lowcode-engine-vue/dist/vue-renderer']
},
build: {
commonjsOptions: {
transformMixedEsModules: true
}
},
resolve: {
alias: {
// 解决 lowcode-engine 内部模块别名问题
'@alilc/lowcode-engine': '@knxcloud/lowcode-engine-vue'
}
}
})
```
第八步:样式调整
由于低代码引擎的样式可能会与现有系统样式冲突,建议在设计器页面和渲染页面使用样式隔离。
在 `Designer.vue` 和 `Renderer.vue` 中,使用scoped样式,并可能需要覆盖一些样式。
例如,在 `Designer.vue` 中:
```vue
<style scoped>
.designer-container ::v-deep .some-class {
/* 覆盖样式 */
}
</style>
```
第九步:权限控制(可选)
在 `src/permission.js` 中,可以根据路由的meta信息进行权限校验,确保只有具有权限的用户才能访问设计器和特定页面。
总结:
通过以上步骤,我们完成了:
- 设计器的集成,通过菜单项“设计器”打开,进行页面设计。
- 设计好的页面通过另一个菜单项(如“仪表盘”)打开,该菜单项指向动态路由 `/lowcode/view/dashboard`,其中 `dashboard` 是页面ID,由渲染器组件从后端获取页面配置并渲染。
注意:实际应用中,动态菜单可能需要从后端获取,包括低代码页面的菜单项。这里我们只配置了静态菜单作为示例。
最后,如果遇到依赖安装问题(如引用[2]所述),可以尝试删除node_modules和package-lock.json后重新安装,或者检查网络和npm源。
另外,引用[1]提到了一套基于芋道源码二次封装的低代码框架JeeLowCode,如果有需要,可以考虑采用该方案以获得更完整的低代码开发体验[^1]。
§§相关问题§§
1. 如何扩展 lowcode-engine-vue 的自定义组件?
2. 如何实现低代码页面与后端API的数据交互?
3. 如何将低代码页面与现有系统的权限管理深度集成?</think>在 yudao-ui-admin-vue3 中集成 lowcode-engine-vue 并实现设计页面作为独立菜单项运行,需要以下关键步骤:
### 一、核心集成步骤
#### 1. **安装依赖**
```bash
npm install @knxcloud/lowcode-engine-vue [email protected]
```
#### 2. **Vite 配置优化** (`vite.config.js`)
```javascript
export default defineConfig({
optimizeDeps: {
include: [
'@knxcloud/lowcode-engine-vue',
'monaco-editor/esm/vs/editor/editor.worker'
],
exclude: ['@knxcloud/lowcode-engine-vue/dist/vue-renderer']
},
build: {
commonjsOptions: { transformMixedEsModules: true }
},
resolve: {
alias: {
'@alilc/lowcode-engine': '@knxcloud/lowcode-engine-vue'
}
}
})
```
#### 3. **创建设计器组件** (`src/views/lowcode/Designer.vue`)
```vue
<template>
<div ref="container" class="lce-container" style="height: calc(100vh - 50px)"></div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { init } from '@knxcloud/lowcode-engine-vue'
import { useRoute } from 'vue-router'
import { saveSchema } from '@/api/lowcode'
const container = ref(null)
const route = useRoute()
onMounted(() => {
init(container.value, {
designMode: 'live',
enableCondition: true,
pageId: route.query.pageId || 'default',
// 保存回调
onSave: (schema) => {
saveSchema({
pageId: route.query.pageId,
schema: JSON.stringify(schema)
})
}
})
})
</script>
```
#### 4. **创建页面渲染器** (`src/views/lowcode/Renderer.vue`)
```vue
<template>
<div v-if="schema">
<VueRenderer :schema="schema" />
</div>
<ElEmpty v-else description="页面未配置" />
</template>
<script setup>
import { ref } from 'vue'
import { VueRenderer } from '@knxcloud/lowcode-engine-vue'
import { useRoute } from 'vue-router'
import { getSchema } from '@/api/lowcode'
const route = useRoute()
const schema = ref(null)
// 获取页面配置
const loadSchema = async () => {
const res = await getSchema(route.params.pageId)
schema.value = JSON.parse(res.data.schema)
}
loadSchema()
</script>
```
#### 5. **配置路由** (`src/router/index.js`)
```javascript
const routes = [
// 设计器路由
{
path: '/lowcode/designer',
name: 'LowcodeDesigner',
component: () => import('@/views/lowcode/Designer.vue'),
meta: {
title: '低代码设计器',
permissions: ['lowcode:design']
}
},
// 动态页面路由
{
path: '/lowcode/view/:pageId',
name: 'LowcodePage',
component: () => import('@/views/lowcode/Renderer.vue'),
meta: {
title: '低代码页面',
dynamicTitle: true // 标记为动态标题
}
}
]
```
#### 6. **菜单配置** (`src/config/menu.js`)
```javascript
export default [
{
path: '/lowcode',
name: 'Lowcode',
meta: { title: '低代码平台', icon: 'magic-stick' },
children: [
{
path: 'designer?pageId=dashboard',
name: 'Designer',
meta: { title: '设计器', icon: 'edit' }
},
{
path: 'view/dashboard',
name: 'LowcodeDashboard',
meta: {
title: '仪表盘',
icon: 'data-line',
pageId: 'dashboard' // 关联页面ID
}
}
]
}
]
```
#### 7. **API 服务** (`src/api/lowcode.js`)
```javascript
import request from '@/utils/request'
export default {
// 获取页面配置
getSchema(pageId) {
return request({
url: `/lowcode/page/schema/${pageId}`,
method: 'get'
})
},
// 保存页面配置
saveSchema(data) {
return request({
url: '/lowcode/page/schema/save',
method: 'post',
data
})
}
}
```
### 二、高级集成功能
#### 1. **动态页面标题**
在路由守卫中处理动态标题 (`src/permission.js`):
```javascript
router.beforeEach((to) => {
if (to.meta.dynamicTitle && to.params.pageId) {
// 从后端获取页面标题
const title = await fetchPageTitle(to.params.pageId)
to.meta.title = title || '低代码页面'
}
})
```
#### 2. **组件注册扩展**
在渲染器中注册自定义组件:
```javascript
// Renderer.vue
import { registerComponent } from '@knxcloud/lowcode-engine-vue'
import CustomComponent from '@/components/CustomComponent.vue'
registerComponent('CustomComponent', CustomComponent)
```
#### 3. **权限深度集成**
在页面渲染前校验权限:
```javascript
// Renderer.vue
import { usePermission } from '@/hooks/usePermission'
const { hasPermission } = usePermission()
const loadSchema = async () => {
if (!hasPermission(`lowcode:view:${route.params.pageId}`)) {
return router.push('/401')
}
// ...加载schema
}
```
### 三、效果验证方式
1. **访问设计器**:
```
http://localhost:3000/lowcode/designer?pageId=dashboard
```
2. **访问生成页面**:
```
http://localhost:3000/lowcode/view/dashboard
```
### 四、企业级优化建议
对于更复杂的企业需求,推荐参考 JeeLowCode 框架的深度集成方案[^1],它提供:
1. 可视化表单/流程设计器
2. 自动生成 CRUD 代码
3. 多数据源对接
4. 移动端适配
5. 完整的权限控制体系
```mermaid
graph TD
A[菜单点击] --> B[路由解析]
B --> C{页面类型}
C -->|设计器| D[加载Designer组件]
C -->|渲染器| E[加载Renderer组件]
D --> F[初始化低代码引擎]
E --> G[获取页面Schema]
G --> H[渲染Vue组件树]
H --> I[展示最终页面]
```
此方案实现了设计器与渲染器的无缝集成,生成的页面与原生 Vue 组件具有相同的渲染性能和用户体验,同时保持菜单系统的统一管理。
阅读全文
相关推荐


















