背景

目前针对业务端渲染模版接入需要求业务端系统基于CSB架构

接入方式

业务端系统执行如下安装:

yarn add @cvte/cir-csb-common-view@1.4.9

环境变量配置

app/modules/App/global.js

import globalStore from '@cvte/cir-tools/utils/globalStore';
import { pluginStore } from '@cvte/cir-framework';
import menuEntity from '@cvte/cir-antdframe/entities/menu';
import { generatorGlobalContext } from '@cvte/cir-csb-common-view';
// 其他代码
// 设置全局网络请求代理
const setHeader = (xOrgId) => {
  axios.interceptors.request.use((config) => {
    const { headers } = config || { headers: {} };
    headers.common = {
      'Content-Type': 'application/json',
      'csrf-token': window.csrfToken,
      'crypt-key': (window.crypt || {}).cryptkey,
      'x-auth-token': window['x-auth-token'],
      'x-org-id': xOrgId || window['x-org-id'] || '',
      ...(headers.common || {}),
    };
    axios.defaults.headers.common = Object.assign(axios.defaults.headers.common, config.headers.common);
    return config;
  });
};
// 获取用户信息
observe(globalStore.userInfo, (change) => {
  const { newValue, name } = change;
  if (name === 'data') {
    generatorGlobalContext?.getContext?.()?.session?.setUser?.(newValue);
  }
});
// 获取组织信息
observe(menuEntity.globalMultiOrgData, (change) => {
  const { newValue, name } = change;
  if (name === 'data') {
    const xOrgId = pluginStore.get(menuEntity.surrentOrgId);
    if (xOrgId) {
      setHeader(xOrgId);
      const currentData = newValue?.find?.((item) => item.id === xOrgId);
      if (currentData) {
        generatorGlobalContext?.getContext?.()?.session?.setOrg?.(currentData);
      }
    }
  }
});
// 其他代码

config/server.js

修改CSB工程中/config/server.js文件内容

module.exports = {
  // 其他配置
  cirapi: {
      // 其他配置
      lcpCore: {
        url: process.env['lcp.core'],
      },
      lcpHub: {
        url: process.env['lcp.hub'],
      },
      lcpAnnex: {
        url: process.env['lcp.annex'],
      },
  }
  injectData: [
    // 其他配置
    { key: 'categoryId', value: process.env['annex.categoryId'] || 'csb_obj_file' },
    { key: 'tenantId', value: process.env['cplp.tenantId'] || 'c518f53d-b405-4111-afe1-5c082b284971' },
    { key: 'annexDomain', value: process.env['annex.domain'] || 'https://csbtest-api.gz.cvte.cn/cfile/' },
    { key: 'itemIndexName', value: process.env['item.data.indexName'] },
    { key: 'changeIndexName', value: process.env['change.data.indexName'] },
  ]
  // 其他配置
};

Apollo

增加如下表配置键值对

各业务域进行域名下表域名为各业务域示例信息,配置地址时请与本业务域后端同学确认!!!

业务域 对象引擎API
lcp.core
低代码API
lcp.hub
附件服务API
lcp.annex
ES推送索引
item.data.indexName
DB推送索引
change.data.indexName
平台 https://lcptest.gz.cvte.cn/core https://lcptest.gz.cvte.cn/hub https://csbtest-api.gz.cvte.cn/cfile csb-test-substance-item csb-test-substance-change
营销 https://ltc-lcdp-api-dev.gz.cvte.cn/core https://ltc-lcdp-api-dev.gz.cvte.cn/hub https://csbtest-api.gz.cvte.cn/cfile csb-test-substance-item csb-test-substance-change
财务 https://finad-fat.gz.cvte.cn/core https://finad-fat.gz.cvte.cn/hub https://csbtest-api.gz.cvte.cn/cfile csb-test-substance-item csb-test-substance-change
供应链 https://scm-btest-api.gz.cvte.cn/lcp https://scm-btest-api.gz.cvte.cn/lcphub https://csbtest-api.gz.cvte.cn/cfile csb-test-substance-item csb-test-substance-change

附件服务地址参考如下:

测试环境地址(内网):https://csbtest-api.gz.cvte.cn/cfile;
测试环境地址(外网):https://itapis.cvte.com/cfile-test/;
正式环境地址(内网):https://csb-api.gz.cvte.cn/cfile;
正式环境地址(外网):https://itapis.cvte.com/cfile/

动态模板接入

1.本地模板模块开发

  1. 动态列表界面List.tsx
