---
url: /dev/standards/index.md
---
# YonBIP 低代码开发规范

\[\[toc]]

***

## 1. 对象建模规范

### 1.1 编码规范

#### 1.1.1 业务对象编码

* **格式**：`系统码_编码`
* 系统码由开发平台自动生成。
* 特殊含义对象命名规则：
  * 配置类型：以 `Config` 结尾
  * 资料类型：以 `Info` 结尾
  * 明细条目：以 `Items` 结尾
  * 详细描述/扩展信息：以 `Detail` 结尾
  * 单据/凭证行：以 `Lines` 结尾

#### 1.1.2 实体编码

* **主实体**：与业务对象编码一致
* **子实体**：需在主实体基础上扩展
  * 示例：主实体 `AccountPay`，子实体 `AccountPayAttachment`

#### 1.1.3 属性编码

采用小驼峰命名（camelCase），首字母小写，应采用有意义的英文单词组合，避免缩写不清晰。

| 字段类型 | 命名规则 | 示例 |
| --- | --- | --- |
| 通用字段 | 小驼峰 | `merchantCode` |
| 布尔字段 | 以 `bl` 开头，禁止使用 `is` | `blJoin`（是否参会） |
| 日期字段 | 以 `Date` 结尾 | `startDate` |
| 时间字段 | 以 `Time` 结尾 | `createTime` |
| 主键关联外键 | 以 `Id` 结尾 | `orgId`、`workerId` |
| 编码关联外键 | 以 `Code` 结尾 | `deptCode`（部门编码） |
| 料品 | 以`material`开头 | `materialName`（物料名称） |
| 部门 | 以`dept`开头 | `deptName`（部门名称） |
| 员工 | 以`staff`开头 | `staffName`（员工名称） |
| 是否生效 | `blActive` |  |
| 数量 | `qty` |  |
| 工序号 | `seqNo` |  |

#### 1.1.4 系统保留关键字

禁止使用以下系统保留关键字作为属性编码：

```
approvalFlow、base、bizFlowName、bizFlowVersion、bizFlowInstanceId、businessType、bustype、 
businessFlow、bizFlowId、creator、createTime、code、dr、disablets、enable、enablets、
foreignerKey、id、ITree、isFlowCoreBill、isEnd、isWfControlled、level、modifier、modifyTime、
name（档案类可以）、org_id、pubts、pk_temp、pk_procdefins、pk_procdef、path、parent、startdept、
source_id、sourcechild_id、startorg、source_billtype、sort、status、tenant_id、type、version、
 verifystate、ytenant、secretLevel、secretLimit
```

### 1.2 数据库表规范

#### 1.2.1 表名生成

* **规则**：表名 = 应用编码 + 实体编码（大写字母转 `_` + 小写字母）
* **示例**：实体 `AccountPay` → 表名 `cxcrmfinpayment_account_pay`

#### 1.2.2 平行表

建议使用系统自动生成的表名，**表名中租户编码（租户 ID）禁止删除**。

#### 1.2.3 主子表关联字段

系统自动创建，无需手工创建。

#### 1.2.4 表字段名

* 属性编码中的大写字母转 `_` + 小写字母
* 示例：`merchantCode` → `merchant_code`
* 命名时避开数据库关键字，多数据库关键字可参考在线文档

### 1.3 索引规范

#### 1.3.1 索引命名规则【强制】

* 索引以 `i_` 开头，唯一索引以 `i_u_` 开头，后面接表名/列名
* **非唯一索引**：`i_字段1_字段2`
* **唯一索引**：`i_u_字段1_字段2`
* 索引名必须小写，表名加索引名总长度不超过 60 个字符

#### 1.3.2 索引设置要求

* 必须为常用查询条件字段建立索引
* 组合索引字段顺序需与主要查询条件一致
* 避免过宽索引或过多冗余索引

### 1.4 扩展规范

#### 1.4.1 扩展属性

