ECS 云底座前端相关仓库
- node >= 16
# nvm use 16 # important!
npm i # 安装依赖
npm run dev # 启动开发模式,可在“页面控制台”中查看输出
npm run build --lib # 打包sdk,更多配置参考 vite.config
- 构造参数
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
authorization | String | 是 | - | 用户中心权限标识,如(accessToken) |
consume | Array<String> |
是 | - | 消费的组件 |
produce | Object<{ComponentCode : ComponentVersion}> |
是 | - | 生产的组件及对应版本 |
consumeProductCodes | Array<String> |
否 | - | 消费的组件中数据提供方的产品编码,针对多个产品写入数据到同一个组件中时,精准筛选对应数据 |
getInitialData | Function | 否 | - | 对接 EcsHubPanel 时必须,需返回 Panel 所需初始数据,更多参考 EcsHubPanel
|
getCurrentAllProduceComponentsFullData | Function | 否 | - | 对接 EcsHubPanel 时必须,需返回当前生产的所有数据,参数格式如方法commitAndPush 参数一致 |
onEventCallback | Function | 否 | - | 对接 EcsHubPanel 时必须,Panel 对应操作的事件回调通知 |
enableLog | Boolean | 否 | true | 是否启用运行日志 |
env | String | 否 | production | 可选环境 production、test |
- ECSHubPanel 所需方法
Panel 需要用户提供的初始信息,需要用户实现该方法
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
repoCode | String | 是 | - | 仓库 ID |
branchCode | String | 否 | master | 分支名称 |
consume | Array<{Code, Version, Products}> |
是 | - | 消费的组件,指定合约组件编码,版本,产品编码(Products 是个数组) |
produce | Object<{ComponentCode : ComponentVersion}> |
是 | - | 生产的组件及对应版本 ,与 ECS 构造参数一致 |
productCode | String | 是 | '' | 产品编码 |
author | String | 否 | - | 可读的用户唯一标识,如(zhangsan) |
commitId | String | 否 | "" | 当前仓库最新的 commitId,新仓库默认为空字符串 |
originHeadCommitId | String | 否 | "" | 当前仓库与远程同步的 commitId,新仓库默认为空字符串,端软件需要传递 |
authorization | String | 否 | - | 用户中心权限标识,如(accessToken),如未登录,则 Panel 会先登录 |
Panel 获取当前所有产品及组件的全量数据,即调用
commitAndPush
时需要传递的数据,需要用户实现该方法
Panel 操作流程中的回调通知方法,如用户登录、提交、更新等操作,需要用户实现该方法;
- 操作(operation)事件列表如下:
事件字段 | 描述 | 返回参数(payload) |
---|---|---|
APP_MOUNTED | 应用挂载 | - |
PANEL_VISIBILITY_CHANGE | 可见性变更 | { visible } |
REPO_CHANGE | 仓库变更 | { repoCode, branchCode } |
SIGNIN | 登录 | { username, authorization } |
COMMIT_PUSH | 提交数据 | { commit } |
UPDATE_CONSUME_COMPONENTS | 更新消费组件 | { commit } |
- 状态(status)列表如下:
字段 | 描述 |
---|---|
SUCCESS | 成功 |
FAILED | 失败 |
必须“最先”调用,返回一个 Promise 对象
fetchCommits<repoCode, branchCode, resolveAll>
: Promise<Array<{id, author, commit_time, desc, seq_num,...}>>
获取所有提交记录
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
repoCode | String | 是 | - | 仓库 ID |
branchCode | String | 否 | master | 分支名称 |
resolveAll | Boolean | 否 | true | 默认返回所有记录,如果 false 则只返回最新记录 |
获取仓库指定
commitId
的快照数据,如不传递则表示获取最新的快照,返回一个 Promise 对象
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
repoCode | String | 是 | - | 仓库 ID |
commitId | String | 否 | - | 提交记录 ID |
branchCode | String | 否 | master | 分支名称 |
获取组件数据,返回一个 Promise 对象,成功并返回数据对象数组
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
componentCode | String | 是 | - | 组件编码 |
productCodes | Array<String> |
否 | [] | 产品编码,查询对应产品数据 |
commitAndPush<produceData, returnSuccessWithoutChanges>
: Promise<{id, author, commit_time, desc, seq_num,...}>
提交数据到云端,返回一个 Promise 对象,返回值为最新的
commit
记录
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
produceData | Object | 是 | - | 当前生成的所有组件数据 |
returnSuccessWithoutChanges | Boolean | 否 | false | 默认返回错误,如果数据没有变化;true 时,无变化则无返回值 |
- produceData 中字段如下
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
repoCode | String | 是 | - | 仓库 ID |
author | String | 是 | - | 可读的用户唯一标识,如(zhangsan) |
produceComponents | Array<ComponentDataItem> |
是 | - | 组件数据数组 |
productCode | String | 是 | '' | 产品编码 |
desc | String | 否 | '' | 提交信息描述 |
branchCode | String | 否 | master | 分支名称 |
ComponentDataItem
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
componentCode | String | 是 | - | 组件编码,如(FC_MESH) |
fullData | Array<{ entityId: String, eeid: String, entityName: String, entityType: String, content: Object }> |
是 | - | 组件数据,entityId 为产品范围内实体 ID 也叫 peid(project entity id) ,eeid 为 ECS 实体唯一 ID,entityName 为实体名称,entityType 聚合类型,如(ET_LOT) ,content 为组件内容,且必填 |
注意: content 内部的字段顺序需与特性组件定义保持一致,否则会影响 MD5 校验
通过 SQL 查询数据,表名称为组件编码(componentCode),如
FC_MESH
,SQL 规范参考duckDB
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
sql | String | 是 | - | 查询语句 |
更新登录令牌
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
authorization | String | 是 | - | 用户中心权限标识,如(accessToken) |
清除当前数据
新增全局对象
window.__ECS_HUB_BRIDGE_CLIENT__
,可订阅、发布、取消订阅
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
publish | (message)=> void(0) |
- | - | WebSDK 发布消息方法 |
subscribe | (callbackFunction)=> void(0) |
- | - | WebSDK 订阅消息方法 |
unsubscribe | (subscribeFnId)=> void(0) |
- | - | WebSDK 取消订阅方法 |
新增全局方法
window.__ECS_HUB_PUBLISH_MESSAGE__
,发布消息
参数 | 类型 | 是否必须 | 默认 | 描述 |
---|---|---|---|---|
message | Object<{operation, status, payload, message> |
是 | - | WebSDK 发布消息方法 |
参数细节如下:
- operation
可选类型 | 描述 |
---|---|
DATA_INT | 初始化数据 |
RECEIVING_DATA | 开始接收数据 |
RECEIVING_DATA_FINISHED | 接收数据完成 |
RECEIVING_DATA_FAILED | 接收数据失败 |
PROCESSING_DATA2RECEIVED | 处理接收数据 |
PROCESS_DATA2RECEIVED_FINISHED | 处理接收数据完成 |
PROCESS_DATA2RECEIVED_FAILED | 处理接收数据失败 |
PROCESSING_DATA2SEND | 处理发送数据 |
PROCESS_DATA2SEND_FINISHED | 处理发送数据完成 |
PROCESS_DATA2SEND_FAILED | 处理发送数据失败 |
SENDDING_DATA | 发送数据 |
SENDDING_DATA_FINISHED | 发送数据完成 |
SENDDING_DATA_FAILED | 发送数据失败 |
- status
可选类型 | 描述 |
---|---|
success | 成功 |
failed | 失败 |
- payload
类型 | 描述 |
---|---|
Object | 约定参数键值对 |
- message
类型 | 描述 |
---|---|
Sting | 错误信息 |
import ECS from "@glodon-ecs/web-sdk";
const ecsClient = new ECS({
authorization: 'cn-ab11f319-5469-40fd-aae9-01be5791cfa4',
consume: [
"FC_MESH",
],
produce: { FC_GEOMETRY: "1" },
...
// 参考如下 Panel示例中方法实现
onEventCallback,
getInitialData,
getCurrentAllProduceComponentsFullData,
});
await ecsClient.init();
const author = "zhangsan";
const repoName = "test-0711-01";
const creatorId = "6947168324226507171";
const repoCode = `${creatorId}_${repoName}`;
const productCode = 'gnc';
...
const commits = await ecsClient.fetchCommits(repoCode);
await ecsClient.fetchComponentSnapshots(repoCode);
const FC_MESH = await ecsClient.getComponentData("FC_MESH");
...
const GEOMETRY_DATA = [...];
const componentDataItem = {
componentCode: "FC_GEOMETRY",
fullData: GEOMETRY_DATA.map((data) => {
const {
ident: { id, eeid, entity_name: entityName, entityType },
content,
} = data;
return { entityId: id, eeid, entityName, content, entityType };
}),
};
const produceComponents = [componentDataItem];
const newCommitData = await ecsClient.commitAndPush({ repoCode, author, produceComponents, productCode });
...
// 通过 SQL 查询数据
const data = await ecsClient.query( "select ident from FC_MESH" );
Bridge 相关示例
// 订阅
const randomFnId = window.__ECS_HUB_BRIDGE_CLIENT__.subscribe((msg)=>{
const {operation, status, payload, message} = msg;
...
})
// 发布
window.__ECS_HUB_PUBLISH_MESSAGE__({
operation: "SENDDING_DATA",
status: "success",
payload: {
stage: 2,
percent: 10,
},
});
// 取消
window.__ECS_HUB_BRIDGE_CLIENT__.unsubscribe(randomFnId)
Panel 相关示例
import ECSHubPanel from "@glodon-ecs/web-panel-sdk";
const author = "zhangsan";
const repoName = "test-0711-01";
const creatorId = "6947168324226507171";
const repoCode = `${creatorId}_${repoName}`;
const branchCode = "master";
const commitId = "ab11f319-5469-40fd-aae9-01be5791cf";
const authorization = "cn-ab11f319-5469-40fd-aae9-01be5791cfa4";
const productCode = "gnc";
new ECSHubPanel({
el: "#ecs-hub-panel",
ecsClient: ecsClient,
});
const getInitialData = () => {
return {
repoCode,
author,
branchCode,
commitId,
authorization,
consume: [
{
Code: "FC_LOT_PROPERTY",
Version: 1,
Products:['gns']
}
],
produce: { FC_LOT_PROPERTY: "1" },
productCode,
};
};
// 同 commitAndPush 方法数据组织方式
const getCurrentAllProduceComponentsFullData = ()=>{
const GEOMETRY_DATA = [...];
const componentDataItem = {
componentCode: "FC_GEOMETRY",
fullData: GEOMETRY_DATA.map((data) => {
const {
ident: { id, eeid, entity_name: entityName, entityType },
content,
} = data;
return { entityId: id, eeid, entityName, content, entityType };
}),
};
const produceComponents = [componentDataItem];
return { repoCode, author, produceComponents, productCode }
}
const onEventCallback = ({ operation, status, payload }) => {
// 根据事件类型处理不同业务场景
};
由于 S3 对于 URL 上特殊符号签名的校验规则与华为不匹配,如等号(=)导致签名失败,因此文件修改
@duckdb/duckdb-wasm/dist/duckdb-browser-eh.worker.js
;去除对params.url
的 uriEncode
export function createS3Headers(params: S3Params, payloadParams : S3PayloadParams | null = null) : Map<string, string> {
...
- let canonicalRequest = params.method + "\n" + uriEncode(params.url) + "\n" + params.query;
+ let canonicalRequest = params.method + "\n" + params.url + "\n" + params.query;
...
}
- 混淆代码
38390 let o = t.method + "\n" + t.url + "\n" + t.query;
修改
query
参数的签名编码
export function getS3Params (config : S3Config | undefined, url: string, method : string) : S3Params {
...
+ path = path.split('?');
return {
- url: path,
+ url: path[0],
- query: "",
+ query: path[1] || "",
...
}
修复
xhr.getResponseHeader('Content-Range')
报错
- const contentRange = xhr.getResponseHeader('Content-Range')?.split('/')[1];
+ const contentRange = undefined;