// 详情视图
import { CSBList } from '@cvte/cir-csb-common-view';
export default CSBList;
  1. 详情界面模板Detail.tsx
// 详情视图
import { CSBDetail } from '@cvte/cir-csb-common-view';
export default CSBDetail;

2.动态菜单配置

请先完成动态菜单的升级改造:【1_菜单接入手册

  • 系统管理下的页面配置中,新建一个动态模块;

  • 选项须选择动态组件

  • 动态组件路径需填写本地代码所在app目录中的路径;

  • 路由参数在使用业务端渲染模版的场景下需要必填的参数如下:

参数名 说明
appId 应用ID
tenantId 租户ID
classId 表单分类ID
name 表单分类名称
apiName 表单分类编码
  • 标签标志用于当打开方式多页签的场景下,跳转页面时需要从当前路由参数中获取的标志键名;

示例图

  1. 配置列表页面资源和菜单

  1. 配置详情页面资源和菜单

静态模块接入

在原生开发的地方引入低代码列表、或低代码详情表单

// 列表视图
import { CSBList } from '@cvte/cir-csb-common-view';

// 详情视图
import { CSBDetail } from '@cvte/cir-csb-common-view';

<CSBList />

<CSBDetail />

<CSBList _pageCode={_pageCode} classId='b2bfce8e888d4042a436ec3ff00aba71'  apiName='T_FIELD_RELATION'  itemIndex={{itemIndex:'csb-test-substance-item'}} appId='7f13584756db4b51afccef440e301138' tenantId='c518f53d-b405-4111-afe1-5c082b284971'></CSBList>

<CSBDetail appId='7f13584756db4b51afccef440e301138' tenantId='c518f53d-b405-4111-afe1-5c082b284971' classId='b2bfce8e888d4042a436ec3ff00aba71'  apiName='T_FIELD_RELATION' ></CSBDetail>

二次开发

CSBList入参

参数 数据类型 说明
ref ICsbListRef GlobalContext 上下文对象
Context 上下文类
FormUtils 表单渲染器工具库
getRef() 获取当前表格参考对象
refresh 执行表格刷新
_pageCode string 页面配置中的页面编码
动态菜单引入场景下antdFrame会传入该参数组件
静态模块引入场景下必须从外部传入
如果上层模块非动态模块,即没有该参数
则需要在系统管理的页面配置中新增菜单并将页面编码的值传入该参数
appId string 应用ID
tenantId string 租户ID
classId string 表单分类Id
apiName string 表单分类编码
name string 表单分类名称
itemIndex itemIndex?: string推送ES表单索引
changeIndex?: string 推送ES变更索引
推送ES的索引类型判断标识
metaConfig axios?: AxiosRequestConfig 全局axios参数,组件销毁后参数复原
serverApiConfig?: IMainMetaServerApiConfig node服务代理地址
apiConfig?: IMainMetaApiConfig 业务渲染器api自定义配置
viewConfig?: IListMetaConfigViewConfig 视图列表自定义参数配置
自定义参数配置
inject components?: IRegisterComponent[] 需要注入的组件列表
events?: IRegisterEvent[] 需要注入的事件列表
初始注入项
onCreate () => void 行创建按钮回调
onEdit (record) => void 列编辑按钮回调
onDelete (record, params?: any) => void 列删除按钮回调
onInit () => void | Promise<void> 当列表组件第一次加载时回调
onTargetChanged (target?:{ classId: string; apiName: string; name: string; }, ref?: ICsbListRef) => void | Promise<void> target.classId 当前传入的表单分类id
target.apiName 当前传入的表单视图编码
target.name 当前传入的表单分类名称
ref 当前视图的参考对象

CSBDetail入参