原厂扩展属性必须加前缀 `extend`：

* 属性编码：`extendMerchantCode`
* 表字段：`extend_merchant_code`

#### 1.4.2 多方扩展

当多方扩展同一实体时，需加上特定编码前缀避免冲突（例如：行业编码、应用编码）：

* 示例：`extendItMerchantCode`

***

## 2. 页面建模规范

### 2.1 页面编码规范

#### 2.1.1 页面编码

* **命名格式**：`{业务对象编码}{页面编码}`
* 建议仅使用业务对象编码作为整个页面编码，并确保在系统内唯一
* **示例**：业务对象编码 `AccountPay` → 页面编码 `AccountPay`
* 若同一业务对象下需创建多个页面，可在后缀追加简短描述，如 `AccountPayDetail`

#### 2.1.2 页面名称

* **命名格式**：`{业务对象名称}{页面名称}`
* 建议仅使用业务对象名称作为页面名称，并确保唯一性
* **示例**：业务对象名称「应付款项」 → 页面名称「应付款项」
* 多页面情况下可使用后缀区分，如：「应付款项明细」

### 2.2 扩展与参照规则

* 原厂扩展的 UI 迁移仅支持新增，不支持更新
* 参照带入逻辑能实现的情况，避免使用公式替代
* 页面规则与前端脚本不得同时控制同一组件状态，以避免冲突；如必须同时存在，应明确优先级确保不冲突

***

## 3. 函数规范

### 3.1 命名法

#### 3.1.1 驼峰式命名法

* **大驼峰式（Pascal Case）**：首字母大写。例：`StudentInfo`
* **小驼峰式（Camel Case）**：首字母小写。例：`studentInfo`

#### 3.1.2 变量命名

* **方法**：小驼峰式
* **规范**：前缀为名词，体现数据类型

```javascript
// 正确示例
var maxCount = 10;              // 数值类型
var tableTitle = "LoginTable"; // 字符串类型

// 错误示例
var setCount = 10;              // 动词前缀
var getTitle = "LoginTable";
```

#### 3.1.3 函数命名

* **方法**：小驼峰式
* **规范**：前缀为动词

| 动词 | 含义 | 返回值 |
| --- | --- | --- |
| `can` | 判断是否可执行操作（权限） | Boolean：true/false |
| `has` | 判断是否包含某个值 | Boolean：true/false |
| `is` | 判断是否为某个值 | Boolean：true/false |
| `get` | 获取值 | 非布尔值 |
| `set` | 设置值 | 无返回值、返回是否设置成功或者返回链式对象 |
| `load` | 加载数据 | 无返回值或者返回是否加载完成的结果 |

```javascript
// 是否可读
function canRead() {
  return true;
}

// 获取名称
function getName() {
  return this.name;
}
```

#### 3.1.4 常量命名

* **方法**：全大写 + 下划线分隔

```javascript
const MAX_COUNT = 10;
const API_URL = "https://api.example.com";
```

### 3.2 注释规范

#### 3.2.1 单行注释

```javascript
// 单独一行的注释（双斜杠后加空格）
setTitle();

var maxCount = 10; // 代码行尾注释

// 被注释的代码（双斜杠后加空格）
// setName();
```

#### 3.2.2 多行注释

```javascript
/**
 * 代码说明：
 * 1. 执行setTitle()函数
 * 2. 设置标题值
 */
function initPage() {
  setTitle();
}
```

#### 3.2.3 函数文档注释

```javascript
/**
 * 合并Grid单元格
 * @param {Object} grid - 需要合并的Grid对象
 * @param {Array} cols - 合并列序号数组（从0开始）
 * @param {Boolean} [isAllSome=false] - 是否严格匹配
 * @returns {void}
 * @author 张三 - zhangsan@company.com
 * @example
 * mergeCells(grid, [0], true);
 */
function mergeCells(grid, cols, isAllSome = false) {
  // 实现逻辑
}
```

***

