七 业务绑定
title: ecode文档 - 七、业务绑定
created: 2026-04-19
updated: 2026-04-19
type: reference
tags: [oa, ecode, weaver, frontend]
related: [oa/ecode-guide.md]
source: https://e-cloudstore.com/doc.html
ecode, weaver, frontend]
related: [oa/ecode-guide.md]
source: https://e-cloudstore.com/doc.html
---#### 七、业务绑定
ecode除了可以在针对所有界面动态复写和动态注入组件之外,我们还提供了针对特殊业务绑定的sdk
ecode除了可以在针对所有界面动态复写和动态注入组件之外,我们还提供了针对特殊业务绑定的sdk
1、PC门户主题注册
ecodeSDK.rewritePortalThemeQueue.push(option)
ecology版本要求:1906及1906+
ecodeSDK.rewritePortalThemeQueue.push(option)
ecology版本要求:1906及1906+
ecode的主题开发方案,解决传统主题开发的几大问题:主题通常都需要二次修改,用了ecode只需复制一下即可开始二次修改,不用安装配置脚手架,甚至一些小修改项目人员即可处理;主题的复用问题,使用ecode开发的主题完全无侵入,可拔插方便的在不同环境之间共享;解决以往难以让客户维护主题源码的问题,主题交付客户之后,可让客户自行维护;此方案开发进行标准页面跳转,直接支持single page模式,可以用react-router进行路由快速切换
ecode的主题开发方案,解决传统主题开发的几大问题:主题通常都需要二次修改,用了ecode只需复制一下即可开始二次修改,不用安装配置脚手架,甚至一些小修改项目人员即可处理;主题的复用问题,使用ecode开发的主题完全无侵入,可拔插方便的在不同环境之间共享;解决以往难以让客户维护主题源码的问题,主题交付客户之后,可让客户自行维护;此方案开发进行标准页面跳转,直接支持single page模式,可以用react-router进行路由快速切换
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无> params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.id |
主题ID |
string |
主题定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.id
主题ID
string
主题定义完成后生成的ID
props
主题父组件参数
object
props主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.id
主题ID
string
主题定义完成后生成的ID
options.id主题IDstring主题定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了主题即可关联到标准
//注册和绑定门户主题前端实现接口
ecodeSDK.rewritePortalThemeQueue.push({
fn:(params)=>{
const {props,options} = params;
//异步加载模块${appId}下的子模块NewTheme
if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {
const acParams = {
appId:'${appId}',
name:'NewTheme', //模块名称
props:props,
isPage:false, //是否是路由页面
noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
}
return ecodeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'这是一个主题界面的参考案例'
});
index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发
register.js:需要前置加载,注册了主题即可关联到标准
题界面的参考案例'
});
```
index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发
register.js:需要前置加载,注册了主题即可关联到标准```javascript
//注册和绑定门户主题前端实现接口
ecodeSDK.rewritePortalThemeQueue.push({
fn:(params)=>{
const {props,options} = params;
//异步加载模块${appId}下的子模块NewTheme
if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {
const acParams = {
appId:'${appId}',
name:'NewTheme', //模块名称
props:props,
isPage:false, //是否是路由页面
noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
}
return ecodeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'这是一个主题界面的参考案例'
});
codeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'这是一个主题界面的参考案例'
});
```1. `//注册和绑定门户主题前端实现接口`
2. `ecodeSDK.rewritePortalThemeQueue.push({`
3. ` fn:(params)=>{`
4. ` const {props,options} = params;`
5. ` //异步加载模块${appId}下的子模块NewTheme`
6. ` if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {`
7. ` const acParams = {`
8. ` appId:'${appId}',`
9. ` name:'NewTheme', //模块名称`
10. ` props:props,`
11. ` isPage:false, //是否是路由页面`
12. ` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`
13. ` }`
14. ` return ecodeSDK.getAsyncCom(acParams);`
15. ` }`
16. ` return null;`
17. ` },`
18. ` order:1,`
19. ` desc:'这是一个主题界面的参考案例'`
20. `});`
`//注册和绑定门户主题前端实现接口``//注册和绑定门户主题前端实现接口`//注册和绑定门户主题前端实现接口`ecodeSDK.rewritePortalThemeQueue.push({``ecodeSDK.rewritePortalThemeQueue.push({`ecodeSDK.rewritePortalThemeQueue.push({` fn:(params)=>{`` fn:(params)=>{` fn:(params)=>{` const {props,options} = params;`` const {props,options} = params;` const {props,options} = params;` //异步加载模块${appId}下的子模块NewTheme`` //异步加载模块${appId}下的子模块NewTheme` //异步加载模块${appId}下的子模块NewTheme` if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {`` if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {` if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {` const acParams = {`` const acParams = {` const acParams = {` appId:'${appId}',`` appId:'${appId}',` appId:'${appId}',` name:'NewTheme', //模块名称`` name:'NewTheme', //模块名称` name:'NewTheme', //模块名称`
appId}',` name:'NewTheme', //模块名称`` name:'NewTheme', //模块名称` name:'NewTheme', //模块名称` appId}',` name:'NewTheme', //模块名称`` name:'NewTheme', //模块名称` name:'NewTheme', //模块名称` props:props,`` props:props,` props:props,` isPage:false, //是否是路由页面`` isPage:false, //是否是路由页面` isPage:false, //是否是路由页面` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` }`` }` }` return ecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` }`` }` }` return null;`` return null;` return null;` },`` },` },` order:1,`` order:1,` order:1,` desc:'这是一个主题界面的参考案例'`` desc:'这是一个主题界面的参考案例'` desc:'这是一个主题界面的参考案例'`});``});`});
order:1,` order:1,` desc:'这是一个主题界面的参考案例'`` desc:'这是一个主题界面的参考案例'` desc:'这是一个主题界面的参考案例'`});``});`});index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发
```javascript
const Top = ecodeSDK.imp(Top);
const {WeaPopoverHrm} = ecCom;
class NewTheme extends React.Component {
render() {
return (
<div className="newtheme">
{!window.pointerXY && (<WeaPopoverHrm />)}
<Top {...this.props} />
<div className='newtheme-container'>{this.props.children}</div>
</div>
)
}
}
//发布模块NewTheme,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','NewTheme',NewTheme);
v>
)
}
}
//发布模块NewTheme,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','NewTheme',NewTheme);
`1. `const Top = ecodeSDK.imp(Top);`
2.
3. const {WeaPopoverHrm} = ecCom;
4. 5. `class NewTheme extends React.Component {`
6. ` render() {`
7. ` return (`
8. ` <div className="newtheme">`
9. ` {!window.pointerXY && (<WeaPopoverHrm />)}`
10. ` <Top {...this.props} />`
11. ` <div className='newtheme-container'>{this.props.children}</div>`
12. ` </div>`
13. ` )`
14. ` }`
15. `}`
16.
17. //发布模块NewTheme,作为模块${appId}的子模块
18. ecodeSDK.setCom('${appId}','NewTheme',NewTheme);
const Top = ecodeSDK.imp(Top);``const Top = ecodeSDK.imp(Top);const Top = ecodeSDK.imp(Top);const {WeaPopoverHrm} = ecCom;``const {WeaPopoverHrm} = ecCom;`const {WeaPopoverHrm} = ecCom;class NewTheme extends React.Component {class NewTheme extends React.Component {`class NewTheme extends React.Component {` render() { render() {render() { return (return (` return (` <div className="newtheme">
<div className="newtheme"> {!window.pointerXY && (
)}
{!window.pointerXY && (<WeaPopoverHrm />)}` {!window.pointerXY && (<WeaPopoverHrm />)}` <Top {...this.props} /> <Top {...this.props} /> {this.props.children}
<div className='newtheme-container'>{this.props.children}</div>` <div className='newtheme-container'>{this.props.children}</div>` </div> </div>
{this.props.children}
</div>`` </div>
`
{this.props.children}
</div>`` </div>
)`` ) )}`` } }}``}}```//发布模块NewTheme,作为模块${appId}的子模块//发布模块NewTheme,作为模块${appId}的子模块//发布模块NewTheme,作为模块${appId}的子模块ecodeSDK.setCom('${appId}','NewTheme',NewTheme);ecodeSDK.setCom('${appId}','NewTheme',NewTheme);`ecodeSDK.setCom('${appId}','NewTheme',NewTheme);
;ecodeSDK.setCom('${appId}','NewTheme',NewTheme);`ecodeSDK.setCom('${appId}','NewTheme',NewTheme);###### (3)如何配置主题
到后台门户引擎,特色门户中新建主题
到后台门户引擎,特色门户中新建主题

新建成功后,配置好主题共享权限,然后选择自定义模式,可以获取到主题id
新建成功后,配置好主题共享权限,然后选择自定义模式,可以获取到主题id

在主题注册代码中关联这个id
在主题注册代码中关联这个id


配置完后即可自由开发主题
配置完后即可自由开发主题

2、PC门户元素注册
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:1906及1906+
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:1906及1906+
此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改
此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
arams 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.ebaseid |
元素ID |
string |
元素定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
object
props主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
options.ebaseid元素IDstring元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了元素即可关联到标准
register.js:需要前置加载,注册了元素即可关联到标准
//注册和绑定门户元素前端实现接口
ecodeSDK.rewritePortalCusEleQueue.push({
fn:(params)=>{
// console.log('params:',params);
const {props,options} = params;
if(options.ebaseid==='Custom_1562992730957') {
const acParams = {
appId:'${appId}',
name:'CusEle', //模块名称
params, //参数
isPage:false, //是否是路由页面
noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
}
//异步加载模块${appId}下的子模块CusEle
return ecodeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'这是一个元素界面的参考案例'
});
codeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'这是一个元素界面的参考案例'
});
`1. `//注册和绑定门户元素前端实现接口`
2. `ecodeSDK.rewritePortalCusEleQueue.push({`
3. ` fn:(params)=>{`
4. ` // console.log('params:',params);`
5. ` const {props,options} = params;`
6. ` if(options.ebaseid==='Custom_1562992730957') {`
7. ` const acParams = {`
8. ` appId:'${appId}',`
9. ` name:'CusEle', //模块名称`
10. ` params, //参数`
11. ` isPage:false, //是否是路由页面`
12. ` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`
13. ` }`
14. ` //异步加载模块${appId}下的子模块CusEle`
15. ` return ecodeSDK.getAsyncCom(acParams);`
16. ` }`
17. ` return null;`
18. ` },`
19. ` order:1,`
20. ` desc:'这是一个元素界面的参考案例'`
21. `});`
`//注册和绑定门户元素前端实现接口//注册和绑定门户元素前端实现接口//注册和绑定门户元素前端实现接口ecodeSDK.rewritePortalCusEleQueue.push({ecodeSDK.rewritePortalCusEleQueue.push({`ecodeSDK.rewritePortalCusEleQueue.push({` fn:(params)=>{ fn:(params)=>{fn:(params)=>{ // console.log('params:',params);// console.log('params:',params);` // console.log('params:',params);` const {props,options} = params; const {props,options} = params;const {props,options} = params; if(options.ebaseid==='Custom_1562992730957') {if(options.ebaseid==='Custom_1562992730957') {` if(options.ebaseid==='Custom_1562992730957') {` const acParams = { const acParams = {const acParams = { appId:'${appId}',appId:'${appId}',` appId:'${appId}',` name:'CusEle', //模块名称 name:'CusEle', //模块名称name:'CusEle', //模块名称 param
',name:'CusEle', //模块名称`` name:'CusEle', //模块名称 name:'CusEle', //模块名称param', name:'CusEle', //模块名称name:'CusEle', //模块名称` name:'CusEle', //模块名称` params, //参数 params, //参数params, //参数 isPage:false, //是否是路由页面isPage:false, //是否是路由页面` isPage:false, //是否是路由页面` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 }}` }` //异步加载模块${appId}下的子模块CusEle //异步加载模块${appId}下的子模块CusEle//异步加载模块${appId}下的子模块CusEle return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` }, },}, order:1,order:1,` order:1,` desc:'这是一个元素界面的参考案例' desc:'这是一个元素界面的参考案例'desc:'这是一个元素界面的参考案例'});});`});
order:1,` order:1,` desc:'这是一个元素界面的参考案例' desc:'这是一个元素界面的参考案例'desc:'这是一个元素界面的参考案例'});`});});> index.js:不需要前置加载,元素也可以用mobx实现
index.js:不需要前置加载,元素也可以用mobx实现
const {Button} = antd;
class CusEle extends React.Component {
render() {
// console.log(this.props);
return (
<div style={{padding:10}}>
<Button>我是一个动态加载的元素界面</Button>
</div>
)
}
}
//发布模块CusEle,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','CusEle',CusEle);
)
}
}
//发布模块CusEle,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','CusEle',CusEle);
`1. `const {Button} = antd;`
2.
3. class CusEle extends React.Component {
4. render() {
5. // console.log(this.props);
6. return (
7. <div style={{padding:10}}>
8. <Button>我是一个动态加载的元素界面</Button>
9. </div>
10. )
11. }
12. }
13. 14. `//发布模块CusEle,作为模块${appId}的子模块`
15. `ecodeSDK.setCom('${appId}','CusEle',CusEle);`
`const {Button} = antd;const {Button} = antd;const {Button} = antd;`````class CusEle extends React.Component {``class CusEle extends React.Component {class CusEle extends React.Component {render() {`` render() { render() {// console.log(this.props);`` // console.log(this.props); // console.log(this.props);return (`` return ( return (<div style={{padding:10}}>`` <div style={{padding:10}}>
<Button>我是一个动态加载的元素界面</Button>`` <Button>我是一个动态加载的元素界面</Button> </div>`` </div>
)`` ) )}`` } }}``}}```//发布模块CusEle,作为模块${appId}的子模块//发布模块CusEle,作为模块${appId}的子模块//发布模块CusEle,作为模块${appId}的子模块ecodeSDK.setCom('${appId}','CusEle',CusEle);`ecodeSDK.setCom('${appId}','CusEle',CusEle);ecodeSDK.setCom('${appId}','CusEle',CusEle);
(3)如何配置元素
在门户引擎中建立元素,获取主键ID
在门户引擎中建立元素,获取主键ID


在代码中关联这个ID
在代码中关联这个ID
000-big.png)

在代码中关联这个ID
在代码中关联这个ID
(4)如何配置自定义内容来源
ecology版本要求:2110及2110+
ecology版本要求:2110及2110+
自定义元素设置默认有个内容来源设置,可以配置当前元素内容来源参数,参数格式可以根据自定义元素实际需求设置,比如获取某个门户下文档列表元素的数据时,可以配置为:
{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}
注意:JSON格式的key和value一定要用英文双引号。
自定义元素设置默认有个内容来源设置,可以配置当前元素内容来源参数,参数格式可以根据自定义元素实际需求设置,比如获取某个门户下文档列表元素的数据时,可以配置为:
{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}
{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}
{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}``{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}
注意:JSON格式的key和value一定要用英文双引号。


内容来源参数可以在自定义元素组件中通过属性获取:
componentDidMount() {
const { datasourceconfig = '{}' } = this.props.params.options.config.item;
const datasourceconfigobj = JSON.parse(datasourceconfig);
const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;
se(datasourceconfig);
const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {
const data = result.data || {};
this.setState({ data });
})
}
then(result => {
const data = result.data || {};
this.setState({ data });
})
}
`1. ` componentDidMount() {`
2. ` const { datasourceconfig = '{}' } = this.props.params.options.config.item;`
3. ` const datasourceconfigobj = JSON.parse(datasourceconfig);`
4. ` const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;`
5.
6. WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {
7. const data = result.data || {};
8. this.setState({ data });
9. })
10. }
componentDidMount() {`` componentDidMount() { componentDidMount() {const { datasourceconfig = '{}' } = this.props.params.options.config.item;`` const { datasourceconfig = '{}' } = this.props.params.options.config.item; const { datasourceconfig = '{}' } = this.props.params.options.config.item;const datasourceconfigobj = JSON.parse(datasourceconfig);`` const datasourceconfigobj = JSON.parse(datasourceconfig); const datasourceconfigobj = JSON.parse(datasourceconfig);const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;`` const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj; const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;``` WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {WeaTools.callApi('/api/porta
POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { WeaTools.callApi('/api/portaPOST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { const data = result.data || {};const data = result.data || {};` const data = result.data || {};` this.setState({ data }); this.setState({ data });this.setState({ data }); })})` })` } }}
({ data });`` this.setState({ data }); this.setState({ data });})`` }) })}`` } }###### (5)自定义设置
register.js:需要前置加载,注册了元素即可关联到标准
register.js:需要前置加载,注册了元素即可关联到标准
ecodeSDK.rewritePortalCusEleSettingQueue.push({
fn: (params) => {
const { props = {}, options = {} } = params;
if (options.ebaseid === 'Custom_1562992730957') {
const acParams = {
appId: '${appId}',
name: 'Setting',
params,
isPage: false,
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
`1. `ecodeSDK.rewritePortalCusEleSettingQueue.push({`
2. ` fn: (params) => {`
3. ` const { props = {}, options = {} } = params;`
4. ` if (options.ebaseid === 'Custom_1562992730957') {`
5. ` const acParams = {`
6. ` appId: '${appId}',`
7. ` name: 'Setting',`
8. ` params,`
9. ` isPage: false,`
10. ` noCss: true`
11. ` };`
12. ` return ecodeSDK.getAsyncCom(acParams);`
13. ` }`
14. ` return null;`
15. ` }`
16. `});`
`ecodeSDK.rewritePortalCusEleSettingQueue.push({ecodeSDK.rewritePortalCusEleSettingQueue.push({ecodeSDK.rewritePortalCusEleSettingQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === 'Custom_1562992730957') {if (options.ebaseid === 'Custom_1562992730957') {` if (options.ebaseid === 'Custom_1562992730957') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Setting', name: 'Setting',name: 'Setting', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAs
ecodeSDK.getAsyncCom(acParams); return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams); return ecodeSDK.getAsyncCom(acParams);}`` } }return null;`` return null; return null;}`` } }});``});});
acParams);}`` } }return null;`` return null; return null;}`` } }});``});});> Setting.js:自定义设置组件
Setting.js:自定义设置组件
const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;
class Setting extends React.Component {
constructor(props) {
super(props);
const { params = {} } = this.props;
const { options = {} } = params;
// 获取自定义设置组件实例,固定写法
options.getInstance && options.getInstance(this);
// 自定义设置组件中的相关数据
this.state = { ids: '', datas: [] };
}
componentWillMount() {
const { params = {} } = this.props;
const { options = {} } = params;
const { eid } = options;
// 自定义实现元素自定义设置数据的获取
WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {
const { data = {} } = result;
const { secobj = [] } = data;
this.setState({ datas: secobj });
});
}
render() {
// 实现自定义配置项
return (
<WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>
<WeaBrowser
title="请选择文档目录"
type="doccategory"
isSingle={false}
replaceDatas={this.state.datas}
onChange = {(ids, names, datas) => this.setState({ ids, datas })}
/>
</WeaFormItem>
);
}
= {(ids, names, datas) => this.setState({ ids, datas })}
/>
</WeaFormItem>
);
}// 设置保存方法名固定为onSave
onSave = () => {
const { params = {} } = this.props;
const { options = {} } = params;
const { eid } = options;
const { ids: secid } = this.state;
// 自定义实现元素自定义设置数据的保存接口
WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });
};
}
ecodeSDK.setCom('${appId}', 'Setting', Setting);
rch/setsecid', 'POST', { eid, secid });
};
}
ecodeSDK.setCom('${appId}', 'Setting', Setting);
`1. `const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;`
2.
3. class Setting extends React.Component {
4. constructor(props) {
5. super(props);
6. const { params = {} } = this.props;
7. const { options = {} } = params;
8. // 获取自定义设置组件实例,固定写法
9. options.getInstance && options.getInstance(this);
10. // 自定义设置组件中的相关数据
11. this.state = { ids: '', datas: [] };
12. }
13. 14. ` componentWillMount() {`
15. ` const { params = {} } = this.props;`
16. ` const { options = {} } = params;`
17. ` const { eid } = options;`
18. ` // 自定义实现元素自定义设置数据的获取`
19. ` WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {`
20. ` const { data = {} } = result;`
21. ` const { secobj = [] } = data;`
22. ` this.setState({ datas: secobj });`
23. ` });`
24. ` }`
25.
26. render() {
27. // 实现自定义配置项
28. return (
29. <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>
30. <WeaBrowser
31. title="请选择文档目录"
32. type="doccategory"
33. isSingle={false}
34. replaceDatas={this.state.datas}
35. onChange = {(ids, names, datas) => this.setState({ ids, datas })}
36. />
37. </WeaFormItem>
38. );
39. }
40. 41. ` // 设置保存方法名固定为onSave`
42. ` onSave = () => {`
43. ` const { params = {} } = this.props;`
44. ` const { options = {} } =
onSave = () => {`
43. ` const { params = {} } = this.props;`
44. ` const { options = {} } = onSave = () => {`
43. ` const { params = {} } = this.props;`
44. ` const { options = {} } = params;`
45. ` const { eid } = options;`
46. ` const { ids: secid } = this.state;`
47. ` // 自定义实现元素自定义设置数据的保存接口`
48. ` WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });`
49. ` };`
50. `}`
51.
52. ecodeSDK.setCom('${appId}', 'Setting', Setting);
const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;``const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;class Setting extends React.Component {``class Setting extends React.Component {`class Setting extends React.Component {` constructor(props) {`` constructor(props) {` constructor(props) {` super(props);`` super(props);` super(props);` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { options = {} } = params;`` const { options = {} } = params;` const { options = {} } = params;` // 获取自定义设置组件实例,固定写法`` // 获取自定义设置组件实例,固定写法` // 获取自定义设置组件实例,固定写法` options.getInstance && options.getInstance(this);`` options.getInstance && options.getInstance(this);` options.getInstance && options.getInstance(this);` // 自定义设置组件中的相关数据`` // 自定义设置组件中的相关数据` // 自定义设置组件中的相关数据` this.state = { ids: '', datas: [] };`` this.state = { ids: '', datas: [] };` this.state = { ids: '', datas: [] };` }`` }` } componentWillM
ate = { ids: '', datas: [] };this.state = { ids: '', datas: [] }; }}` }````` componentWillMate = { ids: '', datas: [] };` this.state = { ids: '', datas: [] };` } }}````` componentWillMount() {`` componentWillMount() { componentWillMount() {const { params = {} } = this.props;`` const { params = {} } = this.props; const { params = {} } = this.props;const { options = {} } = params;`` const { options = {} } = params; const { options = {} } = params;const { eid } = options;`` const { eid } = options; const { eid } = options;// 自定义实现元素自定义设置数据的获取`` // 自定义实现元素自定义设置数据的获取 // 自定义实现元素自定义设置数据的获取WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {`` WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => { WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {const { data = {} } = result;`` const { data = {} } = result; const { data = {} } = result;const { secobj = [] } = data;`` const { secobj = [] } = data; const { secobj = [] } = data;this.setState({ datas: secobj });`` this.setState({ datas: secobj }); this.setState({ datas: secobj });});`` }); });}`` } }render() {`` render() {` render() {` // 实现自定义配置项`` // 实现自定义配置项` // 实现自定义配置项` return (`` return (` return (` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <W
span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <W span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <WeaBrowser `` <WeaBrowser ` <WeaBrowser ` title="请选择文档目录"`` title="请选择文档目录"` title="请选择文档目录"` type="doccategory"`` type="doccategory"` type="doccategory"` isSingle={false}`` isSingle={false}` isSingle={false}` replaceDatas={this.state.datas}`` replaceDatas={this.state.datas}` replaceDatas={this.state.datas}` onChange = {(ids, names, datas) => this.setState({ ids, datas })}`` onChange = {(ids, names, datas) => this.setState({ ids, datas })}` onChange = {(ids, names, datas) => this.setState({ ids, datas })}` />`` />` />` </WeaFormItem>`` </WeaFormItem>` </WeaFormItem>` );`` );` );` }`` }` } // 设置保存方法名固定为onSave// 设置保存方法名固定为onSave` // 设置保存方法名固定为onSave` onSave = () => { onSave = () => {onSave = () => { const { params = {} } = this.props;const { params = {} } = this.props;` const { params = {} } = this.props;` const { options = {} } = params; const { options = {} } = params;const { options = {} } = params; const { eid } = options;const { eid } = options;` const { eid } = options;` const { ids: secid } = this.state; const { ids: secid } = this.state;const { ids: secid } = this.state; // 自定义实现元素自定义设置数据的保存接口// 自定义
ds: secid } = this.state;` const { ids: secid } = this.state;` // 自定义实现元素自定义设置数据的保存接口 // 自定义ds: secid } = this.state;const { ids: secid } = this.state; // 自定义实现元素自定义设置数据的保存接口// 自定义实现元素自定义设置数据的保存接口` // 自定义实现元素自定义设置数据的保存接口` WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid }); WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid }); };};` };`}}}`````ecodeSDK.setCom('${appId}', 'Setting', Setting);``ecodeSDK.setCom('${appId}', 'Setting', Setting);ecodeSDK.setCom('${appId}', 'Setting', Setting);
;`ecodeSDK.setCom('${appId}', 'Setting', Setting);ecodeSDK.setCom('${appId}', 'Setting', Setting);##### 3、移动门户元素注册
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:1912及1912+
移动门户元素注册的钩子函数与pc端一致
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:1912及1912+
移动门户元素注册的钩子函数与pc端一致
此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改
此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.ebaseid |
元素ID |
string |
元素定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
object
题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
objectprops主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
options.ebaseid元素IDstring元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了元素即可关联到标准
register.js:需要前置加载,注册了元素即可关联到标准
ecodeSDK.rewritePortalCusEleQueue.push({
fn: (params) => {
const { props } = params;
// client = mobile:移动端门户标记
// ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型
if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {
const acParams = {
appId: '${appId}',
name: 'View',
params,
isPage: false,
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
1. `ecodeSDK.rewritePortalCusEleQueue.push({`
2. ` fn: (params) => {`
3. ` const { props } = params;`
4. ` // client = mobile:移动端门户标记`
5. ` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型`
6. ` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {`
7. ` const acParams = {`
8. ` appId: '${appId}',`
9. ` name: 'View',`
10. ` params,`
11. ` isPage: false,`
12. ` noCss: true`
13. ` };`
14. ` return ecodeSDK.getAsyncCom(acParams);`
15. ` }`
16. ` return null;`
17. ` }`
18. `});`
`ecodeSDK.rewritePortalCusEleQueue.push({``ecodeSDK.rewritePortalCusEleQueue.push({`ecodeSDK.rewritePortalCusEleQueue.push({` fn: (params) => {`` fn: (params) => {` fn: (params) => {` const { props } = params;`` const { props } = params;` const { props } = params;` // client = mobile:移动端门户标记`` // client = mobile:移动端门户标记` // client = mobile:移动端门户标记` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型`` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {`` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {` const acParams = {`` const acParams = {` const acParams = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'View
s = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'Views = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'View',`` name: 'View',` name: 'View',` params,`` params,` params,` isPage: false,`` isPage: false,` isPage: false,` noCss: true`` noCss: true` noCss: true` };`` };` };` return ecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`});
acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`});javascript
class View extends React.Component {
render() {
const data = [
{
id: 1,
name: '我要请假',
icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png',
url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'
},
{
id: 2,
name: '我要留言',
icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png',
url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'
},
{
id: 3,
name: '我要出差',
icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png',
url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'
},
{
id: 4,
name: '产品建议',
icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png',
url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'
},
];
return (
<div className="portal-m-e-quick-entry">
{
data.map((item, index) => {
return (
<div key={index} onClick={() => this.onOpen(item.url)}>
<img src={item.icon} />
<div><span>{item.name}</span></div>
</div>
);
})
}
</div>
);
}
ame}
);
})
}
);
}onOpen = (url) => {
if (window.em && window.em.checkJsApi('openLink')) {
window.em.openLink({
sysId: window.localStorage.emobile_ec_id,
url: url,
openType: 2
});
} else {
window.open(url);
}
};
}
ecodeSDK.setCom('${appId}', 'View', View);
);
} else {
window.open(url);
}
};
}
ecodeSDK.setCom('${appId}', 'View', View);
```1. `class View extends React.Component {`
2. ` render() {`
3. ` const data = [`
4. ` {`
5. ` id: 1, `
6. ` name: '我要请假', `
7. ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', `
8. ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`
9. ` },`
10. ` {`
11. ` id: 2, `
12. ` name: '我要留言', `
13. ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', `
14. ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'`
15. ` },`
16. ` {`
17. ` id: 3, `
18. ` name: '我要出差', `
19. ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', `
20. ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'`
21. ` },`
22. ` {`
23. ` id: 4, `
24. ` name: '产品建议', `
25. ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', `
26. ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'`
27. ` },`
28. ` ];`
29. ``
30. ` return (`
31. ` <div className="portal-m-e-quick-entry">`
32. ` {`
33. ` data.map((item, index) => {`
34. ` return (`
35. ` <div key={index} onClick={() => this.onOpen(item.url)}>`
36. ` <img src={item.icon} />`
37. ` <div><span>{item.name}</span></d
36. ` <img src={item.icon} />`
37. ` <div><span>{item.name}</span></d
36. ` <img src={item.icon} />`
37. ` <div><span>{item.name}</span></div>`
38. ` </div>`
39. ` );`
40. ` })`
41. ` }`
42. ` </div>`
43. ` );`
44. ` }`
45. ``
46. ` onOpen = (url) => {`
47. ` if (window.em && window.em.checkJsApi('openLink')) {`
48. ` window.em.openLink({`
49. ` sysId: window.localStorage.emobile_ec_id,`
50. ` url: url,`
51. ` openType: 2`
52. ` });`
53. ` } else {`
54. ` window.open(url);`
55. ` }`
56. ` };`
57. `}`
58. ``
59. `ecodeSDK.setCom('${appId}', 'View', View);`
`class View extends React.Component {``class View extends React.Component {`class View extends React.Component {` render() {`` render() {` render() {` const data = [`` const data = [` const data = [` {`` {` {` id: 1, `` id: 1, ` id: 1, ` name: '我要请假', `` name: '我要请假', ` name: '我要请假', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', `` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'` },`` },` },` {``
flow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'` },`` },` },` {`` flow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'` },`` },` },` {`` {` {` id: 2, `` id: 2, ` id: 2, ` name: '我要留言', `` name: '我要留言', ` name: '我要留言', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', `` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'`` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'` },`` },` },` {`` {` {` id: 3, `` id: 3, ` id: 3, ` name: '我要出差', `` name: '我要出差', ` name: '我要出差', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', `` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'`` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'` },`` },` },` {`` {` {` id: 4, `` id: 4, ` id: 4, ` name: '产品建议', ``
},` },` {`` {` {` id: 4, `` id: 4, ` id: 4, ` name: '产品建议', `` },` },` {`` {` {` id: 4, `` id: 4, ` id: 4, ` name: '产品建议', `` name: '产品建议', ` name: '产品建议', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', `` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', ` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'`` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'` },`` },` },` ];`` ];` ];````` return (`` return (` return (` <div className="portal-m-e-quick-entry">`` <div className="portal-m-e-quick-entry">` <div className="portal-m-e-quick-entry">` {`` {` {` data.map((item, index) => {`` data.map((item, index) => {` data.map((item, index) => {` return (`` return (` return (` <div key={index} onClick={() => this.onOpen(item.url)}>`` <div key={index} onClick={() => this.onOpen(item.url)}>` <div key={index} onClick={() => this.onOpen(item.url)}>` <img src={item.icon} />`` <img src={item.icon} />` <img src={item.icon} />` <div><span>{item.name}</span></div>`` <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>`
/div>`` <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>` /div>`` <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>` </div>`` </div>` </div>` );`` );` );` })`` })` })` }`` }` }` </div>`` </div>` </div>` );`` );` );` }`` }` }````` onOpen = (url) => {`` onOpen = (url) => {` onOpen = (url) => {` if (window.em && window.em.checkJsApi('openLink')) {`` if (window.em && window.em.checkJsApi('openLink')) {` if (window.em && window.em.checkJsApi('openLink')) {` window.em.openLink({`` window.em.openLink({` window.em.openLink({` sysId: window.localStorage.emobile_ec_id,`` sysId: window.localStorage.emobile_ec_id,` sysId: window.localStorage.emobile_ec_id,` url: url,`` url: url,` url: url,` openType: 2`` openType: 2` openType: 2` });`` });` });` } else {`` } else {` } else {` window.open(url);`` window.open(url);` window.open(url);` }`` }` }` };`` };` };`}``}`}`````ecodeSDK.setCom('${appId}', 'View', View);``ecodeSDK.setCom('${appId}', 'View', View);`ecodeSDK.setCom('${appId}', 'View', View);
View', View);``ecodeSDK.setCom('${appId}', 'View', View);`ecodeSDK.setCom('${appId}', 'View', View);###### (3)如何配置元素
> 通过脚本建立元素,获取主键ID
>
>
>
>
> ```javascript
> insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)
> values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)
> ```
>
>
>
> 在移动门户配置对应元素(如:快捷入口元素)
>
>
> 
>
>
>
>
> 在代码中关联元素类型:如案例中的‘Custom_QuickEntry’
>
>
> 
通过脚本建立元素,获取主键ID
```javascript
insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)
values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)
insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)
values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)
insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) ``insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)``values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)
','快捷入口元素',0,1)`values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)在移动门户配置对应元素(如:快捷入口元素)


在代码中关联元素类型:如案例中的‘Custom_QuickEntry’


4、特色门户元素注册
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:2003及2003+
ecodeSDK.rewritePortalCusEleQueue.push(option)
ecology版本要求:2003及2003+
ecode元素开发易常简洁,无需创建表结构、接口和执行sql,就可以实现多tab元素,只需依照案例重写业务设置项与视图,即可实现整个元素开发。
ecode元素开发易常简洁,无需创建表结构、接口和执行sql,就可以实现多tab元素,只需依照案例重写业务设置项与视图,即可实现整个元素开发。
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
der复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据| 参数 | 说明 | 类型 | 备注 |
| --- | --- | --- | --- |
| props | 元素父组件参数 | object | |
| options | 业务信息 | object | 无 |
| options.id | 元素ID | string | 主题定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
元素父组件参数
object
options
业务信息
object
无
options.id
元素ID
string
主题定义完成后生成的ID
props
元素父组件参数
object
props元素父组件参数object
options
业务信息
object
无
options业务信息object无
options.id
元素ID
string
主题定义完成后生成的ID
options.id元素IDstring主题定义完成后生成的ID
(2)基本例子
ions业务信息object无
options.id
元素ID
string
主题定义完成后生成的ID
options.id元素IDstring主题定义完成后生成的ID
(2)基本例子> register.js:注册元素文件,需要前置加载。该文件可以修改,元素选择名称,如下图


SettingExtend.js :内容设置扩展文件。该文件可以扩展内容设置页面 设置项,如下图


SettingStyleExtend.js :样式设置扩展文件。该文件可以扩展样式设置页面 设置项,如下图


ContainerModleProxy.js :元素模型代理文件。该文件可以设置 设置扩展页面属性默认值,如下图


ContainerViewProxy.js :显示页面代理文件。
该文件可以设置
{
1)、是否隐藏 设置页面的 内容来源表格 (即是否有多tab)
2)、more 页面地址
}
,如下图
1)、是否隐藏 设置页面的 内容来源表格


2)、more 页面地址


