3.5.7.3 自定义布局

布局是什么

在系统中,布局决定了母版内的页面元素,一个页面可以由多个组件进行组装,布局可以根据视图类型来替换。

默认布局范围:

image.png

图3-5-7-36 默认布局范围

作用场景

系统内置了多个布局组件,这些组件适用于全局、某个应用或某个页面,提供了灵活的布局定制选项。这些组件根据不同类型的视图进行了默认的组装,这也是选择了视图类型后,页面能够呈现的原因。当然,这些默认的组装是可以被覆盖、新增和添加新组件的。

使用registerLayout进行自定义布局

开发者在使用这些布局组件时,应该遵循公司的规范进行统一的调整。自定义布局组件的使用可通过 registerLayout 实现。registerLayout 的第一个参数是代表布局的 XML,第二个参数是不同的选项维度,默认包含以下维度:

  • viewType: 视图类型
  • module: 视图模型所在模块
  • moduleName: 视图模型所在模块名称
  • model: 视图模型编码
  • modelName: 视图模型名称
  • viewName: 视图名称
  • actionName: 动作名称
  • inline: 是否内嵌视图(子视图特有)
  • ttype: 模型字段类型(子视图特有)
  • relatedTtype: 关联模型字段类型(子视图特有)
  • field: 字段(子视图特有)

需要注意的是,动作可以是A模块下的a模型,这个动作可以打开B模块下的b模型的视图,module、moduleName、model、modelName应该填b模型对应的值,只不过大部分场景我们都是本模型的动作打开本模型的视图,所以这些场景拿动作所在模型填这些值也可以
这些纬度也可以通过查看TS的定义查看

全局

在系统中,我们可以通过指定视图类型来决定某一类视图的全局布局。以表格为例,当第二个入参为 { viewType: ViewType.Table } 时,代表了替换了系统内所有表格的布局样式。

示例工程目录

以下是需关注的工程目录示例,main.ts更新导入./layout,layout/index.ts更新导出./tableLayout:

image.png

图3-5-7-37 全局纬度注册布局工程目录示例

示例代码

import {registerLayout, ViewType} from '@kunlun/dependencies'

/**
 * 把系统内所有表格类型视图的全局动作放入搜索区域
 *
 * 移动actionBar布局至外层
 * <element widget="actionBar" slot="actionBar" slotSupport="action">
 *   <xslot name="actions" slotSupport="action" />
 * </element>
 * */

const registerGlobalTableLayout = () => {
    return registerLayout(`<view type="TABLE">
    <element widget="actionBar" slot="actionBar" slotSupport="action">
        <xslot name="actions" slotSupport="action" />
    </element>
    <pack widget="group">
        <view type="SEARCH">
            <element widget="search" slot="search" slotSupport="field" />

        </view>
    </pack>
    <pack widget="group" slot="tableGroup">
        <element widget="table" slot="table" slotSupport="field">
            <element widget="expandColumn" slot="expandRow" />
            <xslot name="fields" slotSupport="field" />
            <element widget="rowActions" slot="rowActions" slotSupport="action" />
        </element>
    </pack>
</view>`, { viewType: ViewType.Table })
}

registerGlobalTableLayout()

图3-5-7-38 全局纬度注册布局代码示例

效果

image.png

图3-5-7-39 全局纬度注册布局效果示例

应用

在系统中,我们可以通过指定视图类型和模块名称来替换某一类视图在特定模块下的全局布局。以表格为例,当第二个入参为 { viewType: ViewType.Table, moduleName: 'resource' } 时,代表了替换了资源应用下所有表格的布局样式,而其他应用仍使用默认布局

import {registerLayout, ViewType} from '@kunlun/dependencies'

const registerModuleTableLayout = () => {
    return registerLayout(`<view type="TABLE">
    <element widget="actionBar" slot="actionBar" slotSupport="action">
        <xslot name="actions" slotSupport="action" />
    </element>
    <pack widget="group">
        <view type="SEARCH">
            <element widget="search" slot="search" slotSupport="field" />

        </view>
    </pack>
    <pack widget="group" slot="tableGroup">
        <element widget="table" slot="table" slotSupport="field">
            <element widget="expandColumn" slot="expandRow" />
            <xslot name="fields" slotSupport="field" />
            <element widget="rowActions" slot="rowActions" slotSupport="action" />
        </element>
    </pack>
</view>`, { viewType: ViewType.Table, moduleName: 'resource' })
}

registerModuleTableLayout()

图3-5-7-40 应用纬度注册布局代码示例

参数说明

  • viewType: ViewType.Table: 通过这个参数,我们指定视图类型为表格。
  • moduleName: 'resource': 通过这个参数,我们指定模块名称为 'resource',表示替换资源应用下所有表格的布局。

页面