## 4. 流程与自动化规范

#### 4.1 脚本命名规范

命名格式采用小驼峰式，名称要具有业务含义：

* 示例：保存前金额合计脚本 → `beforeSaveSum`

#### 4.2 YonScript 开发规范

##### 适用范围与核心目标

* **适用范围**：适用于 YonBIP/IUAP 平台下所有 YonScript 脚本的开发、编写与维护，所有自定义脚本开发均需遵循本规范要求
* **核心目标**：保障脚本运行安全、性能稳定、资源可控，避免因不规范开发导致的平台服务异常、数据错误或性能瓶颈

##### 异步长耗时脚本调用规范

平台提供 YonScript 脚本异步长耗时脚本调用机制，针对超长时间运行的脚本任务，需优先使用异步长耗时模式提交执行，避免阻塞主线程或占用同步资源。

##### 安全开发规范

1. **防止 YonQL 注入**：禁止直接拼接用户输入的内容到 YonQL 语句中，需使用参数化查询方式
2. **防止 XSS 攻击**：脚本输出或存储用户提交的富文本、字符串内容时，需进行 XSS 过滤与转义处理
3. **错误处理**：所有 YonQL、API 调用、数据操作均需添加异常捕获，避免脚本因未捕获异常直接中断，导致数据不一致或任务异常

##### 性能优化规范

1. 处理大量数据时应使用平台提供的批量接口，避免单条循环处理数据，减少 IO 交互次数
2. **禁止在循环中执行 YonQL 操作**：循环内的数据查询需提前在循环外批量完成，循环内仅做内存数据处理
3. **禁止在循环中执行 DML 操作**（增/删/改）：批量数据变更需使用批量提交接口，减少数据库事务提交次数
4. **禁止在循环中执行 API 调用或其他脚本调用**：外部接口/脚本调用需提前批量完成，循环内避免跨服务交互
5. YonQL 中**禁止使用 `select *` 全字段查询**，必须指定明确的查询字段，减少数据传输量与内存占用
6. 查询和更新数据时，仅传输必要的业务字段，避免冗余字段的传输与存储，降低内存占用与带宽消耗

##### 脚本资源限制规范

| 限制项 | 同步脚本 | 异步脚本 | 异步长耗时脚本 |
| --- | --- | --- | --- |
| 字符数上限 | < 64K | < 64K | < 64K |
| 最大执行时间 | 10s / 30s（按场景适配） | 60s | 3600s |
| 并发限制 | - | - | 同一租户同一时间仅 1 个 |
| 堆内存占用上限 | 20M | 40M | 80M（自行控制） |
| YonQL 语句执行数量上限 | 100 条 | 200 条 | 不设上限 |
| YonQL 返回结果最大记录数 | 500 条 | 500 条 | 500 条 |
| ObjectStore 操作最大记录数 | 100 条 | 100 条 | 不设上限 |
| REST API/函数调用数量上限 | 50 条 | 50 条 | 不设上限 |

##### 日志与预警规范

脚本设计器、调度引擎应增加对上述资源限制的日志记录能力，对脚本的执行时间、内存占用、YonQL 执行数量、API 调用次数等关键指标进行日志采集。

#### 4.3 前端脚本

前端脚本代码规范需严格遵循前端脚手架代码规范。

#### 4.4 后端脚本 & API 脚本

##### 数据查询与操作

* 跨 `domainKey` 查询单据时，优先使用 YonQL
* 避免使用子查询或复杂 YonQL 函数

##### 接口调用

* 避免连续调用保存/更新/删除接口
* 调用第三方查询类接口时必须实现分页，每页数据量建议 ≤ 100 条

***

## 5. 发布管理规范

### 5.1 分组管理

发布管理的分组列表建议按应用命名规则创建，确保分组名称与应用保持一致，便于识别和归类。

### 5.2 菜单管理

菜单编码建议与页面编码保持一致，避免二次命名造成混淆。