AddExtend.js :添加页面扩展文件。该
文件可以
{
1)、扩展添加页面 设置项
2)、设置扩展添加页面 属性默认值
}
,如下图
1)、扩展添加页面 设置项


2)、设置扩展添加页面 属性默认值


AddExtendGroup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

roup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

roup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图


ContainerViewExtend.js :显示页面文件。该文件是元素的显示页面,可以拿到所有设置数据,具体内容显示根据业务渲染,如下图


ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改
./assets/external-images/ptse20.png)
ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改register.js:注册元素文件,需要前置加载。该文件可以修改,元素选择名称,如下图


SettingExtend.js :内容设置扩展文件。该文件可以扩展内容设置页面 设置项,如下图


SettingStyleExtend.js :样式设置扩展文件。该文件可以扩展样式设置页面 设置项,如下图


ContainerModleProxy.js :元素模型代理文件。该文件可以设置 设置扩展页面属性默认值,如下图


ContainerViewProxy.js :显示页面代理文件。
该文件可以设置
{
1)、是否隐藏 设置页面的 内容来源表格 (即是否有多tab)
2)、more 页面地址
}
,如下图
1)、是否隐藏 设置页面的 内容来源表格




AddExtend.js :添加页面扩展文件。该
文件可以
{
1)、扩展添加页面 设置项
2)、设置扩展添加页面 属性默认值
}
,如下图
1)、扩展添加页面 设置项