在系统中,我们可以通过指定应用、模型和视图类型来替换当前应用下某个模型的特定视图布局。以表格为例,当第二个入参为 { viewType: ViewType.Table, moduleName: 'resource', model: 'resource.ResourceProvince' } 时,代表了替换了资源应用下省份模型 resource.ResourceProvince 的表格视图布局。

若当前模型存在多个相同类型的视图,可以加上 actionName: "resource#省",其中 actionName 是当前页面的唯一标识,具有唯一性。

const registerViewTableLayout = () => {
    return registerLayout(`<view type="TABLE">
    <pack widget="group">
        <view type="SEARCH">
            <element widget="search" slot="search" slotSupport="field" />
            <element widget="actionBar" slot="actionBar" slotSupport="action">
                <xslot name="actions" slotSupport="action" />
            </element>
        </view>
    </pack>
    <pack widget="group" slot="tableGroup">

        <element widget="table" slot="table" slotSupport="field">
            <element widget="expandColumn" slot="expandRow" />
            <xslot name="fields" slotSupport="field" />
            <element widget="rowActions" slot="rowActions" slotSupport="action" />
        </element>
    </pack>
</view>`, { viewType: ViewType.Table, moduleName: 'resource', model: 'resource.ResourceProvince' })
}

registerViewTableLayout()

图3-5-7-41 页面纬度注册布局代码示例

参数说明

  • viewType: ViewType.Table: 通过这个参数,我们指定视图类型为表格。
  • moduleName: 'resource': 通过这个参数,我们指定应用名称为 'resource'。
  • model: 'resource.ResourceProvince': 通过这个参数,我们指定模型为 'resource.ResourceProvince',表示替换了资源应用下省份模型的表格视图布局。
  • actionName: "resource#省": 通过这个参数,我们指定当前页面的唯一标识,用于区分当前模型存在多个相同类型的视图。

扩展布局

除了内置的布局组件,系统还支持添加自定义布局组件,并通过修改布局来实现个性化和灵活扩展的目标。

注册布局组件

注册自定义布局组件

示例工程目录

以下是需关注的工程目录示例,更新导出./widget:

image.png

图3-5-7-42 注册自定义布局工程目录示例

示例代码

首先,我们需要注册自定义布局组件。以下是一个示例代码,注册了一个名为 CustomLayoutWidget 的自定义布局组件:

import { SPI, BaseElementWidget } from '@kunlun/dependencies';
import CustomLayoutWidgetVue from './LayoutWidget.vue';

@SPI.ClassFactory(BaseElementWidget.Token({ widget: 'custom-layout-widget' }))
  export class CustomLayoutWidget extends BaseElementWidget {
    public initialize(props) {
      super.initialize(props);
      this.setComponent(CustomLayoutWidgetVue);
      return this;
    }
  }

图3-5-7-43 注册自定义布局组件(TS)代码示例

在上述代码中,我们使用 @SPI.ClassFactory 注解注册了一个名为 custom-layout-widget 的自定义布局组件,其实现为 CustomLayoutWidget 类。这个类继承自 BaseElementWidget,并在 initialize 方法中设置了对应的 Vue 组件。

自定义布局组件的 Vue 文件示例 (LayoutWidget.vue)

<template>
  <div class="layout-widget-wrapper">
    <h1>Layout组件</h1>
  </div>
</template>

<script lang="ts">
  import { defineComponent } from 'vue';

  export default defineComponent({
    inheritAttrs: false,
    name: 'LayoutComponentVue'
  });
</script>

<style lang="scss">
  .layout-widget-wrapper {
    background-color: red;
  }
</style>

图3-5-7-44 注册自定义布局组件(Vue)代码示例

自定义布局

示例工程目录

以下是需关注的工程目录示例,添加导出./widget:

image.png

图3-5-7-45 使用自定义布局工程目录示例

示例代码

在这个示例中,我们注册了一个表格,并将自定义组件 custom-layout-widget 与布局结合。以下是代码示例:

const registerViewTableLayout = () => {
    return registerLayout(`<view type="TABLE">
    <pack widget="group">
+        <element widget="custom-layout-widget" />
        <view type="SEARCH">
            <element widget="search" slot="search" slotSupport="field" />
            <element widget="actionBar" slot="actionBar" slotSupport="action">
                <xslot name="actions" slotSupport="action" />
            </element>
        </view>
    </pack>
    <pack widget="group" slot="tableGroup">

        <element widget="table" slot="table" slotSupport="field">
            <element widget="expandColumn" slot="expandRow" />
            <xslot name="fields" slotSupport="field" />
            <element widget="rowActions" slot="rowActions" slotSupport="action" />
        </element>
    </pack>
</view>`, { viewType: ViewType.Table, moduleName: 'resource', model: 'resource.ResourceProvince' })
}

