背景
目前针对业务端渲染模版接入需要求业务端系统基于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
增加如下表配置键值对
各业务域进行域名,下表域名为各业务域示例信息,配置地址时请与本业务域后端同学确认!!!
业务域 | 对象引擎APIlcp.core |
低代码APIlcp.hub |
附件服务APIlcp.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.本地模板模块开发
- 动态列表界面List.tsx
// 详情视图
import { CSBList } from '@cvte/cir-csb-common-view';
export default CSBList;
- 详情界面模板Detail.tsx
// 详情视图
import { CSBDetail } from '@cvte/cir-csb-common-view';
export default CSBDetail;
2.动态菜单配置
请先完成动态菜单的升级改造:【1_菜单接入手册】
在
系统管理
下的页面配置
中,新建一个动态模块;选项
须选择动态组件
;动态组件路径
需填写本地代码所在app
目录中的路径;路由参数
在使用业务端渲染模版的场景下需要必填的参数如下:
参数名 | 说明 |
---|---|
appId | 应用ID |
tenantId | 租户ID |
classId | 表单分类ID |
name | 表单分类名称 |
apiName | 表单分类编码 |
标签标志
用于当打开方式
为多页签
的场景下,跳转页面时需要从当前路由参数
中获取的标志键名;
- 配置列表页面资源和菜单
- 配置详情页面资源和菜单
静态模块接入
在原生开发的地方引入低代码列表、或低代码详情表单
// 列表视图
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 当前传入的表单分类idtarget.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
最后编辑:袁子涵 更新时间:2022-11-10 10:58