AddExtendGroup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图


ContainerViewExtend.js :显示页面文件。该文件是元素的显示页面,可以拿到所有设置数据,具体内容显示根据业务渲染,如下图

业务渲染,如下图

ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改
5.元素头注册
ecodeSDK.rewritePortalCusEleHeaderQueue.push(option)
ecology版本要求:2011及2011+
ecodeSDK.rewritePortalCusEleHeaderQueue.push(option)
ecology版本要求:2011及2011+
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.ebaseid |
元素ID |
string |
元素定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
object
题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
objectprops主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
options.ebaseid元素IDstring元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准
ecodeSDK.rewritePortalCusEleHeaderQueue.push({
fn: (params) => {
const { props = {}, options = {} } = params;
if (options.ebaseid === '1') {
const acParams = {
appId: '${appId}',
name: 'Header',
params,
isPage: false,
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
`1. `ecodeSDK.rewritePortalCusEleHeaderQueue.push({`
2. ` fn: (params) => {`
3. ` const { props = {}, options = {} } = params;`
4. ` if (options.ebaseid === '1') {`
5. ` const acParams = {`
6. ` appId: '${appId}',`
7. ` name: 'Header',`
8. ` params,`
9. ` isPage: false,`
10. ` noCss: true`
11. ` };`
12. ` return ecodeSDK.getAsyncCom(acParams);`
13. ` }`
14. ` return null;`
15. ` }`
16. `});`
`ecodeSDK.rewritePortalCusEleHeaderQueue.push({ecodeSDK.rewritePortalCusEleHeaderQueue.push({ecodeSDK.rewritePortalCusEleHeaderQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === '1') {if (options.ebaseid === '1') {` if (options.ebaseid === '1') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Header', name: 'Header',name: 'Header', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;`
n ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` n ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` } }}});});`});
acParams);` } }} return null;return null;` return null;` } }}});`});});> Header.js:不需要前置加载,元素也可以用mobx实现
Header.js:不需要前置加载,元素也可以用mobx实现
class Header extends React.Component {
render() {
// console.log(this.props);
const { params = {} } = this.props;
const { props = {}, options = {} } = params;
const { config = {} } = props;
const { header = {} } = config.item || {};
return (
<div className="portal-cus-rss-header">
<span className="portal-cus-rss-header-title">{header.title}</span>
{options.ToolbarCom}
</div>
);
}
}
ecodeSDK.setCom('${appId}', 'Header', Header);
{options.ToolbarCom}
);
}
}
ecodeSDK.setCom('${appId}', 'Header', Header);
`1. `class Header extends React.Component {`
2. ` render() {`
3. ` // console.log(this.props);`
4. ` const { params = {} } = this.props;`
5. ` const { props = {}, options = {} } = params;`
6. ` const { config = {} } = props;`
7. ` const { header = {} } = config.item || {};`
8.
9. return (
10. <div className="portal-cus-rss-header">
11. <span className="portal-cus-rss-header-title">{header.title}</span>
12. {options.ToolbarCom}
13. </div>
14. );
15. }
16. }
17. 18. `ecodeSDK.setCom('${appId}', 'Header', Header);`
`class Header extends React.Component {class Header extends React.Component {class Header extends React.Component { render() {render() {` render() {` // console.log(this.props); // console.log(this.props);// console.log(this.props); const { params = {} } = this.props;const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; const { config = {} } = props;const { config = {} } = props;` const { config = {} } = props;` const { header = {} } = config.item || {}; const { header = {} } = config.item || {};const { header = {} } = config.item || {};````` return (`` return ( return (<div className="portal-cus-rss-header">`` <div className="portal-cus-rss-header">
<div className="portal-cus-rss-header">` <div className=v className="portal-cus-rss-header"> <div className="portal-cus-rss-header"> {header.title}<span className="portal-cus-rss-header-title">{header.title}</span>` <span className="portal-cus-rss-header-title">{header.title}</span>` {options.ToolbarCom} {options.ToolbarCom}{options.ToolbarCom}
</div>` </div>` ); );
); }
}` }`}}
}`````ecodeSDK.setCom('${appId}', 'Header', Header);``ecodeSDK.setCom('${appId}', 'Header', Header);ecodeSDK.setCom('${appId}', 'Header', Header);
der);
`ecodeSDK.setCom('${appId}', 'Header', Header);ecodeSDK.setCom('${appId}', 'Header', Header);> Header.css:需要前置加载,自定义元素样式
Header.css:需要前置加载,自定义元素样式
.portal-cus-rss-header {
position: relative;
height: 36px;
line-height: 36px;
color: #fff;
background-color: #4d7ad8;
}
.portal-cus-rss-header-title {
padding-left: 10px;
font-size: 14px;
}
.portal-cus-rss-header {
position: relative;
height: 36px;
line-height: 36px;
color: #fff;
background-color: #4d7ad8;
}
- ``
.portal-cus-rss-header-title {
padding-left: 10px;
font-size: 14px;
}
.portal-cus-rss-header {``.portal-cus-rss-header {.portal-cus-rss-header {position: relative;`` position: relative; position: relative;height: 36px;`` height: 36px; height: 36px;line-height: 36px;`` line-height: 36px; line-height: 36px;color: #fff;`` color: #fff; color: #fff;background-color: #4d7ad8;`` background-color: #4d7ad8; background-color: #4d7ad8;}``}}```.portal-cus-rss-header-title {.portal-cus-rss-header-title {.portal-cus-rss-header-title { padding-left: 10px;padding-left: 10px;` padding-left: 10px;` font-size: 14px; font-size: 14px;font-size: 14px;}`}}
(3)案例效果


6.元素标签页注册
ecodeSDK.rewritePortalCusEleTabQueue.push(option)
ecology版本要求:2011及2011+
ecodeSDK.rewritePortalCusEleTabQueue.push(option)
ecology版本要求:2011及2011+
cology版本要求:2011及2011+*
ecodeSDK.rewritePortalCusEleTabQueue.push(option)
ecology版本要求:2011及2011+> 此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.ebaseid |
元素ID |
string |
元素定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
props
主题父组件参数
object
props主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
options.ebaseid元素IDstring元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准
ng元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准```javascript
ecodeSDK.rewritePortalCusEleTabQueue.push({
fn: (params) => {
const { props = {}, options = {} } = params;
if (options.ebaseid === '1') {
const acParams = {
appId: '${appId}',
name: 'Tab',
params,
isPage: false,
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
```1. `ecodeSDK.rewritePortalCusEleTabQueue.push({`
2. ` fn: (params) => {`
3. ` const { props = {}, options = {} } = params;`
4. ` if (options.ebaseid === '1') {`
5. ` const acParams = {`
6. ` appId: '${appId}',`
7. ` name: 'Tab',`
8. ` params,`
9. ` isPage: false,`
10. ` noCss: true`
11. ` };`
12. ` return ecodeSDK.getAsyncCom(acParams);`
13. ` }`
14. ` return null;`
15. ` }`
16. `});`
`ecodeSDK.rewritePortalCusEleTabQueue.push({``ecodeSDK.rewritePortalCusEleTabQueue.push({`ecodeSDK.rewritePortalCusEleTabQueue.push({` fn: (params) => {`` fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params;` if (options.ebaseid === '1') {`` if (options.ebaseid === '1') {` if (options.ebaseid === '1') {` const acParams = {`` const acParams = {` const acParams = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'Tab',`` name: 'Tab',` name: 'Tab',` params,`` params,` params,` isPage: false,`` isPage: false,` isPage: false,` noCss: true`` noCss: true` noCss: true` };`` };` };` return ecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`});
acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`});> Tab.js:不需要前置加载,元素也可以用mobx实现
Tab.js:不需要前置加载,元素也可以用mobx实现
```javascript
const { Popconfirm } = antd;
class Tab extends React.Component {
render() {
const { params = {} } = this.props;
const { props = {}, options = {} } = params;
const { datas = {} } = props;
const { tabids = [], titles = [], counts = {} } = datas;
return (
<div className="portal-cus-rss-tab">
<ul>
{
titles.map((item, index) => {
return (
<li
key={tabids[index]}
className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''}
onClick={() => options.handleTabData(tabids[index])}
>
<span>{item}</span>
</li>
);
})
}
</ul>
</div>
);
}
}
ecodeSDK.setCom('${appId}', 'Tab', Tab);
})
}
);
}
}
ecodeSDK.setCom('${appId}', 'Tab', Tab);
`1. `const { Popconfirm } = antd;`
2.
3. class Tab extends React.Component {
4. render() {
5. const { params = {} } = this.props;
6. const { props = {}, options = {} } = params;
7. const { datas = {} } = props;
8. const { tabids = [], titles = [], counts = {} } = datas;
9. 10. ` return (`
11. ` <div className="portal-cus-rss-tab">`
12. ` <ul>`
13. ` {`
14. ` titles.map((item, index) => {`
15. ` return (`
16. ` <li `
17. ` key={tabids[index]} `
18. ` className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} `
19. ` onClick={() => options.handleTabData(tabids[index])}`
20. ` >`
21. ` <span>{item}</span>`
22. ` </li>`
23. ` );`
24. ` })`
25. ` }`
26. ` </ul>`
27. ` </div>`
28. ` );`
29. ` }`
30. `}`
31.
32. ecodeSDK.setCom('${appId}', 'Tab', Tab);
const { Popconfirm } = antd;``const { Popconfirm } = antd;const { Popconfirm } = antd;class Tab extends React.Component {``class Tab extends React.Component {`class Tab extends React.Component {` render() {`` render() {` render() {` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props =
s = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = s = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params;` const { datas = {} } = props;`` const { datas = {} } = props;` const { datas = {} } = props;` const { tabids = [], titles = [], counts = {} } = datas;`` const { tabids = [], titles = [], counts = {} } = datas;` const { tabids = [], titles = [], counts = {} } = datas; return (return (` return (` <div className="portal-cus-rss-tab">
<div className="portal-cus-rss-tab"> <ul>` <ul>` { {{ titles.map((item, index) => {titles.map((item, index) => {` titles.map((item, index) => {` return ( return (return ( - <li ` <li ` key={tabids[index]} key={tabids[index]}
key={tabids[index]} className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} ` className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} ` onClick={() => options.handleTabData(tabids[index])} onClick={() => options.handleTabData(tabids[index])}onClick={() => options.handleTabData(tabids[index])} >>` >` <span>{ite
s.handleTabData(tabids[index])}` > >> {ites.handleTabData(tabids[index])}>`` > ><span>{item}</span>`` <span>{item}</span> {item}</li>`` </li> );`` ); );})`` }) })}`` } }</ul>`` </ul>
</div>`` </div> );`` ); );}`` } }}``}}```ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab);
d}', 'Tab', Tab);``ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab);> Tab.css:需要前置加载,自定义元素样式
Tab.css:需要前置加载,自定义元素样式
.portal-cus-rss-tab {
position: relative;
height: 36px;
line-height: 36px;
color: #333;
border-bottom: 1px solid #ccc;
box-sizing: content-box;
}
.portal-cus-rss-tab ul::after {
content: '';
display: block;
clear: both;
}
.portal-cus-rss-tab ul li {
float: left;
width: auto;
padding: 0px 10px;
cursor: pointer;
}
.portal-cus-rss-tab-active {
color: #4d7ad8;
border-bottom: 1px solid #4d7ad8;
}
pointer;
}
- .portal-cus-rss-tab-active {
- color: #4d7ad8;
- border-bottom: 1px solid #4d7ad8;
- }
``1..portal-cus-rss-tab {`
- 2.
position: relative;
- 3.
height: 36px;
- 4.
line-height: 36px;
- 5.
color: #333;
- 6.
border-bottom: 1px solid #ccc;
- 7.
box-sizing: content-box;
- 8.
}
- 9. ``
- 10.
.portal-cus-rss-tab ul::after {
- 11.
content: '';
- 12.
display: block;
- 13.
clear: both;
- 14.
}
- 15. ``
- 16.
.portal-cus-rss-tab ul li {
- 17.
float: left;
- 18.
width: auto;
- 19.
padding: 0px 10px;
- 20.
cursor: pointer;
- 21.
}
- 22. ``
- 23.
.portal-cus-rss-tab-active {
- 24.
color: #4d7ad8;
- 25.
border-bottom: 1px solid #4d7ad8;
- 26.
}
.portal-cus-rss-tab {``.portal-cus-rss-tab {.portal-cus-rss-tab {position: relative;`` position: relative; position: relative;height: 36px;`` height: 36px; height: 36px;line-height: 36px;`` line-height: 36px; line-height: 36px;color: #333;`` color: #333; color: #333;border-bottom: 1px solid #ccc;`` border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;box-sizing: content-box;`` box-sizing: content-box; box-sizing: content-box;}``}}.portal-cus-rss-tab ul::after {``.portal-cus-rss-tab ul::after {`.portal-cus-rss-tab ul::after {` content: '';`` content: '';` content: '';` display: block;`` display: block;` display: block;` clear: both;`` clear: both;` clear: both;`}``}`}.portal-cus-rss-tab ul li {.portal-cus-rss-tab ul li {`.portal-cus-rss-tab ul li {` float: left; float: left;float: left; width: auto;` width: auto; width: auto;` padding: 0px 10
- left;
float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10: left;float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10px;padding: 0px 10px;` padding: 0px 10px;` cursor: pointer; cursor: pointer;cursor: pointer;}}`}`````.portal-cus-rss-tab-active {.portal-cus-rss-tab-active {.portal-cus-rss-tab-active { color: #4d7ad8;color: #4d7ad8;` color: #4d7ad8;` border-bottom: 1px solid #4d7ad8; border-bottom: 1px solid #4d7ad8;border-bottom: 1px solid #4d7ad8;}}`}
m: 1px solid #4d7ad8; border-bottom: 1px solid #4d7ad8;border-bottom: 1px solid #4d7ad8;}`}}###### (3)案例效果


7.元素工具栏注册
ecodeSDK.rewritePortalCusEleToolbarQueue.push(option)
ecology版本要求:2011及2011+
ecodeSDK.rewritePortalCusEleToolbarQueue.push(option)
ecology版本要求:2011及2011+
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.ebaseid |
元素ID |
string |
元素定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.ebaseid
元素ID
string
元素定义完成后生成的IDprops
主题父组件参数
object
props主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.ebaseid
元素ID
string
元素定义完成后生成的ID
options.ebaseid元素IDstring元素定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准
ecodeSDK.rewritePortalCusEleToolbarQueue.push({
fn: (params) => {
const { props = {}, options = {} } = params;
if (options.ebaseid === '1') {
const acParams = {
appId: '${appId}',
name: 'Toolbar',
params,
isPage: false,
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
noCss: true
};
return ecodeSDK.getAsyncCom(acParams);
}
return null;
}
});
`1. `ecodeSDK.rewritePortalCusEleToolbarQueue.push({`
2. ` fn: (params) => {`
3. ` const { props = {}, options = {} } = params;`
4. ` if (options.ebaseid === '1') {`
5. ` const acParams = {`
6. ` appId: '${appId}',`
7. ` name: 'Toolbar',`
8. ` params,`
9. ` isPage: false,`
10. ` noCss: true`
11. ` };`
12. ` return ecodeSDK.getAsyncCom(acParams);`
13. ` }`
14. ` return null;`
15. ` }`
16. `});`
`ecodeSDK.rewritePortalCusEleToolbarQueue.push({ecodeSDK.rewritePortalCusEleToolbarQueue.push({ecodeSDK.rewritePortalCusEleToolbarQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === '1') {if (options.ebaseid === '1') {` if (options.ebaseid === '1') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Toolbar', name: 'Toolbar',name: 'Toolbar', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return
;` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return;` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` } }}});});`});
acParams);` } }} return null;return null;` return null;` } }}});`});});> Toolbar.js:不需要前置加载,元素也可以用mobx实现
Toolbar.js:不需要前置加载,元素也可以用mobx实现
const { Popconfirm } = antd;
class Toolbar extends React.Component {
render() {
const { params = {} } = this.props;
const { props = {}, options = {} } = params;
return (
<div className="portal-cus-rss-toolbar">
<ul>
<li><span onClick={options.handleRefresh}>刷新</span></li>
<li><span onClick={options.handleSetting}>设置</span></li>
<li>
<Popconfirm
placement="leftTop"
title="此元素被删除后将不能被恢复,是否继续?"
onConfirm={options.handleDelete}
okText="确定"
cancelText="取消"
>
<span>删除</span>
</Popconfirm>
</li>
<li><span onClick={options.handleMore}>更多</span></li>
</ul>
</div>
);
}
}
ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);
);
}
}
ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);
`1. `const { Popconfirm } = antd;`
2.
3. class Toolbar extends React.Component {
4. render() {
5. const { params = {} } = this.props;
6. const { props = {}, options = {} } = params;
7. 8. ` return (`
9. ` <div className="portal-cus-rss-toolbar">`
10. ` <ul>`
11. ` <li><span onClick={options.handleRefresh}>刷新</span></li>`
12. ` <li><span onClick={options.handleSetting}>设置</span></li>`
13. ` <li>`
14. ` <Popconfirm `
15. ` placement="leftTop" `
16. ` title="此元素被删除后将不能被恢复,是否继续?"`
17. ` onConfirm={options.handleDelete} `
18. ` okText="确定"`
19. ` cancelText="取消"`
20. ` >`
21. ` <span>删除</span>`
22. ` </Popconfirm>`
23. ` </li>`
24. ` <li><span onClick={options.handleMore}>更多</span></li>`
25. ` </ul>`
26. ` </div>`
27. ` );`
28. ` }`
29. `}`
30.
31. ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);
const { Popconfirm } = antd;``const { Popconfirm } = antd;const { Popconfirm } = antd;class Toolbar extends React.Component {``class Toolbar extends React.Component {`class Toolbar extends React.Component {` render() {`` render() {` render() {` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { pro
props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { pro props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params; return (return (` return (` <div className="portal-cus-rss-toolbar">
<div className="portal-cus-rss-toolbar"> <ul>` <ul>` <li><span onClick={options.handleRefresh}>刷新</span></li> - 刷新
<li><span onClick={options.handleRefresh}>刷新</span></li> - 设置
<li><span onClick={options.handleSetting}>设置</span></li>` <li><span onClick={options.handleSetting}>设置</span></li>` <li> <li> <Popconfirm ` <Popconfirm ` placement="leftTop" placement="leftTop" placement="leftTop" title="此元素被删除后将不能被恢复,是否继续?"title="此元素被删除后将不能被恢复,是否继续?"` title="此元素被删除后将不能被恢复,是否继续?"` onConfirm={options.handleDelete} onConfirm={options.handleDelete} onConfirm={options.handleDelete} okText="确定"okText="确定"` okText="确定"` cancelText="取消" cancelText="取消"cancelText="取消" >>` >` <span>删除</span> 删除<span>删除</span> </Popconfirm>` </Popconfirm>`
除</span>` <span>删除</span>` </Popconfirm> </Popconfirm> 除<span>删除</span> </Popconfirm>` </Popconfirm>` </li> </li> - 更多
<li><span onClick={options.handleMore}>更多</span></li>` <li><span onClick={options.handleMore}>更多</span></li>` </ul>
</ul> </div>` </div>` ); );); }}` }`}}}`````ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);``ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);
;`ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);> Toolbar.css:需要前置加载,自定义元素样式
Toolbar.css:需要前置加载,自定义元素样式
.portal-cus-rss-toolbar {
position: absolute;
top: 0;
right: 5px;
}
.portal-cus-rss-toolbar ul::after {
content: '';
display: block;
clear: both;
}
.portal-cus-rss-toolbar ul li {
float: left;
width: auto;
padding: 0px 10px;
cursor: pointer;
}
-cus-rss-toolbar ul li {
float: left;
width: auto;
padding: 0px 10px;
cursor: pointer;
}
`1. `.portal-cus-rss-toolbar {`
2. ` position: absolute;`
3. ` top: 0;`
4. ` right: 5px;`
5. `}`
6.
7. .portal-cus-rss-toolbar ul::after {
8. content: '';
9. display: block;
10. clear: both;
11. }
12. 13. `.portal-cus-rss-toolbar ul li {`
14. ` float: left;`
15. ` width: auto;`
16. ` padding: 0px 10px;`
17. ` cursor: pointer;`
18. `}`
`.portal-cus-rss-toolbar {.portal-cus-rss-toolbar {.portal-cus-rss-toolbar { position: absolute;position: absolute;` position: absolute;` top: 0; top: 0;top: 0; right: 5px;right: 5px;` right: 5px;`}}}`````.portal-cus-rss-toolbar ul::after {``.portal-cus-rss-toolbar ul::after {.portal-cus-rss-toolbar ul::after {content: '';`` content: ''; content: '';display: block;`` display: block; display: block;clear: both;`` clear: both; clear: both;}``}}```.portal-cus-rss-toolbar ul li {.portal-cus-rss-toolbar ul li {.portal-cus-rss-toolbar ul li { float: left;float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10px;padding: 0px 10px;` padding: 0px 10px;` cursor: pointer; cursor: pointer;cursor: pointer;}`}}
(3)案例效果


8、PC门户登录页注册
ecodeSDK.rewritePortalLoginQueue.push(option)
ecology版本要求:1906及1906+
ecodeSDK.rewritePortalLoginQueue.push(option)
ecology版本要求:1906及1906+
`
ecology版本要求:1906及1906+
ecodeSDK.rewritePortalLoginQueue.push(option)
ecology版本要求:1906及1906+> 此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优
(1)参数说明
| 参数 |
说明 |
类型 |
可选 |
默认 |
备注 |
| option |
复写配置 |
object |
必填 |
{} |
|
| option.fn |
复写钩子函数 |
function |
必填 |
(params)=>{} |
params 参数请看下一个表格 |
| option.order |
复写排序 |
integer |
选填 |
0 |
|
| option.desc |
复写说明 |
string |
选填 |
‘’ |
无 |
参数
说明
类型
可选
默认
备注
参数
说明
类型
可选
默认
备注
参数说明类型可选默认备注
option
复写配置
object
必填
{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.desc
复写说明
string
选填
‘’
无
option
复写配置
object
必填
{}
option复写配置object必填{}
option.fn
复写钩子函数
function
必填
(params)=>{}
params 参数请看下一个表格
option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格
option.order
复写排序
integer
选填
0
option.order复写排序integer选填0
option.desc
复写说明
string
选填
‘’
无
option.desc复写说明string选填‘’无
params 数据
params 数据
| 参数 |
说明 |
类型 |
备注 |
| props |
主题父组件参数 |
object |
|
| options |
业务信息 |
object |
无 |
| options.id |
登录页ID |
string |
登录页定义完成后生成的ID |
参数
说明
类型
备注
参数
说明
类型
备注
参数说明类型备注
props
主题父组件参数
object
options
业务信息
object
无
options.id
登录页ID
string
登录页定义完成后生成的ID
props
主题父组件参数
object
props主题父组件参数object
options
业务信息
object
无
options业务信息object无
options.id
登录页ID
string
登录页定义完成后生成的ID
options.id登录页IDstring登录页定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准
g登录页定义完成后生成的ID
(2)基本例子
register.js:需要前置加载,注册了登录页即可关联到标准
register.js:需要前置加载,注册了登录页即可关联到标准javascript
ecodeSDK.rewritePortalLoginQueue.push({
fn:(params)=>{
const {props,options} = params;
if(options.id==='a92ef529fd16469988feebe0e38cd83e') {
const acParams = {
appId:'${appId}',
name:'E9NewLogin', //模块名称
isPage:false, //是否是路由页面
noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
props:props
}
//异步加载模块${appId}下的子模块CusEle
return ecodeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'新登录页'
});
return ecodeSDK.getAsyncCom(acParams);
}
return null;
},
order:1,
desc:'新登录页'
});
```1. `ecodeSDK.rewritePortalLoginQueue.push({`
2. ` fn:(params)=>{`
3. ` const {props,options} = params;`
4. ` if(options.id==='a92ef529fd16469988feebe0e38cd83e') {`
5. ` const acParams = {`
6. ` appId:'${appId}',`
7. ` name:'E9NewLogin', //模块名称`
8. ` isPage:false, //是否是路由页面`
9. ` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`
10. ` props:props`
11. ` }`
12. ` //异步加载模块${appId}下的子模块CusEle`
13. ` return ecodeSDK.getAsyncCom(acParams);`
14. ` }`
15. ` return null;`
16. ` },`
17. ` order:1,`
18. ` desc:'新登录页'`
19. `});`
`ecodeSDK.rewritePortalLoginQueue.push({``ecodeSDK.rewritePortalLoginQueue.push({`ecodeSDK.rewritePortalLoginQueue.push({` fn:(params)=>{`` fn:(params)=>{` fn:(params)=>{` const {props,options} = params;`` const {props,options} = params;` const {props,options} = params;` if(options.id==='a92ef529fd16469988feebe0e38cd83e') {`` if(options.id==='a92ef529fd16469988feebe0e38cd83e') {` if(options.id==='a92ef529fd16469988feebe0e38cd83e') {` const acParams = {`` const acParams = {` const acParams = {` appId:'${appId}',`` appId:'${appId}',` appId:'${appId}',` name:'E9NewLogin', //模块名称`` name:'E9NewLogin', //模块名称` name:'E9NewLogin', //模块名称` isPage:false, //是否是路由页面`` isPage:false, //是否是路由页面` isPage:false, //是否是路由页面` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, /
独加载css,通常为了减少css数量,css默认前置加载`` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, /独加载css,通常为了减少css数量,css默认前置加载`` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` props:props`` props:props` props:props` }`` }` }` //异步加载模块${appId}下的子模块CusEle`` //异步加载模块${appId}下的子模块CusEle` //异步加载模块${appId}下的子模块CusEle` return ecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` }`` }` }` return null;`` return null;` return null;` },`` },` },` order:1,`` order:1,` order:1,` desc:'新登录页'`` desc:'新登录页'` desc:'新登录页'`});``});`});
},`` },` },` order:1,`` order:1,` order:1,` desc:'新登录页'`` desc:'新登录页'` desc:'新登录页'`});``});`});###### (3)如何配置登录页
> 建立特色登录前门户,并获取ID
建立特色登录前门户,并获取ID

> 在登录页中关联登录前门户,从页面模板可以选择到这个特色门户,并选中这个登录页启用,注意一旦启用并且登录页还未调试好,就必须通过特殊地址才能登陆,调试期间可通过此地址/wui/index.html#/?templateId=-1强制切到标准登录页
在登录页中关联登录前门户,从页面模板可以选择到这个特色门户,并选中这个登录页启用,注意一旦启用并且登录页还未调试好,就必须通过特殊地址才能登陆,调试期间可通过此地址/wui/index.html#/?templateId=-1强制切到标准登录页

> 在代码中关联此登录页,即可开始调试
在代码中关联此登录页,即可开始调试


##### 9、全局流程代码块整合
> 此方案用于对全局流程做批量控制采用,另外也可作为单个流程或节点的代码块快速绑定,省去了绑定流程还到多个地方操作的麻烦,创建ecode项目的register.js并标记前置加载
此方案用于对全局流程做批量控制采用,另外也可作为单个流程或节点的代码块快速绑定,省去了绑定流程还到多个地方操作的麻烦,创建ecode项目的register.js并标记前置加载
```javascript
let enable = true;
let isRun = false; //控制执行次数
const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready
//可操作WfForm,以及部分表单dom hiden、ReactDOM.render
//console.log('runScript!');
isRun = true; //确保只执行一次
}
可操作WfForm,以及部分表单dom hiden、ReactDOM.render
//console.log('runScript!');
isRun = true; //确保只执行一次
}//PC端代码块
//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点
ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{
fn:(newProps)=>{
if(!enable) return ; //开关打开
const {hash} = window.location;
if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址
if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成
if(!WfForm) return ; //表单sdk加载完成
const baseInfo = WfForm.getBaseInfo();
const {workflowid} = baseInfo;
if(workflowid!==44) return ; //判断流程id
if(isRun) return ; //执行过一次就不执行
runScript(); //执行代码块
}
});
//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)
ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{
fn:(newProps)=>{
if(!enable) return ; //开关打开
const {hash} = window.location;
if(!hash.startsWith('#/req')) return ; //判断页面地址
if(!WfForm) return ; //表单sdk加载完成
const baseInfo = WfForm.getBaseInfo();
const {workflowid} = baseInfo;
if(workflowid!==44) return ; //判断流程id
if(isRun) return ; //执行过一次就不执行
runScript(); //执行代码块
}
});
owid!==44) return ; //判断流程id
if(isRun) return ; //执行过一次就不执行
runScript(); //执行代码块
}
});1. let enable = true;
2. let isRun = false; //控制执行次数
3. 4. `const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready`
5. ` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render`
6. ` //console.log('runScript!');`
7. ` isRun = true; //确保只执行一次`
8. `}`
9.
10. //PC端代码块
11. //利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点
12. ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{
13. fn:(newProps)=>{
14. if(!enable) return ; //开关打开
15. const {hash} = window.location;
16. if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址
17. if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成
18. if(!WfForm) return ; //表单sdk加载完成
19. const baseInfo = WfForm.getBaseInfo();
20. const {workflowid} = baseInfo;
21. if(workflowid!==44) return ; //判断流程id
22. if(isRun) return ; //执行过一次就不执行
23. runScript(); //执行代码块
24. }
25. });
26. 27. `//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)`
28. `ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{`
29. ` fn:(newProps)=>{`
30. ` if(!enable) return ; //开关打开`
31. ` const {hash} = window.location;`
32. ` if(!hash.startsWith('#/req')) return ; //判断页面地址`
33. ` if(!WfForm) return ; //表单sdk加载完成`
34. ` const baseInfo = WfForm.getBaseInfo();`
35. ` const {workflowid} = baseInfo;`
36. ` if(workflowid!==44) return ; //判断流程id`
37. ` if(isRun) return ; //执行过一次就不执行`
38. ` runScript(); //执行代码块`
39. ` }`
40. `});`
`let enable = true;let enable = true;`let enab
runScript(); //执行代码块
}
});
let enable = true;``let enable = true;let enab
runScript(); //执行代码块
}
});
let enable = true;``let enable = true;let enable = true;let isRun = false; //控制执行次数``let isRun = false; //控制执行次数let isRun = false; //控制执行次数const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready``const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready`const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render`` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render` //console.log('runScript!');`` //console.log('runScript!');` //console.log('runScript!');` isRun = true; //确保只执行一次`` isRun = true; //确保只执行一次` isRun = true; //确保只执行一次`}``}`}//PC端代码块//PC端代码块`//PC端代码块`//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{`ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{` fn:(newProps)=>{ fn:(newProps)=>{fn:(newProps)=>{ if(!enable) return ; //开关打开if(!enable) return ; //开关打开` if(!enable) return ; //开关打开` const {hash} = window.location; const {hash} = window.location;const {hash} = window.location; if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64)
断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64) 断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成 if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成 if(!WfForm) return ; //表单sdk加载完成if(!WfForm) return ; //表单sdk加载完成` if(!WfForm) return ; //表单sdk加载完成` const baseInfo = WfForm.getBaseInfo(); const baseInfo = WfForm.getBaseInfo();const baseInfo = WfForm.getBaseInfo(); const {workflowid} = baseInfo;const {workflowid} = baseInfo;` const {workflowid} = baseInfo;` if(workflowid!==44) return ; //判断流程id if(workflowid!==44) return ; //判断流程idif(workflowid!==44) return ; //判断流程id if(isRun) return ; //执行过一次就不执行if(isRun) return ; //执行过一次就不执行` if(isRun) return ; //执行过一次就不执行` runScript(); //执行代码块 runScript(); //执行代码块runScript(); //执行代码块 }}` }`});});});`````//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)``//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{``ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{fn:(newProps)=>{`` fn:(newProps)=>{ fn:(newProps)=>{if(!enable) return ; //开关打开`` if(!enable) return ; //开关打开 if(!enable) return ; //开关打开const {hash} = window.location;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('#
on;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('#on;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('#/req')) return ; //判断页面地址`` if(!hash.startsWith('#/req')) return ; //判断页面地址 if(!hash.startsWith('#/req')) return ; //判断页面地址if(!WfForm) return ; //表单sdk加载完成`` if(!WfForm) return ; //表单sdk加载完成 if(!WfForm) return ; //表单sdk加载完成const baseInfo = WfForm.getBaseInfo();`` const baseInfo = WfForm.getBaseInfo(); const baseInfo = WfForm.getBaseInfo();const {workflowid} = baseInfo;`` const {workflowid} = baseInfo; const {workflowid} = baseInfo;if(workflowid!==44) return ; //判断流程id`` if(workflowid!==44) return ; //判断流程id if(workflowid!==44) return ; //判断流程idif(isRun) return ; //执行过一次就不执行`` if(isRun) return ; //执行过一次就不执行 if(isRun) return ; //执行过一次就不执行runScript(); //执行代码块`` runScript(); //执行代码块 runScript(); //执行代码块}`` } }});``});});
runScript(); //执行代码块runScript(); //执行代码块` runScript(); //执行代码块` } }}});`});});
---> ℹ️ 对比提示: 本文档介绍的是门户主题/元素/登录页开发,如需开发独立的 SPA 路由页面,请参考 六-新页面开发.md。
⚠️ 注意: 文件末尾“全局流程代码块整合”部分的代码格式存在重复,建议参考官方原文档对照阅读。