registerViewTableLayout()

图3-5-7-46 使用自定义布局代码示例

效果

image.png

图3-5-7-47 使用自定义布局效果示例

Oinone社区 作者:史, 昂原创文章,如若转载,请注明出处:https://doc.oinone.top/oio4/9266.html

访问Oinone官网:https://www.oinone.top获取数式Oinone低代码应用平台体验

Like (0)
史, 昂's avatar史, 昂数式管理员
Previous 2024年5月23日 am9:12
Next 2024年5月23日 am9:14

相关推荐

  • 7.1 设计器总览

    设计器转为非专业研发设计,在Oinone3.0版本中已经完成元数据完整在线化,真正做到低无一体。对于设计器的定位我们开篇就介绍过,它是LCDP的产品化呈现,是冰山露在外面大家看得到的,核心还是在LCDP本身。我们先目睹下设计器的一些产品页面,如您有想体验,可以在Oinone官网注册 模型设计器 Oinone以模型为驱动,当有模型、数据字典、数据编码等设计功能,我们就可以完整地定义产品数据模型,模型设计器整体呈现区别于普通ER图,以当前模型为核心视角展开,可以点击关联模型切换主视角。这样的好处在于突出当前设计,聚焦设计本身。同时模型上预留了几个核心入口如:分类管理、继承拓扑图、页面设计、逻辑设计等。另外我们在体验上区分了专家模式和经典模式,顾名思义,专家模式的功能会更加丰富,对专业知识的要求也会更高。专家模式下一般会增加一些跟业务无关的配置如:索引设置等调优行为 逻辑设计器 从图灵完备的角度上说,要支持功能越完备,使用越复杂。我们优先从图灵完备的角度出发,所以我们第一版逻辑设计器相对比较复杂,第二版本规划中会类似模型设计器推出专家版和经典版。 界面设计器 界面设计器第一版会先支撑后端页面在线自定义,后边将陆续推出前端页面、多端能力。为了支持多端和2C页面的设计,我们对前后端协议做了比较大的改造。目前设计器已经支持完全基于V3的前后端协议。 数据可视化 数据可视化支持从内部系统模型获取数据内容后,根据业务需求自定义图表,目的是为企业提供更高效的数据分析工具。 与市场同类产品相比,我们的数据可视化产品:不需要前置维护数据源、进行数据转换;可智取业务系统模型,系统自动解析选择的模型、接口、表格中的字段后进行数据分析;降低对数据分析人员研发能力要求的同时,也提升了数据分析的效率。 流程设计器 Oinone流程设计器为业务流程和审批流程提供了可自动执行的流程模型:通过定义流转过程中的各个动作、规则,以此实现流程自动化。在Oinone流程设计器中,流程可以跨应用设计,不同应用的模型之间可以通过同一流程执行。

    2024年5月23日
    1.8K00
  • 5.2 CDM之工程模式

    两种工程模式介绍 oinone推荐的两种工程模式都保留互联网特性,如跟业务无关的基础平台还是采用平台化思路建设。二种侧重点差异如下 第一种:比较适合企业采用多供应商联合开发场景,先以业务区分,各个业务线有独立的领域平台,最大限度保持不同业务线的独立性,有利于各个业务线独立发展(目前oinone上层星空系列产品采用这种工程模式,因为我们期望的时候帮助企业构建软件生态,必然要考虑不同供应商联合开发场景) 第二种:比较接近传统互联网架构,先按平台领域区分,如商品领域:商品平台做总工程,但里面按业务区分模块分子工程来保持业务相互独立,相对于第一种把领域的代码放一起,带来好处强化大家思考模型通用性。但不适用于跨公司主体间配合。 图5-2-1 Oinone-CDM的两种工程模式 注意事项: oinone兼容传统互联网架构 不管哪种模式,都需要解决CDM的维护问题 CDM维护的常见问题: Q:CDM层缺少模型怎么办? A:CDM层模型是逐步完善和丰富的。如果是特定业务自己需要的模型,这类模型无通用性。则加到自己的工程中;如果是通用的,则架构组确定是否需要纳入到CDM。 Q:CDM层已有的模型缺少字段怎么办? A:CDM层模型的字段也是逐步完善和丰富的,通用的字段在架构组确定后也会被吸收进来 Q:CDM层不同业务线相互影响怎么办? A:扩展字段最好带上自有前缀标志,如果觉得通用则提交架构组走模型缺少字段加入 Q:CDM层某模型新增加了的字段,但原先业务线已经加了相同含义字段 A:业务线可以把自己的字段related到CDM增加的新字段,并做数据迁移

    2024年5月23日
    1.6K00
  • 页面

    1. 页面介绍 页面是增删改查数据的入口,数据信息的填写、查看都需要通过页面来展示、交互。页面设计是界面设计器的功能之一,提供页面搭建功能,以实现数据的录入、查看/查询、搜索等等。 2. 页面列表 进入界面设计器,默认会打开以卡片形式管理页面的列表。 如图,页面卡片上可预览到的信息分别有页面标题、页面缩略图、视图类型、页面对应模型名称、页面描述。 「页面标题、页面描述」作用是通过文字定义页面的名称以及对页面进行详细描述。 「页面缩略图」是自行上传的图片,用于在页面列表通过图片预览当前页面的大致布局样式。若未上传,将显示系统默认的图片,点此查看缩略图上传。 「视图类型」通过业务角度(运营管理、官网门户、商城等,目前提供了运营管理一种业务类型)进行分类。运营管理中包括表单、表格、详情、画廊、树视图。 表单常应用于数据的创建、编辑页; 表格可理解为数据的列表查看页面,除了常规表格外,本版本支持树表、级联高级视图; 详情用于设计数据的详情页; 画廊是以卡片形式呈现内容; 树视图是包括树表、级联高级视图; 表格-树表、树视图-树表两者之间的区别:表格-树表的主模型是表格的模型,树视图-树表的主模型是树表的模型、左侧表格是展开的内容; 3. 添加页面 操作添加页面,首先需要选择添加方式。目前提供了1种添加页面方式:直接创建。 3.1 直接创建 直接创建时,弹框中填写页面的基本信息,填写完成后进入页面设计页。 4. 页面操作 4.1 设计页面 操作设计页面后直接进入该页面的设计页面,可对组件布局、交互、属性进行设置。 4.2 编辑 操作编辑弹出页面的基本信息弹框,可对当前页面的基本信息进行编辑修改。 可修改的基本信息包括页面标题、操作栏位置、页面分组、页面描述。 4.3 查看被引用的信息 4.3.1 什么是引用? 页面与页面或页面与菜单之间的若存在交互则称为具有引用关系。 举例1:【页面A】中的一个「跳转动作」配置了跳转【页面B】,则称页面B被页面A引用,在页面B下可查看被引用信息。 举例2:比如【菜单1】绑定了【页面C】,则称页面C被菜单1引用,在页面C下可查看被引用信息。 4.3.2 查看的引用信息是什么? 引用信息分别有“存在引用关系的视图”、“存在引用关系的菜单”。页面下操作查看被引用信息,是查看当前页面被引用情况,如上述举例1,页面B被引用,而页面A非被引用,所以只可以在页面B下查看到“存在引用关系的视图”。 4.4 隐藏/可见 对于暂时不使用的页面,可以进行隐藏(隐藏后可再设置可见)的操作。 4.4.1 隐藏/可见会有哪些影响? 隐藏后该页面在跳转动作选择页面和菜单绑定页面时,不可见,已被使用的不受影响。再次操作可见后,即可选择到。 4.4.2 隐藏后的页面找不到了? 若需要对隐藏的页面进行操作,但是在列表未查找到某个隐藏的页面,请切换「是否可见」筛选项,页面列表默认展示所有“可见”的页面,切换为“全部”或“隐藏”,即可找到隐藏的页面。 4.5 删除 对于不再使用且没有被引用信息的页面,可以将页面删除。页面删除后无法恢复,请谨慎操作,对于不确定是否要彻底删除的页面,建议先操作隐藏。 删除前请确保当前页面没有引用关系! 5. 页面搜索 卡片上方是页面筛选和搜索区域,可通过应用、模型、业务类型、视图类型、自定义/系统、可见/隐藏等等筛选页面;搜索时仅支持使用页面名称进行搜索。同时筛选条件也具备记忆功能,即上一次在页面列表的筛选条件是哪些,再次进入页面列表,筛选条件默认为上次的条件。 其中自定义页面是所有人工添加的页面,系统页面为非人工添加的页面,由系统默认生成,只可用于查看,不可编辑、删除或设计。 6. 页面分组管理 6.1 页面分组 当页面过多时,可以自定义添加15个分组,将页面进行归类管理。默认展示全部分组,点击「全部」展开所有分组,点击分组进行分组下的页面查看或管理分组。 6.2 管理分组 展开分组后,点击「管理分组」,出现弹框,在弹框中可以修改分组名称、添加分组、删除分组。 6.2.1 添加分组 操作「+页面分组」,可以直接输入分组名称后回车以添加一个新分组,或快捷选择其他应用使用的分组。最多添加15个分组。 6.2.2 修改分组 双击分组标签,即可对已有分组进行名称的修改。若分组在其他应用也使用,则在其他应用内,该分组名称同步变化。 6.2.3 删除分组 若分组下有页面或分组有被其他应用使用,则分组无法删除。

    2024年6月20日
    1.5K00

Leave a Reply

Please Login to Comment