代码规范
代码编写规范请参考阿里巴巴开发手册:https://github.com/alibaba/p3c
1. 类名、变量名使用驼峰命名,不得使用下划线连接,名称命名尽量使用英文,如:UserInfo,不得使用拼音简写,如果使用拼音则需要使用全拼, 如:YongHu(用户),不得使用 Yh 2. 日志一律打印到集成日志,不得打印到 ecology.log 等其它配置文件,方便日志管理,如果打印到 ecology.log 文件,会因文件太大而导致日志查看困难 3. 不得忽略异常,不能直接打印异常,如:`e.printStackTrace()`,必需将异常打印到集成日志中,如:`log.error("错误", e)` 4. 方法体不得过长,最好不超过60行,最好在30行内,太长的方法体不利于阅读,注意将不同功能拆分到不同方法中,不要所有功能都放到一个方法内。 5. 避免体积过大的类,代码尽量在300行以内,遵循单一职责原则,按职责将功能划分到不同的类中。 6. 对于公共方法,必需在方法上添加注释,包括方法的功能、参数说明、返回值说明和抛出的异常说明等。 7. 每个类必需添加类注释,说明类的功能。
接口规范
1. 二开的接口路径一律以 `/second-dev/` 开头(这里省略了 api 前缀,这是会默认加上的),如:`/second-dev/user/add`,如果是对外接口,则以 `/second-dev/open/` 开头, 如:`/second-dev/open/user/add`。 2. 接口路径需要符合 RESTful 风格,路径按模块划分,如流程模块的接口:`/second-dev/workflow/` ,建模模块的接口: `/second-dev/cube/`
包路径规范
建议所有开发文件包路径都在 secdev 包之下,区分二开文件与标准文件,例如:`com.api.interfaces.secdev.extend.web`
在以下带有 secdev 的路径中,secdev 是建议的包路径。
- WEB 接口发布包路径:`com.api.interfaces.secdev.*`
- WEB 接口业务包路径:`com.engine.interfaces.secdev.*`
- 其它开发包路径:`com.customization.secdev.*`
开发包打包规范
1. 建议将 class 文件打成 jar 包,这样容易打包,将你在本客户开发的所有 class 文件都打到 jar 包中,jar 包命名示例:`seconddev-sgmw-yll.jar` , seconddev 表示这是二开的 jar 包,sgmw 为客户名称,yll 为你姓名的缩写。 2. 开发包内如果存在后端文件,需要放在开发包的 ecology 文件夹内,将 class 文件放在 ecology/classbean 中,如果有其它后端文件也需要放在 ecology 文件夹内,方便部署到服务器上,对于配置文件可单独放在另一个文件夹中,如放在 /配置文件/ecology/WEB-INF/props/ 中。 3. 如有需求文档,需要放在开发包内,如 /需求文档/xxx.docx 4. 开发包内文件要求: - 说明文档(必需):必需包含作者(如果是外部开发人员,需注明机构名称),时间,开发的功能(描述实现了什么)、使用方法(如需要,不涉及使用操作可忽略)、如何部署和配置 - 需求文档(可选):原始的需求文档,这样有利于追溯原始需求和源头 - 接口文档(可选):如果开发的接口包含复杂的请求参数(如请求体参数超过5个),且参数需要在系统中配置(如在 ESB 中),或者供外部系统调用,则需要编写接口文档,说明接口的请求参数、返回参数等信息,接口文档可以是在线的或者离线,如果是在线文档将文档地址说明在开发说明文档中,如果是离线的文档 则需要放在开发包内。 5. 如果开发需要其它附加文件,如果 ecode 应用、建模(导出zip文件)、ESB应用等,都需要放到开发包内。
开发包目录结构参考:
根目录
|-ecology
| |-classbean
| |-WEB-INF
|-配置文件
| |-ecology
| |-WEB-INF
| |-props
| |-dev.properties
|-ecode
|-建模
|-需求文档
|- |-需求.docx
|-开发说明.docx
前端规范
通过样式名添加二开标记
任何通过二开在页面上添加元素的组件(比如弹窗、按钮、表格等),都必需在组件的样式名上注明二开标记,如:“ecode 应用id,代码入口(是ecode还是 表单js)”,方便定位二开代码编写位置。(我经常碰到这个按钮不知道是在哪里开发添加的,找的很痛苦)
示例: appid-${appId} 为ecode 应用id,seconddev-ecode 表示这是在 ecode 二开添加的
<Button onClick={handleClick} className={'appid-${appId} seconddev-ecode'} >下载为PDF</Button>
- 所有组件参数复写、组件重写和接口拦截,必需添加 desc 和 appId 属性,appId 属性有利于定位所在 Ecode 应用,例如:
/**
* @author 姚礼林
* @desc 拦截移动端流程表单右键菜单接口,移除转发按钮
*/
ecodeSDK.rewriteApiDataQueueSet({
fn: (url, params, datas) => {
try {
if (url.indexOf('/api/workflow/reqform/rightMenu') === -1) {
return datas;
}
return datas;
},
desc: '在移动端流程表单页面拦截rightMenu接口,移除转发按钮',
appId: '${appId}'
});
每个 E-Code 应用必需添加说明文档
在每个 E-Code 应用添加 README.md 文件,说明作者信息,开发的内容,如何配置等,方便了解这个应用的功能是什么,方便后续维护。
示例:
# EB列表单元格合并开发说明
作者:泛微柳州 姚礼林
日期:2026-02-26
## 实现功能
e-builder 表格可合并重复数据的单元格,如果表格中的字段存在连续重复,则进行合并。
- 可配置合并依据字段,如果该字段存在连续重复,则合并这些单元格
- 可配置其它需要合并的字段,在合并依据字段合并时,如果这些字段的值也相同,则进行合并
- 可对每个 e-builder 表格配置合并
合并前:

合并后:

## 配置说明
需修改 `config/config.js` 文件,需配置需要合并的eb表格,在配置中的表格才进行合并。
配置示例:
const config = { viewConfigs :[ { // 列表id,通过链接地址获取,例如链接包含: // /sp/ebdapp/build/1211771683381723136/search/1211771941323030537-7516533764297595633? // 则取 1211771941323030537 id:'1240398310603153522', // 主键字段名,必填,按此字段合并单元格,值相同且上下连续时合并 primaryKeyField:'supplier', // 其它需要合并单元格的字段名,可为空 mergeColFieldNames:['produce'] }, { // 其它表格配置 } ] }
export default config;
在 `viewConfigs` 中可配置多个表格
会导致错误的代码写法
重写组件参数和重写组件函数不能用异步
如果加上异步(async),则函数返回的是 Promise 对象,会对其它需要重写该组件的地方造成影响,因为 props 拿到的是 Promise 对象而不是参数
错误示例:不要在 fn 函数加上`async`
ecodeSDK.overwritePropsFnQueueMapSet('Tabs', {
fn: async (props) => {
},
})
会造成在其它需要重写该组件的地方拿不到参数:
ecodeSDK.overwritePropsFnQueueMapSet('Tabs', {
fn: (props) => {
// props 拿到的是 Promise 对象而不是参数
},
})
建议-对于每个接口拦截、组件参数重写,都输出日志到控制台
这是为了判断页面是否被二开影响,如果不知道这是二开过的,比如通过组件参数重写去除了页面中的选择项,不知道的人就比较难判断出是什么原因。
比如下面的例子,去除了页面 `Radio` 组件其中一个选项,去除之后就在控制台中输出日志,这样就能比较好知道是通过二开进行修改了。
/**
* 流程加签对话框中去掉"审批环节类型"选择中的“查阅”选项
* @author yaolilin
*/
regOvProps('weappUi', 'Radio', (props) => {
try {
// 确保是流程表单
const sdk = window.WeFormSDK?.getWeFormInstance();
if (props.weId?.endsWith('_ryuinw') && sdk) {
if (props.data) {
props.data = props.data.filter(i => i.content !== '查阅');
console.log('组件参数重写:流程加签对话框中去掉"审批环节类型"选择中的“查阅”选项')
}
}
} catch (e) {
console.error('加签对话框中审批环节类型选择去掉查阅出错', e)
}
return props;
}, 1);