参数 数据类型 说明
ref any 参考对象
pageId string 表单详情ID
appId string 应用ID
tenantId string 租户ID
classId string 表单分类ID
apiName string 表单视图编码
itemId string 表单详情ID
itemNumber string 变更编码
designId string 设计方案ID
designApi string 设计方案编码
versionId string 版本号
configs IConfigs 表单元数据
metaConfig axios?: AxiosRequestConfig 全局axios参数,组件销毁后参数复原
serverApiConfig?: IMainMetaServerApiConfig node服务代理地址
apiConfig?: IMainMetaApiConfig 业务渲染器api自定义配置
自定义参数配置
inject components?: IRegisterComponent[] 需要注入的组件列表
events?: IRegisterEvent[] 需要注入的事件列表
初始注入项
onInit (props: IMain) => Promise<IMain> | IMain 初始化渲染引擎,若无返回则使用默认流程
onLoadData (data: IMain) => Promise<IConfigs> | IConfigs 渲染引擎加载数据,若无返回则使用默认流程
onInitData (data: IConfigs) => Promise<IConfigs> | IConfigs 初始化渲染数据,若无返回则使用默认流程
onRenderStart (data: IConfigs) => Promise<void> | void 渲染开始
onRenderEnd (data: IConfigs) => Promise<void> | void 渲染结束
onDestroy (data: IConfigs) => Promise<any> | any 渲染引擎销毁
onError (error: IMainErrorDetailObject, ...args: any[]) => Promise<void> | void 错误异常捕获
onClick (globalConfig: IConfigs, globalRef: Record<string, any>, handler: any, initParams: any, ...args: any[]) => Promise<any> | any 全局点击事件
onSelect (globalConfig: IConfigs, globalRef: Record<string, any>, handler: any, initParams: any, ...args: any[]) => Promise<any> | any 全局选中事件
onChange (globalConfig: IConfigs, globalRef: Record<string, any>, handler: any, initParams: any, ...args: any[]) => Promise<any> | any 全局改变值事件
onFocus (globalConfig: IConfigs, globalRef: Record<string, any>, handler: any, initParams: any, ...args: any[]) => Promise<any> | any 全局获得焦点事件
onBlur (globalConfig: IConfigs, globalRef: Record<string, any>, handler: any, initParams: any, ...args: any[]) => Promise<any> | any 全局失去焦点事件

通用

服务名称 使用方式 应用场景
CSBRegister import { CSBRegister } from '@cvte/cir-csb-common-view'; 需要使用到全局注册器注入自定义事件自定义组件
CSBMessage import { CSBMessage } from '@cvte/cir-csb-common-view'; 需要使用到消息通信模块完成事件触发和消息通信
MemoryCache import { MemoryCache } from '@cvte/cir-csb-common-view'; 需要使用到内存缓存操作管理
LocalCache import { LocalCache } from '@cvte/cir-csb-common-view'; 需要使用到本地缓存操作管理

列表视图

事件属性

属性名称 使用方式 应用场景
onCreate CSBList的Props参数传入 需要覆盖默认的列表创建按钮事件
onEdit CSBList的Props参数传入 需要覆盖默认的列表编辑按钮事件
onDelete CSBList的Props参数传入 需要覆盖默认的列表删除按钮事件

事件监听

使用示例:

import { CSBMessage, viewEventListeners } from '@cvte/cir-csb-common-view'
const apiName='当前页面编码'
const classId='当前表单分类id'
CSBMessage.on(`${classId}${apiName}${viewEventListeners.onListCreate}`, (resp)=>{
  const { data } = resp;
  console.log(data)
});
事件名称 使用方式 应用场景
onListCreate CSBList的事件监听 需要覆盖默认的列表创建按钮事件
onListEdit CSBList的事件监听 需要覆盖默认的列表编辑按钮事件
onListDelete CSBList的事件监听 需要覆盖默认的列表删除按钮事件

事件触发

使用示例:

import { CSBMessage, viewEventLaunchers } from '@cvte/cir-csb-common-view'
const apiName='当前页面编码'
const classId='当前表单分类id'
CSBMessage.emit(`${classId}${apiName}${viewEventLaunchers.ListRefresh}`, { data: null });
事件名称 使用方式 应用场景
ListRefresh CSBList的事件触发 调用列表的刷新事件

详情视图

事件属性

属性名称 使用方式 应用场景
inject CSBDetail的Props参数传入 需要手动注入自定义组件或自定义事件到详情页中使用
onInit CSBDetail的Props参数传入 需要处理详情页初始化生命周期
onLoadData CSBDetail的Props参数传入 需要处理详情页加载数据生命周期
onInitData CSBDetail的Props参数传入 需要处理详情页数据初始化生命周期
onRenderStart CSBDetail的Props参数传入 需要处理详情页渲染器初始化生命周期
onRenderEnd CSBDetail的Props参数传入 需要处理详情页渲染器销毁生命周期
onDestroy CSBDetail的Props参数传入 需要处理详情页销毁生命周期
onError CSBDetail的Props参数传入 需要处理详情页的报错
作者:王浩彬  创建时间:2021-12-08 09:54
最后编辑:袁子涵  更新时间:2022-11-10 10:58